{
  "name": "imba",
  "scopeName": "source.imba",
  "fileTypes": ["imba", "imba2"],
  "uuid": "ef98eb90-bf9b-11e4-bb52-0800200c9a67",
  "patterns": [
    {
      "include": "#root"
    },
    {
      "name": "comment.line.shebang.imba",
      "match": "\\A(#!).*(?=$)",
      "captures": {
        "1": {
          "name": "punctuation.definition.comment.imba"
        }
      }
    }
  ],
  "repository": {
    "root": {
      "patterns": [
        {
          "include": "#block"
        }
      ]
    },
    "block": {
      "patterns": [
        {
          "include": "#style-declaration"
        },
        {
          "include": "#object-keys"
        },
        {
          "include": "#tag-literal"
        },
        {
          "include": "#regex"
        },
        {
          "include": "#keywords"
        },
        {
          "include": "#comment"
        },
        {
          "include": "#literal"
        },
        {
          "include": "#plain-identifiers"
        },
        {
          "include": "#plain-accessors"
        },
        {
          "include": "#pairs"
        },
        {
          "include": "#invalid-indentation"
        }
      ]
    },
    "expr": {
      "patterns": [
        {
          "include": "#style-declaration"
        },
        {
          "include": "#object-keys"
        },
        {
          "include": "#tag-literal"
        },
        {
          "include": "#regex"
        },
        {
          "include": "#keywords"
        },
        {
          "include": "#comment"
        },
        {
          "include": "#literal"
        },
        {
          "include": "#plain-identifiers"
        },
        {
          "include": "#plain-accessors"
        },
        {
          "include": "#pairs"
        }
      ]
    },
    "literal": {
      "patterns": [
        {
          "include": "#number-with-unit-literal"
        },
        {
          "include": "#numeric-literal"
        },
        {
          "include": "#boolean-literal"
        },
        {
          "include": "#null-literal"
        },
        {
          "include": "#undefined-literal"
        },
        {
          "include": "#numericConstant-literal"
        },
        {
          "include": "#this-literal"
        },
        {
          "include": "#global-literal"
        },
        {
          "include": "#super-literal"
        },
        {
          "include": "#type-literal"
        },
        {
          "include": "#string"
        }
      ]
    },
    "pairs": {
      "patterns": [
        {
          "include": "#curly-braces"
        },
        {
          "include": "#square-braces"
        },
        {
          "include": "#round-braces"
        }
      ]
    },
    "curly-braces": {
      "begin": "\\s*(\\{)",
      "beginCaptures": {
        "1": {
          "name": "meta.brace.curly.imba"
        }
      },
      "end": "\\}",
      "endCaptures": {
        "0": {
          "name": "meta.brace.curly.imba"
        }
      },
      "patterns": [
        {
          "include": "#expr"
        },
        {
          "include": "#punctuation-comma"
        }
      ]
    },
    "square-braces": {
      "begin": "\\s*(\\[)",
      "beginCaptures": {
        "1": {
          "name": "meta.brace.square.imba"
        }
      },
      "end": "\\]",
      "endCaptures": {
        "0": {
          "name": "meta.brace.square.imba"
        }
      },
      "patterns": [
        {
          "include": "#expr"
        },
        {
          "include": "#punctuation-comma"
        }
      ]
    },
    "round-braces": {
      "begin": "\\s*(\\()",
      "beginCaptures": {
        "1": {
          "name": "meta.brace.round.imba"
        }
      },
      "end": "\\)",
      "endCaptures": {
        "0": {
          "name": "meta.brace.round.imba"
        }
      },
      "patterns": [
        {
          "include": "#expr"
        },
        {
          "include": "#punctuation-comma"
        }
      ]
    },
    "keywords": {
      "patterns": [
        {
          "name": "keyword.control.imba",
          "match": "(if|elif|else|unless|switch|when|then|do|import|export|for own|for|while|until|return|try|catch|await|finally|throw|as|continue|break|extend|augment)(?![_\\-$[:alnum:]])(?:(?=\\.\\.\\.)|(?!\\.))"
        },
        {
          "name": "keyword.control.imba",
          "match": "(?<=export\\s+)(default)(?![_\\-$[:alnum:]])(?:(?=\\.\\.\\.)|(?!\\.))"
        },
        {
          "name": "keyword.control.imba",
          "match": "(?<=import\\s+)(type)(?=\\s+[\\w\\{\\$\\_])"
        },
        {
          "name": "keyword.control.imba",
          "match": "(extend)\\s+(?=class|tag)"
        },
        {
          "name": "keyword.control.imba",
          "match": "(?<=[\\*\\}\\w\\$]\\s+)(from)(?=\\s+[\\\"\\'])"
        },
        {
          "name": "storage.type.function.imba",
          "match": "(def|get|set)(?![_\\-$[:alnum:]])(?:(?=\\.\\.\\.)|(?!\\.))"
        },
        {
          "name": "storage.type.class.imba",
          "match": "(tag|class|struct)(?![_\\-$[:alnum:]])(?:(?=\\.\\.\\.)|(?!\\.))"
        },
        {
          "name": "storage.type.imba",
          "match": "(let|const|constructor)(?![_\\-$[:alnum:]])(?:(?=\\.\\.\\.)|(?!\\.))"
        },
        {
          "name": "storage.type.imba",
          "match": "(prop|attr)(?![_\\-$[:alnum:]])(?:(?=\\.\\.\\.)|(?!\\.))"
        },
        {
          "name": "storage.modifier.imba",
          "match": "(static)\\s+"
        },
        {
          "include": "#ops"
        },
        {
          "name": "keyword.operator.assignment.imba",
          "match": "(=|\\|\\|=|\\?\\?=|\\&\\&=|\\+=|\\-=|\\*=|\\^=|\\%=)"
        },
        {
          "name": "keyword.operator.imba",
          "match": "(\\>\\=?|\\<\\=?)"
        },
        {
          "name": "keyword.operator.imba",
          "match": "(of|delete|\\!?isa|typeof|in|new)(?![_\\-$[:alnum:]])(?:(?=\\.\\.\\.)|(?!\\.))"
        }
      ]
    },
    "ops": {
      "patterns": [
        {
          "name": "keyword.operator.spread.imba",
          "match": "\\.\\.\\."
        },
        {
          "name": "keyword.operator.assignment.compound.imba",
          "match": "\\*=|(?<!\\()/=|%=|\\+=|\\-=|\\?=|\\?\\?=|=\\?"
        },
        {
          "name": "keyword.operator.assignment.compound.bitwise.imba",
          "match": "\\^=\\?|\\|=\\?|\\~=\\?|\\&=|\\^=|<<=|>>=|>>>=|\\|="
        },
        {
          "name": "keyword.operator.bitwise.shift.imba",
          "match": "<<|>>>|>>"
        },
        {
          "name": "keyword.operator.comparison.imba",
          "match": "===|!==|==|!=|~="
        },
        {
          "name": "keyword.operator.relational.imba",
          "match": "<=|>=|<>|<|>"
        },
        {
          "match": "(\\!)\\s*(/)(?![/*])",
          "captures": {
            "1": {
              "name": "keyword.operator.logical.imba"
            },
            "2": {
              "name": "keyword.operator.arithmetic.imba"
            }
          }
        },
        {
          "name": "keyword.operator.logical.imba",
          "match": "\\!|&&|\\|\\||\\?\\?|or\\b(?=\\s|$)|and\\b(?=\\s|$)"
        },
        {
          "name": "keyword.operator.bitwise.imba",
          "match": "\\&|~|\\^|\\|"
        },
        {
          "name": "keyword.operator.assignment.imba",
          "match": "\\="
        },
        {
          "name": "keyword.operator.decrement.imba",
          "match": "--"
        },
        {
          "name": "keyword.operator.increment.imba",
          "match": "\\+\\+"
        },
        {
          "name": "keyword.operator.arithmetic.imba",
          "match": "%|\\*|/|-|\\+"
        }
      ]
    },
    "object-keys": {
      "patterns": [
        {
          "match": "[_$[:alpha:]][_$[:alnum:]]*(?:\\-[_$[:alnum:]]+)*[\\?\\!]?\\:",
          "name": "meta.object-literal.key"
        }
      ]
    },
    "invalid-indentation": {
      "patterns": [
        {
          "name": "invalid.whitespace",
          "match": "^[\\ ]+"
        },
        {
          "name": "invalid.whitespace",
          "match": "^\\t+\\s+"
        }
      ]
    },
    "style-property": {
      "patterns": [
        {
          "name": "meta.property-name.css",
          "begin": "(?=(?:[\\@\\.]+[\\!\\<\\>]?)?[\\w\\-\\$]+(?:[\\@\\.]+[\\!\\<\\>]?[\\w\\-\\$]+)*(?:\\s*\\:))",
          "beginCaptures": {
            "1": {
              "name": "support.function.calc.css"
            },
            "2": {
              "name": "punctuation.section.function.begin.bracket.round.css"
            }
          },
          "end": "\\s*\\:",
          "endCaptures": {
            "0": {
              "name": "punctuation.separator.key-value.css"
            }
          },
          "patterns": [
            {
              "name": "support.type.property-name.variable.css",
              "match": "(?:--|\\$)[\\w\\-\\$]+"
            },
            {
              "name": "support.type.property-name.modifier.breakpoint.css",
              "match": "\\@[\\!\\<\\>]?[0-9]+"
            },
            {
              "name": "support.type.property-name.modifier.css",
              "match": "\\@[\\w\\-\\$]+"
            },
            {
              "name": "support.type.property-name.modifier.up.css",
              "match": "\\.\\.[\\w\\-\\$]+"
            },
            {
              "name": "support.type.property-name.modifier.is.css",
              "match": "\\.[\\w\\-\\$]+"
            },
            {
              "name": "support.type.property-name.css",
              "match": "[\\w\\-\\$]+"
            }
          ]
        }
      ]
    },
    "style-expr": {
      "patterns": [
        {
          "match": "(\\b[0-9][0-9_]*)(\\w+|%)?",
          "captures": {
            "1": {
              "name": "constant.numeric.integer.decimal.css"
            },
            "2": {
              "name": "keyword.other.unit.css"
            }
          }
        },
        {
          "name": "support.constant.property-value.var.css",
          "match": "--[_$[:alpha:]][_$[:alnum:]]*(?:\\-[_$[:alnum:]]+)*[\\?\\!]?"
        },
        {
          "name": "support.constant.property-value.size.css",
          "match": "(x+s|sm-|md-|lg-|sm|md|lg|x+l|hg|x+h)(?![\\w-])"
        },
        {
          "name": "support.constant.property-value.css",
          "match": "[_$[:alpha:]][_$[:alnum:]]*(?:\\-[_$[:alnum:]]+)*[\\?\\!]?"
        },
        {
          "name": "meta.function.css",
          "begin": "(\\()",
          "beginCaptures": {
            "1": {
              "name": "punctuation.section.function.begin.bracket.round.css"
            }
          },
          "end": "\\)",
          "patterns": [
            {
              "include": "#style-expr"
            }
          ]
        }
      ]
    },
    "inline-styles": {
      "patterns": [
        {
          "include": "#style-property"
        },
        {
          "include": "#css-property-values"
        },
        {
          "include": "#style-expr"
        }
      ]
    },
    "style-declaration": {
      "name": "meta.style.imba",
      "begin": "^(\\t*)(?:(global|local|export)\\s+)?(?:(scoped)\\s+)?(css)\\s",
      "beginCaptures": {
        "2": {
          "name": "keyword.control.export.imba"
        },
        "3": {
          "name": "storage.modifier.imba"
        },
        "4": {
          "name": "storage.type.style.imba"
        }
      },
      "end": "^(?!(\\1\\t|\\s*$))",
      "patterns": [
        {
          "include": "#css-selector"
        },
        {
          "include": "#css-comment"
        },
        {
          "include": "#nested-css-selector"
        },
        {
          "include": "#inline-styles"
        }
      ]
    },
    "nested-style-declaration": {
      "name": "meta.style.imba",
      "begin": "^(\\t+)(?=[\\n^]*\\&)",
      "end": "^(?!(\\1\\t|\\s*$))",
      "patterns": [
        {
          "include": "#nested-css-selector"
        },
        {
          "include": "#inline-styles"
        }
      ]
    },
    "css-size-keywords": [
      {
        "name": "support.constant.size.property-value.css",
        "match": "(x+s|sm-|md-|lg-|sm|md|lg|x+l|hg|x+h)(?![\\w-])"
      }
    ],
    "css-color-keywords": {
      "patterns": [
        {
          "name": "support.constant.color.w3c-standard-color-name.css",
          "match": "(?i)(?<![\\w-])(aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow)(?![\\w-])"
        },
        {
          "name": "support.constant.color.w3c-extended-color-name.css",
          "match": "(?xi) (?<![\\w-])\n(aliceblue|antiquewhite|aquamarine|azure|beige|bisque|blanchedalmond|blueviolet|brown|burlywood\n|cadetblue|chartreuse|chocolate|coral|cornflowerblue|cornsilk|crimson|cyan|darkblue|darkcyan\n|darkgoldenrod|darkgray|darkgreen|darkgrey|darkkhaki|darkmagenta|darkolivegreen|darkorange\n|darkorchid|darkred|darksalmon|darkseagreen|darkslateblue|darkslategray|darkslategrey|darkturquoise\n|darkviolet|deeppink|deepskyblue|dimgray|dimgrey|dodgerblue|firebrick|floralwhite|forestgreen\n|gainsboro|ghostwhite|gold|goldenrod|greenyellow|grey|honeydew|hotpink|indianred|indigo|ivory|khaki\n|lavender|lavenderblush|lawngreen|lemonchiffon|lightblue|lightcoral|lightcyan|lightgoldenrodyellow\n|lightgray|lightgreen|lightgrey|lightpink|lightsalmon|lightseagreen|lightskyblue|lightslategray\n|lightslategrey|lightsteelblue|lightyellow|limegreen|linen|magenta|mediumaquamarine|mediumblue\n|mediumorchid|mediumpurple|mediumseagreen|mediumslateblue|mediumspringgreen|mediumturquoise\n|mediumvioletred|midnightblue|mintcream|mistyrose|moccasin|navajowhite|oldlace|olivedrab|orangered\n|orchid|palegoldenrod|palegreen|paleturquoise|palevioletred|papayawhip|peachpuff|peru|pink|plum\n|powderblue|rebeccapurple|rosybrown|royalblue|saddlebrown|salmon|sandybrown|seagreen|seashell\n|sienna|skyblue|slateblue|slategray|slategrey|snow|springgreen|steelblue|tan|thistle|tomato\n|transparent|turquoise|violet|wheat|whitesmoke|yellowgreen)\n(?![\\w-])"
        },
        {
          "name": "support.constant.color.current.css",
          "match": "(?i)(?<![\\w-])currentColor(?![\\w-])"
        }
      ]
    },
    "css-functions": {
      "patterns": [
        {
          "name": "meta.function.calc.css",
          "begin": "(?i)(?<![\\w-])(calc)(\\()",
          "beginCaptures": {
            "1": {
              "name": "support.function.calc.css"
            },
            "2": {
              "name": "punctuation.section.function.begin.bracket.round.css"
            }
          },
          "end": "\\)",
          "endCaptures": {
            "0": {
              "name": "punctuation.section.function.end.bracket.round.css"
            }
          },
          "patterns": [
            {
              "name": "keyword.operator.arithmetic.css",
              "match": "[*/]|(?<=\\s|^)[-+](?=\\s|$)"
            },
            {
              "include": "#css-property-values"
            }
          ]
        },
        {
          "name": "meta.function.color.css",
          "begin": "(?i)(?<![\\w-])(rgba?|hsla?)(\\()",
          "beginCaptures": {
            "1": {
              "name": "support.function.misc.css"
            },
            "2": {
              "name": "punctuation.section.function.begin.bracket.round.css"
            }
          },
          "end": "\\)",
          "endCaptures": {
            "0": {
              "name": "punctuation.section.function.end.bracket.round.css"
            }
          },
          "patterns": [
            {
              "include": "#css-property-values"
            }
          ]
        },
        {
          "name": "meta.function.gradient.css",
          "begin": "(?xi) (?<![\\w-])\n(\n  (?:-webkit-|-moz-|-o-)?    # Accept prefixed/historical variants\n  (?:repeating-)?            # \"Repeating\"-type gradient\n  (?:linear|radial|conic)    # Shape\n  -gradient\n)\n(\\()",
          "beginCaptures": {
            "1": {
              "name": "support.function.gradient.css"
            },
            "2": {
              "name": "punctuation.section.function.begin.bracket.round.css"
            }
          },
          "end": "\\)",
          "endCaptures": {
            "0": {
              "name": "punctuation.section.function.end.bracket.round.css"
            }
          },
          "patterns": [
            {
              "name": "keyword.operator.gradient.css",
              "match": "(?i)(?<![\\w-])(from|to|at)(?![\\w-])"
            },
            {
              "include": "#css-property-values"
            }
          ]
        },
        {
          "name": "meta.function.gradient.invalid.deprecated.gradient.css",
          "begin": "(?i)(?<![\\w-])(-webkit-gradient)(\\()",
          "beginCaptures": {
            "1": {
              "name": "invalid.deprecated.gradient.function.css"
            },
            "2": {
              "name": "punctuation.section.function.begin.bracket.round.css"
            }
          },
          "end": "\\)",
          "endCaptures": {
            "0": {
              "name": "punctuation.section.function.end.bracket.round.css"
            }
          },
          "patterns": [
            {
              "begin": "(?i)(?<![\\w-])(from|to|color-stop)(\\()",
              "beginCaptures": {
                "1": {
                  "name": "invalid.deprecated.function.css"
                },
                "2": {
                  "name": "punctuation.section.function.begin.bracket.round.css"
                }
              },
              "end": "\\)",
              "endCaptures": {
                "0": {
                  "name": "punctuation.section.function.end.bracket.round.css"
                }
              },
              "patterns": [
                {
                  "include": "#css-property-values"
                }
              ]
            },
            {
              "include": "#css-property-values"
            }
          ]
        },
        {
          "name": "meta.function.misc.css",
          "begin": "(?xi) (?<![\\w-])\n(annotation|attr|blur|brightness|character-variant|contrast|counters?\n|cross-fade|drop-shadow|element|fit-content|format|grayscale|hue-rotate\n|image-set|invert|local|minmax|opacity|ornaments|repeat|saturate|sepia\n|styleset|stylistic|swash|symbols)\n(\\()",
          "beginCaptures": {
            "1": {
              "name": "support.function.misc.css"
            },
            "2": {
              "name": "punctuation.section.function.begin.bracket.round.css"
            }
          },
          "end": "\\)",
          "endCaptures": {
            "0": {
              "name": "punctuation.section.function.end.bracket.round.css"
            }
          },
          "patterns": [
            {
              "name": "constant.numeric.other.density.css",
              "match": "(?i)(?<=[,\\s\"]|\\*/|^)\\d+x(?=[\\s,\"')]|/\\*|$)"
            },
            {
              "include": "#css-property-values"
            },
            {
              "name": "variable.parameter.misc.css",
              "match": "[^'\"),\\s]+"
            }
          ]
        },
        {
          "name": "meta.function.shape.css",
          "begin": "(?i)(?<![\\w-])(circle|ellipse|inset|polygon|rect)(\\()",
          "beginCaptures": {
            "1": {
              "name": "support.function.shape.css"
            },
            "2": {
              "name": "punctuation.section.function.begin.bracket.round.css"
            }
          },
          "end": "\\)",
          "endCaptures": {
            "0": {
              "name": "punctuation.section.function.end.bracket.round.css"
            }
          },
          "patterns": [
            {
              "name": "keyword.operator.shape.css",
              "match": "(?i)(?<=\\s|^|\\*/)(at|round)(?=\\s|/\\*|$)"
            },
            {
              "include": "#css-property-values"
            }
          ]
        },
        {
          "name": "meta.function.timing-function.css",
          "begin": "(?i)(?<![\\w-])(cubic-bezier|steps)(\\()",
          "beginCaptures": {
            "1": {
              "name": "support.function.timing-function.css"
            },
            "2": {
              "name": "punctuation.section.function.begin.bracket.round.css"
            }
          },
          "end": "\\)",
          "endCaptures": {
            "0": {
              "name": "punctuation.section.function.end.bracket.round.css"
            }
          },
          "patterns": [
            {
              "name": "support.constant.step-direction.css",
              "match": "(?i)(?<![\\w-])(start|end)(?=\\s*\\)|$)"
            },
            {
              "include": "#css-property-values"
            }
          ]
        },
        {
          "begin": "(?xi) (?<![\\w-])\n( (?:translate|scale|rotate)(?:[XYZ]|3D)?\n| matrix(?:3D)?\n| skew[XY]?\n| perspective\n)\n(\\()",
          "beginCaptures": {
            "1": {
              "name": "support.function.transform.css"
            },
            "2": {
              "name": "punctuation.section.function.begin.bracket.round.css"
            }
          },
          "end": "\\)",
          "endCaptures": {
            "0": {
              "name": "punctuation.section.function.end.bracket.round.css"
            }
          },
          "patterns": [
            {
              "include": "#css-property-values"
            }
          ]
        }
      ]
    },
    "css-numeric-values": {
      "patterns": [
        {
          "name": "constant.other.color.rgb-value.hex.css",
          "match": "(#)(?:[0-9a-fA-F]{3,4}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})\\b",
          "captures": {
            "1": {
              "name": "punctuation.definition.constant.css"
            }
          }
        },
        {
          "name": "constant.numeric.css",
          "match": "(?xi) (?<![\\w-])\n[-+]?                               # Sign indicator\n\n(?:                                 # Numerals\n    [0-9]+ (?:\\.[0-9]+)?           # Integer/float with leading digits\n  | \\.[0-9]+                       # Float without leading digits\n)\n\n(?:                                 # Scientific notation\n  (?<=[0-9])                        # Exponent must follow a digit\n  E                                 # Exponent indicator\n  [-+]?                             # Possible sign indicator\n  [0-9]+                            # Exponent value\n)?\n\n(?:                                 # Possible unit for data-type:\n  (%)                               # - Percentage\n  | ( deg|grad|rad|turn             # - Angle\n    | Hz|kHz                        # - Frequency\n    | ch|cm|em|ex|fr|in|mm|mozmm|   # - Length\n      pc|pt|px|q|rem|vh|vmax|vmin|\n      vw\n    | dpi|dpcm|dppx                 # - Resolution\n    | s|ms                          # - Time\n    )\n  \\b                               # Boundary checking intentionally lax to\n)?                                  # facilitate embedding in CSS-like grammars",
          "captures": {
            "1": {
              "name": "keyword.other.unit.percentage.css"
            },
            "2": {
              "name": "keyword.other.unit.${2:/downcase}.css"
            }
          }
        }
      ]
    },
    "css-combinators": {
      "patterns": [
        {
          "name": "punctuation.separator.combinator.css",
          "match": ">>>|>>|>|\\+|~"
        },
        {
          "name": "keyword.other.parent-selector.css",
          "match": "&"
        }
      ]
    },
    "css-pseudo-classes": {
      "name": "entity.other.attribute-name.pseudo-class.css",
      "match": "(?xi)\n(:)(:*)\n(?: active|any-link|checked|default|defined|disabled|empty|enabled|first\n  | (?:first|last|only)-(?:child|of-type)|focus|focus-visible|focus-within\n  | fullscreen|host|hover|in-range|indeterminate|invalid|left|link\n  | optional|out-of-range|placeholder-shown|read-only|read-write\n  | required|right|root|scope|target|unresolved\n  | valid|visited\n)(?![\\w-]|\\s*[;}])",
      "captures": {
        "1": {
          "name": "punctuation.definition.entity.css"
        },
        "2": {
          "name": "invalid.illegal.colon.css"
        }
      }
    },
    "css-pseudo-elements": {
      "name": "entity.other.attribute-name.pseudo-element.css",
      "match": "(?xi)\n(?:\n  (::?)                       # Elements using both : and :: notation\n  (?: after\n    | before\n    | first-letter\n    | first-line\n    | (?:-(?:ah|apple|atsc|epub|hp|khtml|moz\n            |ms|o|rim|ro|tc|wap|webkit|xv)\n        | (?:mso|prince))\n      -[a-z-]+\n  )\n  |\n  (::)                        # Double-colon only\n  (?: backdrop\n    | content\n    | grammar-error\n    | marker\n    | placeholder\n    | selection\n    | shadow\n    | spelling-error\n  )\n)\n(?![\\w-]|\\s*[;}])",
      "captures": {
        "1": {
          "name": "punctuation.definition.entity.css"
        },
        "2": {
          "name": "punctuation.definition.entity.css"
        }
      }
    },
    "css-commas": {
      "name": "punctuation.separator.list.comma.css",
      "match": ","
    },
    "css-comment": {
      "patterns": [
        {
          "name": "comment.line.imba",
          "match": "\\#(\\s.+)?(\\n|$)"
        },
        {
          "name": "comment.line.imba",
          "match": "(^\\t+)(\\#(\\s.+)?(\\n|$))"
        }
      ]
    },
    "css-escapes": {
      "patterns": [
        {
          "name": "constant.character.escape.codepoint.css",
          "match": "\\\\[0-9a-fA-F]{1,6}"
        },
        {
          "name": "constant.character.escape.newline.css",
          "begin": "\\\\$\\s*",
          "end": "^(?<!\\G)"
        },
        {
          "name": "constant.character.escape.css",
          "match": "\\\\."
        }
      ]
    },
    "css-selector": {
      "name": "meta.selector.css",
      "begin": "(?<=css\\s)(?!(?:[\\@\\.]+[\\!\\<\\>]?)?[\\w\\-\\$]+(?:[\\@\\.]+[\\!\\<\\>]?[\\w\\-\\$]+)*(?:\\s*\\:))",
      "end": "(\\s*(?=(?:[\\@\\.]+[\\!\\<\\>]?)?[\\w\\-\\$]+(?:[\\@\\.]+[\\!\\<\\>]?[\\w\\-\\$]+)*(?:\\s*\\:))|\\s*$|(?=\\s+\\#\\s))",
      "endCaptures": {
        "0": {
          "name": "punctuation.separator.sel-properties.css"
        }
      },
      "patterns": [
        {
          "include": "#css-selector-innards"
        }
      ]
    },
    "nested-css-selector": {
      "name": "meta.selector.css",
      "begin": "(^\\t+)(?!(?:[\\@\\.]+[\\!\\<\\>]?)?[\\w\\-\\$]+(?:[\\@\\.]+[\\!\\<\\>]?[\\w\\-\\$]+)*(?:\\s*\\:))",
      "end": "(\\s*(?=(?:[\\@\\.]+[\\!\\<\\>]?)?[\\w\\-\\$]+(?:[\\@\\.]+[\\!\\<\\>]?[\\w\\-\\$]+)*(?:\\s*\\:))|\\s*$|(?=\\s+\\#\\s))",
      "endCaptures": {
        "0": {
          "name": "punctuation.separator.sel-properties.css"
        }
      },
      "patterns": [
        {
          "include": "#css-selector-innards"
        }
      ]
    },
    "inline-css-selector": {
      "name": "meta.selector.css",
      "begin": "(^\\t+)(?!(?:[\\@\\.]+[\\!\\<\\>]?)?[\\w\\-\\$]+(?:[\\@\\.]+[\\!\\<\\>]?[\\w\\-\\$]+)*(?:\\s*\\:))",
      "end": "(\\s*(?=(?:[\\@\\.]+[\\!\\<\\>]?)?[\\w\\-\\$]+(?:[\\@\\.]+[\\!\\<\\>]?[\\w\\-\\$]+)*(?:\\s*\\:)|\\)|\\])|\\s*$)",
      "endCaptures": {
        "0": {
          "name": "punctuation.separator.sel-properties.css"
        }
      },
      "patterns": [
        {
          "include": "#css-selector-innards"
        }
      ]
    },
    "css-selector-innards": {
      "patterns": [
        {
          "include": "#css-commas"
        },
        {
          "include": "#css-escapes"
        },
        {
          "include": "#css-combinators"
        },
        {
          "name": "entity.name.tag.wildcard.css",
          "match": "\\*"
        },
        {
          "name": "meta.attribute-selector.css",
          "begin": "\\[",
          "beginCaptures": {
            "0": {
              "name": "punctuation.definition.entity.begin.bracket.square.css"
            }
          },
          "end": "\\]",
          "endCaptures": {
            "0": {
              "name": "punctuation.definition.entity.end.bracket.square.css"
            }
          },
          "patterns": [
            {
              "include": "#string"
            },
            {
              "match": "(?<=[\"'\\s]|^|\\*/)\\s*([iI])\\s*(?=[\\s\\]]|/\\*|$)",
              "captures": {
                "1": {
                  "name": "storage.modifier.ignore-case.css"
                }
              }
            },
            {
              "match": "(?x)(?<==)\\s*((?!/\\*)(?:[^\\\\\"'\\s\\]]|\\\\.)+)",
              "captures": {
                "1": {
                  "name": "string.unquoted.attribute-value.css"
                }
              }
            },
            {
              "include": "#css-escapes"
            },
            {
              "name": "keyword.operator.pattern.css",
              "match": "[~|^$*]?="
            },
            {
              "name": "punctuation.separator.css",
              "match": "\\|"
            },
            {
              "match": "(?x)\n# Qualified namespace prefix\n( -?(?!\\d)(?:[\\w-]|[^\\\\x00-\\\\x7F]|\\\\(?:[0-9a-fA-F]{1,6}|.))+\n| \\*\n)\n# Lookahead to ensure there's a valid identifier ahead\n(?=\n  \\| (?!\\s|=|$|\\])\n  (?: -?(?!\\d)\n   |   [\\\\\\w-]\n   |   [^\\\\x00-\\\\x7F]\n   )\n)",
              "captures": {
                "1": {
                  "name": "entity.other.namespace-prefix.css"
                }
              }
            },
            {
              "match": "(?x)\n(-?(?!\\d)(?>[\\w-]|[^\\\\x00-\\\\x7F]|\\\\(?:[0-9a-fA-F]{1,6}|.))+)\n\\s*\n(?=[~|^\\]$*=]|/\\*)",
              "captures": {
                "1": {
                  "name": "entity.other.attribute-name.css"
                }
              }
            }
          ]
        },
        {
          "include": "#css-pseudo-classes"
        },
        {
          "include": "#css-pseudo-elements"
        }
      ]
    },
    "css-property-values": {
      "patterns": [
        {
          "include": "#css-commas"
        },
        {
          "include": "#css-escapes"
        },
        {
          "include": "#css-functions"
        },
        {
          "include": "#css-numeric-values"
        },
        {
          "include": "#css-size-keywords"
        },
        {
          "include": "#css-color-keywords"
        },
        {
          "include": "#string"
        },
        {
          "name": "keyword.other.important.css",
          "match": "!\\s*important(?![\\w-])"
        }
      ]
    },
    "tag-literal": {
      "patterns": [
        {
          "name": "meta.tag.imba",
          "begin": "(<)(?=[\\w\\{\\[\\.\\#\\$\\@])",
          "beginCaptures": {
            "1": {
              "name": "punctuation.section.tag.open.imba"
            }
          },
          "end": "(>)",
          "endCaptures": {
            "1": {
              "name": "punctuation.section.tag.close.imba"
            }
          },
          "patterns": [
            {
              "include": "#tag-content"
            }
          ],
          "contentName": "meta.tag.attributes.imba"
        }
      ]
    },
    "tag-content": {
      "patterns": [
        {
          "include": "#tag-name"
        },
        {
          "include": "#tag-expr-name"
        },
        {
          "include": "#tag-interpolated-content"
        },
        {
          "include": "#tag-interpolated-parens"
        },
        {
          "include": "#tag-interpolated-brackets"
        },
        {
          "include": "#tag-event-handler"
        },
        {
          "include": "#tag-classname"
        },
        {
          "include": "#tag-ref"
        },
        {
          "include": "#tag-attr-value"
        },
        {
          "include": "#tag-attr-name"
        },
        {
          "include": "#comment"
        }
      ]
    },
    "tag-name": {
      "patterns": [
        {
          "name": "entity.name.tag.special.imba",
          "match": "(?<=<)(self|global|slot)(?=[\\.\\[\\>\\s\\(])"
        }
      ]
    },
    "tag-expr-name": {
      "begin": "(?<=<)(?=[\\w\\{])",
      "contentName": "entity.name.tag.imba",
      "end": "(?=[\\.\\[\\>\\s\\(])",
      "patterns": [
        {
          "include": "#tag-interpolated-content"
        }
      ]
    },
    "tag-interpolated-content": {
      "name": "meta.tag.expression.imba",
      "begin": "\\{",
      "beginCaptures": {
        "0": {
          "name": "punctuation.section.tag.imba"
        }
      },
      "end": "\\}",
      "endCaptures": {
        "0": {
          "name": "punctuation.section.tag.imba"
        }
      },
      "patterns": [
        {
          "include": "#expression"
        }
      ],
      "contentName": "meta.embedded.line.imba"
    },
    "tag-interpolated-parens": {
      "name": "meta.tag.expression.imba",
      "begin": "\\(",
      "beginCaptures": {
        "0": {
          "name": "punctuation.section.tag.imba"
        }
      },
      "end": "\\)",
      "endCaptures": {
        "0": {
          "name": "punctuation.section.tag.imba"
        }
      },
      "patterns": [
        {
          "include": "#expression"
        }
      ],
      "contentName": "meta.embedded.line.imba"
    },
    "tag-interpolated-brackets": {
      "name": "meta.tag.expression.imba",
      "begin": "\\[",
      "beginCaptures": {
        "0": {
          "name": "punctuation.section.tag.imba"
        }
      },
      "end": "\\]",
      "endCaptures": {
        "0": {
          "name": "punctuation.section.tag.imba"
        }
      },
      "patterns": [
        {
          "include": "#inline-css-selector"
        },
        {
          "include": "#inline-styles"
        }
      ],
      "contentName": "meta.embedded.line.imba"
    },
    "tag-classname": {
      "begin": "\\.",
      "patterns": [
        {
          "include": "#tag-interpolated-content"
        }
      ],
      "end": "(?=[\\.\\[\\>\\s\\(\\=])",
      "contentName": "entity.other.attribute-name.class.css"
    },
    "tag-ref": {
      "match": "(\\$[_$[:alpha:]][_$[:alnum:]]*(?:\\-[_$[:alnum:]]+)*[\\?\\!]?)",
      "name": "entity.other.attribute-name.reference.css"
    },
    "tag-event-handler": {
      "begin": "(\\@[\\w$_]+(?:\\-[\\w$_]+)*)",
      "beginCaptures": {
        "0": {
          "name": "entity.other.event-name.imba"
        }
      },
      "patterns": [
        {
          "include": "#tag-interpolated-content"
        },
        {
          "include": "#tag-interpolated-parens"
        },
        {
          "name": "entity.other.event-modifier.imba",
          "begin": "\\.",
          "beginCaptures": {
            "0": {
              "name": "punctuation.section.tag"
            }
          },
          "patterns": [
            {
              "include": "#tag-interpolated-parens"
            },
            {
              "include": "#tag-interpolated-content"
            }
          ],
          "end": "(?=[\\.\\[\\>\\s\\=]|$)"
        }
      ],
      "end": "(?=[\\[\\>\\s\\=])",
      "contentName": "entity.other.tag.event"
    },
    "tag-attr-name": {
      "begin": "([\\w$_]+(?:\\-[\\w$_]+)*)",
      "beginCaptures": {
        "0": {
          "name": "entity.other.attribute-name.imba"
        }
      },
      "end": "(?=[\\s\\.\\[\\>\\=])",
      "contentName": "entity.other.attribute-name.imba"
    },
    "tag-attr-value": {
      "begin": "(\\=)",
      "beginCaptures": {
        "0": {
          "name": "keyword.operator.tag.assignment"
        }
      },
      "end": "(?=>|\\s)",
      "contentName": "meta.tag.attribute-value.imba",
      "patterns": [
        {
          "include": "#expr"
        }
      ]
    },
    "expression": {
      "patterns": [
        {
          "begin": "\\(",
          "beginCaptures": {
            "0": {
              "name": "meta.brace.round.imba"
            }
          },
          "end": "\\)",
          "endCaptures": {
            "0": {
              "name": "meta.brace.round.imba"
            }
          },
          "patterns": [
            {
              "include": "#expr"
            }
          ]
        },
        {
          "include": "#tag-literal"
        },
        {
          "include": "#expressionWithoutIdentifiers"
        },
        {
          "include": "#identifiers"
        },
        {
          "include": "#expressionPunctuations"
        }
      ]
    },
    "expressionWithoutIdentifiers": {
      "patterns": [
        {
          "include": "#string"
        },
        {
          "include": "#regex"
        },
        {
          "include": "#comment"
        },
        {
          "include": "#function-expression"
        },
        {
          "include": "#class-expression"
        },
        {
          "include": "#ternary-expression"
        },
        {
          "include": "#new-expr"
        },
        {
          "include": "#instanceof-expr"
        },
        {
          "include": "#object-literal"
        },
        {
          "include": "#expression-operators"
        },
        {
          "include": "#literal"
        },
        {
          "include": "#support-objects"
        }
      ]
    },
    "expressionPunctuations": {
      "patterns": [
        {
          "include": "#punctuation-comma"
        },
        {
          "include": "#punctuation-accessor"
        }
      ]
    },
    "decorator": {
      "name": "meta.decorator.imba",
      "begin": "(?<![_$[:alnum:]])(?:(?<=\\.\\.\\.)|(?<!\\.))\\@(?!\\@)",
      "beginCaptures": {
        "0": {
          "name": "punctuation.decorator.imba"
        }
      },
      "end": "(?=\\s)",
      "patterns": [
        {
          "include": "#expr"
        }
      ]
    },
    "array-literal": {
      "name": "meta.array.literal.imba",
      "begin": "\\s*(\\[)",
      "beginCaptures": {
        "1": {
          "name": "meta.brace.square.imba"
        }
      },
      "end": "\\]",
      "endCaptures": {
        "0": {
          "name": "meta.brace.square.imba"
        }
      },
      "patterns": [
        {
          "include": "#expr"
        },
        {
          "include": "#punctuation-comma"
        }
      ]
    },
    "type-literal": {
      "name": "meta.type.annotation.imba",
      "begin": "(\\\\)",
      "beginCaptures": {
        "1": {
          "name": "meta.type.annotation.open.imba"
        }
      },
      "end": "(?=[\\s\\]\\)\\,\\.\\=\\}]|$)",
      "patterns": [
        {
          "include": "#type-brackets"
        }
      ]
    },
    "type-brackets": {
      "patterns": [
        {
          "begin": "{",
          "end": "}",
          "patterns": [
            {
              "include": "#type-brackets"
            }
          ]
        },
        {
          "begin": "\\[",
          "end": "\\]",
          "patterns": [
            {
              "include": "#type-brackets"
            }
          ]
        },
        {
          "begin": "\\<",
          "end": "\\>",
          "patterns": [
            {
              "include": "#type-brackets"
            }
          ]
        },
        {
          "begin": "\\(",
          "end": "\\)",
          "patterns": [
            {
              "include": "#type-brackets"
            }
          ]
        }
      ]
    },
    "numeric-literal": {
      "patterns": [
        {
          "name": "constant.numeric.hex.imba",
          "match": "\\b(?<!\\$)0(?:x|X)[0-9a-fA-F][0-9a-fA-F_]*(n)?\\b(?!\\$)",
          "captures": {
            "1": {
              "name": "storage.type.numeric.bigint.imba"
            }
          }
        },
        {
          "name": "constant.numeric.binary.imba",
          "match": "\\b(?<!\\$)0(?:b|B)[01][01_]*(n)?\\b(?!\\$)",
          "captures": {
            "1": {
              "name": "storage.type.numeric.bigint.imba"
            }
          }
        },
        {
          "name": "constant.numeric.octal.imba",
          "match": "\\b(?<!\\$)0(?:o|O)?[0-7][0-7_]*(n)?\\b(?!\\$)",
          "captures": {
            "1": {
              "name": "storage.type.numeric.bigint.imba"
            }
          }
        },
        {
          "match": "(?x)\n(?<!\\$)(?:\n  (?:\\b[0-9][0-9_]*(\\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\\b)| # 1.1E+3\n  (?:\\b[0-9][0-9_]*(\\.)[eE][+-]?[0-9][0-9_]*(n)?\\b)|             # 1.E+3\n  (?:\\B(\\.)[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\\b)|             # .1E+3\n  (?:\\b[0-9][0-9_]*[eE][+-]?[0-9][0-9_]*(n)?\\b)|                 # 1E+3\n  (?:\\b[0-9][0-9_]*(\\.)[0-9][0-9_]*(n)?\\b)|                      # 1.1\n  (?:\\b[0-9][0-9_]*(\\.)(n)?\\B)|                                  # 1.\n  (?:\\B(\\.)[0-9][0-9_]*(n)?\\b)|                                  # .1\n  (?:\\b[0-9][0-9_]*(n)?\\b)                                 # 1\n)(?!\\$)",
          "captures": {
            "0": {
              "name": "constant.numeric.decimal.imba"
            },
            "1": {
              "name": "meta.delimiter.decimal.period.imba"
            },
            "2": {
              "name": "storage.type.numeric.bigint.imba"
            },
            "3": {
              "name": "meta.delimiter.decimal.period.imba"
            },
            "4": {
              "name": "storage.type.numeric.bigint.imba"
            },
            "5": {
              "name": "meta.delimiter.decimal.period.imba"
            },
            "6": {
              "name": "storage.type.numeric.bigint.imba"
            },
            "7": {
              "name": "storage.type.numeric.bigint.imba"
            },
            "8": {
              "name": "meta.delimiter.decimal.period.imba"
            },
            "9": {
              "name": "storage.type.numeric.bigint.imba"
            },
            "10": {
              "name": "meta.delimiter.decimal.period.imba"
            },
            "11": {
              "name": "storage.type.numeric.bigint.imba"
            },
            "12": {
              "name": "meta.delimiter.decimal.period.imba"
            },
            "13": {
              "name": "storage.type.numeric.bigint.imba"
            },
            "14": {
              "name": "storage.type.numeric.bigint.imba"
            }
          }
        }
      ]
    },
    "number-with-unit-literal": {
      "patterns": [
        {
          "match": "([0-9]+)([a-z]+|\\%)",
          "captures": {
            "1": {
              "name": "constant.numeric.imba"
            },
            "2": {
              "name": "keyword.other.unit.imba"
            }
          }
        },
        {
          "match": "([0-9]*\\.[0-9]+(?:[eE][\\-+]?[0-9]+)?)([a-z]+|\\%)",
          "captures": {
            "1": {
              "name": "constant.numeric.decimal.imba"
            },
            "2": {
              "name": "keyword.other.unit.imba"
            }
          }
        }
      ]
    },
    "boolean-literal": {
      "patterns": [
        {
          "name": "constant.language.boolean.true.imba",
          "match": "(?<![_$[:alnum:]])(?:(?<=\\.\\.\\.)|(?<!\\.))(true|yes)(?![_\\-$[:alnum:]])(?:(?=\\.\\.\\.)|(?!\\.))"
        },
        {
          "name": "constant.language.boolean.false.imba",
          "match": "(?<![_$[:alnum:]])(?:(?<=\\.\\.\\.)|(?<!\\.))(false|no)(?![_\\-$[:alnum:]])(?:(?=\\.\\.\\.)|(?!\\.))"
        }
      ]
    },
    "null-literal": {
      "name": "constant.language.null.imba",
      "match": "(?<![_$[:alnum:]])(?:(?<=\\.\\.\\.)|(?<!\\.))null(?![_\\-$[:alnum:]])(?:(?=\\.\\.\\.)|(?!\\.))"
    },
    "this-literal": {
      "name": "variable.language.this.imba",
      "match": "(?<![_$[:alnum:]])(?:(?<=\\.\\.\\.)|(?<!\\.))(this|self)\\b(?!\\$)"
    },
    "global-literal": {
      "name": "variable.language.global.imba",
      "match": "(?<![_$[:alnum:]])(?:(?<=\\.\\.\\.)|(?<!\\.))(global)\\b(?!\\$)"
    },
    "super-literal": {
      "name": "variable.language.super.imba",
      "match": "(?<![_$[:alnum:]])(?:(?<=\\.\\.\\.)|(?<!\\.))super\\b(?!\\$)"
    },
    "undefined-literal": {
      "name": "constant.language.undefined.imba",
      "match": "(?<![_$[:alnum:]])(?:(?<=\\.\\.\\.)|(?<!\\.))undefined(?![_\\-$[:alnum:]])(?:(?=\\.\\.\\.)|(?!\\.))"
    },
    "numericConstant-literal": {
      "patterns": [
        {
          "name": "constant.language.nan.imba",
          "match": "(?<![_$[:alnum:]])(?:(?<=\\.\\.\\.)|(?<!\\.))NaN(?![_\\-$[:alnum:]])(?:(?=\\.\\.\\.)|(?!\\.))"
        },
        {
          "name": "constant.language.infinity.imba",
          "match": "(?<![_$[:alnum:]])(?:(?<=\\.\\.\\.)|(?<!\\.))Infinity(?![_\\-$[:alnum:]])(?:(?=\\.\\.\\.)|(?!\\.))"
        }
      ]
    },
    "plain-identifiers": {
      "patterns": [
        {
          "name": "variable.other.constant.imba",
          "match": "([[:upper:]][_$[:digit:][:upper:]]*)(?![_$[:alnum:]])"
        },
        {
          "name": "variable.other.class.imba",
          "match": "[[:upper:]][_$[:alnum:]]*(?:\\-[_$[:alnum:]]+)*[\\!]?"
        },
        {
          "name": "variable.special.imba",
          "match": "\\$\\d+"
        },
        {
          "name": "variable.other.internal.imba",
          "match": "\\$[_$[:alpha:]][_$[:alnum:]]*(?:\\-[_$[:alnum:]]+)*[\\?\\!]?"
        },
        {
          "name": "variable.other.symbol.imba",
          "match": "\\@\\@+[_$[:alpha:]][_$[:alnum:]]*(?:\\-[_$[:alnum:]]+)*[\\?\\!]?"
        },
        {
          "name": "variable.other.readwrite.imba",
          "match": "[_$[:alpha:]][_$[:alnum:]]*(?:\\-[_$[:alnum:]]+)*[\\?\\!]?"
        },
        {
          "name": "variable.other.instance.imba",
          "match": "\\@[_$[:alpha:]][_$[:alnum:]]*(?:\\-[_$[:alnum:]]+)*[\\?\\!]?"
        },
        {
          "name": "variable.other.private.imba",
          "match": "\\#+[_$[:alpha:]][_$[:alnum:]]*(?:\\-[_$[:alnum:]]+)*[\\?\\!]?"
        },
        {
          "name": "string.symbol.imba",
          "match": "\\:[_$[:alpha:]][_$[:alnum:]]*(?:\\-[_$[:alnum:]]+)*[\\?\\!]?"
        }
      ]
    },
    "plain-accessors": {
      "patterns": [
        {
          "match": "(\\.\\.?)([_$[:alpha:]][_$[:alnum:]]*(?:\\-[_$[:alnum:]]+)*[\\?\\!]?)",
          "captures": {
            "1": {
              "name": "punctuation.accessor.imba"
            },
            "2": {
              "name": "variable.other.property.imba"
            }
          }
        }
      ]
    },
    "identifiers": {
      "patterns": [
        {
          "match": "(?x)(?:(?:(\\.)|(\\.\\.(?!\\s*[[:digit:]]|\\s+)))\\s*)?([_$[:alpha:]][_$[:alnum:]]*(?:\\-[_$[:alnum:]]+)*[\\?\\!]?)(?=\\s*={{functionOrArrowLookup}})",
          "captures": {
            "1": {
              "name": "punctuation.accessor.imba"
            },
            "2": {
              "name": "punctuation.accessor.optional.imba"
            },
            "3": {
              "name": "entity.name.function.property.imba"
            }
          }
        },
        {
          "match": "(?:(\\.)|(\\.\\.(?!\\s*[[:digit:]]|\\s+)))\\s*(\\#?[[:upper:]][_$[:digit:][:upper:]]*)(?![_$[:alnum:]])",
          "captures": {
            "1": {
              "name": "punctuation.accessor.imba"
            },
            "2": {
              "name": "punctuation.accessor.optional.imba"
            },
            "3": {
              "name": "variable.other.constant.property.imba"
            }
          }
        },
        {
          "match": "(?:(\\.)|(\\.\\.(?!\\s*[[:digit:]]|\\s+)))([[:upper:]][_$[:alnum:]]*(?:\\-[_$[:alnum:]]+)*[\\!]?)",
          "captures": {
            "1": {
              "name": "punctuation.accessor.imba"
            },
            "2": {
              "name": "punctuation.accessor.optional.imba"
            },
            "3": {
              "name": "variable.other.class.property.imba"
            }
          }
        },
        {
          "match": "(?:(\\.)|(\\.\\.(?!\\s*[[:digit:]]|\\s+)))(\\#?[_$[:alpha:]][_$[:alnum:]]*(?:\\-[_$[:alnum:]]+)*[\\?\\!]?)",
          "captures": {
            "1": {
              "name": "punctuation.accessor.imba"
            },
            "2": {
              "name": "punctuation.accessor.optional.imba"
            },
            "3": {
              "name": "variable.other.property.imba"
            }
          }
        },
        {
          "name": "keyword.other",
          "match": "(for own|for|if|unless|when)\\b"
        },
        {
          "name": "support.function.require",
          "match": "require"
        },
        {
          "include": "#plain-identifiers"
        },
        {
          "include": "#type-literal"
        }
      ]
    },
    "type-annotation": {
      "patterns": [
        {
          "include": "#type-literal"
        }
      ]
    },
    "punctuation-comma": {
      "name": "punctuation.separator.comma.imba",
      "match": ","
    },
    "punctuation-semicolon": {
      "name": "punctuation.terminator.statement.imba",
      "match": ";"
    },
    "punctuation-accessor": {
      "match": "(?:(\\.)|(\\.\\.(?!\\s*[[:digit:]]|\\s+)))",
      "captures": {
        "1": {
          "name": "punctuation.accessor.imba"
        },
        "2": {
          "name": "punctuation.accessor.optional.imba"
        }
      }
    },
    "string": {
      "patterns": [
        {
          "include": "#qstring-single-multi"
        },
        {
          "include": "#qstring-double-multi"
        },
        {
          "include": "#qstring-single"
        },
        {
          "include": "#qstring-double"
        },
        {
          "include": "#template"
        }
      ]
    },
    "qstring-double": {
      "name": "string.quoted.double.imba",
      "begin": "\"",
      "beginCaptures": {
        "0": {
          "name": "punctuation.definition.string.begin.imba"
        }
      },
      "end": "\"",
      "endCaptures": {
        "0": {
          "name": "punctuation.definition.string.end.imba"
        }
      },
      "patterns": [
        {
          "include": "#template-substitution-element"
        },
        {
          "include": "#string-character-escape"
        }
      ]
    },
    "qstring-single": {
      "name": "string.quoted.single.imba",
      "begin": "'",
      "beginCaptures": {
        "0": {
          "name": "punctuation.definition.string.begin.imba"
        }
      },
      "end": "(\\')|((?:[^\\\\\\n])$)",
      "endCaptures": {
        "1": {
          "name": "punctuation.definition.string.end.imba"
        },
        "2": {
          "name": "invalid.illegal.newline.imba"
        }
      },
      "patterns": [
        {
          "include": "#string-character-escape"
        }
      ]
    },
    "qstring-single-multi": {
      "name": "string.quoted.single.imba",
      "begin": "'''",
      "beginCaptures": {
        "0": {
          "name": "punctuation.definition.string.begin.imba"
        }
      },
      "end": "'''",
      "endCaptures": {
        "0": {
          "name": "punctuation.definition.string.end.imba"
        }
      },
      "patterns": [
        {
          "include": "#string-character-escape"
        }
      ]
    },
    "string-character-escape": {
      "name": "constant.character.escape.imba",
      "match": "\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4}|u\\{[0-9A-Fa-f]+\\}|[0-2][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.|$)"
    },
    "template": {
      "patterns": [
        {
          "name": "string.template.imba",
          "begin": "(?=(([_$[:alpha:]][_$[:alnum:]]*(?:\\-[_$[:alnum:]]+)*[\\?\\!]?\\s*\\??\\.\\s*)*|(\\??\\.\\s*)?)([_$[:alpha:]][_$[:alnum:]]*(?:\\-[_$[:alnum:]]+)*[\\?\\!]?)({{typeArguments}}\\s*)?`)",
          "end": "(?=`)",
          "patterns": [
            {
              "begin": "(?=(([_$[:alpha:]][_$[:alnum:]]*(?:\\-[_$[:alnum:]]+)*[\\?\\!]?\\s*\\??\\.\\s*)*|(\\??\\.\\s*)?)([_$[:alpha:]][_$[:alnum:]]*(?:\\-[_$[:alnum:]]+)*[\\?\\!]?))",
              "end": "(?=({{typeArguments}}\\s*)?`)",
              "patterns": [
                {
                  "name": "entity.name.function.tagged-template.imba",
                  "match": "([_$[:alpha:]][_$[:alnum:]]*(?:\\-[_$[:alnum:]]+)*[\\?\\!]?)"
                }
              ]
            }
          ]
        },
        {
          "name": "string.template.imba",
          "begin": "([_$[:alpha:]][_$[:alnum:]]*(?:\\-[_$[:alnum:]]+)*[\\?\\!]?)\\s*(?=({{typeArguments}}\\s*)`)",
          "beginCaptures": {
            "1": {
              "name": "entity.name.function.tagged-template.imba"
            }
          },
          "end": "(?=`)",
          "patterns": [
            {
              "include": "#type-arguments"
            }
          ]
        },
        {
          "name": "string.template.imba",
          "begin": "([_$[:alpha:]][_$[:alnum:]]*(?:\\-[_$[:alnum:]]+)*[\\?\\!]?)?(`)",
          "beginCaptures": {
            "1": {
              "name": "entity.name.function.tagged-template.imba"
            },
            "2": {
              "name": "punctuation.definition.string.template.begin.imba"
            }
          },
          "end": "`",
          "endCaptures": {
            "0": {
              "name": "punctuation.definition.string.template.end.imba"
            }
          },
          "patterns": [
            {
              "include": "#template-substitution-element"
            },
            {
              "include": "#string-character-escape"
            }
          ]
        }
      ]
    },
    "template-substitution-element": {
      "name": "meta.template.expression.imba",
      "begin": "(?<!\\\\)\\{",
      "beginCaptures": {
        "0": {
          "name": "punctuation.definition.template-expression.begin.imba"
        }
      },
      "end": "\\}",
      "endCaptures": {
        "0": {
          "name": "punctuation.definition.template-expression.end.imba"
        }
      },
      "patterns": [
        {
          "include": "#expr"
        }
      ],
      "contentName": "meta.embedded.line.imba"
    },
    "regex": {
      "patterns": [
        {
          "name": "string.regexp.imba",
          "begin": "(?<!\\+\\+|--|})(?<=[=(:,\\[?+!]|^return|[^\\._$[:alnum:]]return|^case|[^\\._$[:alnum:]]case|=>|&&|\\|\\||\\*\\/)\\s*(\\/)(?![\\/*])(?=(?:[^\\/\\\\\\[\\()]|\\\\.|\\[([^\\]\\\\]|\\\\.)+\\]|\\(([^\\)\\\\]|\\\\.)+\\))+\\/([gimsuy]+|(?![\\/\\*])|(?=\\/\\*))(?!\\s*[a-zA-Z0-9_$]))",
          "beginCaptures": {
            "1": {
              "name": "punctuation.definition.string.begin.imba"
            }
          },
          "end": "(/)([gimsuy]*)",
          "endCaptures": {
            "1": {
              "name": "punctuation.definition.string.end.imba"
            },
            "2": {
              "name": "keyword.other.imba"
            }
          },
          "patterns": [
            {
              "include": "#regexp"
            }
          ]
        },
        {
          "name": "string.regexp.imba",
          "begin": "((?<![_$[:alnum:])\\]]|\\+\\+|--|}|\\*\\/)|((?<=^return|[^\\._$[:alnum:]]return|^case|[^\\._$[:alnum:]]case))\\s*)\\/(?![\\/*])(?=(?:[^\\/\\\\\\[]|\\\\.|\\[([^\\]\\\\]|\\\\.)+\\])+\\/([gimsuy]+|(?![\\/\\*])|(?=\\/\\*))(?!\\s*[a-zA-Z0-9_$]))",
          "beginCaptures": {
            "0": {
              "name": "punctuation.definition.string.begin.imba"
            }
          },
          "end": "(/)([gimsuy]*)",
          "endCaptures": {
            "1": {
              "name": "punctuation.definition.string.end.imba"
            },
            "2": {
              "name": "keyword.other.imba"
            }
          },
          "patterns": [
            {
              "include": "#regexp"
            }
          ]
        }
      ]
    },
    "regexp": {
      "patterns": [
        {
          "name": "keyword.control.anchor.regexp",
          "match": "\\\\[bB]|\\^|\\$"
        },
        {
          "match": "\\\\[1-9]\\d*|\\\\k<([a-zA-Z_$][\\w$]*)>",
          "captures": {
            "0": {
              "name": "keyword.other.back-reference.regexp"
            },
            "1": {
              "name": "variable.other.regexp"
            }
          }
        },
        {
          "name": "keyword.operator.quantifier.regexp",
          "match": "[?+*]|\\{(\\d+,\\d+|\\d+,|,\\d+|\\d+)\\}\\??"
        },
        {
          "name": "keyword.operator.or.regexp",
          "match": "\\|"
        },
        {
          "name": "meta.group.assertion.regexp",
          "begin": "(\\()((\\?=)|(\\?!)|(\\?<=)|(\\?<!))",
          "beginCaptures": {
            "1": {
              "name": "punctuation.definition.group.regexp"
            },
            "2": {
              "name": "punctuation.definition.group.assertion.regexp"
            },
            "3": {
              "name": "meta.assertion.look-ahead.regexp"
            },
            "4": {
              "name": "meta.assertion.negative-look-ahead.regexp"
            },
            "5": {
              "name": "meta.assertion.look-behind.regexp"
            },
            "6": {
              "name": "meta.assertion.negative-look-behind.regexp"
            }
          },
          "end": "(\\))",
          "endCaptures": {
            "1": {
              "name": "punctuation.definition.group.regexp"
            }
          },
          "patterns": [
            {
              "include": "#regexp"
            }
          ]
        },
        {
          "name": "meta.group.regexp",
          "begin": "\\((?:(\\?:)|(?:\\?<([a-zA-Z_$][\\w$]*)>))?",
          "beginCaptures": {
            "0": {
              "name": "punctuation.definition.group.regexp"
            },
            "1": {
              "name": "punctuation.definition.group.no-capture.regexp"
            },
            "2": {
              "name": "variable.other.regexp"
            }
          },
          "end": "\\)",
          "endCaptures": {
            "0": {
              "name": "punctuation.definition.group.regexp"
            }
          },
          "patterns": [
            {
              "include": "#regexp"
            }
          ]
        },
        {
          "name": "constant.other.character-class.set.regexp",
          "begin": "(\\[)(\\^)?",
          "beginCaptures": {
            "1": {
              "name": "punctuation.definition.character-class.regexp"
            },
            "2": {
              "name": "keyword.operator.negation.regexp"
            }
          },
          "end": "(\\])",
          "endCaptures": {
            "1": {
              "name": "punctuation.definition.character-class.regexp"
            }
          },
          "patterns": [
            {
              "name": "constant.other.character-class.range.regexp",
              "match": "(?:.|(\\\\(?:[0-7]{3}|x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4}))|(\\\\c[A-Z])|(\\\\.))\\-(?:[^\\]\\\\]|(\\\\(?:[0-7]{3}|x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4}))|(\\\\c[A-Z])|(\\\\.))",
              "captures": {
                "1": {
                  "name": "constant.character.numeric.regexp"
                },
                "2": {
                  "name": "constant.character.control.regexp"
                },
                "3": {
                  "name": "constant.character.escape.backslash.regexp"
                },
                "4": {
                  "name": "constant.character.numeric.regexp"
                },
                "5": {
                  "name": "constant.character.control.regexp"
                },
                "6": {
                  "name": "constant.character.escape.backslash.regexp"
                }
              }
            },
            {
              "include": "#regex-character-class"
            }
          ]
        },
        {
          "include": "#regex-character-class"
        }
      ]
    },
    "regex-character-class": {
      "patterns": [
        {
          "name": "constant.other.character-class.regexp",
          "match": "\\\\[wWsSdDtrnvf]|\\."
        },
        {
          "name": "constant.character.numeric.regexp",
          "match": "\\\\([0-7]{3}|x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4})"
        },
        {
          "name": "constant.character.control.regexp",
          "match": "\\\\c[A-Z]"
        },
        {
          "name": "constant.character.escape.backslash.regexp",
          "match": "\\\\."
        }
      ]
    },
    "comment": {
      "patterns": [
        {
          "name": "comment.block.documentation.imba",
          "begin": "/\\*\\*(?!/)",
          "beginCaptures": {
            "0": {
              "name": "punctuation.definition.comment.imba"
            }
          },
          "end": "\\*/",
          "endCaptures": {
            "0": {
              "name": "punctuation.definition.comment.imba"
            }
          },
          "patterns": [
            {
              "include": "#docblock"
            }
          ]
        },
        {
          "name": "comment.block.imba",
          "begin": "(/\\*)(?:\\s*((@)internal)(?=\\s|(\\*/)))?",
          "beginCaptures": {
            "1": {
              "name": "punctuation.definition.comment.imba"
            },
            "2": {
              "name": "storage.type.internaldeclaration.imba"
            },
            "3": {
              "name": "punctuation.decorator.internaldeclaration.imba"
            }
          },
          "end": "\\*/",
          "endCaptures": {
            "0": {
              "name": "punctuation.definition.comment.imba"
            }
          }
        },
        {
          "name": "comment.block.imba",
          "begin": "(###)",
          "beginCaptures": {
            "1": {
              "name": "punctuation.definition.comment.imba"
            }
          },
          "end": "###(?:[ \\t]*\\n)",
          "endCaptures": {
            "0": {
              "name": "punctuation.definition.comment.imba"
            }
          }
        },
        {
          "begin": "(^[ \\t]+)?((//|\\#\\s)(?:\\s*((@)internal)(?=\\s|$))?)",
          "beginCaptures": {
            "1": {
              "name": "punctuation.whitespace.comment.leading.imba"
            },
            "2": {
              "name": "comment.line.double-slash.imba"
            },
            "3": {
              "name": "punctuation.definition.comment.imba"
            },
            "4": {
              "name": "storage.type.internaldeclaration.imba"
            },
            "5": {
              "name": "punctuation.decorator.internaldeclaration.imba"
            }
          },
          "end": "(?=$)",
          "contentName": "comment.line.double-slash.imba"
        }
      ]
    },
    "single-line-comment-consuming-line-ending": {
      "begin": "(^[ \\t]+)?((//|\\#\\s)(?:\\s*((@)internal)(?=\\s|$))?)",
      "beginCaptures": {
        "1": {
          "name": "punctuation.whitespace.comment.leading.imba"
        },
        "2": {
          "name": "comment.line.double-slash.imba"
        },
        "3": {
          "name": "punctuation.definition.comment.imba"
        },
        "4": {
          "name": "storage.type.internaldeclaration.imba"
        },
        "5": {
          "name": "punctuation.decorator.internaldeclaration.imba"
        }
      },
      "end": "(?=^)",
      "contentName": "comment.line.double-slash.imba"
    },
    "directives": {
      "name": "comment.line.triple-slash.directive.imba",
      "begin": "^(///)\\s*(?=<(reference|amd-dependency|amd-module)(\\s+(path|types|no-default-lib|lib|name)\\s*=\\s*((\\'([^\\'\\\\]|\\\\.)*\\')|(\\\"([^\\\"\\\\]|\\\\.)*\\\")|(\\`([^\\`\\\\]|\\\\.)*\\`)))+\\s*/>\\s*$)",
      "beginCaptures": {
        "1": {
          "name": "punctuation.definition.comment.imba"
        }
      },
      "end": "(?=$)",
      "patterns": [
        {
          "name": "meta.tag.imba",
          "begin": "(<)(reference|amd-dependency|amd-module)",
          "beginCaptures": {
            "1": {
              "name": "punctuation.definition.tag.directive.imba"
            },
            "2": {
              "name": "entity.name.tag.directive.imba"
            }
          },
          "end": "/>",
          "endCaptures": {
            "0": {
              "name": "punctuation.definition.tag.directive.imba"
            }
          },
          "patterns": [
            {
              "name": "entity.other.attribute-name.directive.imba",
              "match": "path|types|no-default-lib|lib|name"
            },
            {
              "name": "keyword.operator.assignment.imba",
              "match": "="
            },
            {
              "include": "#string"
            }
          ]
        }
      ]
    },
    "docblock": {
      "patterns": [
        {
          "match": "(?x)\n((@)(?:access|api))\n\\s+\n(private|protected|public)\n\\b",
          "captures": {
            "1": {
              "name": "storage.type.class.jsdoc"
            },
            "2": {
              "name": "punctuation.definition.block.tag.jsdoc"
            },
            "3": {
              "name": "constant.language.access-type.jsdoc"
            }
          }
        },
        {
          "match": "(?x)\n((@)author)\n\\s+\n(\n  [^@\\s<>*/]\n  (?:[^@<>*/]|\\*[^/])*\n)\n(?:\n  \\s*\n  (<)\n  ([^>\\s]+)\n  (>)\n)?",
          "captures": {
            "1": {
              "name": "storage.type.class.jsdoc"
            },
            "2": {
              "name": "punctuation.definition.block.tag.jsdoc"
            },
            "3": {
              "name": "entity.name.type.instance.jsdoc"
            },
            "4": {
              "name": "punctuation.definition.bracket.angle.begin.jsdoc"
            },
            "5": {
              "name": "constant.other.email.link.underline.jsdoc"
            },
            "6": {
              "name": "punctuation.definition.bracket.angle.end.jsdoc"
            }
          }
        },
        {
          "match": "(?x)\n((@)borrows) \\s+\n((?:[^@\\s*/]|\\*[^/])+)    # <that namepath>\n\\s+ (as) \\s+              # as\n((?:[^@\\s*/]|\\*[^/])+)    # <this namepath>",
          "captures": {
            "1": {
              "name": "storage.type.class.jsdoc"
            },
            "2": {
              "name": "punctuation.definition.block.tag.jsdoc"
            },
            "3": {
              "name": "entity.name.type.instance.jsdoc"
            },
            "4": {
              "name": "keyword.operator.control.jsdoc"
            },
            "5": {
              "name": "entity.name.type.instance.jsdoc"
            }
          }
        },
        {
          "name": "meta.example.jsdoc",
          "begin": "((@)example)\\s+",
          "end": "(?=@|\\*/)",
          "beginCaptures": {
            "1": {
              "name": "storage.type.class.jsdoc"
            },
            "2": {
              "name": "punctuation.definition.block.tag.jsdoc"
            }
          },
          "patterns": [
            {
              "match": "^\\s\\*\\s+"
            },
            {
              "contentName": "constant.other.description.jsdoc",
              "begin": "\\G(<)caption(>)",
              "beginCaptures": {
                "0": {
                  "name": "entity.name.tag.inline.jsdoc"
                },
                "1": {
                  "name": "punctuation.definition.bracket.angle.begin.jsdoc"
                },
                "2": {
                  "name": "punctuation.definition.bracket.angle.end.jsdoc"
                }
              },
              "end": "(</)caption(>)|(?=\\*/)",
              "endCaptures": {
                "0": {
                  "name": "entity.name.tag.inline.jsdoc"
                },
                "1": {
                  "name": "punctuation.definition.bracket.angle.begin.jsdoc"
                },
                "2": {
                  "name": "punctuation.definition.bracket.angle.end.jsdoc"
                }
              }
            },
            {
              "match": "[^\\s@*](?:[^*]|\\*[^/])*",
              "captures": {
                "0": {
                  "name": "source.embedded.imba"
                }
              }
            }
          ]
        },
        {
          "match": "(?x) ((@)kind) \\s+ (class|constant|event|external|file|function|member|mixin|module|namespace|typedef) \\b",
          "captures": {
            "1": {
              "name": "storage.type.class.jsdoc"
            },
            "2": {
              "name": "punctuation.definition.block.tag.jsdoc"
            },
            "3": {
              "name": "constant.language.symbol-type.jsdoc"
            }
          }
        },
        {
          "match": "(?x)\n((@)see)\n\\s+\n(?:\n  # URL\n  (\n    (?=https?://)\n    (?:[^\\s*]|\\*[^/])+\n  )\n  |\n  # JSDoc namepath\n  (\n    (?!\n      # Avoid matching bare URIs (also acceptable as links)\n      https?://\n      |\n      # Avoid matching {@inline tags}; we match those below\n      (?:\\[[^\\[\\]]*\\])? # Possible description [preceding]{@tag}\n      {@(?:link|linkcode|linkplain|tutorial)\\b\n    )\n    # Matched namepath\n    (?:[^@\\s*/]|\\*[^/])+\n  )\n)",
          "captures": {
            "1": {
              "name": "storage.type.class.jsdoc"
            },
            "2": {
              "name": "punctuation.definition.block.tag.jsdoc"
            },
            "3": {
              "name": "variable.other.link.underline.jsdoc"
            },
            "4": {
              "name": "entity.name.type.instance.jsdoc"
            }
          }
        },
        {
          "match": "(?x)\n((@)template)\n\\s+\n# One or more valid identifiers\n(\n  [A-Za-z_$]         # First character: non-numeric word character\n  [\\w$.\\[\\]]*        # Rest of identifier\n  (?:                # Possible list of additional identifiers\n    \\s* , \\s*\n    [A-Za-z_$]\n    [\\w$.\\[\\]]*\n  )*\n)",
          "captures": {
            "1": {
              "name": "storage.type.class.jsdoc"
            },
            "2": {
              "name": "punctuation.definition.block.tag.jsdoc"
            },
            "3": {
              "name": "variable.other.jsdoc"
            }
          }
        },
        {
          "match": "(?x)\n(\n  (@)\n  (?:arg|argument|const|constant|member|namespace|param|var)\n)\n\\s+\n(\n  [A-Za-z_$]\n  [\\w$.\\[\\]]*\n)",
          "captures": {
            "1": {
              "name": "storage.type.class.jsdoc"
            },
            "2": {
              "name": "punctuation.definition.block.tag.jsdoc"
            },
            "3": {
              "name": "variable.other.jsdoc"
            }
          }
        },
        {
          "begin": "((@)typedef)\\s+(?={)",
          "beginCaptures": {
            "1": {
              "name": "storage.type.class.jsdoc"
            },
            "2": {
              "name": "punctuation.definition.block.tag.jsdoc"
            }
          },
          "end": "(?=\\s|\\*/|[^{}\\[\\]A-Za-z_$])",
          "patterns": [
            {
              "include": "#jsdoctype"
            },
            {
              "name": "entity.name.type.instance.jsdoc",
              "match": "(?:[^@\\s*/]|\\*[^/])+"
            }
          ]
        },
        {
          "begin": "((@)(?:arg|argument|const|constant|member|namespace|param|prop|property|var))\\s+(?={)",
          "beginCaptures": {
            "1": {
              "name": "storage.type.class.jsdoc"
            },
            "2": {
              "name": "punctuation.definition.block.tag.jsdoc"
            }
          },
          "end": "(?=\\s|\\*/|[^{}\\[\\]A-Za-z_$])",
          "patterns": [
            {
              "include": "#jsdoctype"
            },
            {
              "name": "variable.other.jsdoc",
              "match": "([A-Za-z_$][\\w$.\\[\\]]*)"
            },
            {
              "name": "variable.other.jsdoc",
              "match": "(?x)\n(\\[)\\s*\n[\\w$]+\n(?:\n  (?:\\[\\])?                                        # Foo[ ].bar properties within an array\n  \\.                                                # Foo.Bar namespaced parameter\n  [\\w$]+\n)*\n(?:\n  \\s*\n  (=)                                                # [foo=bar] Default parameter value\n  \\s*\n  (\n    # The inner regexes are to stop the match early at */ and to not stop at escaped quotes\n    (?>\n      \"(?:(?:\\*(?!/))|(?:\\\\(?!\"))|[^*\\\\])*?\" |                      # [foo=\"bar\"] Double-quoted\n      '(?:(?:\\*(?!/))|(?:\\\\(?!'))|[^*\\\\])*?' |                      # [foo='bar'] Single-quoted\n      \\[ (?:(?:\\*(?!/))|[^*])*? \\] |                                # [foo=[1,2]] Array literal\n      (?:(?:\\*(?!/))|\\s(?!\\s*\\])|\\[.*?(?:\\]|(?=\\*/))|[^*\\s\\[\\]])*   # Everything else\n    )*\n  )\n)?\n\\s*(?:(\\])((?:[^*\\s]|\\*[^\\s/])+)?|(?=\\*/))",
              "captures": {
                "1": {
                  "name": "punctuation.definition.optional-value.begin.bracket.square.jsdoc"
                },
                "2": {
                  "name": "keyword.operator.assignment.jsdoc"
                },
                "3": {
                  "name": "source.embedded.imba"
                },
                "4": {
                  "name": "punctuation.definition.optional-value.end.bracket.square.jsdoc"
                },
                "5": {
                  "name": "invalid.illegal.syntax.jsdoc"
                }
              }
            }
          ]
        },
        {
          "begin": "(?x)\n(\n  (@)\n  (?:define|enum|exception|export|extends|lends|implements|modifies\n  |namespace|private|protected|returns?|suppress|this|throws|type\n  |yields?)\n)\n\\s+(?={)",
          "beginCaptures": {
            "1": {
              "name": "storage.type.class.jsdoc"
            },
            "2": {
              "name": "punctuation.definition.block.tag.jsdoc"
            }
          },
          "end": "(?=\\s|\\*/|[^{}\\[\\]A-Za-z_$])",
          "patterns": [
            {
              "include": "#jsdoctype"
            }
          ]
        },
        {
          "match": "(?x)\n(\n  (@)\n  (?:alias|augments|callback|constructs|emits|event|fires|exports?\n  |extends|external|function|func|host|lends|listens|interface|memberof!?\n  |method|module|mixes|mixin|name|requires|see|this|typedef|uses)\n)\n\\s+\n(\n  (?:\n    [^{}@\\s*] | \\*[^/]\n  )+\n)",
          "captures": {
            "1": {
              "name": "storage.type.class.jsdoc"
            },
            "2": {
              "name": "punctuation.definition.block.tag.jsdoc"
            },
            "3": {
              "name": "entity.name.type.instance.jsdoc"
            }
          }
        },
        {
          "contentName": "variable.other.jsdoc",
          "begin": "((@)(?:default(?:value)?|license|version))\\s+(([''\"]))",
          "beginCaptures": {
            "1": {
              "name": "storage.type.class.jsdoc"
            },
            "2": {
              "name": "punctuation.definition.block.tag.jsdoc"
            },
            "3": {
              "name": "variable.other.jsdoc"
            },
            "4": {
              "name": "punctuation.definition.string.begin.jsdoc"
            }
          },
          "end": "(\\3)|(?=$|\\*/)",
          "endCaptures": {
            "0": {
              "name": "variable.other.jsdoc"
            },
            "1": {
              "name": "punctuation.definition.string.end.jsdoc"
            }
          }
        },
        {
          "match": "((@)(?:default(?:value)?|license|tutorial|variation|version))\\s+([^\\s*]+)",
          "captures": {
            "1": {
              "name": "storage.type.class.jsdoc"
            },
            "2": {
              "name": "punctuation.definition.block.tag.jsdoc"
            },
            "3": {
              "name": "variable.other.jsdoc"
            }
          }
        },
        {
          "name": "storage.type.class.jsdoc",
          "match": "(?x) (@) (?:abstract|access|alias|api|arg|argument|async|attribute|augments|author|beta|borrows|bubbles |callback|chainable|class|classdesc|code|config|const|constant|constructor|constructs|copyright |default|defaultvalue|define|deprecated|desc|description|dict|emits|enum|event|example|exception |exports?|extends|extension(?:_?for)?|external|externs|file|fileoverview|final|fires|for|func |function|generator|global|hideconstructor|host|ignore|implements|implicitCast|inherit[Dd]oc |inner|instance|interface|internal|kind|lends|license|listens|main|member|memberof!?|method |mixes|mixins?|modifies|module|name|namespace|noalias|nocollapse|nocompile|nosideeffects |override|overview|package|param|polymer(?:Behavior)?|preserve|private|prop|property|protected |public|read[Oo]nly|record|require[ds]|returns?|see|since|static|struct|submodule|summary |suppress|template|this|throws|todo|tutorial|type|typedef|unrestricted|uses|var|variation |version|virtual|writeOnce|yields?) \\b",
          "captures": {
            "1": {
              "name": "punctuation.definition.block.tag.jsdoc"
            }
          }
        },
        {
          "include": "#inline-tags"
        },
        {
          "match": "((@)(?:[_$[:alpha:]][_$[:alnum:]]*(?:\\-[_$[:alnum:]]+)*[\\?\\!]?))(?=\\s+)",
          "captures": {
            "1": {
              "name": "storage.type.class.jsdoc"
            },
            "2": {
              "name": "punctuation.definition.block.tag.jsdoc"
            }
          }
        }
      ]
    },
    "brackets": {
      "patterns": [
        {
          "begin": "{",
          "end": "}|(?=\\*/)",
          "patterns": [
            {
              "include": "#brackets"
            }
          ]
        },
        {
          "begin": "\\[",
          "end": "\\]|(?=\\*/)",
          "patterns": [
            {
              "include": "#brackets"
            }
          ]
        }
      ]
    },
    "inline-tags": {
      "patterns": [
        {
          "name": "constant.other.description.jsdoc",
          "match": "(\\[)[^\\]]+(\\])(?={@(?:link|linkcode|linkplain|tutorial))",
          "captures": {
            "1": {
              "name": "punctuation.definition.bracket.square.begin.jsdoc"
            },
            "2": {
              "name": "punctuation.definition.bracket.square.end.jsdoc"
            }
          }
        },
        {
          "name": "entity.name.type.instance.jsdoc",
          "begin": "({)((@)(?:link(?:code|plain)?|tutorial))\\s*",
          "beginCaptures": {
            "1": {
              "name": "punctuation.definition.bracket.curly.begin.jsdoc"
            },
            "2": {
              "name": "storage.type.class.jsdoc"
            },
            "3": {
              "name": "punctuation.definition.inline.tag.jsdoc"
            }
          },
          "end": "}|(?=\\*/)",
          "endCaptures": {
            "0": {
              "name": "punctuation.definition.bracket.curly.end.jsdoc"
            }
          },
          "patterns": [
            {
              "match": "\\G((?=https?://)(?:[^|}\\s*]|\\*[/])+)(\\|)?",
              "captures": {
                "1": {
                  "name": "variable.other.link.underline.jsdoc"
                },
                "2": {
                  "name": "punctuation.separator.pipe.jsdoc"
                }
              }
            },
            {
              "match": "\\G((?:[^{}@\\s|*]|\\*[^/])+)(\\|)?",
              "captures": {
                "1": {
                  "name": "variable.other.description.jsdoc"
                },
                "2": {
                  "name": "punctuation.separator.pipe.jsdoc"
                }
              }
            }
          ]
        }
      ]
    },
    "jsdoctype": {
      "patterns": [
        {
          "name": "invalid.illegal.type.jsdoc",
          "match": "\\G{(?:[^}*]|\\*[^/}])+$"
        },
        {
          "contentName": "entity.name.type.instance.jsdoc",
          "begin": "\\G({)",
          "beginCaptures": {
            "0": {
              "name": "entity.name.type.instance.jsdoc"
            },
            "1": {
              "name": "punctuation.definition.bracket.curly.begin.jsdoc"
            }
          },
          "end": "((}))\\s*|(?=\\*/)",
          "endCaptures": {
            "1": {
              "name": "entity.name.type.instance.jsdoc"
            },
            "2": {
              "name": "punctuation.definition.bracket.curly.end.jsdoc"
            }
          },
          "patterns": [
            {
              "include": "#brackets"
            }
          ]
        }
      ]
    }
  }
}
