css-tree.js 236 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. /*
  2. * The MIT License (MIT)
  3. *
  4. * Author: Gildas Lormeau
  5. *
  6. * Permission is hereby granted, free of charge, to any person obtaining a copy
  7. * of this software and associated documentation files (the "Software"), to deal
  8. * in the Software without restriction, including without limitation the rights
  9. * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  10. * copies of the Software, and to permit persons to whom the Software is
  11. * furnished to do so, subject to the following conditions:
  12. * The above copyright notice and this permission notice shall be included in all
  13. * copies or substantial portions of the Software.
  14. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  16. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  17. * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  18. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  19. * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  20. * SOFTWARE.
  21. */
  22. // Derived from https://github.com/csstree/csstree
  23. // The minified code is generated by running the following command and keeping in the API (i.e. syntax object) only the methods "generate" and "parse".
  24. // npm run gen:syntax && rollup --config && terser dist/csstree.js -o dist/csstree.js
  25. /*
  26. * The MIT License (MIT)
  27. * Copyright (C) 2016-2019 by Roman Dvornov
  28. *
  29. * Permission is hereby granted, free of charge, to any person obtaining a copy
  30. * of this software and associated documentation files (the "Software"), to deal
  31. * in the Software without restriction, including without limitation the rights
  32. * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  33. * copies of the Software, and to permit persons to whom the Software is
  34. * furnished to do so, subject to the following conditions:
  35. *
  36. * The above copyright notice and this permission notice shall be included in
  37. * all copies or substantial portions of the Software.
  38. *
  39. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  40. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  41. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  42. * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  43. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  44. * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  45. * THE SOFTWARE.
  46. */
  47. this.singlefile.lib.vendor.cssTree = this.singlefile.lib.vendor.cssTree || (() => {
  48. (function (global, factory) { typeof exports === "object" && typeof module !== "undefined" ? module.exports = factory() : typeof define === "function" && define.amd ? define(factory) : (global = global || self, global.csstree = factory()) })(this, (function () { "use strict"; var createCustomError = function createCustomError(name, message) { var error = Object.create(SyntaxError.prototype); var errorStack = new Error; error.name = name; error.message = message; Object.defineProperty(error, "stack", { get: function () { return (errorStack.stack || "").replace(/^(.+\n){1,3}/, name + ": " + message + "\n") } }); return error }; function noop(value) { return value } function generateMultiplier(multiplier) { if (multiplier.min === 0 && multiplier.max === 0) { return "*" } if (multiplier.min === 0 && multiplier.max === 1) { return "?" } if (multiplier.min === 1 && multiplier.max === 0) { return multiplier.comma ? "#" : "+" } if (multiplier.min === 1 && multiplier.max === 1) { return "" } return (multiplier.comma ? "#" : "") + (multiplier.min === multiplier.max ? "{" + multiplier.min + "}" : "{" + multiplier.min + "," + (multiplier.max !== 0 ? multiplier.max : "") + "}") } function generateTypeOpts(node) { switch (node.type) { case "Range": return " [" + (node.min === null ? "-∞" : node.min) + "," + (node.max === null ? "∞" : node.max) + "]"; default: throw new Error("Unknown node type `" + node.type + "`") } } function generateSequence(node, decorate, forceBraces, compact) { var combinator = node.combinator === " " || compact ? node.combinator : " " + node.combinator + " "; var result = node.terms.map((function (term) { return generate(term, decorate, forceBraces, compact) })).join(combinator); if (node.explicit || forceBraces) { result = (compact || result[0] === "," ? "[" : "[ ") + result + (compact ? "]" : " ]") } return result } function generate(node, decorate, forceBraces, compact) { var result; switch (node.type) { case "Group": result = generateSequence(node, decorate, forceBraces, compact) + (node.disallowEmpty ? "!" : ""); break; case "Multiplier": return generate(node.term, decorate, forceBraces, compact) + decorate(generateMultiplier(node), node); case "Type": result = "<" + node.name + (node.opts ? decorate(generateTypeOpts(node.opts), node.opts) : "") + ">"; break; case "Property": result = "<'" + node.name + "'>"; break; case "Keyword": result = node.name; break; case "AtKeyword": result = "@" + node.name; break; case "Function": result = node.name + "("; break; case "String": case "Token": result = node.value; break; case "Comma": result = ","; break; default: throw new Error("Unknown node type `" + node.type + "`") }return decorate(result, node) } var generate_1 = function (node, options) { var decorate = noop; var forceBraces = false; var compact = false; if (typeof options === "function") { decorate = options } else if (options) { forceBraces = Boolean(options.forceBraces); compact = Boolean(options.compact); if (typeof options.decorate === "function") { decorate = options.decorate } } return generate(node, decorate, forceBraces, compact) }; function fromMatchResult(matchResult) { var tokens = matchResult.tokens; var longestMatch = matchResult.longestMatch; var node = longestMatch < tokens.length ? tokens[longestMatch].node : null; var mismatchOffset = -1; var entries = 0; var css = ""; for (var i = 0; i < tokens.length; i++) { if (i === longestMatch) { mismatchOffset = css.length } if (node !== null && tokens[i].node === node) { if (i <= longestMatch) { entries++ } else { entries = 0 } } css += tokens[i].value } return { node: node, css: css, mismatchOffset: mismatchOffset === -1 ? css.length : mismatchOffset, last: node === null || entries > 1 } } function getLocation(node, point) { var loc = node && node.loc && node.loc[point]; if (loc) { return { offset: loc.offset, line: loc.line, column: loc.column } } return null } var SyntaxReferenceError = function (type, referenceName) { var error = createCustomError("SyntaxReferenceError", type + (referenceName ? " `" + referenceName + "`" : "")); error.reference = referenceName; return error }; var MatchError = function (message, syntax, node, matchResult) { var error = createCustomError("SyntaxMatchError", message); var details = fromMatchResult(matchResult); var mismatchOffset = details.mismatchOffset || 0; var badNode = details.node || node; var end = getLocation(badNode, "end"); var start = details.last ? end : getLocation(badNode, "start"); var css = details.css; error.rawMessage = message; error.syntax = syntax ? generate_1(syntax) : "<generic>"; error.css = css; error.mismatchOffset = mismatchOffset; error.loc = { source: badNode && badNode.loc && badNode.loc.source || "<unknown>", start: start, end: end }; error.line = start ? start.line : undefined; error.column = start ? start.column : undefined; error.offset = start ? start.offset : undefined; error.message = message + "\n" + " syntax: " + error.syntax + "\n" + " value: " + (error.css || "<empty string>") + "\n" + " --------" + new Array(error.mismatchOffset + 1).join("-") + "^"; return error }; var error = { SyntaxReferenceError: SyntaxReferenceError, MatchError: MatchError }; var hasOwnProperty = Object.prototype.hasOwnProperty; var keywords = Object.create(null); var properties = Object.create(null); var HYPHENMINUS = 45; function isCustomProperty(str, offset) { offset = offset || 0; return str.length - offset >= 2 && str.charCodeAt(offset) === HYPHENMINUS && str.charCodeAt(offset + 1) === HYPHENMINUS } function getVendorPrefix(str, offset) { offset = offset || 0; if (str.length - offset >= 3) { if (str.charCodeAt(offset) === HYPHENMINUS && str.charCodeAt(offset + 1) !== HYPHENMINUS) { var secondDashIndex = str.indexOf("-", offset + 2); if (secondDashIndex !== -1) { return str.substring(offset, secondDashIndex + 1) } } } return "" } function getKeywordDescriptor(keyword) { if (hasOwnProperty.call(keywords, keyword)) { return keywords[keyword] } var name = keyword.toLowerCase(); if (hasOwnProperty.call(keywords, name)) { return keywords[keyword] = keywords[name] } var custom = isCustomProperty(name, 0); var vendor = !custom ? getVendorPrefix(name, 0) : ""; return keywords[keyword] = Object.freeze({ basename: name.substr(vendor.length), name: name, vendor: vendor, prefix: vendor, custom: custom }) } function getPropertyDescriptor(property) { if (hasOwnProperty.call(properties, property)) { return properties[property] } var name = property; var hack = property[0]; if (hack === "/") { hack = property[1] === "/" ? "//" : "/" } else if (hack !== "_" && hack !== "*" && hack !== "$" && hack !== "#" && hack !== "+" && hack !== "&") { hack = "" } var custom = isCustomProperty(name, hack.length); if (!custom) { name = name.toLowerCase(); if (hasOwnProperty.call(properties, name)) { return properties[property] = properties[name] } } var vendor = !custom ? getVendorPrefix(name, hack.length) : ""; var prefix = name.substr(0, hack.length + vendor.length); return properties[property] = Object.freeze({ basename: name.substr(prefix.length), name: name.substr(hack.length), hack: hack, vendor: vendor, prefix: prefix, custom: custom }) } var names = { keyword: getKeywordDescriptor, property: getPropertyDescriptor, isCustomProperty: isCustomProperty, vendorPrefix: getVendorPrefix }; var TYPE = { EOF: 0, Ident: 1, Function: 2, AtKeyword: 3, Hash: 4, String: 5, BadString: 6, Url: 7, BadUrl: 8, Delim: 9, Number: 10, Percentage: 11, Dimension: 12, WhiteSpace: 13, CDO: 14, CDC: 15, Colon: 16, Semicolon: 17, Comma: 18, LeftSquareBracket: 19, RightSquareBracket: 20, LeftParenthesis: 21, RightParenthesis: 22, LeftCurlyBracket: 23, RightCurlyBracket: 24, Comment: 25 }; var NAME = Object.keys(TYPE).reduce((function (result, key) { result[TYPE[key]] = key; return result }), {}); var _const = { TYPE: TYPE, NAME: NAME }; var EOF = 0; function isDigit(code) { return code >= 48 && code <= 57 } function isHexDigit(code) { return isDigit(code) || code >= 65 && code <= 70 || code >= 97 && code <= 102 } function isUppercaseLetter(code) { return code >= 65 && code <= 90 } function isLowercaseLetter(code) { return code >= 97 && code <= 122 } function isLetter(code) { return isUppercaseLetter(code) || isLowercaseLetter(code) } function isNonAscii(code) { return code >= 128 } function isNameStart(code) { return isLetter(code) || isNonAscii(code) || code === 95 } function isName(code) { return isNameStart(code) || isDigit(code) || code === 45 } function isNonPrintable(code) { return code >= 0 && code <= 8 || code === 11 || code >= 14 && code <= 31 || code === 127 } function isNewline(code) { return code === 10 || code === 13 || code === 12 } function isWhiteSpace(code) { return isNewline(code) || code === 32 || code === 9 } function isValidEscape(first, second) { if (first !== 92) { return false } if (isNewline(second) || second === EOF) { return false } return true } function isIdentifierStart(first, second, third) { if (first === 45) { return isNameStart(second) || second === 45 || isValidEscape(second, third) } if (isNameStart(first)) { return true } if (first === 92) { return isValidEscape(first, second) } return false } function isNumberStart(first, second, third) { if (first === 43 || first === 45) { if (isDigit(second)) { return 2 } return second === 46 && isDigit(third) ? 3 : 0 } if (first === 46) { return isDigit(second) ? 2 : 0 } if (isDigit(first)) { return 1 } return 0 } function isBOM(code) { if (code === 65279) { return 1 } if (code === 65534) { return 1 } return 0 } var CATEGORY = new Array(128); charCodeCategory.Eof = 128; charCodeCategory.WhiteSpace = 130; charCodeCategory.Digit = 131; charCodeCategory.NameStart = 132; charCodeCategory.NonPrintable = 133; for (var i = 0; i < CATEGORY.length; i++) { switch (true) { case isWhiteSpace(i): CATEGORY[i] = charCodeCategory.WhiteSpace; break; case isDigit(i): CATEGORY[i] = charCodeCategory.Digit; break; case isNameStart(i): CATEGORY[i] = charCodeCategory.NameStart; break; case isNonPrintable(i): CATEGORY[i] = charCodeCategory.NonPrintable; break; default: CATEGORY[i] = i || charCodeCategory.Eof } } function charCodeCategory(code) { return code < 128 ? CATEGORY[code] : charCodeCategory.NameStart } var charCodeDefinitions = { isDigit: isDigit, isHexDigit: isHexDigit, isUppercaseLetter: isUppercaseLetter, isLowercaseLetter: isLowercaseLetter, isLetter: isLetter, isNonAscii: isNonAscii, isNameStart: isNameStart, isName: isName, isNonPrintable: isNonPrintable, isNewline: isNewline, isWhiteSpace: isWhiteSpace, isValidEscape: isValidEscape, isIdentifierStart: isIdentifierStart, isNumberStart: isNumberStart, isBOM: isBOM, charCodeCategory: charCodeCategory }; var isDigit$1 = charCodeDefinitions.isDigit; var isHexDigit$1 = charCodeDefinitions.isHexDigit; var isUppercaseLetter$1 = charCodeDefinitions.isUppercaseLetter; var isName$1 = charCodeDefinitions.isName; var isWhiteSpace$1 = charCodeDefinitions.isWhiteSpace; var isValidEscape$1 = charCodeDefinitions.isValidEscape; function getCharCode(source, offset) { return offset < source.length ? source.charCodeAt(offset) : 0 } function getNewlineLength(source, offset, code) { if (code === 13 && getCharCode(source, offset + 1) === 10) { return 2 } return 1 } function cmpChar(testStr, offset, referenceCode) { var code = testStr.charCodeAt(offset); if (isUppercaseLetter$1(code)) { code = code | 32 } return code === referenceCode } function cmpStr(testStr, start, end, referenceStr) { if (end - start !== referenceStr.length) { return false } if (start < 0 || end > testStr.length) { return false } for (var i = start; i < end; i++) { var testCode = testStr.charCodeAt(i); var referenceCode = referenceStr.charCodeAt(i - start); if (isUppercaseLetter$1(testCode)) { testCode = testCode | 32 } if (testCode !== referenceCode) { return false } } return true } function findWhiteSpaceStart(source, offset) { for (; offset >= 0; offset--) { if (!isWhiteSpace$1(source.charCodeAt(offset))) { break } } return offset + 1 } function findWhiteSpaceEnd(source, offset) { for (; offset < source.length; offset++) { if (!isWhiteSpace$1(source.charCodeAt(offset))) { break } } return offset } function findDecimalNumberEnd(source, offset) { for (; offset < source.length; offset++) { if (!isDigit$1(source.charCodeAt(offset))) { break } } return offset } function consumeEscaped(source, offset) { offset += 2; if (isHexDigit$1(getCharCode(source, offset - 1))) { for (var maxOffset = Math.min(source.length, offset + 5); offset < maxOffset; offset++) { if (!isHexDigit$1(getCharCode(source, offset))) { break } } var code = getCharCode(source, offset); if (isWhiteSpace$1(code)) { offset += getNewlineLength(source, offset, code) } } return offset } function consumeName(source, offset) { for (; offset < source.length; offset++) { var code = source.charCodeAt(offset); if (isName$1(code)) { continue } if (isValidEscape$1(code, getCharCode(source, offset + 1))) { offset = consumeEscaped(source, offset) - 1; continue } break } return offset } function consumeNumber(source, offset) { var code = source.charCodeAt(offset); if (code === 43 || code === 45) { code = source.charCodeAt(offset += 1) } if (isDigit$1(code)) { offset = findDecimalNumberEnd(source, offset + 1); code = source.charCodeAt(offset) } if (code === 46 && isDigit$1(source.charCodeAt(offset + 1))) { code = source.charCodeAt(offset += 2); offset = findDecimalNumberEnd(source, offset) } if (cmpChar(source, offset, 101)) { var sign = 0; code = source.charCodeAt(offset + 1); if (code === 45 || code === 43) { sign = 1; code = source.charCodeAt(offset + 2) } if (isDigit$1(code)) { offset = findDecimalNumberEnd(source, offset + 1 + sign + 1) } } return offset } function consumeBadUrlRemnants(source, offset) { for (; offset < source.length; offset++) { var code = source.charCodeAt(offset); if (code === 41) { offset++; break } if (isValidEscape$1(code, getCharCode(source, offset + 1))) { offset = consumeEscaped(source, offset) } } return offset } var utils = { consumeEscaped: consumeEscaped, consumeName: consumeName, consumeNumber: consumeNumber, consumeBadUrlRemnants: consumeBadUrlRemnants, cmpChar: cmpChar, cmpStr: cmpStr, getNewlineLength: getNewlineLength, findWhiteSpaceStart: findWhiteSpaceStart, findWhiteSpaceEnd: findWhiteSpaceEnd }; var TYPE$1 = _const.TYPE; var NAME$1 = _const.NAME; var cmpStr$1 = utils.cmpStr; var EOF$1 = TYPE$1.EOF; var WHITESPACE = TYPE$1.WhiteSpace; var COMMENT = TYPE$1.Comment; var OFFSET_MASK = 16777215; var TYPE_SHIFT = 24; var TokenStream = function () { this.offsetAndType = null; this.balance = null; this.reset() }; TokenStream.prototype = { reset: function () { this.eof = false; this.tokenIndex = -1; this.tokenType = 0; this.tokenStart = this.firstCharOffset; this.tokenEnd = this.firstCharOffset }, lookupType: function (offset) { offset += this.tokenIndex; if (offset < this.tokenCount) { return this.offsetAndType[offset] >> TYPE_SHIFT } return EOF$1 }, lookupOffset: function (offset) { offset += this.tokenIndex; if (offset < this.tokenCount) { return this.offsetAndType[offset - 1] & OFFSET_MASK } return this.source.length }, lookupValue: function (offset, referenceStr) { offset += this.tokenIndex; if (offset < this.tokenCount) { return cmpStr$1(this.source, this.offsetAndType[offset - 1] & OFFSET_MASK, this.offsetAndType[offset] & OFFSET_MASK, referenceStr) } return false }, getTokenStart: function (tokenIndex) { if (tokenIndex === this.tokenIndex) { return this.tokenStart } if (tokenIndex > 0) { return tokenIndex < this.tokenCount ? this.offsetAndType[tokenIndex - 1] & OFFSET_MASK : this.offsetAndType[this.tokenCount] & OFFSET_MASK } return this.firstCharOffset }, getRawLength: function (startToken, mode) { var cursor = startToken; var balanceEnd; var offset = this.offsetAndType[Math.max(cursor - 1, 0)] & OFFSET_MASK; var type; loop: for (; cursor < this.tokenCount; cursor++) { balanceEnd = this.balance[cursor]; if (balanceEnd < startToken) { break loop } type = this.offsetAndType[cursor] >> TYPE_SHIFT; switch (mode(type, this.source, offset)) { case 1: break loop; case 2: cursor++; break loop; default: offset = this.offsetAndType[cursor] & OFFSET_MASK; if (this.balance[balanceEnd] === cursor) { cursor = balanceEnd } } } return cursor - this.tokenIndex }, isBalanceEdge: function (pos) { return this.balance[this.tokenIndex] < pos }, isDelim: function (code, offset) { if (offset) { return this.lookupType(offset) === TYPE$1.Delim && this.source.charCodeAt(this.lookupOffset(offset)) === code } return this.tokenType === TYPE$1.Delim && this.source.charCodeAt(this.tokenStart) === code }, getTokenValue: function () { return this.source.substring(this.tokenStart, this.tokenEnd) }, getTokenLength: function () { return this.tokenEnd - this.tokenStart }, substrToCursor: function (start) { return this.source.substring(start, this.tokenStart) }, skipWS: function () { for (var i = this.tokenIndex, skipTokenCount = 0; i < this.tokenCount; i++ , skipTokenCount++) { if (this.offsetAndType[i] >> TYPE_SHIFT !== WHITESPACE) { break } } if (skipTokenCount > 0) { this.skip(skipTokenCount) } }, skipSC: function () { while (this.tokenType === WHITESPACE || this.tokenType === COMMENT) { this.next() } }, skip: function (tokenCount) { var next = this.tokenIndex + tokenCount; if (next < this.tokenCount) { this.tokenIndex = next; this.tokenStart = this.offsetAndType[next - 1] & OFFSET_MASK; next = this.offsetAndType[next]; this.tokenType = next >> TYPE_SHIFT; this.tokenEnd = next & OFFSET_MASK } else { this.tokenIndex = this.tokenCount; this.next() } }, next: function () { var next = this.tokenIndex + 1; if (next < this.tokenCount) { this.tokenIndex = next; this.tokenStart = this.tokenEnd; next = this.offsetAndType[next]; this.tokenType = next >> TYPE_SHIFT; this.tokenEnd = next & OFFSET_MASK } else { this.tokenIndex = this.tokenCount; this.eof = true; this.tokenType = EOF$1; this.tokenStart = this.tokenEnd = this.source.length } }, dump: function () { var offset = this.firstCharOffset; return Array.prototype.slice.call(this.offsetAndType, 0, this.tokenCount).map((function (item, idx) { var start = offset; var end = item & OFFSET_MASK; offset = end; return { idx: idx, type: NAME$1[item >> TYPE_SHIFT], chunk: this.source.substring(start, end), balance: this.balance[idx] } }), this) } }; var TokenStream_1 = TokenStream; var MIN_SIZE = 16 * 1024; var SafeUint32Array = typeof Uint32Array !== "undefined" ? Uint32Array : Array; var adoptBuffer = function adoptBuffer(buffer, size) { if (buffer === null || buffer.length < size) { return new SafeUint32Array(Math.max(size + 1024, MIN_SIZE)) } return buffer }; var TYPE$2 = _const.TYPE; var isNewline$1 = charCodeDefinitions.isNewline; var isName$2 = charCodeDefinitions.isName; var isValidEscape$2 = charCodeDefinitions.isValidEscape; var isNumberStart$1 = charCodeDefinitions.isNumberStart; var isIdentifierStart$1 = charCodeDefinitions.isIdentifierStart; var charCodeCategory$1 = charCodeDefinitions.charCodeCategory; var isBOM$1 = charCodeDefinitions.isBOM; var cmpStr$2 = utils.cmpStr; var getNewlineLength$1 = utils.getNewlineLength; var findWhiteSpaceEnd$1 = utils.findWhiteSpaceEnd; var consumeEscaped$1 = utils.consumeEscaped; var consumeName$1 = utils.consumeName; var consumeNumber$1 = utils.consumeNumber; var consumeBadUrlRemnants$1 = utils.consumeBadUrlRemnants; var OFFSET_MASK$1 = 16777215; var TYPE_SHIFT$1 = 24; function tokenize(source, stream) { function getCharCode(offset) { return offset < sourceLength ? source.charCodeAt(offset) : 0 } function consumeNumericToken() { offset = consumeNumber$1(source, offset); if (isIdentifierStart$1(getCharCode(offset), getCharCode(offset + 1), getCharCode(offset + 2))) { type = TYPE$2.Dimension; offset = consumeName$1(source, offset); return } if (getCharCode(offset) === 37) { type = TYPE$2.Percentage; offset++; return } type = TYPE$2.Number } function consumeIdentLikeToken() { const nameStartOffset = offset; offset = consumeName$1(source, offset); if (cmpStr$2(source, nameStartOffset, offset, "url") && getCharCode(offset) === 40) { offset = findWhiteSpaceEnd$1(source, offset + 1); if (getCharCode(offset) === 34 || getCharCode(offset) === 39) { type = TYPE$2.Function; offset = nameStartOffset + 4; return } consumeUrlToken(); return } if (getCharCode(offset) === 40) { type = TYPE$2.Function; offset++; return } type = TYPE$2.Ident } function consumeStringToken(endingCodePoint) { if (!endingCodePoint) { endingCodePoint = getCharCode(offset++) } type = TYPE$2.String; for (; offset < source.length; offset++) { var code = source.charCodeAt(offset); switch (charCodeCategory$1(code)) { case endingCodePoint: offset++; return; case charCodeCategory$1.Eof: return; case charCodeCategory$1.WhiteSpace: if (isNewline$1(code)) { offset += getNewlineLength$1(source, offset, code); type = TYPE$2.BadString; return } break; case 92: if (offset === source.length - 1) { break } var nextCode = getCharCode(offset + 1); if (isNewline$1(nextCode)) { offset += getNewlineLength$1(source, offset + 1, nextCode) } else if (isValidEscape$2(code, nextCode)) { offset = consumeEscaped$1(source, offset) - 1 } break } } } function consumeUrlToken() { type = TYPE$2.Url; offset = findWhiteSpaceEnd$1(source, offset); for (; offset < source.length; offset++) { var code = source.charCodeAt(offset); switch (charCodeCategory$1(code)) { case 41: offset++; return; case charCodeCategory$1.Eof: return; case charCodeCategory$1.WhiteSpace: offset = findWhiteSpaceEnd$1(source, offset); if (getCharCode(offset) === 41 || offset >= source.length) { if (offset < source.length) { offset++ } return } offset = consumeBadUrlRemnants$1(source, offset); type = TYPE$2.BadUrl; return; case 34: case 39: case 40: case charCodeCategory$1.NonPrintable: offset = consumeBadUrlRemnants$1(source, offset); type = TYPE$2.BadUrl; return; case 92: if (isValidEscape$2(code, getCharCode(offset + 1))) { offset = consumeEscaped$1(source, offset) - 1; break } offset = consumeBadUrlRemnants$1(source, offset); type = TYPE$2.BadUrl; return } } } if (!stream) { stream = new TokenStream_1 } source = String(source || ""); var sourceLength = source.length; var offsetAndType = adoptBuffer(stream.offsetAndType, sourceLength + 1); var balance = adoptBuffer(stream.balance, sourceLength + 1); var tokenCount = 0; var start = isBOM$1(getCharCode(0)); var offset = start; var balanceCloseType = 0; var balanceStart = 0; var balancePrev = 0; while (offset < sourceLength) { var code = source.charCodeAt(offset); var type = 0; balance[tokenCount] = sourceLength; switch (charCodeCategory$1(code)) { case charCodeCategory$1.WhiteSpace: type = TYPE$2.WhiteSpace; offset = findWhiteSpaceEnd$1(source, offset + 1); break; case 34: consumeStringToken(); break; case 35: if (isName$2(getCharCode(offset + 1)) || isValidEscape$2(getCharCode(offset + 1), getCharCode(offset + 2))) { type = TYPE$2.Hash; offset = consumeName$1(source, offset + 1) } else { type = TYPE$2.Delim; offset++ } break; case 39: consumeStringToken(); break; case 40: type = TYPE$2.LeftParenthesis; offset++; break; case 41: type = TYPE$2.RightParenthesis; offset++; break; case 43: if (isNumberStart$1(code, getCharCode(offset + 1), getCharCode(offset + 2))) { consumeNumericToken() } else { type = TYPE$2.Delim; offset++ } break; case 44: type = TYPE$2.Comma; offset++; break; case 45: if (isNumberStart$1(code, getCharCode(offset + 1), getCharCode(offset + 2))) { consumeNumericToken() } else { if (getCharCode(offset + 1) === 45 && getCharCode(offset + 2) === 62) { type = TYPE$2.CDC; offset = offset + 3 } else { if (isIdentifierStart$1(code, getCharCode(offset + 1), getCharCode(offset + 2))) { consumeIdentLikeToken() } else { type = TYPE$2.Delim; offset++ } } } break; case 46: if (isNumberStart$1(code, getCharCode(offset + 1), getCharCode(offset + 2))) { consumeNumericToken() } else { type = TYPE$2.Delim; offset++ } break; case 47: if (getCharCode(offset + 1) === 42) { type = TYPE$2.Comment; offset = source.indexOf("*/", offset + 2) + 2; if (offset === 1) { offset = source.length } } else { type = TYPE$2.Delim; offset++ } break; case 58: type = TYPE$2.Colon; offset++; break; case 59: type = TYPE$2.Semicolon; offset++; break; case 60: if (getCharCode(offset + 1) === 33 && getCharCode(offset + 2) === 45 && getCharCode(offset + 3) === 45) { type = TYPE$2.CDO; offset = offset + 4 } else { type = TYPE$2.Delim; offset++ } break; case 64: if (isIdentifierStart$1(getCharCode(offset + 1), getCharCode(offset + 2), getCharCode(offset + 3))) { type = TYPE$2.AtKeyword; offset = consumeName$1(source, offset + 1) } else { type = TYPE$2.Delim; offset++ } break; case 91: type = TYPE$2.LeftSquareBracket; offset++; break; case 92: if (isValidEscape$2(code, getCharCode(offset + 1))) { consumeIdentLikeToken() } else { type = TYPE$2.Delim; offset++ } break; case 93: type = TYPE$2.RightSquareBracket; offset++; break; case 123: type = TYPE$2.LeftCurlyBracket; offset++; break; case 125: type = TYPE$2.RightCurlyBracket; offset++; break; case charCodeCategory$1.Digit: consumeNumericToken(); break; case charCodeCategory$1.NameStart: consumeIdentLikeToken(); break; case charCodeCategory$1.Eof: break; default: type = TYPE$2.Delim; offset++ }switch (type) { case balanceCloseType: balancePrev = balanceStart & OFFSET_MASK$1; balanceStart = balance[balancePrev]; balanceCloseType = balanceStart >> TYPE_SHIFT$1; balance[tokenCount] = balancePrev; balance[balancePrev++] = tokenCount; for (; balancePrev < tokenCount; balancePrev++) { if (balance[balancePrev] === sourceLength) { balance[balancePrev] = tokenCount } } break; case TYPE$2.LeftParenthesis: case TYPE$2.Function: balance[tokenCount] = balanceStart; balanceCloseType = TYPE$2.RightParenthesis; balanceStart = balanceCloseType << TYPE_SHIFT$1 | tokenCount; break; case TYPE$2.LeftSquareBracket: balance[tokenCount] = balanceStart; balanceCloseType = TYPE$2.RightSquareBracket; balanceStart = balanceCloseType << TYPE_SHIFT$1 | tokenCount; break; case TYPE$2.LeftCurlyBracket: balance[tokenCount] = balanceStart; balanceCloseType = TYPE$2.RightCurlyBracket; balanceStart = balanceCloseType << TYPE_SHIFT$1 | tokenCount; break }offsetAndType[tokenCount++] = type << TYPE_SHIFT$1 | offset } offsetAndType[tokenCount] = TYPE$2.EOF << TYPE_SHIFT$1 | offset; balance[tokenCount] = sourceLength; balance[sourceLength] = sourceLength; while (balanceStart !== 0) { balancePrev = balanceStart & OFFSET_MASK$1; balanceStart = balance[balancePrev]; balance[balancePrev] = sourceLength } stream.source = source; stream.firstCharOffset = start; stream.offsetAndType = offsetAndType; stream.tokenCount = tokenCount; stream.balance = balance; stream.reset(); stream.next(); return stream } Object.keys(_const).forEach((function (key) { tokenize[key] = _const[key] })); Object.keys(charCodeDefinitions).forEach((function (key) { tokenize[key] = charCodeDefinitions[key] })); Object.keys(utils).forEach((function (key) { tokenize[key] = utils[key] })); var tokenizer = tokenize; var isDigit$2 = tokenizer.isDigit; var cmpChar$1 = tokenizer.cmpChar; var TYPE$3 = tokenizer.TYPE; var DELIM = TYPE$3.Delim; var WHITESPACE$1 = TYPE$3.WhiteSpace; var COMMENT$1 = TYPE$3.Comment; var IDENT = TYPE$3.Ident; var NUMBER = TYPE$3.Number; var DIMENSION = TYPE$3.Dimension; var PLUSSIGN = 43; var HYPHENMINUS$1 = 45; var N = 110; var DISALLOW_SIGN = true; var ALLOW_SIGN = false; function isDelim(token, code) { return token !== null && token.type === DELIM && token.value.charCodeAt(0) === code } function skipSC(token, offset, getNextToken) { while (token !== null && (token.type === WHITESPACE$1 || token.type === COMMENT$1)) { token = getNextToken(++offset) } return offset } function checkInteger(token, valueOffset, disallowSign, offset) { if (!token) { return 0 } var code = token.value.charCodeAt(valueOffset); if (code === PLUSSIGN || code === HYPHENMINUS$1) { if (disallowSign) { return 0 } valueOffset++ } for (; valueOffset < token.value.length; valueOffset++) { if (!isDigit$2(token.value.charCodeAt(valueOffset))) { return 0 } } return offset + 1 } function consumeB(token, offset_, getNextToken) { var sign = false; var offset = skipSC(token, offset_, getNextToken); token = getNextToken(offset); if (token === null) { return offset_ } if (token.type !== NUMBER) { if (isDelim(token, PLUSSIGN) || isDelim(token, HYPHENMINUS$1)) { sign = true; offset = skipSC(getNextToken(++offset), offset, getNextToken); token = getNextToken(offset); if (token === null && token.type !== NUMBER) { return 0 } } else { return offset_ } } if (!sign) { var code = token.value.charCodeAt(0); if (code !== PLUSSIGN && code !== HYPHENMINUS$1) { return 0 } } return checkInteger(token, sign ? 0 : 1, sign, offset) } var genericAnPlusB = function anPlusB(token, getNextToken) { var offset = 0; if (!token) { return 0 } if (token.type === NUMBER) { return checkInteger(token, 0, ALLOW_SIGN, offset) } else if (token.type === IDENT && token.value.charCodeAt(0) === HYPHENMINUS$1) { if (!cmpChar$1(token.value, 1, N)) { return 0 } switch (token.value.length) { case 2: return consumeB(getNextToken(++offset), offset, getNextToken); case 3: if (token.value.charCodeAt(2) !== HYPHENMINUS$1) { return 0 } offset = skipSC(getNextToken(++offset), offset, getNextToken); token = getNextToken(offset); return checkInteger(token, 0, DISALLOW_SIGN, offset); default: if (token.value.charCodeAt(2) !== HYPHENMINUS$1) { return 0 } return checkInteger(token, 3, DISALLOW_SIGN, offset) } } else if (token.type === IDENT || isDelim(token, PLUSSIGN) && getNextToken(offset + 1).type === IDENT) { if (token.type !== IDENT) { token = getNextToken(++offset) } if (token === null || !cmpChar$1(token.value, 0, N)) { return 0 } switch (token.value.length) { case 1: return consumeB(getNextToken(++offset), offset, getNextToken); case 2: if (token.value.charCodeAt(1) !== HYPHENMINUS$1) { return 0 } offset = skipSC(getNextToken(++offset), offset, getNextToken); token = getNextToken(offset); return checkInteger(token, 0, DISALLOW_SIGN, offset); default: if (token.value.charCodeAt(1) !== HYPHENMINUS$1) { return 0 } return checkInteger(token, 2, DISALLOW_SIGN, offset) } } else if (token.type === DIMENSION) { var code = token.value.charCodeAt(0); var sign = code === PLUSSIGN || code === HYPHENMINUS$1 ? 1 : 0; for (var i = sign; i < token.value.length; i++) { if (!isDigit$2(token.value.charCodeAt(i))) { break } } if (i === sign) { return 0 } if (!cmpChar$1(token.value, i, N)) { return 0 } if (i + 1 === token.value.length) { return consumeB(getNextToken(++offset), offset, getNextToken) } else { if (token.value.charCodeAt(i + 1) !== HYPHENMINUS$1) { return 0 } if (i + 2 === token.value.length) { offset = skipSC(getNextToken(++offset), offset, getNextToken); token = getNextToken(offset); return checkInteger(token, 0, DISALLOW_SIGN, offset) } else { return checkInteger(token, i + 2, DISALLOW_SIGN, offset) } } } return 0 }; var isHexDigit$2 = tokenizer.isHexDigit; var cmpChar$2 = tokenizer.cmpChar; var TYPE$4 = tokenizer.TYPE; var IDENT$1 = TYPE$4.Ident; var DELIM$1 = TYPE$4.Delim; var NUMBER$1 = TYPE$4.Number; var DIMENSION$1 = TYPE$4.Dimension; var PLUSSIGN$1 = 43; var HYPHENMINUS$2 = 45; var QUESTIONMARK = 63; var U = 117; function isDelim$1(token, code) { return token !== null && token.type === DELIM$1 && token.value.charCodeAt(0) === code } function startsWith(token, code) { return token.value.charCodeAt(0) === code } function hexSequence(token, offset, allowDash) { for (var pos = offset, hexlen = 0; pos < token.value.length; pos++) { var code = token.value.charCodeAt(pos); if (code === HYPHENMINUS$2 && allowDash && hexlen !== 0) { if (hexSequence(token, offset + hexlen + 1, false) > 0) { return 6 } return 0 } if (!isHexDigit$2(code)) { return 0 } if (++hexlen > 6) { return 0 } } return hexlen } function withQuestionMarkSequence(consumed, length, getNextToken) { if (!consumed) { return 0 } while (isDelim$1(getNextToken(length), QUESTIONMARK)) { if (++consumed > 6) { return 0 } length++ } return length } var genericUrange = function urange(token, getNextToken) { var length = 0; if (token === null || token.type !== IDENT$1 || !cmpChar$2(token.value, 0, U)) { return 0 } token = getNextToken(++length); if (token === null) { return 0 } if (isDelim$1(token, PLUSSIGN$1)) { token = getNextToken(++length); if (token === null) { return 0 } if (token.type === IDENT$1) { return withQuestionMarkSequence(hexSequence(token, 0, true), ++length, getNextToken) } if (isDelim$1(token, QUESTIONMARK)) { return withQuestionMarkSequence(1, ++length, getNextToken) } return 0 } if (token.type === NUMBER$1) { if (!startsWith(token, PLUSSIGN$1)) { return 0 } var consumedHexLength = hexSequence(token, 1, true); if (consumedHexLength === 0) { return 0 } token = getNextToken(++length); if (token === null) { return length } if (token.type === DIMENSION$1 || token.type === NUMBER$1) { if (!startsWith(token, HYPHENMINUS$2) || !hexSequence(token, 1, false)) { return 0 } return length + 1 } return withQuestionMarkSequence(consumedHexLength, length, getNextToken) } if (token.type === DIMENSION$1) { if (!startsWith(token, PLUSSIGN$1)) { return 0 } return withQuestionMarkSequence(hexSequence(token, 1, true), ++length, getNextToken) } return 0 }; var isIdentifierStart$2 = tokenizer.isIdentifierStart; var isHexDigit$3 = tokenizer.isHexDigit; var isDigit$3 = tokenizer.isDigit; var cmpStr$3 = tokenizer.cmpStr; var consumeNumber$2 = tokenizer.consumeNumber; var TYPE$5 = tokenizer.TYPE; var cssWideKeywords = ["unset", "initial", "inherit"]; var calcFunctionNames = ["calc(", "-moz-calc(", "-webkit-calc("]; var LENGTH = { px: true, mm: true, cm: true, in: true, pt: true, pc: true, q: true, em: true, ex: true, ch: true, rem: true, vh: true, vw: true, vmin: true, vmax: true, vm: true }; var ANGLE = { deg: true, grad: true, rad: true, turn: true }; var TIME = { s: true, ms: true }; var FREQUENCY = { hz: true, khz: true }; var RESOLUTION = { dpi: true, dpcm: true, dppx: true, x: true }; var FLEX = { fr: true }; var DECIBEL = { db: true }; var SEMITONES = { st: true }; function charCode(str, index) { return index < str.length ? str.charCodeAt(index) : 0 } function eqStr(actual, expected) { return cmpStr$3(actual, 0, actual.length, expected) } function eqStrAny(actual, expected) { for (var i = 0; i < expected.length; i++) { if (eqStr(actual, expected[i])) { return true } } return false } function isPostfixIeHack(str, offset) { if (offset !== str.length - 2) { return false } return str.charCodeAt(offset) === 92 && isDigit$3(str.charCodeAt(offset + 1)) } function outOfRange(opts, value, numEnd) { if (opts && opts.type === "Range") { var num = Number(numEnd !== undefined && numEnd !== value.length ? value.substr(0, numEnd) : value); if (isNaN(num)) { return true } if (opts.min !== null && num < opts.min) { return true } if (opts.max !== null && num > opts.max) { return true } } return false } function consumeFunction(token, getNextToken) { var startIdx = token.index; var length = 0; do { length++; if (token.balance <= startIdx) { break } } while (token = getNextToken(length)); return length } function calc(next) { return function (token, getNextToken, opts) { if (token === null) { return 0 } if (token.type === TYPE$5.Function && eqStrAny(token.value, calcFunctionNames)) { return consumeFunction(token, getNextToken) } return next(token, getNextToken, opts) } } function tokenType(expectedTokenType) { return function (token) { if (token === null || token.type !== expectedTokenType) { return 0 } return 1 } } function func(name) { name = name + "("; return function (token, getNextToken) { if (token !== null && eqStr(token.value, name)) { return consumeFunction(token, getNextToken) } return 0 } } function customIdent(token) { if (token === null || token.type !== TYPE$5.Ident) { return 0 } var name = token.value.toLowerCase(); if (eqStrAny(name, cssWideKeywords)) { return 0 } if (eqStr(name, "default")) { return 0 } return 1 } function customPropertyName(token) { if (token === null || token.type !== TYPE$5.Ident) { return 0 } if (charCode(token.value, 0) !== 45 || charCode(token.value, 1) !== 45) { return 0 } return 1 } function hexColor(token) { if (token === null || token.type !== TYPE$5.Hash) { return 0 } var length = token.value.length; if (length !== 4 && length !== 5 && length !== 7 && length !== 9) { return 0 } for (var i = 1; i < length; i++) { if (!isHexDigit$3(token.value.charCodeAt(i))) { return 0 } } return 1 } function idSelector(token) { if (token === null || token.type !== TYPE$5.Hash) { return 0 } if (!isIdentifierStart$2(charCode(token.value, 1), charCode(token.value, 2), charCode(token.value, 3))) { return 0 } return 1 } function declarationValue(token, getNextToken) { if (!token) { return 0 } var length = 0; var level = 0; var startIdx = token.index; scan: do { switch (token.type) { case TYPE$5.BadString: case TYPE$5.BadUrl: break scan; case TYPE$5.RightCurlyBracket: case TYPE$5.RightParenthesis: case TYPE$5.RightSquareBracket: if (token.balance > token.index || token.balance < startIdx) { break scan } level--; break; case TYPE$5.Semicolon: if (level === 0) { break scan } break; case TYPE$5.Delim: if (token.value === "!" && level === 0) { break scan } break; case TYPE$5.Function: case TYPE$5.LeftParenthesis: case TYPE$5.LeftSquareBracket: case TYPE$5.LeftCurlyBracket: level++; break }length++; if (token.balance <= startIdx) { break } } while (token = getNextToken(length)); return length } function anyValue(token, getNextToken) { if (!token) { return 0 } var startIdx = token.index; var length = 0; scan: do { switch (token.type) { case TYPE$5.BadString: case TYPE$5.BadUrl: break scan; case TYPE$5.RightCurlyBracket: case TYPE$5.RightParenthesis: case TYPE$5.RightSquareBracket: if (token.balance > token.index || token.balance < startIdx) { break scan } break }length++; if (token.balance <= startIdx) { break } } while (token = getNextToken(length)); return length } function dimension(type) { return function (token, getNextToken, opts) { if (token === null || token.type !== TYPE$5.Dimension) { return 0 } var numberEnd = consumeNumber$2(token.value, 0); if (type !== null) { var reverseSolidusOffset = token.value.indexOf("\\", numberEnd); var unit = reverseSolidusOffset === -1 || !isPostfixIeHack(token.value, reverseSolidusOffset) ? token.value.substr(numberEnd) : token.value.substring(numberEnd, reverseSolidusOffset); if (type.hasOwnProperty(unit.toLowerCase()) === false) { return 0 } } if (outOfRange(opts, token.value, numberEnd)) { return 0 } return 1 } } function percentage(token, getNextToken, opts) { if (token === null || token.type !== TYPE$5.Percentage) { return 0 } if (outOfRange(opts, token.value, token.value.length - 1)) { return 0 } return 1 } function zero(next) { if (typeof next !== "function") { next = function () { return 0 } } return function (token, getNextToken, opts) { if (token !== null && token.type === TYPE$5.Number) { if (Number(token.value) === 0) { return 1 } } return next(token, getNextToken, opts) } } function number(token, getNextToken, opts) { if (token === null) { return 0 } var numberEnd = consumeNumber$2(token.value, 0); var isNumber = numberEnd === token.value.length; if (!isNumber && !isPostfixIeHack(token.value, numberEnd)) { return 0 } if (outOfRange(opts, token.value, numberEnd)) { return 0 } return 1 } function integer(token, getNextToken, opts) { if (token === null || token.type !== TYPE$5.Number) { return 0 } var i = token.value.charCodeAt(0) === 43 || token.value.charCodeAt(0) === 45 ? 1 : 0; for (; i < token.value.length; i++) { if (!isDigit$3(token.value.charCodeAt(i))) { return 0 } } if (outOfRange(opts, token.value, i)) { return 0 } return 1 } var generic = { "ident-token": tokenType(TYPE$5.Ident), "function-token": tokenType(TYPE$5.Function), "at-keyword-token": tokenType(TYPE$5.AtKeyword), "hash-token": tokenType(TYPE$5.Hash), "string-token": tokenType(TYPE$5.String), "bad-string-token": tokenType(TYPE$5.BadString), "url-token": tokenType(TYPE$5.Url), "bad-url-token": tokenType(TYPE$5.BadUrl), "delim-token": tokenType(TYPE$5.Delim), "number-token": tokenType(TYPE$5.Number), "percentage-token": tokenType(TYPE$5.Percentage), "dimension-token": tokenType(TYPE$5.Dimension), "whitespace-token": tokenType(TYPE$5.WhiteSpace), "CDO-token": tokenType(TYPE$5.CDO), "CDC-token": tokenType(TYPE$5.CDC), "colon-token": tokenType(TYPE$5.Colon), "semicolon-token": tokenType(TYPE$5.Semicolon), "comma-token": tokenType(TYPE$5.Comma), "[-token": tokenType(TYPE$5.LeftSquareBracket), "]-token": tokenType(TYPE$5.RightSquareBracket), "(-token": tokenType(TYPE$5.LeftParenthesis), ")-token": tokenType(TYPE$5.RightParenthesis), "{-token": tokenType(TYPE$5.LeftCurlyBracket), "}-token": tokenType(TYPE$5.RightCurlyBracket), string: tokenType(TYPE$5.String), ident: tokenType(TYPE$5.Ident), "custom-ident": customIdent, "custom-property-name": customPropertyName, "hex-color": hexColor, "id-selector": idSelector, "an-plus-b": genericAnPlusB, urange: genericUrange, "declaration-value": declarationValue, "any-value": anyValue, dimension: calc(dimension(null)), angle: calc(dimension(ANGLE)), decibel: calc(dimension(DECIBEL)), frequency: calc(dimension(FREQUENCY)), flex: calc(dimension(FLEX)), length: calc(zero(dimension(LENGTH))), resolution: calc(dimension(RESOLUTION)), semitones: calc(dimension(SEMITONES)), time: calc(dimension(TIME)), percentage: calc(percentage), zero: zero(), number: calc(number), integer: calc(integer), "-ms-legacy-expression": func("expression") }; var _SyntaxError = function SyntaxError(message, input, offset) { var error = createCustomError("SyntaxError", message); error.input = input; error.offset = offset; error.rawMessage = message; error.message = error.rawMessage + "\n" + " " + error.input + "\n" + "--" + new Array((error.offset || error.input.length) + 1).join("-") + "^"; return error }; var TAB = 9; var N$1 = 10; var F = 12; var R = 13; var SPACE = 32; var Tokenizer = function (str) { this.str = str; this.pos = 0 }; Tokenizer.prototype = { charCodeAt: function (pos) { return pos < this.str.length ? this.str.charCodeAt(pos) : 0 }, charCode: function () { return this.charCodeAt(this.pos) }, nextCharCode: function () { return this.charCodeAt(this.pos + 1) }, nextNonWsCode: function (pos) { return this.charCodeAt(this.findWsEnd(pos)) }, findWsEnd: function (pos) { for (; pos < this.str.length; pos++) { var code = this.str.charCodeAt(pos); if (code !== R && code !== N$1 && code !== F && code !== SPACE && code !== TAB) { break } } return pos }, substringToPos: function (end) { return this.str.substring(this.pos, this.pos = end) }, eat: function (code) { if (this.charCode() !== code) { this.error("Expect `" + String.fromCharCode(code) + "`") } this.pos++ }, peek: function () { return this.pos < this.str.length ? this.str.charAt(this.pos++) : "" }, error: function (message) { throw new _SyntaxError(message, this.str, this.pos) } }; var tokenizer$1 = Tokenizer; var TAB$1 = 9; var N$2 = 10; var F$1 = 12; var R$1 = 13; var SPACE$1 = 32; var EXCLAMATIONMARK = 33; var NUMBERSIGN = 35; var AMPERSAND = 38; var APOSTROPHE = 39; var LEFTPARENTHESIS = 40; var RIGHTPARENTHESIS = 41; var ASTERISK = 42; var PLUSSIGN$2 = 43; var COMMA = 44; var HYPERMINUS = 45; var LESSTHANSIGN = 60; var GREATERTHANSIGN = 62; var QUESTIONMARK$1 = 63; var COMMERCIALAT = 64; var LEFTSQUAREBRACKET = 91; var RIGHTSQUAREBRACKET = 93; var LEFTCURLYBRACKET = 123; var VERTICALLINE = 124; var RIGHTCURLYBRACKET = 125; var INFINITY = 8734; var NAME_CHAR = createCharMap((function (ch) { return /[a-zA-Z0-9\-]/.test(ch) })); var COMBINATOR_PRECEDENCE = { " ": 1, "&&": 2, "||": 3, "|": 4 }; function createCharMap(fn) { var array = typeof Uint32Array === "function" ? new Uint32Array(128) : new Array(128); for (var i = 0; i < 128; i++) { array[i] = fn(String.fromCharCode(i)) ? 1 : 0 } return array } function scanSpaces(tokenizer) { return tokenizer.substringToPos(tokenizer.findWsEnd(tokenizer.pos)) } function scanWord(tokenizer) { var end = tokenizer.pos; for (; end < tokenizer.str.length; end++) { var code = tokenizer.str.charCodeAt(end); if (code >= 128 || NAME_CHAR[code] === 0) { break } } if (tokenizer.pos === end) { tokenizer.error("Expect a keyword") } return tokenizer.substringToPos(end) } function scanNumber(tokenizer) { var end = tokenizer.pos; for (; end < tokenizer.str.length; end++) { var code = tokenizer.str.charCodeAt(end); if (code < 48 || code > 57) { break } } if (tokenizer.pos === end) { tokenizer.error("Expect a number") } return tokenizer.substringToPos(end) } function scanString(tokenizer) { var end = tokenizer.str.indexOf("'", tokenizer.pos + 1); if (end === -1) { tokenizer.pos = tokenizer.str.length; tokenizer.error("Expect an apostrophe") } return tokenizer.substringToPos(end + 1) } function readMultiplierRange(tokenizer) { var min = null; var max = null; tokenizer.eat(LEFTCURLYBRACKET); min = scanNumber(tokenizer); if (tokenizer.charCode() === COMMA) { tokenizer.pos++; if (tokenizer.charCode() !== RIGHTCURLYBRACKET) { max = scanNumber(tokenizer) } } else { max = min } tokenizer.eat(RIGHTCURLYBRACKET); return { min: Number(min), max: max ? Number(max) : 0 } } function readMultiplier(tokenizer) { var range = null; var comma = false; switch (tokenizer.charCode()) { case ASTERISK: tokenizer.pos++; range = { min: 0, max: 0 }; break; case PLUSSIGN$2: tokenizer.pos++; range = { min: 1, max: 0 }; break; case QUESTIONMARK$1: tokenizer.pos++; range = { min: 0, max: 1 }; break; case NUMBERSIGN: tokenizer.pos++; comma = true; if (tokenizer.charCode() === LEFTCURLYBRACKET) { range = readMultiplierRange(tokenizer) } else { range = { min: 1, max: 0 } } break; case LEFTCURLYBRACKET: range = readMultiplierRange(tokenizer); break; default: return null }return { type: "Multiplier", comma: comma, min: range.min, max: range.max, term: null } } function maybeMultiplied(tokenizer, node) { var multiplier = readMultiplier(tokenizer); if (multiplier !== null) { multiplier.term = node; return multiplier } return node } function maybeToken(tokenizer) { var ch = tokenizer.peek(); if (ch === "") { return null } return { type: "Token", value: ch } } function readProperty(tokenizer) { var name; tokenizer.eat(LESSTHANSIGN); tokenizer.eat(APOSTROPHE); name = scanWord(tokenizer); tokenizer.eat(APOSTROPHE); tokenizer.eat(GREATERTHANSIGN); return maybeMultiplied(tokenizer, { type: "Property", name: name }) } function readTypeRange(tokenizer) { var min = null; var max = null; var sign = 1; tokenizer.eat(LEFTSQUAREBRACKET); if (tokenizer.charCode() === HYPERMINUS) { tokenizer.peek(); sign = -1 } if (sign == -1 && tokenizer.charCode() === INFINITY) { tokenizer.peek() } else { min = sign * Number(scanNumber(tokenizer)) } scanSpaces(tokenizer); tokenizer.eat(COMMA); scanSpaces(tokenizer); if (tokenizer.charCode() === INFINITY) { tokenizer.peek() } else { sign = 1; if (tokenizer.charCode() === HYPERMINUS) { tokenizer.peek(); sign = -1 } max = sign * Number(scanNumber(tokenizer)) } tokenizer.eat(RIGHTSQUAREBRACKET); if (min === null && max === null) { return null } return { type: "Range", min: min, max: max } } function readType(tokenizer) { var name; var opts = null; tokenizer.eat(LESSTHANSIGN); name = scanWord(tokenizer); if (tokenizer.charCode() === LEFTPARENTHESIS && tokenizer.nextCharCode() === RIGHTPARENTHESIS) { tokenizer.pos += 2; name += "()" } if (tokenizer.charCodeAt(tokenizer.findWsEnd(tokenizer.pos)) === LEFTSQUAREBRACKET) { scanSpaces(tokenizer); opts = readTypeRange(tokenizer) } tokenizer.eat(GREATERTHANSIGN); return maybeMultiplied(tokenizer, { type: "Type", name: name, opts: opts }) } function readKeywordOrFunction(tokenizer) { var name; name = scanWord(tokenizer); if (tokenizer.charCode() === LEFTPARENTHESIS) { tokenizer.pos++; return { type: "Function", name: name } } return maybeMultiplied(tokenizer, { type: "Keyword", name: name }) } function regroupTerms(terms, combinators) { function createGroup(terms, combinator) { return { type: "Group", terms: terms, combinator: combinator, disallowEmpty: false, explicit: false } } combinators = Object.keys(combinators).sort((function (a, b) { return COMBINATOR_PRECEDENCE[a] - COMBINATOR_PRECEDENCE[b] })); while (combinators.length > 0) { var combinator = combinators.shift(); for (var i = 0, subgroupStart = 0; i < terms.length; i++) { var term = terms[i]; if (term.type === "Combinator") { if (term.value === combinator) { if (subgroupStart === -1) { subgroupStart = i - 1 } terms.splice(i, 1); i-- } else { if (subgroupStart !== -1 && i - subgroupStart > 1) { terms.splice(subgroupStart, i - subgroupStart, createGroup(terms.slice(subgroupStart, i), combinator)); i = subgroupStart + 1 } subgroupStart = -1 } } } if (subgroupStart !== -1 && combinators.length) { terms.splice(subgroupStart, i - subgroupStart, createGroup(terms.slice(subgroupStart, i), combinator)) } } return combinator } function readImplicitGroup(tokenizer) { var terms = []; var combinators = {}; var token; var prevToken = null; var prevTokenPos = tokenizer.pos; while (token = peek(tokenizer)) { if (token.type !== "Spaces") { if (token.type === "Combinator") { if (prevToken === null || prevToken.type === "Combinator") { tokenizer.pos = prevTokenPos; tokenizer.error("Unexpected combinator") } combinators[token.value] = true } else if (prevToken !== null && prevToken.type !== "Combinator") { combinators[" "] = true; terms.push({ type: "Combinator", value: " " }) } terms.push(token); prevToken = token; prevTokenPos = tokenizer.pos } } if (prevToken !== null && prevToken.type === "Combinator") { tokenizer.pos -= prevTokenPos; tokenizer.error("Unexpected combinator") } return { type: "Group", terms: terms, combinator: regroupTerms(terms, combinators) || " ", disallowEmpty: false, explicit: false } } function readGroup(tokenizer) { var result; tokenizer.eat(LEFTSQUAREBRACKET); result = readImplicitGroup(tokenizer); tokenizer.eat(RIGHTSQUAREBRACKET); result.explicit = true; if (tokenizer.charCode() === EXCLAMATIONMARK) { tokenizer.pos++; result.disallowEmpty = true } return result } function peek(tokenizer) { var code = tokenizer.charCode(); if (code < 128 && NAME_CHAR[code] === 1) { return readKeywordOrFunction(tokenizer) } switch (code) { case RIGHTSQUAREBRACKET: break; case LEFTSQUAREBRACKET: return maybeMultiplied(tokenizer, readGroup(tokenizer)); case LESSTHANSIGN: return tokenizer.nextCharCode() === APOSTROPHE ? readProperty(tokenizer) : readType(tokenizer); case VERTICALLINE: return { type: "Combinator", value: tokenizer.substringToPos(tokenizer.nextCharCode() === VERTICALLINE ? tokenizer.pos + 2 : tokenizer.pos + 1) }; case AMPERSAND: tokenizer.pos++; tokenizer.eat(AMPERSAND); return { type: "Combinator", value: "&&" }; case COMMA: tokenizer.pos++; return { type: "Comma" }; case APOSTROPHE: return maybeMultiplied(tokenizer, { type: "String", value: scanString(tokenizer) }); case SPACE$1: case TAB$1: case N$2: case R$1: case F$1: return { type: "Spaces", value: scanSpaces(tokenizer) }; case COMMERCIALAT: code = tokenizer.nextCharCode(); if (code < 128 && NAME_CHAR[code] === 1) { tokenizer.pos++; return { type: "AtKeyword", name: scanWord(tokenizer) } } return maybeToken(tokenizer); case ASTERISK: case PLUSSIGN$2: case QUESTIONMARK$1: case NUMBERSIGN: case EXCLAMATIONMARK: break; case LEFTCURLYBRACKET: code = tokenizer.nextCharCode(); if (code < 48 || code > 57) { return maybeToken(tokenizer) } break; default: return maybeToken(tokenizer) } } function parse(source) { var tokenizer = new tokenizer$1(source); var result = readImplicitGroup(tokenizer); if (tokenizer.pos !== source.length) { tokenizer.error("Unexpected input") } if (result.terms.length === 1 && result.terms[0].type === "Group") { result = result.terms[0] } return result } parse("[a&&<b>#|<'c'>*||e() f{2} /,(% g#{1,2} h{2,})]!"); var parse_1 = parse; var noop$1 = function () { }; function ensureFunction(value) { return typeof value === "function" ? value : noop$1 } var walk = function (node, options, context) { function walk(node) { enter.call(context, node); switch (node.type) { case "Group": node.terms.forEach(walk); break; case "Multiplier": walk(node.term); break; case "Type": case "Property": case "Keyword": case "AtKeyword": case "Function": case "String": case "Token": case "Comma": break; default: throw new Error("Unknown type: " + node.type) }leave.call(context, node) } var enter = noop$1; var leave = noop$1; if (typeof options === "function") { enter = options } else if (options) { enter = ensureFunction(options.enter); leave = ensureFunction(options.leave) } if (enter === noop$1 && leave === noop$1) { throw new Error("Neither `enter` nor `leave` walker handler is set or both aren't a function") } walk(node) }; var tokenStream = new TokenStream_1; var astToTokens = { decorator: function (handlers) { var curNode = null; var prev = { len: 0, node: null }; var nodes = [prev]; var buffer = ""; return { children: handlers.children, node: function (node) { var tmp = curNode; curNode = node; handlers.node.call(this, node); curNode = tmp }, chunk: function (chunk) { buffer += chunk; if (prev.node !== curNode) { nodes.push({ len: chunk.length, node: curNode }) } else { prev.len += chunk.length } }, result: function () { return prepareTokens(buffer, nodes) } } } }; function prepareTokens(str, nodes) { var tokens = []; var nodesOffset = 0; var nodesIndex = 0; var currentNode = nodes ? nodes[nodesIndex].node : null; tokenizer(str, tokenStream); while (!tokenStream.eof) { if (nodes) { while (nodesIndex < nodes.length && nodesOffset + nodes[nodesIndex].len <= tokenStream.tokenStart) { nodesOffset += nodes[nodesIndex++].len; currentNode = nodes[nodesIndex].node } } tokens.push({ type: tokenStream.tokenType, value: tokenStream.getTokenValue(), index: tokenStream.tokenIndex, balance: tokenStream.balance[tokenStream.tokenIndex], node: currentNode }); tokenStream.next() } return tokens } var prepareTokens_1 = function (value, syntax) { if (typeof value === "string") { return prepareTokens(value, null) } return syntax.generate(value, astToTokens) }; var MATCH = { type: "Match" }; var MISMATCH = { type: "Mismatch" }; var DISALLOW_EMPTY = { type: "DisallowEmpty" }; var LEFTPARENTHESIS$1 = 40; var RIGHTPARENTHESIS$1 = 41; function createCondition(match, thenBranch, elseBranch) { if (thenBranch === MATCH && elseBranch === MISMATCH) { return match } if (match === MATCH && thenBranch === MATCH && elseBranch === MATCH) { return match } if (match.type === "If" && match.else === MISMATCH && thenBranch === MATCH) { thenBranch = match.then; match = match.match } return { type: "If", match: match, then: thenBranch, else: elseBranch } } function isFunctionType(name) { return name.length > 2 && name.charCodeAt(name.length - 2) === LEFTPARENTHESIS$1 && name.charCodeAt(name.length - 1) === RIGHTPARENTHESIS$1 } function isEnumCapatible(term) { return term.type === "Keyword" || term.type === "AtKeyword" || term.type === "Function" || term.type === "Type" && isFunctionType(term.name) } function buildGroupMatchGraph(combinator, terms, atLeastOneTermMatched) { switch (combinator) { case " ": var result = MATCH; for (var i = terms.length - 1; i >= 0; i--) { var term = terms[i]; result = createCondition(term, result, MISMATCH) } return result; case "|": var result = MISMATCH; var map = null; for (var i = terms.length - 1; i >= 0; i--) { var term = terms[i]; if (isEnumCapatible(term)) { if (map === null && i > 0 && isEnumCapatible(terms[i - 1])) { map = Object.create(null); result = createCondition({ type: "Enum", map: map }, MATCH, result) } if (map !== null) { var key = (isFunctionType(term.name) ? term.name.slice(0, -1) : term.name).toLowerCase(); if (key in map === false) { map[key] = term; continue } } } map = null; result = createCondition(term, MATCH, result) } return result; case "&&": if (terms.length > 5) { return { type: "MatchOnce", terms: terms, all: true } } var result = MISMATCH; for (var i = terms.length - 1; i >= 0; i--) { var term = terms[i]; var thenClause; if (terms.length > 1) { thenClause = buildGroupMatchGraph(combinator, terms.filter((function (newGroupTerm) { return newGroupTerm !== term })), false) } else { thenClause = MATCH } result = createCondition(term, thenClause, result) } return result; case "||": if (terms.length > 5) { return { type: "MatchOnce", terms: terms, all: false } } var result = atLeastOneTermMatched ? MATCH : MISMATCH; for (var i = terms.length - 1; i >= 0; i--) { var term = terms[i]; var thenClause; if (terms.length > 1) { thenClause = buildGroupMatchGraph(combinator, terms.filter((function (newGroupTerm) { return newGroupTerm !== term })), true) } else { thenClause = MATCH } result = createCondition(term, thenClause, result) } return result } } function buildMultiplierMatchGraph(node) { var result = MATCH; var matchTerm = buildMatchGraph(node.term); if (node.max === 0) { matchTerm = createCondition(matchTerm, DISALLOW_EMPTY, MISMATCH); result = createCondition(matchTerm, null, MISMATCH); result.then = createCondition(MATCH, MATCH, result); if (node.comma) { result.then.else = createCondition({ type: "Comma", syntax: node }, result, MISMATCH) } } else { for (var i = node.min || 1; i <= node.max; i++) { if (node.comma && result !== MATCH) { result = createCondition({ type: "Comma", syntax: node }, result, MISMATCH) } result = createCondition(matchTerm, createCondition(MATCH, MATCH, result), MISMATCH) } } if (node.min === 0) { result = createCondition(MATCH, MATCH, result) } else { for (var i = 0; i < node.min - 1; i++) { if (node.comma && result !== MATCH) { result = createCondition({ type: "Comma", syntax: node }, result, MISMATCH) } result = createCondition(matchTerm, result, MISMATCH) } } return result } function buildMatchGraph(node) { if (typeof node === "function") { return { type: "Generic", fn: node } } switch (node.type) { case "Group": var result = buildGroupMatchGraph(node.combinator, node.terms.map(buildMatchGraph), false); if (node.disallowEmpty) { result = createCondition(result, DISALLOW_EMPTY, MISMATCH) } return result; case "Multiplier": return buildMultiplierMatchGraph(node); case "Type": case "Property": return { type: node.type, name: node.name, syntax: node }; case "Keyword": return { type: node.type, name: node.name.toLowerCase(), syntax: node }; case "AtKeyword": return { type: node.type, name: "@" + node.name.toLowerCase(), syntax: node }; case "Function": return { type: node.type, name: node.name.toLowerCase() + "(", syntax: node }; case "String": if (node.value.length === 3) { return { type: "Token", value: node.value.charAt(1), syntax: node } } return { type: node.type, value: node.value.substr(1, node.value.length - 2).replace(/\\'/g, "'"), syntax: node }; case "Token": return { type: node.type, value: node.value, syntax: node }; case "Comma": return { type: node.type, syntax: node }; default: throw new Error("Unknown node type:", node.type) } } var matchGraph = { MATCH: MATCH, MISMATCH: MISMATCH, DISALLOW_EMPTY: DISALLOW_EMPTY, buildMatchGraph: function (syntaxTree, ref) { if (typeof syntaxTree === "string") { syntaxTree = parse_1(syntaxTree) } return { type: "MatchGraph", match: buildMatchGraph(syntaxTree), syntax: ref || null, source: syntaxTree } } }; var hasOwnProperty$1 = Object.prototype.hasOwnProperty; var MATCH$1 = matchGraph.MATCH; var MISMATCH$1 = matchGraph.MISMATCH; var DISALLOW_EMPTY$1 = matchGraph.DISALLOW_EMPTY; var TYPE$6 = _const.TYPE; var STUB = 0; var TOKEN = 1; var OPEN_SYNTAX = 2; var CLOSE_SYNTAX = 3; var EXIT_REASON_MATCH = "Match"; var EXIT_REASON_MISMATCH = "Mismatch"; var EXIT_REASON_ITERATION_LIMIT = "Maximum iteration number exceeded (please fill an issue on https://github.com/csstree/csstree/issues)"; var ITERATION_LIMIT = 15e3; var totalIterationCount = 0; function reverseList(list) { var prev = null; var next = null; var item = list; while (item !== null) { next = item.prev; item.prev = prev; prev = item; item = next } return prev } function areStringsEqualCaseInsensitive(testStr, referenceStr) { if (testStr.length !== referenceStr.length) { return false } for (var i = 0; i < testStr.length; i++) { var testCode = testStr.charCodeAt(i); var referenceCode = referenceStr.charCodeAt(i); if (testCode >= 65 && testCode <= 90) { testCode = testCode | 32 } if (testCode !== referenceCode) { return false } } return true } function isCommaContextStart(token) { if (token === null) { return true } return token.type === TYPE$6.Comma || token.type === TYPE$6.Function || token.type === TYPE$6.LeftParenthesis || token.type === TYPE$6.LeftSquareBracket || token.type === TYPE$6.LeftCurlyBracket || token.type === TYPE$6.Delim } function isCommaContextEnd(token) { if (token === null) { return true } return token.type === TYPE$6.RightParenthesis || token.type === TYPE$6.RightSquareBracket || token.type === TYPE$6.RightCurlyBracket || token.type === TYPE$6.Delim } function internalMatch(tokens, state, syntaxes) { function moveToNextToken() { do { tokenIndex++; token = tokenIndex < tokens.length ? tokens[tokenIndex] : null } while (token !== null && (token.type === TYPE$6.WhiteSpace || token.type === TYPE$6.Comment)) } function getNextToken(offset) { var nextIndex = tokenIndex + offset; return nextIndex < tokens.length ? tokens[nextIndex] : null } function stateSnapshotFromSyntax(nextState, prev) { return { nextState: nextState, matchStack: matchStack, syntaxStack: syntaxStack, thenStack: thenStack, tokenIndex: tokenIndex, prev: prev } } function pushThenStack(nextState) { thenStack = { nextState: nextState, matchStack: matchStack, syntaxStack: syntaxStack, prev: thenStack } } function pushElseStack(nextState) { elseStack = stateSnapshotFromSyntax(nextState, elseStack) } function addTokenToMatch() { matchStack = { type: TOKEN, syntax: state.syntax, token: token, prev: matchStack }; moveToNextToken(); syntaxStash = null; if (tokenIndex > longestMatch) { longestMatch = tokenIndex } } function openSyntax() { syntaxStack = { syntax: state.syntax, opts: state.syntax.opts || syntaxStack !== null && syntaxStack.opts || null, prev: syntaxStack }; matchStack = { type: OPEN_SYNTAX, syntax: state.syntax, token: matchStack.token, prev: matchStack } } function closeSyntax() { if (matchStack.type === OPEN_SYNTAX) { matchStack = matchStack.prev } else { matchStack = { type: CLOSE_SYNTAX, syntax: syntaxStack.syntax, token: matchStack.token, prev: matchStack } } syntaxStack = syntaxStack.prev } var syntaxStack = null; var thenStack = null; var elseStack = null; var syntaxStash = null; var iterationCount = 0; var exitReason = null; var token = null; var tokenIndex = -1; var longestMatch = 0; var matchStack = { type: STUB, syntax: null, token: null, prev: null }; moveToNextToken(); while (exitReason === null && ++iterationCount < ITERATION_LIMIT) { switch (state.type) { case "Match": if (thenStack === null) { if (token !== null) { if (tokenIndex !== tokens.length - 1 || token.value !== "\\0" && token.value !== "\\9") { state = MISMATCH$1; break } } exitReason = EXIT_REASON_MATCH; break } state = thenStack.nextState; if (state === DISALLOW_EMPTY$1) { if (thenStack.matchStack === matchStack) { state = MISMATCH$1; break } else { state = MATCH$1 } } while (thenStack.syntaxStack !== syntaxStack) { closeSyntax() } thenStack = thenStack.prev; break; case "Mismatch": if (syntaxStash !== null && syntaxStash !== false) { if (elseStack === null || tokenIndex > elseStack.tokenIndex) { elseStack = syntaxStash; syntaxStash = false } } else if (elseStack === null) { exitReason = EXIT_REASON_MISMATCH; break } state = elseStack.nextState; thenStack = elseStack.thenStack; syntaxStack = elseStack.syntaxStack; matchStack = elseStack.matchStack; tokenIndex = elseStack.tokenIndex; token = tokenIndex < tokens.length ? tokens[tokenIndex] : null; elseStack = elseStack.prev; break; case "MatchGraph": state = state.match; break; case "If": if (state.else !== MISMATCH$1) { pushElseStack(state.else) } if (state.then !== MATCH$1) { pushThenStack(state.then) } state = state.match; break; case "MatchOnce": state = { type: "MatchOnceBuffer", syntax: state, index: 0, mask: 0 }; break; case "MatchOnceBuffer": var terms = state.syntax.terms; if (state.index === terms.length) { if (state.mask === 0 || state.syntax.all) { state = MISMATCH$1; break } state = MATCH$1; break } if (state.mask === (1 << terms.length) - 1) { state = MATCH$1; break } for (; state.index < terms.length; state.index++) { var matchFlag = 1 << state.index; if ((state.mask & matchFlag) === 0) { pushElseStack(state); pushThenStack({ type: "AddMatchOnce", syntax: state.syntax, mask: state.mask | matchFlag }); state = terms[state.index++]; break } } break; case "AddMatchOnce": state = { type: "MatchOnceBuffer", syntax: state.syntax, index: 0, mask: state.mask }; break; case "Enum": if (token !== null) { var name = token.value.toLowerCase(); if (name.indexOf("\\") !== -1) { name = name.replace(/\\[09].*$/, "") } if (hasOwnProperty$1.call(state.map, name)) { state = state.map[name]; break } } state = MISMATCH$1; break; case "Generic": var opts = syntaxStack !== null ? syntaxStack.opts : null; var lastTokenIndex = tokenIndex + Math.floor(state.fn(token, getNextToken, opts)); if (!isNaN(lastTokenIndex) && lastTokenIndex > tokenIndex) { while (tokenIndex < lastTokenIndex) { addTokenToMatch() } state = MATCH$1 } else { state = MISMATCH$1 } break; case "Type": case "Property": var syntaxDict = state.type === "Type" ? "types" : "properties"; var dictSyntax = hasOwnProperty$1.call(syntaxes, syntaxDict) ? syntaxes[syntaxDict][state.name] : null; if (!dictSyntax || !dictSyntax.match) { throw new Error("Bad syntax reference: " + (state.type === "Type" ? "<" + state.name + ">" : "<'" + state.name + "'>")) } if (syntaxStash !== false && token !== null && state.type === "Type") { var lowPriorityMatching = state.name === "custom-ident" && token.type === TYPE$6.Ident || state.name === "length" && token.value === "0"; if (lowPriorityMatching) { if (syntaxStash === null) { syntaxStash = stateSnapshotFromSyntax(state, elseStack) } state = MISMATCH$1; break } } openSyntax(); state = dictSyntax.match; break; case "Keyword": var name = state.name; if (token !== null) { var keywordName = token.value; if (keywordName.indexOf("\\") !== -1) { keywordName = keywordName.replace(/\\[09].*$/, "") } if (areStringsEqualCaseInsensitive(keywordName, name)) { addTokenToMatch(); state = MATCH$1; break } } state = MISMATCH$1; break; case "AtKeyword": case "Function": if (token !== null && areStringsEqualCaseInsensitive(token.value, state.name)) { addTokenToMatch(); state = MATCH$1; break } state = MISMATCH$1; break; case "Token": if (token !== null && token.value === state.value) { addTokenToMatch(); state = MATCH$1; break } state = MISMATCH$1; break; case "Comma": if (token !== null && token.type === TYPE$6.Comma) { if (isCommaContextStart(matchStack.token)) { state = MISMATCH$1 } else { addTokenToMatch(); state = isCommaContextEnd(token) ? MISMATCH$1 : MATCH$1 } } else { state = isCommaContextStart(matchStack.token) || isCommaContextEnd(token) ? MATCH$1 : MISMATCH$1 } break; case "String": var string = ""; for (var lastTokenIndex = tokenIndex; lastTokenIndex < tokens.length && string.length < state.value.length; lastTokenIndex++) { string += tokens[lastTokenIndex].value } if (areStringsEqualCaseInsensitive(string, state.value)) { while (tokenIndex < lastTokenIndex) { addTokenToMatch() } state = MATCH$1 } else { state = MISMATCH$1 } break; default: throw new Error("Unknown node type: " + state.type) } } totalIterationCount += iterationCount; switch (exitReason) { case null: console.warn("[csstree-match] BREAK after " + ITERATION_LIMIT + " iterations"); exitReason = EXIT_REASON_ITERATION_LIMIT; matchStack = null; break; case EXIT_REASON_MATCH: while (syntaxStack !== null) { closeSyntax() } break; default: matchStack = null }return { tokens: tokens, reason: exitReason, iterations: iterationCount, match: matchStack, longestMatch: longestMatch } } function matchAsList(tokens, matchGraph, syntaxes) { var matchResult = internalMatch(tokens, matchGraph, syntaxes || {}); if (matchResult.match !== null) { var item = reverseList(matchResult.match).prev; matchResult.match = []; while (item !== null) { switch (item.type) { case STUB: break; case OPEN_SYNTAX: case CLOSE_SYNTAX: matchResult.match.push({ type: item.type, syntax: item.syntax }); break; default: matchResult.match.push({ token: item.token.value, node: item.token.node }); break }item = item.prev } } return matchResult } function matchAsTree(tokens, matchGraph, syntaxes) { var matchResult = internalMatch(tokens, matchGraph, syntaxes || {}); if (matchResult.match === null) { return matchResult } var item = matchResult.match; var host = matchResult.match = { syntax: matchGraph.syntax || null, match: [] }; var hostStack = [host]; item = reverseList(item).prev; while (item !== null) { switch (item.type) { case OPEN_SYNTAX: host.match.push(host = { syntax: item.syntax, match: [] }); hostStack.push(host); break; case CLOSE_SYNTAX: hostStack.pop(); host = hostStack[hostStack.length - 1]; break; default: host.match.push({ syntax: item.syntax || null, token: item.token.value, node: item.token.node }) }item = item.prev } return matchResult } var match = { matchAsList: matchAsList, matchAsTree: matchAsTree, getTotalIterationCount: function () { return totalIterationCount } }; function getTrace(node) { function shouldPutToTrace(syntax) { if (syntax === null) { return false } return syntax.type === "Type" || syntax.type === "Property" || syntax.type === "Keyword" } function hasMatch(matchNode) { if (Array.isArray(matchNode.match)) { for (var i = 0; i < matchNode.match.length; i++) { if (hasMatch(matchNode.match[i])) { if (shouldPutToTrace(matchNode.syntax)) { result.unshift(matchNode.syntax) } return true } } } else if (matchNode.node === node) { result = shouldPutToTrace(matchNode.syntax) ? [matchNode.syntax] : []; return true } return false } var result = null; if (this.matched !== null) { hasMatch(this.matched) } return result } function testNode(match, node, fn) { var trace = getTrace.call(match, node); if (trace === null) { return false } return trace.some(fn) } function isType(node, type) { return testNode(this, node, (function (matchNode) { return matchNode.type === "Type" && matchNode.name === type })) } function isProperty(node, property) { return testNode(this, node, (function (matchNode) { return matchNode.type === "Property" && matchNode.name === property })) } function isKeyword(node) { return testNode(this, node, (function (matchNode) { return matchNode.type === "Keyword" })) } var trace = { getTrace: getTrace, isType: isType, isProperty: isProperty, isKeyword: isKeyword }; function createItem(data) { return { prev: null, next: null, data: data } } function allocateCursor(node, prev, next) { var cursor; if (cursors !== null) { cursor = cursors; cursors = cursors.cursor; cursor.prev = prev; cursor.next = next; cursor.cursor = node.cursor } else { cursor = { prev: prev, next: next, cursor: node.cursor } } node.cursor = cursor; return cursor } function releaseCursor(node) { var cursor = node.cursor; node.cursor = cursor.cursor; cursor.prev = null; cursor.next = null; cursor.cursor = cursors; cursors = cursor } var cursors = null; var List = function () { this.cursor = null; this.head = null; this.tail = null }; List.createItem = createItem; List.prototype.createItem = createItem; List.prototype.updateCursors = function (prevOld, prevNew, nextOld, nextNew) { var cursor = this.cursor; while (cursor !== null) { if (cursor.prev === prevOld) { cursor.prev = prevNew } if (cursor.next === nextOld) { cursor.next = nextNew } cursor = cursor.cursor } }; List.prototype.getSize = function () { var size = 0; var cursor = this.head; while (cursor) { size++; cursor = cursor.next } return size }; List.prototype.fromArray = function (array) { var cursor = null; this.head = null; for (var i = 0; i < array.length; i++) { var item = createItem(array[i]); if (cursor !== null) { cursor.next = item } else { this.head = item } item.prev = cursor; cursor = item } this.tail = cursor; return this }; List.prototype.toArray = function () { var cursor = this.head; var result = []; while (cursor) { result.push(cursor.data); cursor = cursor.next } return result }; List.prototype.toJSON = List.prototype.toArray; List.prototype.isEmpty = function () { return this.head === null }; List.prototype.first = function () { return this.head && this.head.data }; List.prototype.last = function () { return this.tail && this.tail.data }; List.prototype.each = function (fn, context) { var item; if (context === undefined) { context = this } var cursor = allocateCursor(this, null, this.head); while (cursor.next !== null) { item = cursor.next; cursor.next = item.next; fn.call(context, item.data, item, this) } releaseCursor(this) }; List.prototype.forEach = List.prototype.each; List.prototype.eachRight = function (fn, context) { var item; if (context === undefined) { context = this } var cursor = allocateCursor(this, this.tail, null); while (cursor.prev !== null) { item = cursor.prev; cursor.prev = item.prev; fn.call(context, item.data, item, this) } releaseCursor(this) }; List.prototype.forEachRight = List.prototype.eachRight; List.prototype.nextUntil = function (start, fn, context) { if (start === null) { return } var item; if (context === undefined) { context = this } var cursor = allocateCursor(this, null, start); while (cursor.next !== null) { item = cursor.next; cursor.next = item.next; if (fn.call(context, item.data, item, this)) { break } } releaseCursor(this) }; List.prototype.prevUntil = function (start, fn, context) { if (start === null) { return } var item; if (context === undefined) { context = this } var cursor = allocateCursor(this, start, null); while (cursor.prev !== null) { item = cursor.prev; cursor.prev = item.prev; if (fn.call(context, item.data, item, this)) { break } } releaseCursor(this) }; List.prototype.some = function (fn, context) { var cursor = this.head; if (context === undefined) { context = this } while (cursor !== null) { if (fn.call(context, cursor.data, cursor, this)) { return true } cursor = cursor.next } return false }; List.prototype.map = function (fn, context) { var result = new List; var cursor = this.head; if (context === undefined) { context = this } while (cursor !== null) { result.appendData(fn.call(context, cursor.data, cursor, this)); cursor = cursor.next } return result }; List.prototype.filter = function (fn, context) { var result = new List; var cursor = this.head; if (context === undefined) { context = this } while (cursor !== null) { if (fn.call(context, cursor.data, cursor, this)) { result.appendData(cursor.data) } cursor = cursor.next } return result }; List.prototype.clear = function () { this.head = null; this.tail = null }; List.prototype.copy = function () { var result = new List; var cursor = this.head; while (cursor !== null) { result.insert(createItem(cursor.data)); cursor = cursor.next } return result }; List.prototype.prepend = function (item) { this.updateCursors(null, item, this.head, item); if (this.head !== null) { this.head.prev = item; item.next = this.head } else { this.tail = item } this.head = item; return this }; List.prototype.prependData = function (data) { return this.prepend(createItem(data)) }; List.prototype.append = function (item) { return this.insert(item) }; List.prototype.appendData = function (data) { return this.insert(createItem(data)) }; List.prototype.insert = function (item, before) { if (before !== undefined && before !== null) { this.updateCursors(before.prev, item, before, item); if (before.prev === null) { if (this.head !== before) { throw new Error("before doesn't belong to list") } this.head = item; before.prev = item; item.next = before; this.updateCursors(null, item) } else { before.prev.next = item; item.prev = before.prev; before.prev = item; item.next = before } } else { this.updateCursors(this.tail, item, null, item); if (this.tail !== null) { this.tail.next = item; item.prev = this.tail } else { this.head = item } this.tail = item } return this }; List.prototype.insertData = function (data, before) { return this.insert(createItem(data), before) }; List.prototype.remove = function (item) { this.updateCursors(item, item.prev, item, item.next); if (item.prev !== null) { item.prev.next = item.next } else { if (this.head !== item) { throw new Error("item doesn't belong to list") } this.head = item.next } if (item.next !== null) { item.next.prev = item.prev } else { if (this.tail !== item) { throw new Error("item doesn't belong to list") } this.tail = item.prev } item.prev = null; item.next = null; return item }; List.prototype.push = function (data) { this.insert(createItem(data)) }; List.prototype.pop = function () { if (this.tail !== null) { return this.remove(this.tail) } }; List.prototype.unshift = function (data) { this.prepend(createItem(data)) }; List.prototype.shift = function () { if (this.head !== null) { return this.remove(this.head) } }; List.prototype.prependList = function (list) { return this.insertList(list, this.head) }; List.prototype.appendList = function (list) { return this.insertList(list) }; List.prototype.insertList = function (list, before) { if (list.head === null) { return this } if (before !== undefined && before !== null) { this.updateCursors(before.prev, list.tail, before, list.head); if (before.prev !== null) { before.prev.next = list.head; list.head.prev = before.prev } else { this.head = list.head } before.prev = list.tail; list.tail.next = before } else { this.updateCursors(this.tail, list.tail, null, list.head); if (this.tail !== null) { this.tail.next = list.head; list.head.prev = this.tail } else { this.head = list.head } this.tail = list.tail } list.head = null; list.tail = null; return this }; List.prototype.replace = function (oldItem, newItemOrList) { if ("head" in newItemOrList) { this.insertList(newItemOrList, oldItem) } else { this.insert(newItemOrList, oldItem) } this.remove(oldItem) }; var List_1 = List; function getFirstMatchNode(matchNode) { if ("node" in matchNode) { return matchNode.node } return getFirstMatchNode(matchNode.match[0]) } function getLastMatchNode(matchNode) { if ("node" in matchNode) { return matchNode.node } return getLastMatchNode(matchNode.match[matchNode.match.length - 1]) } function matchFragments(lexer, ast, match, type, name) { function findFragments(matchNode) { if (matchNode.syntax !== null && matchNode.syntax.type === type && matchNode.syntax.name === name) { var start = getFirstMatchNode(matchNode); var end = getLastMatchNode(matchNode); lexer.syntax.walk(ast, (function (node, item, list) { if (node === start) { var nodes = new List_1; do { nodes.appendData(item.data); if (item.data === end) { break } item = item.next } while (item !== null); fragments.push({ parent: list, nodes: nodes }) } })) } if (Array.isArray(matchNode.match)) { matchNode.match.forEach(findFragments) } } var fragments = []; if (match.matched !== null) { findFragments(match.matched) } return fragments } var search = { matchFragments: matchFragments }; var hasOwnProperty$2 = Object.prototype.hasOwnProperty; function isValidNumber(value) { return typeof value === "number" && isFinite(value) && Math.floor(value) === value && value >= 0 } function isValidLocation(loc) { return Boolean(loc) && isValidNumber(loc.offset) && isValidNumber(loc.line) && isValidNumber(loc.column) } function createNodeStructureChecker(type, fields) { return function checkNode(node, warn) { if (!node || node.constructor !== Object) { return warn(node, "Type of node should be an Object") } for (var key in node) { var valid = true; if (hasOwnProperty$2.call(node, key) === false) { continue } if (key === "type") { if (node.type !== type) { warn(node, "Wrong node type `" + node.type + "`, expected `" + type + "`") } } else if (key === "loc") { if (node.loc === null) { continue } else if (node.loc && node.loc.constructor === Object) { if (typeof node.loc.source !== "string") { key += ".source" } else if (!isValidLocation(node.loc.start)) { key += ".start" } else if (!isValidLocation(node.loc.end)) { key += ".end" } else { continue } } valid = false } else if (fields.hasOwnProperty(key)) { for (var i = 0, valid = false; !valid && i < fields[key].length; i++) { var fieldType = fields[key][i]; switch (fieldType) { case String: valid = typeof node[key] === "string"; break; case Boolean: valid = typeof node[key] === "boolean"; break; case null: valid = node[key] === null; break; default: if (typeof fieldType === "string") { valid = node[key] && node[key].type === fieldType } else if (Array.isArray(fieldType)) { valid = node[key] instanceof List_1 } } } } else { warn(node, "Unknown field `" + key + "` for " + type + " node type") } if (!valid) { warn(node, "Bad value for `" + type + "." + key + "`") } } for (var key in fields) { if (hasOwnProperty$2.call(fields, key) && hasOwnProperty$2.call(node, key) === false) { warn(node, "Field `" + type + "." + key + "` is missed") } } } } function processStructure(name, nodeType) { var structure = nodeType.structure; var fields = { type: String, loc: true }; var docs = { type: '"' + name + '"' }; for (var key in structure) { if (hasOwnProperty$2.call(structure, key) === false) { continue } var docsTypes = []; var fieldTypes = fields[key] = Array.isArray(structure[key]) ? structure[key].slice() : [structure[key]]; for (var i = 0; i < fieldTypes.length; i++) { var fieldType = fieldTypes[i]; if (fieldType === String || fieldType === Boolean) { docsTypes.push(fieldType.name) } else if (fieldType === null) { docsTypes.push("null") } else if (typeof fieldType === "string") { docsTypes.push("<" + fieldType + ">") } else if (Array.isArray(fieldType)) { docsTypes.push("List") } else { throw new Error("Wrong value `" + fieldType + "` in `" + name + "." + key + "` structure definition") } } docs[key] = docsTypes.join(" | ") } return { docs: docs, check: createNodeStructureChecker(name, fields) } } var structure = { getStructureFromConfig: function (config) { var structure = {}; if (config.node) { for (var name in config.node) { if (hasOwnProperty$2.call(config.node, name)) { var nodeType = config.node[name]; if (nodeType.structure) { structure[name] = processStructure(name, nodeType) } else { throw new Error("Missed `structure` field in `" + name + "` node type definition") } } } } return structure } }; var SyntaxReferenceError$1 = error.SyntaxReferenceError; var MatchError$1 = error.MatchError; var buildMatchGraph$1 = matchGraph.buildMatchGraph; var matchAsTree$1 = match.matchAsTree; var getStructureFromConfig = structure.getStructureFromConfig; var cssWideKeywords$1 = buildMatchGraph$1("inherit | initial | unset"); var cssWideKeywordsWithExpression = buildMatchGraph$1("inherit | initial | unset | <-ms-legacy-expression>"); function dumpMapSyntax(map, compact, syntaxAsAst) { var result = {}; for (var name in map) { if (map[name].syntax) { result[name] = syntaxAsAst ? map[name].syntax : generate_1(map[name].syntax, { compact: compact }) } } return result } function valueHasVar(tokens) { for (var i = 0; i < tokens.length; i++) { if (tokens[i].value.toLowerCase() === "var(") { return true } } return false } function buildMatchResult(match, error, iterations) { return { matched: match, iterations: iterations, error: error, getTrace: trace.getTrace, isType: trace.isType, isProperty: trace.isProperty, isKeyword: trace.isKeyword } } function matchSyntax(lexer, syntax, value, useCommon) { var tokens = prepareTokens_1(value, lexer.syntax); var result; if (valueHasVar(tokens)) { return buildMatchResult(null, new Error("Matching for a tree with var() is not supported")) } if (useCommon) { result = matchAsTree$1(tokens, lexer.valueCommonSyntax, lexer) } if (!useCommon || !result.match) { result = matchAsTree$1(tokens, syntax.match, lexer); if (!result.match) { return buildMatchResult(null, new MatchError$1(result.reason, syntax.syntax, value, result), result.iterations) } } return buildMatchResult(result.match, null, result.iterations) } var Lexer = function (config, syntax, structure) { this.valueCommonSyntax = cssWideKeywords$1; this.syntax = syntax; this.generic = false; this.properties = {}; this.types = {}; this.structure = structure || getStructureFromConfig(config); if (config) { if (config.types) { for (var name in config.types) { this.addType_(name, config.types[name]) } } if (config.generic) { this.generic = true; for (var name in generic) { this.addType_(name, generic[name]) } } if (config.properties) { for (var name in config.properties) { this.addProperty_(name, config.properties[name]) } } } }; Lexer.prototype = { structure: {}, checkStructure: function (ast) { function collectWarning(node, message) { warns.push({ node: node, message: message }) } var structure = this.structure; var warns = []; this.syntax.walk(ast, (function (node) { if (structure.hasOwnProperty(node.type)) { structure[node.type].check(node, collectWarning) } else { collectWarning(node, "Unknown node type `" + node.type + "`") } })); return warns.length ? warns : false }, createDescriptor: function (syntax, type, name) { var ref = { type: type, name: name }; var descriptor = { type: type, name: name, syntax: null, match: null }; if (typeof syntax === "function") { descriptor.match = buildMatchGraph$1(syntax, ref) } else { if (typeof syntax === "string") { Object.defineProperty(descriptor, "syntax", { get: function () { Object.defineProperty(descriptor, "syntax", { value: parse_1(syntax) }); return descriptor.syntax } }) } else { descriptor.syntax = syntax } Object.defineProperty(descriptor, "match", { get: function () { Object.defineProperty(descriptor, "match", { value: buildMatchGraph$1(descriptor.syntax, ref) }); return descriptor.match } }) } return descriptor }, addProperty_: function (name, syntax) { this.properties[name] = this.createDescriptor(syntax, "Property", name) }, addType_: function (name, syntax) { this.types[name] = this.createDescriptor(syntax, "Type", name); if (syntax === generic["-ms-legacy-expression"]) { this.valueCommonSyntax = cssWideKeywordsWithExpression } }, matchDeclaration: function (node) { if (node.type !== "Declaration") { return buildMatchResult(null, new Error("Not a Declaration node")) } return this.matchProperty(node.property, node.value) }, matchProperty: function (propertyName, value) { var property = names.property(propertyName); if (property.custom) { return buildMatchResult(null, new Error("Lexer matching doesn't applicable for custom properties")) } var propertySyntax = property.vendor ? this.getProperty(property.name) || this.getProperty(property.basename) : this.getProperty(property.name); if (!propertySyntax) { return buildMatchResult(null, new SyntaxReferenceError$1("Unknown property", propertyName)) } return matchSyntax(this, propertySyntax, value, true) }, matchType: function (typeName, value) { var typeSyntax = this.getType(typeName); if (!typeSyntax) { return buildMatchResult(null, new SyntaxReferenceError$1("Unknown type", typeName)) } return matchSyntax(this, typeSyntax, value, false) }, match: function (syntax, value) { if (typeof syntax !== "string" && (!syntax || !syntax.type)) { return buildMatchResult(null, new SyntaxReferenceError$1("Bad syntax")) } if (typeof syntax === "string" || !syntax.match) { syntax = this.createDescriptor(syntax, "Type", "anonymous") } return matchSyntax(this, syntax, value, false) }, findValueFragments: function (propertyName, value, type, name) { return search.matchFragments(this, value, this.matchProperty(propertyName, value), type, name) }, findDeclarationValueFragments: function (declaration, type, name) { return search.matchFragments(this, declaration.value, this.matchDeclaration(declaration), type, name) }, findAllFragments: function (ast, type, name) { var result = []; this.syntax.walk(ast, { visit: "Declaration", enter: function (declaration) { result.push.apply(result, this.findDeclarationValueFragments(declaration, type, name)) }.bind(this) }); return result }, getProperty: function (name) { return this.properties.hasOwnProperty(name) ? this.properties[name] : null }, getType: function (name) { return this.types.hasOwnProperty(name) ? this.types[name] : null }, validate: function () { function validate(syntax, name, broken, descriptor) { if (broken.hasOwnProperty(name)) { return broken[name] } broken[name] = false; if (descriptor.syntax !== null) { walk(descriptor.syntax, (function (node) { if (node.type !== "Type" && node.type !== "Property") { return } var map = node.type === "Type" ? syntax.types : syntax.properties; var brokenMap = node.type === "Type" ? brokenTypes : brokenProperties; if (!map.hasOwnProperty(node.name) || validate(syntax, node.name, brokenMap, map[node.name])) { broken[name] = true } }), this) } } var brokenTypes = {}; var brokenProperties = {}; for (var key in this.types) { validate(this, key, brokenTypes, this.types[key]) } for (var key in this.properties) { validate(this, key, brokenProperties, this.properties[key]) } brokenTypes = Object.keys(brokenTypes).filter((function (name) { return brokenTypes[name] })); brokenProperties = Object.keys(brokenProperties).filter((function (name) { return brokenProperties[name] })); if (brokenTypes.length || brokenProperties.length) { return { types: brokenTypes, properties: brokenProperties } } return null }, dump: function (syntaxAsAst, pretty) { return { generic: this.generic, types: dumpMapSyntax(this.types, !pretty, syntaxAsAst), properties: dumpMapSyntax(this.properties, !pretty, syntaxAsAst) } }, toString: function () { return JSON.stringify(this.dump()) } }; var Lexer_1 = Lexer; var isBOM$2 = tokenizer.isBOM; var N$3 = 10; var F$2 = 12; var R$2 = 13; function computeLinesAndColumns(host, source) { var sourceLength = source.length; var lines = adoptBuffer(host.lines, sourceLength); var line = host.startLine; var columns = adoptBuffer(host.columns, sourceLength); var column = host.startColumn; var startOffset = source.length > 0 ? isBOM$2(source.charCodeAt(0)) : 0; for (var i = startOffset; i < sourceLength; i++) { var code = source.charCodeAt(i); lines[i] = line; columns[i] = column++; if (code === N$3 || code === R$2 || code === F$2) { if (code === R$2 && i + 1 < sourceLength && source.charCodeAt(i + 1) === N$3) { i++; lines[i] = line; columns[i] = column } line++; column = 1 } } lines[i] = line; columns[i] = column; host.lines = lines; host.columns = columns } var OffsetToLocation = function () { this.lines = null; this.columns = null; this.linesAndColumnsComputed = false }; OffsetToLocation.prototype = { setSource: function (source, startOffset, startLine, startColumn) { this.source = source; this.startOffset = typeof startOffset === "undefined" ? 0 : startOffset; this.startLine = typeof startLine === "undefined" ? 1 : startLine; this.startColumn = typeof startColumn === "undefined" ? 1 : startColumn; this.linesAndColumnsComputed = false }, ensureLinesAndColumnsComputed: function () { if (!this.linesAndColumnsComputed) { computeLinesAndColumns(this, this.source); this.linesAndColumnsComputed = true } }, getLocation: function (offset, filename) { this.ensureLinesAndColumnsComputed(); return { source: filename, offset: this.startOffset + offset, line: this.lines[offset], column: this.columns[offset] } }, getLocationRange: function (start, end, filename) { this.ensureLinesAndColumnsComputed(); return { source: filename, start: { offset: this.startOffset + start, line: this.lines[start], column: this.columns[start] }, end: { offset: this.startOffset + end, line: this.lines[end], column: this.columns[end] } } } }; var OffsetToLocation_1 = OffsetToLocation; var MAX_LINE_LENGTH = 100; var OFFSET_CORRECTION = 60; var TAB_REPLACEMENT = " "; function sourceFragment(error, extraLines) { function processLines(start, end) { return lines.slice(start, end).map((function (line, idx) { var num = String(start + idx + 1); while (num.length < maxNumLength) { num = " " + num } return num + " |" + line })).join("\n") } var lines = error.source.split(/\r\n?|\n|\f/); var line = error.line; var column = error.column; var startLine = Math.max(1, line - extraLines) - 1; var endLine = Math.min(line + extraLines, lines.length + 1); var maxNumLength = Math.max(4, String(endLine).length) + 1; var cutLeft = 0; column += (TAB_REPLACEMENT.length - 1) * (lines[line - 1].substr(0, column - 1).match(/\t/g) || []).length; if (column > MAX_LINE_LENGTH) { cutLeft = column - OFFSET_CORRECTION + 3; column = OFFSET_CORRECTION - 2 } for (var i = startLine; i <= endLine; i++) { if (i >= 0 && i < lines.length) { lines[i] = lines[i].replace(/\t/g, TAB_REPLACEMENT); lines[i] = (cutLeft > 0 && lines[i].length > cutLeft ? "…" : "") + lines[i].substr(cutLeft, MAX_LINE_LENGTH - 2) + (lines[i].length > cutLeft + MAX_LINE_LENGTH - 1 ? "…" : "") } } return [processLines(startLine, line), new Array(column + maxNumLength + 2).join("-") + "^", processLines(line, endLine)].filter(Boolean).join("\n") } var SyntaxError$1 = function (message, source, offset, line, column) { var error = createCustomError("SyntaxError", message); error.source = source; error.offset = offset; error.line = line; error.column = column; error.sourceFragment = function (extraLines) { return sourceFragment(error, isNaN(extraLines) ? 0 : extraLines) }; Object.defineProperty(error, "formattedMessage", { get: function () { return "Parse error: " + error.message + "\n" + sourceFragment(error, 2) } }); error.parseError = { offset: offset, line: line, column: column }; return error }; var _SyntaxError$1 = SyntaxError$1; var TYPE$7 = tokenizer.TYPE; var WHITESPACE$2 = TYPE$7.WhiteSpace; var COMMENT$2 = TYPE$7.Comment; var sequence = function readSequence(recognizer) { var children = this.createList(); var child = null; var context = { recognizer: recognizer, space: null, ignoreWS: false, ignoreWSAfter: false }; this.scanner.skipSC(); while (!this.scanner.eof) { switch (this.scanner.tokenType) { case COMMENT$2: this.scanner.next(); continue; case WHITESPACE$2: if (context.ignoreWS) { this.scanner.next() } else { context.space = this.WhiteSpace() } continue }child = recognizer.getNode.call(this, context); if (child === undefined) { break } if (context.space !== null) { children.push(context.space); context.space = null } children.push(child); if (context.ignoreWSAfter) { context.ignoreWSAfter = false; context.ignoreWS = true } else { context.ignoreWS = false } } return children }; var findWhiteSpaceStart$1 = utils.findWhiteSpaceStart; var noop$2 = function () { }; var TYPE$8 = _const.TYPE; var NAME$2 = _const.NAME; var WHITESPACE$3 = TYPE$8.WhiteSpace; var IDENT$2 = TYPE$8.Ident; var FUNCTION = TYPE$8.Function; var URL = TYPE$8.Url; var HASH = TYPE$8.Hash; var PERCENTAGE = TYPE$8.Percentage; var NUMBER$2 = TYPE$8.Number; var NUMBERSIGN$1 = 35; var NULL = 0; function createParseContext(name) { return function () { return this[name]() } } function processConfig(config) { var parserConfig = { context: {}, scope: {}, atrule: {}, pseudo: {} }; if (config.parseContext) { for (var name in config.parseContext) { switch (typeof config.parseContext[name]) { case "function": parserConfig.context[name] = config.parseContext[name]; break; case "string": parserConfig.context[name] = createParseContext(config.parseContext[name]); break } } } if (config.scope) { for (var name in config.scope) { parserConfig.scope[name] = config.scope[name] } } if (config.atrule) { for (var name in config.atrule) { var atrule = config.atrule[name]; if (atrule.parse) { parserConfig.atrule[name] = atrule.parse } } } if (config.pseudo) { for (var name in config.pseudo) { var pseudo = config.pseudo[name]; if (pseudo.parse) { parserConfig.pseudo[name] = pseudo.parse } } } if (config.node) { for (var name in config.node) { parserConfig[name] = config.node[name].parse } } return parserConfig } var create = function createParser(config) { var parser = { scanner: new TokenStream_1, locationMap: new OffsetToLocation_1, filename: "<unknown>", needPositions: false, onParseError: noop$2, onParseErrorThrow: false, parseAtrulePrelude: true, parseRulePrelude: true, parseValue: true, parseCustomProperty: false, readSequence: sequence, createList: function () { return new List_1 }, createSingleNodeList: function (node) { return (new List_1).appendData(node) }, getFirstListNode: function (list) { return list && list.first() }, getLastListNode: function (list) { return list.last() }, parseWithFallback: function (consumer, fallback) { var startToken = this.scanner.tokenIndex; try { return consumer.call(this) } catch (e) { if (this.onParseErrorThrow) { throw e } var fallbackNode = fallback.call(this, startToken); this.onParseErrorThrow = true; this.onParseError(e, fallbackNode); this.onParseErrorThrow = false; return fallbackNode } }, lookupNonWSType: function (offset) { do { var type = this.scanner.lookupType(offset++); if (type !== WHITESPACE$3) { return type } } while (type !== NULL); return NULL }, eat: function (tokenType) { if (this.scanner.tokenType !== tokenType) { var offset = this.scanner.tokenStart; var message = NAME$2[tokenType] + " is expected"; switch (tokenType) { case IDENT$2: if (this.scanner.tokenType === FUNCTION || this.scanner.tokenType === URL) { offset = this.scanner.tokenEnd - 1; message = "Identifier is expected but function found" } else { message = "Identifier is expected" } break; case HASH: if (this.scanner.isDelim(NUMBERSIGN$1)) { this.scanner.next(); offset++; message = "Name is expected" } break; case PERCENTAGE: if (this.scanner.tokenType === NUMBER$2) { offset = this.scanner.tokenEnd; message = "Percent sign is expected" } break; default: if (this.scanner.source.charCodeAt(this.scanner.tokenStart) === tokenType) { offset = offset + 1 } }this.error(message, offset) } this.scanner.next() }, consume: function (tokenType) { var value = this.scanner.getTokenValue(); this.eat(tokenType); return value }, consumeFunctionName: function () { var name = this.scanner.source.substring(this.scanner.tokenStart, this.scanner.tokenEnd - 1); this.eat(FUNCTION); return name }, getLocation: function (start, end) { if (this.needPositions) { return this.locationMap.getLocationRange(start, end, this.filename) } return null }, getLocationFromList: function (list) { if (this.needPositions) { var head = this.getFirstListNode(list); var tail = this.getLastListNode(list); return this.locationMap.getLocationRange(head !== null ? head.loc.start.offset - this.locationMap.startOffset : this.scanner.tokenStart, tail !== null ? tail.loc.end.offset - this.locationMap.startOffset : this.scanner.tokenStart, this.filename) } return null }, error: function (message, offset) { var location = typeof offset !== "undefined" && offset < this.scanner.source.length ? this.locationMap.getLocation(offset) : this.scanner.eof ? this.locationMap.getLocation(findWhiteSpaceStart$1(this.scanner.source, this.scanner.source.length - 1)) : this.locationMap.getLocation(this.scanner.tokenStart); throw new _SyntaxError$1(message || "Unexpected input", this.scanner.source, location.offset, location.line, location.column) } }; config = processConfig(config || {}); for (var key in config) { parser[key] = config[key] } return function (source, options) { options = options || {}; var context = options.context || "default"; var ast; tokenizer(source, parser.scanner); parser.locationMap.setSource(source, options.offset, options.line, options.column); parser.filename = options.filename || "<unknown>"; parser.needPositions = Boolean(options.positions); parser.onParseError = typeof options.onParseError === "function" ? options.onParseError : noop$2; parser.onParseErrorThrow = false; parser.parseAtrulePrelude = "parseAtrulePrelude" in options ? Boolean(options.parseAtrulePrelude) : true; parser.parseRulePrelude = "parseRulePrelude" in options ? Boolean(options.parseRulePrelude) : true; parser.parseValue = "parseValue" in options ? Boolean(options.parseValue) : true; parser.parseCustomProperty = "parseCustomProperty" in options ? Boolean(options.parseCustomProperty) : false; if (!parser.context.hasOwnProperty(context)) { throw new Error("Unknown context `" + context + "`") } ast = parser.context[context].call(parser, options); if (!parser.scanner.eof) { parser.error() } return ast } }; var intToCharMap = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(""); var encode = function (number) { if (0 <= number && number < intToCharMap.length) { return intToCharMap[number] } throw new TypeError("Must be between 0 and 63: " + number) }; var decode = function (charCode) { var bigA = 65; var bigZ = 90; var littleA = 97; var littleZ = 122; var zero = 48; var nine = 57; var plus = 43; var slash = 47; var littleOffset = 26; var numberOffset = 52; if (bigA <= charCode && charCode <= bigZ) { return charCode - bigA } if (littleA <= charCode && charCode <= littleZ) { return charCode - littleA + littleOffset } if (zero <= charCode && charCode <= nine) { return charCode - zero + numberOffset } if (charCode == plus) { return 62 } if (charCode == slash) { return 63 } return -1 }; var base64 = { encode: encode, decode: decode }; var VLQ_BASE_SHIFT = 5; var VLQ_BASE = 1 << VLQ_BASE_SHIFT; var VLQ_BASE_MASK = VLQ_BASE - 1; var VLQ_CONTINUATION_BIT = VLQ_BASE; function toVLQSigned(aValue) { return aValue < 0 ? (-aValue << 1) + 1 : (aValue << 1) + 0 } function fromVLQSigned(aValue) { var isNegative = (aValue & 1) === 1; var shifted = aValue >> 1; return isNegative ? -shifted : shifted } var encode$1 = function base64VLQ_encode(aValue) { var encoded = ""; var digit; var vlq = toVLQSigned(aValue); do { digit = vlq & VLQ_BASE_MASK; vlq >>>= VLQ_BASE_SHIFT; if (vlq > 0) { digit |= VLQ_CONTINUATION_BIT } encoded += base64.encode(digit) } while (vlq > 0); return encoded }; var decode$1 = function base64VLQ_decode(aStr, aIndex, aOutParam) { var strLen = aStr.length; var result = 0; var shift = 0; var continuation, digit; do { if (aIndex >= strLen) { throw new Error("Expected more digits in base 64 VLQ value.") } digit = base64.decode(aStr.charCodeAt(aIndex++)); if (digit === -1) { throw new Error("Invalid base64 digit: " + aStr.charAt(aIndex - 1)) } continuation = !!(digit & VLQ_CONTINUATION_BIT); digit &= VLQ_BASE_MASK; result = result + (digit << shift); shift += VLQ_BASE_SHIFT } while (continuation); aOutParam.value = fromVLQSigned(result); aOutParam.rest = aIndex }; var base64Vlq = { encode: encode$1, decode: decode$1 }; function createCommonjsModule(fn, module) { return module = { exports: {} }, fn(module, module.exports), module.exports } function getCjsExportFromNamespace(n) { return n && n["default"] || n } var util = createCommonjsModule((function (module, exports) { function getArg(aArgs, aName, aDefaultValue) { if (aName in aArgs) { return aArgs[aName] } else if (arguments.length === 3) { return aDefaultValue } else { throw new Error('"' + aName + '" is a required argument.') } } exports.getArg = getArg; var urlRegexp = /^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.-]*)(?::(\d+))?(.*)$/; var dataUrlRegexp = /^data:.+\,.+$/; function urlParse(aUrl) { var match = aUrl.match(urlRegexp); if (!match) { return null } return { scheme: match[1], auth: match[2], host: match[3], port: match[4], path: match[5] } } exports.urlParse = urlParse; function urlGenerate(aParsedUrl) { var url = ""; if (aParsedUrl.scheme) { url += aParsedUrl.scheme + ":" } url += "//"; if (aParsedUrl.auth) { url += aParsedUrl.auth + "@" } if (aParsedUrl.host) { url += aParsedUrl.host } if (aParsedUrl.port) { url += ":" + aParsedUrl.port } if (aParsedUrl.path) { url += aParsedUrl.path } return url } exports.urlGenerate = urlGenerate; function normalize(aPath) { var path = aPath; var url = urlParse(aPath); if (url) { if (!url.path) { return aPath } path = url.path } var isAbsolute = exports.isAbsolute(path); var parts = path.split(/\/+/); for (var part, up = 0, i = parts.length - 1; i >= 0; i--) { part = parts[i]; if (part === ".") { parts.splice(i, 1) } else if (part === "..") { up++ } else if (up > 0) { if (part === "") { parts.splice(i + 1, up); up = 0 } else { parts.splice(i, 2); up-- } } } path = parts.join("/"); if (path === "") { path = isAbsolute ? "/" : "." } if (url) { url.path = path; return urlGenerate(url) } return path } exports.normalize = normalize; function join(aRoot, aPath) { if (aRoot === "") { aRoot = "." } if (aPath === "") { aPath = "." } var aPathUrl = urlParse(aPath); var aRootUrl = urlParse(aRoot); if (aRootUrl) { aRoot = aRootUrl.path || "/" } if (aPathUrl && !aPathUrl.scheme) { if (aRootUrl) { aPathUrl.scheme = aRootUrl.scheme } return urlGenerate(aPathUrl) } if (aPathUrl || aPath.match(dataUrlRegexp)) { return aPath } if (aRootUrl && !aRootUrl.host && !aRootUrl.path) { aRootUrl.host = aPath; return urlGenerate(aRootUrl) } var joined = aPath.charAt(0) === "/" ? aPath : normalize(aRoot.replace(/\/+$/, "") + "/" + aPath); if (aRootUrl) { aRootUrl.path = joined; return urlGenerate(aRootUrl) } return joined } exports.join = join; exports.isAbsolute = function (aPath) { return aPath.charAt(0) === "/" || urlRegexp.test(aPath) }; function relative(aRoot, aPath) { if (aRoot === "") { aRoot = "." } aRoot = aRoot.replace(/\/$/, ""); var level = 0; while (aPath.indexOf(aRoot + "/") !== 0) { var index = aRoot.lastIndexOf("/"); if (index < 0) { return aPath } aRoot = aRoot.slice(0, index); if (aRoot.match(/^([^\/]+:\/)?\/*$/)) { return aPath } ++level } return Array(level + 1).join("../") + aPath.substr(aRoot.length + 1) } exports.relative = relative; var supportsNullProto = function () { var obj = Object.create(null); return !("__proto__" in obj) }(); function identity(s) { return s } function toSetString(aStr) { if (isProtoString(aStr)) { return "$" + aStr } return aStr } exports.toSetString = supportsNullProto ? identity : toSetString; function fromSetString(aStr) { if (isProtoString(aStr)) { return aStr.slice(1) } return aStr } exports.fromSetString = supportsNullProto ? identity : fromSetString; function isProtoString(s) { if (!s) { return false } var length = s.length; if (length < 9) { return false } if (s.charCodeAt(length - 1) !== 95 || s.charCodeAt(length - 2) !== 95 || s.charCodeAt(length - 3) !== 111 || s.charCodeAt(length - 4) !== 116 || s.charCodeAt(length - 5) !== 111 || s.charCodeAt(length - 6) !== 114 || s.charCodeAt(length - 7) !== 112 || s.charCodeAt(length - 8) !== 95 || s.charCodeAt(length - 9) !== 95) { return false } for (var i = length - 10; i >= 0; i--) { if (s.charCodeAt(i) !== 36) { return false } } return true } function compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) { var cmp = strcmp(mappingA.source, mappingB.source); if (cmp !== 0) { return cmp } cmp = mappingA.originalLine - mappingB.originalLine; if (cmp !== 0) { return cmp } cmp = mappingA.originalColumn - mappingB.originalColumn; if (cmp !== 0 || onlyCompareOriginal) { return cmp } cmp = mappingA.generatedColumn - mappingB.generatedColumn; if (cmp !== 0) { return cmp } cmp = mappingA.generatedLine - mappingB.generatedLine; if (cmp !== 0) { return cmp } return strcmp(mappingA.name, mappingB.name) } exports.compareByOriginalPositions = compareByOriginalPositions; function compareByGeneratedPositionsDeflated(mappingA, mappingB, onlyCompareGenerated) { var cmp = mappingA.generatedLine - mappingB.generatedLine; if (cmp !== 0) { return cmp } cmp = mappingA.generatedColumn - mappingB.generatedColumn; if (cmp !== 0 || onlyCompareGenerated) { return cmp } cmp = strcmp(mappingA.source, mappingB.source); if (cmp !== 0) { return cmp } cmp = mappingA.originalLine - mappingB.originalLine; if (cmp !== 0) { return cmp } cmp = mappingA.originalColumn - mappingB.originalColumn; if (cmp !== 0) { return cmp } return strcmp(mappingA.name, mappingB.name) } exports.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated; function strcmp(aStr1, aStr2) { if (aStr1 === aStr2) { return 0 } if (aStr1 === null) { return 1 } if (aStr2 === null) { return -1 } if (aStr1 > aStr2) { return 1 } return -1 } function compareByGeneratedPositionsInflated(mappingA, mappingB) { var cmp = mappingA.generatedLine - mappingB.generatedLine; if (cmp !== 0) { return cmp } cmp = mappingA.generatedColumn - mappingB.generatedColumn; if (cmp !== 0) { return cmp } cmp = strcmp(mappingA.source, mappingB.source); if (cmp !== 0) { return cmp } cmp = mappingA.originalLine - mappingB.originalLine; if (cmp !== 0) { return cmp } cmp = mappingA.originalColumn - mappingB.originalColumn; if (cmp !== 0) { return cmp } return strcmp(mappingA.name, mappingB.name) } exports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated; function parseSourceMapInput(str) { return JSON.parse(str.replace(/^\)]}'[^\n]*\n/, "")) } exports.parseSourceMapInput = parseSourceMapInput; function computeSourceURL(sourceRoot, sourceURL, sourceMapURL) { sourceURL = sourceURL || ""; if (sourceRoot) { if (sourceRoot[sourceRoot.length - 1] !== "/" && sourceURL[0] !== "/") { sourceRoot += "/" } sourceURL = sourceRoot + sourceURL } if (sourceMapURL) { var parsed = urlParse(sourceMapURL); if (!parsed) { throw new Error("sourceMapURL could not be parsed") } if (parsed.path) { var index = parsed.path.lastIndexOf("/"); if (index >= 0) { parsed.path = parsed.path.substring(0, index + 1) } } sourceURL = join(urlGenerate(parsed), sourceURL) } return normalize(sourceURL) } exports.computeSourceURL = computeSourceURL })); var util_1 = util.getArg; var util_2 = util.urlParse; var util_3 = util.urlGenerate; var util_4 = util.normalize; var util_5 = util.join; var util_6 = util.isAbsolute; var util_7 = util.relative; var util_8 = util.toSetString; var util_9 = util.fromSetString; var util_10 = util.compareByOriginalPositions; var util_11 = util.compareByGeneratedPositionsDeflated; var util_12 = util.compareByGeneratedPositionsInflated; var util_13 = util.parseSourceMapInput; var util_14 = util.computeSourceURL; var has = Object.prototype.hasOwnProperty; var hasNativeMap = typeof Map !== "undefined"; function ArraySet() { this._array = []; this._set = hasNativeMap ? new Map : Object.create(null) } ArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) { var set = new ArraySet; for (var i = 0, len = aArray.length; i < len; i++) { set.add(aArray[i], aAllowDuplicates) } return set }; ArraySet.prototype.size = function ArraySet_size() { return hasNativeMap ? this._set.size : Object.getOwnPropertyNames(this._set).length }; ArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) { var sStr = hasNativeMap ? aStr : util.toSetString(aStr); var isDuplicate = hasNativeMap ? this.has(aStr) : has.call(this._set, sStr); var idx = this._array.length; if (!isDuplicate || aAllowDuplicates) { this._array.push(aStr) } if (!isDuplicate) { if (hasNativeMap) { this._set.set(aStr, idx) } else { this._set[sStr] = idx } } }; ArraySet.prototype.has = function ArraySet_has(aStr) { if (hasNativeMap) { return this._set.has(aStr) } else { var sStr = util.toSetString(aStr); return has.call(this._set, sStr) } }; ArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) { if (hasNativeMap) { var idx = this._set.get(aStr); if (idx >= 0) { return idx } } else { var sStr = util.toSetString(aStr); if (has.call(this._set, sStr)) { return this._set[sStr] } } throw new Error('"' + aStr + '" is not in the set.') }; ArraySet.prototype.at = function ArraySet_at(aIdx) { if (aIdx >= 0 && aIdx < this._array.length) { return this._array[aIdx] } throw new Error("No element indexed by " + aIdx) }; ArraySet.prototype.toArray = function ArraySet_toArray() { return this._array.slice() }; var ArraySet_1 = ArraySet; var arraySet = { ArraySet: ArraySet_1 }; function generatedPositionAfter(mappingA, mappingB) { var lineA = mappingA.generatedLine; var lineB = mappingB.generatedLine; var columnA = mappingA.generatedColumn; var columnB = mappingB.generatedColumn; return lineB > lineA || lineB == lineA && columnB >= columnA || util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0 } function MappingList() { this._array = []; this._sorted = true; this._last = { generatedLine: -1, generatedColumn: 0 } } MappingList.prototype.unsortedForEach = function MappingList_forEach(aCallback, aThisArg) { this._array.forEach(aCallback, aThisArg) }; MappingList.prototype.add = function MappingList_add(aMapping) { if (generatedPositionAfter(this._last, aMapping)) { this._last = aMapping; this._array.push(aMapping) } else { this._sorted = false; this._array.push(aMapping) } }; MappingList.prototype.toArray = function MappingList_toArray() { if (!this._sorted) { this._array.sort(util.compareByGeneratedPositionsInflated); this._sorted = true } return this._array }; var MappingList_1 = MappingList; var mappingList = { MappingList: MappingList_1 }; var ArraySet$1 = arraySet.ArraySet; var MappingList$1 = mappingList.MappingList; function SourceMapGenerator(aArgs) { if (!aArgs) { aArgs = {} } this._file = util.getArg(aArgs, "file", null); this._sourceRoot = util.getArg(aArgs, "sourceRoot", null); this._skipValidation = util.getArg(aArgs, "skipValidation", false); this._sources = new ArraySet$1; this._names = new ArraySet$1; this._mappings = new MappingList$1; this._sourcesContents = null } SourceMapGenerator.prototype._version = 3; SourceMapGenerator.fromSourceMap = function SourceMapGenerator_fromSourceMap(aSourceMapConsumer) { var sourceRoot = aSourceMapConsumer.sourceRoot; var generator = new SourceMapGenerator({ file: aSourceMapConsumer.file, sourceRoot: sourceRoot }); aSourceMapConsumer.eachMapping((function (mapping) { var newMapping = { generated: { line: mapping.generatedLine, column: mapping.generatedColumn } }; if (mapping.source != null) { newMapping.source = mapping.source; if (sourceRoot != null) { newMapping.source = util.relative(sourceRoot, newMapping.source) } newMapping.original = { line: mapping.originalLine, column: mapping.originalColumn }; if (mapping.name != null) { newMapping.name = mapping.name } } generator.addMapping(newMapping) })); aSourceMapConsumer.sources.forEach((function (sourceFile) { var sourceRelative = sourceFile; if (sourceRoot !== null) { sourceRelative = util.relative(sourceRoot, sourceFile) } if (!generator._sources.has(sourceRelative)) { generator._sources.add(sourceRelative) } var content = aSourceMapConsumer.sourceContentFor(sourceFile); if (content != null) { generator.setSourceContent(sourceFile, content) } })); return generator }; SourceMapGenerator.prototype.addMapping = function SourceMapGenerator_addMapping(aArgs) { var generated = util.getArg(aArgs, "generated"); var original = util.getArg(aArgs, "original", null); var source = util.getArg(aArgs, "source", null); var name = util.getArg(aArgs, "name", null); if (!this._skipValidation) { this._validateMapping(generated, original, source, name) } if (source != null) { source = String(source); if (!this._sources.has(source)) { this._sources.add(source) } } if (name != null) { name = String(name); if (!this._names.has(name)) { this._names.add(name) } } this._mappings.add({ generatedLine: generated.line, generatedColumn: generated.column, originalLine: original != null && original.line, originalColumn: original != null && original.column, source: source, name: name }) }; SourceMapGenerator.prototype.setSourceContent = function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) { var source = aSourceFile; if (this._sourceRoot != null) { source = util.relative(this._sourceRoot, source) } if (aSourceContent != null) { if (!this._sourcesContents) { this._sourcesContents = Object.create(null) } this._sourcesContents[util.toSetString(source)] = aSourceContent } else if (this._sourcesContents) { delete this._sourcesContents[util.toSetString(source)]; if (Object.keys(this._sourcesContents).length === 0) { this._sourcesContents = null } } }; SourceMapGenerator.prototype.applySourceMap = function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile, aSourceMapPath) { var sourceFile = aSourceFile; if (aSourceFile == null) { if (aSourceMapConsumer.file == null) { throw new Error("SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, " + 'or the source map\'s "file" property. Both were omitted.') } sourceFile = aSourceMapConsumer.file } var sourceRoot = this._sourceRoot; if (sourceRoot != null) { sourceFile = util.relative(sourceRoot, sourceFile) } var newSources = new ArraySet$1; var newNames = new ArraySet$1; this._mappings.unsortedForEach((function (mapping) { if (mapping.source === sourceFile && mapping.originalLine != null) { var original = aSourceMapConsumer.originalPositionFor({ line: mapping.originalLine, column: mapping.originalColumn }); if (original.source != null) { mapping.source = original.source; if (aSourceMapPath != null) { mapping.source = util.join(aSourceMapPath, mapping.source) } if (sourceRoot != null) { mapping.source = util.relative(sourceRoot, mapping.source) } mapping.originalLine = original.line; mapping.originalColumn = original.column; if (original.name != null) { mapping.name = original.name } } } var source = mapping.source; if (source != null && !newSources.has(source)) { newSources.add(source) } var name = mapping.name; if (name != null && !newNames.has(name)) { newNames.add(name) } }), this); this._sources = newSources; this._names = newNames; aSourceMapConsumer.sources.forEach((function (sourceFile) { var content = aSourceMapConsumer.sourceContentFor(sourceFile); if (content != null) { if (aSourceMapPath != null) { sourceFile = util.join(aSourceMapPath, sourceFile) } if (sourceRoot != null) { sourceFile = util.relative(sourceRoot, sourceFile) } this.setSourceContent(sourceFile, content) } }), this) }; SourceMapGenerator.prototype._validateMapping = function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource, aName) { if (aOriginal && typeof aOriginal.line !== "number" && typeof aOriginal.column !== "number") { throw new Error("original.line and original.column are not numbers -- you probably meant to omit " + "the original mapping entirely and only map the generated position. If so, pass " + "null for the original mapping instead of an object with empty or null values.") } if (aGenerated && "line" in aGenerated && "column" in aGenerated && aGenerated.line > 0 && aGenerated.column >= 0 && !aOriginal && !aSource && !aName) { return } else if (aGenerated && "line" in aGenerated && "column" in aGenerated && aOriginal && "line" in aOriginal && "column" in aOriginal && aGenerated.line > 0 && aGenerated.column >= 0 && aOriginal.line > 0 && aOriginal.column >= 0 && aSource) { return } else { throw new Error("Invalid mapping: " + JSON.stringify({ generated: aGenerated, source: aSource, original: aOriginal, name: aName })) } }; SourceMapGenerator.prototype._serializeMappings = function SourceMapGenerator_serializeMappings() { var previousGeneratedColumn = 0; var previousGeneratedLine = 1; var previousOriginalColumn = 0; var previousOriginalLine = 0; var previousName = 0; var previousSource = 0; var result = ""; var next; var mapping; var nameIdx; var sourceIdx; var mappings = this._mappings.toArray(); for (var i = 0, len = mappings.length; i < len; i++) { mapping = mappings[i]; next = ""; if (mapping.generatedLine !== previousGeneratedLine) { previousGeneratedColumn = 0; while (mapping.generatedLine !== previousGeneratedLine) { next += ";"; previousGeneratedLine++ } } else { if (i > 0) { if (!util.compareByGeneratedPositionsInflated(mapping, mappings[i - 1])) { continue } next += "," } } next += base64Vlq.encode(mapping.generatedColumn - previousGeneratedColumn); previousGeneratedColumn = mapping.generatedColumn; if (mapping.source != null) { sourceIdx = this._sources.indexOf(mapping.source); next += base64Vlq.encode(sourceIdx - previousSource); previousSource = sourceIdx; next += base64Vlq.encode(mapping.originalLine - 1 - previousOriginalLine); previousOriginalLine = mapping.originalLine - 1; next += base64Vlq.encode(mapping.originalColumn - previousOriginalColumn); previousOriginalColumn = mapping.originalColumn; if (mapping.name != null) { nameIdx = this._names.indexOf(mapping.name); next += base64Vlq.encode(nameIdx - previousName); previousName = nameIdx } } result += next } return result }; SourceMapGenerator.prototype._generateSourcesContent = function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) { return aSources.map((function (source) { if (!this._sourcesContents) { return null } if (aSourceRoot != null) { source = util.relative(aSourceRoot, source) } var key = util.toSetString(source); return Object.prototype.hasOwnProperty.call(this._sourcesContents, key) ? this._sourcesContents[key] : null }), this) }; SourceMapGenerator.prototype.toJSON = function SourceMapGenerator_toJSON() { var map = { version: this._version, sources: this._sources.toArray(), names: this._names.toArray(), mappings: this._serializeMappings() }; if (this._file != null) { map.file = this._file } if (this._sourceRoot != null) { map.sourceRoot = this._sourceRoot } if (this._sourcesContents) { map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot) } return map }; SourceMapGenerator.prototype.toString = function SourceMapGenerator_toString() { return JSON.stringify(this.toJSON()) }; var SourceMapGenerator_1 = SourceMapGenerator; var sourceMapGenerator = { SourceMapGenerator: SourceMapGenerator_1 }; var SourceMapGenerator$1 = sourceMapGenerator.SourceMapGenerator; var trackNodes = { Atrule: true, Selector: true, Declaration: true }; var sourceMap = function generateSourceMap(handlers) { var map = new SourceMapGenerator$1; var line = 1; var column = 0; var generated = { line: 1, column: 0 }; var original = { line: 0, column: 0 }; var sourceMappingActive = false; var activatedGenerated = { line: 1, column: 0 }; var activatedMapping = { generated: activatedGenerated }; var handlersNode = handlers.node; handlers.node = function (node) { if (node.loc && node.loc.start && trackNodes.hasOwnProperty(node.type)) { var nodeLine = node.loc.start.line; var nodeColumn = node.loc.start.column - 1; if (original.line !== nodeLine || original.column !== nodeColumn) { original.line = nodeLine; original.column = nodeColumn; generated.line = line; generated.column = column; if (sourceMappingActive) { sourceMappingActive = false; if (generated.line !== activatedGenerated.line || generated.column !== activatedGenerated.column) { map.addMapping(activatedMapping) } } sourceMappingActive = true; map.addMapping({ source: node.loc.source, original: original, generated: generated }) } } handlersNode.call(this, node); if (sourceMappingActive && trackNodes.hasOwnProperty(node.type)) { activatedGenerated.line = line; activatedGenerated.column = column } }; var handlersChunk = handlers.chunk; handlers.chunk = function (chunk) { for (var i = 0; i < chunk.length; i++) { if (chunk.charCodeAt(i) === 10) { line++; column = 0 } else { column++ } } handlersChunk(chunk) }; var handlersResult = handlers.result; handlers.result = function () { if (sourceMappingActive) { map.addMapping(activatedMapping) } return { css: handlersResult(), map: map } }; return handlers }; var hasOwnProperty$3 = Object.prototype.hasOwnProperty; function processChildren(node, delimeter) { var list = node.children; var prev = null; if (typeof delimeter !== "function") { list.forEach(this.node, this) } else { list.forEach((function (node) { if (prev !== null) { delimeter.call(this, prev) } this.node(node); prev = node }), this) } } var create$1 = function createGenerator(config) { function processNode(node) { if (hasOwnProperty$3.call(types, node.type)) { types[node.type].call(this, node) } else { throw new Error("Unknown node type: " + node.type) } } var types = {}; if (config.node) { for (var name in config.node) { types[name] = config.node[name].generate } } return function (node, options) { var buffer = ""; var handlers = { children: processChildren, node: processNode, chunk: function (chunk) { buffer += chunk }, result: function () { return buffer } }; if (options) { if (typeof options.decorator === "function") { handlers = options.decorator(handlers) } if (options.sourceMap) { handlers = sourceMap(handlers) } } handlers.node(node); return handlers.result() } }; var hasOwnProperty$4 = Object.prototype.hasOwnProperty; var shape = { generic: true, types: {}, properties: {}, parseContext: {}, scope: {}, atrule: ["parse"], pseudo: ["parse"], node: ["name", "structure", "parse", "generate", "walkContext"] }; function isObject(value) { return value && value.constructor === Object } function copy(value) { if (isObject(value)) { var res = {}; for (var key in value) { if (hasOwnProperty$4.call(value, key)) { res[key] = value[key] } } return res } else { return value } } function extend(dest, src) { for (var key in src) { if (hasOwnProperty$4.call(src, key)) { if (isObject(dest[key])) { extend(dest[key], copy(src[key])) } else { dest[key] = copy(src[key]) } } } } function mix(dest, src, shape) { for (var key in shape) { if (hasOwnProperty$4.call(shape, key) === false) { continue } if (shape[key] === true) { if (key in src) { if (hasOwnProperty$4.call(src, key)) { dest[key] = copy(src[key]) } } } else if (shape[key]) { if (isObject(shape[key])) { var res = {}; extend(res, dest[key]); extend(res, src[key]); dest[key] = res } else if (Array.isArray(shape[key])) { var res = {}; var innerShape = shape[key].reduce((function (s, k) { s[k] = true; return s }), {}); for (var name in dest[key]) { if (hasOwnProperty$4.call(dest[key], name)) { res[name] = {}; if (dest[key] && dest[key][name]) { mix(res[name], dest[key][name], innerShape) } } } for (var name in src[key]) { if (hasOwnProperty$4.call(src[key], name)) { if (!res[name]) { res[name] = {} } if (src[key] && src[key][name]) { mix(res[name], src[key][name], innerShape) } } } dest[key] = res } } } return dest } var mix_1 = function (dest, src) { return mix(dest, src, shape) }; function createSyntax(config) { var parse = create(config); var generate = create$1(config); var syntax = { parse: parse, generate: generate }; syntax.lexer = new Lexer_1({ generic: true, types: config.types, properties: config.properties, node: config.node }, syntax); return syntax } var create_1 = function (config) { return createSyntax(mix_1({}, config)) }; var create$2 = { create: create_1 }; var generic$1 = true; var types = { "absolute-size": "xx-small|x-small|small|medium|large|x-large|xx-large", "alpha-value": "<number>|<percentage>", "angle-percentage": "<angle>|<percentage>", "angular-color-hint": "<angle-percentage>", "angular-color-stop": "<color>&&<color-stop-angle>?", "angular-color-stop-list": "[<angular-color-stop> [, <angular-color-hint>]?]# , <angular-color-stop>", "animateable-feature": "scroll-position|contents|<custom-ident>", attachment: "scroll|fixed|local", "attr()": "attr( <attr-name> <type-or-unit>? [, <attr-fallback>]? )", "attr-matcher": "['~'|'|'|'^'|'$'|'*']? '='", "attr-modifier": "i|s", "attribute-selector": "'[' <wq-name> ']'|'[' <wq-name> <attr-matcher> [<string-token>|<ident-token>] <attr-modifier>? ']'", "auto-repeat": "repeat( [auto-fill|auto-fit] , [<line-names>? <fixed-size>]+ <line-names>? )", "auto-track-list": "[<line-names>? [<fixed-size>|<fixed-repeat>]]* <line-names>? <auto-repeat> [<line-names>? [<fixed-size>|<fixed-repeat>]]* <line-names>?", "baseline-position": "[first|last]? baseline", "basic-shape": "<inset()>|<circle()>|<ellipse()>|<polygon()>", "bg-image": "none|<image>", "bg-layer": "<bg-image>||<bg-position> [/ <bg-size>]?||<repeat-style>||<attachment>||<box>||<box>", "bg-position": "[[left|center|right|top|bottom|<length-percentage>]|[left|center|right|<length-percentage>] [top|center|bottom|<length-percentage>]|[center|[left|right] <length-percentage>?]&&[center|[top|bottom] <length-percentage>?]]", "bg-size": "[<length-percentage>|auto]{1,2}|cover|contain", "blur()": "blur( <length> )", "blend-mode": "normal|multiply|screen|overlay|darken|lighten|color-dodge|color-burn|hard-light|soft-light|difference|exclusion|hue|saturation|color|luminosity", box: "border-box|padding-box|content-box", "brightness()": "brightness( <number-percentage> )", "calc()": "calc( <calc-sum> )", "calc-sum": "<calc-product> [['+'|'-'] <calc-product>]*", "calc-product": "<calc-value> ['*' <calc-value>|'/' <number>]*", "calc-value": "<number>|<dimension>|<percentage>|( <calc-sum> )", "cf-final-image": "<image>|<color>", "cf-mixing-image": "<percentage>?&&<image>", "circle()": "circle( [<shape-radius>]? [at <position>]? )", "clamp()": "clamp( <calc-sum>#{3} )", "class-selector": "'.' <ident-token>", "clip-source": "<url>", color: "<rgb()>|<rgba()>|<hsl()>|<hsla()>|<hex-color>|<named-color>|currentcolor|<deprecated-system-color>", "color-stop": "<color-stop-length>|<color-stop-angle>", "color-stop-angle": "<angle-percentage>{1,2}", "color-stop-length": "<length-percentage>{1,2}", "color-stop-list": "[<linear-color-stop> [, <linear-color-hint>]?]# , <linear-color-stop>", combinator: "'>'|'+'|'~'|['||']", "common-lig-values": "[common-ligatures|no-common-ligatures]", compat: "searchfield|textarea|push-button|button-bevel|slider-horizontal|checkbox|radio|square-button|menulist|menulist-button|listbox|meter|progress-bar", "composite-style": "clear|copy|source-over|source-in|source-out|source-atop|destination-over|destination-in|destination-out|destination-atop|xor", "compositing-operator": "add|subtract|intersect|exclude", "compound-selector": "[<type-selector>? <subclass-selector>* [<pseudo-element-selector> <pseudo-class-selector>*]*]!", "compound-selector-list": "<compound-selector>#", "complex-selector": "<compound-selector> [<combinator>? <compound-selector>]*", "complex-selector-list": "<complex-selector>#", "conic-gradient()": "conic-gradient( [from <angle>]? [at <position>]? , <angular-color-stop-list> )", "contextual-alt-values": "[contextual|no-contextual]", "content-distribution": "space-between|space-around|space-evenly|stretch", "content-list": "[<string>|contents|<url>|<quote>|<attr()>|counter( <ident> , <'list-style-type'>? )]+", "content-position": "center|start|end|flex-start|flex-end", "content-replacement": "<image>", "contrast()": "contrast( [<number-percentage>] )", "counter()": "counter( <custom-ident> , [<counter-style>|none]? )", "counter-style": "<counter-style-name>|symbols( )", "counter-style-name": "<custom-ident>", "counters()": "counters( <custom-ident> , <string> , [<counter-style>|none]? )", "cross-fade()": "cross-fade( <cf-mixing-image> , <cf-final-image>? )", "cubic-bezier-timing-function": "ease|ease-in|ease-out|ease-in-out|cubic-bezier( <number> , <number> , <number> , <number> )", "deprecated-system-color": "ActiveBorder|ActiveCaption|AppWorkspace|Background|ButtonFace|ButtonHighlight|ButtonShadow|ButtonText|CaptionText|GrayText|Highlight|HighlightText|InactiveBorder|InactiveCaption|InactiveCaptionText|InfoBackground|InfoText|Menu|MenuText|Scrollbar|ThreeDDarkShadow|ThreeDFace|ThreeDHighlight|ThreeDLightShadow|ThreeDShadow|Window|WindowFrame|WindowText", "discretionary-lig-values": "[discretionary-ligatures|no-discretionary-ligatures]", "display-box": "contents|none", "display-inside": "flow|flow-root|table|flex|grid|ruby", "display-internal": "table-row-group|table-header-group|table-footer-group|table-row|table-cell|table-column-group|table-column|table-caption|ruby-base|ruby-text|ruby-base-container|ruby-text-container", "display-legacy": "inline-block|inline-list-item|inline-table|inline-flex|inline-grid", "display-listitem": "<display-outside>?&&[flow|flow-root]?&&list-item", "display-outside": "block|inline|run-in", "drop-shadow()": "drop-shadow( <length>{2,3} <color>? )", "east-asian-variant-values": "[jis78|jis83|jis90|jis04|simplified|traditional]", "east-asian-width-values": "[full-width|proportional-width]", "element()": "element( <id-selector> )", "ellipse()": "ellipse( [<shape-radius>{2}]? [at <position>]? )", "ending-shape": "circle|ellipse", "env()": "env( <custom-ident> , <declaration-value>? )", "explicit-track-list": "[<line-names>? <track-size>]+ <line-names>?", "family-name": "<string>|<custom-ident>+", "feature-tag-value": "<string> [<integer>|on|off]?", "feature-type": "@stylistic|@historical-forms|@styleset|@character-variant|@swash|@ornaments|@annotation", "feature-value-block": "<feature-type> '{' <feature-value-declaration-list> '}'", "feature-value-block-list": "<feature-value-block>+", "feature-value-declaration": "<custom-ident> : <integer>+ ;", "feature-value-declaration-list": "<feature-value-declaration>", "feature-value-name": "<custom-ident>", "fill-rule": "nonzero|evenodd", "filter-function": "<blur()>|<brightness()>|<contrast()>|<drop-shadow()>|<grayscale()>|<hue-rotate()>|<invert()>|<opacity()>|<saturate()>|<sepia()>", "filter-function-list": "[<filter-function>|<url>]+", "final-bg-layer": "<'background-color'>||<bg-image>||<bg-position> [/ <bg-size>]?||<repeat-style>||<attachment>||<box>||<box>", "fit-content()": "fit-content( [<length>|<percentage>] )", "fixed-breadth": "<length-percentage>", "fixed-repeat": "repeat( [<positive-integer>] , [<line-names>? <fixed-size>]+ <line-names>? )", "fixed-size": "<fixed-breadth>|minmax( <fixed-breadth> , <track-breadth> )|minmax( <inflexible-breadth> , <fixed-breadth> )", "font-stretch-absolute": "normal|ultra-condensed|extra-condensed|condensed|semi-condensed|semi-expanded|expanded|extra-expanded|ultra-expanded|<percentage>", "font-variant-css21": "[normal|small-caps]", "font-weight-absolute": "normal|bold|<number>", "frequency-percentage": "<frequency>|<percentage>", "general-enclosed": "[<function-token> <any-value> )]|( <ident> <any-value> )", "generic-family": "serif|sans-serif|cursive|fantasy|monospace|-apple-system", "generic-name": "serif|sans-serif|cursive|fantasy|monospace", "geometry-box": "<shape-box>|fill-box|stroke-box|view-box", gradient: "<linear-gradient()>|<repeating-linear-gradient()>|<radial-gradient()>|<repeating-radial-gradient()>|<conic-gradient()>|<-legacy-gradient>", "grayscale()": "grayscale( <number-percentage> )", "grid-line": "auto|<custom-ident>|[<integer>&&<custom-ident>?]|[span&&[<integer>||<custom-ident>]]", "historical-lig-values": "[historical-ligatures|no-historical-ligatures]", "hsl()": "hsl( <hue> <percentage> <percentage> [/ <alpha-value>]? )|hsl( <hue> , <percentage> , <percentage> , <alpha-value>? )", "hsla()": "hsla( <hue> <percentage> <percentage> [/ <alpha-value>]? )|hsla( <hue> , <percentage> , <percentage> , <alpha-value>? )", hue: "<number>|<angle>", "hue-rotate()": "hue-rotate( <angle> )", image: "<url>|<image()>|<image-set()>|<element()>|<cross-fade()>|<gradient>", "image()": "image( <image-tags>? [<image-src>? , <color>?]! )", "image-set()": "image-set( <image-set-option># )", "image-set-option": "[<image>|<string>] <resolution>", "image-src": "<url>|<string>", "image-tags": "ltr|rtl", "inflexible-breadth": "<length>|<percentage>|min-content|max-content|auto", "inset()": "inset( <length-percentage>{1,4} [round <'border-radius'>]? )", "invert()": "invert( <number-percentage> )", "keyframes-name": "<custom-ident>|<string>", "keyframe-block": "<keyframe-selector># { <declaration-list> }", "keyframe-block-list": "<keyframe-block>+", "keyframe-selector": "from|to|<percentage>", "leader()": "leader( <leader-type> )", "leader-type": "dotted|solid|space|<string>", "length-percentage": "<length>|<percentage>", "line-names": "'[' <custom-ident>* ']'", "line-name-list": "[<line-names>|<name-repeat>]+", "line-style": "none|hidden|dotted|dashed|solid|double|groove|ridge|inset|outset", "line-width": "<length>|thin|medium|thick", "linear-color-hint": "<length-percentage>", "linear-color-stop": "<color> <color-stop-length>?", "linear-gradient()": "linear-gradient( [<angle>|to <side-or-corner>]? , <color-stop-list> )", "mask-layer": "<mask-reference>||<position> [/ <bg-size>]?||<repeat-style>||<geometry-box>||[<geometry-box>|no-clip]||<compositing-operator>||<masking-mode>", "mask-position": "[<length-percentage>|left|center|right] [<length-percentage>|top|center|bottom]?", "mask-reference": "none|<image>|<mask-source>", "mask-source": "<url>", "masking-mode": "alpha|luminance|match-source", "matrix()": "matrix( <number>#{6} )", "matrix3d()": "matrix3d( <number>#{16} )", "max()": "max( <calc-sum># )", "media-and": "<media-in-parens> [and <media-in-parens>]+", "media-condition": "<media-not>|<media-and>|<media-or>|<media-in-parens>", "media-condition-without-or": "<media-not>|<media-and>|<media-in-parens>", "media-feature": "( [<mf-plain>|<mf-boolean>|<mf-range>] )", "media-in-parens": "( <media-condition> )|<media-feature>|<general-enclosed>", "media-not": "not <media-in-parens>", "media-or": "<media-in-parens> [or <media-in-parens>]+", "media-query": "<media-condition>|[not|only]? <media-type> [and <media-condition-without-or>]?", "media-query-list": "<media-query>#", "media-type": "<ident>", "mf-boolean": "<mf-name>", "mf-name": "<ident>", "mf-plain": "<mf-name> : <mf-value>", "mf-range": "<mf-name> ['<'|'>']? '='? <mf-value>|<mf-value> ['<'|'>']? '='? <mf-name>|<mf-value> '<' '='? <mf-name> '<' '='? <mf-value>|<mf-value> '>' '='? <mf-name> '>' '='? <mf-value>", "mf-value": "<number>|<dimension>|<ident>|<ratio>", "min()": "min( <calc-sum># )", "minmax()": "minmax( [<length>|<percentage>|<flex>|min-content|max-content|auto] , [<length>|<percentage>|<flex>|min-content|max-content|auto] )", "named-color": "transparent|aliceblue|antiquewhite|aqua|aquamarine|azure|beige|bisque|black|blanchedalmond|blue|blueviolet|brown|burlywood|cadetblue|chartreuse|chocolate|coral|cornflowerblue|cornsilk|crimson|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|firebrick|floralwhite|forestgreen|fuchsia|gainsboro|ghostwhite|gold|goldenrod|gray|green|greenyellow|grey|honeydew|hotpink|indianred|indigo|ivory|khaki|lavender|lavenderblush|lawngreen|lemonchiffon|lightblue|lightcoral|lightcyan|lightgoldenrodyellow|lightgray|lightgreen|lightgrey|lightpink|lightsalmon|lightseagreen|lightskyblue|lightslategray|lightslategrey|lightsteelblue|lightyellow|lime|limegreen|linen|magenta|maroon|mediumaquamarine|mediumblue|mediumorchid|mediumpurple|mediumseagreen|mediumslateblue|mediumspringgreen|mediumturquoise|mediumvioletred|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|seagreen|seashell|sienna|silver|skyblue|slateblue|slategray|slategrey|snow|springgreen|steelblue|tan|teal|thistle|tomato|turquoise|violet|wheat|white|whitesmoke|yellow|yellowgreen|<-non-standard-color>", "namespace-prefix": "<ident>", "ns-prefix": "[<ident-token>|'*']? '|'", "number-percentage": "<number>|<percentage>", "numeric-figure-values": "[lining-nums|oldstyle-nums]", "numeric-fraction-values": "[diagonal-fractions|stacked-fractions]", "numeric-spacing-values": "[proportional-nums|tabular-nums]", nth: "<an-plus-b>|even|odd", "opacity()": "opacity( [<number-percentage>] )", "overflow-position": "unsafe|safe", "outline-radius": "<length>|<percentage>", "page-body": "<declaration>? [; <page-body>]?|<page-margin-box> <page-body>", "page-margin-box": "<page-margin-box-type> '{' <declaration-list> '}'", "page-margin-box-type": "@top-left-corner|@top-left|@top-center|@top-right|@top-right-corner|@bottom-left-corner|@bottom-left|@bottom-center|@bottom-right|@bottom-right-corner|@left-top|@left-middle|@left-bottom|@right-top|@right-middle|@right-bottom", "page-selector-list": "[<page-selector>#]?", "page-selector": "<pseudo-page>+|<ident> <pseudo-page>*", "perspective()": "perspective( <length> )", "polygon()": "polygon( <fill-rule>? , [<length-percentage> <length-percentage>]# )", position: "[[left|center|right]||[top|center|bottom]|[left|center|right|<length-percentage>] [top|center|bottom|<length-percentage>]?|[[left|right] <length-percentage>]&&[[top|bottom] <length-percentage>]]", "pseudo-class-selector": "':' <ident-token>|':' <function-token> <any-value> ')'", "pseudo-element-selector": "':' <pseudo-class-selector>", "pseudo-page": ": [left|right|first|blank]", quote: "open-quote|close-quote|no-open-quote|no-close-quote", "radial-gradient()": "radial-gradient( [<ending-shape>||<size>]? [at <position>]? , <color-stop-list> )", "relative-selector": "<combinator>? <complex-selector>", "relative-selector-list": "<relative-selector>#", "relative-size": "larger|smaller", "repeat-style": "repeat-x|repeat-y|[repeat|space|round|no-repeat]{1,2}", "repeating-linear-gradient()": "repeating-linear-gradient( [<angle>|to <side-or-corner>]? , <color-stop-list> )", "repeating-radial-gradient()": "repeating-radial-gradient( [<ending-shape>||<size>]? [at <position>]? , <color-stop-list> )", "rgb()": "rgb( <percentage>{3} [/ <alpha-value>]? )|rgb( <number>{3} [/ <alpha-value>]? )|rgb( <percentage>#{3} , <alpha-value>? )|rgb( <number>#{3} , <alpha-value>? )", "rgba()": "rgba( <percentage>{3} [/ <alpha-value>]? )|rgba( <number>{3} [/ <alpha-value>]? )|rgba( <percentage>#{3} , <alpha-value>? )|rgba( <number>#{3} , <alpha-value>? )", "rotate()": "rotate( [<angle>|<zero>] )", "rotate3d()": "rotate3d( <number> , <number> , <number> , [<angle>|<zero>] )", "rotateX()": "rotateX( [<angle>|<zero>] )", "rotateY()": "rotateY( [<angle>|<zero>] )", "rotateZ()": "rotateZ( [<angle>|<zero>] )", "saturate()": "saturate( <number-percentage> )", "scale()": "scale( <number> , <number>? )", "scale3d()": "scale3d( <number> , <number> , <number> )", "scaleX()": "scaleX( <number> )", "scaleY()": "scaleY( <number> )", "scaleZ()": "scaleZ( <number> )", "self-position": "center|start|end|self-start|self-end|flex-start|flex-end", "shape-radius": "<length-percentage>|closest-side|farthest-side", "skew()": "skew( [<angle>|<zero>] , [<angle>|<zero>]? )", "skewX()": "skewX( [<angle>|<zero>] )", "skewY()": "skewY( [<angle>|<zero>] )", "sepia()": "sepia( <number-percentage> )", shadow: "inset?&&<length>{2,4}&&<color>?", "shadow-t": "[<length>{2,3}&&<color>?]", shape: "rect( <top> , <right> , <bottom> , <left> )|rect( <top> <right> <bottom> <left> )", "shape-box": "<box>|margin-box", "side-or-corner": "[left|right]||[top|bottom]", "single-animation": "<time>||<timing-function>||<time>||<single-animation-iteration-count>||<single-animation-direction>||<single-animation-fill-mode>||<single-animation-play-state>||[none|<keyframes-name>]", "single-animation-direction": "normal|reverse|alternate|alternate-reverse", "single-animation-fill-mode": "none|forwards|backwards|both", "single-animation-iteration-count": "infinite|<number>", "single-animation-play-state": "running|paused", "single-transition": "[none|<single-transition-property>]||<time>||<timing-function>||<time>", "single-transition-property": "all|<custom-ident>", size: "closest-side|farthest-side|closest-corner|farthest-corner|<length>|<length-percentage>{2}", "step-position": "jump-start|jump-end|jump-none|jump-both|start|end", "step-timing-function": "step-start|step-end|steps( <integer> [, <step-position>]? )", "subclass-selector": "<id-selector>|<class-selector>|<attribute-selector>|<pseudo-class-selector>", "supports-condition": "not <supports-in-parens>|<supports-in-parens> [and <supports-in-parens>]*|<supports-in-parens> [or <supports-in-parens>]*", "supports-in-parens": "( <supports-condition> )|<supports-feature>|<general-enclosed>", "supports-feature": "<supports-decl>|<supports-selector-fn>", "supports-decl": "( <declaration> )", "supports-selector-fn": "selector( <complex-selector> )", symbol: "<string>|<image>|<custom-ident>", target: "<target-counter()>|<target-counters()>|<target-text()>", "target-counter()": "target-counter( [<string>|<url>] , <custom-ident> , <counter-style>? )", "target-counters()": "target-counters( [<string>|<url>] , <custom-ident> , <string> , <counter-style>? )", "target-text()": "target-text( [<string>|<url>] , [content|before|after|first-letter]? )", "time-percentage": "<time>|<percentage>", "timing-function": "linear|<cubic-bezier-timing-function>|<step-timing-function>", "track-breadth": "<length-percentage>|<flex>|min-content|max-content|auto", "track-list": "[<line-names>? [<track-size>|<track-repeat>]]+ <line-names>?", "track-repeat": "repeat( [<positive-integer>] , [<line-names>? <track-size>]+ <line-names>? )", "track-size": "<track-breadth>|minmax( <inflexible-breadth> , <track-breadth> )|fit-content( [<length>|<percentage>] )", "transform-function": "<matrix()>|<translate()>|<translateX()>|<translateY()>|<scale()>|<scaleX()>|<scaleY()>|<rotate()>|<skew()>|<skewX()>|<skewY()>|<matrix3d()>|<translate3d()>|<translateZ()>|<scale3d()>|<scaleZ()>|<rotate3d()>|<rotateX()>|<rotateY()>|<rotateZ()>|<perspective()>", "transform-list": "<transform-function>+", "translate()": "translate( <length-percentage> , <length-percentage>? )", "translate3d()": "translate3d( <length-percentage> , <length-percentage> , <length> )", "translateX()": "translateX( <length-percentage> )", "translateY()": "translateY( <length-percentage> )", "translateZ()": "translateZ( <length> )", "type-or-unit": "string|color|url|integer|number|length|angle|time|frequency|cap|ch|em|ex|ic|lh|rlh|rem|vb|vi|vw|vh|vmin|vmax|mm|Q|cm|in|pt|pc|px|deg|grad|rad|turn|ms|s|Hz|kHz|%", "type-selector": "<wq-name>|<ns-prefix>? '*'", "var()": "var( <custom-property-name> , <declaration-value>? )", "viewport-length": "auto|<length-percentage>", "wq-name": "<ns-prefix>? <ident-token>", "-legacy-gradient": "<-webkit-gradient()>|<-legacy-linear-gradient>|<-legacy-repeating-linear-gradient>|<-legacy-radial-gradient>|<-legacy-repeating-radial-gradient>", "-legacy-linear-gradient": "-moz-linear-gradient( <-legacy-linear-gradient-arguments> )|-webkit-linear-gradient( <-legacy-linear-gradient-arguments> )|-o-linear-gradient( <-legacy-linear-gradient-arguments> )", "-legacy-repeating-linear-gradient": "-moz-repeating-linear-gradient( <-legacy-linear-gradient-arguments> )|-webkit-repeating-linear-gradient( <-legacy-linear-gradient-arguments> )|-o-repeating-linear-gradient( <-legacy-linear-gradient-arguments> )", "-legacy-linear-gradient-arguments": "[<angle>|<side-or-corner>]? , <color-stop-list>", "-legacy-radial-gradient": "-moz-radial-gradient( <-legacy-radial-gradient-arguments> )|-webkit-radial-gradient( <-legacy-radial-gradient-arguments> )|-o-radial-gradient( <-legacy-radial-gradient-arguments> )", "-legacy-repeating-radial-gradient": "-moz-repeating-radial-gradient( <-legacy-radial-gradient-arguments> )|-webkit-repeating-radial-gradient( <-legacy-radial-gradient-arguments> )|-o-repeating-radial-gradient( <-legacy-radial-gradient-arguments> )", "-legacy-radial-gradient-arguments": "[<position> ,]? [[[<-legacy-radial-gradient-shape>||<-legacy-radial-gradient-size>]|[<length>|<percentage>]{2}] ,]? <color-stop-list>", "-legacy-radial-gradient-size": "closest-side|closest-corner|farthest-side|farthest-corner|contain|cover", "-legacy-radial-gradient-shape": "circle|ellipse", "-non-standard-font": "-apple-system-body|-apple-system-headline|-apple-system-subheadline|-apple-system-caption1|-apple-system-caption2|-apple-system-footnote|-apple-system-short-body|-apple-system-short-headline|-apple-system-short-subheadline|-apple-system-short-caption1|-apple-system-short-footnote|-apple-system-tall-body", "-non-standard-color": "-moz-ButtonDefault|-moz-ButtonHoverFace|-moz-ButtonHoverText|-moz-CellHighlight|-moz-CellHighlightText|-moz-Combobox|-moz-ComboboxText|-moz-Dialog|-moz-DialogText|-moz-dragtargetzone|-moz-EvenTreeRow|-moz-Field|-moz-FieldText|-moz-html-CellHighlight|-moz-html-CellHighlightText|-moz-mac-accentdarkestshadow|-moz-mac-accentdarkshadow|-moz-mac-accentface|-moz-mac-accentlightesthighlight|-moz-mac-accentlightshadow|-moz-mac-accentregularhighlight|-moz-mac-accentregularshadow|-moz-mac-chrome-active|-moz-mac-chrome-inactive|-moz-mac-focusring|-moz-mac-menuselect|-moz-mac-menushadow|-moz-mac-menutextselect|-moz-MenuHover|-moz-MenuHoverText|-moz-MenuBarText|-moz-MenuBarHoverText|-moz-nativehyperlinktext|-moz-OddTreeRow|-moz-win-communicationstext|-moz-win-mediatext|-moz-activehyperlinktext|-moz-default-background-color|-moz-default-color|-moz-hyperlinktext|-moz-visitedhyperlinktext|-webkit-activelink|-webkit-focus-ring-color|-webkit-link|-webkit-text", "-non-standard-image-rendering": "optimize-contrast|-moz-crisp-edges|-o-crisp-edges|-webkit-optimize-contrast", "-non-standard-overflow": "-moz-scrollbars-none|-moz-scrollbars-horizontal|-moz-scrollbars-vertical|-moz-hidden-unscrollable", "-non-standard-width": "min-intrinsic|intrinsic|-moz-min-content|-moz-max-content|-webkit-min-content|-webkit-max-content", "-webkit-gradient()": "-webkit-gradient( <-webkit-gradient-type> , <-webkit-gradient-point> [, <-webkit-gradient-point>|, <-webkit-gradient-radius> , <-webkit-gradient-point>] [, <-webkit-gradient-radius>]? [, <-webkit-gradient-color-stop>]* )", "-webkit-gradient-color-stop": "from( <color> )|color-stop( [<number-zero-one>|<percentage>] , <color> )|to( <color> )", "-webkit-gradient-point": "[left|center|right|<length-percentage>] [top|center|bottom|<length-percentage>]", "-webkit-gradient-radius": "<length>|<percentage>", "-webkit-gradient-type": "linear|radial", "-webkit-mask-box-repeat": "repeat|stretch|round", "-webkit-mask-clip-style": "border|border-box|padding|padding-box|content|content-box|text", "-ms-filter-function-list": "<-ms-filter-function>+", "-ms-filter-function": "<-ms-filter-function-progid>|<-ms-filter-function-legacy>", "-ms-filter-function-progid": "'progid:' [<ident-token> '.']* [<ident-token>|<function-token> <any-value>? )]", "-ms-filter-function-legacy": "<ident-token>|<function-token> <any-value>? )", "-ms-filter": "<string>", age: "child|young|old", "attr-name": "<wq-name>", "attr-fallback": "<any-value>", "border-radius": "<length-percentage>{1,2}", bottom: "<length>|auto", "generic-voice": "[<age>? <gender> <integer>?]", gender: "male|female|neutral", left: "<length>|auto", "mask-image": "<mask-reference>#", "name-repeat": "repeat( [<positive-integer>|auto-fill] , <line-names>+ )", paint: "none|<color>|<url> [none|<color>]?|context-fill|context-stroke", "path()": "path( <string> )", ratio: "<integer> / <integer>", right: "<length>|auto", "svg-length": "<percentage>|<length>|<number>", "svg-writing-mode": "lr-tb|rl-tb|tb-rl|lr|rl|tb", top: "<length>|auto", x: "<number>", y: "<number>", declaration: "<ident-token> : <declaration-value>? ['!' important]?", "declaration-list": "[<declaration>? ';']* <declaration>?", url: "url( <string> <url-modifier>* )|<url-token>", "url-modifier": "<ident>|<function-token> <any-value> )", "number-zero-one": "<number [0,1]>", "number-one-or-greater": "<number [1,∞]>", "positive-integer": "<integer [0,∞]>" }; var properties$1 = { "--*": "<declaration-value>", "-ms-accelerator": "false|true", "-ms-block-progression": "tb|rl|bt|lr", "-ms-content-zoom-chaining": "none|chained", "-ms-content-zooming": "none|zoom", "-ms-content-zoom-limit": "<'-ms-content-zoom-limit-min'> <'-ms-content-zoom-limit-max'>", "-ms-content-zoom-limit-max": "<percentage>", "-ms-content-zoom-limit-min": "<percentage>", "-ms-content-zoom-snap": "<'-ms-content-zoom-snap-type'>||<'-ms-content-zoom-snap-points'>", "-ms-content-zoom-snap-points": "snapInterval( <percentage> , <percentage> )|snapList( <percentage># )", "-ms-content-zoom-snap-type": "none|proximity|mandatory", "-ms-filter": "<string>", "-ms-flow-from": "[none|<custom-ident>]#", "-ms-flow-into": "[none|<custom-ident>]#", "-ms-high-contrast-adjust": "auto|none", "-ms-hyphenate-limit-chars": "auto|<integer>{1,3}", "-ms-hyphenate-limit-lines": "no-limit|<integer>", "-ms-hyphenate-limit-zone": "<percentage>|<length>", "-ms-ime-align": "auto|after", "-ms-overflow-style": "auto|none|scrollbar|-ms-autohiding-scrollbar", "-ms-scrollbar-3dlight-color": "<color>", "-ms-scrollbar-arrow-color": "<color>", "-ms-scrollbar-base-color": "<color>", "-ms-scrollbar-darkshadow-color": "<color>", "-ms-scrollbar-face-color": "<color>", "-ms-scrollbar-highlight-color": "<color>", "-ms-scrollbar-shadow-color": "<color>", "-ms-scrollbar-track-color": "<color>", "-ms-scroll-chaining": "chained|none", "-ms-scroll-limit": "<'-ms-scroll-limit-x-min'> <'-ms-scroll-limit-y-min'> <'-ms-scroll-limit-x-max'> <'-ms-scroll-limit-y-max'>", "-ms-scroll-limit-x-max": "auto|<length>", "-ms-scroll-limit-x-min": "<length>", "-ms-scroll-limit-y-max": "auto|<length>", "-ms-scroll-limit-y-min": "<length>", "-ms-scroll-rails": "none|railed", "-ms-scroll-snap-points-x": "snapInterval( <length-percentage> , <length-percentage> )|snapList( <length-percentage># )", "-ms-scroll-snap-points-y": "snapInterval( <length-percentage> , <length-percentage> )|snapList( <length-percentage># )", "-ms-scroll-snap-type": "none|proximity|mandatory", "-ms-scroll-snap-x": "<'-ms-scroll-snap-type'> <'-ms-scroll-snap-points-x'>", "-ms-scroll-snap-y": "<'-ms-scroll-snap-type'> <'-ms-scroll-snap-points-y'>", "-ms-scroll-translation": "none|vertical-to-horizontal", "-ms-text-autospace": "none|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space", "-ms-touch-select": "grippers|none", "-ms-user-select": "none|element|text", "-ms-wrap-flow": "auto|both|start|end|maximum|clear", "-ms-wrap-margin": "<length>", "-ms-wrap-through": "wrap|none", "-moz-appearance": "none|button|button-arrow-down|button-arrow-next|button-arrow-previous|button-arrow-up|button-bevel|button-focus|caret|checkbox|checkbox-container|checkbox-label|checkmenuitem|dualbutton|groupbox|listbox|listitem|menuarrow|menubar|menucheckbox|menuimage|menuitem|menuitemtext|menulist|menulist-button|menulist-text|menulist-textfield|menupopup|menuradio|menuseparator|meterbar|meterchunk|progressbar|progressbar-vertical|progresschunk|progresschunk-vertical|radio|radio-container|radio-label|radiomenuitem|range|range-thumb|resizer|resizerpanel|scale-horizontal|scalethumbend|scalethumb-horizontal|scalethumbstart|scalethumbtick|scalethumb-vertical|scale-vertical|scrollbarbutton-down|scrollbarbutton-left|scrollbarbutton-right|scrollbarbutton-up|scrollbarthumb-horizontal|scrollbarthumb-vertical|scrollbartrack-horizontal|scrollbartrack-vertical|searchfield|separator|sheet|spinner|spinner-downbutton|spinner-textfield|spinner-upbutton|splitter|statusbar|statusbarpanel|tab|tabpanel|tabpanels|tab-scroll-arrow-back|tab-scroll-arrow-forward|textfield|textfield-multiline|toolbar|toolbarbutton|toolbarbutton-dropdown|toolbargripper|toolbox|tooltip|treeheader|treeheadercell|treeheadersortarrow|treeitem|treeline|treetwisty|treetwistyopen|treeview|-moz-mac-unified-toolbar|-moz-win-borderless-glass|-moz-win-browsertabbar-toolbox|-moz-win-communicationstext|-moz-win-communications-toolbox|-moz-win-exclude-glass|-moz-win-glass|-moz-win-mediatext|-moz-win-media-toolbox|-moz-window-button-box|-moz-window-button-box-maximized|-moz-window-button-close|-moz-window-button-maximize|-moz-window-button-minimize|-moz-window-button-restore|-moz-window-frame-bottom|-moz-window-frame-left|-moz-window-frame-right|-moz-window-titlebar|-moz-window-titlebar-maximized", "-moz-binding": "<url>|none", "-moz-border-bottom-colors": "<color>+|none", "-moz-border-left-colors": "<color>+|none", "-moz-border-right-colors": "<color>+|none", "-moz-border-top-colors": "<color>+|none", "-moz-context-properties": "none|[fill|fill-opacity|stroke|stroke-opacity]#", "-moz-float-edge": "border-box|content-box|margin-box|padding-box", "-moz-force-broken-image-icon": "<integer>", "-moz-image-region": "<shape>|auto", "-moz-orient": "inline|block|horizontal|vertical", "-moz-outline-radius": "<outline-radius>{1,4} [/ <outline-radius>{1,4}]?", "-moz-outline-radius-bottomleft": "<outline-radius>", "-moz-outline-radius-bottomright": "<outline-radius>", "-moz-outline-radius-topleft": "<outline-radius>", "-moz-outline-radius-topright": "<outline-radius>", "-moz-stack-sizing": "ignore|stretch-to-fit", "-moz-text-blink": "none|blink", "-moz-user-focus": "ignore|normal|select-after|select-before|select-menu|select-same|select-all|none", "-moz-user-input": "auto|none|enabled|disabled", "-moz-user-modify": "read-only|read-write|write-only", "-moz-window-dragging": "drag|no-drag", "-moz-window-shadow": "default|menu|tooltip|sheet|none", "-webkit-appearance": "none|button|button-bevel|caps-lock-indicator|caret|checkbox|default-button|listbox|listitem|media-fullscreen-button|media-mute-button|media-play-button|media-seek-back-button|media-seek-forward-button|media-slider|media-sliderthumb|menulist|menulist-button|menulist-text|menulist-textfield|push-button|radio|scrollbarbutton-down|scrollbarbutton-left|scrollbarbutton-right|scrollbarbutton-up|scrollbargripper-horizontal|scrollbargripper-vertical|scrollbarthumb-horizontal|scrollbarthumb-vertical|scrollbartrack-horizontal|scrollbartrack-vertical|searchfield|searchfield-cancel-button|searchfield-decoration|searchfield-results-button|searchfield-results-decoration|slider-horizontal|slider-vertical|sliderthumb-horizontal|sliderthumb-vertical|square-button|textarea|textfield", "-webkit-border-before": "<'border-width'>||<'border-style'>||<'color'>", "-webkit-border-before-color": "<'color'>", "-webkit-border-before-style": "<'border-style'>", "-webkit-border-before-width": "<'border-width'>", "-webkit-box-reflect": "[above|below|right|left]? <length>? <image>?", "-webkit-line-clamp": "none|<integer>", "-webkit-mask": "[<mask-reference>||<position> [/ <bg-size>]?||<repeat-style>||[<box>|border|padding|content|text]||[<box>|border|padding|content]]#", "-webkit-mask-attachment": "<attachment>#", "-webkit-mask-clip": "[<box>|border|padding|content|text]#", "-webkit-mask-composite": "<composite-style>#", "-webkit-mask-image": "<mask-reference>#", "-webkit-mask-origin": "[<box>|border|padding|content]#", "-webkit-mask-position": "<position>#", "-webkit-mask-position-x": "[<length-percentage>|left|center|right]#", "-webkit-mask-position-y": "[<length-percentage>|top|center|bottom]#", "-webkit-mask-repeat": "<repeat-style>#", "-webkit-mask-repeat-x": "repeat|no-repeat|space|round", "-webkit-mask-repeat-y": "repeat|no-repeat|space|round", "-webkit-mask-size": "<bg-size>#", "-webkit-overflow-scrolling": "auto|touch", "-webkit-tap-highlight-color": "<color>", "-webkit-text-fill-color": "<color>", "-webkit-text-stroke": "<length>||<color>", "-webkit-text-stroke-color": "<color>", "-webkit-text-stroke-width": "<length>", "-webkit-touch-callout": "default|none", "-webkit-user-modify": "read-only|read-write|read-write-plaintext-only", "align-content": "normal|<baseline-position>|<content-distribution>|<overflow-position>? <content-position>", "align-items": "normal|stretch|<baseline-position>|[<overflow-position>? <self-position>]", "align-self": "auto|normal|stretch|<baseline-position>|<overflow-position>? <self-position>", all: "initial|inherit|unset|revert", animation: "<single-animation>#", "animation-delay": "<time>#", "animation-direction": "<single-animation-direction>#", "animation-duration": "<time>#", "animation-fill-mode": "<single-animation-fill-mode>#", "animation-iteration-count": "<single-animation-iteration-count>#", "animation-name": "[none|<keyframes-name>]#", "animation-play-state": "<single-animation-play-state>#", "animation-timing-function": "<timing-function>#", appearance: "none|auto|button|textfield|<compat>", azimuth: "<angle>|[[left-side|far-left|left|center-left|center|center-right|right|far-right|right-side]||behind]|leftwards|rightwards", "backdrop-filter": "none|<filter-function-list>", "backface-visibility": "visible|hidden", background: "[<bg-layer> ,]* <final-bg-layer>", "background-attachment": "<attachment>#", "background-blend-mode": "<blend-mode>#", "background-clip": "<box>#", "background-color": "<color>", "background-image": "<bg-image>#", "background-origin": "<box>#", "background-position": "<bg-position>#", "background-position-x": "[center|[left|right|x-start|x-end]? <length-percentage>?]#", "background-position-y": "[center|[top|bottom|y-start|y-end]? <length-percentage>?]#", "background-repeat": "<repeat-style>#", "background-size": "<bg-size>#", "block-overflow": "clip|ellipsis|<string>", "block-size": "<'width'>", border: "<line-width>||<line-style>||<color>", "border-block": "<'border-top-width'>||<'border-top-style'>||<'color'>", "border-block-color": "<'border-top-color'>{1,2}", "border-block-style": "<'border-top-style'>", "border-block-width": "<'border-top-width'>", "border-block-end": "<'border-top-width'>||<'border-top-style'>||<'color'>", "border-block-end-color": "<'border-top-color'>", "border-block-end-style": "<'border-top-style'>", "border-block-end-width": "<'border-top-width'>", "border-block-start": "<'border-top-width'>||<'border-top-style'>||<'color'>", "border-block-start-color": "<'border-top-color'>", "border-block-start-style": "<'border-top-style'>", "border-block-start-width": "<'border-top-width'>", "border-bottom": "<line-width>||<line-style>||<color>", "border-bottom-color": "<'border-top-color'>", "border-bottom-left-radius": "<length-percentage>{1,2}", "border-bottom-right-radius": "<length-percentage>{1,2}", "border-bottom-style": "<line-style>", "border-bottom-width": "<line-width>", "border-collapse": "collapse|separate", "border-color": "<color>{1,4}", "border-end-end-radius": "<length-percentage>{1,2}", "border-end-start-radius": "<length-percentage>{1,2}", "border-image": "<'border-image-source'>||<'border-image-slice'> [/ <'border-image-width'>|/ <'border-image-width'>? / <'border-image-outset'>]?||<'border-image-repeat'>", "border-image-outset": "[<length>|<number>]{1,4}", "border-image-repeat": "[stretch|repeat|round|space]{1,2}", "border-image-slice": "<number-percentage>{1,4}&&fill?", "border-image-source": "none|<image>", "border-image-width": "[<length-percentage>|<number>|auto]{1,4}", "border-inline": "<'border-top-width'>||<'border-top-style'>||<'color'>", "border-inline-end": "<'border-top-width'>||<'border-top-style'>||<'color'>", "border-inline-color": "<'border-top-color'>{1,2}", "border-inline-style": "<'border-top-style'>", "border-inline-width": "<'border-top-width'>", "border-inline-end-color": "<'border-top-color'>", "border-inline-end-style": "<'border-top-style'>", "border-inline-end-width": "<'border-top-width'>", "border-inline-start": "<'border-top-width'>||<'border-top-style'>||<'color'>", "border-inline-start-color": "<'border-top-color'>", "border-inline-start-style": "<'border-top-style'>", "border-inline-start-width": "<'border-top-width'>", "border-left": "<line-width>||<line-style>||<color>", "border-left-color": "<color>", "border-left-style": "<line-style>", "border-left-width": "<line-width>", "border-radius": "<length-percentage>{1,4} [/ <length-percentage>{1,4}]?", "border-right": "<line-width>||<line-style>||<color>", "border-right-color": "<color>", "border-right-style": "<line-style>", "border-right-width": "<line-width>", "border-spacing": "<length> <length>?", "border-start-end-radius": "<length-percentage>{1,2}", "border-start-start-radius": "<length-percentage>{1,2}", "border-style": "<line-style>{1,4}", "border-top": "<line-width>||<line-style>||<color>", "border-top-color": "<color>", "border-top-left-radius": "<length-percentage>{1,2}", "border-top-right-radius": "<length-percentage>{1,2}", "border-top-style": "<line-style>", "border-top-width": "<line-width>", "border-width": "<line-width>{1,4}", bottom: "<length>|<percentage>|auto", "box-align": "start|center|end|baseline|stretch", "box-decoration-break": "slice|clone", "box-direction": "normal|reverse|inherit", "box-flex": "<number>", "box-flex-group": "<integer>", "box-lines": "single|multiple", "box-ordinal-group": "<integer>", "box-orient": "horizontal|vertical|inline-axis|block-axis|inherit", "box-pack": "start|center|end|justify", "box-shadow": "none|<shadow>#", "box-sizing": "content-box|border-box", "break-after": "auto|avoid|always|all|avoid-page|page|left|right|recto|verso|avoid-column|column|avoid-region|region", "break-before": "auto|avoid|always|all|avoid-page|page|left|right|recto|verso|avoid-column|column|avoid-region|region", "break-inside": "auto|avoid|avoid-page|avoid-column|avoid-region", "caption-side": "top|bottom|block-start|block-end|inline-start|inline-end", "caret-color": "auto|<color>", clear: "none|left|right|both|inline-start|inline-end", clip: "<shape>|auto", "clip-path": "<clip-source>|[<basic-shape>||<geometry-box>]|none", color: "<color>", "color-adjust": "economy|exact", "column-count": "<integer>|auto", "column-fill": "auto|balance|balance-all", "column-gap": "normal|<length-percentage>", "column-rule": "<'column-rule-width'>||<'column-rule-style'>||<'column-rule-color'>", "column-rule-color": "<color>", "column-rule-style": "<'border-style'>", "column-rule-width": "<'border-width'>", "column-span": "none|all", "column-width": "<length>|auto", columns: "<'column-width'>||<'column-count'>", contain: "none|strict|content|[size||layout||style||paint]", content: "normal|none|[<content-replacement>|<content-list>] [/ <string>]?", "counter-increment": "[<custom-ident> <integer>?]+|none", "counter-reset": "[<custom-ident> <integer>?]+|none", "counter-set": "[<custom-ident> <integer>?]+|none", cursor: "[[<url> [<x> <y>]? ,]* [auto|default|none|context-menu|help|pointer|progress|wait|cell|crosshair|text|vertical-text|alias|copy|move|no-drop|not-allowed|e-resize|n-resize|ne-resize|nw-resize|s-resize|se-resize|sw-resize|w-resize|ew-resize|ns-resize|nesw-resize|nwse-resize|col-resize|row-resize|all-scroll|zoom-in|zoom-out|grab|grabbing|hand|-webkit-grab|-webkit-grabbing|-webkit-zoom-in|-webkit-zoom-out|-moz-grab|-moz-grabbing|-moz-zoom-in|-moz-zoom-out]]", direction: "ltr|rtl", display: "none|inline|block|list-item|inline-list-item|inline-block|inline-table|table|table-cell|table-column|table-column-group|table-footer-group|table-header-group|table-row|table-row-group|flex|inline-flex|grid|inline-grid|run-in|ruby|ruby-base|ruby-text|ruby-base-container|ruby-text-container|contents|-ms-flexbox|-ms-inline-flexbox|-ms-grid|-ms-inline-grid|-webkit-flex|-webkit-inline-flex|-webkit-box|-webkit-inline-box|-moz-inline-stack|-moz-box|-moz-inline-box", "empty-cells": "show|hide", filter: "none|<filter-function-list>|<-ms-filter-function-list>", flex: "none|[<'flex-grow'> <'flex-shrink'>?||<'flex-basis'>]", "flex-basis": "content|<'width'>", "flex-direction": "row|row-reverse|column|column-reverse", "flex-flow": "<'flex-direction'>||<'flex-wrap'>", "flex-grow": "<number>", "flex-shrink": "<number>", "flex-wrap": "nowrap|wrap|wrap-reverse", float: "left|right|none|inline-start|inline-end", font: "[[<'font-style'>||<font-variant-css21>||<'font-weight'>||<'font-stretch'>]? <'font-size'> [/ <'line-height'>]? <'font-family'>]|caption|icon|menu|message-box|small-caption|status-bar", "font-family": "[<family-name>|<generic-family>]#", "font-feature-settings": "normal|<feature-tag-value>#", "font-kerning": "auto|normal|none", "font-language-override": "normal|<string>", "font-optical-sizing": "auto|none", "font-variation-settings": "normal|[<string> <number>]#", "font-size": "<absolute-size>|<relative-size>|<length-percentage>", "font-size-adjust": "none|<number>", "font-stretch": "<font-stretch-absolute>", "font-style": "normal|italic|oblique <angle>?", "font-synthesis": "none|[weight||style]", "font-variant": "normal|none|[<common-lig-values>||<discretionary-lig-values>||<historical-lig-values>||<contextual-alt-values>||stylistic( <feature-value-name> )||historical-forms||styleset( <feature-value-name># )||character-variant( <feature-value-name># )||swash( <feature-value-name> )||ornaments( <feature-value-name> )||annotation( <feature-value-name> )||[small-caps|all-small-caps|petite-caps|all-petite-caps|unicase|titling-caps]||<numeric-figure-values>||<numeric-spacing-values>||<numeric-fraction-values>||ordinal||slashed-zero||<east-asian-variant-values>||<east-asian-width-values>||ruby]", "font-variant-alternates": "normal|[stylistic( <feature-value-name> )||historical-forms||styleset( <feature-value-name># )||character-variant( <feature-value-name># )||swash( <feature-value-name> )||ornaments( <feature-value-name> )||annotation( <feature-value-name> )]", "font-variant-caps": "normal|small-caps|all-small-caps|petite-caps|all-petite-caps|unicase|titling-caps", "font-variant-east-asian": "normal|[<east-asian-variant-values>||<east-asian-width-values>||ruby]", "font-variant-ligatures": "normal|none|[<common-lig-values>||<discretionary-lig-values>||<historical-lig-values>||<contextual-alt-values>]", "font-variant-numeric": "normal|[<numeric-figure-values>||<numeric-spacing-values>||<numeric-fraction-values>||ordinal||slashed-zero]", "font-variant-position": "normal|sub|super", "font-weight": "<font-weight-absolute>|bolder|lighter", gap: "<'row-gap'> <'column-gap'>?", grid: "<'grid-template'>|<'grid-template-rows'> / [auto-flow&&dense?] <'grid-auto-columns'>?|[auto-flow&&dense?] <'grid-auto-rows'>? / <'grid-template-columns'>", "grid-area": "<grid-line> [/ <grid-line>]{0,3}", "grid-auto-columns": "<track-size>+", "grid-auto-flow": "[row|column]||dense", "grid-auto-rows": "<track-size>+", "grid-column": "<grid-line> [/ <grid-line>]?", "grid-column-end": "<grid-line>", "grid-column-gap": "<length-percentage>", "grid-column-start": "<grid-line>", "grid-gap": "<'grid-row-gap'> <'grid-column-gap'>?", "grid-row": "<grid-line> [/ <grid-line>]?", "grid-row-end": "<grid-line>", "grid-row-gap": "<length-percentage>", "grid-row-start": "<grid-line>", "grid-template": "none|[<'grid-template-rows'> / <'grid-template-columns'>]|[<line-names>? <string> <track-size>? <line-names>?]+ [/ <explicit-track-list>]?", "grid-template-areas": "none|<string>+", "grid-template-columns": "none|<track-list>|<auto-track-list>", "grid-template-rows": "none|<track-list>|<auto-track-list>", "hanging-punctuation": "none|[first||[force-end|allow-end]||last]", height: "[<length>|<percentage>]&&[border-box|content-box]?|available|min-content|max-content|fit-content|auto", hyphens: "none|manual|auto", "image-orientation": "from-image|<angle>|[<angle>? flip]", "image-rendering": "auto|crisp-edges|pixelated|optimizeSpeed|optimizeQuality|<-non-standard-image-rendering>", "image-resolution": "[from-image||<resolution>]&&snap?", "ime-mode": "auto|normal|active|inactive|disabled", "initial-letter": "normal|[<number> <integer>?]", "initial-letter-align": "[auto|alphabetic|hanging|ideographic]", "inline-size": "<'width'>", inset: "<'top'>{1,4}", "inset-block": "<'top'>{1,2}", "inset-block-end": "<'top'>", "inset-block-start": "<'top'>", "inset-inline": "<'top'>{1,2}", "inset-inline-end": "<'top'>", "inset-inline-start": "<'top'>", isolation: "auto|isolate", "justify-content": "normal|<content-distribution>|<overflow-position>? [<content-position>|left|right]", "justify-items": "normal|stretch|<baseline-position>|<overflow-position>? [<self-position>|left|right]|legacy|legacy&&[left|right|center]", "justify-self": "auto|normal|stretch|<baseline-position>|<overflow-position>? [<self-position>|left|right]", left: "<length>|<percentage>|auto", "letter-spacing": "normal|<length-percentage>", "line-break": "auto|loose|normal|strict", "line-clamp": "none|<integer>", "line-height": "normal|<number>|<length>|<percentage>", "line-height-step": "<length>", "list-style": "<'list-style-type'>||<'list-style-position'>||<'list-style-image'>", "list-style-image": "<url>|none", "list-style-position": "inside|outside", "list-style-type": "<counter-style>|<string>|none", margin: "[<length>|<percentage>|auto]{1,4}", "margin-block": "<'margin-left'>{1,2}", "margin-block-end": "<'margin-left'>", "margin-block-start": "<'margin-left'>", "margin-bottom": "<length>|<percentage>|auto", "margin-inline": "<'margin-left'>{1,2}", "margin-inline-end": "<'margin-left'>", "margin-inline-start": "<'margin-left'>", "margin-left": "<length>|<percentage>|auto", "margin-right": "<length>|<percentage>|auto", "margin-top": "<length>|<percentage>|auto", mask: "<mask-layer>#", "mask-border": "<'mask-border-source'>||<'mask-border-slice'> [/ <'mask-border-width'>? [/ <'mask-border-outset'>]?]?||<'mask-border-repeat'>||<'mask-border-mode'>", "mask-border-mode": "luminance|alpha", "mask-border-outset": "[<length>|<number>]{1,4}", "mask-border-repeat": "[stretch|repeat|round|space]{1,2}", "mask-border-slice": "<number-percentage>{1,4} fill?", "mask-border-source": "none|<image>", "mask-border-width": "[<length-percentage>|<number>|auto]{1,4}", "mask-clip": "[<geometry-box>|no-clip]#", "mask-composite": "<compositing-operator>#", "mask-image": "<mask-reference>#", "mask-mode": "<masking-mode>#", "mask-origin": "<geometry-box>#", "mask-position": "<position>#", "mask-repeat": "<repeat-style>#", "mask-size": "<bg-size>#", "mask-type": "luminance|alpha", "max-block-size": "<'max-width'>", "max-height": "<length>|<percentage>|none|max-content|min-content|fit-content|fill-available", "max-inline-size": "<'max-width'>", "max-lines": "none|<integer>", "max-width": "<length>|<percentage>|none|max-content|min-content|fit-content|fill-available|<-non-standard-width>", "min-block-size": "<'min-width'>", "min-height": "<length>|<percentage>|auto|max-content|min-content|fit-content|fill-available", "min-inline-size": "<'min-width'>", "min-width": "<length>|<percentage>|auto|max-content|min-content|fit-content|fill-available|<-non-standard-width>", "mix-blend-mode": "<blend-mode>", "object-fit": "fill|contain|cover|none|scale-down", "object-position": "<position>", offset: "[<'offset-position'>? [<'offset-path'> [<'offset-distance'>||<'offset-rotate'>]?]?]! [/ <'offset-anchor'>]?", "offset-anchor": "auto|<position>", "offset-distance": "<length-percentage>", "offset-path": "none|ray( [<angle>&&<size>?&&contain?] )|<path()>|<url>|[<basic-shape>||<geometry-box>]", "offset-position": "auto|<position>", "offset-rotate": "[auto|reverse]||<angle>", opacity: "<number-zero-one>", order: "<integer>", orphans: "<integer>", outline: "[<'outline-color'>||<'outline-style'>||<'outline-width'>]", "outline-color": "<color>|invert", "outline-offset": "<length>", "outline-style": "auto|<'border-style'>", "outline-width": "<line-width>", overflow: "[visible|hidden|clip|scroll|auto]{1,2}|<-non-standard-overflow>", "overflow-anchor": "auto|none", "overflow-block": "visible|hidden|clip|scroll|auto", "overflow-clip-box": "padding-box|content-box", "overflow-inline": "visible|hidden|clip|scroll|auto", "overflow-wrap": "normal|break-word|anywhere", "overflow-x": "visible|hidden|clip|scroll|auto", "overflow-y": "visible|hidden|clip|scroll|auto", "overscroll-behavior": "[contain|none|auto]{1,2}", "overscroll-behavior-x": "contain|none|auto", "overscroll-behavior-y": "contain|none|auto", padding: "[<length>|<percentage>]{1,4}", "padding-block": "<'padding-left'>{1,2}", "padding-block-end": "<'padding-left'>", "padding-block-start": "<'padding-left'>", "padding-bottom": "<length>|<percentage>", "padding-inline": "<'padding-left'>{1,2}", "padding-inline-end": "<'padding-left'>", "padding-inline-start": "<'padding-left'>", "padding-left": "<length>|<percentage>", "padding-right": "<length>|<percentage>", "padding-top": "<length>|<percentage>", "page-break-after": "auto|always|avoid|left|right|recto|verso", "page-break-before": "auto|always|avoid|left|right|recto|verso", "page-break-inside": "auto|avoid", "paint-order": "normal|[fill||stroke||markers]", perspective: "none|<length>", "perspective-origin": "<position>", "place-content": "<'align-content'> <'justify-content'>?", "place-items": "<'align-items'> <'justify-items'>?", "place-self": "<'align-self'> <'justify-self'>?", "pointer-events": "auto|none|visiblePainted|visibleFill|visibleStroke|visible|painted|fill|stroke|all|inherit", position: "static|relative|absolute|sticky|fixed|-webkit-sticky", quotes: "none|[<string> <string>]+", resize: "none|both|horizontal|vertical|block|inline", right: "<length>|<percentage>|auto", rotate: "none|<angle>|[x|y|z|<number>{3}]&&<angle>", "row-gap": "normal|<length-percentage>", "ruby-align": "start|center|space-between|space-around", "ruby-merge": "separate|collapse|auto", "ruby-position": "over|under|inter-character", scale: "none|<number>{1,3}", "scrollbar-color": "auto|dark|light|<color>{2}", "scrollbar-width": "auto|thin|none", "scroll-behavior": "auto|smooth", "scroll-margin": "<length>{1,4}", "scroll-margin-block": "<length>{1,2}", "scroll-margin-block-start": "<length>", "scroll-margin-block-end": "<length>", "scroll-margin-bottom": "<length>", "scroll-margin-inline": "<length>{1,2}", "scroll-margin-inline-start": "<length>", "scroll-margin-inline-end": "<length>", "scroll-margin-left": "<length>", "scroll-margin-right": "<length>", "scroll-margin-top": "<length>", "scroll-padding": "[auto|<length-percentage>]{1,4}", "scroll-padding-block": "[auto|<length-percentage>]{1,2}", "scroll-padding-block-start": "auto|<length-percentage>", "scroll-padding-block-end": "auto|<length-percentage>", "scroll-padding-bottom": "auto|<length-percentage>", "scroll-padding-inline": "[auto|<length-percentage>]{1,2}", "scroll-padding-inline-start": "auto|<length-percentage>", "scroll-padding-inline-end": "auto|<length-percentage>", "scroll-padding-left": "auto|<length-percentage>", "scroll-padding-right": "auto|<length-percentage>", "scroll-padding-top": "auto|<length-percentage>", "scroll-snap-align": "[none|start|end|center]{1,2}", "scroll-snap-coordinate": "none|<position>#", "scroll-snap-destination": "<position>", "scroll-snap-points-x": "none|repeat( <length-percentage> )", "scroll-snap-points-y": "none|repeat( <length-percentage> )", "scroll-snap-stop": "normal|always", "scroll-snap-type": "none|[x|y|block|inline|both] [mandatory|proximity]?", "scroll-snap-type-x": "none|mandatory|proximity", "scroll-snap-type-y": "none|mandatory|proximity", "shape-image-threshold": "<number>", "shape-margin": "<length-percentage>", "shape-outside": "none|<shape-box>||<basic-shape>|<image>", "tab-size": "<integer>|<length>", "table-layout": "auto|fixed", "text-align": "start|end|left|right|center|justify|match-parent", "text-align-last": "auto|start|end|left|right|center|justify", "text-combine-upright": "none|all|[digits <integer>?]", "text-decoration": "<'text-decoration-line'>||<'text-decoration-style'>||<'text-decoration-color'>", "text-decoration-color": "<color>", "text-decoration-line": "none|[underline||overline||line-through||blink]", "text-decoration-skip": "none|[objects||[spaces|[leading-spaces||trailing-spaces]]||edges||box-decoration]", "text-decoration-skip-ink": "auto|none", "text-decoration-style": "solid|double|dotted|dashed|wavy", "text-emphasis": "<'text-emphasis-style'>||<'text-emphasis-color'>", "text-emphasis-color": "<color>", "text-emphasis-position": "[over|under]&&[right|left]", "text-emphasis-style": "none|[[filled|open]||[dot|circle|double-circle|triangle|sesame]]|<string>", "text-indent": "<length-percentage>&&hanging?&&each-line?", "text-justify": "auto|inter-character|inter-word|none", "text-orientation": "mixed|upright|sideways", "text-overflow": "[clip|ellipsis|<string>]{1,2}", "text-rendering": "auto|optimizeSpeed|optimizeLegibility|geometricPrecision", "text-shadow": "none|<shadow-t>#", "text-size-adjust": "none|auto|<percentage>", "text-transform": "none|capitalize|uppercase|lowercase|full-width|full-size-kana", "text-underline-position": "auto|[under||[left|right]]", top: "<length>|<percentage>|auto", "touch-action": "auto|none|[[pan-x|pan-left|pan-right]||[pan-y|pan-up|pan-down]||pinch-zoom]|manipulation", transform: "none|<transform-list>", "transform-box": "border-box|fill-box|view-box", "transform-origin": "[<length-percentage>|left|center|right|top|bottom]|[[<length-percentage>|left|center|right]&&[<length-percentage>|top|center|bottom]] <length>?", "transform-style": "flat|preserve-3d", transition: "<single-transition>#", "transition-delay": "<time>#", "transition-duration": "<time>#", "transition-property": "none|<single-transition-property>#", "transition-timing-function": "<timing-function>#", translate: "none|<length-percentage> [<length-percentage> <length>?]?", "unicode-bidi": "normal|embed|isolate|bidi-override|isolate-override|plaintext|-moz-isolate|-moz-isolate-override|-moz-plaintext|-webkit-isolate", "user-select": "auto|text|none|contain|all", "vertical-align": "baseline|sub|super|text-top|text-bottom|middle|top|bottom|<percentage>|<length>", visibility: "visible|hidden|collapse", "white-space": "normal|pre|nowrap|pre-wrap|pre-line", widows: "<integer>", width: "[<length>|<percentage>]&&[border-box|content-box]?|available|min-content|max-content|fit-content|auto", "will-change": "auto|<animateable-feature>#", "word-break": "normal|break-all|keep-all|break-word", "word-spacing": "normal|<length-percentage>", "word-wrap": "normal|break-word", "writing-mode": "horizontal-tb|vertical-rl|vertical-lr|sideways-rl|sideways-lr|<svg-writing-mode>", "z-index": "auto|<integer>", zoom: "normal|reset|<number>|<percentage>", "-moz-background-clip": "padding|border", "-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-bottom-right-radius'>", "-moz-osx-font-smoothing": "auto|grayscale", "-moz-user-select": "none|text|all|-moz-none", "-ms-flex-align": "start|end|center|baseline|stretch", "-ms-flex-item-align": "auto|start|end|center|baseline|stretch", "-ms-flex-line-pack": "start|end|center|justify|distribute|stretch", "-ms-flex-negative": "<'flex-shrink'>", "-ms-flex-pack": "start|end|center|justify|distribute", "-ms-flex-order": "<integer>", "-ms-flex-positive": "<'flex-grow'>", "-ms-flex-preferred-size": "<'flex-basis'>", "-ms-interpolation-mode": "nearest-neighbor|bicubic", "-ms-grid-column-align": "start|end|center|stretch", "-ms-grid-row-align": "start|end|center|stretch", "-webkit-background-clip": "[<box>|border|padding|content|text]#", "-webkit-column-break-after": "always|auto|avoid", "-webkit-column-break-before": "always|auto|avoid", "-webkit-column-break-inside": "always|auto|avoid", "-webkit-font-smoothing": "auto|none|antialiased|subpixel-antialiased", "-webkit-mask-box-image": "[<url>|<gradient>|none] [<length-percentage>{4} <-webkit-mask-box-repeat>{2}]?", "-webkit-print-color-adjust": "economy|exact", "-webkit-text-security": "none|circle|disc|square", "-webkit-user-drag": "none|element|auto", "-webkit-user-select": "auto|none|text|all", "alignment-baseline": "auto|baseline|before-edge|text-before-edge|middle|central|after-edge|text-after-edge|ideographic|alphabetic|hanging|mathematical", "baseline-shift": "baseline|sub|super|<svg-length>", behavior: "<url>+", "clip-rule": "nonzero|evenodd", cue: "<'cue-before'> <'cue-after'>?", "cue-after": "<url> <decibel>?|none", "cue-before": "<url> <decibel>?|none", "dominant-baseline": "auto|use-script|no-change|reset-size|ideographic|alphabetic|hanging|mathematical|central|middle|text-after-edge|text-before-edge", fill: "<paint>", "fill-opacity": "<number-zero-one>", "fill-rule": "nonzero|evenodd", "glyph-orientation-horizontal": "<angle>", "glyph-orientation-vertical": "<angle>", kerning: "auto|<svg-length>", marker: "none|<url>", "marker-end": "none|<url>", "marker-mid": "none|<url>", "marker-start": "none|<url>", pause: "<'pause-before'> <'pause-after'>?", "pause-after": "<time>|none|x-weak|weak|medium|strong|x-strong", "pause-before": "<time>|none|x-weak|weak|medium|strong|x-strong", rest: "<'rest-before'> <'rest-after'>?", "rest-after": "<time>|none|x-weak|weak|medium|strong|x-strong", "rest-before": "<time>|none|x-weak|weak|medium|strong|x-strong", "shape-rendering": "auto|optimizeSpeed|crispEdges|geometricPrecision", src: "[<url> [format( <string># )]?|local( <family-name> )]#", speak: "auto|none|normal", "speak-as": "normal|spell-out||digits||[literal-punctuation|no-punctuation]", stroke: "<paint>", "stroke-dasharray": "none|[<svg-length>+]#", "stroke-dashoffset": "<svg-length>", "stroke-linecap": "butt|round|square", "stroke-linejoin": "miter|round|bevel", "stroke-miterlimit": "<number-one-or-greater>", "stroke-opacity": "<number-zero-one>", "stroke-width": "<svg-length>", "text-anchor": "start|middle|end", "unicode-range": "<urange>#", "voice-balance": "<number>|left|center|right|leftwards|rightwards", "voice-duration": "auto|<time>", "voice-family": "[[<family-name>|<generic-voice>] ,]* [<family-name>|<generic-voice>]|preserve", "voice-pitch": "<frequency>&&absolute|[[x-low|low|medium|high|x-high]||[<frequency>|<semitones>|<percentage>]]", "voice-range": "<frequency>&&absolute|[[x-low|low|medium|high|x-high]||[<frequency>|<semitones>|<percentage>]]", "voice-rate": "[normal|x-slow|slow|medium|fast|x-fast]||<percentage>", "voice-stress": "normal|strong|moderate|none|reduced", "voice-volume": "silent|[[x-soft|soft|medium|loud|x-loud]||<decibel>]" }; var defaultSyntax = { generic: generic$1, types: types, properties: properties$1 }; var defaultSyntax$1 = Object.freeze({ __proto__: null, generic: generic$1, types: types, properties: properties$1, default: defaultSyntax }); var cmpChar$3 = tokenizer.cmpChar; var isDigit$4 = tokenizer.isDigit; var TYPE$9 = tokenizer.TYPE; var WHITESPACE$4 = TYPE$9.WhiteSpace; var COMMENT$3 = TYPE$9.Comment; var IDENT$3 = TYPE$9.Ident; var NUMBER$3 = TYPE$9.Number; var DIMENSION$2 = TYPE$9.Dimension; var PLUSSIGN$3 = 43; var HYPHENMINUS$3 = 45; var N$4 = 110; var DISALLOW_SIGN$1 = true; var ALLOW_SIGN$1 = false; function checkInteger$1(offset, disallowSign) { var pos = this.scanner.tokenStart + offset; var code = this.scanner.source.charCodeAt(pos); if (code === PLUSSIGN$3 || code === HYPHENMINUS$3) { if (disallowSign) { this.error("Number sign is not allowed") } pos++ } for (; pos < this.scanner.tokenEnd; pos++) { if (!isDigit$4(this.scanner.source.charCodeAt(pos))) { this.error("Integer is expected", pos) } } } function checkTokenIsInteger(disallowSign) { return checkInteger$1.call(this, 0, disallowSign) } function expectCharCode(offset, code) { if (!cmpChar$3(this.scanner.source, this.scanner.tokenStart + offset, code)) { var msg = ""; switch (code) { case N$4: msg = "N is expected"; break; case HYPHENMINUS$3: msg = "HyphenMinus is expected"; break }this.error(msg, this.scanner.tokenStart + offset) } } function consumeB$1() { var offset = 0; var sign = 0; var type = this.scanner.tokenType; while (type === WHITESPACE$4 || type === COMMENT$3) { type = this.scanner.lookupType(++offset) } if (type !== NUMBER$3) { if (this.scanner.isDelim(PLUSSIGN$3, offset) || this.scanner.isDelim(HYPHENMINUS$3, offset)) { sign = this.scanner.isDelim(PLUSSIGN$3, offset) ? PLUSSIGN$3 : HYPHENMINUS$3; do { type = this.scanner.lookupType(++offset) } while (type === WHITESPACE$4 || type === COMMENT$3); if (type !== NUMBER$3) { this.scanner.skip(offset); checkTokenIsInteger.call(this, DISALLOW_SIGN$1) } } else { return null } } if (offset > 0) { this.scanner.skip(offset) } if (sign === 0) { type = this.scanner.source.charCodeAt(this.scanner.tokenStart); if (type !== PLUSSIGN$3 && type !== HYPHENMINUS$3) { this.error("Number sign is expected") } } checkTokenIsInteger.call(this, sign !== 0); return sign === HYPHENMINUS$3 ? "-" + this.consume(NUMBER$3) : this.consume(NUMBER$3) } var AnPlusB = { name: "AnPlusB", structure: { a: [String, null], b: [String, null] }, parse: function () { var start = this.scanner.tokenStart; var a = null; var b = null; if (this.scanner.tokenType === NUMBER$3) { checkTokenIsInteger.call(this, ALLOW_SIGN$1); b = this.consume(NUMBER$3) } else if (this.scanner.tokenType === IDENT$3 && cmpChar$3(this.scanner.source, this.scanner.tokenStart, HYPHENMINUS$3)) { a = "-1"; expectCharCode.call(this, 1, N$4); switch (this.scanner.getTokenLength()) { case 2: this.scanner.next(); b = consumeB$1.call(this); break; case 3: expectCharCode.call(this, 2, HYPHENMINUS$3); this.scanner.next(); this.scanner.skipSC(); checkTokenIsInteger.call(this, DISALLOW_SIGN$1); b = "-" + this.consume(NUMBER$3); break; default: expectCharCode.call(this, 2, HYPHENMINUS$3); checkInteger$1.call(this, 3, DISALLOW_SIGN$1); this.scanner.next(); b = this.scanner.substrToCursor(start + 2) } } else if (this.scanner.tokenType === IDENT$3 || this.scanner.isDelim(PLUSSIGN$3) && this.scanner.lookupType(1) === IDENT$3) { var sign = 0; a = "1"; if (this.scanner.isDelim(PLUSSIGN$3)) { sign = 1; this.scanner.next() } expectCharCode.call(this, 0, N$4); switch (this.scanner.getTokenLength()) { case 1: this.scanner.next(); b = consumeB$1.call(this); break; case 2: expectCharCode.call(this, 1, HYPHENMINUS$3); this.scanner.next(); this.scanner.skipSC(); checkTokenIsInteger.call(this, DISALLOW_SIGN$1); b = "-" + this.consume(NUMBER$3); break; default: expectCharCode.call(this, 1, HYPHENMINUS$3); checkInteger$1.call(this, 2, DISALLOW_SIGN$1); this.scanner.next(); b = this.scanner.substrToCursor(start + sign + 1) } } else if (this.scanner.tokenType === DIMENSION$2) { var code = this.scanner.source.charCodeAt(this.scanner.tokenStart); var sign = code === PLUSSIGN$3 || code === HYPHENMINUS$3; for (var i = this.scanner.tokenStart + sign; i < this.scanner.tokenEnd; i++) { if (!isDigit$4(this.scanner.source.charCodeAt(i))) { break } } if (i === this.scanner.tokenStart + sign) { this.error("Integer is expected", this.scanner.tokenStart + sign) } expectCharCode.call(this, i - this.scanner.tokenStart, N$4); a = this.scanner.source.substring(start, i); if (i + 1 === this.scanner.tokenEnd) { this.scanner.next(); b = consumeB$1.call(this) } else { expectCharCode.call(this, i - this.scanner.tokenStart + 1, HYPHENMINUS$3); if (i + 2 === this.scanner.tokenEnd) { this.scanner.next(); this.scanner.skipSC(); checkTokenIsInteger.call(this, DISALLOW_SIGN$1); b = "-" + this.consume(NUMBER$3) } else { checkInteger$1.call(this, i - this.scanner.tokenStart + 2, DISALLOW_SIGN$1); this.scanner.next(); b = this.scanner.substrToCursor(i + 1) } } } else { this.error() } if (a !== null && a.charCodeAt(0) === PLUSSIGN$3) { a = a.substr(1) } if (b !== null && b.charCodeAt(0) === PLUSSIGN$3) { b = b.substr(1) } return { type: "AnPlusB", loc: this.getLocation(start, this.scanner.tokenStart), a: a, b: b } }, generate: function (node) { var a = node.a !== null && node.a !== undefined; var b = node.b !== null && node.b !== undefined; if (a) { this.chunk(node.a === "+1" ? "+n" : node.a === "1" ? "n" : node.a === "-1" ? "-n" : node.a + "n"); if (b) { b = String(node.b); if (b.charAt(0) === "-" || b.charAt(0) === "+") { this.chunk(b.charAt(0)); this.chunk(b.substr(1)) } else { this.chunk("+"); this.chunk(b) } } } else { this.chunk(String(node.b)) } } }; var TYPE$a = tokenizer.TYPE; var WhiteSpace = TYPE$a.WhiteSpace; var Semicolon = TYPE$a.Semicolon; var LeftCurlyBracket = TYPE$a.LeftCurlyBracket; var Delim = TYPE$a.Delim; var EXCLAMATIONMARK$1 = 33; function getOffsetExcludeWS() { if (this.scanner.tokenIndex > 0) { if (this.scanner.lookupType(-1) === WhiteSpace) { return this.scanner.tokenIndex > 1 ? this.scanner.getTokenStart(this.scanner.tokenIndex - 1) : this.scanner.firstCharOffset } } return this.scanner.tokenStart } function balanceEnd() { return 0 } function leftCurlyBracket(tokenType) { return tokenType === LeftCurlyBracket ? 1 : 0 } function leftCurlyBracketOrSemicolon(tokenType) { return tokenType === LeftCurlyBracket || tokenType === Semicolon ? 1 : 0 } function exclamationMarkOrSemicolon(tokenType, source, offset) { if (tokenType === Delim && source.charCodeAt(offset) === EXCLAMATIONMARK$1) { return 1 } return tokenType === Semicolon ? 1 : 0 } function semicolonIncluded(tokenType) { return tokenType === Semicolon ? 2 : 0 } var Raw = { name: "Raw", structure: { value: String }, parse: function (startToken, mode, excludeWhiteSpace) { var startOffset = this.scanner.getTokenStart(startToken); var endOffset; this.scanner.skip(this.scanner.getRawLength(startToken, mode || balanceEnd)); if (excludeWhiteSpace && this.scanner.tokenStart > startOffset) { endOffset = getOffsetExcludeWS.call(this) } else { endOffset = this.scanner.tokenStart } return { type: "Raw", loc: this.getLocation(startOffset, endOffset), value: this.scanner.source.substring(startOffset, endOffset) } }, generate: function (node) { this.chunk(node.value) }, mode: { default: balanceEnd, leftCurlyBracket: leftCurlyBracket, leftCurlyBracketOrSemicolon: leftCurlyBracketOrSemicolon, exclamationMarkOrSemicolon: exclamationMarkOrSemicolon, semicolonIncluded: semicolonIncluded } }; var TYPE$b = tokenizer.TYPE; var rawMode = Raw.mode; var ATKEYWORD = TYPE$b.AtKeyword; var SEMICOLON = TYPE$b.Semicolon; var LEFTCURLYBRACKET$1 = TYPE$b.LeftCurlyBracket; var RIGHTCURLYBRACKET$1 = TYPE$b.RightCurlyBracket; function consumeRaw(startToken) { return this.Raw(startToken, rawMode.leftCurlyBracketOrSemicolon, true) } function isDeclarationBlockAtrule() { for (var offset = 1, type; type = this.scanner.lookupType(offset); offset++) { if (type === RIGHTCURLYBRACKET$1) { return true } if (type === LEFTCURLYBRACKET$1 || type === ATKEYWORD) { return false } } return false } var Atrule = { name: "Atrule", structure: { name: String, prelude: ["AtrulePrelude", "Raw", null], block: ["Block", null] }, parse: function () { var start = this.scanner.tokenStart; var name; var nameLowerCase; var prelude = null; var block = null; this.eat(ATKEYWORD); name = this.scanner.substrToCursor(start + 1); nameLowerCase = name.toLowerCase(); this.scanner.skipSC(); if (this.scanner.eof === false && this.scanner.tokenType !== LEFTCURLYBRACKET$1 && this.scanner.tokenType !== SEMICOLON) { if (this.parseAtrulePrelude) { prelude = this.parseWithFallback(this.AtrulePrelude.bind(this, name), consumeRaw); if (prelude.type === "AtrulePrelude" && prelude.children.head === null) { prelude = null } } else { prelude = consumeRaw.call(this, this.scanner.tokenIndex) } this.scanner.skipSC() } switch (this.scanner.tokenType) { case SEMICOLON: this.scanner.next(); break; case LEFTCURLYBRACKET$1: if (this.atrule.hasOwnProperty(nameLowerCase) && typeof this.atrule[nameLowerCase].block === "function") { block = this.atrule[nameLowerCase].block.call(this) } else { block = this.Block(isDeclarationBlockAtrule.call(this)) } break }return { type: "Atrule", loc: this.getLocation(start, this.scanner.tokenStart), name: name, prelude: prelude, block: block } }, generate: function (node) { this.chunk("@"); this.chunk(node.name); if (node.prelude !== null) { this.chunk(" "); this.node(node.prelude) } if (node.block) { this.node(node.block) } else { this.chunk(";") } }, walkContext: "atrule" }; var TYPE$c = tokenizer.TYPE; var SEMICOLON$1 = TYPE$c.Semicolon; var LEFTCURLYBRACKET$2 = TYPE$c.LeftCurlyBracket; var AtrulePrelude = { name: "AtrulePrelude", structure: { children: [[]] }, parse: function (name) { var children = null; if (name !== null) { name = name.toLowerCase() } this.scanner.skipSC(); if (this.atrule.hasOwnProperty(name) && typeof this.atrule[name].prelude === "function") { children = this.atrule[name].prelude.call(this) } else { children = this.readSequence(this.scope.AtrulePrelude) } this.scanner.skipSC(); if (this.scanner.eof !== true && this.scanner.tokenType !== LEFTCURLYBRACKET$2 && this.scanner.tokenType !== SEMICOLON$1) { this.error("Semicolon or block is expected") } if (children === null) { children = this.createList() } return { type: "AtrulePrelude", loc: this.getLocationFromList(children), children: children } }, generate: function (node) { this.children(node) }, walkContext: "atrulePrelude" }; var TYPE$d = tokenizer.TYPE; var IDENT$4 = TYPE$d.Ident; var STRING = TYPE$d.String; var COLON = TYPE$d.Colon; var LEFTSQUAREBRACKET$1 = TYPE$d.LeftSquareBracket; var RIGHTSQUAREBRACKET$1 = TYPE$d.RightSquareBracket; var DOLLARSIGN = 36; var ASTERISK$1 = 42; var EQUALSSIGN = 61; var CIRCUMFLEXACCENT = 94; var VERTICALLINE$1 = 124; var TILDE = 126; function getAttributeName() { if (this.scanner.eof) { this.error("Unexpected end of input") } var start = this.scanner.tokenStart; var expectIdent = false; var checkColon = true; if (this.scanner.isDelim(ASTERISK$1)) { expectIdent = true; checkColon = false; this.scanner.next() } else if (!this.scanner.isDelim(VERTICALLINE$1)) { this.eat(IDENT$4) } if (this.scanner.isDelim(VERTICALLINE$1)) { if (this.scanner.source.charCodeAt(this.scanner.tokenStart + 1) !== EQUALSSIGN) { this.scanner.next(); this.eat(IDENT$4) } else if (expectIdent) { this.error("Identifier is expected", this.scanner.tokenEnd) } } else if (expectIdent) { this.error("Vertical line is expected") } if (checkColon && this.scanner.tokenType === COLON) { this.scanner.next(); this.eat(IDENT$4) } return { type: "Identifier", loc: this.getLocation(start, this.scanner.tokenStart), name: this.scanner.substrToCursor(start) } } function getOperator() { var start = this.scanner.tokenStart; var code = this.scanner.source.charCodeAt(start); if (code !== EQUALSSIGN && code !== TILDE && code !== CIRCUMFLEXACCENT && code !== DOLLARSIGN && code !== ASTERISK$1 && code !== VERTICALLINE$1) { this.error("Attribute selector (=, ~=, ^=, $=, *=, |=) is expected") } this.scanner.next(); if (code !== EQUALSSIGN) { if (!this.scanner.isDelim(EQUALSSIGN)) { this.error("Equal sign is expected") } this.scanner.next() } return this.scanner.substrToCursor(start) } var AttributeSelector = { name: "AttributeSelector", structure: { name: "Identifier", matcher: [String, null], value: ["String", "Identifier", null], flags: [String, null] }, parse: function () { var start = this.scanner.tokenStart; var name; var matcher = null; var value = null; var flags = null; this.eat(LEFTSQUAREBRACKET$1); this.scanner.skipSC(); name = getAttributeName.call(this); this.scanner.skipSC(); if (this.scanner.tokenType !== RIGHTSQUAREBRACKET$1) { if (this.scanner.tokenType !== IDENT$4) { matcher = getOperator.call(this); this.scanner.skipSC(); value = this.scanner.tokenType === STRING ? this.String() : this.Identifier(); this.scanner.skipSC() } if (this.scanner.tokenType === IDENT$4) { flags = this.scanner.getTokenValue(); this.scanner.next(); this.scanner.skipSC() } } this.eat(RIGHTSQUAREBRACKET$1); return { type: "AttributeSelector", loc: this.getLocation(start, this.scanner.tokenStart), name: name, matcher: matcher, value: value, flags: flags } }, generate: function (node) { var flagsPrefix = " "; this.chunk("["); this.node(node.name); if (node.matcher !== null) { this.chunk(node.matcher); if (node.value !== null) { this.node(node.value); if (node.value.type === "String") { flagsPrefix = "" } } } if (node.flags !== null) { this.chunk(flagsPrefix); this.chunk(node.flags) } this.chunk("]") } }; var TYPE$e = tokenizer.TYPE; var rawMode$1 = Raw.mode; var WHITESPACE$5 = TYPE$e.WhiteSpace; var COMMENT$4 = TYPE$e.Comment; var SEMICOLON$2 = TYPE$e.Semicolon; var ATKEYWORD$1 = TYPE$e.AtKeyword; var LEFTCURLYBRACKET$3 = TYPE$e.LeftCurlyBracket; var RIGHTCURLYBRACKET$2 = TYPE$e.RightCurlyBracket; function consumeRaw$1(startToken) { return this.Raw(startToken, null, true) } function consumeRule() { return this.parseWithFallback(this.Rule, consumeRaw$1) } function consumeRawDeclaration(startToken) { return this.Raw(startToken, rawMode$1.semicolonIncluded, true) } function consumeDeclaration() { if (this.scanner.tokenType === SEMICOLON$2) { return consumeRawDeclaration.call(this, this.scanner.tokenIndex) } var node = this.parseWithFallback(this.Declaration, consumeRawDeclaration); if (this.scanner.tokenType === SEMICOLON$2) { this.scanner.next() } return node } var Block = { name: "Block", structure: { children: [["Atrule", "Rule", "Declaration"]] }, parse: function (isDeclaration) { var consumer = isDeclaration ? consumeDeclaration : consumeRule; var start = this.scanner.tokenStart; var children = this.createList(); this.eat(LEFTCURLYBRACKET$3); scan: while (!this.scanner.eof) { switch (this.scanner.tokenType) { case RIGHTCURLYBRACKET$2: break scan; case WHITESPACE$5: case COMMENT$4: this.scanner.next(); break; case ATKEYWORD$1: children.push(this.parseWithFallback(this.Atrule, consumeRaw$1)); break; default: children.push(consumer.call(this)) } } if (!this.scanner.eof) { this.eat(RIGHTCURLYBRACKET$2) } return { type: "Block", loc: this.getLocation(start, this.scanner.tokenStart), children: children } }, generate: function (node) { this.chunk("{"); this.children(node, (function (prev) { if (prev.type === "Declaration") { this.chunk(";") } })); this.chunk("}") }, walkContext: "block" }; var TYPE$f = tokenizer.TYPE; var LEFTSQUAREBRACKET$2 = TYPE$f.LeftSquareBracket; var RIGHTSQUAREBRACKET$2 = TYPE$f.RightSquareBracket; var Brackets = { name: "Brackets", structure: { children: [[]] }, parse: function (readSequence, recognizer) { var start = this.scanner.tokenStart; var children = null; this.eat(LEFTSQUAREBRACKET$2); children = readSequence.call(this, recognizer); if (!this.scanner.eof) { this.eat(RIGHTSQUAREBRACKET$2) } return { type: "Brackets", loc: this.getLocation(start, this.scanner.tokenStart), children: children } }, generate: function (node) { this.chunk("["); this.children(node); this.chunk("]") } }; var CDC = tokenizer.TYPE.CDC; var CDC_1 = { name: "CDC", structure: [], parse: function () { var start = this.scanner.tokenStart; this.eat(CDC); return { type: "CDC", loc: this.getLocation(start, this.scanner.tokenStart) } }, generate: function () { this.chunk("--\x3e") } }; var CDO = tokenizer.TYPE.CDO; var CDO_1 = { name: "CDO", structure: [], parse: function () { var start = this.scanner.tokenStart; this.eat(CDO); return { type: "CDO", loc: this.getLocation(start, this.scanner.tokenStart) } }, generate: function () { this.chunk("\x3c!--") } }; var TYPE$g = tokenizer.TYPE; var IDENT$5 = TYPE$g.Ident; var FULLSTOP = 46; var ClassSelector = { name: "ClassSelector", structure: { name: String }, parse: function () { if (!this.scanner.isDelim(FULLSTOP)) { this.error("Full stop is expected") } this.scanner.next(); return { type: "ClassSelector", loc: this.getLocation(this.scanner.tokenStart - 1, this.scanner.tokenEnd), name: this.consume(IDENT$5) } }, generate: function (node) { this.chunk("."); this.chunk(node.name) } }; var TYPE$h = tokenizer.TYPE; var IDENT$6 = TYPE$h.Ident; var PLUSSIGN$4 = 43; var SOLIDUS = 47; var GREATERTHANSIGN$1 = 62; var TILDE$1 = 126; var Combinator = { name: "Combinator", structure: { name: String }, parse: function () { var start = this.scanner.tokenStart; var code = this.scanner.source.charCodeAt(this.scanner.tokenStart); switch (code) { case GREATERTHANSIGN$1: case PLUSSIGN$4: case TILDE$1: this.scanner.next(); break; case SOLIDUS: this.scanner.next(); if (this.scanner.tokenType !== IDENT$6 || this.scanner.lookupValue(0, "deep") === false) { this.error("Identifier `deep` is expected") } this.scanner.next(); if (!this.scanner.isDelim(SOLIDUS)) { this.error("Solidus is expected") } this.scanner.next(); break; default: this.error("Combinator is expected") }return { type: "Combinator", loc: this.getLocation(start, this.scanner.tokenStart), name: this.scanner.substrToCursor(start) } }, generate: function (node) { this.chunk(node.name) } }; var TYPE$i = tokenizer.TYPE; var COMMENT$5 = TYPE$i.Comment; var ASTERISK$2 = 42; var SOLIDUS$1 = 47; var Comment = { name: "Comment", structure: { value: String }, parse: function () { var start = this.scanner.tokenStart; var end = this.scanner.tokenEnd; this.eat(COMMENT$5); if (end - start + 2 >= 2 && this.scanner.source.charCodeAt(end - 2) === ASTERISK$2 && this.scanner.source.charCodeAt(end - 1) === SOLIDUS$1) { end -= 2 } return { type: "Comment", loc: this.getLocation(start, this.scanner.tokenStart), value: this.scanner.source.substring(start + 2, end) } }, generate: function (node) { this.chunk("/*"); this.chunk(node.value); this.chunk("*/") } }; var isCustomProperty$1 = names.isCustomProperty; var TYPE$j = tokenizer.TYPE; var rawMode$2 = Raw.mode; var IDENT$7 = TYPE$j.Ident; var HASH$1 = TYPE$j.Hash; var COLON$1 = TYPE$j.Colon; var SEMICOLON$3 = TYPE$j.Semicolon; var DELIM$2 = TYPE$j.Delim; var EXCLAMATIONMARK$2 = 33; var NUMBERSIGN$2 = 35; var DOLLARSIGN$1 = 36; var AMPERSAND$1 = 38; var ASTERISK$3 = 42; var PLUSSIGN$5 = 43; var SOLIDUS$2 = 47; function consumeValueRaw(startToken) { return this.Raw(startToken, rawMode$2.exclamationMarkOrSemicolon, true) } function consumeCustomPropertyRaw(startToken) { return this.Raw(startToken, rawMode$2.exclamationMarkOrSemicolon, false) } function consumeValue() { var startValueToken = this.scanner.tokenIndex; var value = this.Value(); if (value.type !== "Raw" && this.scanner.eof === false && this.scanner.tokenType !== SEMICOLON$3 && this.scanner.isDelim(EXCLAMATIONMARK$2) === false && this.scanner.isBalanceEdge(startValueToken) === false) { this.error() } return value } var Declaration = { name: "Declaration", structure: { important: [Boolean, String], property: String, value: ["Value", "Raw"] }, parse: function () { var start = this.scanner.tokenStart; var startToken = this.scanner.tokenIndex; var property = readProperty$1.call(this); var customProperty = isCustomProperty$1(property); var parseValue = customProperty ? this.parseCustomProperty : this.parseValue; var consumeRaw = customProperty ? consumeCustomPropertyRaw : consumeValueRaw; var important = false; var value; this.scanner.skipSC(); this.eat(COLON$1); if (!customProperty) { this.scanner.skipSC() } if (parseValue) { value = this.parseWithFallback(consumeValue, consumeRaw) } else { value = consumeRaw.call(this, this.scanner.tokenIndex) } if (this.scanner.isDelim(EXCLAMATIONMARK$2)) { important = getImportant.call(this); this.scanner.skipSC() } if (this.scanner.eof === false && this.scanner.tokenType !== SEMICOLON$3 && this.scanner.isBalanceEdge(startToken) === false) { this.error() } return { type: "Declaration", loc: this.getLocation(start, this.scanner.tokenStart), important: important, property: property, value: value } }, generate: function (node) { this.chunk(node.property); this.chunk(":"); this.node(node.value); if (node.important) { this.chunk(node.important === true ? "!important" : "!" + node.important) } }, walkContext: "declaration" }; function readProperty$1() { var start = this.scanner.tokenStart; if (this.scanner.tokenType === DELIM$2) { switch (this.scanner.source.charCodeAt(this.scanner.tokenStart)) { case ASTERISK$3: case DOLLARSIGN$1: case PLUSSIGN$5: case NUMBERSIGN$2: case AMPERSAND$1: this.scanner.next(); break; case SOLIDUS$2: this.scanner.next(); if (this.scanner.isDelim(SOLIDUS$2)) { this.scanner.next() } break } } if (this.scanner.tokenType === HASH$1) { this.eat(HASH$1) } else { this.eat(IDENT$7) } return this.scanner.substrToCursor(start) } function getImportant() { this.eat(DELIM$2); this.scanner.skipSC(); var important = this.consume(IDENT$7); return important === "important" ? true : important } var TYPE$k = tokenizer.TYPE; var rawMode$3 = Raw.mode; var WHITESPACE$6 = TYPE$k.WhiteSpace; var COMMENT$6 = TYPE$k.Comment; var SEMICOLON$4 = TYPE$k.Semicolon; function consumeRaw$2(startToken) { return this.Raw(startToken, rawMode$3.semicolonIncluded, true) } var DeclarationList = { name: "DeclarationList", structure: { children: [["Declaration"]] }, parse: function () { var children = this.createList(); scan: while (!this.scanner.eof) { switch (this.scanner.tokenType) { case WHITESPACE$6: case COMMENT$6: case SEMICOLON$4: this.scanner.next(); break; default: children.push(this.parseWithFallback(this.Declaration, consumeRaw$2)) } } return { type: "DeclarationList", loc: this.getLocationFromList(children), children: children } }, generate: function (node) { this.children(node, (function (prev) { if (prev.type === "Declaration") { this.chunk(";") } })) } }; var consumeNumber$3 = utils.consumeNumber; var TYPE$l = tokenizer.TYPE; var DIMENSION$3 = TYPE$l.Dimension; var Dimension = { name: "Dimension", structure: { value: String, unit: String }, parse: function () { var start = this.scanner.tokenStart; var numberEnd = consumeNumber$3(this.scanner.source, start); this.eat(DIMENSION$3); return { type: "Dimension", loc: this.getLocation(start, this.scanner.tokenStart), value: this.scanner.source.substring(start, numberEnd), unit: this.scanner.source.substring(numberEnd, this.scanner.tokenStart) } }, generate: function (node) { this.chunk(node.value); this.chunk(node.unit) } }; var TYPE$m = tokenizer.TYPE; var RIGHTPARENTHESIS$2 = TYPE$m.RightParenthesis; var _Function = { name: "Function", structure: { name: String, children: [[]] }, parse: function (readSequence, recognizer) { var start = this.scanner.tokenStart; var name = this.consumeFunctionName(); var nameLowerCase = name.toLowerCase(); var children; children = recognizer.hasOwnProperty(nameLowerCase) ? recognizer[nameLowerCase].call(this, recognizer) : readSequence.call(this, recognizer); if (!this.scanner.eof) { this.eat(RIGHTPARENTHESIS$2) } return { type: "Function", loc: this.getLocation(start, this.scanner.tokenStart), name: name, children: children } }, generate: function (node) { this.chunk(node.name); this.chunk("("); this.children(node); this.chunk(")") }, walkContext: "function" }; var TYPE$n = tokenizer.TYPE; var HASH$2 = TYPE$n.Hash; var HexColor = { name: "HexColor", structure: { value: String }, parse: function () { var start = this.scanner.tokenStart; this.eat(HASH$2); return { type: "HexColor", loc: this.getLocation(start, this.scanner.tokenStart), value: this.scanner.substrToCursor(start + 1) } }, generate: function (node) { this.chunk("#"); this.chunk(node.value) } }; var TYPE$o = tokenizer.TYPE; var IDENT$8 = TYPE$o.Ident; var Identifier = { name: "Identifier", structure: { name: String }, parse: function () { return { type: "Identifier", loc: this.getLocation(this.scanner.tokenStart, this.scanner.tokenEnd), name: this.consume(IDENT$8) } }, generate: function (node) { this.chunk(node.name) } }; var TYPE$p = tokenizer.TYPE; var HASH$3 = TYPE$p.Hash; var IdSelector = { name: "IdSelector", structure: { name: String }, parse: function () { var start = this.scanner.tokenStart; this.eat(HASH$3); return { type: "IdSelector", loc: this.getLocation(start, this.scanner.tokenStart), name: this.scanner.substrToCursor(start + 1) } }, generate: function (node) { this.chunk("#"); this.chunk(node.name) } }; var TYPE$q = tokenizer.TYPE; var IDENT$9 = TYPE$q.Ident; var NUMBER$4 = TYPE$q.Number; var DIMENSION$4 = TYPE$q.Dimension; var LEFTPARENTHESIS$2 = TYPE$q.LeftParenthesis; var RIGHTPARENTHESIS$3 = TYPE$q.RightParenthesis; var COLON$2 = TYPE$q.Colon; var DELIM$3 = TYPE$q.Delim; var MediaFeature = { name: "MediaFeature", structure: { name: String, value: ["Identifier", "Number", "Dimension", "Ratio", null] }, parse: function () { var start = this.scanner.tokenStart; var name; var value = null; this.eat(LEFTPARENTHESIS$2); this.scanner.skipSC(); name = this.consume(IDENT$9); this.scanner.skipSC(); if (this.scanner.tokenType !== RIGHTPARENTHESIS$3) { this.eat(COLON$2); this.scanner.skipSC(); switch (this.scanner.tokenType) { case NUMBER$4: if (this.lookupNonWSType(1) === DELIM$3) { value = this.Ratio() } else { value = this.Number() } break; case DIMENSION$4: value = this.Dimension(); break; case IDENT$9: value = this.Identifier(); break; default: this.error("Number, dimension, ratio or identifier is expected") }this.scanner.skipSC() } this.eat(RIGHTPARENTHESIS$3); return { type: "MediaFeature", loc: this.getLocation(start, this.scanner.tokenStart), name: name, value: value } }, generate: function (node) { this.chunk("("); this.chunk(node.name); if (node.value !== null) { this.chunk(":"); this.node(node.value) } this.chunk(")") } }; var TYPE$r = tokenizer.TYPE; var WHITESPACE$7 = TYPE$r.WhiteSpace; var COMMENT$7 = TYPE$r.Comment; var IDENT$a = TYPE$r.Ident; var LEFTPARENTHESIS$3 = TYPE$r.LeftParenthesis; var MediaQuery = { name: "MediaQuery", structure: { children: [["Identifier", "MediaFeature", "WhiteSpace"]] }, parse: function () { this.scanner.skipSC(); var children = this.createList(); var child = null; var space = null; scan: while (!this.scanner.eof) { switch (this.scanner.tokenType) { case COMMENT$7: this.scanner.next(); continue; case WHITESPACE$7: space = this.WhiteSpace(); continue; case IDENT$a: child = this.Identifier(); break; case LEFTPARENTHESIS$3: child = this.MediaFeature(); break; default: break scan }if (space !== null) { children.push(space); space = null } children.push(child) } if (child === null) { this.error("Identifier or parenthesis is expected") } return { type: "MediaQuery", loc: this.getLocationFromList(children), children: children } }, generate: function (node) { this.children(node) } }; var COMMA$1 = tokenizer.TYPE.Comma; var MediaQueryList = { name: "MediaQueryList", structure: { children: [["MediaQuery"]] }, parse: function (relative) { var children = this.createList(); this.scanner.skipSC(); while (!this.scanner.eof) { children.push(this.MediaQuery(relative)); if (this.scanner.tokenType !== COMMA$1) { break } this.scanner.next() } return { type: "MediaQueryList", loc: this.getLocationFromList(children), children: children } }, generate: function (node) { this.children(node, (function () { this.chunk(",") })) } }; var Nth = { name: "Nth", structure: { nth: ["AnPlusB", "Identifier"], selector: ["SelectorList", null] }, parse: function (allowOfClause) { this.scanner.skipSC(); var start = this.scanner.tokenStart; var end = start; var selector = null; var query; if (this.scanner.lookupValue(0, "odd") || this.scanner.lookupValue(0, "even")) { query = this.Identifier() } else { query = this.AnPlusB() } this.scanner.skipSC(); if (allowOfClause && this.scanner.lookupValue(0, "of")) { this.scanner.next(); selector = this.SelectorList(); if (this.needPositions) { end = this.getLastListNode(selector.children).loc.end.offset } } else { if (this.needPositions) { end = query.loc.end.offset } } return { type: "Nth", loc: this.getLocation(start, end), nth: query, selector: selector } }, generate: function (node) { this.node(node.nth); if (node.selector !== null) { this.chunk(" of "); this.node(node.selector) } } }; var NUMBER$5 = tokenizer.TYPE.Number; var _Number = { name: "Number", structure: { value: String }, parse: function () { return { type: "Number", loc: this.getLocation(this.scanner.tokenStart, this.scanner.tokenEnd), value: this.consume(NUMBER$5) } }, generate: function (node) { this.chunk(node.value) } }; var Operator = { name: "Operator", structure: { value: String }, parse: function () { var start = this.scanner.tokenStart; this.scanner.next(); return { type: "Operator", loc: this.getLocation(start, this.scanner.tokenStart), value: this.scanner.substrToCursor(start) } }, generate: function (node) { this.chunk(node.value) } }; var TYPE$s = tokenizer.TYPE; var LEFTPARENTHESIS$4 = TYPE$s.LeftParenthesis; var RIGHTPARENTHESIS$4 = TYPE$s.RightParenthesis; var Parentheses = { name: "Parentheses", structure: { children: [[]] }, parse: function (readSequence, recognizer) { var start = this.scanner.tokenStart; var children = null; this.eat(LEFTPARENTHESIS$4); children = readSequence.call(this, recognizer); if (!this.scanner.eof) { this.eat(RIGHTPARENTHESIS$4) } return { type: "Parentheses", loc: this.getLocation(start, this.scanner.tokenStart), children: children } }, generate: function (node) { this.chunk("("); this.children(node); this.chunk(")") } }; var consumeNumber$4 = utils.consumeNumber; var TYPE$t = tokenizer.TYPE; var PERCENTAGE$1 = TYPE$t.Percentage; var Percentage = { name: "Percentage", structure: { value: String }, parse: function () { var start = this.scanner.tokenStart; var numberEnd = consumeNumber$4(this.scanner.source, start); this.eat(PERCENTAGE$1); return { type: "Percentage", loc: this.getLocation(start, this.scanner.tokenStart), value: this.scanner.source.substring(start, numberEnd) } }, generate: function (node) { this.chunk(node.value); this.chunk("%") } }; var TYPE$u = tokenizer.TYPE; var IDENT$b = TYPE$u.Ident; var FUNCTION$1 = TYPE$u.Function; var COLON$3 = TYPE$u.Colon; var RIGHTPARENTHESIS$5 = TYPE$u.RightParenthesis; var PseudoClassSelector = { name: "PseudoClassSelector", structure: { name: String, children: [["Raw"], null] }, parse: function () { var start = this.scanner.tokenStart; var children = null; var name; var nameLowerCase; this.eat(COLON$3); if (this.scanner.tokenType === FUNCTION$1) { name = this.consumeFunctionName(); nameLowerCase = name.toLowerCase(); if (this.pseudo.hasOwnProperty(nameLowerCase)) { this.scanner.skipSC(); children = this.pseudo[nameLowerCase].call(this); this.scanner.skipSC() } else { children = this.createList(); children.push(this.Raw(this.scanner.tokenIndex, null, false)) } this.eat(RIGHTPARENTHESIS$5) } else { name = this.consume(IDENT$b) } return { type: "PseudoClassSelector", loc: this.getLocation(start, this.scanner.tokenStart), name: name, children: children } }, generate: function (node) { this.chunk(":"); this.chunk(node.name); if (node.children !== null) { this.chunk("("); this.children(node); this.chunk(")") } }, walkContext: "function" }; var TYPE$v = tokenizer.TYPE; var IDENT$c = TYPE$v.Ident; var FUNCTION$2 = TYPE$v.Function; var COLON$4 = TYPE$v.Colon; var RIGHTPARENTHESIS$6 = TYPE$v.RightParenthesis; var PseudoElementSelector = { name: "PseudoElementSelector", structure: { name: String, children: [["Raw"], null] }, parse: function () { var start = this.scanner.tokenStart; var children = null; var name; var nameLowerCase; this.eat(COLON$4); this.eat(COLON$4); if (this.scanner.tokenType === FUNCTION$2) { name = this.consumeFunctionName(); nameLowerCase = name.toLowerCase(); if (this.pseudo.hasOwnProperty(nameLowerCase)) { this.scanner.skipSC(); children = this.pseudo[nameLowerCase].call(this); this.scanner.skipSC() } else { children = this.createList(); children.push(this.Raw(this.scanner.tokenIndex, null, false)) } this.eat(RIGHTPARENTHESIS$6) } else { name = this.consume(IDENT$c) } return { type: "PseudoElementSelector", loc: this.getLocation(start, this.scanner.tokenStart), name: name, children: children } }, generate: function (node) { this.chunk("::"); this.chunk(node.name); if (node.children !== null) { this.chunk("("); this.children(node); this.chunk(")") } }, walkContext: "function" }; var isDigit$5 = tokenizer.isDigit; var TYPE$w = tokenizer.TYPE; var NUMBER$6 = TYPE$w.Number; var DELIM$4 = TYPE$w.Delim; var SOLIDUS$3 = 47; var FULLSTOP$1 = 46; function consumeNumber$5() { this.scanner.skipWS(); var value = this.consume(NUMBER$6); for (var i = 0; i < value.length; i++) { var code = value.charCodeAt(i); if (!isDigit$5(code) && code !== FULLSTOP$1) { this.error("Unsigned number is expected", this.scanner.tokenStart - value.length + i) } } if (Number(value) === 0) { this.error("Zero number is not allowed", this.scanner.tokenStart - value.length) } return value } var Ratio = { name: "Ratio", structure: { left: String, right: String }, parse: function () { var start = this.scanner.tokenStart; var left = consumeNumber$5.call(this); var right; this.scanner.skipWS(); if (!this.scanner.isDelim(SOLIDUS$3)) { this.error("Solidus is expected") } this.eat(DELIM$4); right = consumeNumber$5.call(this); return { type: "Ratio", loc: this.getLocation(start, this.scanner.tokenStart), left: left, right: right } }, generate: function (node) { this.chunk(node.left); this.chunk("/"); this.chunk(node.right) } }; var TYPE$x = tokenizer.TYPE; var rawMode$4 = Raw.mode; var LEFTCURLYBRACKET$4 = TYPE$x.LeftCurlyBracket; function consumeRaw$3(startToken) { return this.Raw(startToken, rawMode$4.leftCurlyBracket, true) } function consumePrelude() { var prelude = this.SelectorList(); if (prelude.type !== "Raw" && this.scanner.eof === false && this.scanner.tokenType !== LEFTCURLYBRACKET$4) { this.error() } return prelude } var Rule = { name: "Rule", structure: { prelude: ["SelectorList", "Raw"], block: ["Block"] }, parse: function () { var startToken = this.scanner.tokenIndex; var startOffset = this.scanner.tokenStart; var prelude; var block; if (this.parseRulePrelude) { prelude = this.parseWithFallback(consumePrelude, consumeRaw$3) } else { prelude = consumeRaw$3.call(this, startToken) } block = this.Block(true); return { type: "Rule", loc: this.getLocation(startOffset, this.scanner.tokenStart), prelude: prelude, block: block } }, generate: function (node) { this.node(node.prelude); this.node(node.block) }, walkContext: "rule" }; var Selector = { name: "Selector", structure: { children: [["TypeSelector", "IdSelector", "ClassSelector", "AttributeSelector", "PseudoClassSelector", "PseudoElementSelector", "Combinator", "WhiteSpace"]] }, parse: function () { var children = this.readSequence(this.scope.Selector); if (this.getFirstListNode(children) === null) { this.error("Selector is expected") } return { type: "Selector", loc: this.getLocationFromList(children), children: children } }, generate: function (node) { this.children(node) } }; var TYPE$y = tokenizer.TYPE; var COMMA$2 = TYPE$y.Comma; var SelectorList = { name: "SelectorList", structure: { children: [["Selector", "Raw"]] }, parse: function () { var children = this.createList(); while (!this.scanner.eof) { children.push(this.Selector()); if (this.scanner.tokenType === COMMA$2) { this.scanner.next(); continue } break } return { type: "SelectorList", loc: this.getLocationFromList(children), children: children } }, generate: function (node) { this.children(node, (function () { this.chunk(",") })) }, walkContext: "selector" }; var STRING$1 = tokenizer.TYPE.String; var _String = { name: "String", structure: { value: String }, parse: function () { return { type: "String", loc: this.getLocation(this.scanner.tokenStart, this.scanner.tokenEnd), value: this.consume(STRING$1) } }, generate: function (node) { this.chunk(node.value) } }; var TYPE$z = tokenizer.TYPE; var WHITESPACE$8 = TYPE$z.WhiteSpace; var COMMENT$8 = TYPE$z.Comment; var ATKEYWORD$2 = TYPE$z.AtKeyword; var CDO$1 = TYPE$z.CDO; var CDC$1 = TYPE$z.CDC; var EXCLAMATIONMARK$3 = 33; function consumeRaw$4(startToken) { return this.Raw(startToken, null, false) } var StyleSheet = { name: "StyleSheet", structure: { children: [["Comment", "CDO", "CDC", "Atrule", "Rule", "Raw"]] }, parse: function () { var start = this.scanner.tokenStart; var children = this.createList(); var child; scan: while (!this.scanner.eof) { switch (this.scanner.tokenType) { case WHITESPACE$8: this.scanner.next(); continue; case COMMENT$8: if (this.scanner.source.charCodeAt(this.scanner.tokenStart + 2) !== EXCLAMATIONMARK$3) { this.scanner.next(); continue } child = this.Comment(); break; case CDO$1: child = this.CDO(); break; case CDC$1: child = this.CDC(); break; case ATKEYWORD$2: child = this.parseWithFallback(this.Atrule, consumeRaw$4); break; default: child = this.parseWithFallback(this.Rule, consumeRaw$4) }children.push(child) } return { type: "StyleSheet", loc: this.getLocation(start, this.scanner.tokenStart), children: children } }, generate: function (node) { this.children(node) }, walkContext: "stylesheet" }; var TYPE$A = tokenizer.TYPE; var IDENT$d = TYPE$A.Ident; var ASTERISK$4 = 42; var VERTICALLINE$2 = 124; function eatIdentifierOrAsterisk() { if (this.scanner.tokenType !== IDENT$d && this.scanner.isDelim(ASTERISK$4) === false) { this.error("Identifier or asterisk is expected") } this.scanner.next() } var TypeSelector = { name: "TypeSelector", structure: { name: String }, parse: function () { var start = this.scanner.tokenStart; if (this.scanner.isDelim(VERTICALLINE$2)) { this.scanner.next(); eatIdentifierOrAsterisk.call(this) } else { eatIdentifierOrAsterisk.call(this); if (this.scanner.isDelim(VERTICALLINE$2)) { this.scanner.next(); eatIdentifierOrAsterisk.call(this) } } return { type: "TypeSelector", loc: this.getLocation(start, this.scanner.tokenStart), name: this.scanner.substrToCursor(start) } }, generate: function (node) { this.chunk(node.name) } }; var isHexDigit$4 = tokenizer.isHexDigit; var cmpChar$4 = tokenizer.cmpChar; var TYPE$B = tokenizer.TYPE; var NAME$3 = tokenizer.NAME; var IDENT$e = TYPE$B.Ident; var NUMBER$7 = TYPE$B.Number; var DIMENSION$5 = TYPE$B.Dimension; var PLUSSIGN$6 = 43; var HYPHENMINUS$4 = 45; var QUESTIONMARK$2 = 63; var U$1 = 117; function eatHexSequence(offset, allowDash) { for (var pos = this.scanner.tokenStart + offset, len = 0; pos < this.scanner.tokenEnd; pos++) { var code = this.scanner.source.charCodeAt(pos); if (code === HYPHENMINUS$4 && allowDash && len !== 0) { if (eatHexSequence.call(this, offset + len + 1, false) === 0) { this.error() } return -1 } if (!isHexDigit$4(code)) { this.error(allowDash && len !== 0 ? "HyphenMinus" + (len < 6 ? " or hex digit" : "") + " is expected" : len < 6 ? "Hex digit is expected" : "Unexpected input", pos) } if (++len > 6) { this.error("Too many hex digits", pos) } } this.scanner.next(); return len } function eatQuestionMarkSequence(max) { var count = 0; while (this.scanner.isDelim(QUESTIONMARK$2)) { if (++count > max) { this.error("Too many question marks") } this.scanner.next() } } function startsWith$1(code) { if (this.scanner.source.charCodeAt(this.scanner.tokenStart) !== code) { this.error(NAME$3[code] + " is expected") } } function scanUnicodeRange() { var hexLength = 0; if (this.scanner.isDelim(PLUSSIGN$6)) { this.scanner.next(); if (this.scanner.tokenType === IDENT$e) { hexLength = eatHexSequence.call(this, 0, true); if (hexLength > 0) { eatQuestionMarkSequence.call(this, 6 - hexLength) } return } if (this.scanner.isDelim(QUESTIONMARK$2)) { this.scanner.next(); eatQuestionMarkSequence.call(this, 5); return } this.error("Hex digit or question mark is expected"); return } if (this.scanner.tokenType === NUMBER$7) { startsWith$1.call(this, PLUSSIGN$6); hexLength = eatHexSequence.call(this, 1, true); if (this.scanner.isDelim(QUESTIONMARK$2)) { eatQuestionMarkSequence.call(this, 6 - hexLength); return } if (this.scanner.tokenType === DIMENSION$5 || this.scanner.tokenType === NUMBER$7) { startsWith$1.call(this, HYPHENMINUS$4); eatHexSequence.call(this, 1, false); return } return } if (this.scanner.tokenType === DIMENSION$5) { startsWith$1.call(this, PLUSSIGN$6); hexLength = eatHexSequence.call(this, 1, true); if (hexLength > 0) { eatQuestionMarkSequence.call(this, 6 - hexLength) } return } this.error() } var UnicodeRange = { name: "UnicodeRange", structure: { value: String }, parse: function () { var start = this.scanner.tokenStart; if (!cmpChar$4(this.scanner.source, start, U$1)) { this.error("U is expected") } if (!cmpChar$4(this.scanner.source, start + 1, PLUSSIGN$6)) { this.error("Plus sign is expected") } this.scanner.next(); scanUnicodeRange.call(this); return { type: "UnicodeRange", loc: this.getLocation(start, this.scanner.tokenStart), value: this.scanner.substrToCursor(start) } }, generate: function (node) { this.chunk(node.value) } }; var isWhiteSpace$2 = tokenizer.isWhiteSpace; var cmpStr$4 = tokenizer.cmpStr; var TYPE$C = tokenizer.TYPE; var FUNCTION$3 = TYPE$C.Function; var URL$1 = TYPE$C.Url; var RIGHTPARENTHESIS$7 = TYPE$C.RightParenthesis; var Url = { name: "Url", structure: { value: ["String", "Raw"] }, parse: function () { var start = this.scanner.tokenStart; var value; switch (this.scanner.tokenType) { case URL$1: var rawStart = start + 4; var rawEnd = this.scanner.tokenEnd - 1; while (rawStart < rawEnd && isWhiteSpace$2(this.scanner.source.charCodeAt(rawStart))) { rawStart++ } while (rawStart < rawEnd && isWhiteSpace$2(this.scanner.source.charCodeAt(rawEnd - 1))) { rawEnd-- } value = { type: "Raw", loc: this.getLocation(rawStart, rawEnd), value: this.scanner.source.substring(rawStart, rawEnd) }; this.eat(URL$1); break; case FUNCTION$3: if (!cmpStr$4(this.scanner.source, this.scanner.tokenStart, this.scanner.tokenEnd, "url(")) { this.error("Function name must be `url`") } this.eat(FUNCTION$3); this.scanner.skipSC(); value = this.String(); this.scanner.skipSC(); this.eat(RIGHTPARENTHESIS$7); break; default: this.error("Url or Function is expected") }return { type: "Url", loc: this.getLocation(start, this.scanner.tokenStart), value: value } }, generate: function (node) { this.chunk("url"); this.chunk("("); this.node(node.value); this.chunk(")") } }; var Value = { name: "Value", structure: { children: [[]] }, parse: function () { var start = this.scanner.tokenStart; var children = this.readSequence(this.scope.Value); return { type: "Value", loc: this.getLocation(start, this.scanner.tokenStart), children: children } }, generate: function (node) { this.children(node) } }; var WHITESPACE$9 = tokenizer.TYPE.WhiteSpace; var SPACE$2 = Object.freeze({ type: "WhiteSpace", loc: null, value: " " }); var WhiteSpace$1 = { name: "WhiteSpace", structure: { value: String }, parse: function () { this.eat(WHITESPACE$9); return SPACE$2 }, generate: function (node) { this.chunk(node.value) } }; var node = { AnPlusB: AnPlusB, Atrule: Atrule, AtrulePrelude: AtrulePrelude, AttributeSelector: AttributeSelector, Block: Block, Brackets: Brackets, CDC: CDC_1, CDO: CDO_1, ClassSelector: ClassSelector, Combinator: Combinator, Comment: Comment, Declaration: Declaration, DeclarationList: DeclarationList, Dimension: Dimension, Function: _Function, HexColor: HexColor, Identifier: Identifier, IdSelector: IdSelector, MediaFeature: MediaFeature, MediaQuery: MediaQuery, MediaQueryList: MediaQueryList, Nth: Nth, Number: _Number, Operator: Operator, Parentheses: Parentheses, Percentage: Percentage, PseudoClassSelector: PseudoClassSelector, PseudoElementSelector: PseudoElementSelector, Ratio: Ratio, Raw: Raw, Rule: Rule, Selector: Selector, SelectorList: SelectorList, String: _String, StyleSheet: StyleSheet, TypeSelector: TypeSelector, UnicodeRange: UnicodeRange, Url: Url, Value: Value, WhiteSpace: WhiteSpace$1 }; var data = getCjsExportFromNamespace(defaultSyntax$1); var lexer = { generic: true, types: data.types, properties: data.properties, node: node }; var cmpChar$5 = tokenizer.cmpChar; var cmpStr$5 = tokenizer.cmpStr; var TYPE$D = tokenizer.TYPE; var IDENT$f = TYPE$D.Ident; var STRING$2 = TYPE$D.String; var NUMBER$8 = TYPE$D.Number; var FUNCTION$4 = TYPE$D.Function; var URL$2 = TYPE$D.Url; var HASH$4 = TYPE$D.Hash; var DIMENSION$6 = TYPE$D.Dimension; var PERCENTAGE$2 = TYPE$D.Percentage; var LEFTPARENTHESIS$5 = TYPE$D.LeftParenthesis; var LEFTSQUAREBRACKET$3 = TYPE$D.LeftSquareBracket; var COMMA$3 = TYPE$D.Comma; var DELIM$5 = TYPE$D.Delim; var NUMBERSIGN$3 = 35; var ASTERISK$5 = 42; var PLUSSIGN$7 = 43; var HYPHENMINUS$5 = 45; var SOLIDUS$4 = 47; var U$2 = 117; var _default = function defaultRecognizer(context) { switch (this.scanner.tokenType) { case HASH$4: return this.HexColor(); case COMMA$3: context.space = null; context.ignoreWSAfter = true; return this.Operator(); case LEFTPARENTHESIS$5: return this.Parentheses(this.readSequence, context.recognizer); case LEFTSQUAREBRACKET$3: return this.Brackets(this.readSequence, context.recognizer); case STRING$2: return this.String(); case DIMENSION$6: return this.Dimension(); case PERCENTAGE$2: return this.Percentage(); case NUMBER$8: return this.Number(); case FUNCTION$4: return cmpStr$5(this.scanner.source, this.scanner.tokenStart, this.scanner.tokenEnd, "url(") ? this.Url() : this.Function(this.readSequence, context.recognizer); case URL$2: return this.Url(); case IDENT$f: if (cmpChar$5(this.scanner.source, this.scanner.tokenStart, U$2) && cmpChar$5(this.scanner.source, this.scanner.tokenStart + 1, PLUSSIGN$7)) { return this.UnicodeRange() } else { return this.Identifier() } case DELIM$5: var code = this.scanner.source.charCodeAt(this.scanner.tokenStart); if (code === SOLIDUS$4 || code === ASTERISK$5 || code === PLUSSIGN$7 || code === HYPHENMINUS$5) { return this.Operator() } if (code === NUMBERSIGN$3) { this.error("Hex or identifier is expected", this.scanner.tokenStart + 1) } break } }; var atrulePrelude = { getNode: _default }; var TYPE$E = tokenizer.TYPE; var DELIM$6 = TYPE$E.Delim; var IDENT$g = TYPE$E.Ident; var DIMENSION$7 = TYPE$E.Dimension; var PERCENTAGE$3 = TYPE$E.Percentage; var NUMBER$9 = TYPE$E.Number; var HASH$5 = TYPE$E.Hash; var COLON$5 = TYPE$E.Colon; var LEFTSQUAREBRACKET$4 = TYPE$E.LeftSquareBracket; var NUMBERSIGN$4 = 35; var ASTERISK$6 = 42; var PLUSSIGN$8 = 43; var SOLIDUS$5 = 47; var FULLSTOP$2 = 46; var GREATERTHANSIGN$2 = 62; var VERTICALLINE$3 = 124; var TILDE$2 = 126; function getNode(context) { switch (this.scanner.tokenType) { case LEFTSQUAREBRACKET$4: return this.AttributeSelector(); case HASH$5: return this.IdSelector(); case COLON$5: if (this.scanner.lookupType(1) === COLON$5) { return this.PseudoElementSelector() } else { return this.PseudoClassSelector() } case IDENT$g: return this.TypeSelector(); case NUMBER$9: case PERCENTAGE$3: return this.Percentage(); case DIMENSION$7: if (this.scanner.source.charCodeAt(this.scanner.tokenStart) === FULLSTOP$2) { this.error("Identifier is expected", this.scanner.tokenStart + 1) } break; case DELIM$6: var code = this.scanner.source.charCodeAt(this.scanner.tokenStart); switch (code) { case PLUSSIGN$8: case GREATERTHANSIGN$2: case TILDE$2: context.space = null; context.ignoreWSAfter = true; return this.Combinator(); case SOLIDUS$5: return this.Combinator(); case FULLSTOP$2: return this.ClassSelector(); case ASTERISK$6: case VERTICALLINE$3: return this.TypeSelector(); case NUMBERSIGN$4: return this.IdSelector() }break } } var selector = { getNode: getNode }; var element = function () { this.scanner.skipSC(); var children = this.createSingleNodeList(this.IdSelector()); this.scanner.skipSC(); return children }; var expression = function () { return this.createSingleNodeList(this.Raw(this.scanner.tokenIndex, null, false)) }; var TYPE$F = tokenizer.TYPE; var rawMode$5 = Raw.mode; var COMMA$4 = TYPE$F.Comma; var _var = function () { var children = this.createList(); this.scanner.skipSC(); children.push(this.Identifier()); this.scanner.skipSC(); if (this.scanner.tokenType === COMMA$4) { children.push(this.Operator()); children.push(this.parseCustomProperty ? this.Value(null) : this.Raw(this.scanner.tokenIndex, rawMode$5.exclamationMarkOrSemicolon, false)) } return children }; var value = { getNode: _default, "-moz-element": element, element: element, expression: expression, var: _var }; var scope = { AtrulePrelude: atrulePrelude, Selector: selector, Value: value }; var fontFace = { parse: { prelude: null, block: function () { return this.Block(true) } } }; var TYPE$G = tokenizer.TYPE; var STRING$3 = TYPE$G.String; var IDENT$h = TYPE$G.Ident; var URL$3 = TYPE$G.Url; var FUNCTION$5 = TYPE$G.Function; var LEFTPARENTHESIS$6 = TYPE$G.LeftParenthesis; var _import = { parse: { prelude: function () { var children = this.createList(); this.scanner.skipSC(); switch (this.scanner.tokenType) { case STRING$3: children.push(this.String()); break; case URL$3: case FUNCTION$5: children.push(this.Url()); break; default: this.error("String or url() is expected") }if (this.lookupNonWSType(0) === IDENT$h || this.lookupNonWSType(0) === LEFTPARENTHESIS$6) { children.push(this.WhiteSpace()); children.push(this.MediaQueryList()) } return children }, block: null } }; var media = { parse: { prelude: function () { return this.createSingleNodeList(this.MediaQueryList()) }, block: function () { return this.Block(false) } } }; var page = { parse: { prelude: function () { return this.createSingleNodeList(this.SelectorList()) }, block: function () { return this.Block(true) } } }; var TYPE$H = tokenizer.TYPE; var WHITESPACE$a = TYPE$H.WhiteSpace; var COMMENT$9 = TYPE$H.Comment; var IDENT$i = TYPE$H.Ident; var FUNCTION$6 = TYPE$H.Function; var COLON$6 = TYPE$H.Colon; var LEFTPARENTHESIS$7 = TYPE$H.LeftParenthesis; function consumeRaw$5() { return this.createSingleNodeList(this.Raw(this.scanner.tokenIndex, null, false)) } function parentheses() { this.scanner.skipSC(); if (this.scanner.tokenType === IDENT$i && this.lookupNonWSType(1) === COLON$6) { return this.createSingleNodeList(this.Declaration()) } return readSequence.call(this) } function readSequence() { var children = this.createList(); var space = null; var child; this.scanner.skipSC(); scan: while (!this.scanner.eof) { switch (this.scanner.tokenType) { case WHITESPACE$a: space = this.WhiteSpace(); continue; case COMMENT$9: this.scanner.next(); continue; case FUNCTION$6: child = this.Function(consumeRaw$5, this.scope.AtrulePrelude); break; case IDENT$i: child = this.Identifier(); break; case LEFTPARENTHESIS$7: child = this.Parentheses(parentheses, this.scope.AtrulePrelude); break; default: break scan }if (space !== null) { children.push(space); space = null } children.push(child) } return children } var supports = { parse: { prelude: function () { var children = readSequence.call(this); if (this.getFirstListNode(children) === null) { this.error("Condition is expected") } return children }, block: function () { return this.Block(false) } } }; var atrule = { "font-face": fontFace, import: _import, media: media, page: page, supports: supports }; var dir = { parse: function () { return this.createSingleNodeList(this.Identifier()) } }; var has$1 = { parse: function () { return this.createSingleNodeList(this.SelectorList()) } }; var lang = { parse: function () { return this.createSingleNodeList(this.Identifier()) } }; var selectorList = { parse: function selectorList() { return this.createSingleNodeList(this.SelectorList()) } }; var matches = selectorList; var not = selectorList; var ALLOW_OF_CLAUSE = true; var nthWithOfClause = { parse: function nthWithOfClause() { return this.createSingleNodeList(this.Nth(ALLOW_OF_CLAUSE)) } }; var nthChild = nthWithOfClause; var nthLastChild = nthWithOfClause; var DISALLOW_OF_CLAUSE = false; var nth = { parse: function nth() { return this.createSingleNodeList(this.Nth(DISALLOW_OF_CLAUSE)) } }; var nthLastOfType = nth; var nthOfType = nth; var slotted = { parse: function compoundSelector() { return this.createSingleNodeList(this.Selector()) } }; var pseudo = { dir: dir, has: has$1, lang: lang, matches: matches, not: not, "nth-child": nthChild, "nth-last-child": nthLastChild, "nth-last-of-type": nthLastOfType, "nth-of-type": nthOfType, slotted: slotted }; var parser = { parseContext: { default: "StyleSheet", stylesheet: "StyleSheet", atrule: "Atrule", atrulePrelude: function (options) { return this.AtrulePrelude(options.atrule ? String(options.atrule) : null) }, mediaQueryList: "MediaQueryList", mediaQuery: "MediaQuery", rule: "Rule", selectorList: "SelectorList", selector: "Selector", block: function () { return this.Block(true) }, declarationList: "DeclarationList", declaration: "Declaration", value: "Value" }, scope: scope, atrule: atrule, pseudo: pseudo, node: node }; function merge() { var dest = {}; for (var i = 0; i < arguments.length; i++) { var src = arguments[i]; for (var key in src) { dest[key] = src[key] } } return dest } var syntax = create$2.create(merge(lexer, parser)); var lib = syntax; return lib }));
  49. return csstree;
  50. })();