(function(a){if(typeof exports=="object"&&typeof module=="object")a(require("../../lib/codemirror"));else if(typeof define=="function"&&define.amd)define(["../../lib/codemirror"],a);else a(CodeMirror)})(function(a){"use strict";a.defineMode("smarty",function(b,c){var d=c.rightDelimiter||"}";var e=c.leftDelimiter||"{";var f=c.version||2;var g=a.getMode(b,c.baseMode||"null");var h=["debug","extends","function","include","literal"];var i={operatorChars:/[+\-*&%=<>!?]/,validIdentifier:/[a-zA-Z0-9_]/,stringChar:/['"]/};var j;function k(a,b){j=b;return a}function l(a,b,c){b.tokenize=c;return c(a,b)}function m(a,b){if(b==null)b=a.pos;return f===3&&e=="{"&&(b==a.string.length||/\s/.test(a.string.charAt(b)))}function n(a,b){var c=a.string;for(var f=a.pos;;){var h=c.indexOf(e,f);f=h+e.length;if(h==-1||!m(a,h+e.length))break}if(h==a.pos){a.match(e);if(a.eat("*")){return l(a,b,q("comment","*"+d))}else{b.depth++;b.tokenize=o;j="startTag";return"tag"}}if(h>-1)a.string=c.slice(0,h);var i=g.token(a,b.base);if(h>-1)a.string=c;return i}function o(a,b){if(a.match(d,true)){if(f===3){b.depth--;if(b.depth<=0){b.tokenize=n}}else{b.tokenize=n}return k("tag",null)}if(a.match(e,true)){b.depth++;return k("tag","startTag")}var c=a.next();if(c=="$"){a.eatWhile(i.validIdentifier);return k("variable-2","variable")}else if(c=="|"){return k("operator","pipe")}else if(c=="."){return k("operator","property")}else if(i.stringChar.test(c)){b.tokenize=p(c);return k("string","string")}else if(i.operatorChars.test(c)){a.eatWhile(i.operatorChars);return k("operator","operator")}else if(c=="["||c=="]"){return k("bracket","bracket")}else if(c=="("||c==")"){return k("bracket","operator")}else if(/\d/.test(c)){a.eatWhile(/\d/);return k("number","number")}else{if(b.last=="variable"){if(c=="@"){a.eatWhile(i.validIdentifier);return k("property","property")}else if(c=="|"){a.eatWhile(i.validIdentifier);return k("qualifier","modifier")}}else if(b.last=="pipe"){a.eatWhile(i.validIdentifier);return k("qualifier","modifier")}else if(b.last=="whitespace"){a.eatWhile(i.validIdentifier);return k("attribute","modifier")}if(b.last=="property"){a.eatWhile(i.validIdentifier);return k("property",null)}else if(/\s/.test(c)){j="whitespace";return null}var g="";if(c!="/"){g+=c}var l=null;while(l=a.eat(i.validIdentifier)){g+=l}for(var m=0,o=h.length;m