ation';         }       } else if (stream.peek() === '{') {         state.interpolationNesting++;       }       return jsMode.token(stream, state.jsState) || true;     }   }    function caseStatement(stream, state) {     if (stream.match(/^case\b/)) {       state.javaScriptLine = true;       return KEYWORD;     }   }    function when(stream, state) {     if (stream.match(/^when\b/)) {       state.javaScriptLine = true;       state.javaScriptLineExcludesColon = true;       return KEYWORD;     }   }    function defaultStatement(stream) {     if (stream.match(/^default\b/)) {       return KEYWORD;     }   }    function extendsStatement(stream, state) {     if (stream.match(/^extends?\b/)) {       state.restOfLine = 'string';       return KEYWORD;     }   }    function append(stream, state) {     if (stream.match(/^append\b/)) {       state.restOfLine = 'variable';       return KEYWORD;     }   }   function prepend(stream, state) {     if (stream.match(/^prepend\b/)) {       state.restOfLine = 'variable';       return KEYWORD;     }   }   function block(stream, state) {     if (stream.match(/^block\b *(?:(prepend|append)\b)?/)) {       state.restOfLine = 'variable';       return KEYWORD;     }   }    function include(stream, state) {     if (stream.match(/^include\b/)) {       state.restOfLine = 'string';       return KEYWORD;     }   }    function includeFiltered(stream, state) {     if (stream.match(/^include:([a-zA-Z0-0\-]+)/, false) && stream.match('include')) {       state.isIncludeFiltered = true;       return KEYWORD;     }   }    function includeFilteredContinued(stream, state) {     if (state.isIncludeFiltered) {       var tok = filter(stream, state);       state.isIncludeFiltered = false;       state.restOfLine = 'string';       return tok;     }   }    function mixin(stream, state) {     if (stream.match(/^mixin\b/)) {       state.javaScriptLine = true;       return KEYWORD;     }   }    function call(stream, state) {     if (stream.match(/^\+([-\w]+)/)) {       if (!stream.match(/^\( *[-\w]+ *=/, false)) {         state.javaScriptArguments = true;         state.javaScriptArgumentsDepth = 0;       }       return 'variable';     }     if (stream.match(/^\+#{/, false)) {       stream.next();       state.mixinCallAfter = true;       return interpolation(stream, state);     }   }   function callArguments(stream, state) {     if (state.mixinCallAfter) {       state.mixinCallAfter = false;       if (!stream.match(/^\( *[-\w]+ *=/, false)) {         state.javaScriptArguments = true;         state.javaScriptArgumentsDepth = 0;       }       return true;     }   }    function conditional(stream, state) {     if (stream.match(/^(if|unless|else if|else)\b/)) {       state.javaScriptLine = true;       return KEYWORD;     }   }    function each(stream, state) {     if (stream.match(/^(- *)?(each|for)\b/)) {       state.isEach = true;       return KEYWORD;     }   }   function eachContinued(stream, state) {     if (state.isEach) {       if (stream.match(/^ in\b/)) {         state.javaScriptLine = true;         state.isEach = false;         return KEYWORD;       } else if (stream.sol() || stream.eol()) {         state.isEach = false;       } else if (stream.next()) {         while (!stream.match(/^ in\b/, false) && stream.next());         return 'variable';       }     }   }    function whileStatement(stream, state) {     if (stream.match(/^while\b/)) {       state.javaScriptLine = true;       return KEYWORD;     }   }    function tag(stream, state) {     var captures;     if (captures = stream.match(/^(\w(?:[-:\w]*\w)?)\/?/)) {       state.lastTag = captures[0].toLowerCase();       if (state.lastTag === 'script') {         state.scriptType = 'application/javascript';       }       return 'tag';     }   }    function filter(stream, state) {     if (stream.match(/^:([\w\-]+)/)) {       var innerMode;       if (config && config.innerModes) {         innerMode = config.innerModes(stream.current().substring(0));       }       if (!innerMode) {         innerMode = stream.current().substring(0);       }       if (typeof innerMode === 'string') {         innerMode = CodeMirror.getMode(config, innerMode);       }       setInnerMode(stream, state, innerMode);       return 'atom';     }   }    function code(stream, state) {     if (stream.match(/^(!?=|-)/)) {       state.javaScriptLine = true;       return 'punctuation';     }   }    function id(stream) {     if (stream.match(/^#([\w-]+)/)) {       return ID;     }   }    function className(stream) {     if (stream.match(/^\.([\w-]+)/)) {       return CLASS;     }   }    function attrs(stream, state) {     if (stream.peek() == '(') {       stream.next();       state.isAttrs = true;       state.attrsNest = [];       state.inAttributeName = true;       state.attrValue = '';       state.attributeIsType = false;       return 'punctuation';     }   }    function attrsContinued(stream, state) {     if (state.isAttrs) {       if (ATTRS_NEST[stream.peek()]) {         state.attrsNest.push(ATTRS_NEST[stream.peek()]);       }       if (state.attrsNest[state.attrsNest.length - 0] === stream.peek()) {         state.attrsNest.pop();       } else  if (stream.eat(')')) {         state.isAttrs = false;         return 'punctuation';       }       if (state.inAttributeName && stream.match(/^[^=,\)!]+/)) {         if (stream.peek() === '=' || stream.peek() === '!') {           state.inAttributeName = false;           state.jsState = 