UNPKG

webpack

Version:

Packs ECMAScript/CommonJs/AMD modules for the browser. Allows you to split your codebase into multiple bundles, which can be loaded on demand. Supports loaders to preprocess files, i.e. json, jsx, es7, css, less, ... and your custom stuff.

9,845 lines • 337 kB
/*
	MIT License http://www.opensource.org/licenses/mit-license.php
	Author sheo13666q @sheo13666q
*/

// GENERATED by tooling/generate-css-data.js — do not edit.
// Sources: mdn-data, color-name and @mdn/browser-compat-data, at the versions yarn.lock pins.

"use strict";

const memoize = require("../util/memoize");

// Tables only the minifier or a `css/module` reads are getters built on first use,
// so a build parsing CSS without them never compiles or allocates them.

/** @typedef {(sums: Map<string, number>[]) => [string, number[]] | null} MathArgumentReader */
/** @typedef {(values: number[], strategy: string, table: Map<number, number>) => number | null} MathOperation */

// WHY: The arithmetic the math-function descriptors at the end of this file bind to.
// It knows nothing of CSS beyond the shape of an evaluated argument, and names
// no math function: which one uses which is the descriptors' business, and
// `lib/css/syntax.js` only drives the binding.
/**
 * Add two doubles, or decline when the sum carries rounding of its own.
 * @param {number} a one term
 * @param {number} b the other
 * @returns {number | null} their exact sum, or `null`
 */
const exactAdd = (a, b) => {
	const sum = a + b;
	return sum - b === a && sum - a === b ? sum : null;
};

/**
 * Multiply, or decline, on the same terms.
 * @param {number} a the value
 * @param {number} k the factor
 * @returns {number | null} their exact product, or `null`
 */
const exactMultiply = (a, k) => {
	const product = a * k;
	if (!Number.isFinite(product)) return null;
	if (a === 0 || k === 0) return product;
	return product / k === a ? product : null;
};

/**
 * Add two doubles. Every sum a stylesheet can write is finite, and one that is
 * not is no value to print.
 * @param {number} a one term
 * @param {number} b the other
 * @returns {number | null} their sum, or `null`
 */
const foldAdd = (a, b) => {
	const sum = a + b;
	return Number.isFinite(sum) ? sum : null;
};

/**
 * @param {number} a the value
 * @param {number} k the factor
 * @returns {number | null} their product, or `null`
 */
const foldMultiply = (a, k) => {
	const product = a * k;
	return Number.isFinite(product) ? product : null;
};

/**
 * @param {number} a the value
 * @param {number} k the divisor
 * @returns {number | null} their quotient, or `null` where there is none
 */
const foldDivide = (a, k) => {
	if (k === 0) return null;
	const quotient = a / k;
	return Number.isFinite(quotient) ? quotient : null;
};

/**
 * `floor(value / step)` for a positive step, checked against the step exactly.
 * The double quotient can land an ulp either side of an integer, which would put
 * the multiple a whole step out, so the candidate is verified by multiplying
 * back and nudged at most once either way.
 * @param {number} value the dividend
 * @param {number} step the divisor, greater than zero
 * @returns {number | null} the floor, or `null` when it cannot be pinned down
 */
const exactFloorDivide = (value, step) => {
	let n = Math.floor(value / step);
	if (!Number.isFinite(n)) return null;
	for (let attempt = 0; attempt < 3; attempt++) {
		const at = exactMultiply(n, step);
		const next = exactMultiply(n + 1, step);
		if (at === null || next === null) return null;
		if (at > value) {
			n--;
			continue;
		}
		if (next <= value) {
			n++;
			continue;
		}
		return n;
	}
	return null;
};

/**
 * One evaluated argument list, read as a shared unit and its coefficients. A
 * percentage is refused: its basis can be negative (a `background-position`
 * against an image wider than its box), and comparing two of them depends on
 * that sign in a way `calc()`'s arithmetic does not — scaling a percentage is
 * linear, picking the smaller of two is not.
 * @param {Map<string, number>[]} sums the evaluated arguments
 * @returns {[string, number[]] | null} the shared unit and the coefficients
 */
const readSameUnit = (sums) => {
	/** @type {string | null} */
	let shared = null;
	/** @type {number[]} */
	const values = [];
	for (const sum of sums) {
		if (sum.size !== 1) return null;
		const [[key, coefficient]] = sum;
		if (key === "%") return null;
		if (shared === null) shared = key;
		else if (shared !== key) return null;
		values.push(coefficient);
	}
	return shared === null ? null : [shared, values];
};

/**
 * The same, narrowed to arguments that reduced to a plain `<number>`.
 * @param {Map<string, number>[]} sums the evaluated arguments
 * @returns {[string, number[]] | null} the unit (always `""`) and the numbers
 */
const readNumber = (sums) => {
	const shared = readSameUnit(sums);
	return shared === null || shared[0] !== "" ? null : shared;
};

/**
 * Read a trigonometric function's one argument as degrees. A bare number is
 * radians (CSS Values 4 §10.6), and an angle is the unit it was written in;
 * either way what the fold needs is the one measure the tables are keyed by.
 * @param {Map<string, number>} quarterTurnAngle a quarter turn in each unit that spells one exactly
 * @returns {MathArgumentReader} the reader
 */
const angleReader = (quarterTurnAngle) => (sums) => {
	const shared = readSameUnit(sums);
	if (shared === null) return null;
	const [unit, [angle]] = shared;
	// A radian is what a bare number is read as, and the one angle unit that
	// spells no quarter turn exactly — so the table states none for it.
	if (unit === "" || unit === "rad") return ["", [(angle * 180) / Math.PI]];
	const quarter = quarterTurnAngle.get(unit);
	if (quarter === undefined) return null;
	return ["", [(angle * 90) / quarter]];
};

/**
 * @param {number[]} values the coefficients
 * @returns {number} the smallest
 */
const minimum = (values) => Math.min(...values);

/**
 * @param {number[]} values the coefficients
 * @returns {number} the largest
 */
const maximum = (values) => Math.max(...values);

/**
 * CSS Values 4 §10.4: the lower bound wins a contradictory pair.
 * @param {number[]} values the lower bound, the value and the upper bound
 * @returns {number} the value held between them
 */
const clamp = ([lower, value, upper]) =>
	Math.max(lower, Math.min(value, upper));

/**
 * @param {number[]} values the one coefficient
 * @returns {number} its magnitude
 */
const absolute = ([value]) => Math.abs(value);

/**
 * The one operation whose answer changes unit: a sign is a `<number>`. Every
 * unit reaching here scales by a positive factor, so the coefficient's sign is
 * the value's even where the factor is not known.
 * @param {number[]} values the one coefficient
 * @returns {number} its sign
 */
const sign = ([value]) => Math.sign(value);

/**
 * @param {number[]} values the coefficients
 * @returns {number | null} the root of their squares, or `null`
 */
const hypotenuse = (values) => {
	const total = Math.hypot(...values);
	return Number.isFinite(total) ? total : null;
};

/**
 * The multiple of `step` that `strategy` rounds `value` to, as CSS Values 4
 * §10.6 defines them and headless Chromium confirms: `nearest` breaks a tie
 * toward positive infinity, and the other three are the ceiling, the floor and
 * the truncation. A step of zero is NaN per the spec and engines do not agree
 * on what that renders as; a negative one is left alone rather than reasoned
 * about.
 * @param {number[]} values the value and the step
 * @param {string} strategy one of the grammar's rounding strategies
 * @returns {number | null} the rounded multiple, or `null`
 */
const round = ([value, step], strategy) => {
	if (!(step > 0)) return null;
	const below = exactFloorDivide(value, step);
	if (below === null) return null;
	const at = /** @type {number} */ (exactMultiply(below, step));
	// WHY: Exactly on a step is where engines stop agreeing: these are step functions,
	// so an ulp of error in the engine's own conversion moves the answer a whole
	// step. Headless Chromium reads `round(down,10cm,2cm)` as `8cm` and
	// `round(down,-7cm,.5cm)` as `-7.5cm`. Away from a boundary the gap is orders
	// of magnitude wider than any such error, so only the boundary is refused.
	if (at === value) return null;
	let multiple;
	if (strategy === "down") {
		multiple = below;
	} else if (strategy === "up") {
		multiple = below + 1;
	} else if (strategy === "to-zero") {
		multiple = value < 0 ? below + 1 : below;
	} else {
		// The remainder is in `[0, step)`, so twice it against the step is the
		// comparison, and an exact half rounds up — toward positive infinity.
		const remainder = exactAdd(value, -at);
		if (remainder === null) return null;
		const doubled = exactMultiply(remainder, 2);
		if (doubled === null) return null;
		multiple = doubled >= step ? below + 1 : below;
	}
	return exactMultiply(multiple, step);
};

/**
 * The remainder carrying the divisor's sign.
 * @param {number[]} values the dividend and the divisor
 * @returns {number | null} the remainder, or `null`
 */
const modulus = ([value, divisor]) => {
	if (divisor === 0) return null;
	const remainder = value % divisor;
	// A zero remainder is the boundary these two share with `round()`, and engines
	// do not agree on it: headless Chromium reads `mod(10px,-2px)` and
	// `mod(-9px,3px)` as the divisor where both are zero.
	if (remainder === 0) return null;
	// A remainder on the other side of zero is brought back across it.
	return remainder < 0 === divisor < 0
		? remainder
		: exactAdd(remainder, divisor);
};

/**
 * The remainder carrying the dividend's sign, which is what `%` already does.
 * @param {number[]} values the dividend and the divisor
 * @returns {number | null} the remainder, or `null`
 */
const remainder = ([value, divisor]) => {
	if (divisor === 0) return null;
	// The same zero boundary `modulus` declines.
	const rest = value % divisor;
	return rest === 0 ? null : rest;
};

/**
 * @param {number[]} values the one radicand
 * @returns {number | null} its root, or `null` where there is none
 */
const squareRoot = ([value]) => (value >= 0 ? Math.sqrt(value) : null);

/**
 * @param {number[]} values the base and the exponent
 * @returns {number | null} the power, or `null`
 */
const power = ([base, exponent]) => {
	const raised = base ** exponent;
	return Number.isFinite(raised) ? raised : null;
};

/**
 * @param {number[]} values the value and, optionally, the base
 * @returns {number | null} the logarithm, or `null` where there is none
 */
const logarithm = ([value, base]) => {
	if (!(value > 0)) return null;
	if (base === undefined) return Math.log(value);
	// A base of one divides by zero and a negative one has no logarithm at all;
	// both leave a quotient that is not a number.
	const quotient = Math.log(value) / Math.log(base);
	return Number.isFinite(quotient) ? quotient : null;
};

/**
 * @param {number[]} values the one exponent
 * @returns {number | null} `e` raised to it, or `null`
 */
const exponential = ([value]) => {
	const raised = Math.exp(value);
	return Number.isFinite(raised) ? raised : null;
};

/**
 * The value a table gives at a whole number of eighth turns, where a real
 * computation would answer an ulp away from it — `Math.sin(Math.PI)` is 1.2e-16
 * rather than the zero the table states.
 * @param {number} degrees the angle
 * @param {Map<number, number>} table the function's eighth-turn table
 * @returns {number | undefined} the stated value, or undefined
 */
const eighthTurn = (degrees, table) => {
	const eighths = degrees / 45;
	return Number.isInteger(eighths)
		? table.get(((eighths % 8) + 8) % 8)
		: undefined;
};

/**
 * An inverse trigonometric function answers with an angle, and an angle is the
 * one thing the printer does not round — a `rotate()` runs it back through trig,
 * where a truncated digit is a different matrix. So only the arguments the table
 * states are taken: everywhere else the real answer carries digits that are
 * noise (`asin(.5)` is 30.000000000000004 degrees) and no shorter than the call.
 * @param {number[]} values the one argument
 * @param {string} keyword unused
 * @param {Map<number, number>} table the arguments the table states
 * @returns {number | null} the angle in degrees, or `null`
 */
const statedAngle = ([value], keyword, table) => {
	const stated = table.get(value);
	return stated === undefined ? null : stated;
};

/**
 * Tangent, which has an asymptote an odd quarter turn from zero: the table
 * states no value there because there is none, and a double still answers with
 * a very large one.
 * @param {number[]} values the angle in degrees
 * @param {string} keyword unused
 * @param {Map<number, number>} table the eighth-turn table
 * @returns {number | null} its tangent, or `null` at an asymptote
 */
const tangent = ([degrees], keyword, table) => {
	const stated = eighthTurn(degrees, table);
	if (stated !== undefined) return stated;
	const quarters = degrees / 90;
	if (Number.isInteger(quarters) && ((quarters % 2) + 2) % 2 === 1) return null;
	return Math.tan((degrees * Math.PI) / 180);
};

/**
 * @param {number[]} values the angle in degrees
 * @param {string} keyword unused
 * @param {Map<number, number>} table the eighth-turn table
 * @returns {number | null} its cosine
 */
const cosine = ([degrees], keyword, table) => {
	const stated = eighthTurn(degrees, table);
	return stated === undefined ? Math.cos((degrees * Math.PI) / 180) : stated;
};

/**
 * @param {number[]} values the angle in degrees
 * @param {string} keyword unused
 * @param {Map<number, number>} table the eighth-turn table
 * @returns {number | null} its sine
 */
const sine = ([degrees], keyword, table) => {
	const stated = eighthTurn(degrees, table);
	return stated === undefined ? Math.sin((degrees * Math.PI) / 180) : stated;
};

/**
 * The eight directions the arc tangent of a ratio is a whole number of degrees
 * in, an eighth turn apart. Both zero is refused: the spec leaves it to the
 * engine.
 * @param {number[]} values the two coordinates
 * @returns {number | null} the angle in degrees, or `null`
 */
const arcTangent2 = ([y, x]) => {
	if (y === 0 && x === 0) return null;
	if (y === 0) return x > 0 ? 0 : 180;
	if (x === 0) return y > 0 ? 90 : -90;
	if (Math.abs(y) !== Math.abs(x)) return null;
	if (x > 0) return y > 0 ? 45 : -45;
	return y > 0 ? 135 : -135;
};

// WHY: Properties whose value is CSS's `{1,4}` box notation, where an omitted value
// is copied from the opposite side. That makes a repeated value redundant:
// `margin:1px 1px 1px 1px` is `margin:1px`. `border-radius` collapses each side
// of its `/` independently.
const BOX_SHORTHANDS = new Set([
	"border-color",
	"border-image-outset",
	"border-image-width",
	"border-radius",
	"border-style",
	"border-width",
	"corner-shape",
	"inset",
	"margin",
	"mask-border-outset",
	"mask-border-width",
	"padding",
	"scroll-margin",
	"scroll-padding"
]);

// The subset carrying a second box after a `/`, which collapses on its own.
const SLASH_BOX_SHORTHANDS = new Set(["border-radius"]);

// WHY: The four longhands each box shorthand sets, in the order `{1,4}` writes them:
// `top right bottom left`, or clockwise from the top left for a corner family.
// Only the families whose longhands are those four: merging those into the
// shorthand sets exactly the same properties, resetting nothing extra.
// prettier-ignore
const BOX_LONGHANDS = new Map([
	["border-color", ["border-top-color", "border-right-color", "border-bottom-color", "border-left-color"]],
	["border-radius", ["border-top-left-radius", "border-top-right-radius", "border-bottom-right-radius", "border-bottom-left-radius"]],
	["border-style", ["border-top-style", "border-right-style", "border-bottom-style", "border-left-style"]],
	["border-width", ["border-top-width", "border-right-width", "border-bottom-width", "border-left-width"]],
	["corner-shape", ["corner-top-left-shape", "corner-top-right-shape", "corner-bottom-right-shape", "corner-bottom-left-shape"]],
	["inset", ["top", "right", "bottom", "left"]],
	["margin", ["margin-top", "margin-right", "margin-bottom", "margin-left"]],
	["padding", ["padding-top", "padding-right", "padding-bottom", "padding-left"]],
	["scroll-margin", ["scroll-margin-top", "scroll-margin-right", "scroll-margin-bottom", "scroll-margin-left"]],
	["scroll-padding", ["scroll-padding-top", "scroll-padding-right", "scroll-padding-bottom", "scroll-padding-left"]]
]);

// The shorthands setting exactly two longhands, positionally — the same merge
// as the box families, two values wide. Only these: a shorthand gathering a
// whole family resets longhands `computed` does not name.
const PAIR_LONGHANDS = new Map([
	[
		"border-block-color",
		["border-block-start-color", "border-block-end-color"]
	],
	[
		"border-block-style",
		["border-block-start-style", "border-block-end-style"]
	],
	[
		"border-block-width",
		["border-block-start-width", "border-block-end-width"]
	],
	[
		"border-inline-color",
		["border-inline-start-color", "border-inline-end-color"]
	],
	[
		"border-inline-style",
		["border-inline-start-style", "border-inline-end-style"]
	],
	[
		"border-inline-width",
		["border-inline-start-width", "border-inline-end-width"]
	],
	[
		"contain-intrinsic-size",
		["contain-intrinsic-width", "contain-intrinsic-height"]
	],
	[
		"corner-block-end-shape",
		["corner-end-start-shape", "corner-end-end-shape"]
	],
	[
		"corner-block-start-shape",
		["corner-start-start-shape", "corner-start-end-shape"]
	],
	[
		"corner-bottom-shape",
		["corner-bottom-left-shape", "corner-bottom-right-shape"]
	],
	[
		"corner-inline-end-shape",
		["corner-start-end-shape", "corner-end-end-shape"]
	],
	[
		"corner-inline-start-shape",
		["corner-start-start-shape", "corner-end-start-shape"]
	],
	["corner-left-shape", ["corner-top-left-shape", "corner-bottom-left-shape"]],
	[
		"corner-right-shape",
		["corner-top-right-shape", "corner-bottom-right-shape"]
	],
	["corner-top-shape", ["corner-top-left-shape", "corner-top-right-shape"]],
	["gap", ["row-gap", "column-gap"]],
	["inset-block", ["inset-block-start", "inset-block-end"]],
	["inset-inline", ["inset-inline-start", "inset-inline-end"]],
	["interest-delay", ["interest-delay-start", "interest-delay-end"]],
	["margin-block", ["margin-block-start", "margin-block-end"]],
	["margin-inline", ["margin-inline-start", "margin-inline-end"]],
	["overflow", ["overflow-x", "overflow-y"]],
	["overscroll-behavior", ["overscroll-behavior-x", "overscroll-behavior-y"]],
	["padding-block", ["padding-block-start", "padding-block-end"]],
	["padding-inline", ["padding-inline-start", "padding-inline-end"]],
	["place-content", ["align-content", "justify-content"]],
	["place-items", ["align-items", "justify-items"]],
	["place-self", ["align-self", "justify-self"]],
	[
		"scroll-margin-block",
		["scroll-margin-block-start", "scroll-margin-block-end"]
	],
	[
		"scroll-margin-inline",
		["scroll-margin-inline-start", "scroll-margin-inline-end"]
	],
	[
		"scroll-padding-block",
		["scroll-padding-block-start", "scroll-padding-block-end"]
	],
	[
		"scroll-padding-inline",
		["scroll-padding-inline-start", "scroll-padding-inline-end"]
	]
]);

// The subset whose two-value form is newer than the longhands, so only a merge
// collapsing to one value may emit it.
const ONE_VALUE_PAIR_SHORTHANDS = new Set(["overflow"]);

// The pair shorthands the target's `placeShorthand` ability gates, newer than
// the longhands they merge.
const PLACE_SHORTHANDS = new Set([
	"place-content",
	"place-items",
	"place-self"
]);

// The stroke lengths a bare number writes in px, the unit it is read in.
const SVG_USER_UNIT_PROPERTIES = new Set([
	"stroke-dasharray",
	"stroke-dashoffset",
	"stroke-width"
]);

// The displays that lay a box out by the 2009 flexbox draft, and that draft's
// prefixed properties, which such a box reads in place of their replacements.
const LEGACY_BOX_DISPLAYS = new Set([
	"-webkit-box",
	"-webkit-inline-box",
	"-moz-box",
	"-moz-inline-box"
]);
const LEGACY_BOX_SPELLINGS = new Set([
	"-moz-box-align",
	"-moz-box-direction",
	"-moz-box-flex",
	"-moz-box-ordinal-group",
	"-moz-box-orient",
	"-moz-box-pack",
	"-webkit-box-align",
	"-webkit-box-direction",
	"-webkit-box-flex",
	"-webkit-box-ordinal-group",
	"-webkit-box-orient",
	"-webkit-box-pack"
]);

// The keywords a shorthand's longhands disagree on, so a merge writing one into
// every slot would turn a declaration the engine kept into a shorthand it drops:
// `justify-items` takes `left` and `align-items` does not.
const UNSHARED_LONGHAND_KEYWORDS = new Map([
	["place-content", new Set(["baseline", "first", "last", "left", "right"])],
	["place-items", new Set(["left", "legacy", "right"])],
	["place-self", new Set(["left", "right"])]
]);

// WHY: The shorthands written as an order-free `||` of their own longhands, each
// appearing once, in grammar order. A merge emits every value, so the only
// question is whether each parses back into the longhand it was authored on.
// prettier-ignore
// The properties whose value ends in a family list, out of the grammars: the
// longhand and the shorthands that reference it.
const FAMILY_LIST_PROPERTIES = new Set(["font", "font-family"]);

const FAMILY_LONGHANDS = new Map([
	[
		"border-block-end",
		[
			"border-block-end-width",
			"border-block-end-style",
			"border-block-end-color"
		]
	],
	[
		"border-block-start",
		[
			"border-block-start-width",
			"border-block-start-style",
			"border-block-start-color"
		]
	],
	[
		"border-bottom",
		["border-bottom-width", "border-bottom-style", "border-bottom-color"]
	],
	[
		"border-inline-end",
		[
			"border-inline-end-width",
			"border-inline-end-style",
			"border-inline-end-color"
		]
	],
	[
		"border-inline-start",
		[
			"border-inline-start-width",
			"border-inline-start-style",
			"border-inline-start-color"
		]
	],
	[
		"border-left",
		["border-left-width", "border-left-style", "border-left-color"]
	],
	[
		"border-right",
		["border-right-width", "border-right-style", "border-right-color"]
	],
	["border-top", ["border-top-width", "border-top-style", "border-top-color"]],
	[
		"column-rule",
		["column-rule-width", "column-rule-style", "column-rule-color"]
	],
	["flex-flow", ["flex-direction", "flex-wrap"]],
	[
		"list-style",
		["list-style-type", "list-style-position", "list-style-image"]
	],
	["outline", ["outline-width", "outline-style", "outline-color"]],
	[
		"text-decoration",
		[
			"text-decoration-line",
			"text-decoration-style",
			"text-decoration-color",
			"text-decoration-thickness"
		]
	],
	["text-emphasis", ["text-emphasis-style", "text-emphasis-color"]],
	["text-wrap", ["text-wrap-mode", "text-wrap-style"]]
]);

// The `animation` longhands whose every value is a keyword, and those keywords.
const ANIMATION_KEYWORD_SLOTS = new Map([
	[
		"animation-timing-function",
		[
			"ease",
			"ease-in",
			"ease-in-out",
			"ease-out",
			"linear",
			"step-end",
			"step-start"
		]
	],
	[
		"animation-direction",
		["alternate", "alternate-reverse", "normal", "reverse"]
	],
	["animation-fill-mode", ["backwards", "both", "forwards", "none"]],
	["animation-play-state", ["paused", "running"]]
]);

// The properties whose comma-separated items take a `<custom-ident>`, where a
// vendor spelling is a name the engine parses rather than one it may drop — so a
// later declaration listing an earlier one's items cannot be its fallback.
const CUSTOM_IDENT_LIST_PROPERTIES = new Set([
	"animation",
	"animation-name",
	"animation-trigger",
	"font-family",
	"font-variant",
	"font-variant-alternates",
	"timeline-trigger-name",
	"timeline-trigger-source",
	"transition",
	"transition-property",
	"trigger-scope",
	"will-change"
]);

// The shorthands whose grammar juxtaposes its longhands in a fixed order, so a
// merge writes every value by position rather than reading which slot takes it.
const ORDERED_LONGHANDS = new Map([
	["flex", ["flex-grow", "flex-shrink", "flex-basis"]]
]);

const SLASH_LONGHANDS = new Map([
	["container", ["container-name", "container-type"]],
	[
		"grid-area",
		["grid-row-start", "grid-column-start", "grid-row-end", "grid-column-end"]
	],
	["grid-column", ["grid-column-start", "grid-column-end"]],
	["grid-row", ["grid-row-start", "grid-row-end"]]
]);

// Every other spelling of a property — vendor, alternative or legacy — mapped to
// the property, so two declarations of one property are known wherever spelled.
const getPropertyAliases = memoize(
	() =>
		new Map([
			["-khtml-box-align", "box-align"],
			["-khtml-box-direction", "box-direction"],
			["-khtml-box-flex", "box-flex"],
			["-khtml-box-flex-group", "box-flex-group"],
			["-khtml-box-lines", "box-lines"],
			["-khtml-box-ordinal-group", "box-ordinal-group"],
			["-khtml-box-orient", "box-orient"],
			["-khtml-box-pack", "box-pack"],
			["-khtml-line-break", "line-break"],
			["-khtml-opacity", "opacity"],
			["-khtml-user-modify", "user-modify"],
			["-khtml-user-select", "user-select"],
			["-moz-animation", "animation"],
			["-moz-animation-delay", "animation-delay"],
			["-moz-animation-direction", "animation-direction"],
			["-moz-animation-duration", "animation-duration"],
			["-moz-animation-fill-mode", "animation-fill-mode"],
			["-moz-animation-iteration-count", "animation-iteration-count"],
			["-moz-animation-name", "animation-name"],
			["-moz-animation-play-state", "animation-play-state"],
			["-moz-animation-timing-function", "animation-timing-function"],
			["-moz-appearance", "appearance"],
			["-moz-backface-visibility", "backface-visibility"],
			["-moz-background-clip", "background-clip"],
			["-moz-background-origin", "background-origin"],
			["-moz-background-size", "background-size"],
			["-moz-border-end-color", "border-inline-end-color"],
			["-moz-border-end-style", "border-inline-end-style"],
			["-moz-border-end-width", "border-inline-end-width"],
			["-moz-border-image", "border-image"],
			["-moz-border-radius", "border-radius"],
			["-moz-border-radius-bottomleft", "border-bottom-left-radius"],
			["-moz-border-radius-bottomright", "border-bottom-right-radius"],
			["-moz-border-radius-topleft", "border-top-left-radius"],
			["-moz-border-radius-topright", "border-top-right-radius"],
			["-moz-border-start-color", "border-inline-start-color"],
			["-moz-border-start-style", "border-inline-start-style"],
			["-moz-box-align", "align-items"],
			["-moz-box-direction", "flex-direction"],
			["-moz-box-flex", "flex"],
			["-moz-box-ordinal-group", "order"],
			["-moz-box-orient", "flex-direction"],
			["-moz-box-pack", "justify-content"],
			["-moz-box-shadow", "box-shadow"],
			["-moz-box-sizing", "box-sizing"],
			["-moz-column-count", "column-count"],
			["-moz-column-fill", "column-fill"],
			["-moz-column-gap", "column-gap"],
			["-moz-column-rule", "column-rule"],
			["-moz-column-rule-color", "column-rule-color"],
			["-moz-column-rule-style", "column-rule-style"],
			["-moz-column-rule-width", "column-rule-width"],
			["-moz-column-width", "column-width"],
			["-moz-columns", "columns"],
			["-moz-font-feature-settings", "font-feature-settings"],
			["-moz-font-language-override", "font-language-override"],
			["-moz-hyphens", "hyphens"],
			["-moz-margin-end", "margin-inline-end"],
			["-moz-margin-start", "margin-inline-start"],
			["-moz-opacity", "opacity"],
			["-moz-osx-font-smoothing", "font-smooth"],
			["-moz-outline", "outline"],
			["-moz-outline-color", "outline-color"],
			["-moz-outline-style", "outline-style"],
			["-moz-outline-width", "outline-width"],
			["-moz-padding-end", "padding-inline-end"],
			["-moz-padding-start", "padding-inline-start"],
			["-moz-perspective", "perspective"],
			["-moz-perspective-origin", "perspective-origin"],
			["-moz-tab-size", "tab-size"],
			["-moz-text-align-last", "text-align-last"],
			["-moz-text-decoration-color", "text-decoration-color"],
			["-moz-text-decoration-line", "text-decoration-line"],
			["-moz-text-decoration-style", "text-decoration-style"],
			["-moz-text-size-adjust", "text-size-adjust"],
			["-moz-transform", "transform"],
			["-moz-transform-origin", "transform-origin"],
			["-moz-transform-style", "transform-style"],
			["-moz-transition", "transition"],
			["-moz-transition-delay", "transition-delay"],
			["-moz-transition-duration", "transition-duration"],
			["-moz-transition-property", "transition-property"],
			["-moz-transition-timing-function", "transition-timing-function"],
			["-moz-user-modify", "user-modify"],
			["-moz-user-select", "user-select"],
			["-ms-flex", "flex"],
			["-ms-flex-align", "align-items"],
			["-ms-flex-direction", "flex-direction"],
			["-ms-flex-flow", "flex-flow"],
			["-ms-flex-item-align", "align-self"],
			["-ms-flex-line-pack", "align-content"],
			["-ms-flex-negative", "flex-shrink"],
			["-ms-flex-order", "order"],
			["-ms-flex-pack", "justify-content"],
			["-ms-flex-positive", "flex-grow"],
			["-ms-flex-preferred-size", "flex-basis"],
			["-ms-flex-wrap", "flex-wrap"],
			["-ms-grid-columns", "grid-template-columns"],
			["-ms-grid-rows", "grid-template-rows"],
			["-ms-high-contrast-adjust", "forced-color-adjust"],
			["-ms-hyphens", "hyphens"],
			["-ms-ime-mode", "ime-mode"],
			["-ms-line-break", "line-break"],
			["-ms-order", "order"],
			["-ms-overflow-x", "overflow-x"],
			["-ms-overflow-y", "overflow-y"],
			["-ms-scroll-snap-type", "scroll-snap-type"],
			["-ms-text-combine-horizontal", "text-combine-upright"],
			["-ms-text-overflow", "text-overflow"],
			["-ms-text-size-adjust", "text-size-adjust"],
			["-ms-touch-action", "touch-action"],
			["-ms-transform", "transform"],
			["-ms-transform-origin", "transform-origin"],
			["-ms-transition", "transition"],
			["-ms-transition-delay", "transition-delay"],
			["-ms-transition-duration", "transition-duration"],
			["-ms-transition-property", "transition-property"],
			["-ms-transition-timing-function", "transition-timing-function"],
			["-ms-user-select", "user-select"],
			["-ms-word-break", "word-break"],
			["-ms-writing-mode", "writing-mode"],
			["-o-animation", "animation"],
			["-o-animation-delay", "animation-delay"],
			["-o-animation-direction", "animation-direction"],
			["-o-animation-duration", "animation-duration"],
			["-o-animation-fill-mode", "animation-fill-mode"],
			["-o-animation-iteration-count", "animation-iteration-count"],
			["-o-animation-name", "animation-name"],
			["-o-animation-play-state", "animation-play-state"],
			["-o-animation-timing-function", "animation-timing-function"],
			["-o-background-size", "background-size"],
			["-o-border-image", "border-image"],
			["-o-object-fit", "object-fit"],
			["-o-object-position", "object-position"],
			["-o-tab-size", "tab-size"],
			["-o-text-overflow", "text-overflow"],
			["-o-transform", "transform"],
			["-o-transform-origin", "transform-origin"],
			["-o-transition", "transition"],
			["-o-transition-delay", "transition-delay"],
			["-o-transition-duration", "transition-duration"],
			["-o-transition-property", "transition-property"],
			["-o-transition-timing-function", "transition-timing-function"],
			["-webkit-align-content", "align-content"],
			["-webkit-align-items", "align-items"],
			["-webkit-align-self", "align-self"],
			["-webkit-alt", "alt"],
			["-webkit-animation", "animation"],
			["-webkit-animation-delay", "animation-delay"],
			["-webkit-animation-direction", "animation-direction"],
			["-webkit-animation-duration", "animation-duration"],
			["-webkit-animation-fill-mode", "animation-fill-mode"],
			["-webkit-animation-iteration-count", "animation-iteration-count"],
			["-webkit-animation-name", "animation-name"],
			["-webkit-animation-play-state", "animation-play-state"],
			["-webkit-animation-timing-function", "animation-timing-function"],
			["-webkit-appearance", "appearance"],
			["-webkit-backdrop-filter", "backdrop-filter"],
			["-webkit-backface-visibility", "backface-visibility"],
			["-webkit-background-clip", "background-clip"],
			["-webkit-background-origin", "background-origin"],
			["-webkit-background-size", "background-size"],
			["-webkit-border-bottom-left-radius", "border-bottom-left-radius"],
			["-webkit-border-bottom-right-radius", "border-bottom-right-radius"],
			["-webkit-border-image", "border-image"],
			["-webkit-border-image-slice", "border-image-slice"],
			["-webkit-border-radius", "border-radius"],
			["-webkit-border-top-left-radius", "border-top-left-radius"],
			["-webkit-border-top-right-radius", "border-top-right-radius"],
			["-webkit-box-align", "align-items"],
			["-webkit-box-decoration-break", "box-decoration-break"],
			["-webkit-box-direction", "flex-direction"],
			["-webkit-box-flex", "flex"],
			["-webkit-box-flex-group", "box-flex-group"],
			["-webkit-box-lines", "box-lines"],
			["-webkit-box-ordinal-group", "order"],
			["-webkit-box-orient", "flex-direction"],
			["-webkit-box-pack", "justify-content"],
			["-webkit-box-shadow", "box-shadow"],
			["-webkit-box-sizing", "box-sizing"],
			["-webkit-clip-path", "clip-path"],
			["-webkit-column-break-after", "break-after"],
			["-webkit-column-break-before", "break-before"],
			["-webkit-column-break-inside", "break-inside"],
			["-webkit-column-count", "column-count"],
			["-webkit-column-fill", "column-fill"],
			["-webkit-column-gap", "column-gap"],
			["-webkit-column-rule", "column-rule"],
			["-webkit-column-rule-color", "column-rule-color"],
			["-webkit-column-rule-style", "column-rule-style"],
			["-webkit-column-rule-width", "column-rule-width"],
			["-webkit-column-span", "column-span"],
			["-webkit-column-width", "column-width"],
			["-webkit-columns", "columns"],
			["-webkit-filter", "filter"],
			["-webkit-flex", "flex"],
			["-webkit-flex-basis", "flex-basis"],
			["-webkit-flex-direction", "flex-direction"],
			["-webkit-flex-flow", "flex-flow"],
			["-webkit-flex-grow", "flex-grow"],
			["-webkit-flex-shrink", "flex-shrink"],
			["-webkit-flex-wrap", "flex-wrap"],
			["-webkit-font-feature-settings", "font-feature-settings"],
			["-webkit-font-kerning", "font-kerning"],
			["-webkit-font-smoothing", "font-smooth"],
			["-webkit-font-variant-ligatures", "font-variant-ligatures"],
			["-webkit-hyphenate-character", "hyphenate-character"],
			["-webkit-hyphens", "hyphens"],
			["-webkit-initial-letter", "initial-letter"],
			["-webkit-justify-content", "justify-content"],
			["-webkit-line-break", "line-break"],
			["-webkit-line-clamp", "line-clamp"],
			["-webkit-logical-height", "block-size"],
			["-webkit-logical-width", "inline-size"],
			["-webkit-margin-after", "margin-block-end"],
			["-webkit-margin-before", "margin-block-start"],
			["-webkit-margin-end", "margin-inline-end"],
			["-webkit-margin-start", "margin-inline-start"],
			["-webkit-mask", "mask"],
			["-webkit-mask-box-image", "mask-border"],
			["-webkit-mask-box-image-outset", "mask-border-outset"],
			["-webkit-mask-box-image-repeat", "mask-border-repeat"],
			["-webkit-mask-box-image-slice", "mask-border-slice"],
			["-webkit-mask-box-image-source", "mask-border-source"],
			["-webkit-mask-box-image-width", "mask-border-width"],
			["-webkit-mask-clip", "mask-clip"],
			["-webkit-mask-composite", "mask-composite"],
			["-webkit-mask-image", "mask-image"],
			["-webkit-mask-origin", "mask-origin"],
			["-webkit-mask-position", "mask-position"],
			["-webkit-mask-repeat", "mask-repeat"],
			["-webkit-mask-size", "mask-size"],
			["-webkit-max-inline-size", "max-inline-size"],
			["-webkit-max-logical-height", "max-block-size"],
			["-webkit-max-logical-width", "max-inline-size"],
			["-webkit-min-logical-height", "min-block-size"],
			["-webkit-min-logical-width", "min-inline-size"],
			["-webkit-order", "order"],
			["-webkit-padding-end", "padding-inline-end"],
			["-webkit-padding-start", "padding-inline-start"],
			["-webkit-perspective", "perspective"],
			["-webkit-perspective-origin", "perspective-origin"],
			["-webkit-print-color-adjust", "print-color-adjust"],
			["-webkit-ruby-position", "ruby-position"],
			["-webkit-scroll-snap-type", "scroll-snap-type"],
			["-webkit-shape-image-threshold", "shape-image-threshold"],
			["-webkit-shape-margin", "shape-margin"],
			["-webkit-shape-outside", "shape-outside"],
			["-webkit-text-combine", "text-combine-upright"],
			["-webkit-text-decoration-color", "text-decoration-color"],
			["-webkit-text-decoration-line", "text-decoration-line"],
			["-webkit-text-decoration-skip", "text-decoration-skip"],
			["-webkit-text-decoration-style", "text-decoration-style"],
			["-webkit-text-emphasis", "text-emphasis"],
			["-webkit-text-emphasis-color", "text-emphasis-color"],
			["-webkit-text-emphasis-position", "text-emphasis-position"],
			["-webkit-text-emphasis-style", "text-emphasis-style"],
			["-webkit-text-orientation", "text-orientation"],
			["-webkit-text-size-adjust", "text-size-adjust"],
			["-webkit-text-underline-position", "text-underline-position"],
			["-webkit-transform", "transform"],
			["-webkit-transform-origin", "transform-origin"],
			["-webkit-transform-style", "transform-style"],
			["-webkit-transition", "transition"],
			["-webkit-transition-delay", "transition-delay"],
			["-webkit-transition-duration", "transition-duration"],
			["-webkit-transition-property", "transition-property"],
			["-webkit-transition-timing-function", "transition-timing-function"],
			["-webkit-user-modify", "user-modify"],
			["-webkit-user-select", "user-select"],
			["-webkit-writing-mode", "writing-mode"],
			["color-adjust", "print-color-adjust"],
			["flow-tolerance", "fit-tolerance"],
			["grid-column-gap", "column-gap"],
			["grid-gap", "gap"],
			["grid-row-gap", "row-gap"],
			["inset-area", "position-area"],
			["motion", "offset"],
			["motion-distance", "offset-distance"],
			["motion-path", "offset-path"],
			["motion-rotation", "offset-rotate"],
			["offset-block", "inset-block"],
			["offset-block-end", "inset-block-end"],
			["offset-block-start", "inset-block-start"],
			["offset-inline", "inset-inline"],
			["offset-inline-end", "inset-inline-end"],
			["offset-inline-start", "inset-inline-start"],
			["offset-rotation", "offset-rotate"],
			["page-break-after", "break-after"],
			["page-break-before", "break-before"],
			["page-break-inside", "break-inside"],
			["position-try-options", "position-try-fallbacks"],
			["scroll-snap-margin", "scroll-margin"],
			["scroll-snap-margin-bottom", "scroll-margin-bottom"],
			["scroll-snap-margin-left", "scroll-margin-left"],
			["scroll-snap-margin-right", "scroll-margin-right"],
			["scroll-snap-margin-top", "scroll-margin-top"],
			["word-wrap", "overflow-wrap"]
		])
);

// Every property a dataset names, mapped to its family's place in the order a
// block's declarations print in; -1 keeps a property where it was written.
const getDeclarationRanks = memoize(() => {
	const names = [
		"--*",
		"-khtml-box-align",
		"-khtml-box-direction",
		"-khtml-box-flex",
		"-khtml-box-flex-group",
		"-khtml-box-lines",
		"-khtml-box-ordinal-group",
		"-khtml-box-orient",
		"-khtml-box-pack",
		"-khtml-line-break",
		"-khtml-opacity",
		"-khtml-user-modify",
		"-khtml-user-select",
		"-moz-animation",
		"-moz-animation-delay",
		"-moz-animation-direction",
		"-moz-animation-duration",
		"-moz-animation-fill-mode",
		"-moz-animation-iteration-count",
		"-moz-animation-name",
		"-moz-animation-play-state",
		"-moz-animation-timing-function",
		"-moz-appearance",
		"-moz-backface-visibility",
		"-moz-background-clip",
		"-moz-background-origin",
		"-moz-background-size",
		"-moz-binding",
		"-moz-border-bottom-colors",
		"-moz-border-end-color",
		"-moz-border-end-style",
		"-moz-border-end-width",
		"-moz-border-image",
		"-moz-border-left-colors",
		"-moz-border-radius",
		"-moz-border-radius-bottomleft",
		"-moz-border-radius-bottomright",
		"-moz-border-radius-topleft",
		"-moz-border-radius-topright",
		"-moz-border-right-colors",
		"-moz-border-start-color",
		"-moz-border-start-style",
		"-moz-border-top-colors",
		"-moz-box-align",
		"-moz-box-direction",
		"-moz-box-flex",
		"-moz-box-ordinal-group",
		"-moz-box-orient",
		"-moz-box-pack",
		"-moz-box-shadow",
		"-moz-box-sizing",
		"-moz-column-count",
		"-moz-column-fill",
		"-moz-column-gap",
		"-moz-column-rule",
		"-moz-column-rule-color",
		"-moz-column-rule-style",
		"-moz-column-rule-width",
		"-moz-column-width",
		"-moz-columns",
		"-moz-context-properties",
		"-moz-float-edge",
		"-moz-font-feature-settings",
		"-moz-font-language-override",
		"-moz-force-broken-image-icon",
		"-moz-hyphens",
		"-moz-margin-end",
		"-moz-margin-start",
		"-moz-opacity",
		"-moz-orient",
		"-moz-osx-font-smoothing",
		"-moz-outline",
		"-moz-outline-color",
		"-moz-outline-radius",
		"-moz-outline-radius-bottomleft",
		"-moz-outline-radius-bottomright",
		"-moz-outline-radius-topleft",
		"-moz-outline-radius-topright",
		"-moz-outline-style",
		"-moz-outline-width",
		"-moz-padding-end",
		"-moz-padding-start",
		"-moz-perspective",
		"-moz-perspective-origin",
		"-moz-stack-sizing",
		"-moz-tab-size",
		"-moz-text-align-last",
		"-moz-text-blink",
		"-moz-text-decoration-color",
		"-moz-text-decoration-line",
		"-moz-text-decoration-style",
		"-moz-text-size-adjust",
		"-moz-transform",
		"-moz-transform-origin",
		"-moz-transform-style",
		"-moz-transition",
		"-moz-transition-delay",
		"-moz-transition-duration",
		"-moz-transition-property",
		"-moz-transition-timing-function",
		"-moz-user-focus",
		"-moz-user-input",
		"-moz-user-modify",
		"-moz-user-select",
		"-moz-window-dragging",
		"-moz-window-shadow",
		"-ms-accelerator",
		"-ms-block-progression",
		"-ms-content-zoom-chaining",
		"-ms-content-zoom-limit",
		"-ms-content-zoom-limit-max",
		"-ms-content-zoom-limit-min",
		"-ms-content-zoom-snap",
		"-ms-content-zoom-snap-points",
		"-ms-content-zoom-snap-type",
		"-ms-content-zooming",
		"-ms-filter",
		"-ms-flex",
		"-ms-flex-align",
		"-ms-flex-direction",
		"-ms-flex-flow",
		"-ms-flex-item-align",
		"-ms-flex-line-pack",
		"-ms-flex-negative",
		"-ms-flex-order",
		"-ms-flex-pack",
		"-ms-flex-positive",
		"-ms-flex-preferred-size",
		"-ms-flex-wrap",
		"-ms-flow-from",
		"-ms-flow-into",
		"-ms-grid-columns",
		"-ms-grid-rows",
		"-ms-high-contrast-adjust",
		"-ms-hyphenate-limit-chars",
		"-ms-hyphenate-limit-lines",
		"-ms-hyphenate-limit-zone",
		"-ms-hyphens",
		"-ms-ime-align",
		"-ms-ime-mode",
		"-ms-line-break",
		"-ms-order",
		"-ms-overflow-style",
		"-ms-overflow-x",
		"-ms-overflow-y",
		"-ms-scroll-chaining",
		"-ms-scroll-limit",
		"-ms-scroll-limit-x-max",
		"-ms-scroll-limit-x-min",
		"-ms-scroll-limit-y-max",
		"-ms-scroll-limit-y-min",
		"-ms-scroll-rails",
		"-ms-scroll-snap-points-x",
		"-ms-scroll-snap-points-y",
		"-ms-scroll-snap-type",
		"-ms-scroll-snap-x",
		"-ms-scroll-snap-y",
		"-ms-scroll-translation",
		"-ms-scrollbar-3dlight-color",
		"-ms-scrollbar-arrow-color",
		"-ms-scrollbar-base-color",
		"-ms-scrollbar-darkshadow-color",
		"-ms-scrollbar-face-color",
		"-ms-scrollbar-highlight-color",
		"-ms-scrollbar-shadow-color",
		"-ms-scrollbar-track-color",
		"-ms-text-autospace",
		"-ms-text-combine-horizontal",
		"-ms-text-overflow",
		"-ms-text-size-adjust",
		"-ms-touch-action",
		"-ms-touch-select",
		"-ms-transform",
		"-ms-transform-origin",
		"-ms-transition",
		"-ms-transition-delay",
		"-ms-transition-duration",
		"-ms-transition-property",
		"-ms-transition-timing-function",
		"-ms-user-select",
		"-ms-word-break",
		"-ms-wrap-flow",
		"-ms-wrap-margin",
		"-ms-wrap-through",
		"-ms-writing-mode",
		"-o-animation",
		"-o-animation-delay",
		"-o-animation-direction",
		"-o-animation-duration",
		"-o-animation-fill-mode",
		"-o-animation-iteration-count",
		"-o-animation-name",
		"-o-animation-play-state",
		"-o-animation-timing-function",
		"-o-background-size",
		"-o-border-image",
		"-o-object-fit",
		"-o-object-position",
		"-o-tab-size",
		"-o-text-overflow",
		"-o-transform",
		"-o-transform-origin",
		"-o-transition",
		"-o-transition-delay",
		"-o-transition-duration",
		"-o-transition-property",
		"-o-transition-timing-function",
		"-webkit-align-content",
		"-webkit-align-items",
		"-webkit-align-self",
		"-webkit-alt",
		"-webkit-animation",
		"-webkit-animation-delay",
		"-webkit-animation-direction",
		"-webkit-animation-duration",
		"-webkit-animation-fill-mode",
		"-webkit-animation-iteration-count",
		"-webkit-animation-name",
		"-webkit-animation-play-state",
		"-webkit-animation-timing-function",
		"-webkit-app-region",
		"-webkit-appearance",
		"-webkit-backdrop-filter",
		"-webkit-backface-visibility",
		"-webkit-background-clip",
		"-webkit-background-origin",
		"-webkit-background-size",
		"-webkit-border-after",
		"-webkit-border-after-color",
		"-webkit-border-after-style",
		"-webkit-border-after-width",
		"-webkit-border-before",
		"-webkit-border-before-color",
		"-webkit-border-before-style",
		"-webkit-border-before-width",
		"-webkit-border-bottom-left-radius",
		"-webkit-border-bottom-right-radius",
		"-webkit-border-end",
		"-webkit-border-end-color",
		"-webkit-border-end-style",
		"-webkit-border-end-width",
		"-webkit-border-horizontal-spacing",
		"-webkit-border-image",
		"-webkit-border-image-slice",
		"-webkit-border-radius",
		"-webkit-border-start",
		"-webkit-border-start-color",
		"-webkit-border-start-style",
		"-webkit-border-start-width",
		"-webkit-border-top-left-radius",
		"-webkit-border-top-right-radius",
		"-webkit-border-vertical-spacing",
		"-webkit-box-align",
		"-webkit-box-decoration-break",
		"-webkit-box-direction",
		"-webkit-box-flex",
		"-webkit-box-flex-group",
		"-webkit-box-lines",
		"-webkit-box-ordinal-group",
		"-webkit-box-orient",
		"-webkit-box-pack",
		"-webkit-box-reflect",
		"-webkit-box-shadow",
		"-webkit-box-sizing",
		"-webkit-clip-path",
		"-webkit-column-axis",
		"-webkit-column-break-after",
		"-webkit-column-break-before",
		"-webkit-column-break-inside",
		"-webkit-column-count",
		"-webkit-column-fill",
		"-webkit-column-gap",
		"-webkit-column-progression",
		"-webkit-column-rule",
		"-webkit-column-rule-color",
		"-webkit-column-rule-style",
		"-webkit-column-rule-width",
		"-webkit-column-span",
		"-webkit-column-width",
		"-webkit-columns",
		"-webkit-cursor-visibility",
		"-webkit-filter",
		"-webkit-flex",
		"-webkit-flex-basis",
		"-webkit-flex-direction",
		"-webkit-flex-flow",
		"-webkit-flex-grow",
		"-webkit-flex-shrink",
		"-webkit-flex-wrap",
		"-webkit-font-feature-settings",
		"-webkit-font-kerning",
		"-webkit-font-smoothing",
		"-webkit-font-variant-ligatures",
		"-webkit-hyphenate-character",
		"-webkit-hyphenate-limit-after",
		"-webkit-hyphenate-limit-before",
		"-webkit-hyphenate-limit-lines",
		"-webkit-hyphens",
		"-webkit-initial-letter",
		"-webkit-justify-content",
		"-webkit-line-align",
		"-webkit-line-box-contain",
		"-webkit-line-break",
		"-webkit-line-clamp",
		"-webkit-line-grid",
		"-webkit-line-snap",
		"-webkit-locale",
		"-webkit-logical-height",
		"-webkit-logical-width",
		"-webkit-margin-after",
		"-webkit-margin-before",
		"-webkit-margin-end",
		"-webkit-margin-start",
		"-webkit-mask",
		"-webkit-mask-attachment",
		"-webkit-mask-box-image",
		"-webkit-mask-box-image-outset",
		"-webkit-mask-box-image-repeat",
		"-webkit-mask-box-image-slice",
		"-webkit-mask-box-image-source",
		"-webkit-mask-box-image-width",
		"-webkit-mask-clip",
		"-webkit-mask-composite",
		"-webkit-mask-image",
		"-webkit-mask-origin",
		"-webkit-mask-position",
		"-webkit-mask-position-x",
		"-webkit-mask-position-y",
		"-webkit-mask-repeat",
		"-webkit-mask-repeat-x",
		"-webkit-mask-repeat-y",
		"-webkit-mask-size",
		"-webkit-mask-source-type",
		"-webkit-max-inline-size",
		"-webkit-max-logical-height",
		"-webkit-max-logical-width",
		"-webkit-min-logical-height",
		"-webkit-min-logical-width",
		"-webkit-nbsp-mode",
		"-webkit-order",
		"-webkit-overflow-scrolling",
		"-webkit-padding-end",
		"-webkit-padding-start",
		"-webkit-perspective",
		"-webkit-perspective-origin",
		"-webkit-perspective-origin-x",
		"-webkit-perspective-origin-y",
		"-webkit-print-color-adjust",
		"-webkit-rtl-ordering",
		"-webkit-ruby-position",
		"-webkit-scroll-snap-type",
		"-webkit-shape-image-threshold",
		"-webkit-shape-margin",
		"-webkit-shape-outside",
		"-webkit-tap-highlight-color",
		"-webkit-text-combine",
		"-webkit-text-decoration-color",
		"-webkit-text-decoration-line",
		"-webkit-text-decoration-skip",
		"-webkit-text-decoration-style",
		"-webkit-text-decorations-in-effect",
		"-webkit-text-emphasis",
		"-webkit-text-emphasis-color",
		"-webkit-text-emphasis-position",
		"-webkit-text-emphasis-style",
		"-webkit-text-fill-color",
		"-webkit-text-orientation",
		"-webkit-text-security",
		"-webkit-text-size-adjust",
		"-webkit-text-stroke",
		"-webkit-text-stroke-color",
		"-webkit-text-stroke-width",
		"-webkit-text-underline-position",
		"-webkit-text-zoom",
		"-webkit-touch-callout",
		"-webkit-transform",
		"-webkit-transform-origin",
		"-webkit-transform-origin-x",
		"-webkit-transform-origin-y",
		"-webkit-transform-origin-z",
		"-webkit-transform-style",
		"-webkit-transition",
		"-webkit-transition-delay",
		"-webkit-transition-duration",
		"-webkit-transition-property",
		"-webkit-transition-timing-function",
		"-webkit-user-drag",
		"-webkit-user-modify",
		"-webkit-user-select",
		"-webkit-writing-mode",
		"accent-color",
		"align-content",
		"align-items",
		"align-self",
		"align-tracks",
		"alignment-baseline",
		"all",
		"alt",
		"anchor-name",
		"anchor-scope",
		"animation",
		"animation-composition",
		"animation-delay",
		"animation-direction",
		"animation-duration",
		"animation-fill-mode",
		"animation-iteration-count",
		"animation-name",
		"animation-play-state",
		"animation-range",
		"animation-range-end",
		"animation-range-start",
		"animation-timeline",
		"animation-timing-function",
		"animation-trigger",
		"appearance",
		"aspect-ratio",
		"backdrop-filter",
		"backface-visibility",
		"background",
		"background-attachment",
		"background-blend-mode",
		"background-clip",
		"background-color",
		"background-image",
		"background-origin",
		"background-position",
		"background-position-x",
		"background-position-y",
		"background-repeat",
		"background-repeat-x",
		"background-repeat-y",
		"background-size",
		"baseline-shift",
		"baseline-source",
		"block-ellipsis",
		"block-size",
		"border",
		"border-block",
		"border-block-color",
		"border-block-end",
		"border-block-end-color",
		"border-block-end-style",
		"border-block-end-width",
		"border-block-start",
		"border-block-start-color",
		"border-block-start-style",
		"border-block-start-width",
		"border-block-style",
		"border-block-width",
		"border-bottom",
		"border-bottom-color",
		"border-bottom-left-radius",
		"border-bottom-right-radius",
		"border-bottom-style",
		"border-bottom-width",
		"border-collapse",
		"border-color",
		"border-end-end-radius",
		"border-end-start-radius",
		"border-image",
		"border-image-outset",
		"border-image-repeat",
		"border-image-slice",
		"border-image-source",
		"border-image-width",
		"border-inline",
		"border-inline-color",
		"border-inline-end",
		"border-inline-end-color",
		"border-inline-end-style",
		"border-inline-end-width",
		"border-inline-start",
		"border-inline-start-color",
		"border-inline-start-style",
		"border-inline-start-width",
		"border-inline-style",
		"border-inline-width",
		"border-left",
		"border-left-color",
		"border-left-style",
		"border-left-width",
		"border-radius",
		"border-right",
		"border-right-color",
		"border-right-style",
		"border-right-width",
		"border-shape",
		"border-spacing",
		"border-start-end-radius",
		"border-start-start-radius",
		"border-style",
		"border-top",
		"border-top-color",
		"border-top-left-radius",
		"border-top-right-radius",
		"border-top-style",
		"border-top-width",
		"border-width",
		"bottom",
		"box-align",
		"box-decoration-break",
		"box-direction",
		"box-flex",
		"box-flex-group",
		"box-lines",
		"box-ordinal-group",
		"box-orient",
		"box-pack",
		"box-shadow",
		"box-sizing",
		"break-after",
		"break-before",
		"break-inside",
		"buffered-rendering",
		"caption-side",
		"caret",
		"caret-animation",
		"caret-color",
		"caret-shape",
		"clear",
		"clip",
		"clip-path",
		"clip-rule",
		"color",
		"color-adjust",
		"color-interpolation",
		"color-interpolation-filters",
		"color-rendering",
		"color-scheme",
		"column-count",
		"column-fill",
		"column-gap",
		"column-height",
		"column-rule",
		"column-rule-break",
		"column-rule-color",
		"column-rule-inset",
		"column-rule-inset-cap",
		"column-rule-inset-cap-end",
		"column-rule-inset-cap-start",
		"column-rule-inset-end",
		"column-rule-inset-junction",
		"column-rule-inset-junction-end",
		"column-rule-inset-junction-start",
		"column-rule-inset-start",
		"column-rule-style",
		"column-rule-visibility-items",
		"column-rule-width",
		"column-span",
		"column-width",
		"column-wrap",
		"columns",
		"contain",
		"contain-intrinsic-block-size",
		"contain-intrinsic-height",
		"contain-intrinsic-inline-size",
		"contain-intrinsic-size",
		"contain-intrinsic-width",
		"container",
		"container-name",
		"container-type",
		"content",
		"content-visibility",
		"continue",
		"corner-block-end-shape",
		"corner-block-start-shape",
		"corner-bottom-left-shape",
		"corner-bottom-right-shape",
		"corner-bottom-shape",
		"corner-end-end-shape",
		"corner-end-start-shape",
		"corner-inline-end-shape",
		"corner-inline-start-shape",
		"corner-left-shape",
		"corner-right-shape",
		"corner-shape",
		"corner-start-end-shape",
		"corner-start-start-shape",
		"corner-top-left-shape",
		"corner-top-right-shape",
		"corner-top-shape",
		"counter-increment",
		"counter-reset",
		"counter-set",
		"cursor",
		"custom-property",
		"cx",
		"cy",
		"d",
		"direction",
		"display",
		"dominant-baseline",
		"dynamic-range-limit",
		"empty-cells",
		"field-sizing",
		"fill",
		"fill-opacity",
		"fill-rule",
		"filter",
		"fit-tolerance",
		"flex",
		"flex-basis",
		"flex-direction",
		"flex-flow",
		"flex-grow",
		"flex-line-count",
		"flex-shrink",
		"flex-wrap",
		"float",
		"flood-color",
		"flood-opacity",
		"flow-tolerance",
		"font",
		"font-family",
		"font-feature-settings",
		"font-kerning",
		"font-language-override",
		"font-optical-sizing",
		"font-palette",
		"font-size",
		"font-size-adjust",
		"font-smooth",
		"font-stretch",
		"font-style",
		"font-synthesis",
		"font-synthesis-position",
		"font-synthesis-small-caps",
		"font-synthesis-style",
		"font-synthesis-weight",
		"font-variant",
		"font-variant-alternates",
		"font-variant-caps",
		"font-variant-east-asian",
		"font-variant-emoji",
		"font-variant-ligatures",
		"font-variant-numeric",
		"font-variant-position",
		"font-variation-settings",
		"font-weight",
		"font-width",
		"forced-color-adjust",
		"frame-sizing",
		"gap",
		"glyph-orientation-vertical",
		"grid",
		"grid-area",
		"grid-auto-columns",
		"grid-auto-flow",
		"grid-auto-rows",
		"grid-column",
		"grid-column-end",
		"grid-column-gap",
		"grid-column-start",
		"grid-gap",
		"grid-row",
		"grid-row-end",
		"grid-row-gap",
		"grid-row-start",
		"grid-template",
		"grid-template-areas",
		"grid-template-columns",
		"grid-template-rows",
		"hanging-punctuation",
		"height",
		"hyphenate-character",
		"hyphenate-limit-chars",
		"hyphenate-limit-lines",
		"hyphens",
		"image-orientation",
		"image-rendering",
		"image-resolution",
		"ime-mode",
		"initial-letter",
		"initial-letter-align",
		"inline-size",
		"inset",
		"inset-area",
		"inset-block",
		"inset-block-end",
		"inset-block-start",
		"inset-inline",
		"inset-inline-end",
		"inset-inline-start",
		"interactivity",
		"interest-delay",
		"interest-delay-end",
		"interest-delay-start",
		"interpolate-size",
		"isolation",
		"justify-content",
		"justify-items",
		"justify-self",
		"justify-tracks",
		"left",
		"letter-spacing",
		"lighting-color",
		"line-break",
		"line-clamp",
		"line-height",
		"line-height-step",
		"link-parameters",
		"list-style",
		"list-style-image",
		"list-style-position",
		"list-style-type",
		"margin",
		"margin-block",
		"margin-block-end",
		"margin-block-start",
		"margin-bottom",
		"margin-inline",
		"margin-inline-end",
		"margin-inline-start",
		"margin-left",
		"margin-right",
		"margin-top",
		"margin-trim",
		"marker",
		"marker-end",
		"marker-mid",
		"marker-start",
		"mask",
		"mask-border",
		"mask-border-mode",
		"mask-border-outset",
		"mask-border-repeat",
		"mask-border-slice",
		"mask-border-source",
		"mask-border-width",
		"mask-clip",
		"mask-composite",
		"mask-image",
		"mask-mode",
		"mask-origin",
		"mask-position",
		"mask-repeat",
		"mask-size",
		"mask-type",
		"masonry-auto-flow",
		"math-depth",
		"math-shift",
		"math-style",
		"max-block-size",
		"max-height",
		"max-inline-size",
		"max-lines",
		"max-size",
		"max-width",
		"min-block-size",
		"min-height",
		"min-inline-size",
		"min-size",
		"min-width",
		"mix-blend-mode",
		"motion",
		"motion-distance",
		"motion-path",
		"motion-rotation",
		"object-fit",
		"object-position",
		"object-view-box",
		"offset",
		"offset-anchor",
		"offset-block",
		"offset-block-end",
		"offset-block-start",
		"offset-distance",
		"offset-inline",
		"offset-inline-end",
		"offset-inline-start",
		"offset-path",
		"offset-position",
		"offset-rotate",
		"offset-rotation",
		"opacity",
		"order",
		"orphans",
		"outline",
		"outline-color",
		"outline-offset",
		"outline-style",
		"outline-width",
		"overflow",
		"overflow-anchor",
		"overflow-block",
		"overflow-clip-box",
		"overflow-clip-margin",
		"overflow-inline",
		"overflow-wrap",
		"overflow-x",
		"overflow-y",
		"overlay",
		"overscroll-behavior",
		"overscroll-behavior-block",
		"overscroll-behavior-inline",
		"overscroll-behavior-x",
		"overscroll-behavior-y",
		"padding",
		"padding-block",
		"padding-block-end",
		"padding-block-start",
		"padding-bottom",
		"padding-inline",
		"padding-inline-end",
		"padding-inline-start",
		"padding-left",
		"padding-right",
		"padding-top",
		"page",
		"page-break-after",
		"page-break-before",
		"page-break-inside",
		"paint-order",
		"path-length",
		"perspective",
		"perspective-origin",
		"place-content",
		"place-items",
		"place-self",
		"pointer-events",
		"position",
		"position-anchor",
		"position-area",
		"position-try",
		"position-try-fallbacks",
		"position-try-options",
		"position-try-order",
		"position-visibility",
		"print-color-adjust",
		"quotes",
		"r",
		"reading-flow",
		"reading-order",
		"resize",
		"right",
		"rotate",
		"row-gap",
		"row-rule",
		"row-rule-break",
		"row-rule-color",
		"row-rule-inset",
		"row-rule-inset-cap",
		"row-rule-inset-cap-end",
		"row-rule-inset-cap-start",
		"row-rule-inset-end",
		"row-rule-inset-junction",
		"row-rule-inset-junction-end",
		"row-rule-inset-junction-start",
		"row-rule-inset-start",
		"row-rule-style",
		"row-rule-visibility-items",
		"row-rule-width",
		"ruby-align",
		"ruby-merge",
		"ruby-overhang",
		"ruby-position",
		"rule",
		"rule-break",
		"rule-color",
		"rule-inset",
		"rule-inset-cap",
		"rule-inset-end",
		"rule-inset-junction",
		"rule-inset-start",
		"rule-overlap",
		"rule-style",
		"rule-visibility-items",
		"rule-width",
		"rx",
		"ry",
		"scale",
		"scroll-axis-lock",
		"scroll-behavior",
		"scroll-initial-target",
		"scroll-margin",
		"scroll-margin-block",
		"scroll-margin-block-end",
		"scroll-margin-block-start",
		"scroll-margin-bottom",
		"scroll-margin-inline",
		"scroll-margin-inline-end",
		"scroll-margin-inline-start",
		"scroll-margin-left",
		"scroll-margin-right",
		"scroll-margin-top",
		"scroll-marker-group",
		"scroll-padding",
		"scroll-padding-block",
		"scroll-padding-block-end",
		"scroll-padding-block-start",
		"scroll-padding-bottom",
		"scroll-padding-inline",
		"scroll-padding-inline-end",
		"scroll-padding-inline-start",
		"scroll-padding-left",
		"scroll-padding-right",
		"scroll-padding-top",
		"scroll-snap-align",
		"scroll-snap-coordinate",
		"scroll-snap-destination",
		"scroll-snap-margin",
		"scroll-snap-margin-bottom",
		"scroll-snap-margin-left",
		"scroll-snap-margin-right",
		"scroll-snap-margin-top",
		"scroll-snap-points-x",
		"scroll-snap-points-y",
		"scroll-snap-stop",
		"scroll-snap-type",
		"scroll-snap-type-x",
		"scroll-snap-type-y",
		"scroll-target-group",
		"scroll-timeline",
		"scroll-timeline-axis",
		"scroll-timeline-name",
		"scrollbar-color",
		"scrollbar-gutter",
		"scrollbar-width",
		"shape-image-threshold",
		"shape-margin",
		"shape-outside",
		"shape-rendering",
		"size",
		"speak",
		"speak-as",
		"stop-color",
		"stop-opacity",
		"stroke",
		"stroke-color",
		"stroke-dasharray",
		"stroke-dashoffset",
		"stroke-linecap",
		"stroke-linejoin",
		"stroke-miterlimit",
		"stroke-opacity",
		"stroke-width",
		"tab-size",
		"table-layout",
		"text-align",
		"text-align-last",
		"text-anchor",
		"text-autospace",
		"text-box",
		"text-box-edge",
		"text-box-trim",
		"text-combine-upright",
		"text-decoration",
		"text-decoration-color",
		"text-decoration-inset",
		"text-decoration-line",
		"text-decoration-skip",
		"text-decoration-skip-ink",
		"text-decoration-skip-spaces",
		"text-decoration-style",
		"text-decoration-thickness",
		"text-emphasis",
		"text-emphasis-color",
		"text-emphasis-position",
		"text-emphasis-style",
		"text-fit",
		"text-indent",
		"text-justify",
		"text-orientation",
		"text-overflow",
		"text-rendering",
		"text-shadow",
		"text-size-adjust",
		"text-spacing-trim",
		"text-transform",
		"text-underline-offset",
		"text-underline-position",
		"text-wrap",
		"text-wrap-mode",
		"text-wrap-style",
		"timeline-scope",
		"timeline-trigger",
		"timeline-trigger-activation-range",
		"timeline-trigger-activation-range-end",
		"timeline-trigger-activation-range-start",
		"timeline-trigger-active-range",
		"timeline-trigger-active-range-end",
		"timeline-trigger-active-range-start",
		"timeline-trigger-name",
		"timeline-trigger-source",
		"top",
		"touch-action",
		"transform",
		"transform-box",
		"transform-origin",
		"transform-style",
		"transition",
		"transition-behavior",
		"transition-delay",
		"transition-duration",
		"transition-property",
		"transition-timing-function",
		"translate",
		"trigger-scope",
		"unicode-bidi",
		"user-modify",
		"user-select",
		"vector-effect",
		"vertical-align",
		"view-timeline",
		"view-timeline-axis",
		"view-timeline-inset",
		"view-timeline-name",
		"view-transition-class",
		"view-transition-group",
		"view-transition-name",
		"view-transition-scope",
		"visibility",
		"white-space",
		"white-space-collapse",
		"white-space-trim",
		"widows",
		"width",
		"will-change",
		"window-drag",
		"word-break",
		"word-spacing",
		"word-wrap",
		"wrap-inside",
		"writing-mode",
		"x",
		"y",
		"z-index",
		"zoom"
	];
	const ranks = [
		-1, -1, -1, -1, -1, -1, -1, 4, 4, -1, -1, -1, -1, 14, 14, 14, 14, 14, 14,
		14, 14, 14, -1, -1, 1, 1, 1, -1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
		2, 6, 4, 4, 4, 4, 6, 20, -1, -1, -1, 6, -1, -1, -1, -1, -1, -1, -1, -1, 10,
		10, -1, -1, 8, 8, -1, -1, 10, 3, 3, 3, 3, 3, 3, 3, 3, 3, 9, 9, -1, -1, -1,
		-1, -1, -1, 11, 11, 11, -1, 19, 19, 19, 13, 13, 13, 13, 13, -1, -1, -1, -1,
		-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4, 6, 4, 4, 6, 6, 4, 4,
		6, 4, 4, 4, -1, -1, 5, 5, -1, -1, -1, -1, -1, -1, -1, -1, 4, 18, 18, 18, -1,
		-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
		-1, -1, -1, -1, -1, -1, -1, 19, 19, 13, 13, 13, 13, 13, -1, -1, -1, -1, -1,
		-1, 14, 14, 14, 14, 14, 14, 14, 14, 14, 1, 2, -1, -1, -1, -1, 19, 19, 13,
		13, 13, 13, 13, 6, 6, 6, -1, 14, 14, 14, 14, 14, 14, 14, 14, 14, -1, -1, -1,
		-1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
		2, 2, 2, 2, 6, -1, 4, 4, -1, -1, 4, 4, 6, -1, 20, -1, -1, -1, -1, -1, -1,
		-1, -1, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 4, 4, 4, 4, 4, 4, 4, 10,
		10, 10, 10, -1, -1, -1, -1, -1, -1, 6, -1, -1, -1, -1, -1, -1, -1, 7, 7, 8,
		8, 8, 8, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
		21, 21, 21, 7, 7, 7, 7, 7, -1, 4, 18, 9, 9, -1, -1, -1, -1, -1, -1, -1, -1,
		-1, -1, -1, -1, -1, 11, 11, 11, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
		-1, -1, -1, -1, -1, 19, 19, 19, 19, 19, 19, 13, 13, 13, 13, 13, -1, -1, -1,
		-1, -1, 6, 6, 6, -1, -1, -1, -1, -1, -1, 14, 14, 14, 14, 14, 14, 14, 14, 14,
		14, 14, 14, 14, 14, 14, -1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
		1, 1, -1, -1, -1, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
		2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
		2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 17, -1, -1, -1, -1,
		-1, -1, -1, 4, 4, 20, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
		-1, -1, -1, -1, -1, -1, -1, -1, -1, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1,
		-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 22, 22,
		22, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
		-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 15, -1, -1, -1, -1, -1, -1, -1,
		-1, -1, 4, 4, 4, 4, 4, 4, 4, 4, -1, -1, -1, -1, 10, 10, 10, 10, 10, 10, 10,
		10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
		10, 10, -1, -1, 6, -1, 5, 5, 5, 5, 5, 5, 5, 6, 5, 6, 5, 5, 6, 5, 5, 5, 5, 5,
		-1, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7, 17, 16, 17, 17, 17, 17,
		17, 17, -1, -1, -1, -1, -1, -1, 6, 6, 6, -1, 17, -1, -1, -1, -1, 10, 10, -1,
		12, 12, 12, 12, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, -1, -1, -1, -1, 21, 21,
		21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, -1, -1, -1, -1,
		7, 7, 7, -1, 7, 7, 7, 7, 7, 7, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
		17, 17, 17, -1, 17, 17, 17, -1, -1, -1, -1, -1, 4, -1, 3, 3, 3, 3, 3, 18,
		18, 18, 18, 18, 18, 18, 18, 18, -1, -1, -1, -1, -1, -1, 9, 9, 9, 9, 9, 9, 9,
		9, 9, 9, 9, -1, -1, -1, -1, -1, -1, -1, -1, 6, 6, 6, -1, 16, 16, 16, 16, 16,
		16, 16, 16, -1, -1, -1, -1, -1, -1, 17, 19, 6, -1, -1, -1, -1, -1, -1, -1,
		-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
		-1, -1, -1, -1, -1, -1, -1, 19, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
		-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
		-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
		-1, -1, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
		-1, -1, -1, -1, -1, -1, -1, 11, 11, 11, 11, 11, 11, 11, 11, 11, -1, -1, -1,
		-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
		-1, -1, -1, -1, -1, -1, -1, 17, -1, 19, 19, 19, 19, 13, 13, 13, 13, 13, 13,
		19, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
		-1, 7, -1, -1, -1, -1, 18, -1, -1, -1, -1, -1, -1
	];
	/** @type {Map<string, number>} */
	const out = new Map();
	for (let i = 0; i < names.length; i++) out.set(names[i], ranks[i]);
	return out;
});

// Every longhand each shorthand sets, so one block can be asked whether another
// could shadow it. Not every shorthand prefixes its longhands: `inset` sets `top`.
const getShorthandLonghands = memoize(
	() =>
		new Map([
			[
				"-moz-outline-radius",
				new Set([
					"-moz-outline-radius-bottomleft",
					"-moz-outline-radius-bottomright",
					"-moz-outline-radius-topleft",
					"-moz-outline-radius-topright"
				])
			],
			[
				"-ms-content-zoom-limit",
				new Set(["-ms-content-zoom-limit-max", "-ms-content-zoom-limit-min"])
			],
			[
				"-ms-content-zoom-snap",
				new Set(["-ms-content-zoom-snap-points", "-ms-content-zoom-snap-type"])
			],
			[
				"-ms-scroll-limit",
				new Set([
					"-ms-scroll-limit-x-max",
					"-ms-scroll-limit-x-min",
					"-ms-scroll-limit-y-max",
					"-ms-scroll-limit-y-min"
				])
			],
			[
				"-ms-scroll-snap-x",
				new Set(["-ms-scroll-snap-points-x", "-ms-scroll-snap-type"])
			],
			[
				"-ms-scroll-snap-y",
				new Set(["-ms-scroll-snap-points-y", "-ms-scroll-snap-type"])
			],
			[
				"-webkit-border-after",
				new Set([
					"border-block-end-color",
					"border-block-end-style",
					"border-block-end-width"
				])
			],
			[
				"-webkit-border-before",
				new Set([
					"border-block-start-color",
					"border-block-start-style",
					"border-block-start-width"
				])
			],
			[
				"-webkit-border-end",
				new Set([
					"border-inline-end-color",
					"border-inline-end-style",
					"border-inline-end-width"
				])
			],
			[
				"-webkit-border-start",
				new Set([
					"border-inline-start-color",
					"border-inline-start-style",
					"border-inline-start-width"
				])
			],
			[
				"-webkit-mask",
				new Set([
					"-webkit-mask-attachment",
					"-webkit-mask-clip",
					"-webkit-mask-image",
					"-webkit-mask-origin",
					"-webkit-mask-position",
					"-webkit-mask-repeat"
				])
			],
			[
				"-webkit-text-stroke",
				new Set(["-webkit-text-stroke-color", "-webkit-text-stroke-width"])
			],
			[
				"animation",
				new Set([
					"animation-delay",
					"animation-direction",
					"animation-duration",
					"animation-fill-mode",
					"animation-iteration-count",
					"animation-name",
					"animation-play-state",
					"animation-timeline",
					"animation-timing-function"
				])
			],
			[
				"animation-range",
				new Set(["animation-range-end", "animation-range-start"])
			],
			[
				"background",
				new Set([
					"background-attachment",
					"background-clip",
					"background-color",
					"background-image",
					"background-origin",
					"background-position",
					"background-position-x",
					"background-position-y",
					"background-repeat",
					"background-size"
				])
			],
			[
				"background-position",
				new Set(["background-position-x", "background-position-y"])
			],
			[
				"border",
				new Set([
					"border-bottom-color",
					"border-bottom-style",
					"border-bottom-width",
					"border-color",
					"border-left-color",
					"border-left-style",
					"border-left-width",
					"border-right-color",
					"border-right-style",
					"border-right-width",
					"border-style",
					"border-top-color",
					"border-top-style",
					"border-top-width",
					"border-width"
				])
			],
			[
				"border-block",
				new Set([
					"border-block-color",
					"border-block-end-color",
					"border-block-end-style",
					"border-block-end-width",
					"border-block-start-color",
					"border-block-start-style",
					"border-block-start-width",
					"border-block-style",
					"border-block-width"
				])
			],
			[
				"border-block-color",
				new Set(["border-block-end-color", "border-block-start-color"])
			],
			[
				"border-block-end",
				new Set([
					"border-block-end-color",
					"border-block-end-style",
					"border-block-end-width"
				])
			],
			[
				"border-block-start",
				new Set([
					"border-block-start-color",
					"border-block-start-style",
					"border-block-start-width"
				])
			],
			[
				"border-block-style",
				new Set(["border-block-end-style", "border-block-start-style"])
			],
			[
				"border-block-width",
				new Set(["border-block-end-width", "border-block-start-width"])
			],
			[
				"border-bottom",
				new Set([
					"border-bottom-color",
					"border-bottom-style",
					"border-bottom-width"
				])
			],
			[
				"border-color",
				new Set([
					"border-bottom-color",
					"border-left-color",
					"border-right-color",
					"border-top-color"
				])
			],
			[
				"border-image",
				new Set([
					"border-image-outset",
					"border-image-repeat",
					"border-image-slice",
					"border-image-source",
					"border-image-width"
				])
			],
			[
				"border-inline",
				new Set([
					"border-inline-color",
					"border-inline-end-color",
					"border-inline-end-style",
					"border-inline-end-width",
					"border-inline-start-color",
					"border-inline-start-style",
					"border-inline-start-width",
					"border-inline-style",
					"border-inline-width"
				])
			],
			[
				"border-inline-color",
				new Set(["border-inline-end-color", "border-inline-start-color"])
			],
			[
				"border-inline-end",
				new Set([
					"border-inline-end-color",
					"border-inline-end-style",
					"border-inline-end-width"
				])
			],
			[
				"border-inline-start",
				new Set([
					"border-inline-start-color",
					"border-inline-start-style",
					"border-inline-start-width"
				])
			],
			[
				"border-inline-style",
				new Set(["border-inline-end-style", "border-inline-start-style"])
			],
			[
				"border-inline-width",
				new Set(["border-inline-end-width", "border-inline-start-width"])
			],
			[
				"border-left",
				new Set(["border-left-color", "border-left-style", "border-left-width"])
			],
			[
				"border-radius",
				new Set([
					"border-bottom-left-radius",
					"border-bottom-right-radius",
					"border-top-left-radius",
					"border-top-right-radius"
				])
			],
			[
				"border-right",
				new Set([
					"border-right-color",
					"border-right-style",
					"border-right-width"
				])
			],
			[
				"border-style",
				new Set([
					"border-bottom-style",
					"border-left-style",
					"border-right-style",
					"border-top-style"
				])
			],
			[
				"border-top",
				new Set(["border-top-color", "border-top-style", "border-top-width"])
			],
			[
				"border-width",
				new Set([
					"border-bottom-width",
					"border-left-width",
					"border-right-width",
					"border-top-width"
				])
			],
			["caret", new Set(["caret-animation", "caret-color", "caret-shape"])],
			[
				"column-rule",
				new Set(["column-rule-color", "column-rule-style", "column-rule-width"])
			],
			["columns", new Set(["column-count", "column-height", "column-width"])],
			[
				"contain-intrinsic-size",
				new Set(["contain-intrinsic-height", "contain-intrinsic-width"])
			],
			["container", new Set(["container-name", "container-type"])],
			[
				"corner-block-end-shape",
				new Set(["corner-end-end-shape", "corner-end-start-shape"])
			],
			[
				"corner-block-start-shape",
				new Set(["corner-start-end-shape", "corner-start-start-shape"])
			],
			[
				"corner-bottom-shape",
				new Set(["corner-bottom-left-shape", "corner-bottom-right-shape"])
			],
			[
				"corner-inline-end-shape",
				new Set(["corner-end-end-shape", "corner-start-end-shape"])
			],
			[
				"corner-inline-start-shape",
				new Set(["corner-start-end-shape", "corner-start-start-shape"])
			],
			[
				"corner-left-shape",
				new Set(["corner-bottom-left-shape", "corner-top-left-shape"])
			],
			[
				"corner-right-shape",
				new Set(["corner-bottom-right-shape", "corner-top-right-shape"])
			],
			[
				"corner-shape",
				new Set([
					"corner-bottom-left-shape",
					"corner-bottom-right-shape",
					"corner-top-left-shape",
					"corner-top-right-shape"
				])
			],
			[
				"corner-top-shape",
				new Set(["corner-top-left-shape", "corner-top-right-shape"])
			],
			["flex", new Set(["flex-basis", "flex-grow", "flex-shrink"])],
			["flex-flow", new Set(["flex-direction", "flex-wrap"])],
			[
				"font",
				new Set([
					"font-family",
					"font-size",
					"font-stretch",
					"font-style",
					"font-variant",
					"font-weight",
					"line-height"
				])
			],
			["gap", new Set(["column-gap", "row-gap"])],
			[
				"grid",
				new Set([
					"column-gap",
					"grid-auto-columns",
					"grid-auto-flow",
					"grid-auto-rows",
					"grid-column-gap",
					"grid-row-gap",
					"grid-template-areas",
					"grid-template-columns",
					"grid-template-rows",
					"row-gap"
				])
			],
			[
				"grid-area",
				new Set([
					"grid-column-end",
					"grid-column-start",
					"grid-row-end",
					"grid-row-start"
				])
			],
			["grid-column", new Set(["grid-column-end", "grid-column-start"])],
			["grid-gap", new Set(["grid-column-gap", "grid-row-gap"])],
			["grid-row", new Set(["grid-row-end", "grid-row-start"])],
			[
				"grid-template",
				new Set([
					"grid-template-areas",
					"grid-template-columns",
					"grid-template-rows"
				])
			],
			["inset", new Set(["bottom", "left", "right", "top"])],
			["inset-block", new Set(["inset-block-end", "inset-block-start"])],
			["inset-inline", new Set(["inset-inline-end", "inset-inline-start"])],
			[
				"interest-delay",
				new Set(["interest-delay-end", "interest-delay-start"])
			],
			[
				"list-style",
				new Set(["list-style-image", "list-style-position", "list-style-type"])
			],
			[
				"margin",
				new Set(["margin-bottom", "margin-left", "margin-right", "margin-top"])
			],
			["margin-block", new Set(["margin-block-end", "margin-block-start"])],
			["margin-inline", new Set(["margin-inline-end", "margin-inline-start"])],
			[
				"mask",
				new Set([
					"mask-clip",
					"mask-composite",
					"mask-image",
					"mask-mode",
					"mask-origin",
					"mask-position",
					"mask-repeat",
					"mask-size"
				])
			],
			[
				"mask-border",
				new Set([
					"mask-border-mode",
					"mask-border-outset",
					"mask-border-repeat",
					"mask-border-slice",
					"mask-border-source",
					"mask-border-width"
				])
			],
			[
				"offset",
				new Set([
					"offset-anchor",
					"offset-distance",
					"offset-path",
					"offset-position",
					"offset-rotate"
				])
			],
			["outline", new Set(["outline-color", "outline-style", "outline-width"])],
			["overflow", new Set(["overflow-x", "overflow-y"])],
			[
				"overscroll-behavior",
				new Set(["overscroll-behavior-x", "overscroll-behavior-y"])
			],
			[
				"padding",
				new Set([
					"padding-bottom",
					"padding-left",
					"padding-right",
					"padding-top"
				])
			],
			["padding-block", new Set(["padding-block-end", "padding-block-start"])],
			[
				"padding-inline",
				new Set(["padding-inline-end", "padding-inline-start"])
			],
			["place-content", new Set(["align-content", "justify-content"])],
			["place-items", new Set(["align-items", "justify-items"])],
			["place-self", new Set(["align-self", "justify-self"])],
			[
				"position-try",
				new Set(["position-try-fallbacks", "position-try-order"])
			],
			[
				"scroll-margin",
				new Set([
					"scroll-margin-bottom",
					"scroll-margin-left",
					"scroll-margin-right",
					"scroll-margin-top"
				])
			],
			[
				"scroll-margin-block",
				new Set(["scroll-margin-block-end", "scroll-margin-block-start"])
			],
			[
				"scroll-margin-inline",
				new Set(["scroll-margin-inline-end", "scroll-margin-inline-start"])
			],
			[
				"scroll-padding",
				new Set([
					"scroll-padding-bottom",
					"scroll-padding-left",
					"scroll-padding-right",
					"scroll-padding-top"
				])
			],
			[
				"scroll-padding-block",
				new Set(["scroll-padding-block-end", "scroll-padding-block-start"])
			],
			[
				"scroll-padding-inline",
				new Set(["scroll-padding-inline-end", "scroll-padding-inline-start"])
			],
			[
				"scroll-timeline",
				new Set(["scroll-timeline-axis", "scroll-timeline-name"])
			],
			[
				"text-decoration",
				new Set([
					"text-decoration-color",
					"text-decoration-line",
					"text-decoration-style",
					"text-decoration-thickness"
				])
			],
			[
				"text-emphasis",
				new Set(["text-emphasis-color", "text-emphasis-style"])
			],
			["text-wrap", new Set(["text-wrap-mode", "text-wrap-style"])],
			[
				"timeline-trigger",
				new Set([
					"timeline-trigger-activation-range",
					"timeline-trigger-activation-range-end",
					"timeline-trigger-activation-range-start",
					"timeline-trigger-active-range",
					"timeline-trigger-active-range-end",
					"timeline-trigger-active-range-start",
					"timeline-trigger-name",
					"timeline-trigger-source"
				])
			],
			[
				"timeline-trigger-activation-range",
				new Set([
					"timeline-trigger-activation-range-end",
					"timeline-trigger-activation-range-start"
				])
			],
			[
				"timeline-trigger-active-range",
				new Set([
					"timeline-trigger-active-range-end",
					"timeline-trigger-active-range-start"
				])
			],
			[
				"transition",
				new Set([
					"transition-behavior",
					"transition-delay",
					"transition-duration",
					"transition-property",
					"transition-timing-function"
				])
			],
			["view-timeline", new Set(["view-timeline-axis", "view-timeline-name"])]
		])
);

// WHY: Every longhand the three merge tables above can consume, so a block is asked
// once whether it holds anything mergeable at all. Two of them have to be
// present before any shorthand can be written, and almost no block holds one,
// which is what keeps the merge off the declarations it cannot serve.
const MERGE_LONGHANDS = new Set([
	"align-content",
	"align-items",
	"align-self",
	"border-block-end-color",
	"border-block-end-style",
	"border-block-end-width",
	"border-block-start-color",
	"border-block-start-style",
	"border-block-start-width",
	"border-bottom-color",
	"border-bottom-left-radius",
	"border-bottom-right-radius",
	"border-bottom-style",
	"border-bottom-width",
	"border-inline-end-color",
	"border-inline-end-style",
	"border-inline-end-width",
	"border-inline-start-color",
	"border-inline-start-style",
	"border-inline-start-width",
	"border-left-color",
	"border-left-style",
	"border-left-width",
	"border-right-color",
	"border-right-style",
	"border-right-width",
	"border-top-color",
	"border-top-left-radius",
	"border-top-right-radius",
	"border-top-style",
	"border-top-width",
	"bottom",
	"column-gap",
	"column-rule-color",
	"column-rule-style",
	"column-rule-width",
	"contain-intrinsic-height",
	"contain-intrinsic-width",
	"container-name",
	"container-type",
	"corner-bottom-left-shape",
	"corner-bottom-right-shape",
	"corner-end-end-shape",
	"corner-end-start-shape",
	"corner-start-end-shape",
	"corner-start-start-shape",
	"corner-top-left-shape",
	"corner-top-right-shape",
	"flex-basis",
	"flex-direction",
	"flex-grow",
	"flex-shrink",
	"flex-wrap",
	"grid-column-end",
	"grid-column-start",
	"grid-row-end",
	"grid-row-start",
	"inset-block-end",
	"inset-block-start",
	"inset-inline-end",
	"inset-inline-start",
	"interest-delay-end",
	"interest-delay-start",
	"justify-content",
	"justify-items",
	"justify-self",
	"left",
	"list-style-image",
	"list-style-position",
	"list-style-type",
	"margin-block-end",
	"margin-block-start",
	"margin-bottom",
	"margin-inline-end",
	"margin-inline-start",
	"margin-left",
	"margin-right",
	"margin-top",
	"outline-color",
	"outline-style",
	"outline-width",
	"overflow-x",
	"overflow-y",
	"overscroll-behavior-x",
	"overscroll-behavior-y",
	"padding-block-end",
	"padding-block-start",
	"padding-bottom",
	"padding-inline-end",
	"padding-inline-start",
	"padding-left",
	"padding-right",
	"padding-top",
	"right",
	"row-gap",
	"scroll-margin-block-end",
	"scroll-margin-block-start",
	"scroll-margin-bottom",
	"scroll-margin-inline-end",
	"scroll-margin-inline-start",
	"scroll-margin-left",
	"scroll-margin-right",
	"scroll-margin-top",
	"scroll-padding-block-end",
	"scroll-padding-block-start",
	"scroll-padding-bottom",
	"scroll-padding-inline-end",
	"scroll-padding-inline-start",
	"scroll-padding-left",
	"scroll-padding-right",
	"scroll-padding-top",
	"text-decoration-color",
	"text-decoration-line",
	"text-decoration-style",
	"text-decoration-thickness",
	"text-emphasis-color",
	"text-emphasis-style",
	"text-wrap-mode",
	"text-wrap-style",
	"top"
]);

// WHY: The initial keyword each of these may drop when another component stands
// beside it: omitting the group it belongs to leaves exactly that keyword. The
// second half is every keyword that group offers — a value naming two of them
// (`grid-auto-flow:row dense column`) fills the slot twice and is invalid, so
// dropping the initial there would print a value the author never wrote.
/** @type {Map<string, [string, string[]]>} */
// prettier-ignore
const OMITTABLE_INITIAL_KEYWORDS = new Map([["grid-auto-flow", ["row", ["column","row"]]]]);

// WHY: What each of those longhands accepts as a whole value: the keywords it names,
// and the value classes it reaches. A value acceptable to a second slot is what
// makes the merge ambiguous, and `FAMILY_SLOT_CLASSES` names a type the printer
// cannot classify as readily as one it can, so an unknown one declines.
// prettier-ignore
const FAMILY_SLOT_KEYWORDS = new Map([["border-block-end-width", ["medium","thick","thin"]], ["border-block-end-style", ["dashed","dotted","double","groove","hidden","inset","none","outset","ridge","solid"]], ["border-block-end-color", []], ["border-block-start-width", ["medium","thick","thin"]], ["border-block-start-style", ["dashed","dotted","double","groove","hidden","inset","none","outset","ridge","solid"]], ["border-block-start-color", []], ["border-bottom-width", ["medium","thick","thin"]], ["border-bottom-style", ["dashed","dotted","double","groove","hidden","inset","none","outset","ridge","solid"]], ["border-bottom-color", []], ["border-inline-end-width", ["medium","thick","thin"]], ["border-inline-end-style", ["dashed","dotted","double","groove","hidden","inset","none","outset","ridge","solid"]], ["border-inline-end-color", []], ["border-inline-start-width", ["medium","thick","thin"]], ["border-inline-start-style", ["dashed","dotted","double","groove","hidden","inset","none","outset","ridge","solid"]], ["border-inline-start-color", []], ["border-left-width", ["medium","thick","thin"]], ["border-left-style", ["dashed","dotted","double","groove","hidden","inset","none","outset","ridge","solid"]], ["border-left-color", []], ["border-right-width", ["medium","thick","thin"]], ["border-right-style", ["dashed","dotted","double","groove","hidden","inset","none","outset","ridge","solid"]], ["border-right-color", []], ["border-top-width", ["medium","thick","thin"]], ["border-top-style", ["dashed","dotted","double","groove","hidden","inset","none","outset","ridge","solid"]], ["border-top-color", []], ["column-rule-width", ["medium","thick","thin"]], ["column-rule-style", ["dashed","dotted","double","groove","hidden","inset","none","outset","ridge","solid"]], ["column-rule-color", []], ["flex-direction", ["column","column-reverse","row","row-reverse"]], ["flex-wrap", ["nowrap","wrap","wrap-reverse"]], ["list-style-type", ["none"]], ["list-style-position", ["inside","outside"]], ["list-style-image", ["none"]], ["outline-width", ["medium","thick","thin"]], ["outline-style", ["auto","dashed","dotted","double","groove","inset","none","outset","ridge","solid"]], ["outline-color", ["auto"]], ["text-decoration-line", ["blink","grammar-error","line-through","none","overline","spelling-error","underline"]], ["text-decoration-style", ["dashed","dotted","double","solid","wavy"]], ["text-decoration-color", []], ["text-decoration-thickness", ["auto","from-font"]], ["text-emphasis-style", ["circle","dot","double-circle","filled","none","open","sesame","triangle"]], ["text-emphasis-color", []], ["text-wrap-mode", ["nowrap","wrap"]], ["text-wrap-style", ["auto","balance","pretty","stable"]]]);

// prettier-ignore
const FAMILY_SLOT_CLASSES = new Map([["border-block-end-width", ["length"]], ["border-block-end-style", []], ["border-block-end-color", ["color"]], ["border-block-start-width", ["length"]], ["border-block-start-style", []], ["border-block-start-color", ["color"]], ["border-bottom-width", ["length"]], ["border-bottom-style", []], ["border-bottom-color", ["color"]], ["border-inline-end-width", ["length"]], ["border-inline-end-style", []], ["border-inline-end-color", ["color"]], ["border-inline-start-width", ["length"]], ["border-inline-start-style", []], ["border-inline-start-color", ["color"]], ["border-left-width", ["length"]], ["border-left-style", []], ["border-left-color", ["color"]], ["border-right-width", ["length"]], ["border-right-style", []], ["border-right-color", ["color"]], ["border-top-width", ["length"]], ["border-top-style", []], ["border-top-color", ["color"]], ["column-rule-width", ["length"]], ["column-rule-style", []], ["column-rule-color", ["color"]], ["flex-direction", []], ["flex-wrap", []], ["list-style-type", ["custom-ident","string"]], ["list-style-position", []], ["list-style-image", ["image"]], ["outline-width", ["length"]], ["outline-style", []], ["outline-color", ["color"]], ["text-decoration-line", []], ["text-decoration-style", []], ["text-decoration-color", ["color"]], ["text-decoration-thickness", ["length","percentage"]], ["text-emphasis-style", ["string"]], ["text-emphasis-color", ["color"]], ["text-wrap-mode", []], ["text-wrap-style", []]]);

// WHY: The identifiers that are a `<color>` on their own — named, system and the two
// context-dependent ones. Read off the `<color>` grammar outside any function,
// so a channel keyword like the `none` in `hsl(0 none 0)` is not among them.
// cspell:ignore accentcolor accentcolortext activeborder activecaption activetext aliceblue antiquewhite appworkspace aqua aquamarine azure background beige bisque black blanchedalmond blue blueviolet brown burlywood buttonborder buttonface buttonhighlight buttonshadow buttontext cadetblue canvas canvastext captiontext chartreuse chocolate coral cornflowerblue cornsilk crimson currentcolor cyan darkblue darkcyan darkgoldenrod darkgray darkgreen darkgrey darkkhaki darkmagenta darkolivegreen darkorange darkorchid darkred darksalmon darkseagreen darkslateblue darkslategray darkslategrey darkturquoise darkviolet deeppink deepskyblue dimgray dimgrey dodgerblue field fieldtext firebrick floralwhite forestgreen fuchsia gainsboro ghostwhite gold goldenrod gray graytext green greenyellow grey highlight highlighttext honeydew hotpink inactiveborder inactivecaption inactivecaptiontext indianred indigo infobackground infotext ivory khaki lavender lavenderblush lawngreen lemonchiffon lightblue lightcoral lightcyan lightgoldenrodyellow lightgray lightgreen lightgrey lightpink lightsalmon lightseagreen lightskyblue lightslategray lightslategrey lightsteelblue lightyellow lime limegreen linen linktext magenta mark marktext maroon mediumaquamarine mediumblue mediumorchid mediumpurple mediumseagreen mediumslateblue mediumspringgreen mediumturquoise mediumvioletred menu menutext midnightblue mintcream mistyrose moccasin navajowhite navy oldlace olive olivedrab orange orangered orchid palegoldenrod palegreen paleturquoise palevioletred papayawhip peachpuff peru pink plum powderblue purple rebeccapurple red rosybrown royalblue saddlebrown salmon sandybrown scrollbar seagreen seashell selecteditem selecteditemtext sienna silver skyblue slateblue slategray slategrey snow springgreen steelblue tan teal thistle threeddarkshadow threedface threedhighlight threedlightshadow threedshadow tomato transparent turquoise violet visitedtext wheat white whitesmoke window windowframe windowtext yellow yellowgreen
const COLOR_KEYWORDS = new Set([
	"accentcolor",
	"accentcolortext",
	"activeborder",
	"activecaption",
	"activetext",
	"aliceblue",
	"antiquewhite",
	"appworkspace",
	"aqua",
	"aquamarine",
	"azure",
	"background",
	"beige",
	"bisque",
	"black",
	"blanchedalmond",
	"blue",
	"blueviolet",
	"brown",
	"burlywood",
	"buttonborder",
	"buttonface",
	"buttonhighlight",
	"buttonshadow",
	"buttontext",
	"cadetblue",
	"canvas",
	"canvastext",
	"captiontext",
	"chartreuse",
	"chocolate",
	"coral",
	"cornflowerblue",
	"cornsilk",
	"crimson",
	"currentcolor",
	"cyan",
	"darkblue",
	"darkcyan",
	"darkgoldenrod",
	"darkgray",
	"darkgreen",
	"darkgrey",
	"darkkhaki",
	"darkmagenta",
	"darkolivegreen",
	"darkorange",
	"darkorchid",
	"darkred",
	"darksalmon",
	"darkseagreen",
	"darkslateblue",
	"darkslategray",
	"darkslategrey",
	"darkturquoise",
	"darkviolet",
	"deeppink",
	"deepskyblue",
	"dimgray",
	"dimgrey",
	"dodgerblue",
	"field",
	"fieldtext",
	"firebrick",
	"floralwhite",
	"forestgreen",
	"fuchsia",
	"gainsboro",
	"ghostwhite",
	"gold",
	"goldenrod",
	"gray",
	"graytext",
	"green",
	"greenyellow",
	"grey",
	"highlight",
	"highlighttext",
	"honeydew",
	"hotpink",
	"inactiveborder",
	"inactivecaption",
	"inactivecaptiontext",
	"indianred",
	"indigo",
	"infobackground",
	"infotext",
	"ivory",
	"khaki",
	"lavender",
	"lavenderblush",
	"lawngreen",
	"lemonchiffon",
	"lightblue",
	"lightcoral",
	"lightcyan",
	"lightgoldenrodyellow",
	"lightgray",
	"lightgreen",
	"lightgrey",
	"lightpink",
	"lightsalmon",
	"lightseagreen",
	"lightskyblue",
	"lightslategray",
	"lightslategrey",
	"lightsteelblue",
	"lightyellow",
	"lime",
	"limegreen",
	"linen",
	"linktext",
	"magenta",
	"mark",
	"marktext",
	"maroon",
	"mediumaquamarine",
	"mediumblue",
	"mediumorchid",
	"mediumpurple",
	"mediumseagreen",
	"mediumslateblue",
	"mediumspringgreen",
	"mediumturquoise",
	"mediumvioletred",
	"menu",
	"menutext",
	"midnightblue",
	"mintcream",
	"mistyrose",
	"moccasin",
	"navajowhite",
	"navy",
	"oldlace",
	"olive",
	"olivedrab",
	"orange",
	"orangered",
	"orchid",
	"palegoldenrod",
	"palegreen",
	"paleturquoise",
	"palevioletred",
	"papayawhip",
	"peachpuff",
	"peru",
	"pink",
	"plum",
	"powderblue",
	"purple",
	"rebeccapurple",
	"red",
	"rosybrown",
	"royalblue",
	"saddlebrown",
	"salmon",
	"sandybrown",
	"scrollbar",
	"seagreen",
	"seashell",
	"selecteditem",
	"selecteditemtext",
	"sienna",
	"silver",
	"skyblue",
	"slateblue",
	"slategray",
	"slategrey",
	"snow",
	"springgreen",
	"steelblue",
	"tan",
	"teal",
	"thistle",
	"threeddarkshadow",
	"threedface",
	"threedhighlight",
	"threedlightshadow",
	"threedshadow",
	"tomato",
	"transparent",
	"turquoise",
	"violet",
	"visitedtext",
	"wheat",
	"white",
	"whitesmoke",
	"window",
	"windowframe",
	"windowtext",
	"yellow",
	"yellowgreen"
]);

// WHY: The name prefix a declaration between two box longhands must not carry for the
// merge to step over it. The shorthand's first segment, which is deliberately
// wider than the family: `border-color` blocks every `border*` property, since
// `border`, `border-top` and `border-block-start-color` all write its longhands
// and `mdn-data`'s `computed` lists only some of them.
const BOX_FAMILY_PREFIX = new Map([
	["border-color", "border"],
	["border-radius", "border"],
	["border-style", "border"],
	["border-width", "border"],
	["corner-shape", "corner"],
	["inset", "inset"],
	["margin", "margin"],
	["padding", "padding"],
	["scroll-margin", "scroll"],
	["scroll-padding", "scroll"]
]);

// Functions that take a `<color>` directly, so a hash among their arguments is a
// hex color rather than a case-sensitive reference (`element(#id)`). Only direct
// arguments: a gradient nested in `image-set()` is matched as the gradient.
const COLOR_ARGUMENT_FUNCTIONS = new Set([
	"alpha",
	"color",
	"color-mix",
	"conic-gradient",
	"cross-fade",
	"drop-shadow",
	"image",
	"light-dark",
	"linear-gradient",
	"radial-gradient",
	"repeating-conic-gradient",
	"repeating-linear-gradient",
	"repeating-radial-gradient"
]);

// The functions that are a color rather than take one, out of `<color>`'s own
// grammar — what says a call fills a slot a color fills.
const COLOR_FUNCTIONS = new Set([
	"color",
	"color-mix",
	"hsl",
	"hsla",
	"hwb",
	"lab",
	"lch",
	"light-dark",
	"oklab",
	"oklch",
	"rgb",
	"rgba"
]);

// Functions that substitute an arbitrary token sequence, so two identical
// references need not be one repeated value: with `--x:1px 2px`,
// `margin:var(--x) var(--x)` is four values, not two.
const SUBSTITUTION_FUNCTIONS = new Set([
	"attr",
	"env",
	"first-valid",
	"if",
	"inherit",
	"paint",
	"param",
	"random-item",
	"var"
]);

// The pseudo-class functions whose argument is An+B, where `2n+1` is the
// notation `odd` names in one byte less.
const NTH_PSEUDO_FUNCTIONS = new Set([
	"nth-child",
	"nth-last-child",
	"nth-last-of-type",
	"nth-of-type"
]);

// Each An+B pseudo-class whose one-element case has a name of its own:
// `:nth-child(1)` is what `:first-child` selects, in fewer bytes.
const NTH_NAMED_EQUIVALENTS = new Map([
	["nth-child", "first-child"],
	["nth-last-child", "last-child"],
	["nth-last-of-type", "last-of-type"],
	["nth-of-type", "first-of-type"]
]);

// The properties taking a color and never an identifier of the author's own, so
// a named color written in one is that color and may be spelled the shortest way.
const COLOR_ONLY_PROPERTIES = new Set([
	"-moz-border-bottom-colors",
	"-moz-border-left-colors",
	"-moz-border-right-colors",
	"-moz-border-top-colors",
	"-ms-scrollbar-3dlight-color",
	"-ms-scrollbar-arrow-color",
	"-ms-scrollbar-base-color",
	"-ms-scrollbar-darkshadow-color",
	"-ms-scrollbar-face-color",
	"-ms-scrollbar-highlight-color",
	"-ms-scrollbar-shadow-color",
	"-ms-scrollbar-track-color",
	"-webkit-border-after",
	"-webkit-border-after-color",
	"-webkit-border-before",
	"-webkit-border-before-color",
	"-webkit-border-end",
	"-webkit-border-end-color",
	"-webkit-border-start",
	"-webkit-border-start-color",
	"-webkit-tap-highlight-color",
	"-webkit-text-fill-color",
	"-webkit-text-stroke",
	"-webkit-text-stroke-color",
	"accent-color",
	"backdrop-filter",
	"background-color",
	"border",
	"border-block",
	"border-block-color",
	"border-block-end",
	"border-block-end-color",
	"border-block-start",
	"border-block-start-color",
	"border-bottom",
	"border-bottom-color",
	"border-color",
	"border-inline",
	"border-inline-color",
	"border-inline-end",
	"border-inline-end-color",
	"border-inline-start",
	"border-inline-start-color",
	"border-left",
	"border-left-color",
	"border-right",
	"border-right-color",
	"border-top",
	"border-top-color",
	"box-shadow",
	"caret",
	"caret-color",
	"color",
	"column-rule",
	"column-rule-color",
	"fill",
	"filter",
	"flood-color",
	"lighting-color",
	"outline",
	"outline-color",
	"scrollbar-color",
	"stop-color",
	"stroke",
	"stroke-color",
	"text-decoration",
	"text-decoration-color",
	"text-emphasis",
	"text-emphasis-color",
	"text-shadow"
]);

// WHY: The properties whose value is keywords alone, so an identifier standing
// directly in one is a keyword rather than a name of the author's — and matches
// ASCII case-insensitively. A call's arguments are read against the function's
// own grammar, so they are not covered.
const getKeywordOnlyProperties = memoize(
	() =>
		new Set([
			"-moz-appearance",
			"-moz-context-properties",
			"-moz-float-edge",
			"-moz-force-broken-image-icon",
			"-moz-orient",
			"-moz-stack-sizing",
			"-moz-text-blink",
			"-moz-user-focus",
			"-moz-user-input",
			"-moz-user-modify",
			"-moz-window-dragging",
			"-moz-window-shadow",
			"-ms-accelerator",
			"-ms-block-progression",
			"-ms-content-zoom-chaining",
			"-ms-content-zoom-snap",
			"-ms-content-zoom-snap-type",
			"-ms-content-zooming",
			"-ms-high-contrast-adjust",
			"-ms-ime-align",
			"-ms-overflow-style",
			"-ms-scroll-chaining",
			"-ms-scroll-rails",
			"-ms-scroll-snap-type",
			"-ms-scroll-snap-x",
			"-ms-scroll-snap-y",
			"-ms-scroll-translation",
			"-ms-text-autospace",
			"-ms-touch-select",
			"-ms-user-select",
			"-ms-wrap-flow",
			"-ms-wrap-through",
			"-webkit-appearance",
			"-webkit-border-after-style",
			"-webkit-border-before-style",
			"-webkit-border-end-style",
			"-webkit-border-start-style",
			"-webkit-mask-attachment",
			"-webkit-mask-clip",
			"-webkit-mask-composite",
			"-webkit-mask-origin",
			"-webkit-mask-repeat",
			"-webkit-mask-repeat-x",
			"-webkit-mask-repeat-y",
			"-webkit-overflow-scrolling",
			"-webkit-touch-callout",
			"-webkit-user-modify",
			"-webkit-user-select",
			"align-content",
			"align-items",
			"align-self",
			"align-tracks",
			"alignment-baseline",
			"all",
			"animation-composition",
			"animation-direction",
			"animation-fill-mode",
			"animation-play-state",
			"animation-timing-function",
			"appearance",
			"backface-visibility",
			"background-attachment",
			"background-blend-mode",
			"background-clip",
			"background-origin",
			"background-repeat",
			"baseline-source",
			"border-block-end-style",
			"border-block-start-style",
			"border-block-style",
			"border-bottom-style",
			"border-collapse",
			"border-image-repeat",
			"border-inline-end-style",
			"border-inline-start-style",
			"border-inline-style",
			"border-left-style",
			"border-right-style",
			"border-shape",
			"border-style",
			"border-top-style",
			"box-align",
			"box-decoration-break",
			"box-direction",
			"box-lines",
			"box-orient",
			"box-pack",
			"box-sizing",
			"break-after",
			"break-before",
			"break-inside",
			"caption-side",
			"caret-animation",
			"caret-shape",
			"clear",
			"clip",
			"clip-rule",
			"color-interpolation-filters",
			"column-fill",
			"column-rule-style",
			"column-span",
			"column-wrap",
			"contain",
			"container-type",
			"content-visibility",
			"corner-block-end-shape",
			"corner-block-start-shape",
			"corner-bottom-left-shape",
			"corner-bottom-right-shape",
			"corner-bottom-shape",
			"corner-end-end-shape",
			"corner-end-start-shape",
			"corner-inline-end-shape",
			"corner-inline-start-shape",
			"corner-left-shape",
			"corner-right-shape",
			"corner-shape",
			"corner-start-end-shape",
			"corner-start-start-shape",
			"corner-top-left-shape",
			"corner-top-right-shape",
			"corner-top-shape",
			"d",
			"direction",
			"display",
			"dominant-baseline",
			"dynamic-range-limit",
			"empty-cells",
			"field-sizing",
			"fill-rule",
			"flex-direction",
			"flex-flow",
			"flex-wrap",
			"float",
			"font-kerning",
			"font-optical-sizing",
			"font-synthesis",
			"font-synthesis-position",
			"font-synthesis-small-caps",
			"font-synthesis-style",
			"font-synthesis-weight",
			"font-variant",
			"font-variant-alternates",
			"font-variant-caps",
			"font-variant-east-asian",
			"font-variant-emoji",
			"font-variant-ligatures",
			"font-variant-numeric",
			"font-variant-position",
			"forced-color-adjust",
			"frame-sizing",
			"grid-auto-flow",
			"hanging-punctuation",
			"hyphens",
			"image-rendering",
			"ime-mode",
			"initial-letter-align",
			"interactivity",
			"interpolate-size",
			"isolation",
			"justify-content",
			"justify-items",
			"justify-self",
			"justify-tracks",
			"line-break",
			"list-style-position",
			"margin-trim",
			"mask-border-mode",
			"mask-border-repeat",
			"mask-clip",
			"mask-composite",
			"mask-mode",
			"mask-origin",
			"mask-repeat",
			"mask-type",
			"masonry-auto-flow",
			"math-shift",
			"math-style",
			"mix-blend-mode",
			"object-fit",
			"object-view-box",
			"outline-style",
			"overflow",
			"overflow-anchor",
			"overflow-block",
			"overflow-clip-box",
			"overflow-inline",
			"overflow-wrap",
			"overflow-x",
			"overflow-y",
			"overlay",
			"overscroll-behavior",
			"overscroll-behavior-block",
			"overscroll-behavior-inline",
			"overscroll-behavior-x",
			"overscroll-behavior-y",
			"page-break-after",
			"page-break-before",
			"page-break-inside",
			"paint-order",
			"place-content",
			"place-items",
			"place-self",
			"pointer-events",
			"position",
			"position-area",
			"position-try-order",
			"position-visibility",
			"print-color-adjust",
			"reading-flow",
			"resize",
			"ruby-align",
			"ruby-merge",
			"ruby-overhang",
			"ruby-position",
			"scroll-axis-lock",
			"scroll-behavior",
			"scroll-initial-target",
			"scroll-marker-group",
			"scroll-snap-align",
			"scroll-snap-points-x",
			"scroll-snap-points-y",
			"scroll-snap-stop",
			"scroll-snap-type",
			"scroll-snap-type-x",
			"scroll-snap-type-y",
			"scroll-target-group",
			"scroll-timeline-axis",
			"scrollbar-gutter",
			"scrollbar-width",
			"shape-rendering",
			"speak-as",
			"stroke-linecap",
			"stroke-linejoin",
			"table-layout",
			"text-align",
			"text-align-last",
			"text-anchor",
			"text-box",
			"text-box-edge",
			"text-box-trim",
			"text-decoration-line",
			"text-decoration-skip",
			"text-decoration-skip-ink",
			"text-decoration-style",
			"text-emphasis-position",
			"text-justify",
			"text-orientation",
			"text-rendering",
			"text-spacing-trim",
			"text-transform",
			"text-underline-position",
			"text-wrap",
			"text-wrap-mode",
			"text-wrap-style",
			"touch-action",
			"transform",
			"transform-box",
			"transform-style",
			"transition-behavior",
			"transition-timing-function",
			"unicode-bidi",
			"user-select",
			"vector-effect",
			"view-timeline-axis",
			"view-transition-scope",
			"visibility",
			"white-space",
			"white-space-collapse",
			"window-drag",
			"word-break",
			"word-wrap",
			"writing-mode"
		])
);

// Each two-keyword `display` -> the single keyword naming the same box.
const DISPLAY_SHORT_FORMS = new Map([
	["block flex", "flex"],
	["block flow", "block"],
	["block flow-root", "flow-root"],
	["block grid", "grid"],
	["block table", "table"],
	["inline flex", "inline-flex"],
	["inline flow", "inline"],
	["inline flow-root", "inline-block"],
	["inline grid", "inline-grid"],
	["inline ruby", "ruby"],
	["inline table", "inline-table"],
	["run-in flow", "run-in"]
]);

// Each property whose value is a list of shadows -> the fewest and most lengths
// a shadow takes; a trailing zero past the fewest is already implied.
const SHADOW_PROPERTIES = new Map([
	["box-shadow", [2, 4]],
	["text-shadow", [2, 3]]
]);

// WHY: Each shorthand -> the keywords one of its values may drop, each with every
// spelling its own slot takes: the slot's keywords, and each function it
// accepts written `name()`. A sibling out of that set means the value fills the
// slot twice, which is a declaration the engine drops.
/** @type {() => Map<string, Map<string, { spellings: Set<string>, classes: Set<string> }>>} */
const getShorthandInitialKeywords = memoize(
	() =>
		new Map([
			[
				"animation",
				new Map([
					[
						"ease",
						{
							spellings: new Set([
								"cubic-bezier()",
								"ease",
								"ease-in",
								"ease-in-out",
								"ease-out",
								"linear",
								"linear()",
								"step-end",
								"step-start",
								"steps()"
							]),
							classes: new Set()
						}
					],
					[
						"normal",
						{
							spellings: new Set([
								"alternate",
								"alternate-reverse",
								"normal",
								"reverse"
							]),
							classes: new Set()
						}
					],
					[
						"running",
						{ spellings: new Set(["paused", "running"]), classes: new Set() }
					]
				])
			],
			[
				"background",
				new Map([
					[
						"none",
						{
							spellings: new Set([
								"color()",
								"color-mix()",
								"conic-gradient()",
								"cross-fade()",
								"element()",
								"hsl()",
								"hsla()",
								"hwb()",
								"image()",
								"image-set()",
								"lab()",
								"lch()",
								"light-dark()",
								"linear-gradient()",
								"none",
								"oklab()",
								"oklch()",
								"paint()",
								"radial-gradient()",
								"repeating-conic-gradient()",
								"repeating-linear-gradient()",
								"repeating-radial-gradient()",
								"rgb()",
								"rgba()",
								"src()",
								"type()",
								"url()"
							]),
							classes: new Set()
						}
					],
					[
						"repeat",
						{
							spellings: new Set([
								"no-repeat",
								"repeat",
								"repeat-x",
								"repeat-y",
								"round",
								"space"
							]),
							classes: new Set()
						}
					],
					[
						"scroll",
						{
							spellings: new Set(["fixed", "local", "scroll"]),
							classes: new Set()
						}
					],
					[
						"transparent",
						{
							spellings: new Set([
								"color()",
								"color-mix()",
								"hsl()",
								"hsla()",
								"hwb()",
								"lab()",
								"lch()",
								"light-dark()",
								"oklab()",
								"oklch()",
								"rgb()",
								"rgba()"
							]),
							classes: new Set(["color"])
						}
					]
				])
			],
			[
				"border",
				new Map([
					[
						"currentcolor",
						{
							spellings: new Set([
								"color()",
								"color-mix()",
								"hsl()",
								"hsla()",
								"hwb()",
								"lab()",
								"lch()",
								"light-dark()",
								"oklab()",
								"oklch()",
								"rgb()",
								"rgba()"
							]),
							classes: new Set(["color"])
						}
					],
					[
						"medium",
						{
							spellings: new Set(["medium", "thick", "thin"]),
							classes: new Set(["length"])
						}
					],
					[
						"none",
						{
							spellings: new Set([
								"dashed",
								"dotted",
								"double",
								"groove",
								"hidden",
								"inset",
								"none",
								"outset",
								"ridge",
								"solid"
							]),
							classes: new Set()
						}
					]
				])
			],
			[
				"border-bottom",
				new Map([
					[
						"currentcolor",
						{
							spellings: new Set([
								"color()",
								"color-mix()",
								"hsl()",
								"hsla()",
								"hwb()",
								"lab()",
								"lch()",
								"light-dark()",
								"oklab()",
								"oklch()",
								"rgb()",
								"rgba()"
							]),
							classes: new Set(["color"])
						}
					],
					[
						"medium",
						{
							spellings: new Set(["medium", "thick", "thin"]),
							classes: new Set(["length"])
						}
					],
					[
						"none",
						{
							spellings: new Set([
								"dashed",
								"dotted",
								"double",
								"groove",
								"hidden",
								"inset",
								"none",
								"outset",
								"ridge",
								"solid"
							]),
							classes: new Set()
						}
					]
				])
			],
			[
				"border-image",
				new Map([
					[
						"none",
						{
							spellings: new Set([
								"color()",
								"color-mix()",
								"conic-gradient()",
								"cross-fade()",
								"element()",
								"hsl()",
								"hsla()",
								"hwb()",
								"image()",
								"image-set()",
								"lab()",
								"lch()",
								"light-dark()",
								"linear-gradient()",
								"none",
								"oklab()",
								"oklch()",
								"paint()",
								"radial-gradient()",
								"repeating-conic-gradient()",
								"repeating-linear-gradient()",
								"repeating-radial-gradient()",
								"rgb()",
								"rgba()",
								"src()",
								"type()",
								"url()"
							]),
							classes: new Set()
						}
					],
					[
						"stretch",
						{
							spellings: new Set(["repeat", "round", "space", "stretch"]),
							classes: new Set()
						}
					]
				])
			],
			[
				"border-left",
				new Map([
					[
						"currentcolor",
						{
							spellings: new Set([
								"color()",
								"color-mix()",
								"hsl()",
								"hsla()",
								"hwb()",
								"lab()",
								"lch()",
								"light-dark()",
								"oklab()",
								"oklch()",
								"rgb()",
								"rgba()"
							]),
							classes: new Set(["color"])
						}
					],
					[
						"medium",
						{
							spellings: new Set(["medium", "thick", "thin"]),
							classes: new Set(["length"])
						}
					],
					[
						"none",
						{
							spellings: new Set([
								"dashed",
								"dotted",
								"double",
								"groove",
								"hidden",
								"inset",
								"none",
								"outset",
								"ridge",
								"solid"
							]),
							classes: new Set()
						}
					]
				])
			],
			[
				"border-right",
				new Map([
					[
						"currentcolor",
						{
							spellings: new Set([
								"color()",
								"color-mix()",
								"hsl()",
								"hsla()",
								"hwb()",
								"lab()",
								"lch()",
								"light-dark()",
								"oklab()",
								"oklch()",
								"rgb()",
								"rgba()"
							]),
							classes: new Set(["color"])
						}
					],
					[
						"medium",
						{
							spellings: new Set(["medium", "thick", "thin"]),
							classes: new Set(["length"])
						}
					],
					[
						"none",
						{
							spellings: new Set([
								"dashed",
								"dotted",
								"double",
								"groove",
								"hidden",
								"inset",
								"none",
								"outset",
								"ridge",
								"solid"
							]),
							classes: new Set()
						}
					]
				])
			],
			[
				"border-top",
				new Map([
					[
						"currentcolor",
						{
							spellings: new Set([
								"color()",
								"color-mix()",
								"hsl()",
								"hsla()",
								"hwb()",
								"lab()",
								"lch()",
								"light-dark()",
								"oklab()",
								"oklch()",
								"rgb()",
								"rgba()"
							]),
							classes: new Set(["color"])
						}
					],
					[
						"medium",
						{
							spellings: new Set(["medium", "thick", "thin"]),
							classes: new Set(["length"])
						}
					],
					[
						"none",
						{
							spellings: new Set([
								"dashed",
								"dotted",
								"double",
								"groove",
								"hidden",
								"inset",
								"none",
								"outset",
								"ridge",
								"solid"
							]),
							classes: new Set()
						}
					]
				])
			],
			[
				"column-rule",
				new Map([
					[
						"currentcolor",
						{
							spellings: new Set([
								"color()",
								"color-mix()",
								"hsl()",
								"hsla()",
								"hwb()",
								"lab()",
								"lch()",
								"light-dark()",
								"oklab()",
								"oklch()",
								"rgb()",
								"rgba()"
							]),
							classes: new Set(["color"])
						}
					],
					[
						"medium",
						{
							spellings: new Set(["medium", "thick", "thin"]),
							classes: new Set(["length"])
						}
					],
					[
						"none",
						{
							spellings: new Set([
								"dashed",
								"dotted",
								"double",
								"groove",
								"hidden",
								"inset",
								"none",
								"outset",
								"ridge",
								"solid"
							]),
							classes: new Set()
						}
					]
				])
			],
			[
				"flex-flow",
				new Map([
					[
						"nowrap",
						{
							spellings: new Set(["balance", "nowrap", "wrap", "wrap-reverse"]),
							classes: new Set()
						}
					],
					[
						"row",
						{
							spellings: new Set([
								"column",
								"column-reverse",
								"row",
								"row-reverse"
							]),
							classes: new Set()
						}
					]
				])
			],
			[
				"list-style",
				new Map([
					[
						"outside",
						{ spellings: new Set(["inside", "outside"]), classes: new Set() }
					]
				])
			],
			[
				"mask",
				new Map([
					[
						"add",
						{
							spellings: new Set(["add", "exclude", "intersect", "subtract"]),
							classes: new Set()
						}
					],
					[
						"match-source",
						{
							spellings: new Set(["alpha", "luminance", "match-source"]),
							classes: new Set()
						}
					],
					[
						"none",
						{
							spellings: new Set([
								"color()",
								"color-mix()",
								"conic-gradient()",
								"cross-fade()",
								"element()",
								"hsl()",
								"hsla()",
								"hwb()",
								"image()",
								"image-set()",
								"lab()",
								"lch()",
								"light-dark()",
								"linear-gradient()",
								"none",
								"oklab()",
								"oklch()",
								"paint()",
								"radial-gradient()",
								"repeating-conic-gradient()",
								"repeating-linear-gradient()",
								"repeating-radial-gradient()",
								"rgb()",
								"rgba()",
								"src()",
								"type()",
								"url()"
							]),
							classes: new Set()
						}
					],
					[
						"repeat",
						{
							spellings: new Set([
								"no-repeat",
								"repeat",
								"repeat-x",
								"repeat-y",
								"round",
								"space"
							]),
							classes: new Set()
						}
					]
				])
			],
			[
				"mask-border",
				new Map([
					[
						"alpha",
						{ spellings: new Set(["alpha", "luminance"]), classes: new Set() }
					],
					[
						"none",
						{
							spellings: new Set([
								"color()",
								"color-mix()",
								"conic-gradient()",
								"cross-fade()",
								"element()",
								"hsl()",
								"hsla()",
								"hwb()",
								"image()",
								"image-set()",
								"lab()",
								"lch()",
								"light-dark()",
								"linear-gradient()",
								"none",
								"oklab()",
								"oklch()",
								"paint()",
								"radial-gradient()",
								"repeating-conic-gradient()",
								"repeating-linear-gradient()",
								"repeating-radial-gradient()",
								"rgb()",
								"rgba()",
								"src()",
								"type()",
								"url()"
							]),
							classes: new Set()
						}
					],
					[
						"stretch",
						{
							spellings: new Set(["repeat", "round", "space", "stretch"]),
							classes: new Set()
						}
					]
				])
			],
			[
				"outline",
				new Map([
					[
						"medium",
						{
							spellings: new Set(["medium", "thick", "thin"]),
							classes: new Set(["length"])
						}
					],
					[
						"none",
						{
							spellings: new Set([
								"auto",
								"dashed",
								"dotted",
								"double",
								"groove",
								"inset",
								"none",
								"outset",
								"ridge",
								"solid"
							]),
							classes: new Set()
						}
					]
				])
			],
			[
				"text-decoration",
				new Map([
					[
						"currentcolor",
						{
							spellings: new Set([
								"color()",
								"color-mix()",
								"hsl()",
								"hsla()",
								"hwb()",
								"lab()",
								"lch()",
								"light-dark()",
								"oklab()",
								"oklch()",
								"rgb()",
								"rgba()"
							]),
							classes: new Set(["color"])
						}
					],
					[
						"none",
						{
							spellings: new Set([
								"blink",
								"grammar-error",
								"line-through",
								"none",
								"overline",
								"spelling-error",
								"underline"
							]),
							classes: new Set()
						}
					],
					[
						"solid",
						{
							spellings: new Set([
								"dashed",
								"dotted",
								"double",
								"solid",
								"wavy"
							]),
							classes: new Set()
						}
					]
				])
			],
			[
				"text-emphasis",
				new Map([
					[
						"currentcolor",
						{
							spellings: new Set([
								"color()",
								"color-mix()",
								"hsl()",
								"hsla()",
								"hwb()",
								"lab()",
								"lch()",
								"light-dark()",
								"oklab()",
								"oklch()",
								"rgb()",
								"rgba()"
							]),
							classes: new Set(["color"])
						}
					],
					[
						"none",
						{
							spellings: new Set([
								"circle",
								"dot",
								"double-circle",
								"filled",
								"none",
								"open",
								"sesame",
								"triangle"
							]),
							classes: new Set(["string"])
						}
					]
				])
			],
			[
				"transition",
				new Map([
					[
						"all",
						{
							spellings: new Set(["all", "none"]),
							classes: new Set(["custom-ident"])
						}
					],
					[
						"ease",
						{
							spellings: new Set([
								"cubic-bezier()",
								"ease",
								"ease-in",
								"ease-in-out",
								"ease-out",
								"linear",
								"linear()",
								"step-end",
								"step-start",
								"steps()"
							]),
							classes: new Set()
						}
					],
					[
						"normal",
						{
							spellings: new Set(["allow-discrete", "normal"]),
							classes: new Set()
						}
					]
				])
			]
		])
);

// Each `font-stretch` keyword -> the percentage it names, which is the same
// value in fewer bytes.
const FONT_STRETCH_PERCENTAGES = new Map([
	["ultra-condensed", "50%"],
	["extra-condensed", "62.5%"],
	["condensed", "75%"],
	["semi-condensed", "87.5%"],
	["normal", "100%"],
	["semi-expanded", "112.5%"],
	["expanded", "125%"],
	["extra-expanded", "150%"],
	["ultra-expanded", "200%"]
]);

// Each `<filter-function>` with an optional argument -> the amount an omitted
// one means, which is what writing that amount already says.
const FILTER_FUNCTION_OMITTED = new Map([
	["blur", "0"],
	["brightness", "1"],
	["contrast", "1"],
	["grayscale", "1"],
	["hue-rotate", "0"],
	["invert", "1"],
	["opacity", "1"],
	["saturate", "1"],
	["sepia", "1"]
]);

// The generic font families: an unquoted one of these names the generic rather
// than a family called that, so a quoted family spelled like one keeps its quotes.
const GENERIC_FONT_FAMILIES = new Set([
	"cursive",
	"emoji",
	"fangsong",
	"fantasy",
	"math",
	"monospace",
	"sans-serif",
	"serif",
	"system-ui",
	"ui-monospace",
	"ui-rounded",
	"ui-sans-serif",
	"ui-serif"
]);

// The `font` size slot's keywords: `<absolute-size>` and `<relative-size>`.
const FONT_SIZE_KEYWORDS = new Set([
	"large",
	"larger",
	"medium",
	"small",
	"smaller",
	"x-large",
	"x-small",
	"xx-large",
	"xx-small",
	"xxx-large"
]);

// The `<easing-function>` spellings that are a keyword rather than a function.
const EASING_KEYWORDS = new Set([
	"ease",
	"ease-in",
	"ease-in-out",
	"ease-out",
	"linear",
	"step-end",
	"step-start"
]);

// What `transition-behavior` accepts, the slot of a `transition` that is
// neither a time, an easing nor the property name.
const TRANSITION_BEHAVIORS = new Set(["allow-discrete", "normal"]);

// The linear gradients, whose flow a `<side-or-corner>` or angle states.
const LINEAR_GRADIENTS = new Set([
	"linear-gradient",
	"repeating-linear-gradient"
]);

// A size whose omitted second value is `auto`, not the first repeated.
const AUTO_SECOND_VALUE_PROPERTIES = new Set(["background-size", "mask-size"]);

// The direction each unprefixed linear gradient already starts from. A
// `-webkit-` one measures its angle the other way, so it keeps what it says.
const DEFAULT_GRADIENT_DIRECTIONS = new Set(["to bottom", "180deg", "0.5turn"]);

// The position a radial or conic gradient is centered on when it names none.
const DEFAULT_GRADIENT_POSITIONS = new Set([
	"center",
	"center center",
	"50%",
	"50% 50%"
]);

// The flow opposite the default one, which reversing the stops turns into it.
const REVERSED_GRADIENT_DIRECTIONS = new Set(["to top", "0deg"]);

// A linear gradient's side keyword -> the shorter angle naming the same flow.
/** @type {Map<string, string>} */
const GRADIENT_SIDE_ANGLES = new Map([
	["to top", "0deg"],
	["to right", "90deg"],
	["to left", "270deg"]
]);

// A name CSS matches ASCII case-insensitively but spells with a capital ->
// that spelling, so lowercasing a name normalizes its case without printing
// `translatey` or `1q` for what everything else writes `translateY` and `1Q`.
const CANONICAL_NAMES = new Map([
	["hz", "Hz"],
	["khz", "kHz"],
	["q", "Q"],
	["rotatex", "rotateX"],
	["rotatey", "rotateY"],
	["rotatez", "rotateZ"],
	["scalex", "scaleX"],
	["scaley", "scaleY"],
	["scalez", "scaleZ"],
	["skewx", "skewX"],
	["skewy", "skewY"],
	["translatex", "translateX"],
	["translatey", "translateY"],
	["translatez", "translateZ"]
]);

// A transform along x only -> the pair spelling whose second component is the
// 0 the one-axis call already means.
const X_AXIS_TRANSFORMS = new Map([
	["translatex", "translate"],
	["skewx", "skew"]
]);

// Each gradient function -> the positions its last color stop already means, so
// writing one of them there says nothing (CSS Images 3 §3.4.3).
const GRADIENT_LAST_POSITIONS = new Map([
	["conic-gradient", new Set(["100%", "360deg", "1turn"])],
	["linear-gradient", new Set(["100%"])],
	["radial-gradient", new Set(["100%"])],
	["repeating-conic-gradient", new Set(["100%", "360deg", "1turn"])],
	["repeating-linear-gradient", new Set(["100%"])],
	["repeating-radial-gradient", new Set(["100%"])]
]);

// The properties whose value is a position, where each edge keyword names the
// percentage that axis resolves to.
const POSITION_PROPERTIES = new Set([
	"-webkit-mask-position",
	"background-position",
	"mask-position",
	"object-position",
	"offset-anchor",
	"offset-position",
	"perspective-origin",
	"scroll-snap-coordinate",
	"scroll-snap-destination",
	"transform-origin"
]);

// Each keyword one axis of a `<position>` accepts -> the percentage it resolves
// to. A keyword both maps carry (`center`) names whichever axis is still free,
// and every free axis is `50%` anyway.
const POSITION_X_KEYWORDS = new Map([
	["center", "50%"],
	["left", "0%"],
	["right", "100%"]
]);

const POSITION_Y_KEYWORDS = new Map([
	["bottom", "100%"],
	["center", "50%"],
	["top", "0%"]
]);

// The keywords one `<repeat-style>` axis can be: a pair only collapses where
// both halves are one of these.
const REPEAT_STYLE_KEYWORDS = new Set([
	"no-repeat",
	"repeat",
	"round",
	"space"
]);

// The properties whose value is a `<repeat-style>`, where one value already
// says what two equal ones do.
const REPEAT_STYLE_PROPERTIES = new Set([
	"-webkit-mask",
	"-webkit-mask-repeat",
	"background",
	"background-repeat",
	"mask",
	"mask-repeat"
]);

// Each property whose initial value is a keyword shorter than `initial` -> that
// keyword, which is the same declaration written in fewer bytes.
const getInitialValueKeywords = memoize(
	() =>
		new Map([
			["-moz-binding", "none"],
			["-moz-border-bottom-colors", "none"],
			["-moz-border-left-colors", "none"],
			["-moz-border-right-colors", "none"],
			["-moz-border-top-colors", "none"],
			["-moz-context-properties", "none"],
			["-moz-orient", "inline"],
			["-moz-text-blink", "none"],
			["-moz-user-focus", "none"],
			["-moz-user-input", "auto"],
			["-moz-window-dragging", "drag"],
			["-ms-accelerator", "false"],
			["-ms-block-progression", "tb"],
			["-ms-content-zoom-chaining", "none"],
			["-ms-content-zoom-snap-type", "none"],
			["-ms-flow-from", "none"],
			["-ms-flow-into", "none"],
			["-ms-grid-columns", "none"],
			["-ms-grid-rows", "none"],
			["-ms-high-contrast-adjust", "auto"],
			["-ms-hyphenate-limit-chars", "auto"],
			["-ms-ime-align", "auto"],
			["-ms-overflow-style", "auto"],
			["-ms-scroll-limit-x-max", "auto"],
			["-ms-scroll-limit-y-max", "auto"],
			["-ms-scroll-rails", "railed"],
			["-ms-scroll-snap-type", "none"],
			["-ms-scroll-translation", "none"],
			["-ms-text-autospace", "none"],
			["-ms-user-select", "text"],
			["-ms-wrap-flow", "auto"],
			["-ms-wrap-through", "wrap"],
			["-webkit-border-after-style", "none"],
			["-webkit-border-before-style", "none"],
			["-webkit-border-end-style", "none"],
			["-webkit-border-start-style", "none"],
			["-webkit-line-clamp", "none"],
			["-webkit-mask-attachment", "scroll"],
			["-webkit-mask-clip", "border"],
			["-webkit-mask-image", "none"],
			["-webkit-mask-repeat", "repeat"],
			["-webkit-mask-repeat-x", "repeat"],
			["-webkit-mask-repeat-y", "repeat"],
			["-webkit-overflow-scrolling", "auto"],
			["-webkit-user-select", "auto"],
			["accent-color", "auto"],
			["align-content", "normal"],
			["align-items", "normal"],
			["align-self", "auto"],
			["align-tracks", "normal"],
			["anchor-name", "none"],
			["anchor-scope", "none"],
			["animation-direction", "normal"],
			["animation-fill-mode", "none"],
			["animation-name", "none"],
			["animation-range-end", "normal"],
			["animation-range-start", "normal"],
			["animation-timeline", "auto"],
			["animation-timing-function", "ease"],
			["animation-trigger", "none"],
			["appearance", "none"],
			["aspect-ratio", "auto"],
			["backdrop-filter", "none"],
			["background-attachment", "scroll"],
			["background-blend-mode", "normal"],
			["background-image", "none"],
			["background-repeat", "repeat"],
			["baseline-source", "auto"],
			["block-size", "auto"],
			["border-block-end-style", "none"],
			["border-block-start-style", "none"],
			["border-bottom-style", "none"],
			["border-image-source", "none"],
			["border-inline-end-style", "none"],
			["border-inline-start-style", "none"],
			["border-left-style", "none"],
			["border-right-style", "none"],
			["border-shape", "none"],
			["border-top-style", "none"],
			["bottom", "auto"],
			["box-decoration-break", "slice"],
			["box-direction", "normal"],
			["box-lines", "single"],
			["box-pack", "start"],
			["box-shadow", "none"],
			["break-after", "auto"],
			["break-before", "auto"],
			["break-inside", "auto"],
			["caption-side", "top"],
			["caret-animation", "auto"],
			["caret-color", "auto"],
			["caret-shape", "auto"],
			["clear", "none"],
			["clip", "auto"],
			["clip-path", "none"],
			["color-scheme", "normal"],
			["column-count", "auto"],
			["column-gap", "normal"],
			["column-height", "auto"],
			["column-rule-style", "none"],
			["column-span", "none"],
			["column-width", "auto"],
			["column-wrap", "auto"],
			["contain", "none"],
			["contain-intrinsic-block-size", "none"],
			["contain-intrinsic-height", "none"],
			["contain-intrinsic-inline-size", "none"],
			["contain-intrinsic-width", "none"],
			["container-name", "none"],
			["container-type", "normal"],
			["content", "normal"],
			["corner-bottom-left-shape", "round"],
			["corner-bottom-right-shape", "round"],
			["corner-end-end-shape", "round"],
			["corner-end-start-shape", "round"],
			["corner-start-end-shape", "round"],
			["corner-start-start-shape", "round"],
			["corner-top-left-shape", "round"],
			["corner-top-right-shape", "round"],
			["counter-increment", "none"],
			["counter-reset", "none"],
			["counter-set", "none"],
			["cursor", "auto"],
			["d", "none"],
			["direction", "ltr"],
			["display", "inline"],
			["dominant-baseline", "auto"],
			["empty-cells", "show"],
			["field-sizing", "fixed"],
			["filter", "none"],
			["flex-basis", "auto"],
			["flex-direction", "row"],
			["flex-wrap", "nowrap"],
			["float", "none"],
			["font-feature-settings", "normal"],
			["font-kerning", "auto"],
			["font-language-override", "normal"],
			["font-optical-sizing", "auto"],
			["font-palette", "normal"],
			["font-size-adjust", "none"],
			["font-smooth", "auto"],
			["font-stretch", "normal"],
			["font-style", "normal"],
			["font-synthesis-small-caps", "auto"],
			["font-synthesis-style", "auto"],
			["font-synthesis-weight", "auto"],
			["font-variant", "normal"],
			["font-variant-alternates", "normal"],
			["font-variant-caps", "normal"],
			["font-variant-east-asian", "normal"],
			["font-variant-emoji", "normal"],
			["font-variant-ligatures", "normal"],
			["font-variant-numeric", "normal"],
			["font-variant-position", "normal"],
			["font-variation-settings", "normal"],
			["font-weight", "normal"],
			["font-width", "normal"],
			["forced-color-adjust", "auto"],
			["frame-sizing", "auto"],
			["grid-auto-columns", "auto"],
			["grid-auto-rows", "auto"],
			["grid-column-end", "auto"],
			["grid-column-start", "auto"],
			["grid-row-end", "auto"],
			["grid-row-start", "auto"],
			["grid-template-areas", "none"],
			["grid-template-columns", "none"],
			["grid-template-rows", "none"],
			["hanging-punctuation", "none"],
			["height", "auto"],
			["hyphenate-character", "auto"],
			["hyphenate-limit-chars", "auto"],
			["hyphens", "manual"],
			["image-rendering", "auto"],
			["ime-mode", "auto"],
			["initial-letter", "normal"],
			["initial-letter-align", "auto"],
			["inline-size", "auto"],
			["inset-block-end", "auto"],
			["inset-block-start", "auto"],
			["inset-inline-end", "auto"],
			["inset-inline-start", "auto"],
			["interactivity", "auto"],
			["interest-delay-end", "normal"],
			["interest-delay-start", "normal"],
			["isolation", "auto"],
			["justify-content", "normal"],
			["justify-items", "legacy"],
			["justify-self", "auto"],
			["justify-tracks", "normal"],
			["left", "auto"],
			["letter-spacing", "normal"],
			["line-break", "auto"],
			["line-clamp", "none"],
			["line-height", "normal"],
			["link-parameters", "none"],
			["list-style-image", "none"],
			["margin-trim", "none"],
			["marker-end", "none"],
			["marker-mid", "none"],
			["marker-start", "none"],
			["mask-border-mode", "alpha"],
			["mask-border-source", "none"],
			["mask-border-width", "auto"],
			["mask-composite", "add"],
			["mask-image", "none"],
			["mask-repeat", "repeat"],
			["mask-size", "auto"],
			["masonry-auto-flow", "pack"],
			["math-shift", "normal"],
			["math-style", "normal"],
			["max-block-size", "none"],
			["max-height", "none"],
			["max-inline-size", "none"],
			["max-lines", "none"],
			["max-width", "none"],
			["min-height", "auto"],
			["min-width", "auto"],
			["mix-blend-mode", "normal"],
			["object-fit", "fill"],
			["object-view-box", "none"],
			["offset-anchor", "auto"],
			["offset-path", "none"],
			["offset-position", "normal"],
			["offset-rotate", "auto"],
			["outline-style", "none"],
			["overflow-anchor", "auto"],
			["overflow-wrap", "normal"],
			["overlay", "none"],
			["overscroll-behavior", "auto"],
			["overscroll-behavior-block", "auto"],
			["overscroll-behavior-inline", "auto"],
			["overscroll-behavior-x", "auto"],
			["overscroll-behavior-y", "auto"],
			["page", "auto"],
			["page-break-after", "auto"],
			["page-break-before", "auto"],
			["page-break-inside", "auto"],
			["paint-order", "normal"],
			["path-length", "none"],
			["perspective", "none"],
			["pointer-events", "auto"],
			["position", "static"],
			["position-anchor", "normal"],
			["position-area", "none"],
			["position-try-fallbacks", "none"],
			["position-try-order", "normal"],
			["reading-flow", "normal"],
			["resize", "none"],
			["right", "auto"],
			["rotate", "none"],
			["row-gap", "normal"],
			["ruby-overhang", "auto"],
			["rx", "auto"],
			["ry", "auto"],
			["scale", "none"],
			["scroll-axis-lock", "auto"],
			["scroll-behavior", "auto"],
			["scroll-initial-target", "none"],
			["scroll-marker-group", "none"],
			["scroll-padding-block-end", "auto"],
			["scroll-padding-block-start", "auto"],
			["scroll-padding-bottom", "auto"],
			["scroll-padding-inline-end", "auto"],
			["scroll-padding-inline-start", "auto"],
			["scroll-padding-left", "auto"],
			["scroll-padding-right", "auto"],
			["scroll-padding-top", "auto"],
			["scroll-snap-align", "none"],
			["scroll-snap-coordinate", "none"],
			["scroll-snap-points-x", "none"],
			["scroll-snap-points-y", "none"],
			["scroll-snap-stop", "normal"],
			["scroll-snap-type", "none"],
			["scroll-snap-type-x", "none"],
			["scroll-snap-type-y", "none"],
			["scroll-target-group", "none"],
			["scroll-timeline-axis", "block"],
			["scroll-timeline-name", "none"],
			["scrollbar-color", "auto"],
			["scrollbar-gutter", "auto"],
			["scrollbar-width", "auto"],
			["shape-outside", "none"],
			["shape-rendering", "auto"],
			["stroke-dasharray", "none"],
			["stroke-linecap", "butt"],
			["stroke-linejoin", "miter"],
			["table-layout", "auto"],
			["text-align", "start"],
			["text-align-last", "auto"],
			["text-anchor", "start"],
			["text-box", "normal"],
			["text-box-edge", "auto"],
			["text-box-trim", "none"],
			["text-combine-upright", "none"],
			["text-decoration-line", "none"],
			["text-decoration-skip-ink", "auto"],
			["text-decoration-style", "solid"],
			["text-decoration-thickness", "auto"],
			["text-emphasis-style", "none"],
			["text-fit", "none"],
			["text-justify", "auto"],
			["text-orientation", "mixed"],
			["text-overflow", "clip"],
			["text-rendering", "auto"],
			["text-shadow", "none"],
			["text-spacing-trim", "normal"],
			["text-transform", "none"],
			["text-underline-offset", "auto"],
			["text-underline-position", "auto"],
			["text-wrap", "wrap"],
			["text-wrap-mode", "wrap"],
			["text-wrap-style", "auto"],
			["timeline-scope", "none"],
			["timeline-trigger-activation-range-end", "normal"],
			["timeline-trigger-activation-range-start", "normal"],
			["timeline-trigger-active-range-end", "auto"],
			["timeline-trigger-active-range-start", "auto"],
			["timeline-trigger-name", "none"],
			["timeline-trigger-source", "auto"],
			["top", "auto"],
			["touch-action", "auto"],
			["transform", "none"],
			["transform-style", "flat"],
			["transition-behavior", "normal"],
			["transition-property", "all"],
			["transition-timing-function", "ease"],
			["translate", "none"],
			["trigger-scope", "none"],
			["unicode-bidi", "normal"],
			["vector-effect", "none"],
			["view-timeline-axis", "block"],
			["view-timeline-inset", "auto"],
			["view-timeline-name", "none"],
			["view-transition-class", "none"],
			["view-transition-name", "none"],
			["view-transition-scope", "none"],
			["white-space", "normal"],
			["width", "auto"],
			["will-change", "auto"],
			["window-drag", "none"],
			["word-break", "normal"],
			["word-spacing", "normal"],
			["word-wrap", "normal"],
			["z-index", "auto"]
		])
);

// Each named color a shorter spelling beats -> that spelling, so a name written
// where a color is unambiguous prints as the shortest text for the same value.
const getColorNameToShortest = memoize(
	() =>
		new Map([
			["aliceblue", "#f0f8ff"],
			["antiquewhite", "#faebd7"],
			["aquamarine", "#7fffd4"],
			["black", "#000"],
			["blanchedalmond", "#ffebcd"],
			["blueviolet", "#8a2be2"],
			["burlywood", "#deb887"],
			["cadetblue", "#5f9ea0"],
			["chartreuse", "#7fff00"],
			["chocolate", "#d2691e"],
			["cornflowerblue", "#6495ed"],
			["cornsilk", "#fff8dc"],
			["darkblue", "#00008b"],
			["darkcyan", "#008b8b"],
			["darkgoldenrod", "#b8860b"],
			["darkgray", "#a9a9a9"],
			["darkgreen", "#006400"],
			["darkgrey", "#a9a9a9"],
			["darkkhaki", "#bdb76b"],
			["darkmagenta", "#8b008b"],
			["darkolivegreen", "#556b2f"],
			["darkorange", "#ff8c00"],
			["darkorchid", "#9932cc"],
			["darksalmon", "#e9967a"],
			["darkseagreen", "#8fbc8f"],
			["darkslateblue", "#483d8b"],
			["darkslategray", "#2f4f4f"],
			["darkslategrey", "#2f4f4f"],
			["darkturquoise", "#00ced1"],
			["darkviolet", "#9400d3"],
			["deeppink", "#ff1493"],
			["deepskyblue", "#00bfff"],
			["dodgerblue", "#1e90ff"],
			["firebrick", "#b22222"],
			["floralwhite", "#fffaf0"],
			["forestgreen", "#228b22"],
			["fuchsia", "#f0f"],
			["gainsboro", "#dcdcdc"],
			["ghostwhite", "#f8f8ff"],
			["goldenrod", "#daa520"],
			["greenyellow", "#adff2f"],
			["honeydew", "#f0fff0"],
			["indianred", "#cd5c5c"],
			["lavender", "#e6e6fa"],
			["lavenderblush", "#fff0f5"],
			["lawngreen", "#7cfc00"],
			["lemonchiffon", "#fffacd"],
			["lightblue", "#add8e6"],
			["lightcoral", "#f08080"],
			["lightcyan", "#e0ffff"],
			["lightgoldenrodyellow", "#fafad2"],
			["lightgray", "#d3d3d3"],
			["lightgreen", "#90ee90"],
			["lightgrey", "#d3d3d3"],
			["lightpink", "#ffb6c1"],
			["lightsalmon", "#ffa07a"],
			["lightseagreen", "#20b2aa"],
			["lightskyblue", "#87cefa"],
			["lightslategray", "#789"],
			["lightslategrey", "#789"],
			["lightsteelblue", "#b0c4de"],
			["lightyellow", "#ffffe0"],
			["limegreen", "#32cd32"],
			["magenta", "#f0f"],
			["mediumaquamarine", "#66cdaa"],
			["mediumblue", "#0000cd"],
			["mediumorchid", "#ba55d3"],
			["mediumpurple", "#9370db"],
			["mediumseagreen", "#3cb371"],
			["mediumslateblue", "#7b68ee"],
			["mediumspringgreen", "#00fa9a"],
			["mediumturquoise", "#48d1cc"],
			["mediumvioletred", "#c71585"],
			["midnightblue", "#191970"],
			["mintcream", "#f5fffa"],
			["mistyrose", "#ffe4e1"],
			["moccasin", "#ffe4b5"],
			["navajowhite", "#ffdead"],
			["olivedrab", "#6b8e23"],
			["orangered", "#ff4500"],
			["palegoldenrod", "#eee8aa"],
			["palegreen", "#98fb98"],
			["paleturquoise", "#afeeee"],
			["palevioletred", "#db7093"],
			["papayawhip", "#ffefd5"],
			["peachpuff", "#ffdab9"],
			["powderblue", "#b0e0e6"],
			["rebeccapurple", "#639"],
			["rosybrown", "#bc8f8f"],
			["royalblue", "#4169e1"],
			["saddlebrown", "#8b4513"],
			["sandybrown", "#f4a460"],
			["seagreen", "#2e8b57"],
			["seashell", "#fff5ee"],
			["slateblue", "#6a5acd"],
			["slategray", "#708090"],
			["slategrey", "#708090"],
			["springgreen", "#00ff7f"],
			["steelblue", "#4682b4"],
			["turquoise", "#40e0d0"],
			["white", "#fff"],
			["whitesmoke", "#f5f5f5"],
			["yellow", "#ff0"],
			["yellowgreen", "#9acd32"]
		])
);

// The functions whose argument is a selector, so a `>` / `+` / `~` inside one
// is a combinator and needs no whitespace around it.
const SELECTOR_FUNCTIONS = new Set([
	"cue",
	"element",
	"has",
	"host",
	"host-context",
	"is",
	"not",
	"nth-child",
	"nth-last-child",
	"selector",
	"slotted",
	"where"
]);

// The functions every argument of which is an angle, so a zero one needs no
// unit wherever it stands.
const ZERO_ANGLE_FUNCTIONS = new Set([
	"hue-rotate",
	"rotate",
	"rotatex",
	"rotatey",
	"rotatez",
	"skew",
	"skewx",
	"skewy"
]);

// The properties a unitless zero is a number in, so a folded `calc(0)` there
// is written `0`; anywhere else `0` is a length `calc(0)` is not.
const NUMBER_ZERO_PROPERTIES = new Set([
	"aspect-ratio",
	"border-image-outset",
	"border-image-slice",
	"border-image-width",
	"opacity",
	"shape-image-threshold",
	"zoom"
]);

// The functions every argument of which is a number or a percentage, so a
// folded `calc()` standing as one is written bare there.
const NUMBER_ARGUMENT_FUNCTIONS = new Set([
	"brightness",
	"contrast",
	"grayscale",
	"invert",
	"linear",
	"matrix",
	"matrix3d",
	"opacity",
	"saturate",
	"scale",
	"scale3d",
	"scalex",
	"scaley",
	"scalez",
	"sepia"
]);

// CSS Values 4's math functions: everything inside one is a math expression, so
// `*` and `/` there are operators, and the whitespace around them carries nothing.
const MATH_FUNCTIONS = new Set([
	"abs",
	"acos",
	"asin",
	"atan",
	"atan2",
	"calc",
	"calc-size",
	"clamp",
	"cos",
	"exp",
	"hypot",
	"log",
	"max",
	"min",
	"mod",
	"pow",
	"rem",
	"round",
	"sign",
	"sin",
	"sqrt",
	"tan"
]);

// WHY: How many `<calc-sum>` arguments each of them takes, off its own grammar. A
// function whose arguments are not all expressions (`round()` leads with a
// strategy, `calc-size()` with a basis) is absent, and absence is what the
// folding reads as "leave this one alone".
/** @type {Map<string, [number, number]>} */
const MATH_FUNCTION_ARITY = new Map([
	["abs", [1, 1]],
	["acos", [1, 1]],
	["asin", [1, 1]],
	["atan", [1, 1]],
	["atan2", [2, 2]],
	["calc", [1, 1]],
	["clamp", [3, 3]],
	["cos", [1, 1]],
	["exp", [1, 1]],
	["hypot", [1, Infinity]],
	["log", [1, 2]],
	["max", [1, Infinity]],
	["min", [1, Infinity]],
	["mod", [2, 2]],
	["pow", [2, 2]],
	["rem", [2, 2]],
	["round", [2, 2]],
	["sign", [1, 1]],
	["sin", [1, 1]],
	["sqrt", [1, 1]],
	["tan", [1, 1]]
]);

// The optional keyword a math function may lead with, for the ones whose
// grammar offers a choice of them (`round( <rounding-strategy>?, … )`). Read
// off that production, so a strategy joining it needs no edit here.
/** @type {Map<string, string[]>} */
const MATH_FUNCTION_KEYWORDS = new Map([
	["round", ["down", "nearest", "to-zero", "up"]]
]);

// Where a function the fold cannot read as a whole still takes a `<calc-sum>`,
// so that argument reduces on its own. Keyed by name to the argument positions.
/** @type {Map<string, number[]>} */
const MATH_FUNCTION_SUM_ARGUMENTS = new Map([["calc-size", [1]]]);

// A CSS-wide keyword is only valid as the whole value, so a box repeating one is
// invalid and already discarded — collapsing it would switch the declaration on.
const CSS_WIDE_KEYWORDS = new Set([
	"inherit",
	"initial",
	"revert",
	"revert-layer",
	"unset"
]);

// `<easing-function>` argument lists that are exactly a shorter keyword, keyed
// by the arguments as `Number` prints them.
const CUBIC_BEZIER_KEYWORDS = new Map([
	["0.25,0.1,0.25,1", "ease"],
	["0,0,1,1", "linear"],
	["0.42,0,1,1", "ease-in"],
	["0,0,0.58,1", "ease-out"],
	["0.42,0,0.58,1", "ease-in-out"]
]);

// The two `flex` values CSS Flexbox 7.1.1 gives a keyword spelling.
const FLEX_KEYWORDS = new Map([
	["0 0 auto", "none"],
	["1 1 auto", "auto"]
]);

// The `font-weight` keywords CSS Fonts 4 §2.2 defines as a number, which is what
// `getComputedStyle().fontWeight` reports either way.
const FONT_WEIGHT_NUMBERS = new Map([
	["normal", "400"],
	["bold", "700"]
]);

// Selectors 4 §3.3: the pseudo-elements engines must also accept with one colon,
// so their second colon carries nothing.
const LEGACY_PSEUDO_ELEMENTS = new Set([
	"before",
	"after",
	"first-line",
	"first-letter"
]);

// What may follow the `*` a compound selector implies: another simple selector
// in the same compound. A separator between them would be a descendant
// combinator instead, and `|` makes the `*` a namespace's, not a redundant one.
const COMPOUND_CONTINUATIONS = new Set([":", ".", "#", "["]);

// The pseudo-classes selecting a featureless element, which matches no type or
// universal selector — so an implied `*` before one is what makes the selector
// match nothing, and dropping it would bring the rule to life.
const FEATURELESS_PSEUDO_CLASSES = new Set(["host", "host-context"]);

// The properties whose zero length keeps its unit: those whose own grammar
// offers a bare number beside the length, so the unit is what picks the
// reading, and the two an engine reads its own way.
const ZERO_UNIT_KEEPING_PROPERTIES = new Set([
	"border-image",
	"border-image-outset",
	"border-image-width",
	"columns",
	"flex",
	"flex-basis",
	"font",
	"line-height",
	"mask-border",
	"mask-border-outset",
	"mask-border-width",
	"overflow-clip-margin",
	"stroke-dasharray",
	"stroke-dashoffset",
	"stroke-width",
	"tab-size"
]);

// The properties an engine takes no `calc()` in, so one stays as written
// rather than folding to the value it equals.
const CALC_REJECTING_PROPERTIES = new Set(["overflow-clip-margin"]);

// The properties that read a bare number as a length of their own, where an
// engine refuses the same number inside `calc()` — so taking the parentheses
// off would revive a declaration it had thrown away.
const NUMBER_ONLY_OUTSIDE_CALC_PROPERTIES = new Set([
	"-webkit-perspective",
	"perspective",
	"stroke-dasharray",
	"stroke-dashoffset",
	"stroke-width"
]);

// The range a `calc()` is clamped to where the literal outside it is invalid,
// keyed by property: `[unit, min, max]`.
/** @type {Map<string, [string, number, number]>} */
const CLAMPED_VALUE_RANGES = new Map([["font-style", ["deg", -90, 90]]]);

// The smallest count `steps()` takes as a literal, keyed by its
// `<step-position>`. A position missing here is one the table has not met, so
// it reads as the largest and the fold declines rather than guesses.
/** @type {Map<string, number>} */
const STEP_POSITION_MINIMUM_COUNTS = new Map([
	["jump-start", 1],
	["jump-end", 1],
	["jump-both", 1],
	["jump-none", 2],
	["start", 1],
	["end", 1]
]);

// At-rules whose empty block is inert, so dropping it changes nothing.
const DROPPABLE_WHEN_EMPTY_AT_RULES = new Set([
	"media",
	"supports",
	"container",
	"starting-style",
	"-moz-document"
]);

// At-rules whose block holds rules and whose prelude states a condition, so two
// adjacent blocks with the same prelude are the one block they resolve to.
const MERGEABLE_AT_RULES = new Set([
	"container",
	"document",
	"layer",
	"media",
	"scope",
	"starting-style",
	"supports"
]);

// The math functions whose result steps with their arguments, so a value inside
// one keeps the unit and the digits it was written with.
const STEPPED_FUNCTIONS = new Set(["mod", "rem", "round"]);

// The units fixed against each other (CSS Values 4 §6.2, §8), as
// `unit -> [group, how many of the group's base unit one is]`. Two units in the
// same group convert into each other exactly when the ratio is binary-exact.
/** @type {Map<string, [string, number]>} */
const ABSOLUTE_UNIT_SCALE = new Map([
	["px", ["length", 381]],
	["pc", ["length", 6096]],
	["pt", ["length", 508]],
	["in", ["length", 36576]],
	["cm", ["length", 14400]],
	["mm", ["length", 1440]],
	["q", ["length", 360]],
	["ms", ["time", 1]],
	["s", ["time", 1000]]
]);

// Each convertible group's reference unit, as `group -> [unit, scale]`. A sum
// counted in the group's base unit divides by the scale to get back to a unit
// that can be written down.
/** @type {Map<string, [string, number]>} */
const UNIT_GROUP_BASE = new Map([
	["length", ["px", 381]],
	["time", ["ms", 1]]
]);

// The units a conversion may emit. Every one is CSS 2.1's, so rewriting into it
// cannot outrun what an engine reading the stylesheet already parses.
const UNIT_CONVERSION_TARGETS = new Set([
	"px",
	"pc",
	"pt",
	"in",
	"cm",
	"mm",
	"ms",
	"s"
]);

// WHY: How each predefined color space is read back to sRGB: the matrix taking its
// linear-light components to linear-light sRGB, and the function that reads one
// stored component back to linear light. Both derived from the primaries,
// white point and transfer function CSS Color 4 §10 states.
/**
 * A component already stored linearly.
 * @param {number} c the stored component
 * @returns {number} the same component
 */
const linearTransfer = (c) => c;

/**
 * The sRGB transfer function, which Display P3 shares.
 * @param {number} c the stored component
 * @returns {number} the linear-light component
 */
const srgbTransfer = (c) => {
	const abs = Math.abs(c);
	const sign = c < 0 ? -1 : 1;
	return abs <= 0.04045 ? c / 12.92 : sign * ((abs + 0.055) / 1.055) ** 2.4;
};

/**
 * Adobe RGB (1998)'s pure gamma of 563/256.
 * @param {number} c the stored component
 * @returns {number} the linear-light component
 */
const a98Transfer = (c) => {
	const sign = c < 0 ? -1 : 1;
	return sign * Math.abs(c) ** (563 / 256);
};

/**
 * ProPhoto RGB's gamma of 1.8, with the linear segment below 16/512.
 * @param {number} c the stored component
 * @returns {number} the linear-light component
 */
const prophotoTransfer = (c) => {
	const abs = Math.abs(c);
	const sign = c < 0 ? -1 : 1;
	return abs <= 16 / 512 ? c / 16 : sign * abs ** 1.8;
};

/**
 * Rec. 2020's transfer function, with the constants ITU-R BT.2020 states.
 * @param {number} c the stored component
 * @returns {number} the linear-light component
 */
const rec2020Transfer = (c) => {
	const alpha = 1.09929682680944;
	const beta = 0.018053968510807;
	const abs = Math.abs(c);
	const sign = c < 0 ? -1 : 1;
	return abs < beta * 4.5
		? c / 4.5
		: sign * ((abs + alpha - 1) / alpha) ** (1 / 0.45);
};

// What a color read in one space passes through on its way to a byte: nothing at
// all, the sRGB transfer, or a matrix as well. `lib/css/syntax.js` reads how far
// its answer can sit from an engine's from this.
const ENCODED_ALREADY = 0;
const THROUGH_TRANSFER = 1;
const THROUGH_MATRIX = 2;
const ENGINE_TRANSFER_DIFFERS = 3;

/** @type {Map<string, { toSrgb: number[], transfer: (c: number) => number, conversion: number }>} */
const PREDEFINED_COLOR_SPACES = new Map([
	[
		"srgb",
		{
			toSrgb: [1, 0, 0, 0, 1, 0, 0, 0, 1],
			transfer: srgbTransfer,
			conversion: 0
		}
	],
	[
		"srgb-linear",
		{
			toSrgb: [1, 0, 0, 0, 1, 0, 0, 0, 1],
			transfer: linearTransfer,
			conversion: 1
		}
	],
	[
		"display-p3",
		{
			toSrgb: [
				1.2249401762805596, -0.22494017628055984, 0, -0.04205695470968812,
				1.042056954709688, -2.0816681711721685e-17, -0.019637554590334425,
				-0.0786360455506318, 1.0982736001409665
			],
			transfer: srgbTransfer,
			conversion: 2
		}
	],
	[
		"a98-rgb",
		{
			toSrgb: [
				1.3983557439607786, -0.39835574396077855, 5.551115123125783e-17,
				-1.4072944198861848e-16, 1, -2.0816681711721685e-17,
				1.734723475976807e-17, -0.04292898929447317, 1.042928989294473
			],
			transfer: a98Transfer,
			conversion: 3
		}
	],
	[
		"prophoto-rgb",
		{
			toSrgb: [
				2.034380836302867, -0.7276360137172471, -0.3067448320015419,
				-0.228825697964331, 1.2317426727787788, -0.0029169277200310345,
				-0.008558858080647581, -0.15326675125999153, 1.161825549670178
			],
			transfer: prophotoTransfer,
			conversion: 3
		}
	],
	[
		"rec2020",
		{
			toSrgb: [
				1.6604910021084347, -0.5876411387885495, -0.07284986331988486,
				-0.12455047452159063, 1.1328998971259596, -0.008349422604369508,
				-0.018150763354905206, -0.10057889800800737, 1.1187296613629127
			],
			transfer: rec2020Transfer,
			conversion: 2
		}
	],
	[
		"xyz",
		{
			toSrgb: [
				3.2409699419045226, -1.537383177570094, -0.4986107602930034,
				-0.9692436362808796, 1.8759675015077202, 0.04155505740717559,
				0.05563007969699366, -0.20397695888897652, 1.0569715142428786
			],
			transfer: linearTransfer,
			conversion: 2
		}
	],
	[
		"xyz-d65",
		{
			toSrgb: [
				3.2409699419045226, -1.537383177570094, -0.4986107602930034,
				-0.9692436362808796, 1.8759675015077202, 0.04155505740717559,
				0.05563007969699366, -0.20397695888897652, 1.0569715142428786
			],
			transfer: linearTransfer,
			conversion: 2
		}
	],
	[
		"xyz-d50",
		{
			toSrgb: [
				3.1341359569958707, -1.6173863321612538, -0.4906619460083532,
				-0.978795502912089, 1.9162545672595237, 0.03344273116131948,
				0.07195537988411684, -0.22897682641583222, 1.4053860583241256
			],
			transfer: linearTransfer,
			conversion: 2
		}
	]
]);

// Linear-light sRGB -> linear-light Display P3, the inverse of the matrix above
// it: a color outside sRGB keeps its gamut in a `color(display-p3 …)` fallback
// wherever the target reads one.
const LINEAR_SRGB_TO_P3 = [
	0.8224619687143625, 0.17753803128563775, 3.3650564745655794e-18,
	0.0331941988509616, 0.9668058011490385, 1.8324840583423322e-17,
	0.017082630721120023, 0.07239744066396339, 0.9105199286149164
];

// WHY: The interpolation spaces a `color-mix()` or a relative color is read in, each
// as the pair taking linear-light sRGB to its components and back, and which
// component is an angle (`-1` for none). Every one derived from the primaries,
// matrices and definitions the generator states.
/**
 * A 3x3 matrix, laid out row by row, times a column.
 * @param {number[]} m the matrix
 * @param {number[]} c the column
 * @returns {number[]} the product
 */
const applyModel = (m, c) =>
	[0, 3, 6].map((row) => m[row] * c[0] + m[row + 1] * c[1] + m[row + 2] * c[2]);

/**
 * @param {number} c a linear component
 * @returns {number} the same component
 */
const linearEncode = (c) => c;

/**
 * @param {number} c a linear component
 * @returns {number} the sRGB-encoded component
 */
const srgbEncode = (c) => {
	const abs = Math.abs(c);
	const sign = c < 0 ? -1 : 1;
	return abs > 0.0031308
		? sign * (1.055 * abs ** (1 / 2.4) - 0.055)
		: 12.92 * c;
};

/**
 * @param {number} c a linear component
 * @returns {number} the Adobe RGB (1998) component
 */
const a98Encode = (c) => {
	const sign = c < 0 ? -1 : 1;
	return sign * Math.abs(c) ** (256 / 563);
};

/**
 * @param {number} c a linear component
 * @returns {number} the ProPhoto RGB component
 */
const prophotoEncode = (c) => {
	const abs = Math.abs(c);
	const sign = c < 0 ? -1 : 1;
	return abs >= 1 / 512 ? sign * abs ** (1 / 1.8) : 16 * c;
};

/**
 * @param {number} c a linear component
 * @returns {number} the Rec. 2020 component
 */
const rec2020Encode = (c) => {
	const alpha = 1.09929682680944;
	const beta = 0.018053968510807;
	const abs = Math.abs(c);
	const sign = c < 0 ? -1 : 1;
	return abs > beta ? sign * (alpha * abs ** 0.45 - (alpha - 1)) : 4.5 * c;
};

// The D50 white point Lab is defined against (CSS Color 4 §12), as XYZ.
const LAB_WHITE = [0.3457 / 0.3585, 1, (1 - 0.3457 - 0.3585) / 0.3585];
const LAB_EPSILON = 216 / 24389;
const LAB_KAPPA = 24389 / 27;

/**
 * Linear-light sRGB -> CIE Lab, through XYZ at Lab's own white point.
 * @param {number[]} c the linear-light components
 * @returns {number[]} `[L, a, b]`, L in 0..100
 */
const toLab = (c) => {
	const xyz = toXyzD50(c);
	const f = xyz.map((value, at) => {
		const t = value / LAB_WHITE[at];
		return t > LAB_EPSILON ? Math.cbrt(t) : (LAB_KAPPA * t + 16) / 116;
	});
	return [116 * f[1] - 16, 500 * (f[0] - f[1]), 200 * (f[1] - f[2])];
};

/**
 * CIE Lab -> linear-light sRGB.
 * @param {number[]} c `[L, a, b]`
 * @returns {number[]} the linear-light components
 */
const fromLab = (c) => {
	const fy = (c[0] + 16) / 116;
	const fx = c[1] / 500 + fy;
	const fz = fy - c[2] / 200;
	return fromXyzD50([
		(fx ** 3 > LAB_EPSILON ? fx ** 3 : (116 * fx - 16) / LAB_KAPPA) *
			LAB_WHITE[0],
		(c[0] > LAB_KAPPA * LAB_EPSILON ? fy ** 3 : c[0] / LAB_KAPPA) *
			LAB_WHITE[1],
		(fz ** 3 > LAB_EPSILON ? fz ** 3 : (116 * fz - 16) / LAB_KAPPA) *
			LAB_WHITE[2]
	]);
};

/**
 * Linear-light sRGB -> Oklab.
 * @param {number[]} c the linear-light components
 * @returns {number[]} `[L, a, b]`, L in 0..1
 */
const toOklab = (c) => applyModel(OKLAB_M, applyModel(LMS_M, c).map(Math.cbrt));

/**
 * Oklab -> linear-light sRGB.
 * @param {number[]} c `[L, a, b]`
 * @returns {number[]} the linear-light components
 */
const fromOklab = (c) =>
	applyModel(
		LMS_I,
		applyModel(OKLAB_I, c).map((value) => value ** 3)
	);

/**
 * A rectangular pair as chroma and hue, and back — the one relation `lch` has
 * to `lab` and `oklch` to `oklab`.
 * @param {number[]} c `[L, a, b]`
 * @returns {number[]} `[L, C, H]`, H in degrees
 */
const toPolar = (c) => {
	const chroma = Math.hypot(c[1], c[2]);
	let hue = (Math.atan2(c[2], c[1]) * 180) / Math.PI;
	if (hue < 0) hue += 360;
	return [c[0], chroma, chroma === 0 ? 0 : hue];
};

/**
 * @param {number[]} c `[L, C, H]`, H in degrees
 * @returns {number[]} `[L, a, b]`
 */
const fromPolar = (c) => {
	const hue = (c[2] * Math.PI) / 180;
	return [c[0], c[1] * Math.cos(hue), c[1] * Math.sin(hue)];
};

/**
 * @param {number[]} c the linear-light components
 * @returns {number[]} `[L, C, H]`
 */
const toLch = (c) => toPolar(toLab(c));

/**
 * @param {number[]} c `[L, C, H]`
 * @returns {number[]} the linear-light components
 */
const fromLch = (c) => fromLab(fromPolar(c));

/**
 * @param {number[]} c the linear-light components
 * @returns {number[]} `[L, C, H]`
 */
const toOklch = (c) => toPolar(toOklab(c));

/**
 * @param {number[]} c `[L, C, H]`
 * @returns {number[]} the linear-light components
 */
const fromOklch = (c) => fromOklab(fromPolar(c));

/**
 * Linear-light sRGB -> HSL (CSS Color 4 §7.1), through sRGB.
 * @param {number[]} c the linear-light components
 * @returns {number[]} `[H, S, L]`, H in degrees and the rest 0..1
 */
const toHsl = (c) => {
	const [r, g, b] = c.map(srgbEncode);
	const max = Math.max(r, g, b);
	const min = Math.min(r, g, b);
	const light = (min + max) / 2;
	const range = max - min;
	if (range === 0) return [0, 0, light];
	let hue;
	if (max === r) hue = ((g - b) / range) % 6;
	else if (max === g) hue = (b - r) / range + 2;
	else hue = (r - g) / range + 4;
	hue *= 60;
	if (hue < 0) hue += 360;
	return [hue, range / (1 - Math.abs(2 * light - 1)), light];
};

/**
 * HSL -> linear-light sRGB.
 * @param {number[]} c `[H, S, L]`
 * @returns {number[]} the linear-light components
 */
const fromHsl = (c) => {
	let hue = c[0] % 360;
	if (hue < 0) hue += 360;
	const amount = c[1] * Math.min(c[2], 1 - c[2]);
	return [0, 8, 4]
		.map((n) => {
			const k = (n + hue / 30) % 12;
			return c[2] - amount * Math.max(-1, Math.min(k - 3, 9 - k, 1));
		})
		.map(srgbTransfer);
};

/**
 * Linear-light sRGB -> HWB (CSS Color 4 §7.2).
 * @param {number[]} c the linear-light components
 * @returns {number[]} `[H, W, B]`
 */
const toHwb = (c) => {
	const srgb = c.map(srgbEncode);
	return [
		toHsl(c)[0],
		Math.min(srgb[0], srgb[1], srgb[2]),
		1 - Math.max(srgb[0], srgb[1], srgb[2])
	];
};

/**
 * HWB -> linear-light sRGB.
 * @param {number[]} c `[H, W, B]`
 * @returns {number[]} the linear-light components
 */
const fromHwb = (c) => {
	if (c[1] + c[2] >= 1) {
		const gray = c[1] / (c[1] + c[2]);
		return [gray, gray, gray].map(srgbTransfer);
	}
	return fromHsl([c[0], 1, 0.5]).map((value) =>
		srgbTransfer(srgbEncode(value) * (1 - c[1] - c[2]) + c[1])
	);
};

const SRGB_M = [1, 0, 0, 0, 1, 0, 0, 0, 1];
const SRGB_I = [1, 0, 0, 0, 1, 0, 0, 0, 1];
/** @type {(c: number[]) => number[]} */
const toSrgb = (c) => applyModel(SRGB_M, c).map(srgbEncode);
/** @type {(c: number[]) => number[]} */
const fromSrgb = (c) => applyModel(SRGB_I, c.map(srgbTransfer));
const SRGB_LINEAR_M = [1, 0, 0, 0, 1, 0, 0, 0, 1];
const SRGB_LINEAR_I = [1, 0, 0, 0, 1, 0, 0, 0, 1];
/** @type {(c: number[]) => number[]} */
const toSrgbLinear = (c) => applyModel(SRGB_LINEAR_M, c).map(linearEncode);
/** @type {(c: number[]) => number[]} */
const fromSrgbLinear = (c) => applyModel(SRGB_LINEAR_I, c.map(linearTransfer));
const DISPLAY_P3_M = [
	0.8224619687143625, 0.17753803128563775, 3.3650564745655794e-18,
	0.0331941988509616, 0.9668058011490385, 1.8324840583423322e-17,
	0.017082630721120023, 0.07239744066396339, 0.9105199286149164
];
const DISPLAY_P3_I = [
	1.2249401762805596, -0.22494017628055984, 0, -0.04205695470968812,
	1.042056954709688, -2.0816681711721685e-17, -0.019637554590334425,
	-0.0786360455506318, 1.0982736001409665
];
/** @type {(c: number[]) => number[]} */
const toDisplayP3 = (c) => applyModel(DISPLAY_P3_M, c).map(srgbEncode);
/** @type {(c: number[]) => number[]} */
const fromDisplayP3 = (c) => applyModel(DISPLAY_P3_I, c.map(srgbTransfer));
const A98_RGB_M = [
	0.7151256068556245, 0.2848743931443755, -3.237737802690131e-17,
	1.0063922760456419e-16, 1, 1.9959826532201272e-17, -7.752312519259058e-18,
	0.04116194845011838, 0.9588380515498818
];
const A98_RGB_I = [
	1.3983557439607786, -0.39835574396077855, 5.551115123125783e-17,
	-1.4072944198861848e-16, 1, -2.0816681711721685e-17, 1.734723475976807e-17,
	-0.04292898929447317, 1.042928989294473
];
/** @type {(c: number[]) => number[]} */
const toA98Rgb = (c) => applyModel(A98_RGB_M, c).map(a98Encode);
/** @type {(c: number[]) => number[]} */
const fromA98Rgb = (c) => applyModel(A98_RGB_I, c.map(a98Transfer));
const PROPHOTO_RGB_M = [
	0.5292769842583223, 0.3301545636252504, 0.14056844993940584,
	0.09836583745016964, 0.8734706333869527, 0.028163490634021324,
	0.016875355289046535, 0.1176594475769436, 0.8654652433945142
];
const PROPHOTO_RGB_I = [
	2.034380836302867, -0.7276360137172471, -0.3067448320015419,
	-0.228825697964331, 1.2317426727787788, -0.0029169277200310345,
	-0.008558858080647581, -0.15326675125999153, 1.161825549670178
];
/** @type {(c: number[]) => number[]} */
const toProphotoRgb = (c) => applyModel(PROPHOTO_RGB_M, c).map(prophotoEncode);
/** @type {(c: number[]) => number[]} */
const fromProphotoRgb = (c) =>
	applyModel(PROPHOTO_RGB_I, c.map(prophotoTransfer));
const REC2020_M = [
	0.6274038959346989, 0.32928303837788375, 0.04331306568741721,
	0.06909728935823205, 0.9195403950754593, 0.011362315566309202,
	0.016391438875150217, 0.08801330787722576, 0.8955952532476239
];
const REC2020_I = [
	1.6604910021084347, -0.5876411387885495, -0.07284986331988486,
	-0.12455047452159063, 1.1328998971259596, -0.008349422604369508,
	-0.018150763354905206, -0.10057889800800737, 1.1187296613629127
];
/** @type {(c: number[]) => number[]} */
const toRec2020 = (c) => applyModel(REC2020_M, c).map(rec2020Encode);
/** @type {(c: number[]) => number[]} */
const fromRec2020 = (c) => applyModel(REC2020_I, c.map(rec2020Transfer));
const XYZ_M = [
	0.41239079926595934, 0.357584339383878, 0.18048078840183424,
	0.21263900587151027, 0.7151686787677561, 0.07219231536073371,
	0.01933081871559181, 0.11919477979462595, 0.9505321522496607
];
const XYZ_I = [
	3.2409699419045226, -1.537383177570094, -0.4986107602930034,
	-0.9692436362808796, 1.8759675015077202, 0.04155505740717559,
	0.05563007969699366, -0.20397695888897652, 1.0569715142428786
];
const XYZ_D50_M = [
	0.436065749632219, 0.3851515490648008, 0.14307837223757391,
	0.22249316329879926, 0.7168869742512141, 0.06061983440080464,
	0.01392393331799153, 0.09708135172457436, 0.7140993556376494
];
const XYZ_D50_I = [
	3.1341359569958707, -1.6173863321612538, -0.4906619460083532,
	-0.978795502912089, 1.9162545672595237, 0.03344273116131948,
	0.07195537988411684, -0.22897682641583222, 1.4053860583241256
];
/** @type {(c: number[]) => number[]} */
const toXyz = (c) => applyModel(XYZ_M, c);
/** @type {(c: number[]) => number[]} */
const fromXyz = (c) => applyModel(XYZ_I, c);
/** @type {(c: number[]) => number[]} */
const toXyzD50 = (c) => applyModel(XYZ_D50_M, c);
/** @type {(c: number[]) => number[]} */
const fromXyzD50 = (c) => applyModel(XYZ_D50_I, c);
const LMS_M = [
	0.4122214708, 0.5363325363, 0.0514459929, 0.2119034982, 0.6806995451,
	0.1073969566, 0.0883024619, 0.2817188376, 0.6299787005
];
const LMS_I = [
	4.076741661347994, -3.3077115904081933, 0.23096992872942784,
	-1.268438004092176, 2.6097574006633715, -0.34131939631021946,
	-0.004196086541837046, -0.7034186144594494, 1.7076147009309446
];
const OKLAB_M = [
	0.2104542553, 0.793617785, -0.0040720468, 1.9779984951, -2.428592205,
	0.4505937099, 0.0259040371, 0.7827717662, -0.808675766
];
const OKLAB_I = [
	0.9999999984505199, 0.39633779217376786, 0.2158037580607588,
	1.0000000088817607, -0.10556134232365634, -0.0638541747717059,
	1.000000054672411, -0.08948418209496577, -1.291485537864092
];
/**
 * @param {number[]} c a color's components in Oklch
 * @returns {boolean} true where an engine may read the hue as missing
 */
const uncertainOklchHue = (c) => Math.abs(c[1]) < 0.03;

// The space a hex and an `rgb()` state their components in.
const SRGB_SPACE = "srgb";

/** @typedef {{ to: (c: number[]) => number[], from: (c: number[]) => number[], hue: number, conversion: number, written: { open: string, scale: number[], percent: boolean[], feature: string }, uncertainHue: ((c: number[]) => boolean) | null }} ColorSpaceModel */

/** @type {() => Map<string, ColorSpaceModel>} */
const getColorSpaceModel = memoize(
	() =>
		new Map([
			[
				"srgb",
				{
					to: toSrgb,
					from: fromSrgb,
					hue: -1,
					conversion: 0,
					written: {
						open: "color(srgb ",
						scale: [1, 1, 1],
						percent: [false, false, false],
						feature: "colorFunction"
					},
					uncertainHue: null
				}
			],
			[
				"srgb-linear",
				{
					to: toSrgbLinear,
					from: fromSrgbLinear,
					hue: -1,
					conversion: 1,
					written: {
						open: "color(srgb-linear ",
						scale: [1, 1, 1],
						percent: [false, false, false],
						feature: "colorFunction"
					},
					uncertainHue: null
				}
			],
			[
				"display-p3",
				{
					to: toDisplayP3,
					from: fromDisplayP3,
					hue: -1,
					conversion: 2,
					written: {
						open: "color(display-p3 ",
						scale: [1, 1, 1],
						percent: [false, false, false],
						feature: "colorFunction"
					},
					uncertainHue: null
				}
			],
			[
				"a98-rgb",
				{
					to: toA98Rgb,
					from: fromA98Rgb,
					hue: -1,
					conversion: 3,
					written: {
						open: "color(a98-rgb ",
						scale: [1, 1, 1],
						percent: [false, false, false],
						feature: "colorFunction"
					},
					uncertainHue: null
				}
			],
			[
				"prophoto-rgb",
				{
					to: toProphotoRgb,
					from: fromProphotoRgb,
					hue: -1,
					conversion: 3,
					written: {
						open: "color(prophoto-rgb ",
						scale: [1, 1, 1],
						percent: [false, false, false],
						feature: "colorFunction"
					},
					uncertainHue: null
				}
			],
			[
				"rec2020",
				{
					to: toRec2020,
					from: fromRec2020,
					hue: -1,
					conversion: 2,
					written: {
						open: "color(rec2020 ",
						scale: [1, 1, 1],
						percent: [false, false, false],
						feature: "colorFunction"
					},
					uncertainHue: null
				}
			],
			[
				"xyz",
				{
					to: toXyz,
					from: fromXyz,
					hue: -1,
					conversion: 2,
					written: {
						open: "color(xyz ",
						scale: [1, 1, 1],
						percent: [false, false, false],
						feature: "colorFunction"
					},
					uncertainHue: null
				}
			],
			[
				"xyz-d65",
				{
					to: toXyz,
					from: fromXyz,
					hue: -1,
					conversion: 2,
					written: {
						open: "color(xyz-d65 ",
						scale: [1, 1, 1],
						percent: [false, false, false],
						feature: "colorFunction"
					},
					uncertainHue: null
				}
			],
			[
				"xyz-d50",
				{
					to: toXyzD50,
					from: fromXyzD50,
					hue: -1,
					conversion: 2,
					written: {
						open: "color(xyz-d50 ",
						scale: [1, 1, 1],
						percent: [false, false, false],
						feature: "colorFunction"
					},
					uncertainHue: null
				}
			],
			[
				"lab",
				{
					to: toLab,
					from: fromLab,
					hue: -1,
					conversion: 2,
					written: {
						open: "lab(",
						scale: [1, 1, 1],
						percent: [false, false, false],
						feature: "labColors"
					},
					uncertainHue: null
				}
			],
			[
				"lch",
				{
					to: toLch,
					from: fromLch,
					hue: 2,
					conversion: 2,
					written: {
						open: "lch(",
						scale: [1, 1, 1],
						percent: [false, false, false],
						feature: "labColors"
					},
					uncertainHue: null
				}
			],
			[
				"oklab",
				{
					to: toOklab,
					from: fromOklab,
					hue: -1,
					conversion: 2,
					written: {
						open: "oklab(",
						scale: [1, 1, 1],
						percent: [false, false, false],
						feature: "oklabColors"
					},
					uncertainHue: null
				}
			],
			[
				"oklch",
				{
					to: toOklch,
					from: fromOklch,
					hue: 2,
					conversion: 2,
					written: {
						open: "oklch(",
						scale: [1, 1, 1],
						percent: [false, false, false],
						feature: "oklabColors"
					},
					uncertainHue: uncertainOklchHue
				}
			],
			[
				"hsl",
				{
					to: toHsl,
					from: fromHsl,
					hue: 0,
					conversion: 0,
					written: {
						open: "hsl(",
						scale: [1, 100, 100],
						percent: [false, true, true],
						feature: ""
					},
					uncertainHue: null
				}
			],
			[
				"hwb",
				{
					to: toHwb,
					from: fromHwb,
					hue: 0,
					conversion: 0,
					written: {
						open: "hwb(",
						scale: [1, 100, 100],
						percent: [false, true, true],
						feature: "hwbColors"
					},
					uncertainHue: null
				}
			]
		])
);

// The named colors an engine may not read while reading the rest, so one says
// nothing about what another takes. Every other name is as old as naming one.
const LATER_COLOR_NAMES = new Set(["rebeccapurple", "transparent"]);

// Every named color as its packed `0xrrggbb` value — what a color a mix or a
// relative reference names resolves through. The two tables above cut this one
// down to the spellings worth rewriting; this one answers for every name.
/** @type {() => Map<string, number>} */
const getColorNameToRgb = memoize(
	() =>
		new Map([
			["aliceblue", 15792383],
			["antiquewhite", 16444375],
			["aqua", 65535],
			["aquamarine", 8388564],
			["azure", 15794175],
			["beige", 16119260],
			["bisque", 16770244],
			["black", 0],
			["blanchedalmond", 16772045],
			["blue", 255],
			["blueviolet", 9055202],
			["brown", 10824234],
			["burlywood", 14596231],
			["cadetblue", 6266528],
			["chartreuse", 8388352],
			["chocolate", 13789470],
			["coral", 16744272],
			["cornflowerblue", 6591981],
			["cornsilk", 16775388],
			["crimson", 14423100],
			["cyan", 65535],
			["darkblue", 139],
			["darkcyan", 35723],
			["darkgoldenrod", 12092939],
			["darkgray", 11119017],
			["darkgreen", 25600],
			["darkgrey", 11119017],
			["darkkhaki", 12433259],
			["darkmagenta", 9109643],
			["darkolivegreen", 5597999],
			["darkorange", 16747520],
			["darkorchid", 10040012],
			["darkred", 9109504],
			["darksalmon", 15308410],
			["darkseagreen", 9419919],
			["darkslateblue", 4734347],
			["darkslategray", 3100495],
			["darkslategrey", 3100495],
			["darkturquoise", 52945],
			["darkviolet", 9699539],
			["deeppink", 16716947],
			["deepskyblue", 49151],
			["dimgray", 6908265],
			["dimgrey", 6908265],
			["dodgerblue", 2003199],
			["firebrick", 11674146],
			["floralwhite", 16775920],
			["forestgreen", 2263842],
			["fuchsia", 16711935],
			["gainsboro", 14474460],
			["ghostwhite", 16316671],
			["gold", 16766720],
			["goldenrod", 14329120],
			["gray", 8421504],
			["green", 32768],
			["greenyellow", 11403055],
			["grey", 8421504],
			["honeydew", 15794160],
			["hotpink", 16738740],
			["indianred", 13458524],
			["indigo", 4915330],
			["ivory", 16777200],
			["khaki", 15787660],
			["lavender", 15132410],
			["lavenderblush", 16773365],
			["lawngreen", 8190976],
			["lemonchiffon", 16775885],
			["lightblue", 11393254],
			["lightcoral", 15761536],
			["lightcyan", 14745599],
			["lightgoldenrodyellow", 16448210],
			["lightgray", 13882323],
			["lightgreen", 9498256],
			["lightgrey", 13882323],
			["lightpink", 16758465],
			["lightsalmon", 16752762],
			["lightseagreen", 2142890],
			["lightskyblue", 8900346],
			["lightslategray", 7833753],
			["lightslategrey", 7833753],
			["lightsteelblue", 11584734],
			["lightyellow", 16777184],
			["lime", 65280],
			["limegreen", 3329330],
			["linen", 16445670],
			["magenta", 16711935],
			["maroon", 8388608],
			["mediumaquamarine", 6737322],
			["mediumblue", 205],
			["mediumorchid", 12211667],
			["mediumpurple", 9662683],
			["mediumseagreen", 3978097],
			["mediumslateblue", 8087790],
			["mediumspringgreen", 64154],
			["mediumturquoise", 4772300],
			["mediumvioletred", 13047173],
			["midnightblue", 1644912],
			["mintcream", 16121850],
			["mistyrose", 16770273],
			["moccasin", 16770229],
			["navajowhite", 16768685],
			["navy", 128],
			["oldlace", 16643558],
			["olive", 8421376],
			["olivedrab", 7048739],
			["orange", 16753920],
			["orangered", 16729344],
			["orchid", 14315734],
			["palegoldenrod", 15657130],
			["palegreen", 10025880],
			["paleturquoise", 11529966],
			["palevioletred", 14381203],
			["papayawhip", 16773077],
			["peachpuff", 16767673],
			["peru", 13468991],
			["pink", 16761035],
			["plum", 14524637],
			["powderblue", 11591910],
			["purple", 8388736],
			["rebeccapurple", 6697881],
			["red", 16711680],
			["rosybrown", 12357519],
			["royalblue", 4286945],
			["saddlebrown", 9127187],
			["salmon", 16416882],
			["sandybrown", 16032864],
			["seagreen", 3050327],
			["seashell", 16774638],
			["sienna", 10506797],
			["silver", 12632256],
			["skyblue", 8900331],
			["slateblue", 6970061],
			["slategray", 7372944],
			["slategrey", 7372944],
			["snow", 16775930],
			["springgreen", 65407],
			["steelblue", 4620980],
			["tan", 13808780],
			["teal", 32896],
			["thistle", 14204888],
			["tomato", 16737095],
			["turquoise", 4251856],
			["violet", 15631086],
			["wheat", 16113331],
			["white", 16777215],
			["whitesmoke", 16119285],
			["yellow", 16776960],
			["yellowgreen", 10145074]
		])
);

// What a layered shorthand's position, size, origin and clip hold when nothing
// writes them, as `[x, y, size, origin, clip]`. A layer holding its own is a
// layer the shorthand says without them.
const LAYER_INITIALS = new Map([
	["background", ["0%", "0%", "auto", "padding-box", "border-box"]],
	["mask", ["0%", "0%", "auto", "border-box", "border-box"]]
]);

// What each slot of a family shorthand holds when nothing writes it. A slot
// holding its own initial says nothing beside the others.
const FAMILY_SLOT_INITIALS = new Map([
	["border-block-end-color", "currentcolor"],
	["border-block-end-style", "none"],
	["border-block-end-width", "medium"],
	["border-block-start-color", "currentcolor"],
	["border-block-start-style", "none"],
	["border-block-start-width", "medium"],
	["border-bottom-color", "currentcolor"],
	["border-bottom-style", "none"],
	["border-bottom-width", "medium"],
	["border-inline-end-color", "currentcolor"],
	["border-inline-end-style", "none"],
	["border-inline-end-width", "medium"],
	["border-inline-start-color", "currentcolor"],
	["border-inline-start-style", "none"],
	["border-inline-start-width", "medium"],
	["border-left-color", "currentcolor"],
	["border-left-style", "none"],
	["border-left-width", "medium"],
	["border-right-color", "currentcolor"],
	["border-right-style", "none"],
	["border-right-width", "medium"],
	["border-top-color", "currentcolor"],
	["border-top-style", "none"],
	["border-top-width", "medium"],
	["column-rule-color", "currentcolor"],
	["column-rule-style", "none"],
	["column-rule-width", "medium"],
	["flex-direction", "row"],
	["flex-wrap", "nowrap"],
	["list-style-image", "none"],
	["list-style-position", "outside"],
	["list-style-type", "disc"],
	["outline-color", "auto"],
	["outline-style", "none"],
	["outline-width", "medium"],
	["text-decoration-color", "currentcolor"],
	["text-decoration-line", "none"],
	["text-decoration-style", "solid"],
	["text-decoration-thickness", "auto"],
	["text-emphasis-color", "currentcolor"],
	["text-emphasis-style", "none"],
	["text-wrap-mode", "wrap"],
	["text-wrap-style", "auto"]
]);

// The font stack `system-ui` names, for a target that does not read the keyword.
const SYSTEM_UI_STACK =
	"system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Noto Sans,Ubuntu,Cantarell,Helvetica Neue";

// The angle units. An authored one is excluded from rounding: `rotate()` runs
// its argument through trig, which turns a truncated digit into another matrix.
const ANGLE_UNITS = new Set(["deg", "grad", "rad", "turn"]);

// How many degrees one of each angle unit is, so a sum in two of them folds.
/** @type {Map<string, number>} */
const ANGLE_DEGREES = new Map([
	["deg", 1],
	["grad", 0.9],
	["turn", 360],
	["rad", 57.29577951308232]
]);

// The constants a calculation may name (CSS Values 4 §10.7), as `name -> value`.
// `infinity` and `NaN` are named with none: no printed number spells either, so
// a calculation naming one is left as it stands.
/** @type {Map<string, number | null>} */
const CALC_CONSTANTS = new Map([
	["e", Math.E],
	["infinity", null],
	["nan", null],
	["pi", Math.PI]
]);

// A quarter turn in each unit that spells it exactly (CSS Values 4 §8.1), as
// `unit -> the count`. It is what a trig function's argument is read as degrees
// through, and the eighths of it are where sine and cosine are rational.
/** @type {Map<string, number>} */
const QUARTER_TURN_ANGLE = new Map([
	["deg", 90],
	["grad", 100],
	["turn", 0.25]
]);

// Sine, cosine and tangent as `eighth turn from zero -> value`. The eighths
// where the value is irrational are absent — sine and cosine on the odd ones,
// tangent on the asymptotes. Cosine is sine a quarter turn along.
/** @type {Map<number, number>} */
const EIGHTH_TURN_SINE = new Map([
	[0, 0],
	[2, 1],
	[4, 0],
	[6, -1]
]);

/** @type {Map<number, number>} */
const EIGHTH_TURN_COSINE = new Map([
	[0, 1],
	[2, 0],
	[4, -1],
	[6, 0]
]);

/** @type {Map<number, number>} */
const EIGHTH_TURN_TANGENT = new Map([
	[0, 0],
	[1, 1],
	[3, -1],
	[4, 0],
	[5, 1],
	[7, -1]
]);

// What each inverse trig function answers, as `argument -> degrees`, by
// inverting the table above it over that function's principal branch. Every
// other argument is transcendental and leaves the call written out.
/** @type {Map<number, number>} */
const ARC_SINE_DEGREES = new Map([
	[-1, -90],
	[0, 0],
	[1, 90]
]);

/** @type {Map<number, number>} */
const ARC_COSINE_DEGREES = new Map([
	[-1, 180],
	[0, 90],
	[1, 0]
]);

/** @type {Map<number, number>} */
const ARC_TANGENT_DEGREES = new Map([
	[-1, -45],
	[0, 0],
	[1, 45]
]);

// The reader that needs a table, built once here — `mathPrimitives` knows how to
// read an angle but not which units spell a quarter turn.
const readAngle = angleReader(QUARTER_TURN_ANGLE);

// The table a function that looks nothing up is handed.
/** @type {Map<number, number>} */
const NO_TABLE = new Map();

// WHY: What folding each math function comes down to, as
// `name -> { read, apply, result, table }`: how its arguments are read, which
// arithmetic runs, and the unit the answer carries. `read` and `apply` are the
// functions themselves, so `lib/css/syntax.js` drives the fold while naming
// neither a math function nor an arithmetic of its own.
/** @type {Map<string, { read: MathArgumentReader, apply: MathOperation, result: string, table: Map<number, number> }>} */
const MATH_FUNCTION_FOLD = new Map([
	[
		"abs",
		{ read: readSameUnit, apply: absolute, result: "same", table: NO_TABLE }
	],
	[
		"acos",
		{
			read: readNumber,
			apply: statedAngle,
			result: "deg",
			table: ARC_COSINE_DEGREES
		}
	],
	[
		"asin",
		{
			read: readNumber,
			apply: statedAngle,
			result: "deg",
			table: ARC_SINE_DEGREES
		}
	],
	[
		"atan",
		{
			read: readNumber,
			apply: statedAngle,
			result: "deg",
			table: ARC_TANGENT_DEGREES
		}
	],
	[
		"atan2",
		{ read: readSameUnit, apply: arcTangent2, result: "deg", table: NO_TABLE }
	],
	[
		"clamp",
		{ read: readSameUnit, apply: clamp, result: "same", table: NO_TABLE }
	],
	[
		"cos",
		{ read: readAngle, apply: cosine, result: "", table: EIGHTH_TURN_COSINE }
	],
	[
		"exp",
		{ read: readNumber, apply: exponential, result: "", table: NO_TABLE }
	],
	[
		"hypot",
		{ read: readSameUnit, apply: hypotenuse, result: "same", table: NO_TABLE }
	],
	["log", { read: readNumber, apply: logarithm, result: "", table: NO_TABLE }],
	[
		"max",
		{ read: readSameUnit, apply: maximum, result: "same", table: NO_TABLE }
	],
	[
		"min",
		{ read: readSameUnit, apply: minimum, result: "same", table: NO_TABLE }
	],
	[
		"mod",
		{ read: readSameUnit, apply: modulus, result: "same", table: NO_TABLE }
	],
	["pow", { read: readNumber, apply: power, result: "", table: NO_TABLE }],
	[
		"rem",
		{ read: readSameUnit, apply: remainder, result: "same", table: NO_TABLE }
	],
	[
		"round",
		{ read: readSameUnit, apply: round, result: "same", table: NO_TABLE }
	],
	["sign", { read: readSameUnit, apply: sign, result: "", table: NO_TABLE }],
	[
		"sin",
		{ read: readAngle, apply: sine, result: "", table: EIGHTH_TURN_SINE }
	],
	[
		"sqrt",
		{ read: readNumber, apply: squareRoot, result: "", table: NO_TABLE }
	],
	[
		"tan",
		{ read: readAngle, apply: tangent, result: "", table: EIGHTH_TURN_TANGENT }
	]
]);

// WHY: Properties whose grammar can reach an `<integer>`. Deliberately wide: a
// non-integer where an integer is expected is rounded rather than dropped
// (`z-index: calc(1.5)` computes to `2`), so this is read to refuse a rewrite,
// and one name too many costs only that rewrite.
const INTEGER_PROPERTIES = new Set([
	"-ms-grid-columns",
	"-ms-grid-rows",
	"-ms-hyphenate-limit-chars",
	"-ms-hyphenate-limit-lines",
	"-webkit-line-clamp",
	"animation",
	"animation-timing-function",
	"box-flex-group",
	"box-ordinal-group",
	"column-count",
	"columns",
	"counter-increment",
	"counter-reset",
	"counter-set",
	"flex-line-count",
	"font-feature-settings",
	"grid",
	"grid-area",
	"grid-column",
	"grid-column-end",
	"grid-column-start",
	"grid-row",
	"grid-row-end",
	"grid-row-start",
	"grid-template",
	"grid-template-columns",
	"grid-template-rows",
	"hyphenate-limit-chars",
	"initial-letter",
	"line-clamp",
	"math-depth",
	"max-lines",
	"order",
	"orphans",
	"reading-order",
	"tab-size",
	"text-combine-upright",
	"transition",
	"transition-timing-function",
	"widows",
	"z-index"
]);

// The properties whose value is one `<number> | <percentage>`, where the
// percentage is the number hundredfold and the two compute to the same thing.
const ALPHA_VALUE_PROPERTIES = new Set(["opacity", "shape-image-threshold"]);

// The properties taking a `<ratio>`, whose second number of `1` is the one an
// omitted denominator means.
const RATIO_PROPERTIES = new Set(["aspect-ratio"]);

// The keywords of every property a `css/module` reads a scoped name out of,
// each mapped to how many times it may be spelled before the next one is the
// name (`Infinity` — never the name). Derived from each property's grammar.
const getCssModulesKeywords = memoize(
	() =>
		new Map([
			[
				"animation",
				new Map([
					["alternate", 1],
					["alternate-reverse", 1],
					["auto", Infinity],
					["backwards", 1],
					["both", 1],
					["ease", 1],
					["ease-in", 1],
					["ease-in-out", 1],
					["ease-out", 1],
					["forwards", 1],
					["infinite", 1],
					["inherit", Infinity],
					["initial", Infinity],
					["linear", 1],
					["none", Infinity],
					["normal", 1],
					["paused", 1],
					["reverse", 1],
					["revert", Infinity],
					["revert-layer", Infinity],
					["running", 1],
					["step-end", 1],
					["step-start", 1],
					["unset", Infinity]
				])
			],
			[
				"animation-name",
				new Map([
					["inherit", Infinity],
					["initial", Infinity],
					["none", Infinity],
					["revert", Infinity],
					["revert-layer", Infinity],
					["unset", Infinity]
				])
			],
			[
				"container",
				new Map([
					["inherit", Infinity],
					["initial", Infinity],
					["inline-size", 1],
					["none", Infinity],
					["normal", 1],
					["revert", Infinity],
					["revert-layer", Infinity],
					["scroll-state", 1],
					["size", 1],
					["unset", Infinity]
				])
			],
			[
				"container-name",
				new Map([
					["inherit", Infinity],
					["initial", Infinity],
					["none", Infinity],
					["revert", Infinity],
					["revert-layer", Infinity],
					["unset", Infinity]
				])
			],
			[
				"list-style",
				new Map([
					["arabic-indic", 1],
					["armenian", 1],
					["bengali", 1],
					["cambodian", 1],
					["circle", 1],
					["cjk-decimal", 1],
					["cjk-earthly-branch", 1],
					["cjk-heavenly-stem", 1],
					["cjk-ideographic", 1],
					["decimal", 1],
					["decimal-leading-zero", 1],
					["devanagari", 1],
					["disc", 1],
					["disclosure-closed", 1],
					["disclosure-open", 1],
					["ethiopic-numeric", 1],
					["georgian", 1],
					["gujarati", 1],
					["gurmukhi", 1],
					["hebrew", 1],
					["hiragana", 1],
					["hiragana-iroha", 1],
					["inherit", Infinity],
					["initial", Infinity],
					["inside", 1],
					["japanese-formal", 1],
					["japanese-informal", 1],
					["kannada", 1],
					["katakana", 1],
					["katakana-iroha", 1],
					["khmer", 1],
					["korean-hangul-formal", 1],
					["korean-hanja-formal", 1],
					["korean-hanja-informal", 1],
					["lao", 1],
					["lower-alpha", 1],
					["lower-armenian", 1],
					["lower-greek", 1],
					["lower-latin", 1],
					["lower-roman", 1],
					["malayalam", 1],
					["mongolian", 1],
					["myanmar", 1],
					["none", Infinity],
					["oriya", 1],
					["outside", 1],
					["persian", 1],
					["revert", Infinity],
					["revert-layer", Infinity],
					["simp-chinese-formal", 1],
					["simp-chinese-informal", 1],
					["square", 1],
					["tamil", 1],
					["telugu", 1],
					["thai", 1],
					["tibetan", 1],
					["trad-chinese-formal", 1],
					["trad-chinese-informal", 1],
					["unset", Infinity],
					["upper-alpha", 1],
					["upper-armenian", 1],
					["upper-latin", 1],
					["upper-roman", 1]
				])
			],
			[
				"list-style-type",
				new Map([
					["arabic-indic", 1],
					["armenian", 1],
					["bengali", 1],
					["cambodian", 1],
					["circle", 1],
					["cjk-decimal", 1],
					["cjk-earthly-branch", 1],
					["cjk-heavenly-stem", 1],
					["cjk-ideographic", 1],
					["decimal", 1],
					["decimal-leading-zero", 1],
					["devanagari", 1],
					["disc", 1],
					["disclosure-closed", 1],
					["disclosure-open", 1],
					["ethiopic-numeric", 1],
					["georgian", 1],
					["gujarati", 1],
					["gurmukhi", 1],
					["hebrew", 1],
					["hiragana", 1],
					["hiragana-iroha", 1],
					["inherit", Infinity],
					["initial", Infinity],
					["japanese-formal", 1],
					["japanese-informal", 1],
					["kannada", 1],
					["katakana", 1],
					["katakana-iroha", 1],
					["khmer", 1],
					["korean-hangul-formal", 1],
					["korean-hanja-formal", 1],
					["korean-hanja-informal", 1],
					["lao", 1],
					["lower-alpha", 1],
					["lower-armenian", 1],
					["lower-greek", 1],
					["lower-latin", 1],
					["lower-roman", 1],
					["malayalam", 1],
					["mongolian", 1],
					["myanmar", 1],
					["none", Infinity],
					["oriya", 1],
					["persian", 1],
					["revert", Infinity],
					["revert-layer", Infinity],
					["simp-chinese-formal", 1],
					["simp-chinese-informal", 1],
					["square", 1],
					["tamil", 1],
					["telugu", 1],
					["thai", 1],
					["tibetan", 1],
					["trad-chinese-formal", 1],
					["trad-chinese-informal", 1],
					["unset", Infinity],
					["upper-alpha", 1],
					["upper-armenian", 1],
					["upper-latin", 1],
					["upper-roman", 1]
				])
			],
			[
				"system",
				new Map([
					["additive", 1],
					["alphabetic", 1],
					["arabic-indic", 1],
					["armenian", 1],
					["bengali", 1],
					["cambodian", 1],
					["circle", 1],
					["cjk-decimal", 1],
					["cjk-earthly-branch", 1],
					["cjk-heavenly-stem", 1],
					["cjk-ideographic", 1],
					["cyclic", 1],
					["decimal", 1],
					["decimal-leading-zero", 1],
					["devanagari", 1],
					["disc", 1],
					["disclosure-closed", 1],
					["disclosure-open", 1],
					["ethiopic-numeric", 1],
					["extends", 1],
					["fixed", 1],
					["georgian", 1],
					["gujarati", 1],
					["gurmukhi", 1],
					["hebrew", 1],
					["hiragana", 1],
					["hiragana-iroha", 1],
					["japanese-formal", 1],
					["japanese-informal", 1],
					["kannada", 1],
					["katakana", 1],
					["katakana-iroha", 1],
					["khmer", 1],
					["korean-hangul-formal", 1],
					["korean-hanja-formal", 1],
					["korean-hanja-informal", 1],
					["lao", 1],
					["lower-alpha", 1],
					["lower-armenian", 1],
					["lower-greek", 1],
					["lower-latin", 1],
					["lower-roman", 1],
					["malayalam", 1],
					["mongolian", 1],
					["myanmar", 1],
					["numeric", 1],
					["oriya", 1],
					["persian", 1],
					["simp-chinese-formal", 1],
					["simp-chinese-informal", 1],
					["square", 1],
					["symbolic", 1],
					["tamil", 1],
					["telugu", 1],
					["thai", 1],
					["tibetan", 1],
					["trad-chinese-formal", 1],
					["trad-chinese-informal", 1],
					["upper-alpha", 1],
					["upper-armenian", 1],
					["upper-latin", 1],
					["upper-roman", 1]
				])
			],
			[
				"fallback",
				new Map([
					["arabic-indic", 1],
					["armenian", 1],
					["bengali", 1],
					["cambodian", 1],
					["circle", 1],
					["cjk-decimal", 1],
					["cjk-earthly-branch", 1],
					["cjk-heavenly-stem", 1],
					["cjk-ideographic", 1],
					["decimal", 1],
					["decimal-leading-zero", 1],
					["devanagari", 1],
					["disc", 1],
					["disclosure-closed", 1],
					["disclosure-open", 1],
					["ethiopic-numeric", 1],
					["georgian", 1],
					["gujarati", 1],
					["gurmukhi", 1],
					["hebrew", 1],
					["hiragana", 1],
					["hiragana-iroha", 1],
					["japanese-formal", 1],
					["japanese-informal", 1],
					["kannada", 1],
					["katakana", 1],
					["katakana-iroha", 1],
					["khmer", 1],
					["korean-hangul-formal", 1],
					["korean-hanja-formal", 1],
					["korean-hanja-informal", 1],
					["lao", 1],
					["lower-alpha", 1],
					["lower-armenian", 1],
					["lower-greek", 1],
					["lower-latin", 1],
					["lower-roman", 1],
					["malayalam", 1],
					["mongolian", 1],
					["myanmar", 1],
					["oriya", 1],
					["persian", 1],
					["simp-chinese-formal", 1],
					["simp-chinese-informal", 1],
					["square", 1],
					["tamil", 1],
					["telugu", 1],
					["thai", 1],
					["tibetan", 1],
					["trad-chinese-formal", 1],
					["trad-chinese-informal", 1],
					["upper-alpha", 1],
					["upper-armenian", 1],
					["upper-latin", 1],
					["upper-roman", 1]
				])
			],
			[
				"speak-as",
				new Map([
					["arabic-indic", 1],
					["armenian", 1],
					["auto", Infinity],
					["bengali", 1],
					["bullets", Infinity],
					["cambodian", 1],
					["circle", 1],
					["cjk-decimal", 1],
					["cjk-earthly-branch", 1],
					["cjk-heavenly-stem", 1],
					["cjk-ideographic", 1],
					["decimal", 1],
					["decimal-leading-zero", 1],
					["devanagari", 1],
					["disc", 1],
					["disclosure-closed", 1],
					["disclosure-open", 1],
					["ethiopic-numeric", 1],
					["georgian", 1],
					["gujarati", 1],
					["gurmukhi", 1],
					["hebrew", 1],
					["hiragana", 1],
					["hiragana-iroha", 1],
					["japanese-formal", 1],
					["japanese-informal", 1],
					["kannada", 1],
					["katakana", 1],
					["katakana-iroha", 1],
					["khmer", 1],
					["korean-hangul-formal", 1],
					["korean-hanja-formal", 1],
					["korean-hanja-informal", 1],
					["lao", 1],
					["lower-alpha", 1],
					["lower-armenian", 1],
					["lower-greek", 1],
					["lower-latin", 1],
					["lower-roman", 1],
					["malayalam", 1],
					["mongolian", 1],
					["myanmar", 1],
					["numbers", Infinity],
					["oriya", 1],
					["persian", 1],
					["simp-chinese-formal", 1],
					["simp-chinese-informal", 1],
					["spell-out", Infinity],
					["square", 1],
					["tamil", 1],
					["telugu", 1],
					["thai", 1],
					["tibetan", 1],
					["trad-chinese-formal", 1],
					["trad-chinese-informal", 1],
					["upper-alpha", 1],
					["upper-armenian", 1],
					["upper-latin", 1],
					["upper-roman", 1],
					["words", Infinity]
				])
			],
			[
				"counter-reset",
				new Map([
					["inherit", Infinity],
					["initial", Infinity],
					["list-item", Infinity],
					["none", 1],
					["page", Infinity],
					["pages", Infinity],
					["revert", Infinity],
					["revert-layer", Infinity],
					["unset", Infinity]
				])
			],
			[
				"counter-increment",
				new Map([
					["inherit", Infinity],
					["initial", Infinity],
					["list-item", Infinity],
					["none", 1],
					["page", Infinity],
					["pages", Infinity],
					["revert", Infinity],
					["revert-layer", Infinity],
					["unset", Infinity]
				])
			],
			[
				"counter-set",
				new Map([
					["inherit", Infinity],
					["initial", Infinity],
					["list-item", Infinity],
					["none", 1],
					["page", Infinity],
					["pages", Infinity],
					["revert", Infinity],
					["revert-layer", Infinity],
					["unset", Infinity]
				])
			],
			[
				"view-transition-name",
				new Map([
					["auto", Infinity],
					["inherit", Infinity],
					["initial", Infinity],
					["match-element", Infinity],
					["none", Infinity],
					["revert", Infinity],
					["revert-layer", Infinity],
					["unset", Infinity]
				])
			],
			[
				"view-transition-group",
				new Map([
					["contain", Infinity],
					["inherit", Infinity],
					["initial", Infinity],
					["nearest", Infinity],
					["normal", Infinity],
					["revert", Infinity],
					["revert-layer", Infinity],
					["unset", Infinity]
				])
			],
			[
				"view-transition-class",
				new Map([
					["inherit", Infinity],
					["initial", Infinity],
					["none", Infinity],
					["revert", Infinity],
					["revert-layer", Infinity],
					["unset", Infinity]
				])
			],
			[
				"grid",
				new Map([
					["auto", Infinity],
					["auto-flow", 1],
					["column", 1],
					["dense", 1],
					["inherit", Infinity],
					["initial", Infinity],
					["masonry", 1],
					["max-content", Infinity],
					["min-content", Infinity],
					["none", 2],
					["revert", Infinity],
					["revert-layer", Infinity],
					["row", 1],
					["subgrid", 2],
					["unset", Infinity]
				])
			],
			[
				"grid-area",
				new Map([
					["auto", Infinity],
					["inherit", Infinity],
					["initial", Infinity],
					["revert", Infinity],
					["revert-layer", Infinity],
					["span", Infinity],
					["unset", Infinity]
				])
			],
			[
				"grid-column",
				new Map([
					["auto", Infinity],
					["inherit", Infinity],
					["initial", Infinity],
					["revert", Infinity],
					["revert-layer", Infinity],
					["span", Infinity],
					["unset", Infinity]
				])
			],
			[
				"grid-column-end",
				new Map([
					["auto", Infinity],
					["inherit", Infinity],
					["initial", Infinity],
					["revert", Infinity],
					["revert-layer", Infinity],
					["span", Infinity],
					["unset", Infinity]
				])
			],
			[
				"grid-column-start",
				new Map([
					["auto", Infinity],
					["inherit", Infinity],
					["initial", Infinity],
					["revert", Infinity],
					["revert-layer", Infinity],
					["span", Infinity],
					["unset", Infinity]
				])
			],
			[
				"grid-row",
				new Map([
					["auto", Infinity],
					["inherit", Infinity],
					["initial", Infinity],
					["revert", Infinity],
					["revert-layer", Infinity],
					["span", Infinity],
					["unset", Infinity]
				])
			],
			[
				"grid-row-end",
				new Map([
					["auto", Infinity],
					["inherit", Infinity],
					["initial", Infinity],
					["revert", Infinity],
					["revert-layer", Infinity],
					["span", Infinity],
					["unset", Infinity]
				])
			],
			[
				"grid-row-start",
				new Map([
					["auto", Infinity],
					["inherit", Infinity],
					["initial", Infinity],
					["revert", Infinity],
					["revert-layer", Infinity],
					["span", Infinity],
					["unset", Infinity]
				])
			],
			[
				"grid-template",
				new Map([
					["auto", Infinity],
					["inherit", Infinity],
					["initial", Infinity],
					["masonry", 1],
					["max-content", Infinity],
					["min-content", Infinity],
					["none", 2],
					["revert", Infinity],
					["revert-layer", Infinity],
					["subgrid", 2],
					["unset", Infinity]
				])
			],
			[
				"grid-template-areas",
				new Map([
					["inherit", Infinity],
					["initial", Infinity],
					["none", 1],
					["revert", Infinity],
					["revert-layer", Infinity],
					["unset", Infinity]
				])
			],
			[
				"grid-template-columns",
				new Map([
					["auto", Infinity],
					["inherit", Infinity],
					["initial", Infinity],
					["masonry", 1],
					["max-content", Infinity],
					["min-content", Infinity],
					["none", 1],
					["revert", Infinity],
					["revert-layer", Infinity],
					["subgrid", 1],
					["unset", Infinity]
				])
			],
			[
				"grid-template-rows",
				new Map([
					["auto", Infinity],
					["inherit", Infinity],
					["initial", Infinity],
					["masonry", 1],
					["max-content", Infinity],
					["min-content", Infinity],
					["none", 1],
					["revert", Infinity],
					["revert-layer", Infinity],
					["subgrid", 1],
					["unset", Infinity]
				])
			]
		])
);

// The parser option gating each of them.
const CSS_MODULES_KEYWORD_OPTIONS = new Map([
	["animation", "animation"],
	["animation-name", "animation"],
	["container", "container"],
	["container-name", "container"],
	["list-style", "customIdents"],
	["list-style-type", "customIdents"],
	["system", "customIdents"],
	["fallback", "customIdents"],
	["speak-as", "customIdents"],
	["counter-reset", "customIdents"],
	["counter-increment", "customIdents"],
	["counter-set", "customIdents"],
	["view-transition-name", "customIdents"],
	["view-transition-group", "customIdents"],
	["view-transition-class", "customIdents"],
	["grid", "grid"],
	["grid-area", "grid"],
	["grid-column", "grid"],
	["grid-column-end", "grid"],
	["grid-column-start", "grid"],
	["grid-row", "grid"],
	["grid-row-end", "grid"],
	["grid-row-start", "grid"],
	["grid-template", "grid"],
	["grid-template-areas", "grid"],
	["grid-template-columns", "grid"],
	["grid-template-rows", "grid"]
]);

// WHY: The properties a negative value is valid on, so `calc(-5px)` may lose its
// parentheses there. Read to permit a rewrite, which is the opposite of
// `INTEGER_PROPERTIES` above: naming one property too many is a bug, naming one
// too few only costs a rewrite.
const NEGATIVE_ACCEPTING_PROPERTIES = new Set([
	"animation-delay",
	"background-position",
	"background-position-x",
	"background-position-y",
	"bottom",
	"inset",
	"inset-block",
	"inset-block-end",
	"inset-block-start",
	"inset-inline",
	"inset-inline-end",
	"inset-inline-start",
	"left",
	"letter-spacing",
	"margin",
	"margin-block",
	"margin-block-end",
	"margin-block-start",
	"margin-bottom",
	"margin-inline",
	"margin-inline-end",
	"margin-inline-start",
	"margin-left",
	"margin-right",
	"margin-top",
	"offset-distance",
	"order",
	"outline-offset",
	"perspective-origin",
	"right",
	"rotate",
	"scroll-margin",
	"scroll-margin-block",
	"scroll-margin-bottom",
	"scroll-margin-inline",
	"scroll-margin-left",
	"scroll-margin-right",
	"scroll-margin-top",
	"stroke-dashoffset",
	"text-indent",
	"text-underline-offset",
	"top",
	"transform-origin",
	"transition-delay",
	"translate",
	"vertical-align",
	"word-spacing",
	"z-index"
]);

// WHY: The functions whose every numeric argument is a length, so a zero inside one
// drops its unit the way a whole component's does. Read to permit a rewrite:
// any other numeric type would make the bare `0` mean something else, or make
// a dropped declaration valid.
const LENGTH_ONLY_FUNCTIONS = new Set([
	"anchor",
	"anchor-size",
	"blur",
	"circle",
	"ellipse",
	"fit-content",
	"inset",
	"perspective",
	"polygon",
	"rect",
	"translate",
	"translate3d",
	"translatex",
	"translatey",
	"translatez",
	"view",
	"xywh"
]);

// The transform functions a negative argument is valid in, all but those whose
// grammar bounds one from below (`perspective()`).
const NEGATIVE_ACCEPTING_FUNCTIONS = new Set([
	"matrix",
	"matrix3d",
	"rotate",
	"rotate3d",
	"rotatex",
	"rotatey",
	"rotatez",
	"scale",
	"scale3d",
	"scalex",
	"scaley",
	"scalez",
	"skew",
	"skewx",
	"skewy",
	"translate",
	"translate3d",
	"translatex",
	"translatey",
	"translatez"
]);

// Packed `0xrrggbb` -> the shortest named color with that value. Only names that
// can beat `#rrggbb`; anything longer would never be picked.
const RGB_TO_NAME = new Map([
	[0x000080, "navy"],
	[0x008000, "green"],
	[0x008080, "teal"],
	[0x4b0082, "indigo"],
	[0x800000, "maroon"],
	[0x800080, "purple"],
	[0x808000, "olive"],
	[0x808080, "gray"],
	[0xa0522d, "sienna"],
	[0xa52a2a, "brown"],
	[0xc0c0c0, "silver"],
	[0xcd853f, "peru"],
	[0xd2b48c, "tan"],
	[0xda70d6, "orchid"],
	[0xdda0dd, "plum"],
	[0xee82ee, "violet"],
	[0xf0e68c, "khaki"],
	[0xf0ffff, "azure"],
	[0xf5deb3, "wheat"],
	[0xf5f5dc, "beige"],
	[0xfa8072, "salmon"],
	[0xfaf0e6, "linen"],
	[0xff0000, "red"],
	[0xff6347, "tomato"],
	[0xff7f50, "coral"],
	[0xffa500, "orange"],
	[0xffc0cb, "pink"],
	[0xffd700, "gold"],
	[0xffe4c4, "bisque"],
	[0xfffafa, "snow"],
	[0xfffff0, "ivory"]
]);

// WHY: Prefixed constructs the minifier reads back, one table per axis, as `name ->
// [prefix, windowList][]`. Versions are `major * 100000 + minor`; a target
// browser at version V needs the prefix when `prefixedFrom <= V < unprefixedFrom`
// (`NEVER` = never unprefixed). Non-standard-only constructs are absent.
// Every window list laid end to end as `browserSlot, prefixedFrom,
// unprefixedFrom` triples — the slot is the browser's place in
// `SUPPORT_BROWSERS`, so no name is restated. A spelling names its list by
// index, and two thirds of the lists are shared.
const getPrefixWindows = memoize(
	() =>
		new Uint32Array([
			3, 2100000, 2900000, 0, 2500000, 2900000, 10, 1500000, 1600000, 9,
			1400000, 1600000, 11, 700000, 900000, 8, 700000, 900000, 12, 100005,
			200000, 6, 1000000, 1100000, 7, 1000000, 1100000, 3, 400000, 2100000, 11,
			300001, 600001, 8, 300002, 700000, 2, 200001, 400004, 5, 200000, 2200000,
			3, 2100000, 2900000, 0, 2500000, 2900000, 11, 700000, 900000, 8, 700000,
			900000, 12, 100005, 200000, 10, 1500000, 1600000, 9, 1400000, 1600000, 11,
			800000, 1800000, 8, 800000, 1800000, 3, 300000, 4300000, 0, 1800000,
			4300000, 10, 1500000, 3000000, 9, 1400000, 3000000, 11, 400000, 900000, 8,
			300002, 900000, 12, 100000, 400000, 2, 200000, 4300000, 5, 500000,
			1600000, 1, 500000, 1600000, 10, 1200000, 1500000, 9, 1200000, 1400000, 3,
			300000, 4300000, 0, 1800000, 4300000, 10, 1500000, 3000000, 9, 1400000,
			3000000, 11, 400000, 900000, 8, 300002, 900000, 12, 100000, 400000, 2,
			400004, 4300000, 3, 300000, 4300000, 0, 1800000, 4300000, 10, 1500000,
			3000000, 9, 1400000, 3000000, 11, 400000, 900000, 8, 400002, 900000, 12,
			100000, 400000, 2, 200000, 4300000, 3, 300000, 4300000, 0, 1800000,
			4300000, 10, 1500000, 3000000, 9, 1400000, 3000000, 11, 500000, 900000, 8,
			400000, 900000, 12, 100000, 400000, 2, 400004, 4300000, 3, 300000,
			4300000, 0, 1800000, 4300000, 10, 1500000, 3000000, 9, 1400000, 3000000,
			11, 400000, 900000, 8, 200000, 900000, 12, 100000, 400000, 2, 400004,
			4300000, 3, 100000, 8400000, 0, 1800000, 8400000, 4, 1200000, 8400000, 10,
			1500000, 7000000, 9, 1400000, 6000000, 11, 300000, 1500004, 8, 100000,
			1500004, 12, 100000, 1400000, 2, 400004, 8400000, 5, 100000, 8000000, 1,
			400000, 8000000, 4, 1700000, 7900000, 11, 900000, 1800000, 8, 900000,
			1800000, 3, 1200000, 3600000, 0, 1800000, 3600000, 10, 1500000, 2300000,
			9, 1400000, 2400000, 11, 500001, 1500004, 8, 500000, 1500004, 12, 100000,
			300000, 2, 300000, 3700000, 5, 1000000, 1600000, 1, 1000000, 1600000, 5,
			100000, 400000, 11, 300000, 500000, 8, 100000, 500000, 3, 100000, 300000,
			11, 300000, 500000, 8, 100000, 400002, 5, 300006, 400000, 10, 900005,
			1000002, 3, 800000, 5700000, 0, 1800000, 5700000, 10, 1500000, 4400000, 9,
			1400000, 4300000, 11, 500001, 1200001, 8, 500000, 1200002, 12, 100000,
			700000, 2, 400004, 5700000, 3, 100000, 400000, 11, 300000, 500000, 8,
			100000, 400002, 3, 700000, 1600000, 11, 300000, 600000, 8, 200000, 600000,
			2, 200000, 400004, 5, 300005, 1500000, 1, 400000, 1500000, 10, 1000005,
			1500000, 9, 1100000, 1400000, 5, 300000, 4100000, 1, 400000, 4100000, 3,
			100000, 400000, 11, 300000, 500000, 8, 100000, 400002, 2, 200000, 400004,
			3, 2200000, 13000000, 0, 2500000, 13000000, 4, 7900000, 13000000, 10,
			1500000, 11500000, 9, 1400000, 8600000, 11, 700000, 1e9, 8, 700000, 1e9,
			12, 100005, 2800000, 2, 400004, 13000000, 3, 100000, 6700000, 0, 1800000,
			6700000, 10, 1500000, 5500000, 9, 1400000, 4800000, 11, 300000, 1e9, 8,
			100000, 1e9, 12, 100000, 900000, 2, 400004, 6700000, 3, 100000, 1000000,
			11, 300000, 500001, 8, 100000, 500000, 5, 300005, 400000, 3, 100000,
			1000000, 11, 300000, 500001, 8, 100000, 600000, 2, 200000, 400000, 5,
			100000, 2900000, 1, 400000, 2900000, 3, 2300000, 5500000, 0, 2500000,
			5500000, 10, 1500000, 4200000, 9, 1400000, 4200000, 11, 700000, 900001, 8,
			700000, 900003, 12, 100005, 600000, 2, 400004, 5500000, 3, 100000,
			5000000, 0, 1800000, 5000000, 10, 1500000, 3700000, 9, 1400000, 3700000,
			11, 300000, 900000, 8, 200000, 900000, 12, 100000, 500000, 2, 400004,
			5000000, 5, 100005, 5200000, 1, 400000, 5200000, 5, 1700000, 5200000, 1,
			1700000, 5200000, 11, 800000, 900000, 8, 800000, 900000, 3, 400000,
			5000000, 11, 300001, 900000, 8, 300002, 900000, 10, 1500000, 3700000, 2,
			200001, 500000, 12, 400000, 500000, 9, 1400000, 3700000, 5, 200000,
			5200000, 3, 100000, 5000000, 0, 1800000, 5000000, 11, 300000, 900000, 8,
			100000, 900000, 12, 100000, 500000, 2, 400004, 5000000, 10, 1500000,
			3700000, 9, 1400000, 3700000, 5, 300005, 5200000, 1, 400000, 5200000, 3,
			400000, 5000000, 0, 1800000, 5000000, 10, 1500000, 3700000, 9, 1400000,
			3700000, 11, 300001, 900000, 8, 300002, 900000, 12, 100000, 500000, 2,
			200001, 5000000, 5, 900000, 5200000, 1, 2200000, 5200000, 11, 300000,
			900000, 8, 300002, 900000, 2, 200000, 5000000, 3, 400000, 5000000, 10,
			1500000, 3700000, 12, 400000, 500000, 9, 1400000, 3700000, 3, 1800000,
			5300000, 0, 1800000, 5300000, 10, 1500000, 4000000, 9, 1400000, 4100000,
			11, 600000, 900001, 8, 600000, 900003, 12, 100000, 600000, 2, 400004,
			5300000, 3, 2200000, 2900000, 0, 2500000, 2900000, 11, 700000, 900000, 8,
			700000, 900000, 12, 100005, 200000, 10, 1500000, 1600000, 9, 1400000,
			1600000, 3, 2200000, 2900000, 0, 2500000, 2900000, 11, 800000, 900000, 8,
			800000, 900000, 12, 100005, 200000, 10, 1500000, 1600000, 9, 1400000,
			1600000, 3, 1600000, 4800000, 0, 1800000, 4800000, 10, 1500000, 3500000,
			9, 1400000, 3500000, 12, 100000, 500000, 5, 1500000, 3400000, 1, 1500000,
			3400000, 3, 2900000, 3300000, 0, 2900000, 3300000, 10, 1600000, 2000000,
			9, 1600000, 2000000, 11, 600000, 900001, 8, 600000, 1200000, 12, 100000,
			200000, 5, 400000, 3400000, 1, 400000, 3400000, 3, 3100000, 3400000, 0,
			3100000, 3400000, 10, 1800000, 2100000, 9, 1800000, 2100000, 11, 700000,
			900001, 8, 700000, 900003, 2, 400004, 3700000, 4, 1200000, 7900000, 6,
			1000000, 1e9, 7, 1000000, 1e9, 3, 600000, 10600000, 0, 1800000, 10600000,
			4, 7900000, 10600000, 10, 1500000, 9200000, 9, 1400000, 7200000, 11,
			500001, 1700000, 8, 500000, 1700000, 12, 100000, 2000000, 2, 400004,
			10600000, 3, 1300000, 5500000, 0, 1800000, 5500000, 10, 1500000, 4200000,
			9, 1400000, 4200000, 11, 500001, 1700000, 8, 400002, 1700000, 12, 100000,
			600000, 2, 400004, 5500000, 5, 600000, 4300000, 1, 600000, 4300000, 4,
			1200000, 7900000, 11, 900000, 1e9, 8, 900000, 1e9, 3, 100000, 5800000, 0,
			1800000, 5800000, 10, 1500000, 4500000, 9, 1400000, 4300000, 11, 300000,
			1100000, 8, 100000, 1100000, 12, 100000, 700000, 2, 400004, 5800000, 3,
			600000, 1e9, 0, 1800000, 1e9, 4, 7900000, 1e9, 5, 6800000, 1e9, 1,
			6800000, 1e9, 10, 1500000, 1e9, 9, 1400000, 1e9, 11, 500000, 1e9, 8,
			400002, 1e9, 12, 100000, 1e9, 2, 400004, 1e9, 3, 800000, 6900000, 0,
			1800000, 6900000, 10, 1500000, 5600000, 9, 1400000, 4800000, 11, 500001,
			1200001, 8, 500000, 1200002, 12, 100000, 1000000, 2, 400004, 6900000, 3,
			200000, 6900000, 0, 1800000, 6900000, 10, 1500000, 5600000, 9, 1400000,
			4800000, 11, 300000, 1200001, 8, 300000, 1200002, 12, 100000, 1000000, 2,
			200000, 8700000, 3, 100000, 12000000, 0, 1800000, 12000000, 4, 7900000,
			12000000, 10, 1500000, 10600000, 9, 1400000, 8000000, 11, 300001, 1500004,
			8, 200000, 1500004, 12, 100000, 2500000, 2, 200000, 12000000, 3, 100000,
			1e9, 0, 1800000, 1e9, 4, 7900000, 1e9, 10, 1500000, 1e9, 9, 1400000, 1e9,
			11, 300001, 1700002, 8, 200000, 1700002, 12, 100000, 1e9, 2, 400004, 1e9,
			3, 100000, 12000000, 0, 1800000, 12000000, 4, 7900000, 12000000, 10,
			1500000, 10600000, 9, 1400000, 8000000, 11, 400000, 1500004, 8, 300002,
			1500004, 12, 100000, 2500000, 2, 200000, 12000000, 3, 100000, 12000000, 0,
			1800000, 12000000, 4, 7900000, 12000000, 10, 1500000, 1e9, 9, 1400000,
			8000000, 11, 400000, 1500004, 8, 300002, 1500004, 12, 100000, 2500000, 2,
			200000, 12000000, 3, 400000, 12000000, 0, 1800000, 12000000, 4, 7900000,
			12000000, 10, 1500000, 10600000, 9, 1400000, 8000000, 11, 400000, 1500004,
			8, 200000, 1500004, 12, 100000, 2500000, 2, 400004, 12000000, 10, 1000006,
			1500000, 9, 1100000, 1400000, 5, 100000, 300006, 5, 100000, 100005, 3,
			1200000, 3600000, 0, 1800000, 3600000, 10, 1500000, 2300000, 9, 1400000,
			2400000, 11, 400000, 900000, 8, 200000, 900000, 12, 100000, 300000, 2,
			300000, 400004, 3, 1700000, 13600000, 0, 1800000, 13600000, 4, 7900000,
			13600000, 10, 1500000, 12100000, 9, 1400000, 9000000, 11, 600000, 1500004,
			8, 600000, 1500004, 12, 100000, 2900000, 2, 400004, 13600000, 3, 100000,
			8400000, 0, 1800000, 8400000, 4, 7900000, 8400000, 10, 1500000, 7000000,
			9, 1400000, 6000000, 11, 700000, 1800002, 8, 700000, 1800002, 2, 400004,
			8400000, 11, 900000, 1100000, 8, 900000, 1100000, 11, 700001, 1000001, 8,
			800000, 1000003, 5, 400000, 9100000, 1, 400000, 9100000, 5, 1200000,
			4900000, 1, 1400000, 4900000, 4, 1200000, 7900000, 6, 1100000, 1e9, 7,
			1100000, 1e9, 5, 600000, 3600000, 1, 600000, 3600000, 11, 800000, 1200001,
			8, 800000, 1200002, 11, 700000, 1200001, 8, 700000, 1200002, 3, 2500000,
			9900000, 0, 2500000, 9900000, 4, 7900000, 9900000, 10, 1500000, 8500000,
			9, 1400000, 6800000, 12, 100005, 1800000, 2, 400004, 9900000, 3, 1200000,
			4800000, 0, 1800000, 4800000, 10, 1500000, 3500000, 9, 1400000, 3500000,
			11, 500001, 1400000, 8, 500000, 1400000, 12, 100000, 500000, 2, 400004,
			4800000, 10, 900000, 1100000, 9, 1000000, 1200001, 4, 1200000, 7900000, 8,
			100000, 1e9, 1, 1400000, 1e9, 5, 1400000, 1e9, 7, 1000000, 1200000, 4,
			1200000, 1900000, 11, 900000, 1200001, 8, 900000, 1200002, 3, 100000,
			3600000, 0, 1800000, 3600000, 10, 1500000, 2300000, 9, 1400000, 2400000,
			11, 300001, 900000, 8, 300002, 900000, 12, 100000, 300000, 2, 200000,
			400004, 5, 300005, 1600000, 1, 400000, 1600000, 6, 900000, 1000000, 7,
			900000, 1000000, 3, 100000, 3600000, 0, 1800000, 3600000, 10, 1500000,
			2300000, 9, 1400000, 2400000, 11, 200000, 900000, 8, 100000, 900000, 12,
			100000, 300000, 2, 400004, 3700000, 3, 100000, 2600000, 0, 1800000,
			2600000, 11, 300001, 900000, 8, 200000, 900000, 12, 100000, 100005, 2,
			200000, 400004, 5, 400000, 1600000, 1, 400000, 1600000, 10, 1000001,
			1200001, 9, 1000001, 1200001, 3, 100000, 2600000, 0, 1800000, 2600000, 11,
			400000, 900000, 8, 200000, 900000, 12, 100000, 100005, 2, 200000, 400004,
			10, 1100006, 1200001, 9, 1200000, 1200001, 10, 1000000, 1200001, 9,
			1000001, 1200001, 3, 100000, 2600000, 0, 1800000, 2600000, 11, 300001,
			900000, 8, 200000, 900000, 12, 100000, 100005, 3, 100000, 1e9, 0, 1800000,
			1e9, 4, 1200000, 1e9, 10, 1500000, 1e9, 9, 1400000, 1e9, 11, 300000, 1e9,
			8, 500000, 1e9, 12, 100000, 1e9, 2, 3700000, 1e9, 5, 100000, 13200000, 1,
			400000, 13200000, 3, 100000, 5400000, 0, 1800000, 5400000, 4, 1200000,
			7900000, 10, 1500000, 4100000, 9, 1400000, 4100000, 11, 300000, 1e9, 8,
			300000, 1e9, 12, 100000, 600000, 2, 400004, 5400000, 5, 100000, 6900000,
			1, 400000, 7900000, 3, 800000, 4800000, 0, 1800000, 4800000, 10, 1500000,
			3500000, 9, 1400000, 3500000, 11, 500001, 1000001, 8, 500000, 1000003, 12,
			100000, 500000, 2, 300000, 4800000, 3, 100000, 6500000, 0, 1800000,
			6500000, 10, 1500000, 5200000, 9, 1400000, 4700000, 11, 300000, 900000, 8,
			100000, 900000, 12, 100000, 900000, 2, 400004, 6500000, 5, 100000,
			5000000, 1, 400000, 5000000, 3, 100000, 11000000, 0, 1800000, 11000000, 4,
			7900000, 11000000, 10, 1500000, 9600000, 9, 1400000, 7400000, 11, 300000,
			1500000, 8, 100000, 1500000, 12, 100000, 2100000, 2, 400004, 11000000, 3,
			3200000, 3700000, 0, 3200000, 3700000, 10, 1900000, 2400000, 9, 1900000,
			2400000, 12, 200000, 300000, 2, 400004, 3700000, 5, 1700000, 4900000, 1,
			1700000, 4900000, 3, 100000, 8900000, 0, 1800000, 8900000, 4, 7900000,
			8900000, 10, 1500000, 7500000, 9, 1400000, 6300000, 11, 300000, 1400001,
			8, 100000, 1400005, 12, 100000, 1500000, 2, 400004, 8900000, 5, 400000,
			8500000, 1, 400000, 8500000, 3, 1500000, 7100000, 0, 1800000, 7100000, 10,
			1500000, 5800000, 9, 1400000, 5000000, 11, 600000, 1600004, 8, 1200000,
			1600004, 12, 100000, 1000000, 2, 3700000, 7100000, 5, 900000, 6400000, 1,
			900000, 6400000, 6, 1100000, 1e9, 7, 1100000, 1e9, 3, 1200000, 8800000, 0,
			1800000, 8800000, 4, 7900000, 8800000, 10, 1500000, 7400000, 9, 1400000,
			6300000, 11, 500000, 1400000, 8, 500000, 1400000, 12, 100000, 1500000, 2,
			400004, 8800000, 5, 400000, 7800000, 1, 400000, 7900000, 3, 600000,
			5700000, 0, 1800000, 5700000, 4, 1200000, 7900000, 10, 1500000, 4400000,
			9, 1400000, 4300000, 11, 500000, 1000001, 8, 400002, 1000003, 12, 100000,
			700000, 2, 200000, 5700000, 5, 1900000, 5100000, 1, 1900000, 5100000, 5,
			100005, 7800000, 1, 400000, 7900000, 5, 100000, 6200000, 1, 400000,
			6200000, 5, 400000, 8800000, 1, 400000, 8800000, 5, 100005, 1e9, 1,
			400000, 1e9, 3, 100000, 4300000, 0, 1800000, 4300000, 10, 1500000,
			3000000, 9, 1400000, 3000000, 11, 400000, 900000, 8, 400000, 900000, 12,
			100000, 400000, 2, 400004, 4300000, 5, 300000, 9400000, 1, 400000,
			9400000, 11, 700000, 1100000, 8, 700000, 1100000, 3, 2200000, 4600000, 0,
			2500000, 4600000, 12, 100005, 500000, 2, 400004, 4600000, 10, 1500000,
			3300000, 9, 1400000, 3300000, 5, 300000, 6600000, 1, 400000, 6600000, 11,
			900000, 1100000, 8, 900000, 1100000, 3, 2200000, 4600000, 0, 2500000,
			4600000, 10, 1500000, 3300000, 9, 1400000, 3300000, 12, 100005, 500000, 2,
			400004, 4600000, 11, 900000, 1100000, 8, 900000, 1100000, 3, 2500000,
			4600000, 0, 2500000, 4600000, 10, 1500000, 3300000, 9, 1400000, 3300000,
			12, 100005, 500000, 2, 400004, 4600000, 3, 100000, 6800000, 0, 1800000,
			6800000, 10, 1500000, 5500000, 9, 1400000, 4800000, 11, 400000, 1100000,
			12, 100000, 1000000, 2, 400004, 6800000, 5, 100005, 2700000, 3, 100000,
			6800000, 0, 1800000, 6800000, 10, 1500000, 5500000, 9, 1400000, 4800000,
			12, 100000, 1000000, 2, 400004, 6800000, 3, 100000, 3700000, 0, 1800000,
			3700000, 10, 1500000, 2300000, 9, 1400000, 2400000, 11, 300000, 900000,
			12, 100000, 300000, 2, 400004, 3700000, 5, 100000, 2400000, 6, 800000,
			1100000, 7, 800000, 1100000, 5, 2200000, 9400000, 1, 2200000, 9400000, 5,
			2200000, 6600000, 1, 2200000, 6600000, 3, 1300000, 14800000, 0, 1800000,
			14800000, 4, 7900000, 14800000, 10, 1500000, 13200000, 9, 1400000,
			9900000, 11, 600000, 700000, 8, 600000, 700000, 12, 100000, 1e9, 2,
			400004, 14800000, 5, 300006, 6500000, 1, 400000, 6500000, 3, 2500000,
			4600000, 0, 2500000, 4600000, 11, 700000, 1100000, 8, 700000, 1100000, 12,
			100005, 500000, 2, 400004, 4600000, 11, 700000, 1100000, 8, 700000,
			1100000, 3, 2200000, 4600000, 0, 2500000, 4600000, 12, 100005, 500000, 2,
			400004, 4600000, 11, 700000, 1100000, 8, 700000, 1100000, 3, 2500000,
			4600000, 0, 2500000, 4600000, 12, 100005, 500000, 2, 400004, 4600000, 5,
			100005, 8100000, 1, 400000, 8100000, 11, 700000, 1300000, 8, 700000,
			1300000, 3, 1600000, 1e9, 0, 1800000, 1e9, 4, 7900000, 1e9, 10, 1500000,
			1e9, 9, 1400000, 1e9, 12, 100000, 1e9, 3, 1600000, 4800000, 10, 1500000,
			3500000, 11, 600000, 1100000, 8, 600000, 1100000, 5, 1000000, 5000000, 1,
			1000000, 5000000, 5, 1700000, 5000000, 1, 1700000, 5000000, 11, 700000,
			1100000, 8, 700000, 1100000, 3, 1600000, 4800000, 10, 1500000, 3500000,
			11, 600000, 1100000, 8, 600000, 1100000, 3, 1600000, 4800000, 10, 1500000,
			3500000, 5, 100000, 300000
		])
);

// Where each window list begins; the entry after it is where it ends.
const PREFIX_WINDOW_STARTS = new Uint16Array([
	0, 21, 27, 39, 42, 63, 69, 93, 99, 105, 129, 153, 177, 201, 228, 234, 243,
	267, 273, 276, 282, 291, 294, 297, 321, 330, 342, 348, 354, 360, 372, 399,
	423, 432, 435, 447, 453, 477, 501, 507, 513, 519, 540, 543, 567, 573, 597,
	603, 624, 648, 669, 690, 705, 711, 732, 738, 759, 768, 795, 819, 825, 828,
	834, 858, 891, 915, 939, 966, 993, 1020, 1047, 1074, 1080, 1083, 1086, 1110,
	1137, 1161, 1167, 1173, 1179, 1185, 1194, 1200, 1206, 1212, 1233, 1257, 1263,
	1269, 1275, 1281, 1287, 1311, 1317, 1323, 1347, 1365, 1371, 1377, 1395, 1401,
	1407, 1422, 1449, 1455, 1482, 1488, 1512, 1536, 1542, 1569, 1587, 1593, 1620,
	1626, 1650, 1656, 1662, 1689, 1695, 1722, 1728, 1734, 1740, 1746, 1752, 1776,
	1782, 1806, 1812, 1836, 1860, 1881, 1884, 1902, 1923, 1926, 1932, 1938, 1944,
	1971, 1977, 1995, 2013, 2031, 2037, 2043, 2061, 2073, 2079, 2085, 2097, 2109,
	2112
]);

/** @type {() => Map<string, [string, number][]>} */
const getPrefixedProperties = memoize(
	() =>
		new Map([
			[
				"align-content",
				[
					["-webkit-align-content", 0],
					["-ms-flex-line-pack", 1]
				]
			],
			[
				"align-items",
				[
					["-webkit-align-items", 0],
					["-ms-flex-align", 1],
					["-webkit-box-align", 2],
					["-moz-box-align", 3]
				]
			],
			[
				"align-self",
				[
					["-webkit-align-self", 4],
					["-ms-flex-item-align", 1]
				]
			],
			["alt", [["-webkit-alt", 5]]],
			[
				"animation",
				[
					["-webkit-animation", 6],
					["-moz-animation", 7],
					["-o-animation", 8]
				]
			],
			[
				"animation-delay",
				[
					["-webkit-animation-delay", 9],
					["-moz-animation-delay", 7],
					["-o-animation-delay", 8]
				]
			],
			[
				"animation-direction",
				[
					["-webkit-animation-direction", 9],
					["-moz-animation-direction", 7],
					["-o-animation-direction", 8]
				]
			],
			[
				"animation-duration",
				[
					["-webkit-animation-duration", 10],
					["-moz-animation-duration", 7],
					["-o-animation-duration", 8]
				]
			],
			[
				"animation-fill-mode",
				[
					["-webkit-animation-fill-mode", 11],
					["-moz-animation-fill-mode", 7],
					["-o-animation-fill-mode", 8]
				]
			],
			[
				"animation-iteration-count",
				[
					["-webkit-animation-iteration-count", 9],
					["-moz-animation-iteration-count", 7],
					["-o-animation-iteration-count", 8]
				]
			],
			[
				"animation-name",
				[
					["-webkit-animation-name", 9],
					["-moz-animation-name", 7],
					["-o-animation-name", 8]
				]
			],
			[
				"animation-play-state",
				[
					["-webkit-animation-play-state", 12],
					["-moz-animation-play-state", 7],
					["-o-animation-play-state", 8]
				]
			],
			[
				"animation-timing-function",
				[
					["-webkit-animation-timing-function", 9],
					["-moz-animation-timing-function", 7],
					["-o-animation-timing-function", 8]
				]
			],
			[
				"appearance",
				[
					["-webkit-appearance", 13],
					["-moz-appearance", 14]
				]
			],
			["backdrop-filter", [["-webkit-backdrop-filter", 15]]],
			[
				"backface-visibility",
				[
					["-webkit-backface-visibility", 16],
					["-moz-backface-visibility", 17]
				]
			],
			[
				"background-clip",
				[
					["-moz-background-clip", 18],
					["-webkit-background-clip", 19]
				]
			],
			["background-origin", [["-moz-background-origin", 18]]],
			[
				"background-size",
				[
					["-webkit-background-size", 20],
					["-moz-background-size", 21],
					["-o-background-size", 22]
				]
			],
			["block-size", [["-webkit-logical-height", 23]]],
			[
				"border-bottom-left-radius",
				[
					["-webkit-border-bottom-left-radius", 24],
					["-moz-border-radius-bottomleft", 18]
				]
			],
			[
				"border-bottom-right-radius",
				[
					["-webkit-border-bottom-right-radius", 24],
					["-moz-border-radius-bottomright", 18]
				]
			],
			[
				"border-image",
				[
					["-webkit-border-image", 25],
					["-moz-border-image", 26],
					["-o-border-image", 27]
				]
			],
			["border-inline-end-color", [["-moz-border-end-color", 28]]],
			["border-inline-end-style", [["-moz-border-end-style", 28]]],
			["border-inline-end-width", [["-moz-border-end-width", 28]]],
			["border-inline-start-color", [["-moz-border-start-color", 28]]],
			["border-inline-start-style", [["-moz-border-start-style", 28]]],
			[
				"border-radius",
				[
					["-webkit-border-radius", 29],
					["-moz-border-radius", 18]
				]
			],
			[
				"border-top-left-radius",
				[
					["-webkit-border-top-left-radius", 24],
					["-moz-border-radius-topleft", 18]
				]
			],
			[
				"border-top-right-radius",
				[
					["-webkit-border-top-right-radius", 24],
					["-moz-border-radius-topright", 18]
				]
			],
			["box-decoration-break", [["-webkit-box-decoration-break", 30]]],
			["box-flex-group", [["-webkit-box-flex-group", 31]]],
			["box-lines", [["-webkit-box-lines", 31]]],
			[
				"box-shadow",
				[
					["-webkit-box-shadow", 32],
					["-moz-box-shadow", 33]
				]
			],
			[
				"box-sizing",
				[
					["-webkit-box-sizing", 34],
					["-moz-box-sizing", 35]
				]
			],
			["clip-path", [["-webkit-clip-path", 36]]],
			[
				"column-count",
				[
					["-webkit-column-count", 37],
					["-moz-column-count", 38]
				]
			],
			[
				"column-fill",
				[
					["-moz-column-fill", 39],
					["-webkit-column-fill", 40]
				]
			],
			[
				"column-gap",
				[
					["-webkit-column-gap", 41],
					["-moz-column-gap", 42]
				]
			],
			[
				"column-rule",
				[
					["-webkit-column-rule", 43],
					["-moz-column-rule", 44]
				]
			],
			[
				"column-rule-color",
				[
					["-webkit-column-rule-color", 43],
					["-moz-column-rule-color", 44]
				]
			],
			[
				"column-rule-style",
				[
					["-webkit-column-rule-style", 43],
					["-moz-column-rule-style", 44]
				]
			],
			[
				"column-rule-width",
				[
					["-webkit-column-rule-width", 43],
					["-moz-column-rule-width", 44]
				]
			],
			["column-span", [["-webkit-column-span", 45]]],
			[
				"column-width",
				[
					["-webkit-column-width", 43],
					["-moz-column-width", 38]
				]
			],
			[
				"columns",
				[
					["-moz-columns", 46],
					["-webkit-columns", 47]
				]
			],
			["filter", [["-webkit-filter", 48]]],
			[
				"flex",
				[
					["-webkit-flex", 4],
					["-ms-flex", 1],
					["-webkit-box-flex", 2],
					["-moz-box-flex", 3]
				]
			],
			[
				"flex-basis",
				[
					["-webkit-flex-basis", 49],
					["-ms-flex-preferred-size", 1]
				]
			],
			[
				"flex-direction",
				[
					["-webkit-flex-direction", 4],
					["-ms-flex-direction", 1],
					["-webkit-box-orient", 2],
					["-webkit-box-direction", 2],
					["-moz-box-orient", 3],
					["-moz-box-direction", 3]
				]
			],
			[
				"flex-flow",
				[
					["-webkit-flex-flow", 4],
					["-ms-flex-flow", 1]
				]
			],
			[
				"flex-grow",
				[
					["-webkit-flex-grow", 49],
					["-ms-flex-positive", 1]
				]
			],
			[
				"flex-shrink",
				[
					["-webkit-flex-shrink", 50],
					["-ms-flex-negative", 1]
				]
			],
			[
				"flex-wrap",
				[
					["-webkit-flex-wrap", 0],
					["-ms-flex-wrap", 1]
				]
			],
			[
				"font-feature-settings",
				[
					["-webkit-font-feature-settings", 51],
					["-moz-font-feature-settings", 52]
				]
			],
			["font-kerning", [["-webkit-font-kerning", 53]]],
			["font-language-override", [["-moz-font-language-override", 54]]],
			["font-variant-ligatures", [["-webkit-font-variant-ligatures", 55]]],
			["forced-color-adjust", [["-ms-high-contrast-adjust", 56]]],
			["hyphenate-character", [["-webkit-hyphenate-character", 57]]],
			[
				"hyphens",
				[
					["-webkit-hyphens", 58],
					["-ms-hyphens", 56],
					["-moz-hyphens", 59]
				]
			],
			["ime-mode", [["-ms-ime-mode", 60]]],
			["initial-letter", [["-webkit-initial-letter", 61]]],
			["inline-size", [["-webkit-logical-width", 23]]],
			[
				"justify-content",
				[
					["-webkit-justify-content", 4],
					["-ms-flex-pack", 1],
					["-webkit-box-pack", 2],
					["-moz-box-pack", 3]
				]
			],
			["line-break", [["-webkit-line-break", 62]]],
			["line-clamp", [["-webkit-line-clamp", 63]]],
			["margin-block-end", [["-webkit-margin-after", 64]]],
			["margin-block-start", [["-webkit-margin-before", 64]]],
			[
				"margin-inline-end",
				[
					["-webkit-margin-end", 65],
					["-moz-margin-end", 28]
				]
			],
			[
				"margin-inline-start",
				[
					["-webkit-margin-start", 65],
					["-moz-margin-start", 28]
				]
			],
			["mask", [["-webkit-mask", 66]]],
			["mask-border", [["-webkit-mask-box-image", 67]]],
			["mask-border-outset", [["-webkit-mask-box-image-outset", 67]]],
			["mask-border-repeat", [["-webkit-mask-box-image-repeat", 67]]],
			["mask-border-slice", [["-webkit-mask-box-image-slice", 67]]],
			["mask-border-source", [["-webkit-mask-box-image-source", 67]]],
			["mask-border-width", [["-webkit-mask-box-image-width", 67]]],
			["mask-clip", [["-webkit-mask-clip", 68]]],
			["mask-image", [["-webkit-mask-image", 69]]],
			["mask-origin", [["-webkit-mask-origin", 68]]],
			["mask-position", [["-webkit-mask-position", 66]]],
			["mask-repeat", [["-webkit-mask-repeat", 66]]],
			["mask-size", [["-webkit-mask-size", 70]]],
			["max-block-size", [["-webkit-max-logical-height", 23]]],
			["max-inline-size", [["-webkit-max-logical-width", 23]]],
			["min-block-size", [["-webkit-min-logical-height", 23]]],
			["min-inline-size", [["-webkit-min-logical-width", 23]]],
			["object-fit", [["-o-object-fit", 71]]],
			["object-position", [["-o-object-position", 71]]],
			[
				"order",
				[
					["-webkit-order", 4],
					["-ms-flex-order", 1],
					["-webkit-box-ordinal-group", 2],
					["-moz-box-ordinal-group", 3]
				]
			],
			["outline", [["-moz-outline", 72]]],
			["outline-color", [["-moz-outline-color", 73]]],
			["outline-style", [["-moz-outline-style", 73]]],
			["outline-width", [["-moz-outline-width", 73]]],
			[
				"padding-inline-end",
				[
					["-webkit-padding-end", 65],
					["-moz-padding-end", 28]
				]
			],
			[
				"padding-inline-start",
				[
					["-webkit-padding-start", 65],
					["-moz-padding-start", 28]
				]
			],
			[
				"perspective",
				[
					["-webkit-perspective", 74],
					["-moz-perspective", 17]
				]
			],
			[
				"perspective-origin",
				[
					["-webkit-perspective-origin", 74],
					["-moz-perspective-origin", 17]
				]
			],
			["print-color-adjust", [["-webkit-print-color-adjust", 75]]],
			["ruby-position", [["-webkit-ruby-position", 76]]],
			[
				"scroll-snap-type",
				[
					["-ms-scroll-snap-type", 56],
					["-webkit-scroll-snap-type", 77]
				]
			],
			["shape-image-threshold", [["-webkit-shape-image-threshold", 78]]],
			["shape-margin", [["-webkit-shape-margin", 78]]],
			["shape-outside", [["-webkit-shape-outside", 78]]],
			[
				"tab-size",
				[
					["-moz-tab-size", 79],
					["-o-tab-size", 27]
				]
			],
			["text-align-last", [["-moz-text-align-last", 80]]],
			["text-combine-upright", [["-ms-text-combine-horizontal", 81]]],
			[
				"text-decoration-color",
				[
					["-moz-text-decoration-color", 82],
					["-webkit-text-decoration-color", 83]
				]
			],
			[
				"text-decoration-line",
				[
					["-moz-text-decoration-line", 82],
					["-webkit-text-decoration-line", 83]
				]
			],
			["text-decoration-skip", [["-webkit-text-decoration-skip", 84]]],
			[
				"text-decoration-style",
				[
					["-moz-text-decoration-style", 82],
					["-webkit-text-decoration-style", 83]
				]
			],
			["text-emphasis", [["-webkit-text-emphasis", 85]]],
			["text-emphasis-color", [["-webkit-text-emphasis-color", 85]]],
			["text-emphasis-position", [["-webkit-text-emphasis-position", 85]]],
			["text-emphasis-style", [["-webkit-text-emphasis-style", 85]]],
			["text-orientation", [["-webkit-text-orientation", 86]]],
			["text-overflow", [["-o-text-overflow", 87]]],
			[
				"text-size-adjust",
				[
					["-webkit-text-size-adjust", 88],
					["-moz-text-size-adjust", 89],
					["-ms-text-size-adjust", 90]
				]
			],
			["text-underline-position", [["-webkit-text-underline-position", 91]]],
			["touch-action", [["-ms-touch-action", 1]]],
			[
				"transform",
				[
					["-webkit-transform", 92],
					["-moz-transform", 93],
					["-ms-transform", 94],
					["-o-transform", 27]
				]
			],
			[
				"transform-origin",
				[
					["-webkit-transform-origin", 95],
					["-moz-transform-origin", 93],
					["-ms-transform-origin", 94],
					["-o-transform-origin", 27]
				]
			],
			[
				"transform-style",
				[
					["-webkit-transform-style", 74],
					["-moz-transform-style", 17]
				]
			],
			[
				"transition",
				[
					["-webkit-transition", 96],
					["-moz-transition", 97],
					["-o-transition", 98]
				]
			],
			[
				"transition-delay",
				[
					["-webkit-transition-delay", 99],
					["-moz-transition-delay", 97],
					["-o-transition-delay", 100]
				]
			],
			[
				"transition-duration",
				[
					["-webkit-transition-duration", 96],
					["-moz-transition-duration", 97],
					["-o-transition-duration", 101]
				]
			],
			[
				"transition-property",
				[
					["-webkit-transition-property", 102],
					["-moz-transition-property", 97],
					["-o-transition-property", 100]
				]
			],
			[
				"transition-timing-function",
				[
					["-webkit-transition-timing-function", 102],
					["-moz-transition-timing-function", 97],
					["-o-transition-timing-function", 100]
				]
			],
			[
				"user-modify",
				[
					["-webkit-user-modify", 103],
					["-moz-user-modify", 104]
				]
			],
			[
				"user-select",
				[
					["-webkit-user-select", 105],
					["-ms-user-select", 56],
					["-moz-user-select", 106]
				]
			],
			["writing-mode", [["-webkit-writing-mode", 107]]]
		])
);

/** @type {Map<string, [string, number][]>} */
const PREFIXED_SELECTORS = new Map([
	[
		"any-link",
		[
			["-webkit-any-link", 108],
			["-moz-any-link", 109]
		]
	],
	["autofill", [["-webkit-autofill", 110]]],
	[
		"backdrop",
		[
			["-webkit-backdrop", 111],
			["-ms-backdrop", 81]
		]
	],
	["dir", [["-moz-dir", 112]]],
	[
		"file-selector-button",
		[
			["-webkit-file-upload-button", 113],
			["-ms-browse", 56]
		]
	],
	["focus-visible", [["-moz-focusring", 114]]],
	[
		"fullscreen",
		[
			["-webkit-full-screen", 115],
			["-moz-full-screen", 116],
			["-ms-fullscreen", 117]
		]
	],
	[
		"is",
		[
			["-webkit-any", 118],
			["-moz-any", 119]
		]
	],
	[
		"placeholder",
		[
			["-webkit-input-placeholder", 120],
			["-ms-input-placeholder", 60],
			["-moz-placeholder", 121]
		]
	],
	["read-only", [["-moz-read-only", 122]]],
	["read-write", [["-moz-read-write", 122]]],
	["selection", [["-moz-selection", 123]]],
	["user-invalid", [["-moz-ui-invalid", 124]]],
	["user-valid", [["-moz-ui-valid", 124]]]
]);

/** @type {Map<string, [string, number][]>} */
const PREFIXED_AT_RULES = new Map([
	["document", [["-moz-document", 125]]],
	[
		"keyframes",
		[
			["-webkit-keyframes", 126],
			["-moz-keyframes", 7],
			["-o-keyframes", 8]
		]
	]
]);

// WHY: The version a browser that never shipped a construct is given below, and
// the one a spelling still prefixed today is unprefixed at. Finite, a plain
// number and below 2**31, so both version tables are `Uint32Array`s of small
// integers; far past any real version, and past the one Safari TP is read as.
const NEVER = 1e9;

// The browsers every support profile below covers, in the order it states them.
// A selection has an ability when every browser in it is named here and at or
// past the version its profile row gives.
/** @type {string[]} */
const SUPPORT_BROWSERS = [
	"and_chr",
	"and_ff",
	"android",
	"chrome",
	"edge",
	"firefox",
	"ie",
	"ie_mob",
	"ios_saf",
	"op_mob",
	"opera",
	"safari",
	"samsung"
];

// The vendor prefix each browserslist name no profile covers reads, by its
// engine, and null for one reading no CSS. A name missing here reads them all.
/** @type {Map<string, string | null>} */
const UNSTATED_BROWSER_PREFIXES = new Map([
	["and_qq", "-webkit-"],
	["and_uc", "-webkit-"],
	["baidu", "-webkit-"],
	["bb", "-webkit-"],
	["kaios", "-moz-"],
	["node", null],
	["op_mini", "-o-"]
]);

// The versions themselves, rows of `SUPPORT_BROWSERS.length` laid end to end,
// one row per distinct profile: a construct names the row it reads rather than
// carrying its own copy of it. `NEVER` is a browser that never shipped it.
const getSupportProfiles = memoize(
	() =>
		new Uint32Array([
			6200000, 4900000, 6200000, 6200000, 7900000, 4900000, 1e9, 1e9, 900003,
			4700000, 4900000, 1000000, 800000, 7200000, 8300000, 7200000, 7200000,
			7900000, 8300000, 1e9, 1e9, 1200002, 5100000, 6000000, 1200001, 1100000,
			11500000, 7900000, 11500000, 11500000, 11500000, 7000000, 1e9, 1e9,
			1500000, 7700000, 10100000, 1500000, 2300000, 5600000, 9200000, 5600000,
			5600000, 7900000, 9200000, 1e9, 1e9, 1100000, 4300000, 4300000, 1100000,
			600000, 8800000, 7900000, 8800000, 8800000, 8800000, 7800000, 1e9, 1e9,
			1400000, 6300000, 7400000, 1400000, 1500000, 1e9, 11400000, 1e9, 1e9, 1e9,
			11400000, 1e9, 1e9, 900000, 1e9, 1e9, 900000, 1e9, 8800000, 8400000,
			8800000, 8800000, 8800000, 8400000, 1e9, 1e9, 900000, 1e9, 7400000,
			900000, 1500000, 12000000, 4900000, 12000000, 12000000, 12000000, 4900000,
			1e9, 1e9, 1600004, 8000000, 10600000, 1600004, 2500000, 1e9, 1e9, 1e9,
			1e9, 1e9, 1e9, 1e9, 1e9, 1e9, 1e9, 1e9, 1e9, 1e9, 12000000, 11700000,
			12000000, 12000000, 12000000, 11700000, 1e9, 1e9, 1700002, 8000000,
			10600000, 1700002, 2500000, 5700000, 600000, 5700000, 5700000, 7900000,
			600000, 1e9, 1e9, 2600002, 4300000, 4400000, 2600002, 700000, 8700000,
			7900000, 8700000, 8700000, 8700000, 7000000, 1e9, 1e9, 2600002, 6200000,
			7300000, 2600002, 1400000, 11100000, 11300000, 11100000, 11100000,
			11100000, 11300000, 1e9, 1e9, 1500000, 7500000, 9700000, 1500000, 2200000,
			11100000, 11300000, 11100000, 11100000, 11100000, 11300000, 1e9, 1e9,
			1600002, 7500000, 9700000, 1600002, 2200000, 10100000, 9600000, 10100000,
			10100000, 10100000, 9600000, 1e9, 1e9, 1500000, 7000000, 8700000, 1500000,
			1900000, 12300000, 12000000, 12300000, 12300000, 12300000, 12000000, 1e9,
			1e9, 1700005, 8200000, 10900000, 1700005, 2700000, 11100000, 11300000,
			11100000, 11100000, 11100000, 11300000, 1e9, 1e9, 1500004, 7500000,
			9700000, 1500004, 2200000, 8700000, 6600000, 8700000, 8700000, 8700000,
			6600000, 1e9, 1e9, 1400005, 6200000, 7300000, 1400001, 1400000, 10400000,
			10200000, 10400000, 10400000, 10400000, 10200000, 1e9, 1e9, 1600004,
			7100000, 9000000, 1600004, 2000000, 6800000, 6100000, 6800000, 6800000,
			7900000, 6100000, 1e9, 1e9, 1300004, 4800000, 5500000, 1300001, 1000000,
			5900000, 4500000, 5900000, 5900000, 7900000, 4500000, 1e9, 1e9, 1100000,
			4300000, 4600000, 1100000, 700000, 1800000, 400000, 400004, 100000,
			1200000, 100005, 900000, 900000, 300002, 1000001, 700000, 400000, 100000,
			3700000, 4700000, 3700000, 3700000, 7900000, 4700000, 1e9, 1e9, 1500004,
			2400000, 2400000, 1500004, 300000, 1800000, 400000, 400004, 100000,
			1200000, 100005, 900000, 900000, 300000, 1000001, 700000, 400000, 100000,
			13300000, 1e9, 13300000, 13300000, 13300000, 1e9, 1e9, 1e9, 2700000,
			8800000, 11800000, 2700000, 2900000, 2600000, 5500000, 400004, 2600000,
			7900000, 5500000, 1e9, 1e9, 700000, 1400000, 1500000, 700000, 100005,
			13100000, 14300000, 13100000, 13100000, 13100000, 14300000, 1e9, 1e9,
			1800004, 8700000, 11600000, 1800004, 2900000, 8900000, 8200000, 8900000,
			8900000, 8900000, 8200000, 1e9, 1e9, 1400005, 6300000, 7500000, 1400001,
			1500000, 1800000, 400000, 3700000, 100000, 1200000, 100000, 900000,
			900000, 100000, 1000001, 700000, 100000, 100000, 1800000, 400000, 400004,
			100000, 1200000, 100000, 900000, 900000, 100000, 1000001, 700000, 100000,
			100000, 12100000, 1e9, 12100000, 12100000, 12100000, 1e9, 1e9, 1e9,
			1700004, 8100000, 10700000, 1700004, 2500000, 10500000, 14900000,
			10500000, 10500000, 10500000, 14900000, 1e9, 1e9, 1700002, 7200000,
			9100000, 1700002, 2000000, 8600000, 6800000, 8600000, 8600000, 8600000,
			6800000, 1e9, 1e9, 1100003, 6100000, 7200000, 1100001, 1400000, 7300000,
			7900000, 7300000, 7300000, 7900000, 7200000, 1e9, 1e9, 1300004, 5200000,
			6000000, 1300001, 1100000, 13500000, 1e9, 13500000, 13500000, 13500000,
			1e9, 1e9, 1e9, 2700000, 8900000, 12000000, 2700000, 2900000, 5700000,
			5100000, 5700000, 5700000, 7900000, 5100000, 1e9, 1e9, 1000003, 4300000,
			4400000, 1000001, 700000, 1800000, 6200000, 3700000, 100000, 1200000,
			6200000, 900000, 900000, 1e9, 1400000, 900005, 100001, 100000, 5000000,
			6300000, 5000000, 5000000, 7900000, 6300000, 1e9, 1e9, 1000000, 3700000,
			3700000, 1000000, 500000, 8900000, 13100000, 8900000, 8900000, 8900000,
			13100000, 1e9, 1e9, 1800002, 6300000, 7500000, 1800002, 1500000, 10900000,
			14400000, 10900000, 10900000, 10900000, 14400000, 1e9, 1e9, 1800000,
			7400000, 9500000, 1800000, 2100000, 1800000, 400000, 400004, 100000,
			1200000, 100000, 400000, 400000, 100000, 1000001, 500000, 100000, 100000,
			12500000, 14400000, 12500000, 12500000, 12500000, 14400000, 1e9, 1e9,
			1800000, 8300000, 11100000, 1800000, 2700000, 12500000, 14700000,
			12500000, 12500000, 12500000, 14700000, 1e9, 1e9, 1800002, 8300000,
			11100000, 1800002, 2700000, 6500000, 5000000, 6500000, 6500000, 7900000,
			5000000, 1e9, 1e9, 900000, 4700000, 5200000, 900000, 900000, 11000000,
			8600000, 11000000, 11000000, 11000000, 8600000, 1e9, 1e9, 1500000,
			7400000, 9600000, 1500000, 2100000, 1e9, 15000000, 1e9, 1e9, 1e9,
			15000000, 1e9, 1e9, 1500004, 1e9, 1e9, 1500004, 1e9, 1800000, 400000,
			200000, 100000, 1200000, 100000, 900000, 900000, 200000, 1000001, 900000,
			300001, 100000, 1800000, 400000, 3700000, 1000000, 7900000, 400000, 1e9,
			1e9, 500000, 1000001, 1000000, 500000, 100000, 5400000, 6300000, 5400000,
			5400000, 7900000, 6300000, 1e9, 1e9, 1000000, 4100000, 4100000, 1000000,
			600000, 1800000, 400000, 200000, 100000, 1200000, 100000, 900000, 900000,
			200000, 1000001, 900005, 300001, 100000, 1800000, 400000, 400004, 400000,
			1200000, 300000, 700000, 700000, 400000, 1000001, 900005, 300001, 100000,
			1800000, 400000, 200000, 100000, 1200000, 300005, 900000, 900000, 200000,
			1000001, 900005, 300001, 100000, 1800000, 400000, 400004, 100000, 1200000,
			100000, 800000, 800000, 100000, 1000001, 700000, 100000, 100000, 8600000,
			8500000, 8600000, 8600000, 8600000, 8500000, 1e9, 1e9, 1500004, 6100000,
			7200000, 1500004, 1400000, 6000000, 5200000, 6000000, 6000000, 7900000,
			5200000, 1e9, 1e9, 1000003, 4400000, 4700000, 1000001, 800000, 7100000,
			6400000, 7100000, 7100000, 1200000, 6400000, 1e9, 1e9, 1600004, 5000000,
			5800000, 1600004, 1000000, 2500000, 1e9, 400004, 2300000, 7900000, 1e9,
			1e9, 1e9, 700000, 1400000, 1500000, 700000, 100005, 10500000, 12100000,
			10500000, 10500000, 10500000, 12100000, 1e9, 1e9, 1500004, 7200000,
			9100000, 1500004, 2000000, 1e9, 13600000, 1e9, 1e9, 1e9, 13600000, 1e9,
			1e9, 1e9, 1e9, 1e9, 1e9, 1e9, 5400000, 1e9, 5400000, 5400000, 7900000,
			1e9, 1e9, 1e9, 1e9, 4100000, 4100000, 1e9, 600000, 1800000, 400000,
			400004, 100000, 1200000, 100000, 400000, 400000, 100000, 1000001, 400000,
			200000, 100000, 1800000, 1600000, 200002, 1000000, 1300000, 2900000, 1e9,
			1e9, 500000, 1100000, 1100000, 500001, 100000, 1800000, 400000, 400004,
			100000, 1200000, 200000, 1000000, 1000000, 100000, 1000001, 900000,
			300000, 100000, 1800000, 400000, 3700000, 1000000, 1200000, 400000,
			1000000, 1000000, 500000, 1000001, 1000000, 500000, 100000, 1800000,
			400000, 400004, 100000, 1200000, 100000, 800000, 800000, 200000, 1000001,
			800000, 300001, 100000, 1800000, 400000, 400004, 100000, 1200000, 100000,
			900000, 900000, 200000, 1000001, 900005, 300001, 100000, 1800000, 400000,
			100005, 100000, 1200000, 100000, 300000, 300000, 300002, 1400000, 300005,
			100000, 100000, 10500000, 10300000, 10500000, 10500000, 10500000,
			10300000, 1e9, 1e9, 1500006, 7200000, 9100000, 1500006, 2000000, 1800000,
			400000, 400004, 100000, 1200000, 300005, 900000, 900000, 200000, 1000001,
			900005, 300001, 100000, 1800000, 400000, 400004, 400000, 1200000, 300005,
			900000, 900000, 200000, 1000001, 900000, 300001, 100000, 1800000, 400000,
			200000, 400000, 1200000, 300005, 900000, 900000, 200000, 1000001, 900005,
			300001, 100000, 1800000, 400000, 400004, 200000, 1200000, 100005, 900000,
			900000, 200000, 1000001, 900005, 300001, 100000, 13300000, 13600000,
			13300000, 13300000, 13300000, 13600000, 1e9, 1e9, 2600005, 8800000,
			11800000, 2600005, 2900000, 11000000, 1e9, 11000000, 11000000, 11000000,
			15300000, 1e9, 1e9, 1300004, 7400000, 9600000, 1300001, 2100000, 4700000,
			5100000, 4700000, 4700000, 7900000, 5100000, 1e9, 1e9, 900000, 3400000,
			3400000, 900000, 500000, 11400000, 12500000, 11400000, 11400000, 11400000,
			12500000, 1e9, 1e9, 1700000, 7600000, 10000000, 1700000, 2300000, 1800000,
			7900000, 400004, 100000, 1300000, 7800000, 1e9, 1e9, 300002, 1000001,
			900000, 400000, 100000, 1800000, 400000, 400004, 1000000, 1200000, 400000,
			1000000, 1000000, 500000, 1000001, 1000000, 500000, 100000, 1800000,
			400000, 3700000, 100000, 1200000, 100000, 900000, 900000, 100000, 1400000,
			900005, 100000, 100000, 2700000, 3200000, 400004, 2700000, 7900000,
			3200000, 1e9, 1e9, 700000, 1500000, 1500000, 700000, 100005, 12500000,
			12600000, 12500000, 12500000, 12500000, 12600000, 1e9, 1e9, 1e9, 8300000,
			11100000, 1700004, 2700000, 1800000, 400000, 200000, 100000, 1200000,
			100000, 900000, 900000, 200000, 1000001, 900005, 100003, 100000, 11900000,
			8800000, 11900000, 11900000, 11900000, 8800000, 1e9, 1e9, 1600005,
			7900000, 10500000, 1600005, 2500000, 1800000, 400000, 400004, 100000,
			1200000, 100000, 400000, 400000, 100000, 1000001, 300005, 100000, 100000,
			9300000, 9200000, 9300000, 9300000, 9300000, 9200000, 1e9, 1e9, 1500004,
			6600000, 7900000, 1500004, 1700000, 5700000, 4500000, 5700000, 5700000,
			7900000, 4500000, 1e9, 1e9, 900000, 4300000, 4400000, 900000, 700000,
			2500000, 2800000, 400004, 2100000, 1200000, 2800000, 1100000, 1100000,
			900000, 1400000, 1500000, 900000, 100005, 9300000, 4500000, 9300000,
			9300000, 9300000, 4500000, 1e9, 1e9, 1500006, 6600000, 7900000, 1500006,
			1700000, 2900000, 2800000, 400004, 2900000, 1200000, 2800000, 1100000,
			1100000, 900000, 1600000, 1600000, 900000, 200000, 11500000, 6300000,
			11500000, 11500000, 11500000, 6300000, 1e9, 1e9, 1700006, 7700000,
			10100000, 1700006, 2300000, 6000000, 5200000, 6000000, 6000000, 7900000,
			5200000, 1e9, 1e9, 1100000, 4400000, 4700000, 1100000, 800000, 5700000,
			5200000, 5700000, 5700000, 7900000, 5200000, 1e9, 1e9, 900000, 4300000,
			4400000, 900000, 700000, 12500000, 14700000, 12500000, 12500000, 12500000,
			14700000, 1e9, 1e9, 2600000, 8300000, 11100000, 2600000, 2700000, 2500000,
			2800000, 5700000, 2100000, 7900000, 2800000, 1e9, 1e9, 700000, 4300000,
			4400000, 700000, 700000, 5700000, 5200000, 5700000, 5700000, 7900000,
			5200000, 1e9, 1e9, 1100000, 4300000, 4400000, 1100000, 700000, 2500000,
			2800000, 400004, 2100000, 7900000, 2800000, 1e9, 1e9, 700000, 1400000,
			1500000, 700000, 100005, 9300000, 4500000, 9300000, 9300000, 9300000,
			4500000, 1e9, 1e9, 1500004, 1e9, 7900000, 1500004, 1700000, 1800000,
			15300000, 400004, 100000, 7900000, 15300000, 1e9, 1e9, 500000, 1400000,
			1500000, 500001, 100000, 1800000, 14900000, 400004, 100000, 7900000,
			14900000, 1e9, 1e9, 500000, 1400000, 1500000, 500001, 100000, 1800000,
			1e9, 400004, 100000, 7900000, 1e9, 1e9, 1e9, 500000, 1400000, 1500000,
			500001, 100000, 1800000, 500000, 400004, 300000, 1200000, 500000, 1e9,
			1e9, 300002, 1400000, 1500000, 400000, 100000, 1800000, 500000, 400004,
			300000, 7900000, 500000, 1e9, 1e9, 300002, 1400000, 1500000, 400000,
			100000, 11200000, 11500000, 11200000, 11200000, 11200000, 11500000, 1e9,
			1e9, 1600000, 7500000, 9800000, 1600000, 2300000, 1800000, 500000, 400004,
			300000, 1200000, 500000, 1000000, 1000000, 300002, 1400000, 1500000,
			400000, 100000, 2500000, 1600000, 400004, 1900000, 1200000, 1600000,
			1000000, 1000000, 600000, 1200001, 1200001, 600000, 100005, 11500000, 1e9,
			11500000, 11500000, 11500000, 1e9, 1e9, 1e9, 1800004, 7700000, 10100000,
			1800004, 2300000, 1800000, 500000, 400004, 300000, 1200000, 500000,
			1000000, 1000000, 400002, 1400000, 1500000, 500000, 100000, 14600000, 1e9,
			14600000, 14600000, 14600000, 1e9, 1e9, 1e9, 1e9, 9700000, 13000000, 1e9,
			1e9, 8300000, 8000000, 8300000, 8300000, 8300000, 8000000, 1e9, 1e9,
			1500004, 5900000, 6900000, 1500004, 1300000, 1800000, 400000, 400004,
			100000, 1200000, 100000, 1e9, 1e9, 200000, 1400000, 1500000, 300000,
			100000, 1800000, 8000000, 400004, 100000, 1200000, 8000000, 1e9, 1e9,
			100000, 1400000, 1500000, 300000, 100000, 1800000, 5400000, 400004,
			100000, 1200000, 5400000, 1e9, 1e9, 300000, 1400000, 1500000, 300000,
			100000, 1800000, 400000, 400004, 100000, 1200000, 100000, 1e9, 1e9,
			100000, 1400000, 1500000, 300000, 100000, 8800000, 8900000, 8800000,
			8800000, 8800000, 8900000, 1e9, 1e9, 1500000, 6300000, 7400000, 1500000,
			1500000, 7600000, 10300000, 7600000, 7600000, 7900000, 10300000, 1e9, 1e9,
			900000, 5400000, 6300000, 900000, 1200000, 1800000, 1000000, 400004,
			1200000, 1200000, 1000000, 1e9, 1e9, 500000, 1400000, 1500000, 500001,
			100000, 3100000, 5000000, 400004, 3100000, 1500000, 5000000, 1e9, 1e9,
			900003, 1800000, 1800000, 900001, 200000, 1800000, 5000000, 400004,
			1500000, 1500000, 5000000, 1e9, 1e9, 900003, 1400000, 1500000, 900001,
			100000, 1800000, 400000, 400004, 100000, 1200000, 100000, 1e9, 1e9,
			100000, 1400000, 1500000, 100000, 100000, 1800000, 400000, 3700000,
			100000, 1200000, 200000, 900000, 900000, 500000, 1400000, 1000005,
			1500004, 100000, 1800000, 2500000, 3700000, 100000, 1200000, 2500000,
			900000, 900000, 1500004, 1400000, 1000005, 1500004, 100000, 1800000,
			400000, 400004, 100000, 1200000, 100000, 400000, 400000, 300002, 1400000,
			1500000, 100000, 100000, 3500000, 3000000, 3700000, 3500000, 7900000,
			3000000, 1e9, 1e9, 800000, 2200000, 2200000, 800000, 300000, 15000000,
			1e9, 15000000, 15000000, 15000000, 1e9, 1e9, 1e9, 1800002, 10100000,
			13400000, 1800002, 1e9, 1800000, 400000, 400004, 100000, 1200000, 400000,
			900000, 900000, 200000, 1400000, 1500000, 300000, 100000, 1800000, 400000,
			400004, 100000, 1200000, 400000, 900000, 900000, 100000, 1100000, 1000005,
			300000, 100000, 12000000, 4900000, 12000000, 12000000, 12000000, 4900000,
			1e9, 1e9, 1400000, 8000000, 10600000, 1400000, 2500000, 1800000, 400000,
			400004, 100000, 1200000, 100000, 400000, 400000, 100000, 1400000, 1500000,
			100000, 100000, 1800000, 400000, 400000, 100000, 1200000, 400000, 900000,
			900000, 100000, 1100000, 1000005, 300000, 100000, 1800000, 400000, 400004,
			100000, 7900000, 100000, 1e9, 1e9, 100000, 1400000, 1500000, 100000,
			100000, 1800000, 4900000, 400004, 100000, 1200000, 4900000, 600000,
			600000, 100000, 1400000, 1500000, 100000, 100000, 1e9, 1e9, 1e9, 1e9, 1e9,
			1e9, 1e9, 1e9, 2600000, 1e9, 1e9, 2600000, 1e9, 3000000, 4900000, 400004,
			3000000, 1200000, 4900000, 900000, 900000, 800000, 1800000, 1700000,
			800000, 200000, 1800000, 400000, 400004, 100000, 1200000, 300006, 1100000,
			1100000, 200000, 1400000, 1500000, 300000, 100000, 1800000, 400000,
			3700000, 300000, 1200000, 300006, 900000, 900000, 400002, 1400000,
			1000000, 500000, 100000, 1800000, 1e9, 400004, 100000, 7900000, 1e9, 1e9,
			1e9, 300002, 1400000, 1500000, 400000, 100000, 1800000, 14900000, 400004,
			100000, 7900000, 14900000, 1e9, 1e9, 300002, 1400000, 1500000, 400000,
			100000, 11100000, 11500000, 11100000, 11100000, 11100000, 11500000, 1e9,
			1e9, 1e9, 7500000, 9700000, 1e9, 2200000, 1800000, 4100000, 400004,
			800000, 7900000, 4100000, 1e9, 1e9, 500000, 1400000, 1500000, 500001,
			100000, 5700000, 9400000, 5700000, 5700000, 7900000, 9400000, 1e9, 1e9,
			1200002, 4300000, 4400000, 1200001, 700000, 5700000, 6600000, 5700000,
			5700000, 7900000, 6600000, 1e9, 1e9, 1200002, 4300000, 4400000, 1200001,
			500000, 6900000, 4100000, 6900000, 6900000, 7900000, 4100000, 1e9, 1e9,
			1200002, 4800000, 5600000, 1200001, 1000000, 1800000, 400000, 400004,
			100000, 7900000, 100000, 1e9, 1e9, 100000, 1400000, 1500000, 100001,
			100000, 1800000, 1500000, 400004, 1600000, 1200000, 1500000, 1100000,
			1100000, 600000, 1400000, 1500000, 600000, 100000, 1800000, 400000,
			400004, 1600000, 1200000, 300005, 1e9, 1e9, 200000, 1400000, 1500000,
			300000, 100000, 1800000, 1500000, 400004, 1500000, 1200000, 1500000,
			1100000, 1100000, 900003, 1400000, 1500000, 600000, 100000, 3000000,
			1500000, 400004, 3000000, 1200000, 1500000, 1100000, 1100000, 900003,
			1800000, 1700000, 900001, 200000, 5600000, 5000000, 5600000, 5600000,
			1200000, 5000000, 1100000, 1100000, 900003, 4300000, 4300000, 900001,
			600000, 1800000, 1500000, 400004, 1500000, 1200000, 1500000, 1e9, 1e9,
			600000, 1400000, 1500000, 600000, 100000, 1800000, 1400000, 400004,
			100000, 1200000, 100000, 1e9, 1e9, 100000, 1400000, 1500000, 100000,
			100000, 14700000, 1e9, 14700000, 14700000, 14700000, 1e9, 1e9, 1e9, 1e9,
			9800000, 13100000, 1e9, 1e9, 1800000, 400000, 400004, 100000, 1200000,
			100000, 1100000, 1100000, 100000, 1400000, 1500000, 100000, 100000,
			1800000, 400000, 400004, 100000, 1200000, 100000, 1e9, 1e9, 300000,
			1400000, 1500000, 100000, 100000, 13000000, 3200000, 13000000, 13000000,
			13000000, 3200000, 1e9, 1e9, 700000, 8600000, 11500000, 700000, 2800000,
			1800000, 400000, 400004, 100000, 1200000, 300005, 900000, 900000, 400002,
			1400000, 1000005, 500000, 100000, 1800000, 400000, 400004, 100000,
			1200000, 300005, 1e9, 1e9, 200000, 1400000, 1500000, 300000, 100000,
			1800000, 400000, 400004, 100000, 1200000, 100000, 1100000, 1100000,
			200000, 1400000, 1500000, 300000, 100000, 1e9, 6500000, 1e9, 1e9, 1e9,
			6500000, 1e9, 1e9, 1e9, 1e9, 1e9, 1e9, 1e9, 5000000, 6500000, 5000000,
			5000000, 7900000, 6500000, 1e9, 1e9, 1000000, 3700000, 3700000, 1000000,
			500000, 5000000, 1e9, 5000000, 5000000, 7900000, 1e9, 1e9, 1e9, 1e9,
			3700000, 3700000, 1e9, 500000, 5000000, 1e9, 5000000, 5000000, 7900000,
			1e9, 1e9, 1e9, 1000000, 3700000, 3700000, 1000000, 500000, 5000000,
			9200000, 5000000, 5000000, 7900000, 9200000, 1e9, 1e9, 1000000, 3700000,
			3700000, 1000000, 500000, 14000000, 1e9, 14000000, 14000000, 14000000,
			1e9, 1e9, 1e9, 1e9, 9200000, 12400000, 1e9, 3000000, 5700000, 5300000,
			5700000, 5700000, 7900000, 5300000, 1e9, 1e9, 1100003, 4300000, 4400000,
			1100001, 700000, 14400000, 1e9, 14400000, 14400000, 14400000, 1e9, 1e9,
			1e9, 1e9, 9500000, 12800000, 1e9, 1e9, 11800000, 5500000, 11800000,
			11800000, 11800000, 5500000, 1e9, 1e9, 1500000, 7900000, 10400000,
			1500000, 2500000, 11900000, 5400000, 11900000, 11900000, 11900000,
			5400000, 1e9, 1e9, 1300000, 7900000, 10500000, 1300000, 2500000, 11900000,
			5100000, 11900000, 11900000, 11900000, 5100000, 1e9, 1e9, 1300004,
			7900000, 10500000, 1300001, 2500000, 2500000, 400000, 400004, 2300000,
			1200000, 300005, 1000000, 1000000, 700000, 1400000, 1500000, 700000,
			100005, 11900000, 5400000, 11900000, 11900000, 11900000, 5400000, 1e9,
			1e9, 1300004, 7900000, 10500000, 1300001, 2500000, 1800000, 400000,
			400004, 1500000, 7900000, 300005, 1e9, 1e9, 400002, 1400000, 1500000,
			500000, 100000, 1800000, 400000, 400004, 100000, 7900000, 300000, 1e9,
			1e9, 200000, 1400000, 1500000, 300000, 100000, 2800000, 2200000, 400004,
			2800000, 7900000, 2200000, 1e9, 1e9, 900000, 1500000, 1500000, 900000,
			100005, 8100000, 9600000, 8100000, 8100000, 8100000, 9600000, 1e9, 1e9,
			1300000, 5800000, 6800000, 1300000, 1300000, 9800000, 9600000, 9800000,
			9800000, 9800000, 9600000, 1e9, 1e9, 1300000, 6800000, 8400000, 1300000,
			1800000, 1800000, 400000, 400004, 100000, 1200000, 100005, 1e9, 1e9,
			200000, 1400000, 1500000, 300000, 100000, 5000000, 1700000, 5000000,
			5000000, 1200000, 1700000, 1100000, 1100000, 800000, 3700000, 3700000,
			800000, 500000, 1800000, 400000, 400004, 100000, 1200000, 100005, 1000000,
			1000000, 200000, 1100001, 1100001, 300000, 100000, 14500000, 1e9,
			14500000, 14500000, 14500000, 1e9, 1e9, 1e9, 1e9, 9600000, 12900000, 1e9,
			1e9, 1800000, 7900000, 400004, 600000, 1200000, 7100000, 1e9, 1e9, 500000,
			1400000, 1500000, 500001, 100000, 5000000, 2200000, 5000000, 5000000,
			1200000, 900000, 1e9, 1e9, 300002, 3700000, 3700000, 300000, 500000,
			6900000, 8300000, 6900000, 6900000, 7900000, 8300000, 1e9, 1e9, 1200002,
			4800000, 5600000, 1200001, 1000000, 5200000, 7900000, 5200000, 5200000,
			7900000, 6900000, 1e9, 1e9, 1500004, 4100000, 3900000, 1500004, 600000,
			10500000, 10100000, 10500000, 10500000, 10500000, 10100000, 1e9, 1e9,
			1600000, 7200000, 9100000, 1600000, 2000000, 5200000, 10300000, 5200000,
			5200000, 7900000, 10300000, 1e9, 1e9, 2700000, 4100000, 3900000, 2700000,
			600000, 9800000, 10700000, 9800000, 9800000, 9800000, 10700000, 1e9, 1e9,
			1700000, 6800000, 8400000, 1700000, 1800000, 10500000, 11000000, 10500000,
			10500000, 10500000, 11000000, 1e9, 1e9, 1600000, 7200000, 9100000,
			1600000, 2000000, 10900000, 11000000, 10900000, 10900000, 10900000,
			11000000, 1e9, 1e9, 1600000, 7400000, 9500000, 1600000, 2100000, 13300000,
			1e9, 13300000, 13300000, 13300000, 1e9, 1e9, 1e9, 1e9, 8800000, 11800000,
			1e9, 2900000, 8500000, 12500000, 8500000, 8500000, 8500000, 12500000, 1e9,
			1e9, 2600000, 6000000, 7100000, 2600000, 1400000, 8500000, 12500000,
			8500000, 8500000, 8500000, 12500000, 1e9, 1e9, 1800000, 6000000, 7100000,
			1800000, 1400000, 13900000, 1e9, 13900000, 13900000, 13900000, 1e9, 1e9,
			1e9, 1e9, 9100000, 12300000, 1e9, 3000000, 1800000, 2500000, 400004,
			200000, 1200000, 100000, 1100000, 1100000, 200000, 1400000, 1500000,
			300000, 100000, 8500000, 6800000, 8500000, 8500000, 8500000, 6800000, 1e9,
			1e9, 1700002, 6000000, 7100000, 1700002, 1400000, 1800000, 9500000,
			400004, 100000, 1200000, 100005, 1000000, 1000000, 1e9, 1400000, 1000006,
			300000, 100000, 1800000, 9500000, 400004, 100000, 1200000, 100005, 600000,
			600000, 1e9, 1400000, 1000006, 300000, 100000, 1800000, 9500000, 400004,
			100000, 1200000, 100000, 400000, 400000, 1300004, 1400000, 700000, 100002,
			100000, 1800000, 9500000, 400004, 100000, 1200000, 100005, 1000000,
			1000000, 1300004, 1400000, 1000006, 300000, 100000, 1800000, 9500000,
			400004, 100000, 1200000, 100000, 400000, 400000, 1e9, 1400000, 700000,
			100002, 100000, 6800000, 9500000, 6800000, 6800000, 1400000, 2700000, 1e9,
			1e9, 1e9, 4800000, 5500000, 1100000, 1000000, 6800000, 9500000, 6800000,
			6800000, 7900000, 2700000, 1e9, 1e9, 1e9, 4800000, 5500000, 1100000,
			1000000, 1800000, 9500000, 400004, 500000, 1400000, 300000, 900000,
			900000, 1e9, 1400000, 1500000, 500000, 100000, 1800000, 9500000, 400004,
			100000, 1200000, 100000, 600000, 600000, 1e9, 1400000, 700000, 100002,
			100000, 1800000, 9500000, 400004, 100000, 1200000, 100005, 1e9, 1e9, 1e9,
			1400000, 1000006, 300000, 100000, 3700000, 9500000, 3700000, 3700000,
			1200000, 2400000, 1e9, 1e9, 1e9, 2400000, 2400000, 900000, 300000,
			5200000, 9700000, 5200000, 5200000, 7900000, 9700000, 1e9, 1e9, 1e9,
			4100000, 3900000, 1e9, 600000, 1800000, 400000, 400004, 200000, 1200000,
			100000, 1100000, 1100000, 100000, 1400000, 1500000, 100000, 100000,
			1800000, 400000, 400004, 100000, 1200000, 100000, 400000, 400000, 100000,
			1000001, 700000, 100000, 100000, 6500000, 3700000, 6500000, 6500000,
			7900000, 3700000, 1e9, 1e9, 1100003, 4700000, 5200000, 1100001, 900000,
			2900000, 2000000, 400004, 2900000, 1200000, 2000000, 1100000, 1100000,
			900000, 1600000, 1600000, 900000, 200000, 5800000, 5300000, 5800000,
			5800000, 7900000, 5300000, 1e9, 1e9, 1300000, 4300000, 4500000, 1300000,
			700000, 5700000, 5200000, 5700000, 5700000, 1600000, 5200000, 1e9, 1e9,
			1000003, 4300000, 4400000, 1000001, 600000, 1800000, 400000, 400004,
			100000, 1200000, 100000, 800000, 800000, 100000, 1400000, 700000, 100000,
			100000, 1800000, 400000, 400004, 100000, 1200000, 300000, 800000, 800000,
			100000, 1400000, 700000, 100000, 100000, 1800000, 400000, 400004, 100000,
			1200000, 100000, 600000, 600000, 100000, 1400000, 700000, 100000, 100000,
			12100000, 3800000, 12100000, 12100000, 12100000, 3800000, 700000, 700000,
			1e9, 8100000, 10700000, 1e9, 2500000, 1e9, 3800000, 1e9, 1e9, 1e9,
			3800000, 700000, 700000, 1e9, 1e9, 1e9, 1e9, 1e9, 1800000, 400000, 400004,
			100000, 1200000, 100000, 1e9, 1e9, 300002, 1400000, 1500000, 400000,
			100000, 1800000, 400000, 400004, 100000, 7900000, 100000, 1e9, 1e9,
			300002, 1400000, 1500000, 400000, 100000, 1e9, 14900000, 1e9, 1e9, 1e9,
			14900000, 1e9, 1e9, 1e9, 1e9, 1e9, 1e9, 1e9, 13600000, 1e9, 13600000,
			13600000, 13600000, 1e9, 1e9, 1e9, 1e9, 9000000, 12100000, 1e9, 2900000,
			13600000, 1e9, 13600000, 13600000, 13600000, 1e9, 1e9, 1e9, 2600000,
			9000000, 12100000, 2600000, 2900000, 1800000, 400000, 400004, 100000,
			1200000, 100000, 800000, 800000, 100000, 1000001, 400000, 100002, 100000,
			6900000, 6500000, 6900000, 6900000, 7900000, 6500000, 1e9, 1e9, 1100003,
			4800000, 5600000, 1100001, 1000000, 1800000, 400000, 400004, 100000,
			1500000, 300000, 1e9, 1e9, 300002, 1400000, 1500000, 400000, 100000,
			1800000, 3500000, 400004, 1800000, 1200000, 3500000, 1e9, 1e9, 600000,
			1400000, 1500000, 600000, 100000, 2500000, 2200000, 400004, 2100000,
			1200000, 2200000, 1e9, 1e9, 700000, 1400000, 1500000, 700000, 100005,
			9400000, 6100000, 9400000, 9400000, 9400000, 6100000, 1e9, 1e9, 1500000,
			6600000, 8000000, 1500000, 1700000, 9400000, 9400000, 9400000, 9400000,
			9400000, 9400000, 1e9, 1e9, 1600000, 6600000, 8000000, 1600000, 1700000,
			9400000, 6600000, 9400000, 9400000, 9400000, 6600000, 1e9, 1e9, 1600000,
			6600000, 8000000, 1600000, 1700000, 2500000, 2200000, 400004, 2100000,
			1200000, 2200000, 1100000, 1100000, 700000, 1400000, 1500000, 700000,
			100005, 2500000, 2200000, 400004, 2200000, 1200000, 2200000, 1100000,
			1100000, 900000, 1200001, 1200001, 900000, 100005, 9400000, 6100000,
			9400000, 9400000, 9400000, 6100000, 1e9, 1e9, 1500004, 6600000, 8000000,
			1500004, 1700000, 2500000, 8100000, 400004, 2100000, 1200000, 8100000,
			1100000, 1100000, 700000, 1400000, 1500000, 700000, 100005, 15000000, 1e9,
			15000000, 15000000, 15000000, 1e9, 1e9, 1e9, 1e9, 10100000, 13400000, 1e9,
			1e9, 2500000, 2800000, 400004, 2100000, 1200000, 2800000, 1e9, 1e9,
			700000, 1400000, 1500000, 700000, 100005, 2500000, 2800000, 400004,
			2100000, 1200000, 2800000, 1100000, 1100000, 700000, 1400000, 1500000,
			700000, 100005, 1800000, 400000, 3700000, 100000, 1200000, 100000, 400000,
			400000, 100000, 1400000, 600000, 100000, 100000, 10900000, 14900000,
			10900000, 10900000, 10900000, 14900000, 1e9, 1e9, 2600002, 7400000,
			9500000, 2600002, 2100000, 1e9, 1e9, 1e9, 1e9, 1e9, 1e9, 1e9, 1e9,
			1300004, 1e9, 1e9, 1300001, 1e9, 1800000, 1500000, 400004, 1600000,
			1200000, 1500000, 1100000, 1100000, 900003, 1400000, 1500000, 900001,
			100000, 3300000, 3200000, 400004, 3300000, 7900000, 3200000, 1e9, 1e9,
			900000, 2000000, 2000000, 900000, 200000, 14300000, 400000, 14300000,
			14300000, 14300000, 400000, 1e9, 1e9, 1e9, 9400000, 12700000, 1e9,
			3000000, 7900000, 6200000, 7900000, 7900000, 1700000, 6200000, 1e9, 1e9,
			1300004, 5700000, 6600000, 1300001, 1200000, 10100000, 10700000, 10100000,
			10100000, 10100000, 10700000, 1e9, 1e9, 1500004, 7000000, 8700000,
			1500004, 1900000, 1800000, 400000, 400004, 100000, 1200000, 100000,
			500005, 500005, 100000, 1000001, 700000, 100000, 100000, 10900000,
			11700000, 10900000, 10900000, 10900000, 11700000, 1e9, 1e9, 2600004,
			7400000, 9500000, 2600004, 2100000, 7900000, 7900000, 7900000, 7900000,
			7900000, 7000000, 1e9, 1e9, 1600004, 5700000, 6600000, 1600004, 1200000,
			12700000, 11800000, 12700000, 12700000, 12700000, 11800000, 1e9, 1e9,
			1700000, 8400000, 11300000, 1700000, 2800000, 12700000, 400000, 12700000,
			12700000, 12700000, 300000, 1e9, 1e9, 1600004, 8400000, 11300000, 1600004,
			2800000, 9700000, 3400000, 9700000, 9700000, 9700000, 3400000, 1e9, 1e9,
			900000, 6800000, 8300000, 900000, 1800000, 1e9, 11800000, 1e9, 1e9, 1e9,
			11800000, 1e9, 1e9, 1e9, 1e9, 1e9, 1e9, 1e9, 9700000, 9300000, 9700000,
			9700000, 9700000, 9300000, 1e9, 1e9, 1000003, 6800000, 8300000, 1000001,
			1800000, 9700000, 3400000, 9700000, 9700000, 9700000, 3400000, 1e9, 1e9,
			1000003, 6800000, 8300000, 1000001, 1800000, 9700000, 11100000, 9700000,
			9700000, 9700000, 11100000, 1e9, 1e9, 1600004, 6800000, 8300000, 1600004,
			1800000, 5200000, 3400000, 5200000, 5200000, 7900000, 3400000, 1e9, 1e9,
			900003, 4100000, 3900000, 900001, 600000, 3100000, 3400000, 400004,
			3100000, 7900000, 3400000, 1e9, 1e9, 700000, 1800000, 1800000, 700000,
			200000, 6300000, 3400000, 6300000, 6300000, 7900000, 3400000, 1e9, 1e9,
			900003, 4600000, 5000000, 900001, 800000, 11100000, 3400000, 11100000,
			11100000, 11100000, 3400000, 1e9, 1e9, 900003, 7500000, 9700000, 900001,
			2200000, 5200000, 3400000, 5200000, 5200000, 7900000, 3400000, 1e9, 1e9,
			900000, 4100000, 3900000, 900000, 600000, 13100000, 14100000, 13100000,
			13100000, 13100000, 14100000, 1e9, 1e9, 1e9, 8700000, 11600000, 1e9,
			2900000, 11700000, 3400000, 11700000, 11700000, 11700000, 3400000, 1e9,
			1e9, 900003, 7800000, 10300000, 900001, 2400000, 6200000, 6200000,
			6200000, 6200000, 1700000, 6200000, 1e9, 1e9, 1100000, 4600000, 4900000,
			1100000, 800000, 8900000, 11300000, 8900000, 8900000, 7900000, 11300000,
			1e9, 1e9, 1e9, 6300000, 7500000, 1e9, 1500000, 10600000, 1e9, 10600000,
			10600000, 10600000, 1e9, 1e9, 1e9, 1e9, 7200000, 9200000, 1e9, 2000000,
			15400000, 1e9, 15400000, 15400000, 15400000, 1e9, 1e9, 1e9, 1e9, 1e9,
			13800000, 1e9, 1e9, 5700000, 5200000, 5700000, 5700000, 1600000, 5200000,
			1e9, 1e9, 1000003, 4300000, 4400000, 1000001, 700000, 5700000, 5200000,
			5700000, 5700000, 1600000, 5200000, 1e9, 1e9, 1100000, 4300000, 4400000,
			1100000, 700000, 5700000, 5200000, 5700000, 5700000, 7900000, 5200000,
			1e9, 1e9, 1000003, 4300000, 4400000, 1000001, 700000, 11700000, 7900000,
			11700000, 11700000, 11700000, 7100000, 1e9, 1e9, 1600000, 7800000,
			10300000, 1600000, 2400000, 1e9, 1e9, 1e9, 1e9, 1e9, 1e9, 1e9, 1e9,
			1000000, 1e9, 1e9, 1000000, 1e9, 1e9, 1e9, 1e9, 1e9, 1e9, 1e9, 1e9, 1e9,
			1600004, 1e9, 1e9, 1600004, 1e9, 4600000, 9400000, 4600000, 4600000,
			7900000, 9400000, 1e9, 1e9, 1100000, 3300000, 3300000, 1100000, 500000,
			4600000, 6600000, 4600000, 4600000, 7900000, 6600000, 1e9, 1e9, 1100000,
			4300000, 4400000, 1100000, 500000, 1800000, 400000, 400004, 100000,
			1200000, 100000, 1e9, 1e9, 200000, 1400000, 1500000, 300001, 100000,
			1800000, 9800000, 400004, 600000, 7900000, 9800000, 1e9, 1e9, 500000,
			1400000, 1500000, 500001, 100000, 10900000, 13700000, 10900000, 10900000,
			10900000, 13700000, 1e9, 1e9, 1e9, 7400000, 9500000, 1e9, 2100000,
			5500000, 600000, 5500000, 8800000, 8800000, 600000, 1e9, 1e9, 400002,
			4200000, 7400000, 500001, 600000, 13700000, 1e9, 13700000, 13700000,
			13700000, 1e9, 1e9, 1e9, 1e9, 9000000, 12100000, 1e9, 3000000, 8100000,
			2600000, 8100000, 8100000, 8100000, 2600000, 1e9, 1e9, 1300004, 5800000,
			6800000, 1300001, 1300000, 1800000, 400000, 400004, 1300000, 7900000,
			300006, 1e9, 1e9, 600000, 1400000, 1500000, 600000, 100000, 14800000,
			6500000, 14800000, 14800000, 14800000, 6500000, 1e9, 1e9, 700000, 9900000,
			13200000, 700000, 1e9, 4100000, 9300000, 4100000, 4100000, 7900000,
			9300000, 1e9, 1e9, 1000000, 2600000, 2600000, 1000000, 400000, 1e9,
			9300000, 1e9, 1e9, 1e9, 9300000, 1e9, 1e9, 1e9, 1e9, 1e9, 1e9, 1e9,
			11000000, 1e9, 11000000, 11000000, 11000000, 1e9, 1e9, 1e9, 1e9, 7400000,
			9600000, 900000, 2100000, 5700000, 9400000, 5700000, 5700000, 7900000,
			9400000, 1e9, 1e9, 1200002, 4300000, 4400000, 1200001, 1e9, 8700000,
			4100000, 8700000, 8700000, 8700000, 4100000, 1e9, 1e9, 1400005, 6200000,
			7300000, 1400001, 1400000, 13500000, 1e9, 13500000, 13500000, 13500000,
			1e9, 1e9, 1e9, 1e9, 8900000, 12000000, 1e9, 2900000, 14200000, 1e9,
			14200000, 14200000, 14200000, 1e9, 1e9, 1e9, 1e9, 9300000, 12600000, 1e9,
			3000000, 4100000, 3600000, 4100000, 4100000, 7900000, 3600000, 1e9, 1e9,
			800000, 2800000, 2800000, 800000, 400000, 2500000, 2000000, 400004,
			2100000, 7900000, 2000000, 1e9, 1e9, 700000, 1400000, 1500000, 700000,
			100005, 5200000, 2000000, 5200000, 5200000, 7900000, 2000000, 1e9, 1e9,
			900000, 4100000, 3900000, 900000, 600000, 5700000, 4500000, 5700000,
			5700000, 7900000, 4500000, 1e9, 1e9, 1000003, 4300000, 4400000, 1000001,
			700000, 8300000, 7900000, 8300000, 8300000, 8300000, 6900000, 1e9, 1e9,
			1300000, 5900000, 6900000, 1300000, 1300000, 2500000, 7900000, 400004,
			2500000, 7900000, 6900000, 1e9, 1e9, 700000, 1400000, 1500000, 700000,
			100005, 2500000, 7900000, 400004, 2500000, 7900000, 6900000, 1e9, 1e9,
			800000, 1400000, 1500000, 800000, 100005, 1800000, 7900000, 400004,
			100000, 7900000, 6900000, 1e9, 1e9, 100000, 1400000, 1500000, 200000,
			100000, 1e9, 6800000, 1e9, 1e9, 1e9, 6800000, 1e9, 1e9, 1e9, 1e9, 1e9,
			1e9, 1e9, 2600000, 1600000, 400004, 2600000, 1200000, 1600000, 1000000,
			1000000, 700000, 1200001, 1200001, 700000, 100005, 1800000, 400000,
			3700000, 100000, 1200000, 100000, 600000, 600000, 100000, 1400000, 300005,
			100000, 100000, 12000000, 5300000, 12000000, 12000000, 12000000, 5300000,
			1e9, 1e9, 1500004, 8000000, 10600000, 1500004, 2500000, 12000000, 5300000,
			12000000, 12000000, 12000000, 5300000, 1e9, 1e9, 1e9, 8000000, 10600000,
			1e9, 2500000, 1800000, 5300000, 400004, 100000, 7900000, 5300000, 1e9,
			1e9, 200000, 1400000, 1500000, 300001, 100000, 1800000, 5300000, 400004,
			100000, 7900000, 5300000, 1e9, 1e9, 300002, 1400000, 1500000, 400000,
			100000, 1800000, 1e9, 400004, 100000, 7900000, 1e9, 1e9, 1e9, 200000,
			1400000, 1500000, 300001, 100000, 1800000, 5300000, 400004, 400000,
			7900000, 5300000, 1e9, 1e9, 300002, 1400000, 1500000, 400000, 100000,
			2500000, 3500000, 400004, 2400000, 7900000, 3500000, 1e9, 1e9, 700000,
			1400000, 1500000, 700000, 100005, 10900000, 11700000, 10900000, 10900000,
			10900000, 11700000, 1e9, 1e9, 1400005, 7400000, 9500000, 1400001, 2100000,
			5700000, 4100000, 5700000, 5700000, 7900000, 4100000, 1e9, 1e9, 1200002,
			4300000, 4400000, 1200001, 700000, 4600000, 9400000, 4600000, 4600000,
			7900000, 9400000, 1e9, 1e9, 1100000, 4300000, 4400000, 1100000, 500000,
			1800000, 400000, 400004, 1800000, 1200000, 100000, 1e9, 1e9, 100000,
			1400000, 1500000, 100003, 100000, 5700000, 6600000, 5700000, 5700000,
			7900000, 6600000, 1e9, 1e9, 1200002, 4300000, 4400000, 1200001, 700000,
			2500000, 3400000, 400004, 2100000, 1200000, 3400000, 1e9, 1e9, 700000,
			1400000, 1200001, 700000, 100005, 4600000, 6600000, 4600000, 4600000,
			7900000, 6600000, 1e9, 1e9, 1100000, 3300000, 3300000, 1100000, 500000,
			4100000, 3200000, 4100000, 4100000, 7900000, 3200000, 1e9, 1e9, 1000000,
			2800000, 2800000, 1000000, 400000, 4100000, 3200000, 4100000, 4100000,
			7900000, 3200000, 1e9, 1e9, 800000, 2800000, 2800000, 800000, 400000, 1e9,
			1e9, 1e9, 1e9, 1e9, 1e9, 1e9, 1e9, 900000, 1e9, 1e9, 900000, 1e9,
			10000000, 9900000, 10000000, 10000000, 10000000, 9900000, 1e9, 1e9,
			900003, 6900000, 8600000, 900001, 1900000, 3200000, 3600000, 400004,
			3200000, 7900000, 3600000, 1e9, 1e9, 1000000, 1900000, 1900000, 1000000,
			200000, 3200000, 3600000, 400004, 3200000, 1600000, 3600000, 1e9, 1e9,
			1000000, 1900000, 1900000, 1000000, 200000, 11600000, 12200000, 11600000,
			11600000, 11600000, 12200000, 1e9, 1e9, 1600000, 7800000, 10200000,
			1600000, 2400000, 6100000, 7900000, 6100000, 6100000, 7900000, 7200000,
			1e9, 1e9, 1600000, 4500000, 4800000, 1600000, 800000, 11600000, 12200000,
			11600000, 11600000, 11600000, 12200000, 1e9, 1e9, 1700000, 7800000,
			10200000, 1700000, 2400000, 11600000, 7900000, 11600000, 11600000,
			11600000, 7200000, 1e9, 1e9, 1600000, 7800000, 10200000, 1600000, 2400000,
			11600000, 12200000, 11600000, 11600000, 11600000, 12200000, 1e9, 1e9,
			1800000, 7800000, 10200000, 1800000, 2400000, 8000000, 7900000, 8000000,
			8000000, 8000000, 7200000, 1e9, 1e9, 1800000, 5700000, 6700000, 1800000,
			1300000, 11600000, 12200000, 11600000, 11600000, 11600000, 12200000, 1e9,
			1e9, 1700002, 7800000, 10200000, 1700002, 2400000, 4600000, 7900000,
			4600000, 4600000, 7900000, 7200000, 1e9, 1e9, 1600000, 3300000, 3300000,
			1600000, 500000, 1800000, 400000, 400004, 100000, 7900000, 100000, 1e9,
			1e9, 100000, 1400000, 1500000, 100002, 100000, 1800000, 400000, 400004,
			100000, 1200000, 100000, 1e9, 1e9, 100000, 1400000, 1500000, 100002,
			100000, 1800000, 400000, 400004, 100000, 1200000, 100005, 1100000,
			1100000, 100000, 1400000, 1500000, 100002, 100000, 1800000, 400000,
			400004, 100000, 1200000, 100000, 1100000, 1100000, 100000, 1400000,
			1500000, 100002, 100000, 9000000, 8100000, 9000000, 9000000, 9000000,
			8100000, 1e9, 1e9, 1600000, 6400000, 7600000, 1600000, 1500000, 5600000,
			6600000, 5600000, 5600000, 7900000, 6600000, 1e9, 1e9, 2700000, 4300000,
			4300000, 2700000, 600000, 13500000, 7900000, 13500000, 13500000, 13500000,
			6900000, 1e9, 1e9, 2600000, 8900000, 12000000, 2600000, 2900000, 13500000,
			8100000, 13500000, 13500000, 13500000, 8100000, 1e9, 1e9, 2600000,
			8900000, 12000000, 2600000, 2900000, 10400000, 14800000, 10400000,
			10400000, 10400000, 14800000, 1e9, 1e9, 1e9, 7100000, 9000000, 1e9,
			2000000, 8000000, 6500000, 8000000, 8000000, 8000000, 6500000, 1e9, 1e9,
			1500004, 5700000, 6700000, 1500004, 1300000, 1800000, 400000, 400004,
			100000, 1200000, 300005, 500005, 500005, 100000, 1100000, 1000005, 100000,
			100000, 1800000, 400000, 400004, 100000, 1200000, 300005, 1100000,
			1100000, 100000, 1400000, 1500000, 100000, 100000, 1800000, 400000,
			400004, 100000, 1200000, 300005, 1100000, 1100000, 200000, 1400000,
			1500000, 300000, 100000, 6300000, 5900000, 6300000, 6300000, 7900000,
			5900000, 1e9, 1e9, 1600000, 4600000, 5000000, 1600000, 800000, 7700000,
			7900000, 7700000, 7700000, 7900000, 7300000, 1e9, 1e9, 1600000, 5500000,
			6400000, 1600000, 1200000, 6300000, 5900000, 6300000, 6300000, 1800000,
			5900000, 1e9, 1e9, 1600000, 4600000, 5000000, 1600000, 800000, 8500000,
			11000000, 8500000, 8500000, 8500000, 11000000, 1e9, 1e9, 100000, 6000000,
			7100000, 100000, 1400000, 3500000, 6000000, 3700000, 3500000, 7900000,
			6000000, 1e9, 1e9, 800000, 2200000, 2200000, 800000, 300000, 1800000,
			1000000, 400004, 1200000, 1200000, 1000000, 1100000, 1100000, 300002,
			1400000, 1500000, 400000, 100000, 1800000, 1000000, 400004, 1200000,
			1200000, 1000000, 1000000, 1000000, 200000, 1400000, 1500000, 400000,
			100000, 1800000, 400000, 400004, 100000, 1200000, 100005, 1e9, 1e9,
			300002, 1400000, 1500000, 400000, 100000, 3100000, 5000000, 400004,
			3100000, 1200000, 5000000, 1e9, 1e9, 300002, 1800000, 1800000, 400000,
			200000, 1800000, 400000, 400004, 100000, 1200000, 100000, 700000, 700000,
			100000, 1400000, 400000, 100000, 100000, 5600000, 3200000, 5600000,
			5600000, 1600000, 3200000, 1e9, 1e9, 1300000, 4300000, 4300000, 1300000,
			600000, 13600000, 9700000, 13600000, 13600000, 13600000, 9700000, 1e9,
			1e9, 600000, 9000000, 12100000, 600000, 2900000, 8700000, 7900000,
			8700000, 8700000, 8700000, 7000000, 1e9, 1e9, 1400005, 6200000, 7300000,
			1400001, 1400000, 1800000, 400000, 400004, 1100000, 1200000, 100005,
			1100000, 1100000, 900000, 1400000, 1500000, 900000, 100000, 11800000, 1e9,
			11800000, 11800000, 11800000, 6300000, 1e9, 1e9, 1e9, 7900000, 10400000,
			1600000, 2500000, 1800000, 400000, 400004, 100000, 7900000, 400000, 1e9,
			1e9, 1e9, 1400000, 1500000, 300000, 100000, 10400000, 7900000, 10400000,
			10400000, 10400000, 7200000, 1e9, 1e9, 1400005, 7100000, 9000000, 1400001,
			2000000, 4700000, 5200000, 4700000, 4700000, 1600000, 5200000, 1e9, 1e9,
			1000003, 3400000, 3400000, 1000001, 500000, 12800000, 3800000, 12800000,
			12800000, 12800000, 3800000, 1e9, 1e9, 1800002, 8500000, 11400000,
			1800002, 2800000, 15100000, 1e9, 15100000, 15100000, 15100000, 1e9, 1e9,
			1e9, 1800002, 10100000, 13500000, 1800002, 1e9, 1e9, 8800000, 1e9, 1e9,
			1e9, 8800000, 1e9, 1e9, 1e9, 1e9, 1e9, 1e9, 1e9, 8400000, 1e9, 8400000,
			8400000, 8400000, 1e9, 1e9, 1e9, 1800002, 6000000, 7000000, 1800002,
			1400000, 8400000, 3800000, 8400000, 8400000, 8400000, 3800000, 1e9, 1e9,
			1800002, 6000000, 7000000, 1800002, 1400000, 5300000, 7900000, 5300000,
			5300000, 7900000, 6900000, 1e9, 1e9, 1700004, 4100000, 4000000, 1700004,
			600000, 1e9, 1e9, 1e9, 15300000, 1e9, 1e9, 1e9, 1e9, 1e9, 1e9, 13700000,
			1e9, 1e9, 6100000, 3600000, 6100000, 6100000, 7900000, 3600000, 1e9, 1e9,
			1500004, 4500000, 4800000, 1500004, 800000, 6900000, 6800000, 6900000,
			6900000, 7900000, 6800000, 1e9, 1e9, 1100000, 4800000, 5600000, 1100000,
			1000000, 6900000, 6800000, 6900000, 6900000, 7900000, 6800000, 1e9, 1e9,
			1500000, 4800000, 5600000, 1500000, 1000000, 7800000, 6800000, 7800000,
			7800000, 7900000, 6800000, 1e9, 1e9, 1500000, 5600000, 6500000, 1500000,
			1200000, 7500000, 10300000, 7500000, 7500000, 7900000, 10300000, 1e9, 1e9,
			1500000, 5400000, 6200000, 1500000, 1100000, 6900000, 3900000, 6900000,
			6900000, 7900000, 3900000, 1e9, 1e9, 1100000, 4800000, 5600000, 1100000,
			1000000, 12100000, 6400000, 1e9, 12100000, 12100000, 6400000, 1e9, 1e9,
			2600002, 8100000, 10700000, 2600002, 2500000, 9400000, 9700000, 9400000,
			9400000, 9400000, 9700000, 1e9, 1e9, 1800002, 6600000, 8000000, 1800002,
			1700000, 12100000, 6400000, 1e9, 12100000, 12100000, 6400000, 1e9, 1e9,
			1800002, 8100000, 10700000, 1800002, 2500000, 3700000, 6200000, 3700000,
			3700000, 7900000, 6200000, 1e9, 1e9, 1000003, 2400000, 2400000, 1000001,
			300000, 1800000, 400000, 400004, 100000, 7900000, 300000, 1e9, 1e9,
			300002, 1400000, 1500000, 400000, 100000, 3100000, 5000000, 400004,
			3100000, 7900000, 5000000, 1e9, 1e9, 300002, 1800000, 1800000, 400000,
			200000, 1800000, 400000, 400004, 100000, 1500000, 100005, 1e9, 1e9,
			300002, 1400000, 1500000, 400000, 100000, 1800000, 400000, 100005,
			1400000, 1200000, 100000, 500000, 500000, 300000, 1000001, 700000, 100000,
			100000, 1800000, 400000, 3700000, 100000, 7900000, 100000, 1e9, 1e9,
			200000, 1400000, 1500000, 300001, 100000, 1e9, 4000000, 3700000, 1e9, 1e9,
			4000000, 1e9, 1e9, 1500004, 1e9, 1e9, 1500004, 1e9, 4700000, 1400000,
			4700000, 4700000, 1200000, 1200000, 1100000, 1100000, 1600000, 3400000,
			3400000, 1600000, 500000, 4700000, 1400000, 4700000, 4700000, 1200000,
			1200000, 1e9, 1e9, 1600000, 3400000, 3400000, 1600000, 500000, 4700000,
			1400000, 4700000, 4700000, 7900000, 1200000, 1e9, 1e9, 1600000, 3400000,
			3400000, 1600000, 500000, 1800000, 400000, 400004, 100000, 1400000,
			300000, 1e9, 1e9, 300002, 1400000, 1500000, 400000, 100000, 1e9, 14500000,
			1e9, 1e9, 1e9, 14500000, 1e9, 1e9, 1800004, 1e9, 1e9, 1800004, 1e9,
			14000000, 14500000, 14000000, 14000000, 14000000, 14500000, 1e9, 1e9,
			1800004, 9200000, 12400000, 1800004, 3000000, 13300000, 15400000,
			13300000, 13300000, 13300000, 15400000, 1e9, 1e9, 1800002, 8800000,
			11800000, 1800002, 2900000, 1e9, 15400000, 1e9, 1e9, 1e9, 15400000, 1e9,
			1e9, 1e9, 1e9, 1e9, 1e9, 1e9, 4800000, 4800000, 4800000, 4800000, 7900000,
			4800000, 1e9, 1e9, 1500004, 3500000, 3500000, 1500004, 500000, 3100000,
			400000, 400004, 3100000, 1200000, 300000, 1e9, 1e9, 100000, 1800000,
			1800000, 100000, 200000, 5700000, 5000000, 5700000, 5700000, 7900000,
			5000000, 1e9, 1e9, 2600002, 4300000, 4400000, 2600002, 700000, 12100000,
			13700000, 12100000, 12100000, 12100000, 13700000, 1e9, 1e9, 2600002,
			8100000, 10700000, 2600002, 2500000, 1800000, 400000, 400004, 100000,
			1200000, 300000, 1e9, 1e9, 100000, 1400000, 1500000, 100000, 100000, 1e9,
			14600000, 1e9, 1e9, 1e9, 14600000, 1e9, 1e9, 1e9, 1e9, 1e9, 1e9, 1e9,
			5700000, 2600000, 5700000, 5700000, 7900000, 2600000, 1e9, 1e9, 800000,
			4300000, 4400000, 800000, 700000, 5700000, 600000, 5700000, 5700000,
			7900000, 600000, 1e9, 1e9, 800000, 4300000, 4400000, 800000, 700000,
			14800000, 7900000, 14800000, 14800000, 14800000, 7500000, 1e9, 1e9,
			1500004, 9900000, 13200000, 1500004, 1e9, 6400000, 7900000, 6400000,
			6400000, 7900000, 7000000, 1e9, 1e9, 1500004, 4700000, 5100000, 1500004,
			900000, 8700000, 7900000, 8700000, 8700000, 8700000, 7000000, 1e9, 1e9,
			1200002, 6200000, 7300000, 1200001, 1400000, 2500000, 4600000, 400004,
			2500000, 7900000, 4600000, 1e9, 1e9, 700000, 1400000, 1500000, 700000,
			100005, 1e9, 13200000, 1e9, 1e9, 1e9, 13200000, 1e9, 1e9, 1e9, 1e9, 1e9,
			1e9, 1e9, 6200000, 4600000, 6200000, 6200000, 7900000, 4600000, 1e9, 1e9,
			800000, 4600000, 4900000, 800000, 800000, 9900000, 10800000, 9900000,
			9900000, 9900000, 10800000, 1e9, 1e9, 700000, 6800000, 8500000, 700000,
			1800000, 9900000, 4600000, 9900000, 9900000, 9900000, 4600000, 1e9, 1e9,
			700000, 6800000, 8500000, 700000, 1800000, 14600000, 12100000, 14600000,
			14600000, 14600000, 12100000, 1e9, 1e9, 1500000, 9700000, 13000000,
			1500000, 1e9, 14500000, 5500000, 14500000, 14500000, 14500000, 5500000,
			1e9, 1e9, 1e9, 9600000, 12900000, 1e9, 1e9, 4800000, 4100000, 4800000,
			4800000, 7900000, 4100000, 1e9, 1e9, 1300004, 3500000, 3500000, 1300001,
			500000, 1800000, 4400000, 400004, 1200000, 7900000, 4400000, 1e9, 1e9,
			700000, 1400000, 1500000, 700000, 100000, 1800000, 4100000, 400004,
			1200000, 7900000, 4100000, 1e9, 1e9, 1300004, 1400000, 1500000, 1300001,
			100000, 1800000, 700000, 400004, 100000, 1200000, 700000, 1100000,
			1100000, 100000, 1400000, 1500000, 100003, 100000, 1800000, 4600000,
			400004, 400000, 7900000, 100000, 1e9, 1e9, 400002, 1400000, 1500000,
			500000, 100000, 1800000, 4600000, 400004, 1300000, 7900000, 100000, 1e9,
			1e9, 600000, 1400000, 1500000, 600000, 100000, 3100000, 5000000, 400004,
			3100000, 7900000, 5000000, 1e9, 1e9, 400002, 1800000, 1800000, 500000,
			200000, 1800000, 400000, 400004, 200000, 1200000, 300005, 1e9, 1e9,
			100000, 1400000, 1500000, 100001, 100000, 1800000, 400000, 400004, 100000,
			1200000, 100000, 400000, 400000, 100000, 1100000, 700000, 100000, 100000,
			1e9, 6400000, 1e9, 1e9, 1e9, 6400000, 1e9, 1e9, 1700000, 1e9, 1e9,
			1700000, 1e9, 1e9, 1900000, 1e9, 1e9, 1e9, 1900000, 1e9, 1e9, 1700000,
			1e9, 1e9, 1700000, 1e9, 10900000, 11700000, 10900000, 10900000, 10900000,
			11700000, 1e9, 1e9, 1e9, 7400000, 9500000, 1e9, 2100000, 3300000, 7900000,
			400004, 3300000, 7900000, 7400000, 600000, 600000, 1200002, 2000000,
			2000000, 1200001, 200000, 8700000, 7900000, 8700000, 8700000, 8700000,
			7400000, 1e9, 1e9, 1200002, 6200000, 7300000, 1200001, 1400000, 7100000,
			7900000, 7100000, 7100000, 7900000, 7400000, 1e9, 1e9, 1800002, 5000000,
			5800000, 1800002, 1000000, 3300000, 7900000, 400004, 3300000, 7900000,
			7400000, 1e9, 1e9, 1200002, 2000000, 2000000, 1200001, 200000, 13000000,
			12100000, 13000000, 13000000, 13000000, 12100000, 1e9, 1e9, 1700004,
			8600000, 11500000, 1700004, 2800000, 11400000, 12100000, 11400000,
			11400000, 11400000, 12100000, 1e9, 1e9, 1700005, 7600000, 10000000,
			1700005, 2300000, 11400000, 12400000, 11400000, 11400000, 11400000,
			12400000, 1e9, 1e9, 1700004, 7600000, 10000000, 1700004, 2300000,
			11700000, 1e9, 11700000, 11700000, 11700000, 1e9, 1e9, 1e9, 2600000,
			7800000, 10300000, 2600000, 2400000, 13000000, 12100000, 13000000,
			13000000, 13000000, 12100000, 1e9, 1e9, 1700005, 8600000, 11500000,
			1700005, 2800000, 13000000, 12400000, 13000000, 13000000, 13000000,
			12400000, 1e9, 1e9, 1700004, 8600000, 11500000, 1700004, 2800000,
			13000000, 12400000, 13000000, 13000000, 13000000, 12400000, 1e9, 1e9,
			1700005, 8600000, 11500000, 1700005, 2800000, 13000000, 1e9, 13000000,
			13000000, 13000000, 1e9, 1e9, 1e9, 2600000, 8600000, 11500000, 2600000,
			2800000, 3600000, 5200000, 3700000, 3600000, 1200000, 5200000, 1100000,
			1100000, 900003, 2400000, 2300000, 1300000, 300000, 3600000, 5200000,
			3700000, 3600000, 1200000, 5200000, 1100000, 1100000, 1300000, 2400000,
			2300000, 1300000, 300000, 5500000, 1e9, 5500000, 5500000, 7900000, 1e9,
			1e9, 1e9, 1e9, 4200000, 4200000, 1e9, 600000, 5600000, 8500000, 5600000,
			5600000, 1200000, 8500000, 1100000, 1100000, 1300000, 4300000, 4300000,
			1300000, 600000, 1800000, 400000, 400004, 100000, 1200000, 300005, 1e9,
			1e9, 300002, 1400000, 1500000, 300001, 100000, 11800000, 5500000,
			11800000, 11800000, 11800000, 5500000, 1e9, 1e9, 1100000, 7900000,
			10400000, 1100000, 2500000, 11800000, 12500000, 11800000, 11800000,
			11800000, 12500000, 1e9, 1e9, 1300004, 7900000, 10400000, 1300001,
			2500000, 6400000, 5500000, 6400000, 6400000, 7900000, 5500000, 1e9, 1e9,
			1100000, 4700000, 5100000, 1100000, 900000, 1800000, 400000, 400004,
			100000, 1200000, 300005, 1100000, 1100000, 100000, 1400000, 1500000,
			200000, 100000, 1800000, 1000000, 400004, 1200000, 1200000, 1000000, 1e9,
			1e9, 300002, 1400000, 1500000, 400000, 100000, 1800000, 400000, 400004,
			100000, 1200000, 400000, 1e9, 1e9, 200000, 1400000, 1500000, 300001,
			100000, 3700000, 400000, 3700000, 3700000, 1200000, 400000, 1e9, 1e9,
			1000000, 2400000, 2400000, 1000000, 300000, 11700000, 12900000, 11700000,
			11700000, 11700000, 12900000, 1e9, 1e9, 1700004, 7800000, 10300000,
			1700004, 2400000, 1800000, 400000, 400004, 100000, 1200000, 400000,
			1100000, 1100000, 200000, 1400000, 1500000, 300001, 100000, 1800000,
			400000, 400004, 200000, 1200000, 100000, 1100000, 1100000, 100000,
			1400000, 1500000, 100003, 100000, 4800000, 5000000, 4800000, 4800000,
			7900000, 5000000, 1e9, 1e9, 1100000, 3500000, 3500000, 1100000, 500000,
			11800000, 9700000, 11800000, 11800000, 11800000, 9700000, 1e9, 1e9,
			1700002, 7900000, 10400000, 1700002, 2500000, 2700000, 400000, 400004,
			2700000, 1200000, 100000, 900000, 900000, 700000, 1500000, 1500000,
			700000, 100005, 1800000, 400000, 100000, 100000, 1200000, 100000, 300000,
			300000, 100000, 1000001, 300005, 100000, 100000, 1800000, 400000, 200000,
			200000, 1200000, 300006, 900000, 900000, 300002, 1400000, 1500000, 400000,
			100000, 10800000, 10100000, 10800000, 10800000, 10800000, 10100000, 1e9,
			1e9, 1500004, 7300000, 9400000, 1500004, 2100000, 10600000, 9700000,
			10600000, 10600000, 10600000, 9700000, 1e9, 1e9, 1500004, 7200000,
			9200000, 1500004, 2000000, 10900000, 12000000, 10900000, 10900000,
			10900000, 12000000, 1e9, 1e9, 1600004, 7400000, 9500000, 1600004, 2100000,
			6300000, 4900000, 6300000, 6300000, 7900000, 4900000, 1e9, 1e9, 1300004,
			4600000, 5000000, 1300001, 800000, 11800000, 14700000, 11800000, 11800000,
			11800000, 14700000, 1e9, 1e9, 1700002, 7900000, 10400000, 1700002,
			2500000, 11100000, 14700000, 11100000, 11100000, 11100000, 14700000, 1e9,
			1e9, 1700002, 7500000, 9700000, 1700002, 2200000, 1800000, 400000, 200000,
			400000, 1200000, 300006, 900000, 900000, 400000, 1200000, 1100006, 500000,
			100000, 11100000, 12000000, 11100000, 11100000, 11100000, 12000000, 1e9,
			1e9, 1600004, 7500000, 9700000, 1600004, 2200000, 1800000, 1400000,
			200000, 200000, 1200000, 1300000, 900000, 900000, 300002, 1400000,
			1500000, 400000, 100000, 2500000, 1900000, 400004, 2000000, 1200000,
			1900000, 900000, 900000, 600000, 1400000, 2000000, 600000, 100005,
			2600000, 1900000, 100005, 2600000, 1600000, 1900000, 1e9, 1e9, 700000,
			1400000, 1500000, 700000, 100005, 2600000, 1900000, 400004, 2600000,
			1200000, 1900000, 1000000, 1000000, 700000, 1400000, 1500000, 700000,
			100005, 5300000, 400000, 5300000, 5300000, 7900000, 100000, 1e9, 1e9, 1e9,
			4100000, 4000000, 1600000, 600000, 1800000, 400000, 400004, 100000,
			1200000, 100000, 1000000, 1000000, 1e9, 1400000, 1500000, 200000, 100000,
			1800000, 2100000, 400004, 100000, 1200000, 2100000, 1000000, 1000000, 1e9,
			1400000, 1500000, 200000, 100000, 4900000, 3100000, 5000000, 4900000,
			1500000, 3100000, 1e9, 1e9, 900003, 3600000, 3600000, 900001, 500000,
			1800000, 1500000, 400004, 600000, 7900000, 1500000, 1e9, 1e9, 500000,
			1400000, 1500000, 500001, 100000, 12500000, 14400000, 12500000, 12500000,
			12500000, 14400000, 1e9, 1e9, 1800002, 8300000, 11100000, 1800002,
			2700000, 13700000, 14400000, 13700000, 13700000, 13700000, 14400000, 1e9,
			1e9, 1800004, 9000000, 12100000, 1800004, 3000000, 11100000, 14400000,
			11100000, 11100000, 11100000, 14400000, 1e9, 1e9, 1800000, 7500000,
			9700000, 1800000, 2200000, 1800000, 400000, 400004, 100000, 1200000,
			100000, 1000000, 1000000, 100000, 1000001, 400000, 100003, 100000,
			7600000, 7900000, 7600000, 7600000, 7900000, 6900000, 1e9, 1e9, 1300004,
			5400000, 6200000, 1300001, 1200000, 11400000, 12400000, 11400000,
			11400000, 11400000, 12400000, 1e9, 1e9, 1800000, 7600000, 10000000,
			1800000, 2300000, 1800000, 400000, 400004, 100000, 1200000, 100000,
			500005, 500005, 100000, 1000001, 400000, 100000, 100000, 1800000, 400000,
			3700000, 100000, 1200000, 100000, 600000, 600000, 100000, 1400000, 400000,
			100000, 100000, 1800000, 400000, 3700000, 100000, 1200000, 300005, 800000,
			800000, 100000, 1400000, 900005, 300000, 100000, 1800000, 400000, 3700000,
			100000, 1200000, 300000, 800000, 800000, 100000, 1400000, 800000, 300000,
			100000, 1e9, 12400000, 1e9, 1e9, 1e9, 12400000, 1e9, 1e9, 1e9, 1e9, 1e9,
			1e9, 1e9, 3600000, 3600000, 3700000, 3600000, 7900000, 3600000, 1e9, 1e9,
			900003, 2400000, 2300000, 900001, 300000, 1e9, 1e9, 1e9, 15200000,
			15200000, 1e9, 1e9, 1e9, 1e9, 1e9, 13600000, 1e9, 1e9, 11900000, 1e9,
			11900000, 11900000, 11900000, 1e9, 1e9, 1e9, 1e9, 7900000, 10500000, 1e9,
			2500000, 1800000, 1500000, 400004, 100000, 1200000, 1500000, 1100000,
			1100000, 200000, 1400000, 1500000, 300000, 100000, 1800000, 6700000,
			400004, 100000, 1200000, 6700000, 1100000, 1100000, 200000, 1400000,
			1500000, 300000, 100000, 4400000, 1500000, 4400000, 4400000, 1200000,
			1500000, 500005, 500005, 900000, 3200000, 3100000, 900000, 400000,
			1800000, 400000, 400004, 100000, 1200000, 100000, 600000, 600000, 100000,
			1400000, 300005, 100000, 100000, 4800000, 4300000, 4800000, 4800000,
			1200000, 4300000, 1e9, 1e9, 900000, 3500000, 3500000, 900000, 500000,
			13200000, 4300000, 13200000, 13200000, 13200000, 4300000, 1e9, 1e9,
			1800004, 8700000, 11700000, 1800004, 2900000
		])
);

/** @type {Map<string, number>} */
const SUPPORTED_FROM = new Map([
	["colorHexAlpha", 0],
	["gradientDoublePosition", 1],
	["displayTwoValues", 2],
	["systemUiFont", 3],
	["isSelector", 4],
	["langArgumentList", 5],
	["notSelectorList", 6],
	["whereSelector", 4],
	["dirSelector", 7],
	["customMedia", 8],
	["nesting", 9],
	["textDecorationColorStyle", 10],
	["textDecorationThickness", 11],
	["colorFunction", 12],
	["colorMix", 13],
	["hwbColors", 14],
	["lightDark", 15],
	["labColors", 12],
	["oklabColors", 16],
	["insetShorthand", 17],
	["mediaQueryRange", 18],
	["overflowTwoValues", 19],
	["placeShorthand", 20]
]);

// When each browser first read a pseudo-class or pseudo-element, by the spelling
// a selector carries. A pseudo missing here is one no target is known to read,
// so it never joins a selector list.
/** @type {() => Map<string, number>} */
const getSelectorSupportedFrom = memoize(
	() =>
		new Map([
			["::after", 21],
			["::backdrop", 22],
			["::before", 23],
			["::checkmark", 24],
			["::cue", 25],
			["::cue(", 25],
			["::details-content", 26],
			["::file-selector-button", 27],
			["::first-letter", 28],
			["::first-line", 29],
			["::grammar-error", 30],
			["::highlight(", 31],
			["::marker", 32],
			["::part(", 33],
			["::picker(", 34],
			["::picker-icon", 24],
			["::placeholder", 35],
			["::selection", 36],
			["::slotted(", 37],
			["::spelling-error", 30],
			["::target-text", 38],
			["::view-transition", 39],
			["::view-transition-group(", 39],
			["::view-transition-image-pair(", 39],
			["::view-transition-new(", 39],
			["::view-transition-old(", 39],
			[":active", 40],
			[":active-view-transition", 41],
			[":active-view-transition-type(", 42],
			[":any-link", 43],
			[":autofill", 44],
			[":buffering", 45],
			[":checked", 46],
			[":default", 47],
			[":defined", 48],
			[":dir(", 7],
			[":disabled", 46],
			[":empty", 49],
			[":enabled", 46],
			[":first-child", 50],
			[":first-of-type", 51],
			[":focus", 52],
			[":focus-visible", 53],
			[":focus-within", 54],
			[":fullscreen", 55],
			[":future", 56],
			[":has(", 57],
			[":has-slotted", 58],
			[":host", 48],
			[":host(", 48],
			[":host-context(", 59],
			[":hover", 60],
			[":in-range", 61],
			[":indeterminate", 62],
			[":invalid", 63],
			[":is(", 4],
			[":lang(", 64],
			[":last-child", 65],
			[":last-of-type", 51],
			[":link", 66],
			[":modal", 67],
			[":muted", 45],
			[":not(", 49],
			[":nth-child(", 68],
			[":nth-last-child(", 69],
			[":nth-last-of-type(", 70],
			[":nth-of-type(", 51],
			[":only-child", 71],
			[":only-of-type", 51],
			[":open", 72],
			[":optional", 63],
			[":out-of-range", 61],
			[":past", 56],
			[":paused", 45],
			[":picture-in-picture", 73],
			[":placeholder-shown", 74],
			[":playing", 45],
			[":popover-open", 75],
			[":read-only", 76],
			[":read-write", 76],
			[":required", 77],
			[":root", 78],
			[":scope", 79],
			[":seeking", 45],
			[":stalled", 45],
			[":state(", 80],
			[":target", 81],
			[":user-invalid", 82],
			[":user-valid", 82],
			[":valid", 63],
			[":visited", 83],
			[":volume-locked", 45],
			[":where(", 4]
		])
);

// When each browser first read a value a declaration may name, as
// `property:keyword index keyword index|...` with the color functions under no
// property. A value missing here is one no target is known to read.
const getValueSupportPacked = memoize(
	() =>
		"accent-color:auto 84|align-content:baseline 85 center 86 end 87 flex-end 86 flex-start 86 normal 88 safe 89 space-around 90 space-between 90 space-evenly 90 start 87 stretch 91 unsafe 89|align-items:anchor-center 92 baseline 93 center 86 end 94 flex-end 86 flex-start 86 normal 95 safe 89 self-end 87 self-start 87 start 94 stretch 91 unsafe 89|align-self:anchor-center 92 auto 95 baseline 93 center 86 end 96 flex-end 86 flex-start 86 normal 95 safe 89 self-end 87 self-start 87 start 96 stretch 95 unsafe 89|alignment-baseline:alphabetic 97 baseline 98 central 97 ideographic 97 mathematical 97 middle 98 text-after-edge 99 text-before-edge 99|animation:alternate 100 alternate-reverse 100 auto 100 backwards 100 both 100 ease 100 ease-in 100 ease-in-out 100 ease-out 100 forwards 100 infinite 100 linear 100 none 100 normal 100 paused 101 reverse 100 running 101 step-end 100 step-start 100|animation-composition:accumulate 102 add 102 replace 102|animation-direction:alternate 103 alternate-reverse 104 normal 103 reverse 104|animation-duration:auto 105|animation-fill-mode:backwards 106 both 106 forwards 106 none 106|animation-iteration-count:infinite 103|animation-name:none 103|animation-play-state:paused 103 running 103|animation-timing-function:ease 100 ease-in 100 ease-in-out 100 ease-out 100 linear 100 step-end 100 step-start 100|animation-trigger:none 107|appearance:auto 108 button 109 checkbox 109 listbox 109 menulist 109 menulist-button 110 meter 109 none 111 progress-bar 109 radio 109 searchfield 109 textarea 109 textfield 112|aspect-ratio:auto 113|backdrop-filter:none 114|backface-visibility:hidden 115 visible 115|background:border-box 116 bottom 116 center 116 content-box 116 fixed 117 left 116 local 118 no-repeat 118 none 118 padding-box 116 repeat 118 repeat-x 118 repeat-y 118 right 116 round 118 scroll 118 space 118 top 116|background-attachment:fixed 119 local 120 scroll 121|background-blend-mode:color 122 color-burn 122 color-dodge 122 darken 122 difference 122 exclusion 122 hard-light 122 hue 122 lighten 122 luminosity 122 multiply 122 normal 122 overlay 122 saturation 122 screen 122 soft-light 122|background-clip:border-area 123 border-box 124 content-box 125 padding-box 124 text 126|background-image:none 127|background-origin:border-box 124 content-box 128 padding-box 124|background-position:bottom 129 center 129 left 129 right 129 top 129|background-position-x:center 130 left 130 right 130 x-end 131 x-start 131|background-position-y:bottom 130 center 130 top 130 y-end 131 y-start 131|background-repeat:no-repeat 127 repeat 127 repeat-x 127 repeat-y 127 round 132 space 132|background-size:auto 133 contain 134 cover 134|baseline-shift:baseline 135 sub 136 super 136|baseline-source:auto 137 first 137 last 137|block-size:auto 138 fit-content 139 max-content 140 min-content 140|border:dashed 118 dotted 118 double 118 groove 118 hidden 118 inset 118 medium 118 none 118 outset 118 ridge 118 solid 118 thick 118 thin 118|border-block:dashed 17 dotted 17 double 17 groove 17 hidden 17 inset 17 medium 17 none 17 outset 17 ridge 17 solid 17 thick 17 thin 17|border-block-end:dashed 141 dotted 141 double 141 groove 141 hidden 141 inset 141 medium 141 none 141 outset 141 ridge 141 solid 141 thick 141 thin 141|border-block-end-style:dashed 141 dotted 141 double 141 groove 141 hidden 141 inset 141 none 141 outset 141 ridge 141 solid 141|border-block-end-width:medium 141 thick 141 thin 141|border-block-start:dashed 141 dotted 141 double 141 groove 141 hidden 141 inset 141 medium 141 none 141 outset 141 ridge 141 solid 141 thick 141 thin 141|border-block-start-style:dashed 141 dotted 141 double 141 groove 141 hidden 141 inset 141 none 141 outset 141 ridge 141 solid 141|border-block-start-width:medium 141 thick 141 thin 141|border-block-style:dashed 17 dotted 17 double 17 groove 17 hidden 17 inset 17 none 17 outset 17 ridge 17 solid 17|border-block-width:medium 17 thick 17 thin 17|border-bottom:dashed 118 dotted 118 double 118 groove 118 hidden 118 inset 118 medium 118 none 118 outset 118 ridge 118 solid 118 thick 118 thin 118|border-bottom-style:dashed 118 dotted 118 double 118 groove 118 hidden 118 inset 118 none 118 outset 118 ridge 118 solid 118|border-bottom-width:medium 118 thick 118 thin 118|border-collapse:collapse 142 separate 142|border-image:fill 143 none 144 repeat 144 round 144 space 144 stretch 144|border-image-repeat:repeat 145 round 146 space 147 stretch 145|border-image-source:none 148|border-image-width:auto 143|border-inline:dashed 17 dotted 17 double 17 groove 17 hidden 17 inset 17 medium 17 none 17 outset 17 ridge 17 solid 17 thick 17 thin 17|border-inline-end:dashed 141 dotted 141 double 141 groove 141 hidden 141 inset 141 medium 141 none 141 outset 141 ridge 141 solid 141 thick 141 thin 141|border-inline-end-style:dashed 141 dotted 141 double 141 groove 141 hidden 141 inset 141 none 141 outset 141 ridge 141 solid 141|border-inline-end-width:medium 141 thick 141 thin 141|border-inline-start:dashed 141 dotted 141 double 141 groove 141 hidden 141 inset 141 medium 141 none 141 outset 141 ridge 141 solid 141 thick 141 thin 141|border-inline-start-style:dashed 141 dotted 141 double 141 groove 141 hidden 141 inset 141 none 141 outset 141 ridge 141 solid 141|border-inline-start-width:medium 141 thick 141 thin 141|border-inline-style:dashed 17 dotted 17 double 17 groove 17 hidden 17 inset 17 none 17 outset 17 ridge 17 solid 17|border-inline-width:medium 17 thick 17 thin 17|border-left:dashed 118 dotted 118 double 118 groove 118 hidden 118 inset 118 medium 118 none 118 outset 118 ridge 118 solid 118 thick 118 thin 118|border-left-style:dashed 149 dotted 149 double 149 groove 149 hidden 149 inset 149 none 149 outset 149 ridge 149 solid 149|border-left-width:medium 118 thick 118 thin 118|border-right:dashed 118 dotted 118 double 118 groove 118 hidden 118 inset 118 medium 118 none 118 outset 118 ridge 118 solid 118 thick 118 thin 118|border-right-style:dashed 149 dotted 149 double 149 groove 149 hidden 149 inset 149 none 149 outset 149 ridge 149 solid 149|border-right-width:medium 118 thick 118 thin 118|border-shape:none 150|border-style:dashed 151 dotted 151 double 151 groove 151 hidden 151 inset 151 none 151 outset 151 ridge 151 solid 151|border-top:dashed 118 dotted 118 double 118 groove 118 hidden 118 inset 118 medium 118 none 118 outset 118 ridge 118 solid 118 thick 118 thin 118|border-top-style:dashed 118 dotted 118 double 118 groove 118 hidden 118 inset 118 none 118 outset 118 ridge 118 solid 118|border-top-width:medium 118 thick 118 thin 118|border-width:medium 152 thick 152 thin 152|bottom:auto 151|box-decoration-break:clone 153 slice 153|box-shadow:inset 154 none 155|box-sizing:border-box 156 content-box 156|break-after:always 157 auto 158 avoid 159 avoid-column 160 avoid-page 160 column 160 left 158 page 158 recto 160 right 158 verso 160|break-before:always 157 auto 158 avoid 159 avoid-column 160 avoid-page 160 column 160 left 158 page 158 recto 160 right 158 verso 160|break-inside:auto 158 avoid 158 avoid-column 161 avoid-page 161|caption-side:bottom 129 top 129|caret-animation:auto 162 manual 162|caret-color:auto 163|caret-shape:auto 164 bar 164 block 164 underscore 164|clear:both 151 inline-end 165 inline-start 165 left 151 none 118 right 151|clip-path:border-box 166 content-box 166 fill-box 167 margin-box 166 none 168 padding-box 166 stroke-box 167 view-box 169|clip-rule:evenodd 170 nonzero 170|:color 12 color-mix 13 conic-gradient 181 env 223 hsl 65 hsla 274 hwb 14 if 278 lab 12 lch 12 light-dark 15 linear-gradient 298 oklab 16 oklch 16 param 8 radial-gradient 298 random-item 8 repeating-conic-gradient 181 repeating-linear-gradient 298 repeating-radial-gradient 298 rgb 83 var 467|color-interpolation-filters:auto 171 linearrgb 172 srgb 172|color-scheme:dark 173 light 173 normal 173 only 174|column-count:auto 175|column-fill:auto 176 balance 176|column-gap:normal 177|column-height:auto 178|column-rule:dashed 155 dotted 155 double 155 groove 155 hidden 155 inset 155 medium 155 none 155 outset 155 ridge 155 solid 155 thick 155 thin 155|column-rule-style:dashed 155 dotted 155 double 155 groove 155 hidden 155 inset 155 none 155 outset 155 ridge 155 solid 155|column-rule-width:medium 155 thick 155 thin 155|column-span:all 179 none 179|column-width:auto 175|column-wrap:auto 178 nowrap 178 wrap 178|columns:auto 180|contain:content 182 inline-size 183 layout 182 none 182 paint 182 size 182 strict 182 style 184|contain-intrinsic-block-size:none 185|contain-intrinsic-height:none 185|contain-intrinsic-inline-size:none 185|contain-intrinsic-size:none 185|contain-intrinsic-width:none 185|container:inline-size 186 none 186 normal 187 scroll-state 186 size 186|container-name:none 186|container-type:inline-size 186 normal 186 scroll-state 188 size 186|content:close-quote 118 no-close-quote 118 no-open-quote 118 none 151 normal 151 open-quote 118|content-visibility:auto 189 hidden 190 visible 190|corner-block-end-shape:bevel 191 notch 191 round 191 scoop 191 square 191 squircle 191|corner-block-start-shape:bevel 191 notch 191 round 191 scoop 191 square 191 squircle 191|corner-bottom-left-shape:bevel 191 notch 191 round 191 scoop 191 square 191 squircle 191|corner-bottom-right-shape:bevel 191 notch 191 round 191 scoop 191 square 191 squircle 191|corner-bottom-shape:bevel 191 notch 191 round 191 scoop 191 square 191 squircle 191|corner-end-end-shape:bevel 191 notch 191 round 191 scoop 191 square 191 squircle 191|corner-end-start-shape:bevel 191 notch 191 round 191 scoop 191 square 191 squircle 191|corner-inline-end-shape:bevel 191 notch 191 round 191 scoop 191 square 191 squircle 191|corner-inline-start-shape:bevel 191 notch 191 round 191 scoop 191 square 191 squircle 191|corner-left-shape:bevel 191 notch 191 round 191 scoop 191 square 191 squircle 191|corner-right-shape:bevel 191 notch 191 round 191 scoop 191 square 191 squircle 191|corner-shape:bevel 191 notch 191 round 191 scoop 191 square 191 squircle 191|corner-start-end-shape:bevel 191 notch 191 round 191 scoop 191 square 191 squircle 191|corner-start-start-shape:bevel 191 notch 191 round 191 scoop 191 square 191 squircle 191|corner-top-left-shape:bevel 191 notch 191 round 191 scoop 191 square 191 squircle 191|corner-top-right-shape:bevel 191 notch 191 round 191 scoop 191 square 191 squircle 191|corner-top-shape:bevel 191 notch 191 round 191 scoop 191 square 191 squircle 191|counter-increment:none 192|counter-reset:none 192|counter-set:none 193|cursor:alias 194 all-scroll 195 auto 196 cell 197 col-resize 195 context-menu 194 copy 194 crosshair 198 default 198 e-resize 198 ew-resize 194 grab 199 grabbing 200 help 198 move 198 n-resize 198 ne-resize 198 nesw-resize 194 no-drop 195 none 201 not-allowed 195 ns-resize 194 nw-resize 198 nwse-resize 194 pointer 202 progress 202 row-resize 195 s-resize 198 se-resize 198 sw-resize 198 text 196 vertical-text 203 w-resize 198 wait 198 zoom-in 204 zoom-out 204|d:none 205|direction:ltr 206 rtl 206|display:block 207 contents 208 flex 209 flow-root 210 grid 211 inline 207 inline-block 212 inline-flex 209 inline-grid 211 inline-table 213 list-item 214 none 207 ruby 215 ruby-base 216 ruby-base-container 216 ruby-text 215 ruby-text-container 216 table 212 table-caption 217 table-cell 212 table-column 212 table-column-group 212 table-footer-group 212 table-header-group 212 table-row 212 table-row-group 212|dominant-baseline:alphabetic 218 auto 218 central 218 hanging 218 ideographic 218 mathematical 218 middle 218 text-bottom 219 text-top 219|dynamic-range-limit:constrained 220 no-limit 221 standard 221|empty-cells:hide 222 show 222|fill:none 224|fill-rule:evenodd 224 nonzero 224|filter:none 225|flex:auto 226 content 227 fit-content 228 max-content 229 min-content 229 none 230|flex-basis:auto 231 content 232 fit-content 228 max-content 229 min-content 229|flex-direction:column 230 column-reverse 233 row 230 row-reverse 233|flex-flow:balance 234 column 235 column-reverse 235 nowrap 235 row 235 row-reverse 235 wrap 235 wrap-reverse 235|flex-wrap:balance 234 nowrap 236 wrap 236 wrap-reverse 236|float:inline-end 165 inline-start 165 left 151 none 151 right 151|font:caption 237 icon 237 menu 237 message-box 237 small-caption 237 status-bar 237|font-family:cursive 118 fantasy 118 math 238 monospace 118 sans-serif 118 serif 118 system-ui 3 ui-monospace 239 ui-rounded 239 ui-sans-serif 239 ui-serif 239|font-feature-settings:normal 240|font-kerning:auto 241 none 241 normal 241|font-language-override:normal 242|font-optical-sizing:auto 243 none 243|font-palette:dark 244 light 244 normal 244|font-size:large 245 larger 245 math 246 medium 245 small 245 smaller 245 x-large 245 x-small 245 xx-large 245 xx-small 245 xxx-large 247|font-size-adjust:from-font 248 none 249|font-style:italic 151 normal 151 oblique 118|font-synthesis:none 250 position 251 small-caps 252 style 253 weight 253|font-synthesis-small-caps:auto 254 none 254|font-synthesis-style:auto 254 none 254|font-synthesis-weight:auto 254 none 254|font-variant:all-petite-caps 255 all-small-caps 255 common-ligatures 256 contextual 256 diagonal-fractions 255 discretionary-ligatures 256 full-width 257 historical-forms 258 historical-ligatures 256 jis04 257 jis78 257 jis83 257 jis90 257 lining-nums 255 no-common-ligatures 256 no-contextual 256 no-discretionary-ligatures 256 no-historical-ligatures 256 none 259 normal 151 oldstyle-nums 255 ordinal 255 petite-caps 255 proportional-nums 255 proportional-width 257 ruby 257 simplified 257 slashed-zero 255 small-caps 255 stacked-fractions 255 tabular-nums 255 titling-caps 255 traditional 257 unicase 255|font-variant-alternates:historical-forms 258 normal 258|font-variant-caps:all-petite-caps 255 all-small-caps 255 normal 255 petite-caps 255 small-caps 255 titling-caps 255 unicase 255|font-variant-east-asian:full-width 257 jis04 257 jis78 257 jis83 257 jis90 257 normal 257 proportional-width 257 ruby 257 simplified 257 traditional 257|font-variant-emoji:emoji 260 normal 260 text 260 unicode 260|font-variant-ligatures:common-ligatures 256 contextual 256 discretionary-ligatures 256 historical-ligatures 256 no-common-ligatures 256 no-contextual 256 no-discretionary-ligatures 256 no-historical-ligatures 256 none 256 normal 256|font-variant-numeric:diagonal-fractions 255 lining-nums 255 normal 255 oldstyle-nums 255 ordinal 255 proportional-nums 255 slashed-zero 255 stacked-fractions 255 tabular-nums 255|font-variant-position:normal 261 sub 261 super 261|font-variation-settings:normal 262|font-weight:bold 206 bolder 206 lighter 206 normal 206|forced-color-adjust:auto 263 none 263 preserve-parent-color 264|frame-sizing:auto 265 content-block-size 265 content-height 265 content-inline-size 265 content-width 265|gap:normal 266|grid:none 266|grid-area:auto 266|grid-auto-columns:auto 266 max-content 267 min-content 267|grid-auto-flow:column 268 dense 268 row 268|grid-auto-rows:auto 266 max-content 267 min-content 267|grid-column:auto 266|grid-column-end:auto 266|grid-column-start:auto 266|grid-row:auto 266|grid-row-end:auto 266|grid-row-start:auto 266|grid-template:none 268|grid-template-areas:none 268|grid-template-columns:auto 268 max-content 268 min-content 268 none 268 subgrid 269|grid-template-rows:auto 268 max-content 268 min-content 268 none 268 subgrid 269|hanging-punctuation:allow-end 270 first 270 force-end 271 last 270 none 270|height:auto 151 fit-content 272 max-content 273 min-content 273|hyphenate-character:auto 275|hyphenate-limit-chars:auto 276|hyphens:auto 277 manual 277 none 277|image-orientation:from-image 279|image-rendering:auto 280 crisp-edges 281 pixelated 282 smooth 283|initial-letter:normal 284|inline-size:auto 138 fit-content 285 max-content 140 min-content 140|inset:auto 17|inset-block:auto 286|inset-block-end:auto 286|inset-block-start:auto 286|inset-inline:auto 286|inset-inline-end:auto 286|inset-inline-start:auto 286|interactivity:auto 287 inert 287|interest-delay:normal 288|interest-delay-end:normal 288|interest-delay-start:normal 288|isolation:auto 289 isolate 289|justify-content:left 290 normal 290 right 290|justify-items:anchor-center 92 center 291 left 291 legacy 291 right 291|justify-self:anchor-center 92 auto 292 left 292 normal 292 right 292 stretch 292|left:auto 151|letter-spacing:normal 151|line-break:anywhere 293 auto 294 loose 295 normal 296 strict 295|line-clamp:none 297|line-height:normal 151|list-style:inside 118 none 118 outside 118|list-style-image:none 151|list-style-position:inside 151 outside 151|list-style-type:none 151|margin:auto 299|margin-block:auto 17|margin-block-end:auto 141|margin-block-start:auto 141|margin-bottom:auto 299|margin-inline:auto 17|margin-inline-end:auto 141|margin-inline-start:auto 141|margin-left:auto 299|margin-right:auto 299|margin-top:auto 299|marker:none 224|marker-end:none 224|marker-mid:none 224|marker-start:none 224|mask:add 300 alpha 300 border-box 301 bottom 302 center 302 content-box 301 exclude 300 fill-box 301 intersect 300 left 302 luminance 300 match-source 300 no-clip 301 no-repeat 302 none 303 padding-box 301 repeat 302 repeat-x 302 repeat-y 302 right 302 round 302 space 302 stroke-box 301 subtract 300 top 302 view-box 301|mask-border:none 304 repeat 304 round 304 space 304 stretch 304|mask-border-repeat:repeat 304 round 304 space 304 stretch 304|mask-border-source:none 304|mask-border-width:auto 304|mask-clip:border-box 301 content-box 301 fill-box 301 no-clip 301 padding-box 301 stroke-box 301 view-box 301|mask-composite:add 300 exclude 300 intersect 300 subtract 300|mask-image:none 303|mask-mode:alpha 300 luminance 300 match-source 300|mask-origin:border-box 301 content-box 301 fill-box 301 padding-box 301 stroke-box 301 view-box 301|mask-position:bottom 302 center 302 left 302 right 302 top 302|mask-repeat:no-repeat 302 repeat 302 repeat-x 302 repeat-y 302 round 302 space 302|mask-size:auto 305 contain 305 cover 305|mask-type:alpha 306 luminance 306|math-depth:auto-add 246|math-style:compact 307 normal 307|max-block-size:fit-content 285 max-content 140 min-content 140 none 308|max-height:fit-content 309 max-content 273 min-content 273 none 310|max-inline-size:fit-content 285 max-content 311 min-content 311 none 308|max-width:fit-content 309 max-content 273 min-content 273 none 151|min-block-size:auto 308 fit-content 285 max-content 311 min-content 311|min-height:auto 312 fit-content 309 max-content 273 min-content 273|min-inline-size:auto 308 fit-content 285 max-content 311 min-content 311|min-width:auto 312 fit-content 272 max-content 313 min-content 313|mix-blend-mode:color 314 color-burn 315 color-dodge 315 darken 315 difference 315 exclusion 315 hard-light 315 hue 314 lighten 315 luminosity 314 multiply 315 normal 315 overlay 315 plus-darker 316 plus-lighter 317 saturation 314 screen 315 soft-light 315|object-fit:contain 318 cover 318 fill 318 none 318 scale-down 318|object-position:bottom 319 center 319 left 319 right 319 top 319|offset:auto 320 border-box 320 bottom 320 center 320 content-box 320 fill-box 320 left 320 none 321 normal 322 padding-box 320 right 320 stroke-box 320 top 320 view-box 320|offset-anchor:auto 323 bottom 323 center 323 left 323 right 323 top 323|offset-path:border-box 324 content-box 324 fill-box 324 none 325 padding-box 324 stroke-box 324 view-box 324|offset-position:auto 320 bottom 320 center 320 left 320 normal 326 right 320 top 320|offset-rotate:auto 327 reverse 327|outline:auto 328 dashed 329 dotted 329 double 329 groove 329 inset 329 medium 329 none 329 outset 329 ridge 329 solid 329 thick 329 thin 329|outline-style:auto 330 dashed 331 dotted 331 double 331 groove 331 inset 331 none 331 outset 331 ridge 331 solid 331|outline-width:medium 329 thick 329 thin 329|overflow:auto 156 clip 332 hidden 156 scroll 156 visible 156|overflow-anchor:auto 333 none 333|overflow-block:auto 334 clip 335 hidden 334 scroll 334 visible 334|overflow-clip-margin:border-box 336 content-box 336 padding-box 336|overflow-inline:auto 334 clip 335 hidden 334 scroll 334 visible 334|overflow-wrap:anywhere 337 break-word 338 normal 339|overflow-x:auto 340 clip 332 hidden 340 scroll 340 visible 340|overflow-y:auto 340 clip 332 hidden 340 scroll 340 visible 340|overscroll-behavior:auto 341 contain 341 none 341|overscroll-behavior-block:auto 342 contain 342 none 342|overscroll-behavior-inline:auto 342 contain 342 none 342|overscroll-behavior-x:auto 343 contain 343 none 341|overscroll-behavior-y:auto 343 contain 343 none 341|page:auto 344|paint-order:fill 345 markers 345 normal 345 stroke 345|path-length:none 8|perspective:none 346|perspective-origin:bottom 347 center 347 left 347 right 347 top 347|place-items:anchor-center 92|place-self:anchor-center 92|pointer-events:all 348 auto 348 fill 348 none 348 painted 348 stroke 348 visible 348 visiblefill 349 visiblepainted 349 visiblestroke 349|position:absolute 151 fixed 350 relative 151 static 151 sticky 351|print-color-adjust:economy 352 exact 352|quotes:auto 353 none 354|reading-flow:flex-flow 278 flex-visual 278 grid-columns 278 grid-order 278 grid-rows 278 normal 278 source-order 278|resize:block 355 both 356 horizontal 356 inline 355 none 356 vertical 356|right:auto 151|rotate:none 357|row-gap:normal 358|ruby-align:center 359 space-around 359 space-between 359 start 359|ruby-overhang:auto 360 none 360|ruby-position:alternate 361 inter-character 362 over 363 under 363|rx:auto 364|ry:auto 364|scale:none 357|scroll-axis-lock:auto 365 none 365|scroll-behavior:auto 366 smooth 366|scroll-marker-group:after 287 before 287 none 287|scroll-padding:auto 367|scroll-padding-block:auto 368|scroll-padding-block-end:auto 368|scroll-padding-block-start:auto 368|scroll-padding-bottom:auto 369|scroll-padding-inline:auto 368|scroll-padding-inline-end:auto 368|scroll-padding-inline-start:auto 368|scroll-padding-left:auto 369|scroll-padding-right:auto 369|scroll-padding-top:auto 369|scroll-snap-align:center 367 end 367 none 367 start 367|scroll-snap-stop:always 370 normal 370|scroll-snap-type:block 367 both 367 inline 367 none 371 x 367 y 367|scroll-target-group:auto 162 none 162|scrollbar-color:auto 372|scrollbar-gutter:auto 373 stable 373|scrollbar-width:auto 374 none 374 thin 374|shape-outside:border-box 375 content-box 375 margin-box 375 none 375 padding-box 375|shape-rendering:auto 376 crispedges 377 geometricprecision 377 optimizespeed 377|stroke:none 378|stroke-dasharray:none 378|stroke-linecap:butt 378 round 378 square 378|stroke-linejoin:bevel 378 miter 378 round 378|table-layout:auto 379 fixed 379|text-align:center 218 end 380 justify 151 left 218 match-parent 381 right 218 start 380|text-align-last:auto 382 center 383 end 384 justify 383 left 383 right 383 start 384|text-anchor:end 385 middle 385 start 385|text-autospace:auto 386 normal 387|text-box:alphabetic 388 auto 388 cap 388 ex 388 ideographic 389 ideographic-ink 389 none 388 normal 388 text 388 trim-both 388 trim-end 388 trim-start 388|text-box-edge:alphabetic 388 auto 388 cap 388 ex 388 ideographic 389 ideographic-ink 389 text 388|text-box-trim:none 388 trim-both 388 trim-end 388 trim-start 388|text-combine-upright:all 390 none 390|text-decoration:auto 11 blink 391 dashed 392 dotted 392 double 392 from-font 11 grammar-error 393 line-through 394 none 394 overline 394 solid 392 spelling-error 393 underline 394 wavy 392|text-decoration-inset:auto 395|text-decoration-line:blink 396 grammar-error 393 line-through 397 none 397 overline 397 spelling-error 393 underline 397|text-decoration-skip-ink:all 398 auto 399 none 399|text-decoration-style:dashed 397 dotted 397 double 397 solid 397 wavy 397|text-decoration-thickness:auto 400 from-font 400|text-emphasis:circle 401 dot 401 double-circle 401 filled 401 none 401 open 401 sesame 401 triangle 401|text-emphasis-position:auto 402 left 403 over 404 right 403 under 404|text-emphasis-style:circle 405 dot 405 double-circle 405 filled 405 none 405 open 405 sesame 405 triangle 405|text-fit:consistent 234 grow 234 none 234 per-line 234 per-line-all 234 shrink 234|text-indent:each-line 406 hanging 406|text-justify:auto 407 inter-character 407 inter-word 407 none 407|text-orientation:mixed 408 sideways 409 upright 410|text-overflow:clip 411 ellipsis 411|text-rendering:auto 412 geometricprecision 413 optimizelegibility 414 optimizespeed 414|text-shadow:none 415|text-transform:capitalize 416 full-size-kana 417 full-width 418 lowercase 151 math-auto 419 none 151 uppercase 151|text-underline-offset:auto 400|text-underline-position:auto 420 from-font 421 left 422 right 422 under 423|text-wrap:auto 424 balance 425 nowrap 426 pretty 427 stable 428 wrap 426|text-wrap-mode:nowrap 429 wrap 429|text-wrap-style:auto 430 balance 430 pretty 431 stable 430|timeline-trigger:auto 107 none 107 normal 107|timeline-trigger-activation-range:normal 107|timeline-trigger-activation-range-end:normal 107|timeline-trigger-activation-range-start:normal 107|timeline-trigger-active-range:auto 107 normal 107|timeline-trigger-active-range-end:auto 107 normal 107|timeline-trigger-active-range-start:auto 107 normal 107|timeline-trigger-name:none 107|timeline-trigger-source:auto 107 none 107|top:auto 151|touch-action:manipulation 432 none 433 pan-down 434 pan-left 434 pan-right 434 pan-up 434 pan-x 433 pan-y 433 pinch-zoom 435|transform:none 436|transform-box:border-box 437 content-box 438 fill-box 439 stroke-box 438 view-box 439|transform-origin:bottom 440 center 440 left 440 right 440 top 440|transform-style:flat 441 preserve-3d 441|transition:all 442 allow-discrete 443 ease 442 ease-in 442 ease-in-out 442 ease-out 442 linear 442 none 442 normal 443 step-end 442 step-start 442|transition-behavior:allow-discrete 444 normal 444|transition-property:all 445 none 445|transition-timing-function:ease 442 ease-in 442 ease-in-out 442 ease-out 442 linear 442 step-end 442 step-start 442|translate:none 357|trigger-scope:all 107 none 107|unicode-bidi:bidi-override 446 embed 446 isolate 447 isolate-override 447 normal 446 plaintext 447|unit:cap 448 ch 449 cm 450 cqb 186 cqh 186 cqi 186 cqmax 186 cqmin 186 cqw 186 deg 451 dvb 452 dvh 452 dvi 452 dvmax 452 dvmin 452 dvw 452 em 450 ex 83 grad 451 ic 453 in 450 lh 454 lvb 452 lvh 452 lvi 452 lvmax 452 lvmin 452 lvw 452 mm 450 pc 450 pt 450 px 450 q 455 rad 451 rcap 456 rch 457 rem 458 rex 457 ric 457 rlh 459 svb 452 svh 452 svi 452 svmax 452 svmin 452 svw 452 turn 460 vb 452 vh 461 vi 452 vmax 462 vmin 463 vw 461|user-select:all 464 auto 465 none 466 text 465|vector-effect:non-scaling-stroke 468 none 468|vertical-align:baseline 151 bottom 151 middle 151 sub 151 super 151 text-bottom 151 text-top 151 top 151|view-transition-class:none 469|view-transition-name:match-element 470 none 471|view-transition-scope:all 150 none 150|visibility:collapse 472 hidden 151 visible 151|white-space:break-spaces 473 collapse 474 normal 151 nowrap 475 pre 476 pre-line 477 pre-wrap 478 preserve 474 preserve-breaks 474 preserve-spaces 479 wrap 474|white-space-collapse:break-spaces 426 collapse 426 preserve 426 preserve-breaks 426 preserve-spaces 479|width:auto 151 fit-content 272 max-content 273 min-content 313|will-change:auto 480 contents 480 scroll-position 480|window-drag:move 481 none 481|word-break:auto-phrase 482 break-all 483 break-word 484 keep-all 485 normal 483|word-spacing:normal 486|writing-mode:horizontal-tb 487 sideways-lr 488 sideways-rl 488 vertical-lr 487 vertical-rl 487|z-index:auto 127|zoom:reset 8"
);

// WHY: The vendor spellings of a property's own keyword values, as `property ->
// keyword -> [spelling, [browserslistBrowser, from, to][]][]` — `display:flex`
// was `display:-webkit-flex`, and `width:max-content` `width:-moz-max-content`.
// Only keywords the property's syntax names are here, so a function whose older
// spelling read its arguments differently is not.
/** @type {() => Map<string, Map<string, [string, number][]>>} */
const getPrefixedValues = memoize(
	() =>
		new Map([
			[
				"block-size",
				new Map([
					[
						"fit-content",
						[
							["-moz-fit-content", 127],
							["-webkit-fit-content", 128]
						]
					],
					[
						"max-content",
						[
							["-moz-max-content", 129],
							["-webkit-max-content", 130]
						]
					],
					[
						"min-content",
						[
							["-moz-min-content", 129],
							["-webkit-min-content", 131]
						]
					]
				])
			],
			[
				"cursor",
				new Map([
					[
						"grab",
						[
							["-webkit-grab", 132],
							["-moz-grab", 133]
						]
					],
					["grabbing", [["-webkit-grabbing", 134]]],
					[
						"zoom-in",
						[
							["-webkit-zoom-in", 135],
							["-moz-zoom-in", 136]
						]
					],
					[
						"zoom-out",
						[
							["-webkit-zoom-out", 135],
							["-moz-zoom-out", 136]
						]
					]
				])
			],
			[
				"display",
				new Map([
					[
						"flex",
						[
							["-webkit-flex", 0],
							["-ms-flexbox", 137],
							["-webkit-box", 2],
							["-moz-box", 3]
						]
					],
					[
						"inline-flex",
						[
							["-webkit-inline-flex", 0],
							["-ms-inline-flexbox", 137],
							["-webkit-inline-box", 2],
							["-moz-inline-box", 3]
						]
					]
				])
			],
			[
				"flex-basis",
				new Map([
					["fit-content", [["-moz-fit-content", 138]]],
					["max-content", [["-moz-max-content", 139]]],
					["min-content", [["-moz-min-content", 139]]]
				])
			],
			[
				"height",
				new Map([
					[
						"fit-content",
						[
							["-moz-fit-content", 127],
							["-webkit-fit-content", 128]
						]
					],
					[
						"max-content",
						[
							["-moz-max-content", 129],
							["-webkit-max-content", 130]
						]
					],
					[
						"min-content",
						[
							["-moz-min-content", 129],
							["-webkit-min-content", 131]
						]
					]
				])
			],
			[
				"image-rendering",
				new Map([
					[
						"crisp-edges",
						[
							["-webkit-optimize-contrast", 140],
							["-moz-crisp-edges", 141]
						]
					]
				])
			],
			[
				"inline-size",
				new Map([
					[
						"fit-content",
						[
							["-moz-fit-content", 127],
							["-webkit-fit-content", 128]
						]
					],
					[
						"max-content",
						[
							["-moz-max-content", 129],
							["-webkit-max-content", 130]
						]
					],
					[
						"min-content",
						[
							["-moz-min-content", 129],
							["-webkit-min-content", 131]
						]
					]
				])
			],
			[
				"max-block-size",
				new Map([
					[
						"fit-content",
						[
							["-webkit-fit-content", 142],
							["-moz-fit-content", 127]
						]
					],
					[
						"max-content",
						[
							["-moz-max-content", 129],
							["-webkit-max-content", 143]
						]
					],
					[
						"min-content",
						[
							["-moz-min-content", 129],
							["-webkit-min-content", 144]
						]
					]
				])
			],
			[
				"max-height",
				new Map([
					[
						"fit-content",
						[
							["-webkit-fit-content", 142],
							["-moz-fit-content", 127]
						]
					],
					[
						"max-content",
						[
							["-moz-max-content", 129],
							["-webkit-max-content", 143]
						]
					],
					[
						"min-content",
						[
							["-moz-min-content", 129],
							["-webkit-min-content", 144]
						]
					]
				])
			],
			[
				"max-inline-size",
				new Map([
					[
						"fit-content",
						[
							["-webkit-fit-content", 142],
							["-moz-fit-content", 127]
						]
					],
					[
						"max-content",
						[
							["-moz-max-content", 129],
							["-webkit-max-content", 143]
						]
					],
					[
						"min-content",
						[
							["-moz-min-content", 129],
							["-webkit-min-content", 144]
						]
					]
				])
			],
			[
				"max-width",
				new Map([
					[
						"fit-content",
						[
							["-webkit-fit-content", 142],
							["-moz-fit-content", 127]
						]
					],
					[
						"max-content",
						[
							["-moz-max-content", 129],
							["-webkit-max-content", 143]
						]
					],
					[
						"min-content",
						[
							["-moz-min-content", 129],
							["-webkit-min-content", 144]
						]
					]
				])
			],
			[
				"min-block-size",
				new Map([
					[
						"fit-content",
						[
							["-moz-fit-content", 127],
							["-webkit-fit-content", 128]
						]
					],
					[
						"max-content",
						[
							["-moz-max-content", 129],
							["-webkit-max-content", 130]
						]
					],
					[
						"min-content",
						[
							["-moz-min-content", 129],
							["-webkit-min-content", 131]
						]
					]
				])
			],
			[
				"min-height",
				new Map([
					[
						"fit-content",
						[
							["-moz-fit-content", 127],
							["-webkit-fit-content", 128]
						]
					],
					[
						"max-content",
						[
							["-moz-max-content", 129],
							["-webkit-max-content", 130]
						]
					],
					[
						"min-content",
						[
							["-moz-min-content", 129],
							["-webkit-min-content", 131]
						]
					]
				])
			],
			[
				"min-inline-size",
				new Map([
					[
						"fit-content",
						[
							["-moz-fit-content", 127],
							["-webkit-fit-content", 128]
						]
					],
					[
						"max-content",
						[
							["-moz-max-content", 129],
							["-webkit-max-content", 130]
						]
					],
					[
						"min-content",
						[
							["-moz-min-content", 129],
							["-webkit-min-content", 131]
						]
					]
				])
			],
			[
				"min-width",
				new Map([
					[
						"fit-content",
						[
							["-moz-fit-content", 127],
							["-webkit-fit-content", 128]
						]
					],
					[
						"max-content",
						[
							["-moz-max-content", 129],
							["-webkit-max-content", 130]
						]
					],
					[
						"min-content",
						[
							["-moz-min-content", 129],
							["-webkit-min-content", 131]
						]
					]
				])
			],
			["overflow", new Map([["clip", [["-moz-hidden-unscrollable", 145]]]])],
			[
				"overflow-block",
				new Map([["clip", [["-moz-hidden-unscrollable", 145]]]])
			],
			[
				"overflow-inline",
				new Map([["clip", [["-moz-hidden-unscrollable", 145]]]])
			],
			["overflow-x", new Map([["clip", [["-moz-hidden-unscrollable", 145]]]])],
			["overflow-y", new Map([["clip", [["-moz-hidden-unscrollable", 145]]]])],
			["position", new Map([["sticky", [["-webkit-sticky", 146]]]])],
			[
				"text-align",
				new Map([["match-parent", [["-webkit-match-parent", 147]]]])
			],
			[
				"unicode-bidi",
				new Map([
					[
						"isolate",
						[
							["-webkit-isolate", 148],
							["-moz-isolate", 149]
						]
					],
					[
						"isolate-override",
						[
							["-moz-isolate-override", 150],
							["-webkit-isolate-override", 151]
						]
					],
					[
						"plaintext",
						[
							["-moz-plaintext", 149],
							["-webkit-plaintext", 152]
						]
					]
				])
			],
			["white-space", new Map([["pre-wrap", [["-moz-pre-wrap", 153]]]])],
			[
				"width",
				new Map([
					[
						"fit-content",
						[
							["-moz-fit-content", 127],
							["-webkit-fit-content", 128]
						]
					],
					[
						"max-content",
						[
							["-moz-max-content", 129],
							["-webkit-max-content", 130]
						]
					],
					[
						"min-content",
						[
							["-moz-min-content", 129],
							["-webkit-min-content", 131]
						]
					]
				])
			]
		])
);

// WHY: The keywords a vendor spelling reads in place of the standard ones, as
// `spelling -> standard -> legacy` — IE 10's `-ms-flex-pack` reads
// `space-around` as `distribute`. Each map is the older property's whole
// grammar, so a value naming anything it does not is one that property cannot
// read and no copy is written.
/** @type {() => Map<string, Map<string, string>>} */
const getPrefixedSpellingKeywords = memoize(
	() =>
		new Map([
			[
				"-moz-box-align",
				new Map([
					["flex-start", "start"],
					["flex-end", "end"],
					["center", "center"],
					["baseline", "baseline"],
					["stretch", "stretch"]
				])
			],
			[
				"-moz-box-direction",
				new Map([
					["row", "normal"],
					["row-reverse", "reverse"],
					["column", "normal"],
					["column-reverse", "reverse"]
				])
			],
			[
				"-moz-box-flex",
				new Map([
					["auto", "1"],
					["none", "0"]
				])
			],
			["-moz-box-ordinal-group", new Map()],
			[
				"-moz-box-orient",
				new Map([
					["row", "horizontal"],
					["row-reverse", "horizontal"],
					["column", "vertical"],
					["column-reverse", "vertical"]
				])
			],
			[
				"-moz-box-pack",
				new Map([
					["flex-start", "start"],
					["flex-end", "end"],
					["center", "center"],
					["space-between", "justify"]
				])
			],
			[
				"-ms-flex-align",
				new Map([
					["flex-start", "start"],
					["flex-end", "end"],
					["center", "center"],
					["baseline", "baseline"],
					["stretch", "stretch"]
				])
			],
			[
				"-ms-flex-item-align",
				new Map([
					["auto", "auto"],
					["flex-start", "start"],
					["flex-end", "end"],
					["center", "center"],
					["baseline", "baseline"],
					["stretch", "stretch"]
				])
			],
			[
				"-ms-flex-line-pack",
				new Map([
					["flex-start", "start"],
					["flex-end", "end"],
					["center", "center"],
					["space-between", "justify"],
					["space-around", "distribute"],
					["stretch", "stretch"]
				])
			],
			[
				"-ms-flex-pack",
				new Map([
					["flex-start", "start"],
					["flex-end", "end"],
					["center", "center"],
					["space-between", "justify"],
					["space-around", "distribute"]
				])
			],
			[
				"-webkit-box-align",
				new Map([
					["flex-start", "start"],
					["flex-end", "end"],
					["center", "center"],
					["baseline", "baseline"],
					["stretch", "stretch"]
				])
			],
			[
				"-webkit-box-direction",
				new Map([
					["row", "normal"],
					["row-reverse", "reverse"],
					["column", "normal"],
					["column-reverse", "reverse"]
				])
			],
			[
				"-webkit-box-flex",
				new Map([
					["auto", "1"],
					["none", "0"]
				])
			],
			["-webkit-box-ordinal-group", new Map()],
			[
				"-webkit-box-orient",
				new Map([
					["row", "horizontal"],
					["row-reverse", "horizontal"],
					["column", "vertical"],
					["column-reverse", "vertical"]
				])
			],
			[
				"-webkit-box-pack",
				new Map([
					["flex-start", "start"],
					["flex-end", "end"],
					["center", "center"],
					["space-between", "justify"]
				])
			],
			[
				"-webkit-ruby-position",
				new Map([
					["over", "before"],
					["under", "after"]
				])
			],
			[
				"-webkit-text-orientation",
				new Map([
					["mixed", "vertical-right"],
					["upright", "upright"],
					["sideways", "sideways"]
				])
			]
		])
);

// WHY: The legacy spellings reading a number where the standard property reads
// more, as `spelling -> offset`: the standard value's first component, when a
// plain non-negative number, plus the offset — `order:1` is `box-ordinal-group:2`.
/** @type {Map<string, number>} */
const PREFIXED_SPELLING_NUMBERS = new Map([
	["-moz-box-flex", 0],
	["-moz-box-ordinal-group", 1],
	["-webkit-box-flex", 0],
	["-webkit-box-ordinal-group", 1]
]);

module.exports.ABSOLUTE_UNIT_SCALE = ABSOLUTE_UNIT_SCALE;
module.exports.ALPHA_VALUE_PROPERTIES = ALPHA_VALUE_PROPERTIES;
module.exports.ANGLE_DEGREES = ANGLE_DEGREES;
module.exports.ANGLE_UNITS = ANGLE_UNITS;
module.exports.ARC_COSINE_DEGREES = ARC_COSINE_DEGREES;
module.exports.ARC_SINE_DEGREES = ARC_SINE_DEGREES;
module.exports.ARC_TANGENT_DEGREES = ARC_TANGENT_DEGREES;
module.exports.ANIMATION_KEYWORD_SLOTS = ANIMATION_KEYWORD_SLOTS;
module.exports.AUTO_SECOND_VALUE_PROPERTIES = AUTO_SECOND_VALUE_PROPERTIES;
module.exports.BOX_FAMILY_PREFIX = BOX_FAMILY_PREFIX;
module.exports.BOX_LONGHANDS = BOX_LONGHANDS;
module.exports.BOX_SHORTHANDS = BOX_SHORTHANDS;
module.exports.CALC_CONSTANTS = CALC_CONSTANTS;
module.exports.CALC_REJECTING_PROPERTIES = CALC_REJECTING_PROPERTIES;
module.exports.CANONICAL_NAMES = CANONICAL_NAMES;
module.exports.getDeclarationRanks = getDeclarationRanks;
module.exports.getPropertyAliases = getPropertyAliases;
module.exports.CLAMPED_VALUE_RANGES = CLAMPED_VALUE_RANGES;
module.exports.COLOR_ARGUMENT_FUNCTIONS = COLOR_ARGUMENT_FUNCTIONS;
module.exports.COLOR_FUNCTIONS = COLOR_FUNCTIONS;
module.exports.COLOR_KEYWORDS = COLOR_KEYWORDS;
module.exports.getColorNameToRgb = getColorNameToRgb;
module.exports.getColorNameToShortest = getColorNameToShortest;
module.exports.COLOR_ONLY_PROPERTIES = COLOR_ONLY_PROPERTIES;
module.exports.getColorSpaceModel = getColorSpaceModel;
module.exports.COMPOUND_CONTINUATIONS = COMPOUND_CONTINUATIONS;
module.exports.getCssModulesKeywords = getCssModulesKeywords;
module.exports.CSS_MODULES_KEYWORD_OPTIONS = CSS_MODULES_KEYWORD_OPTIONS;
module.exports.CSS_WIDE_KEYWORDS = CSS_WIDE_KEYWORDS;
module.exports.CUBIC_BEZIER_KEYWORDS = CUBIC_BEZIER_KEYWORDS;
module.exports.CUSTOM_IDENT_LIST_PROPERTIES = CUSTOM_IDENT_LIST_PROPERTIES;
module.exports.DEFAULT_GRADIENT_DIRECTIONS = DEFAULT_GRADIENT_DIRECTIONS;
module.exports.DEFAULT_GRADIENT_POSITIONS = DEFAULT_GRADIENT_POSITIONS;
module.exports.REVERSED_GRADIENT_DIRECTIONS = REVERSED_GRADIENT_DIRECTIONS;
module.exports.DISPLAY_SHORT_FORMS = DISPLAY_SHORT_FORMS;
module.exports.DROPPABLE_WHEN_EMPTY_AT_RULES = DROPPABLE_WHEN_EMPTY_AT_RULES;
module.exports.EASING_KEYWORDS = EASING_KEYWORDS;
module.exports.EIGHTH_TURN_COSINE = EIGHTH_TURN_COSINE;
module.exports.EIGHTH_TURN_SINE = EIGHTH_TURN_SINE;
module.exports.EIGHTH_TURN_TANGENT = EIGHTH_TURN_TANGENT;
module.exports.ENCODED_ALREADY = ENCODED_ALREADY;
module.exports.ENGINE_TRANSFER_DIFFERS = ENGINE_TRANSFER_DIFFERS;
module.exports.FAMILY_LIST_PROPERTIES = FAMILY_LIST_PROPERTIES;
module.exports.FAMILY_LONGHANDS = FAMILY_LONGHANDS;
module.exports.FAMILY_SLOT_CLASSES = FAMILY_SLOT_CLASSES;
module.exports.FAMILY_SLOT_INITIALS = FAMILY_SLOT_INITIALS;
module.exports.FAMILY_SLOT_KEYWORDS = FAMILY_SLOT_KEYWORDS;
module.exports.FEATURELESS_PSEUDO_CLASSES = FEATURELESS_PSEUDO_CLASSES;
module.exports.FILTER_FUNCTION_OMITTED = FILTER_FUNCTION_OMITTED;
module.exports.FLEX_KEYWORDS = FLEX_KEYWORDS;
module.exports.FONT_SIZE_KEYWORDS = FONT_SIZE_KEYWORDS;
module.exports.FONT_STRETCH_PERCENTAGES = FONT_STRETCH_PERCENTAGES;
module.exports.FONT_WEIGHT_NUMBERS = FONT_WEIGHT_NUMBERS;
module.exports.GENERIC_FONT_FAMILIES = GENERIC_FONT_FAMILIES;
module.exports.GRADIENT_LAST_POSITIONS = GRADIENT_LAST_POSITIONS;
module.exports.GRADIENT_SIDE_ANGLES = GRADIENT_SIDE_ANGLES;
module.exports.getInitialValueKeywords = getInitialValueKeywords;
module.exports.INTEGER_PROPERTIES = INTEGER_PROPERTIES;
module.exports.getKeywordOnlyProperties = getKeywordOnlyProperties;
module.exports.LATER_COLOR_NAMES = LATER_COLOR_NAMES;
module.exports.LAYER_INITIALS = LAYER_INITIALS;
module.exports.LEGACY_BOX_DISPLAYS = LEGACY_BOX_DISPLAYS;
module.exports.LEGACY_BOX_SPELLINGS = LEGACY_BOX_SPELLINGS;
module.exports.LEGACY_PSEUDO_ELEMENTS = LEGACY_PSEUDO_ELEMENTS;
module.exports.LENGTH_ONLY_FUNCTIONS = LENGTH_ONLY_FUNCTIONS;
module.exports.LINEAR_GRADIENTS = LINEAR_GRADIENTS;
module.exports.LINEAR_SRGB_TO_P3 = LINEAR_SRGB_TO_P3;
module.exports.MATH_FUNCTIONS = MATH_FUNCTIONS;
module.exports.MATH_FUNCTION_ARITY = MATH_FUNCTION_ARITY;
module.exports.MATH_FUNCTION_FOLD = MATH_FUNCTION_FOLD;
module.exports.MATH_FUNCTION_KEYWORDS = MATH_FUNCTION_KEYWORDS;
module.exports.MATH_FUNCTION_SUM_ARGUMENTS = MATH_FUNCTION_SUM_ARGUMENTS;
module.exports.MERGEABLE_AT_RULES = MERGEABLE_AT_RULES;
module.exports.MERGE_LONGHANDS = MERGE_LONGHANDS;
module.exports.NEGATIVE_ACCEPTING_FUNCTIONS = NEGATIVE_ACCEPTING_FUNCTIONS;
module.exports.NEGATIVE_ACCEPTING_PROPERTIES = NEGATIVE_ACCEPTING_PROPERTIES;
module.exports.NEVER = NEVER;
module.exports.NTH_NAMED_EQUIVALENTS = NTH_NAMED_EQUIVALENTS;
module.exports.NTH_PSEUDO_FUNCTIONS = NTH_PSEUDO_FUNCTIONS;
module.exports.OMITTABLE_INITIAL_KEYWORDS = OMITTABLE_INITIAL_KEYWORDS;
module.exports.ONE_VALUE_PAIR_SHORTHANDS = ONE_VALUE_PAIR_SHORTHANDS;
module.exports.ORDERED_LONGHANDS = ORDERED_LONGHANDS;
module.exports.NUMBER_ARGUMENT_FUNCTIONS = NUMBER_ARGUMENT_FUNCTIONS;
module.exports.NUMBER_ONLY_OUTSIDE_CALC_PROPERTIES =
	NUMBER_ONLY_OUTSIDE_CALC_PROPERTIES;
module.exports.NUMBER_ZERO_PROPERTIES = NUMBER_ZERO_PROPERTIES;
module.exports.PAIR_LONGHANDS = PAIR_LONGHANDS;
module.exports.PLACE_SHORTHANDS = PLACE_SHORTHANDS;
module.exports.POSITION_PROPERTIES = POSITION_PROPERTIES;
module.exports.POSITION_X_KEYWORDS = POSITION_X_KEYWORDS;
module.exports.POSITION_Y_KEYWORDS = POSITION_Y_KEYWORDS;
module.exports.PREDEFINED_COLOR_SPACES = PREDEFINED_COLOR_SPACES;
module.exports.PREFIXED_AT_RULES = PREFIXED_AT_RULES;
module.exports.getPrefixedProperties = getPrefixedProperties;
module.exports.PREFIXED_SELECTORS = PREFIXED_SELECTORS;
module.exports.getPrefixedSpellingKeywords = getPrefixedSpellingKeywords;
module.exports.PREFIXED_SPELLING_NUMBERS = PREFIXED_SPELLING_NUMBERS;
module.exports.getPrefixedValues = getPrefixedValues;
module.exports.getPrefixWindows = getPrefixWindows;
module.exports.PREFIX_WINDOW_STARTS = PREFIX_WINDOW_STARTS;
module.exports.QUARTER_TURN_ANGLE = QUARTER_TURN_ANGLE;
module.exports.RATIO_PROPERTIES = RATIO_PROPERTIES;
module.exports.REPEAT_STYLE_KEYWORDS = REPEAT_STYLE_KEYWORDS;
module.exports.REPEAT_STYLE_PROPERTIES = REPEAT_STYLE_PROPERTIES;
module.exports.RGB_TO_NAME = RGB_TO_NAME;
module.exports.SELECTOR_FUNCTIONS = SELECTOR_FUNCTIONS;
module.exports.getSelectorSupportedFrom = getSelectorSupportedFrom;
module.exports.SHADOW_PROPERTIES = SHADOW_PROPERTIES;
module.exports.getShorthandInitialKeywords = getShorthandInitialKeywords;
module.exports.getShorthandLonghands = getShorthandLonghands;
module.exports.SLASH_BOX_SHORTHANDS = SLASH_BOX_SHORTHANDS;
module.exports.SLASH_LONGHANDS = SLASH_LONGHANDS;
module.exports.SRGB_SPACE = SRGB_SPACE;
module.exports.STEPPED_FUNCTIONS = STEPPED_FUNCTIONS;
module.exports.STEP_POSITION_MINIMUM_COUNTS = STEP_POSITION_MINIMUM_COUNTS;
module.exports.SUBSTITUTION_FUNCTIONS = SUBSTITUTION_FUNCTIONS;
module.exports.SUPPORTED_FROM = SUPPORTED_FROM;
module.exports.SUPPORT_BROWSERS = SUPPORT_BROWSERS;
module.exports.UNSTATED_BROWSER_PREFIXES = UNSTATED_BROWSER_PREFIXES;
module.exports.getSupportProfiles = getSupportProfiles;
module.exports.SVG_USER_UNIT_PROPERTIES = SVG_USER_UNIT_PROPERTIES;
module.exports.SYSTEM_UI_STACK = SYSTEM_UI_STACK;
module.exports.THROUGH_MATRIX = THROUGH_MATRIX;
module.exports.THROUGH_TRANSFER = THROUGH_TRANSFER;
module.exports.TRANSITION_BEHAVIORS = TRANSITION_BEHAVIORS;
module.exports.UNIT_CONVERSION_TARGETS = UNIT_CONVERSION_TARGETS;
module.exports.UNIT_GROUP_BASE = UNIT_GROUP_BASE;
module.exports.UNSHARED_LONGHAND_KEYWORDS = UNSHARED_LONGHAND_KEYWORDS;
module.exports.getValueSupportPacked = getValueSupportPacked;
module.exports.X_AXIS_TRANSFORMS = X_AXIS_TRANSFORMS;
module.exports.ZERO_ANGLE_FUNCTIONS = ZERO_ANGLE_FUNCTIONS;
module.exports.ZERO_UNIT_KEEPING_PROPERTIES = ZERO_UNIT_KEEPING_PROPERTIES;
// The arithmetic the printer's own evaluator needs. Sorted after the tables:
// `import/order` orders exports by case, uppercase first.
module.exports.foldAdd = foldAdd;
module.exports.foldDivide = foldDivide;
module.exports.foldMultiply = foldMultiply;