Template:Peking/mdl/prettifyjs

//third_party/javascript/google_code_prettify/src/prettify.js /**

* @license Copyright (C) 2006 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*      http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

/**

* @fileoverview
* some functions for browser-side pretty printing of code contained in html.
*

* * For a fairly comprehensive set of languages see the * <a href="http://google-code-prettify.googlecode.com/svn/trunk/README.html#langs">README</a> * file that came with this source. At a minimum, the lexer should work on a * number of languages including C and friends, Java, Python, Bash, SQL, HTML, * XML, CSS, Javascript, and Makefiles. It works passably on Ruby, PHP and Awk * and a subset of Perl, but, because of commenting conventions, doesn't work on * Smalltalk, Lisp-like, or CAML-like languages without an explicit lang class. * <p> * Usage:

    *
  1. include this source file in an html page via * {@code <script type="text/javascript" src="/path/to/prettify.js"></script>} *
  2. define style rules. See the example page for examples. *
  3. mark the {@code
    } and {@code <code>} tags in your source with
     *    {@code class=prettyprint.}
     *    You can also use the (html deprecated) {@code <xmp>} tag, but the pretty
     *    printer needs to do more substantial DOM manipulations to support that, so
     *    some css styles may not be preserved.
     * </ol>
     * That's it.  I wanted to keep the API as simple as possible, so there's no
     * need to specify which language the code is in, but if you wish, you can add
     * another class to the {@code <pre>} or {@code <code>} element to specify the
     * language, as in {@code <pre class="prettyprint lang-java">}.  Any class that
     * starts with "lang-" followed by a file extension, specifies the file type.
     * See the "lang-*.js" files in this directory for code that implements
     * per-language file handlers.
     * <p>
     * Change log:<br>
     * cbeust, 2006/08/22
     * <blockquote>
     *   Java annotations (start with "@") are now captured as literals ("lit")
     * </blockquote>
     * @requires console
     */
    
    // JSLint declarations
    /*global console, document, navigator, setTimeout, window */
    
    /**
     * Split {@code prettyPrint} into multiple timeouts so as not to interfere with
     * UI events.
     * If set to {@code false}, {@code prettyPrint()} is synchronous.
     */
    window['PR_SHOULD_USE_CONTINUATION'] = true;
    
    /** the number of characters between tab columns */
    window['PR_TAB_WIDTH'] = 8;
    
    /** Walks the DOM returning a properly escaped version of innerHTML.
      * @param {Node} node
      * @param {Array.<string>} out output buffer that receives chunks of HTML.
      */
    window['PR_normalizedHtml'] = void 0;
    
    /** Contains functions for creating and registering new language handlers.
      * @type {Object}
      */
    window['PR'] = void 0;
    
    /** Pretty print a chunk of code.
      *
      * @param {string} sourceCodeHtml code as html
      * @return {string} code as html, but prettier
      */
    window['prettyPrintOne'] = void 0;
    
    /** Find all the {@code <pre>} and {@code <code>} tags in the DOM with
      * {@code class=prettyprint} and prettify them.
      * @param {Function?} opt_whenDone if specified, called when the last entry
      *     has been finished.
      */
    window['prettyPrint'] = void 0;
    
    /** browser detection. @extern @returns false if not IE, otherwise the major version. */
    window['_pr_isIE6'] = function () {
      var ieVersion = navigator && navigator.userAgent &&
          navigator.userAgent.match(/\bMSIE ([678])\./);
      ieVersion = ieVersion ? +ieVersion[1] : false;
      window['_pr_isIE6'] = function () { return ieVersion; };
      return ieVersion;
    };
    
    
    (function () {
      // Keyword lists for various languages.
      var FLOW_CONTROL_KEYWORDS =
          "break continue do else for if return while ";
      var C_KEYWORDS = FLOW_CONTROL_KEYWORDS + "auto case char const default " +
          "double enum extern float goto int long register short signed sizeof " +
          "static struct switch typedef union unsigned void volatile ";
      var COMMON_KEYWORDS = C_KEYWORDS + "catch class delete false import " +
          "new operator private protected public this throw true try typeof ";
      var CPP_KEYWORDS = COMMON_KEYWORDS + "alignof align_union asm axiom bool " +
          "concept concept_map const_cast constexpr decltype " +
          "dynamic_cast explicit export friend inline late_check " +
          "mutable namespace nullptr reinterpret_cast static_assert static_cast " +
          "template typeid typename using virtual wchar_t where ";
      var JAVA_KEYWORDS = COMMON_KEYWORDS +
          "abstract boolean byte extends final finally implements import " +
          "instanceof null native package strictfp super synchronized throws " +
          "transient ";
      var CSHARP_KEYWORDS = JAVA_KEYWORDS +
          "as base by checked decimal delegate descending dynamic event " +
          "fixed foreach from group implicit in interface internal into is lock " +
          "object out override orderby params partial readonly ref sbyte sealed " +
          "stackalloc string select uint ulong unchecked unsafe ushort var ";
      var COFFEE_KEYWORDS = "all and by catch class else extends false finally " +
          "for if in is isnt loop new no not null of off on or return super then " +
          "true try unless until when while yes ";
      var JSCRIPT_KEYWORDS = COMMON_KEYWORDS +
          "debugger eval export function get null set undefined var with " +
          "Infinity NaN ";
      var PERL_KEYWORDS = "caller delete die do dump elsif eval exit foreach for " +
          "goto if import last local my next no our print package redo require " +
          "sub undef unless until use wantarray while BEGIN END ";
      var PYTHON_KEYWORDS = FLOW_CONTROL_KEYWORDS + "and as assert class def del " +
          "elif except exec finally from global import in is lambda " +
          "nonlocal not or pass print raise try with yield " +
          "False True None ";
      var RUBY_KEYWORDS = FLOW_CONTROL_KEYWORDS + "alias and begin case class def" +
          " defined elsif end ensure false in module next nil not or redo rescue " +
          "retry self super then true undef unless until when yield BEGIN END ";
      var SH_KEYWORDS = FLOW_CONTROL_KEYWORDS + "case done elif esac eval fi " +
          "function in local set then until ";
      var ALL_KEYWORDS = (
          CPP_KEYWORDS + CSHARP_KEYWORDS + JSCRIPT_KEYWORDS + PERL_KEYWORDS +
          PYTHON_KEYWORDS + RUBY_KEYWORDS + SH_KEYWORDS);
    
      // token style names.  correspond to css classes
      /** token style for a string literal */
      var PR_STRING = 'str';
      /** token style for a keyword */
      var PR_KEYWORD = 'kwd';
      /** token style for a comment */
      var PR_COMMENT = 'com';
      /** token style for a type */
      var PR_TYPE = 'typ';
      /** token style for a literal value.  e.g. 1, null, true. */
      var PR_LITERAL = 'lit';
      /** token style for a punctuation string. */
      var PR_PUNCTUATION = 'pun';
      /** token style for a punctuation string. */
      var PR_PLAIN = 'pln';
    
      /** token style for an sgml tag. */
      var PR_TAG = 'tag';
      /** token style for a markup declaration such as a DOCTYPE. */
      var PR_DECLARATION = 'dec';
      /** token style for embedded source. */
      var PR_SOURCE = 'src';
      /** token style for an sgml attribute name. */
      var PR_ATTRIB_NAME = 'atn';
      /** token style for an sgml attribute value. */
      var PR_ATTRIB_VALUE = 'atv';
    
      /**
       * A class that indicates a section of markup that is not code, e.g. to allow
       * embedding of line numbers within code listings.
       */
      var PR_NOCODE = 'nocode';
    
      /** A set of tokens that can precede a regular expression literal in
        * javascript.
        * http://www.mozilla.org/js/language/js20/rationale/syntax.html has the full
        * list, but I've removed ones that might be problematic when seen in
        * languages that don't support regular expression literals.
        *
        * <p>Specifically, I've removed any keywords that can't precede a regexp
        * literal in a syntactically legal javascript program, and I've removed the
        * "in" keyword since it's not a keyword in many languages, and might be used
        * as a count of inches.
        *
        * <p>The link a above does not accurately describe EcmaScript rules since
        * it fails to distinguish between (a=++/b/i) and (a++/b/i) but it works
        * very well in practice.
        *
        * @private
        */
      var REGEXP_PRECEDER_PATTERN = function () {
          var preceders = [
              "!", "!=", "!==", "#", "%", "%=", "&", "&&", "&&=",
              "&=", "(", "*", "*=", /* "+", */ "+=", ",", /* "-", */ "-=",
              "->", /*".", "..", "...", handled below */ "/", "/=", ":", "::", ";",
              "<", "<<", "<<=", "<=", "=", "==", "===", ">",
              ">=", ">>", ">>=", ">>>", ">>>=", "?", "@", "[",
              "^", "^=", "^^", "^^=", "{", "|", "|=", "||",
              "||=", "~" /* handles =~ and !~ */,
              "break", "case", "continue", "delete",
              "do", "else", "finally", "instanceof",
              "return", "throw", "try", "typeof"
              ];
          var pattern = '(?:^^|[+-]';
          for (var i = 0; i < preceders.length; ++i) {
            pattern += '|' + preceders[i].replace(/([^=<>:&a-z])/g, '\\$1');
          }
          pattern += ')\\s*';  // matches at end, and matches empty string
          return pattern;
          // CAVEAT: this does not properly handle the case where a regular
          // expression immediately follows another since a regular expression may
          // have flags for case-sensitivity and the like.  Having regexp tokens
          // adjacent is not valid in any language I'm aware of, so I'm punting.
          // TODO: maybe style special characters inside a regexp as punctuation.
        }();
    
      // Define regexps here so that the interpreter doesn't have to create an
      // object each time the function containing them is called.
      // The language spec requires a new object created even if you don't access
      // the $1 members.
      var pr_amp = /&/g;
      var pr_lt = /</g;
      var pr_gt = />/g;
      var pr_quot = /\"/g;
      /** like textToHtml but escapes double quotes to be attribute safe. */
      function attribToHtml(str) {
        return str.replace(pr_amp, '&')
            .replace(pr_lt, '<')
            .replace(pr_gt, '>')
            .replace(pr_quot, '"');
      }
    
      /** escapest html special characters to html. */
      function textToHtml(str) {
        return str.replace(pr_amp, '&')
            .replace(pr_lt, '<')
            .replace(pr_gt, '>');
      }
    
    
      var pr_ltEnt = /</g;
      var pr_gtEnt = />/g;
      var pr_aposEnt = /'/g;
      var pr_quotEnt = /"/g;
      var pr_ampEnt = /&/g;
      var pr_nbspEnt = / /g;
      /** unescapes html to plain text. */
      function htmlToText(html) {
        var pos = html.indexOf('&');
        if (pos < 0) { return html; }
        // Handle numeric entities specially.  We can't use functional substitution
        // since that doesn't work in older versions of Safari.
        // These should be rare since most browsers convert them to normal chars.
        for (--pos; (pos = html.indexOf('&#', pos + 1)) >= 0;) {
          var end = html.indexOf(';', pos);
          if (end >= 0) {
            var num = html.substring(pos + 3, end);
            var radix = 10;
            if (num && num.charAt(0) === 'x') {
              num = num.substring(1);
              radix = 16;
            }
            var codePoint = parseInt(num, radix);
            if (!isNaN(codePoint)) {
              html = (html.substring(0, pos) + String.fromCharCode(codePoint) +
                      html.substring(end + 1));
            }
          }
        }
    
        return html.replace(pr_ltEnt, '<')
            .replace(pr_gtEnt, '>')
            .replace(pr_aposEnt, "'")
            .replace(pr_quotEnt, '"')
            .replace(pr_nbspEnt, ' ')
            .replace(pr_ampEnt, '&');
      }
    
      /** is the given node's innerHTML normally unescaped? */
      function isRawContent(node) {
        return 'XMP' === node.tagName;
      }
    
      var newlineRe = /[\r\n]/g;
      /**
       * Are newlines and adjacent spaces significant in the given node's innerHTML?
       */
      function isPreformatted(node, content) {
        // PRE means preformatted, and is a very common case, so don't create
        // unnecessary computed style objects.
        if ('PRE' === node.tagName) { return true; }
        if (!newlineRe.test(content)) { return true; }  // Don't care
        var whitespace = '';
        // For disconnected nodes, IE has no currentStyle.
        if (node.currentStyle) {
          whitespace = node.currentStyle.whiteSpace;
        } else if (window.getComputedStyle) {
          // Firefox makes a best guess if node is disconnected whereas Safari
          // returns the empty string.
          whitespace = window.getComputedStyle(node, null).whiteSpace;
        }
        return !whitespace || whitespace === 'pre';
      }
    
      function normalizedHtml(node, out, opt_sortAttrs) {
        switch (node.nodeType) {
          case 1:  // an element
            var name = node.tagName.toLowerCase();
    
            out.push('<', name);
            var attrs = node.attributes;
            var n = attrs.length;
            if (n) {
              if (opt_sortAttrs) {
                var sortedAttrs = [];
                for (var i = n; --i >= 0;) { sortedAttrs[i] = attrs[i]; }
                sortedAttrs.sort(function (a, b) {
                    return (a.name < b.name) ? -1 : a.name === b.name ? 0 : 1;
                  });
                attrs = sortedAttrs;
              }
              for (var i = 0; i < n; ++i) {
                var attr = attrs[i];
                if (!attr.specified) { continue; }
                out.push(' ', attr.name.toLowerCase(),
                         '="', attribToHtml(attr.value), '"');
              }
            }
            out.push('>');
            for (var child = node.firstChild; child; child = child.nextSibling) {
              normalizedHtml(child, out, opt_sortAttrs);
            }
            if (node.firstChild || !/^(?:br|link|img)$/.test(name)) {
              out.push('<\/', name, '>');
            }
            break;
          case 3: case 4: // text
            out.push(textToHtml(node.nodeValue));
            break;
        }
      }
    
      /**
       * Given a group of {@link RegExp}s, returns a {@code RegExp} that globally
       * matches the union o the sets o strings matched d by the input RegExp.
       * Since it matches globally, if the input strings have a start-of-input
       * anchor (/^.../), it is ignored for the purposes of unioning.
       * @param {Array.<RegExp>} regexs non multiline, non-global regexs.
       * @return {RegExp} a global regex.
       */
      function combinePrefixPatterns(regexs) {
        var capturedGroupIndex = 0;
    
        var needToFoldCase = false;
        var ignoreCase = false;
        for (var i = 0, n = regexs.length; i < n; ++i) {
          var regex = regexs[i];
          if (regex.ignoreCase) {
            ignoreCase = true;
          } else if (/[a-z]/i.test(regex.source.replace(
                         /\\u[0-9a-f]{4}|\\x[0-9a-f]{2}|\\[^ux]/gi, ''))) {
            needToFoldCase = true;
            ignoreCase = false;
            break;
          }
        }
    
        function decodeEscape(charsetPart) {
          if (charsetPart.charAt(0) !== '\\') { return charsetPart.charCodeAt(0); }
          switch (charsetPart.charAt(1)) {
            case 'b': return 8;
            case 't': return 9;
            case 'n': return 0xa;
            case 'v': return 0xb;
            case 'f': return 0xc;
            case 'r': return 0xd;
            case 'u': case 'x':
              return parseInt(charsetPart.substring(2), 16)
                  || charsetPart.charCodeAt(1);
            case '0': case '1': case '2': case '3': case '4':
            case '5': case '6': case '7':
              return parseInt(charsetPart.substring(1), 8);
            default: return charsetPart.charCodeAt(1);
          }
        }
    
        function encodeEscape(charCode) {
          if (charCode < 0x20) {
            return (charCode < 0x10 ? '\\x0' : '\\x') + charCode.toString(16);
          }
          var ch = String.fromCharCode(charCode);
          if (ch === '\\' || ch === '-' || ch === '[' || ch === ']') {
            ch = '\\' + ch;
          }
          return ch;
        }
    
        function caseFoldCharset(charSet) {
          var charsetParts = charSet.substring(1, charSet.length - 1).match(
              new RegExp(
                  '\\\\u[0-9A-Fa-f]{4}'
                  + '|\\\\x[0-9A-Fa-f]{2}'
                  + '|\\\\[0-3][0-7]{0,2}'
                  + '|\\\\[0-7]{1,2}'
                  + '|\\\\[\\s\\S]'
                  + '|-'
                  + '|[^-\\\\]',
                  'g'));
          var groups = [];
          var ranges = [];
          var inverse = charsetParts[0] === '^';
          for (var i = inverse ? 1 : 0, n = charsetParts.length; i < n; ++i) {
            var p = charsetParts[i];
            switch (p) {
              case '\\B': case '\\b':
              case '\\D': case '\\d':
              case '\\S': case '\\s':
              case '\\W': case '\\w':
                groups.push(p);
                continue;
            }
            var start = decodeEscape(p);
            var end;
            if (i + 2 < n && '-' === charsetParts[i + 1]) {
              end = decodeEscape(charsetParts[i + 2]);
              i += 2;
            } else {
              end = start;
            }
            ranges.push([start, end]);
            // If the range might intersect letters, then expand it.
            if (!(end < 65 || start > 122)) {
              if (!(end < 65 || start > 90)) {
                ranges.push([Math.max(65, start) | 32, Math.min(end, 90) | 32]);
              }
              if (!(end < 97 || start > 122)) {
                ranges.push([Math.max(97, start) & ~32, Math.min(end, 122) & ~32]);
              }
            }
          }
    
          // [[1, 10], [3, 4], [8, 12], [14, 14], [16, 16], [17, 17]]
          // -> [[1, 12], [14, 14], [16, 17]]
          ranges.sort(function (a, b) { return (a[0] - b[0]) || (b[1]  - a[1]); });
          var consolidatedRanges = [];
          var lastRange = [NaN, NaN];
          for (var i = 0; i < ranges.length; ++i) {
            var range = ranges[i];
            if (range[0] <= lastRange[1] + 1) {
              lastRange[1] = Math.max(lastRange[1], range[1]);
            } else {
              consolidatedRanges.push(lastRange = range);
            }
          }
    
          var out = ['['];
          if (inverse) { out.push('^'); }
          out.push.apply(out, groups);
          for (var i = 0; i < consolidatedRanges.length; ++i) {
            var range = consolidatedRanges[i];
            out.push(encodeEscape(range[0]));
            if (range[1] > range[0]) {
              if (range[1] + 1 > range[0]) { out.push('-'); }
              out.push(encodeEscape(range[1]));
            }
          }
          out.push(']');
          return out.join('');
        }
    
        function allowAnywhereFoldCaseAndRenumberGroups(regex) {
          // Split into character sets, escape sequences, punctuation strings
          // like ('(', '(?:', ')', '^'), and runs of characters that do not
          // include any of the above.
          var parts = regex.source.match(
              new RegExp(
                  '(?:'
                  + '\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]'  // a character set
                  + '|\\\\u[A-Fa-f0-9]{4}'  // a unicode escape
                  + '|\\\\x[A-Fa-f0-9]{2}'  // a hex escape
                  + '|\\\\[0-9]+'  // a back-reference or octal escape
                  + '|\\\\[^ux0-9]'  // other escape sequence
                  + '|\\(\\?[:!=]'  // start of a non-capturing group
                  + '|[\\(\\)\\^]'  // start/emd of a group, or line start
                  + '|[^\\x5B\\x5C\\(\\)\\^]+'  // run of other characters
                  + ')',
                  'g'));
          var n = parts.length;
    
          // Maps captured group numbers to the number they will occupy in
          // the output or to -1 if that has not been determined, or to
          // undefined if they need not be capturing in the output.
          var capturedGroups = [];
    
          // Walk over and identify back references to build the capturedGroups
          // mapping.
          for (var i = 0, groupIndex = 0; i < n; ++i) {
            var p = parts[i];
            if (p === '(') {
              // groups are 1-indexed, so max group index is count of '('
              ++groupIndex;
            } else if ('\\' === p.charAt(0)) {
              var decimalValue = +p.substring(1);
              if (decimalValue && decimalValue <= groupIndex) {
                capturedGroups[decimalValue] = -1;
              }
            }
          }
    
          // Renumber groups and reduce capturing groups to non-capturing groups
          // where possible.
          for (var i = 1; i < capturedGroups.length; ++i) {
            if (-1 === capturedGroups[i]) {
              capturedGroups[i] = ++capturedGroupIndex;
            }
          }
          for (var i = 0, groupIndex = 0; i < n; ++i) {
            var p = parts[i];
            if (p === '(') {
              ++groupIndex;
              if (capturedGroups[groupIndex] === undefined) {
                parts[i] = '(?:';
              }
            } else if ('\\' === p.charAt(0)) {
              var decimalValue = +p.substring(1);
              if (decimalValue && decimalValue <= groupIndex) {
                parts[i] = '\\' + capturedGroups[groupIndex];
              }
            }
          }
    
          // Remove any prefix anchors so that the output will match anywhere.
          // ^^ really does mean an anchored match though.
          for (var i = 0, groupIndex = 0; i < n; ++i) {
            if ('^' === parts[i] && '^' !== parts[i + 1]) { parts[i] = ''; }
          }
    
          // Expand letters to groupts to handle mixing of case-sensitive and
          // case-insensitive patterns if necessary.
          if (regex.ignoreCase && needToFoldCase) {
            for (var i = 0; i < n; ++i) {
              var p = parts[i];
              var ch0 = p.charAt(0);
              if (p.length >= 2 && ch0 === '[') {
                parts[i] = caseFoldCharset(p);
              } else if (ch0 !== '\\') {
                // TODO: handle letters in numeric escapes.
                parts[i] = p.replace(
                    /[a-zA-Z]/g,
                    function (ch) {
                      var cc = ch.charCodeAt(0);
                      return '[' + String.fromCharCode(cc & ~32, cc | 32) + ']';
                    });
              }
            }
          }
    
          return parts.join('');
        }
    
        var rewritten = [];
        for (var i = 0, n = regexs.length; i < n; ++i) {
          var regex = regexs[i];
          if (regex.global || regex.multiline) { throw new Error('' + regex); }
          rewritten.push(
              '(?:' + allowAnywhereFoldCaseAndRenumberGroups(regex) + ')');
        }
    
        return new RegExp(rewritten.join('|'), ignoreCase ? 'gi' : 'g');
      }
    
      var PR_innerHtmlWorks = null;
      function getInnerHtml(node) {
        // inner html is hopelessly broken in Safari 2.0.4 when the content is
        // an html description of well formed XML and the containing tag is a PRE
        // tag, so we detect that case and emulate innerHTML.
        if (null === PR_innerHtmlWorks) {
          var testNode = document.createElement('PRE');
          testNode.appendChild(
              document.createTextNode('<!DOCTYPE foo PUBLIC "foo bar">\n<foo />'));
          PR_innerHtmlWorks = !/</.test(testNode.innerHTML);
        }
    
        if (PR_innerHtmlWorks) {
          var content = node.innerHTML;
          // XMP tags contain unescaped entities so require special handling.
          if (isRawContent(node)) {
            content = textToHtml(content);
          } else if (!isPreformatted(node, content)) {
            content = content.replace(/(<br\s*\/?>)[\r\n]+/g, '$1')
                .replace(/(?:[\r\n]+[ \t]*)+/g, ' ');
          }
          return content;
        }
    
        var out = [];
        for (var child = node.firstChild; child; child = child.nextSibling) {
          normalizedHtml(child, out);
        }
        return out.join('');
      }
    
      /** returns a function that expand tabs to spaces.  This function can be fed
        * successive chunks of text, and will maintain its own internal state to
        * keep track of how tabs are expanded.
        * @return {function (string) : string} a function that takes
        *   plain text and return the text with tabs expanded.
        * @private
        */
      function makeTabExpander(tabWidth) {
        var SPACES = '                ';
        var charInLine = 0;
    
        return function (plainText) {
          // walk over each character looking for tabs and newlines.
          // On tabs, expand them.  On newlines, reset charInLine.
          // Otherwise increment charInLine
          var out = null;
          var pos = 0;
          for (var i = 0, n = plainText.length; i < n; ++i) {
            var ch = plainText.charAt(i);
    
            switch (ch) {
              case '\t':
                if (!out) { out = []; }
                out.push(plainText.substring(pos, i));
                // calculate how much space we need in front of this part
                // nSpaces is the amount of padding -- the number of spaces needed
                // to move us to the next column, where columns occur at factors of
                // tabWidth.
                var nSpaces = tabWidth - (charInLine % tabWidth);
                charInLine += nSpaces;
                for (; nSpaces >= 0; nSpaces -= SPACES.length) {
                  out.push(SPACES.substring(0, nSpaces));
                }
                pos = i + 1;
                break;
              case '\n':
                charInLine = 0;
                break;
              default:
                ++charInLine;
            }
          }
          if (!out) { return plainText; }
          out.push(plainText.substring(pos));
          return out.join('');
        };
      }
    
      var pr_chunkPattern = new RegExp(
          '[^<]+'  // A run of characters other than '<'
          + '|<\!--[\\s\\S]*?--\>'  // an HTML comment
          + '|<!\\[CDATA\\[[\\s\\S]*?\\]\\]>'  // a CDATA section
          // a probable tag that should not be highlighted
          + '|<\/?[a-zA-Z](?:[^>\"\']|\'[^\']*\'|\"[^\"]*\")*>'
          + '|<',  // A '<' that does not begin a larger chunk
          'g');
      var pr_commentPrefix = /^<\!--/;
      var pr_cdataPrefix = /^<!\[CDATA\[/;
      var pr_brPrefix = /^<br\b/i;
      var pr_tagNameRe = /^<(\/?)([a-zA-Z][a-zA-Z0-9]*)/;
    
      /** split markup into chunks of html tags (style null) and
        * plain text (style {@link #PR_PLAIN}), converting tags which are
        * significant for tokenization (<br>) into their textual equivalent.
        *
        * @param {string} s html where whitespace is considered significant.
        * @return {Object} source code and extracted tags.
        * @private
        */
      function extractTags(s) {
        // since the pattern has the 'g' modifier and defines no capturing groups,
        // this will return a list of all chunks which we then classify and wrap as
        // PR_Tokens
        var matches = s.match(pr_chunkPattern);
        var sourceBuf = [];
        var sourceBufLen = 0;
        var extractedTags = [];
        if (matches) {
          for (var i = 0, n = matches.length; i < n; ++i) {
            var match = matches[i];
            if (match.length > 1 && match.charAt(0) === '<') {
              if (pr_commentPrefix.test(match)) { continue; }
              if (pr_cdataPrefix.test(match)) {
                // strip CDATA prefix and suffix.  Don't unescape since it's CDATA
                sourceBuf.push(match.substring(9, match.length - 3));
                sourceBufLen += match.length - 12;
              } else if (pr_brPrefix.test(match)) {
                // <br> tags are lexically significant so convert them to text.
                // This is undone later.
                sourceBuf.push('\n');
                ++sourceBufLen;
              } else {
                if (match.indexOf(PR_NOCODE) >= 0 && isNoCodeTag(match)) {
                  // A <span class="nocode"> will start a section that should be
                  // ignored.  Continue walking the list until we see a matching end
                  // tag.
                  var name = match.match(pr_tagNameRe)[2];
                  var depth = 1;
                  var j;
                  end_tag_loop:
                  for (j = i + 1; j < n; ++j) {
                    var name2 = matches[j].match(pr_tagNameRe);
                    if (name2 && name2[2] === name) {
                      if (name2[1] === '/') {
                        if (--depth === 0) { break end_tag_loop; }
                      } else {
                        ++depth;
                      }
                    }
                  }
                  if (j < n) {
                    extractedTags.push(
                        sourceBufLen, matches.slice(i, j + 1).join(''));
                    i = j;
                  } else {  // Ignore unclosed sections.
                    extractedTags.push(sourceBufLen, match);
                  }
                } else {
                  extractedTags.push(sourceBufLen, match);
                }
              }
            } else {
              var literalText = htmlToText(match);
              sourceBuf.push(literalText);
              sourceBufLen += literalText.length;
            }
          }
        }
        return { source: sourceBuf.join(''), tags: extractedTags };
      }
    
      /** True if the given tag contains a class attribute with the nocode class. */
      function isNoCodeTag(tag) {
        return !!tag
            // First canonicalize the representation of attributes
            .replace(/\s(\w+)\s*=\s*(?:\"([^\"]*)\"|'([^\']*)'|(\S+))/g,
                     ' $1="$2$3$4"')
            // Then look for the attribute we want.
            .match(/[cC][lL][aA][sS][sS]=\"[^\"]*\bnocode\b/);
      }
    
      /**
       * Apply the given language handler to sourceCode and add the resulting
       * decorations to out.
       * @param {number} basePos the index of sourceCode within the chunk of source
       *    whose decorations are already present on out.
       */
      function appendDecorations(basePos, sourceCode, langHandler, out) {
        if (!sourceCode) { return; }
        var job = {
          source: sourceCode,
          basePos: basePos
        };
        langHandler(job);
        out.push.apply(out, job.decorations);
      }
    
      /** Given triples of [style, pattern, context] returns a lexing function,
        * The lexing function interprets the patterns to find token boundaries and
        * returns a decoration list of the form
        * [index_0, style_0, index_1, style_1, ..., index_n, style_n]
        * where index_n is an index into the sourceCode, and style_n is a style
        * constant like PR_PLAIN.  index_n-1 <= index_n, and style_n-1 applies to
        * all characters in sourceCode[index_n-1:index_n].
        *
        * The stylePatterns is a list whose elements have the form
        * [style : string, pattern : RegExp, DEPRECATED, shortcut : string].
        *
        * Style is a style constant like PR_PLAIN, or can be a string of the
        * form 'lang-FOO', where FOO is a language extension describing the
        * language of the portion of the token in $1 after pattern executes.
        * E.g., if style is 'lang-lisp', and group 1 contains the text
        * '(hello (world))', then that portion of the token will be passed to the
        * registered lisp handler for formatting.
        * The text before and after group 1 will be restyled using this decorator
        * so decorators should take care that this doesn't result in infinite
        * recursion.  For example, the HTML lexer rule for SCRIPT elements looks
        * something like ['lang-js', /<[s]cript>(.+?)<\/script>/].  This may match
        * '<script>foo()<\/script>', which would cause the current decorator to
        * be called with '<script>' which would not match the same rule since
        * group 1 must not be empty, so it would be instead styled as PR_TAG by
        * the generic tag rule.  The handler registered for the 'js' extension would
        * then be called with 'foo()', and finally, the current decorator would
        * be called with '<\/script>' which would not match the original rule and
        * so the generic tag rule would identify it as a tag.
        *
        * Pattern must only match prefixes, and if it matches a prefix, then that
        * match is considered a token with the same style.
        *
        * Context is applied to the last non-whitespace, non-comment token
        * recognized.
        *
        * Shortcut is an optional string of characters, any of which, if the first
        * character, gurantee that this pattern and only this pattern matches.
        *
        * @param {Array} shortcutStylePatterns patterns that always start with
        *   a known character.  Must have a shortcut string.
        * @param {Array} fallthroughStylePatterns patterns that will be tried in
        *   order if the shortcut ones fail.  May have shortcuts.
        *
        * @return {function (Object)} a
        *   function that takes source code and returns a list of decorations.
        */
      function createSimpleLexer(shortcutStylePatterns, fallthroughStylePatterns) {
        var shortcuts = {};
        var tokenizer;
        (function () {
          var allPatterns = shortcutStylePatterns.concat(fallthroughStylePatterns);
          var allRegexs = [];
          var regexKeys = {};
          for (var i = 0, n = allPatterns.length; i < n; ++i) {
            var patternParts = allPatterns[i];
            var shortcutChars = patternParts[3];
            if (shortcutChars) {
              for (var c = shortcutChars.length; --c >= 0;) {
                shortcuts[shortcutChars.charAt(c)] = patternParts;
              }
            }
            var regex = patternParts[1];
            var k = '' + regex;
            if (!regexKeys.hasOwnProperty(k)) {
              allRegexs.push(regex);
              regexKeys[k] = null;
            }
          }
          allRegexs.push(/[\0-\uffff]/);
          tokenizer = combinePrefixPatterns(allRegexs);
        })();
    
        var nPatterns = fallthroughStylePatterns.length;
        var notWs = /\S/;
    
        /**
         * Lexes job.source and produces an output array job.decorations of style
         * classes preceded by the position at which they start in job.source in
         * order.
         *
         * @param {Object} job an object like {@code
         *    source: {string} sourceText plain text,
         *    basePos: {int} position of job.source in the larger chunk of
         *        sourceCode.
         * }
         */
        var decorate = function (job) {
          var sourceCode = job.source, basePos = job.basePos;
          /** Even entries are positions in source in ascending order.  Odd enties
            * are style markers (e.g., PR_COMMENT) that run from that position until
            * the end.
            * @type {Array.<number|string>}
            */
          var decorations = [basePos, PR_PLAIN];
          var pos = 0;  // index into sourceCode
          var tokens = sourceCode.match(tokenizer) || [];
          var styleCache = {};
    
          for (var ti = 0, nTokens = tokens.length; ti < nTokens; ++ti) {
            var token = tokens[ti];
            var style = styleCache[token];
            var match = void 0;
    
            var isEmbedded;
            if (typeof style === 'string') {
              isEmbedded = false;
            } else {
              var patternParts = shortcuts[token.charAt(0)];
              if (patternParts) {
                match = token.match(patternParts[1]);
                style = patternParts[0];
              } else {
                for (var i = 0; i < nPatterns; ++i) {
                  patternParts = fallthroughStylePatterns[i];
                  match = token.match(patternParts[1]);
                  if (match) {
                    style = patternParts[0];
                    break;
                  }
                }
    
                if (!match) {  // make sure that we make progress
                  style = PR_PLAIN;
                }
              }
    
              isEmbedded = style.length >= 5 && 'lang-' === style.substring(0, 5);
              if (isEmbedded && !(match && typeof match[1] === 'string')) {
                isEmbedded = false;
                style = PR_SOURCE;
              }
    
              if (!isEmbedded) { styleCache[token] = style; }
            }
    
            var tokenStart = pos;
            pos += token.length;
    
            if (!isEmbedded) {
              decorations.push(basePos + tokenStart, style);
            } else {  // Treat group 1 as an embedded block of source code.
              var embeddedSource = match[1];
              var embeddedSourceStart = token.indexOf(embeddedSource);
              var embeddedSourceEnd = embeddedSourceStart + embeddedSource.length;
              if (match[2]) {
                // If embeddedSource can be blank, then it would match at the
                // beginning which would cause us to infinitely recurse on the
                // entire token, so we catch the right context in match[2].
                embeddedSourceEnd = token.length - match[2].length;
                embeddedSourceStart = embeddedSourceEnd - embeddedSource.length;
              }
              var lang = style.substring(5);
              // Decorate the left of the embedded source
              appendDecorations(
                  basePos + tokenStart,
                  token.substring(0, embeddedSourceStart),
                  decorate, decorations);
              // Decorate the embedded source
              appendDecorations(
                  basePos + tokenStart + embeddedSourceStart,
                  embeddedSource,
                  langHandlerForExtension(lang, embeddedSource),
                  decorations);
              // Decorate the right of the embedded section
              appendDecorations(
                  basePos + tokenStart + embeddedSourceEnd,
                  token.substring(embeddedSourceEnd),
                  decorate, decorations);
            }
          }
          job.decorations = decorations;
        };
        return decorate;
      }
    
      /** returns a function that produces a list of decorations from source text.
        *
        * This code treats ", ', and ` as string delimiters, and \ as a string
        * escape.  It does not recognize perl's qq() style strings.
        * It has no special handling for double delimiter escapes as in basic, or
        * the tripled delimiters used in python, but should work on those regardless
        * although in those cases a single string literal may be broken up into
        * multiple adjacent string literals.
        *
        * It recognizes C, C++, and shell style comments.
        *
        * @param {Object} options a set of optional parameters.
        * @return {function (Object)} a function that examines the source code
        *     in the input job and builds the decoration list.
        */
      function sourceDecorator(options) {
        var shortcutStylePatterns = [], fallthroughStylePatterns = [];
        if (options['tripleQuotedStrings']) {
          // '''multi-line-string''', 'single-line-string', and double-quoted
          shortcutStylePatterns.push(
              [PR_STRING,  /^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,
               null, '\'"']);
        } else if (options['multiLineStrings']) {
          // 'multi-line-string', "multi-line-string"
          shortcutStylePatterns.push(
              [PR_STRING,  /^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,
               null, '\'"`']);
        } else {
          // 'single-line-string', "single-line-string"
          shortcutStylePatterns.push(
              [PR_STRING,
               /^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,
               null, '"\'']);
        }
        if (options['verbatimStrings']) {
          // verbatim-string-literal production from the C# grammar.  See issue 93.
          fallthroughStylePatterns.push(
              [PR_STRING, /^@\"(?:[^\"]|\"\")*(?:\"|$)/, null]);
        }
        var hc = options['hashComments'];
        if (hc) {
          if (options['cStyleComments']) {
            if (hc > 1) {  // multiline hash comments
              shortcutStylePatterns.push(
                  [PR_COMMENT, /^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/, null, '#']);
            } else {
              // Stop C preprocessor declarations at an unclosed open comment
              shortcutStylePatterns.push(
                  [PR_COMMENT, /^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,
                   null, '#']);
            }
            fallthroughStylePatterns.push(
                [PR_STRING,
                 /^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,
                 null]);
          } else {
            shortcutStylePatterns.push([PR_COMMENT, /^#[^\r\n]*/, null, '#']);
          }
        }
        if (options['cStyleComments']) {
          fallthroughStylePatterns.push([PR_COMMENT, /^\/\/[^\r\n]*/, null]);
          fallthroughStylePatterns.push(
              [PR_COMMENT, /^\/\*[\s\S]*?(?:\*\/|$)/, null]);
        }
        if (options['regexLiterals']) {
          var REGEX_LITERAL = (
              // A regular expression literal starts with a slash that is
              // not followed by * or / so that it is not confused with
              // comments.
              '/(?=[^/*])'
              // and then contains any number of raw characters,
              + '(?:[^/\\x5B\\x5C]'
              // escape sequences (\x5C),
              +    '|\\x5C[\\s\\S]'
              // or non-nesting character sets (\x5B\x5D);
              +    '|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+'
              // finally closed by a /.
              + '/');
          fallthroughStylePatterns.push(
              ['lang-regex',
               new RegExp('^' + REGEXP_PRECEDER_PATTERN + '(' + REGEX_LITERAL + ')')
               ]);
        }
    
        var keywords = options['keywords'].replace(/^\s+|\s+$/g, '');
        if (keywords.length) {
          fallthroughStylePatterns.push(
              [PR_KEYWORD,
               new RegExp('^(?:' + keywords.replace(/\s+/g, '|') + ')\\b'), null]);
        }
    
        shortcutStylePatterns.push([PR_PLAIN,       /^\s+/, null, ' \r\n\t\xA0']);
        fallthroughStylePatterns.push(
            // TODO(mikesamuel): recognize non-latin letters and numerals in idents
            [PR_LITERAL,     /^@[a-z_$][a-z_$@0-9]*/i, null],
            [PR_TYPE,        /^@?[A-Z]+[a-z][A-Za-z_$@0-9]*/, null],
            [PR_PLAIN,       /^[a-z_$][a-z_$@0-9]*/i, null],
            [PR_LITERAL,
             new RegExp(
                 '^(?:'
                 // A hex number
                 + '0x[a-f0-9]+'
                 // or an octal or decimal number,
                 + '|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)'
                 // possibly in scientific notation
                 + '(?:e[+\\-]?\\d+)?'
                 + ')'
                 // with an optional modifier like UL for unsigned long
                 + '[a-z]*', 'i'),
             null, '0123456789'],
            [PR_PUNCTUATION, /^.[^\s\w\.$@\'\"\`\/\#]*/, null]);
    
        return createSimpleLexer(shortcutStylePatterns, fallthroughStylePatterns);
      }
    
      var decorateSource = sourceDecorator({
            'keywords': ALL_KEYWORDS,
            'hashComments': true,
            'cStyleComments': true,
            'multiLineStrings': true,
            'regexLiterals': true
          });
    
      /** Breaks {@code job.source} around style boundaries in
        * {@code job.decorations} while re-interleaving {@code job.extractedTags},
        * and leaves the result in {@code job.prettyPrintedHtml}.
        * @param {Object} job like {
        *    source: {string} source as plain text,
        *    extractedTags: {Array.<number|string>} extractedTags chunks of raw
        *                   html preceded by their position in {@code job.source}
        *                   in order
        *    decorations: {Array.<number|string} an array of style classes preceded
        *                 by the position at which they start in job.source in order
        * }
        * @private
        */
      function recombineTagsAndDecorations(job) {
        var sourceText = job.source;
        var extractedTags = job.extractedTags;
        var decorations = job.decorations;
        var numberLines = job.numberLines;
        var sourceNode = job.sourceNode;
    
        var html = [];
        // index past the last char in sourceText written to html
        var outputIdx = 0;
    
        var openDecoration = null;
        var currentDecoration = null;
        var tagPos = 0;  // index into extractedTags
        var decPos = 0;  // index into decorations
        var tabExpander = makeTabExpander(window['PR_TAB_WIDTH']);
    
        var adjacentSpaceRe = /([\r\n ]) /g;
        var startOrSpaceRe = /(^| ) /gm;
        var newlineRe = /\r\n?|\n/g;
        var trailingSpaceRe = /[ \r\n]$/;
        var lastWasSpace = true;  // the last text chunk emitted ended with a space.
    
        // See bug 71 and http://stackoverflow.com/questions/136443/why-doesnt-ie7-
        var isIE678 = window['_pr_isIE6']();
        var lineBreakHtml = (
            isIE678
            ? (sourceNode && sourceNode.tagName === 'PRE'
               // Use line feeds instead of <br>s so that copying and pasting works
               // on IE.
               // See Issue 104 for the derivation of this mess.
               ? (isIE678 === 6 ? ' \r\n' :
                  isIE678 === 7 ? ' <br />\r' :
                  isIE678 === 8 ? ' <br />' : ' \r')
               // IE collapses multiple adjacent <br>s into 1 line break.
               // Prefix every newline with ' ' to prevent such behavior.
               //   is the same as   but works in XML as well as HTML.
               : ' <br />')
            : '<br />');
    
        var lineBreaker;
        if (numberLines) {
          var lineBreaks = [];
          for (var i = 0; i < 10; ++i) {
            lineBreaks[i] = lineBreakHtml + '</li><li class="L' + i + '">';
          }
          var lineNum = typeof numberLines === 'number'
              ? numberLines - 1 /* number lines are 1 indexed */ : 0;
          html.push('<ol class="linenums"><li class="L', (lineNum) % 10, '"');
          if (lineNum) {
            html.push(' value="', lineNum + 1, '"');
          }
          html.push('>');
          lineBreaker = function () {
            var lb = lineBreaks[++lineNum % 10];
            // If a decoration is open, we need to close it before closing a list-item
            // and reopen it on the other side of the list item.
            return openDecoration
                ? ('</span>' + lb + '<span class="' + openDecoration + '">') : lb;
          };
        } else {
          lineBreaker = lineBreakHtml;
        }
    
        // A helper function that is responsible for opening sections of decoration
        // and outputing properly escaped chunks of source
        function emitTextUpTo(sourceIdx) {
          if (sourceIdx > outputIdx) {
            if (openDecoration && openDecoration !== currentDecoration) {
              // Close the current decoration
              html.push('</span>');
              openDecoration = null;
            }
            if (!openDecoration && currentDecoration) {
              openDecoration = currentDecoration;
              html.push('<span class="', openDecoration, '">');
            }
            // This interacts badly with some wikis which introduces paragraph tags
            // into pre blocks for some strange reason.
            // It's necessary for IE though which seems to lose the preformattedness
            // of <pre> tags when their innerHTML is assigned.
            // http://stud3.tuwien.ac.at/~e0226430/innerHtmlQuirk.html
            // and it serves to undo the conversion of <br>s to newlines done in
            // chunkify.
            var htmlChunk = textToHtml(
                tabExpander(sourceText.substring(outputIdx, sourceIdx)))
                .replace(lastWasSpace
                         ? startOrSpaceRe
                         : adjacentSpaceRe, '$1 ');
            // Keep track of whether we need to escape space at the beginning of the
            // next chunk.
            lastWasSpace = trailingSpaceRe.test(htmlChunk);
            html.push(htmlChunk.replace(newlineRe, lineBreaker));
            outputIdx = sourceIdx;
          }
        }
    
        while (true) {
          // Determine if we're going to consume a tag this time around.  Otherwise
          // we consume a decoration or exit.
          var outputTag;
          if (tagPos < extractedTags.length) {
            if (decPos < decorations.length) {
              // Pick one giving preference to extractedTags since we shouldn't open
              // a new style that we're going to have to immediately close in order
              // to output a tag.
              outputTag = extractedTags[tagPos] <= decorations[decPos];
            } else {
              outputTag = true;
            }
          } else {
            outputTag = false;
          }
          // Consume either a decoration or a tag or exit.
          if (outputTag) {
            emitTextUpTo(extractedTags[tagPos]);
            if (openDecoration) {
              // Close the current decoration
              html.push('</span>');
              openDecoration = null;
            }
            html.push(extractedTags[tagPos + 1]);
            tagPos += 2;
          } else if (decPos < decorations.length) {
            emitTextUpTo(decorations[decPos]);
            currentDecoration = decorations[decPos + 1];
            decPos += 2;
          } else {
            break;
          }
        }
        emitTextUpTo(sourceText.length);
        if (openDecoration) {
          html.push('</span>');
        }
        if (numberLines) { html.push('</li></ol>'); }
        job.prettyPrintedHtml = html.join('');
      }
    
      /** Maps language-specific file extensions to handlers. */
      var langHandlerRegistry = {};
      /** Register a language handler for the given file extensions.
        * @param {function (Object)} handler a function from source code to a list
        *      of decorations.  Takes a single argument job which describes the
        *      state of the computation.   The single parameter has the form
        *      {@code {
        *        source: {string} as plain text.
        *        decorations: {Array.<number|string>} an array of style classes
        *                     preceded by the position at which they start in
        *                     job.source in order.
        *                     The language handler should assigned this field.
        *        basePos: {int} the position of source in the larger source chunk.
        *                 All positions in the output decorations array are relative
        *                 to the larger source chunk.
        *      } }
        * @param {Array.<string>} fileExtensions
        */
      function registerLangHandler(handler, fileExtensions) {
        for (var i = fileExtensions.length; --i >= 0;) {
          var ext = fileExtensions[i];
          if (!langHandlerRegistry.hasOwnProperty(ext)) {
            langHandlerRegistry[ext] = handler;
          } else if ('console' in window) {
            console['warn']('cannot override language handler %s', ext);
          }
        }
      }
      function langHandlerForExtension(extension, source) {
        if (!(extension && langHandlerRegistry.hasOwnProperty(extension))) {
          // Treat it as markup if the first non whitespace character is a < and
          // the last non-whitespace character is a >.
          extension = /^\s*</.test(source)
              ? 'default-markup'
              : 'default-code';
        }
        return langHandlerRegistry[extension];
      }
      registerLangHandler(decorateSource, ['default-code']);
      registerLangHandler(
          createSimpleLexer(
              [],
              [
               [PR_PLAIN,       /^[^<?]+/],
               [PR_DECLARATION, /^<!\w[^>]*(?:>|$)/],
               [PR_COMMENT,     /^<\!--[\s\S]*?(?:-\->|$)/],
               // Unescaped content in an unknown language
               ['lang-',        /^<\?([\s\S]+?)(?:\?>|$)/],
               ['lang-',        /^<%([\s\S]+?)(?:%>|$)/],
               [PR_PUNCTUATION, /^(?:<[%?]|[%?]>)/],
               ['lang-',        /^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],
               // Unescaped content in javascript.  (Or possibly vbscript).
               ['lang-js',      /^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],
               // Contains unescaped stylesheet content
               ['lang-css',     /^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],
               ['lang-in.tag',  /^(<\/?[a-z][^<>]*>)/i]
              ]),
          ['default-markup', 'htm', 'html', 'mxml', 'xhtml', 'xml', 'xsl']);
      registerLangHandler(
          createSimpleLexer(
              [
               [PR_PLAIN,        /^[\s]+/, null, ' \t\r\n'],
               [PR_ATTRIB_VALUE, /^(?:\"[^\"]*\"?|\'[^\']*\'?)/, null, '\"\'']
               ],
              [
               [PR_TAG,          /^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],
               [PR_ATTRIB_NAME,  /^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],
               ['lang-uq.val',   /^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],
               [PR_PUNCTUATION,  /^[=<>\/]+/],
               ['lang-js',       /^on\w+\s*=\s*\"([^\"]+)\"/i],
               ['lang-js',       /^on\w+\s*=\s*\'([^\']+)\'/i],
               ['lang-js',       /^on\w+\s*=\s*([^\"\'>\s]+)/i],
               ['lang-css',      /^style\s*=\s*\"([^\"]+)\"/i],
               ['lang-css',      /^style\s*=\s*\'([^\']+)\'/i],
               ['lang-css',      /^style\s*=\s*([^\"\'>\s]+)/i]
               ]),
          ['in.tag']);
      registerLangHandler(
          createSimpleLexer([], [[PR_ATTRIB_VALUE, /^[\s\S]+/]]), ['uq.val']);
      registerLangHandler(sourceDecorator({
              'keywords': CPP_KEYWORDS,
              'hashComments': true,
              'cStyleComments': true
            }), ['c', 'cc', 'cpp', 'cxx', 'cyc', 'm']);
      registerLangHandler(sourceDecorator({
              'keywords': 'null true false'
            }), ['json']);
      registerLangHandler(sourceDecorator({
              'keywords': CSHARP_KEYWORDS,
              'hashComments': true,
              'cStyleComments': true,
              'verbatimStrings': true
            }), ['cs']);
      registerLangHandler(sourceDecorator({
              'keywords': JAVA_KEYWORDS,
              'cStyleComments': true
            }), ['java']);
      registerLangHandler(sourceDecorator({
              'keywords': SH_KEYWORDS,
              'hashComments': true,
              'multiLineStrings': true
            }), ['bsh', 'csh', 'sh']);
      registerLangHandler(sourceDecorator({
              'keywords': PYTHON_KEYWORDS,
              'hashComments': true,
              'multiLineStrings': true,
              'tripleQuotedStrings': true
            }), ['cv', 'py']);
      registerLangHandler(sourceDecorator({
              'keywords': PERL_KEYWORDS,
              'hashComments': true,
              'multiLineStrings': true,
              'regexLiterals': true
            }), ['perl', 'pl', 'pm']);
      registerLangHandler(sourceDecorator({
              'keywords': RUBY_KEYWORDS,
              'hashComments': true,
              'multiLineStrings': true,
              'regexLiterals': true
            }), ['rb']);
      registerLangHandler(sourceDecorator({
              'keywords': JSCRIPT_KEYWORDS,
              'cStyleComments': true,
              'regexLiterals': true
            }), ['js']);
      registerLangHandler(sourceDecorator({
              'keywords': COFFEE_KEYWORDS,
              'hashComments': 3,  // ### style block comments
              'cStyleComments': true,
              'multilineStrings': true,
              'tripleQuotedStrings': true,
              'regexLiterals': true
            }), ['coffee']);
      registerLangHandler(createSimpleLexer([], [[PR_STRING, /^[\s\S]+/]]), ['regex']);
    
      function applyDecorator(job) {
        var sourceCodeHtml = job.sourceCodeHtml;
        var opt_langExtension = job.langExtension;
    
        // Prepopulate output in case processing fails with an exception.
        job.prettyPrintedHtml = sourceCodeHtml;
    
        try {
          // Extract tags, and convert the source code to plain text.
          var sourceAndExtractedTags = extractTags(sourceCodeHtml);
          /** Plain text. @type {string} */
          var source = sourceAndExtractedTags.source;
          job.source = source;
          job.basePos = 0;
    
          /** Even entries are positions in source in ascending order.  Odd entries
            * are tags that were extracted at that position.
            * @type {Array.<number|string>}
            */
          job.extractedTags = sourceAndExtractedTags.tags;
    
          // Apply the appropriate language handler
          langHandlerForExtension(opt_langExtension, source)(job);
          // Integrate the decorations and tags back into the source code to produce
          // a decorated html string which is left in job.prettyPrintedHtml.
          recombineTagsAndDecorations(job);
        } catch (e) {
          if ('console' in window) {
            console['log'](e && e['stack'] ? e['stack'] : e);
          }
        }
      }
    
      /**
       * @param sourceCodeHtml {string} The HTML to pretty print.
       * @param opt_langExtension {string} The language name to use.
       *     Typically, a filename extension like 'cpp' or 'java'.
       * @param opt_numberLines {number|boolean} True to number lines,
       *     or the 1-indexed number of the first line in sourceCodeHtml.
       */
      function prettyPrintOne(sourceCodeHtml, opt_langExtension, opt_numberLines) {
        var job = {
          sourceCodeHtml: sourceCodeHtml,
          langExtension: opt_langExtension,
          numberLines: opt_numberLines
        };
        applyDecorator(job);
        return job.prettyPrintedHtml;
      }
    
      function prettyPrint(opt_whenDone) {
        function byTagName(tn) { return document.getElementsByTagName(tn); }
        // fetch a list of nodes to rewrite
        var codeSegments = [byTagName('pre'), byTagName('code'), byTagName('xmp')];
        var elements = [];
        for (var i = 0; i < codeSegments.length; ++i) {
          for (var j = 0, n = codeSegments[i].length; j < n; ++j) {
            elements.push(codeSegments[i][j]);
          }
        }
        codeSegments = null;
    
        var clock = Date;
        if (!clock['now']) {
          clock = { 'now': function () { return (new Date).getTime(); } };
        }
    
        // The loop is broken into a series of continuations to make sure that we
        // don't make the browser unresponsive when rewriting a large page.
        var k = 0;
        var prettyPrintingJob;
    
        function doWork() {
          var endTime = (window['PR_SHOULD_USE_CONTINUATION'] ?
                         clock.now() + 250 /* ms */ :
                         Infinity);
          for (; k < elements.length && clock.now() < endTime; k++) {
            var cs = elements[k];
            if (cs.className && cs.className.indexOf('prettyprint') >= 0) {
              // If the classes includes a language extensions, use it.
              // Language extensions can be specified like
              //     <pre class="prettyprint lang-cpp">
              // the language extension "cpp" is used to find a language handler as
              // passed to PR.registerLangHandler.
              var langExtension = cs.className.match(/\blang-(\w+)\b/);
              if (langExtension) { langExtension = langExtension[1]; }
    
              // make sure this is not nested in an already prettified element
              var nested = false;
              for (var p = cs.parentNode; p; p = p.parentNode) {
                if ((p.tagName === 'pre' || p.tagName === 'code' ||
                     p.tagName === 'xmp') &&
                    p.className && p.className.indexOf('prettyprint') >= 0) {
                  nested = true;
                  break;
                }
              }
              if (!nested) {
                // fetch the content as a snippet of properly escaped HTML.
                // Firefox adds newlines at the end.
                var content = getInnerHtml(cs);
                content = content.replace(/(?:\r\n?|\n)$/, '');
    
                // Look for a class like linenums or linenums:<n> where <n> is the
                // 1-indexed number of the first line.
                var numberLines = cs.className.match(/\blinenums\b(?::(\d+))?/);
    
                // do the pretty printing
                prettyPrintingJob = {
                  sourceCodeHtml: content,
                  langExtension: langExtension,
                  sourceNode: cs,
                  numberLines: numberLines
                      ? numberLines[1] && numberLines[1].length ? +numberLines[1] : true
                      : false
                };
                applyDecorator(prettyPrintingJob);
                replaceWithPrettyPrintedHtml();
              }
            }
          }
          if (k < elements.length) {
            // finish up in a continuation
            setTimeout(doWork, 250);
          } else if (opt_whenDone) {
            opt_whenDone();
          }
        }
    
        function replaceWithPrettyPrintedHtml() {
          var newContent = prettyPrintingJob.prettyPrintedHtml;
          if (!newContent) { return; }
          var cs = prettyPrintingJob.sourceNode;
    
          // push the prettified html back into the tag.
          if (!isRawContent(cs)) {
            // just replace the old html with the new
            cs.innerHTML = newContent;
          } else {
            // we need to change the tag to a <pre> since <xmp>s do not allow
            // embedded tags such as the span tags used to attach styles to
            // sections of source code.
            var pre = document.createElement('PRE');
            for (var i = 0; i < cs.attributes.length; ++i) {
              var a = cs.attributes[i];
              if (a.specified) {
                var aname = a.name.toLowerCase();
                if (aname === 'class') {
                  pre.className = a.value;  // For IE 6
                } else {
                  pre.setAttribute(a.name, a.value);
                }
              }
            }
            pre.innerHTML = newContent;
    
            // remove the old
            cs.parentNode.replaceChild(pre, cs);
            cs = pre;
          }
        }
    
        doWork();
      }
    
      window['PR_normalizedHtml'] = normalizedHtml;
      window['prettyPrintOne'] = prettyPrintOne;
      window['prettyPrint'] = prettyPrint;
      window['PR'] = {
            'combinePrefixPatterns': combinePrefixPatterns,
            'createSimpleLexer': createSimpleLexer,
            'registerLangHandler': registerLangHandler,
            'sourceDecorator': sourceDecorator,
            'PR_ATTRIB_NAME': PR_ATTRIB_NAME,
            'PR_ATTRIB_VALUE': PR_ATTRIB_VALUE,
            'PR_COMMENT': PR_COMMENT,
            'PR_DECLARATION': PR_DECLARATION,
            'PR_KEYWORD': PR_KEYWORD,
            'PR_LITERAL': PR_LITERAL,
            'PR_NOCODE': PR_NOCODE,
            'PR_PLAIN': PR_PLAIN,
            'PR_PUNCTUATION': PR_PUNCTUATION,
            'PR_SOURCE': PR_SOURCE,
            'PR_STRING': PR_STRING,
            'PR_TAG': PR_TAG,
            'PR_TYPE': PR_TYPE
          };
    })();
    
    //third_party/javascript/google_code_prettify/src/lang-apollo.js
    /**
     * @license Copyright (C) 2009 Onno Hommes.
     *
     * Licensed under the Apache License, Version 2.0 (the "License");
     * you may not use this file except in compliance with the License.
     * You may obtain a copy of the License at
     *
     *      http://www.apache.org/licenses/LICENSE-2.0
     *
     * Unless required by applicable law or agreed to in writing, software
     * distributed under the License is distributed on an "AS IS" BASIS,
     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     * See the License for the specific language governing permissions and
     * limitations under the License.
     */
    
    /**
     * @fileoverview
     * Registers a language handler for the AGC/AEA Assembly Language as described
     * at http://virtualagc.googlecode.com
     * <p>
     * This file could be used by goodle code to allow syntax highlight for
     * Virtual AGC SVN repository or if you don't want to commonize
     * the header for the agc/aea html assembly listing.
     *
     * @author ohommes@alumni.cmu.edu
     */
    
    PR['registerLangHandler'](
        PR['createSimpleLexer'](
            [
             // A line comment that starts with ;
             [PR['PR_COMMENT'],     /^#[^\r\n]*/, null, '#'],
             // Whitespace
             [PR['PR_PLAIN'],       /^[\t\n\r \xA0]+/, null, '\t\n\r \xA0'],
             // A double quoted, possibly multi-line, string.
             [PR['PR_STRING'],      /^\"(?:[^\"\\]|\\[\s\S])*(?:\"|$)/, null, '"']
            ],
            [
             [PR['PR_KEYWORD'], /^(?:ADS|AD|AUG|BZF|BZMF|CAE|CAF|CA|CCS|COM|CS|DAS|DCA|DCOM|DCS|DDOUBL|DIM|DOUBLE|DTCB|DTCF|DV|DXCH|EDRUPT|EXTEND|INCR|INDEX|NDX|INHINT|LXCH|MASK|MSK|MP|MSU|NOOP|OVSK|QXCH|RAND|READ|RELINT|RESUME|RETURN|ROR|RXOR|SQUARE|SU|TCR|TCAA|OVSK|TCF|TC|TS|WAND|WOR|WRITE|XCH|XLQ|XXALQ|ZL|ZQ|ADD|ADZ|SUB|SUZ|MPY|MPR|MPZ|DVP|COM|ABS|CLA|CLZ|LDQ|STO|STQ|ALS|LLS|LRS|TRA|TSQ|TMI|TOV|AXT|TIX|DLY|INP|OUT)\s/,null],
             [PR['PR_TYPE'], /^(?:-?GENADR|=MINUS|2BCADR|VN|BOF|MM|-?2CADR|-?[1-6]DNADR|ADRES|BBCON|[SE]?BANK\=?|BLOCK|BNKSUM|E?CADR|COUNT\*?|2?DEC\*?|-?DNCHAN|-?DNPTR|EQUALS|ERASE|MEMORY|2?OCT|REMADR|SETLOC|SUBRO|ORG|BSS|BES|SYN|EQU|DEFINE|END)\s/,null],
             // A single quote possibly followed by a word that optionally ends with
             // = ! or ?.
             [PR['PR_LITERAL'],
              /^\'(?:-*(?:\w|\\[\x21-\x7e])(?:[\w-]*|\\[\x21-\x7e])[=!?]?)?/],
             // Any word including labels that optionally ends with = ! or ?.
             [PR['PR_PLAIN'],
              /^-*(?:[!-z_]|\\[\x21-\x7e])(?:[\w-]*|\\[\x21-\x7e])[=!?]?/i],
             // A printable non-space non-special character
             [PR['PR_PUNCTUATION'], /^[^\w\t\n\r \xA0()\"\\\';]+/]
            ]),
        ['apollo', 'agc', 'aea']);
    
    //third_party/javascript/google_code_prettify/src/lang-clj.js
    /**
     * @license Copyright (C) 2011 Google Inc.
     *
     * Licensed under the Apache License, Version 2.0 (the "License");
     * you may not use this file except in compliance with the License.
     * You may obtain a copy of the License at
     *
     *      http://www.apache.org/licenses/LICENSE-2.0
     *
     * Unless required by applicable law or agreed to in writing, software
     * distributed under the License is distributed on an "AS IS" BASIS,
     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     * See the License for the specific language governing permissions and
     * limitations under the License.
     */
    
    /**
     * @fileoverview
     * Registers a language handler for Clojure.
     *
     *
     * To use, include prettify.js and this file in your HTML page.
     * Then put your code in an HTML tag like
     *      <pre class="prettyprint lang-lisp">(my lisp code)
    * The lang-cl class identifies the language as common lisp.
    * This file supports the following language extensions:
    *     lang-clj - Clojure
    *
    *
    * I used lang-lisp.js as the basis for this adding the clojure specific
    * keywords and syntax.
    *
    * "Name"    = 'Clojure'
    * "Author"  = 'Rich Hickey'
    * "Version" = '1.2'
    * "About"   = 'Clojure is a lisp for the jvm with concurrency primitives and a richer set of types.'
    *
    *
    * I used <a href="http://clojure.org/Reference">Clojure.org Reference</a> as
    * the basis for the reserved word list.
    *
    *
    * @author jwall@google.com
    */
    

    PR['registerLangHandler'](

       PR['createSimpleLexer'](
           [
            // clojure has more paren types than minimal lisp.
            ['opn',             /^[\(\{\[]+/, null, '([{'],
            ['clo',             /^[\)\}\]]+/, null, ')]}'],
            // A line comment that starts with ;
            [PR['PR_COMMENT'],     /^;[^\r\n]*/, null, ';'],
            // Whitespace
            [PR['PR_PLAIN'],       /^[\t\n\r \xA0]+/, null, '\t\n\r \xA0'],
            // A double quoted, possibly multi-line, string.
            [PR['PR_STRING'],      /^\"(?:[^\"\\]|\\[\s\S])*(?:\"|$)/, null, '"']
           ],
           [
            // clojure has a much larger set of keywords
            [PR['PR_KEYWORD'],     /^(?:def|if|do|let|quote|var|fn|loop|recur|throw|try|monitor-enter|monitor-exit|defmacro|defn|defn-|macroexpand|macroexpand-1|for|doseq|dosync|dotimes|and|or|when|not|assert|doto|proxy|defstruct|first|rest|cons|defprotocol|deftype|defrecord|reify|defmulti|defmethod|meta|with-meta|ns|in-ns|create-ns|import|intern|refer|alias|namespace|resolve|ref|deref|refset|new|set!|memfn|to-array|into-array|aset|gen-class|reduce|map|filter|find|nil?|empty?|hash-map|hash-set|vec|vector|seq|flatten|reverse|assoc|dissoc|list|list?|disj|get|union|difference|intersection|extend|extend-type|extend-protocol|prn)\b/, null],
            [PR['PR_TYPE'], /^:[0-9a-zA-Z\-]+/]
           ]),
       ['clj']);
    

    //third_party/javascript/google_code_prettify/src/lang-css.js /**

    * @license Copyright (C) 2009 Google Inc.
    *
    * Licensed under the Apache License, Version 2.0 (the "License");
    * you may not use this file except in compliance with the License.
    * You may obtain a copy of the License at
    *
    *      http://www.apache.org/licenses/LICENSE-2.0
    *
    * Unless required by applicable law or agreed to in writing, software
    * distributed under the License is distributed on an "AS IS" BASIS,
    * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    * See the License for the specific language governing permissions and
    * limitations under the License.
    */
    

    /**

    * @fileoverview
    * Registers a language handler for CSS.
    *
    *
    * To use, include prettify.js and this file in your HTML page.
    * Then put your code in an HTML tag like
    
    *
    
    
    *
    *
    * http://www.w3.org/TR/CSS21/grammar.html Section G2 defines the lexical
    * grammar.  This scheme does not recognize keywords containing escapes.
    *
    * @author mikesamuel@gmail.com
    */
    

    PR['registerLangHandler'](

       PR['createSimpleLexer'](
           [
            // The space production 
            [PR['PR_PLAIN'],       /^[ \t\r\n\f]+/, null, ' \t\r\n\f']
           ],
           [
            // Quoted strings.  <string1> and <string2>
            [PR['PR_STRING'],
             /^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/, null],
            [PR['PR_STRING'],
             /^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/, null],
            ['lang-css-str', /^url\(([^\)\"\']*)\)/i],
            [PR['PR_KEYWORD'],
             /^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,
             null],
            // A property name -- an identifier followed by a colon.
            ['lang-css-kw', /^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],
            // A C style block comment.  The <comment> production.
            [PR['PR_COMMENT'], /^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],
            // Escaping text spans
            [PR['PR_COMMENT'], /^(?:)/],
            // A number possibly containing a suffix.
            [PR['PR_LITERAL'], /^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],
            // A hex color
            [PR['PR_LITERAL'], /^#(?:[0-9a-f]{3}){1,2}/i],
            // An identifier
            [PR['PR_PLAIN'],
             /^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],
            // A run of punctuation
            [PR['PR_PUNCTUATION'], /^[^\s\w\'\"]+/]
           ]),
       ['css']);
    

    PR['registerLangHandler'](

       PR['createSimpleLexer']([],
           [
            [PR['PR_KEYWORD'],
             /^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]
           ]),
       ['css-kw']);
    

    PR['registerLangHandler'](

       PR['createSimpleLexer']([],
           [
            [PR['PR_STRING'], /^[^\)\"\']+/]
           ]),
       ['css-str']);
    

    //third_party/javascript/google_code_prettify/src/lang-go.js /**

    * @license Copyright (C) 2010 Google Inc.
    *
    * Licensed under the Apache License, Version 2.0 (the "License");
    * you may not use this file except in compliance with the License.
    * You may obtain a copy of the License at
    *
    *      http://www.apache.org/licenses/LICENSE-2.0
    *
    * Unless required by applicable law or agreed to in writing, software
    * distributed under the License is distributed on an "AS IS" BASIS,
    * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    * See the License for the specific language governing permissions and
    * limitations under the License.
    */
    

    /**

    * @fileoverview
    * Registers a language handler for the Go language..
    * <p>
    * Based on the lexical grammar at 
    * http://golang.org/doc/go_spec.html#Lexical_elements
    * <p>
    * Go uses a minimal style for highlighting so the below does not distinguish
    * strings, keywords, literals, etc. by design.
    * From a discussion with the Go designers:
    
    *
     * On Thursday, July 22, 2010, Mike Samuel <...> wrote:
     * > On Thu, Jul 22, 2010, Rob 'Commander' Pike <...> wrote:
     * >> Personally, I would vote for the subdued style godoc presents at http://golang.org
     * >>
     * >> Not as fancy as some like, but a case can be made it's the official style.
     * >> If people want more colors, I wouldn't fight too hard, in the interest of
     * >> encouragement through familiarity, but even then I would ask to shy away
     * >> from technicolor starbursts.
     * >
     * > Like http://golang.org/pkg/go/scanner/ where comments are blue and all
     * > other content is black?  I can do that.
     * 
    *
    * @author mikesamuel@gmail.com
    */
    

    PR['registerLangHandler'](

       PR['createSimpleLexer'](
           [
            // Whitespace is made up of spaces, tabs and newline characters.
            [PR['PR_PLAIN'],       /^[\t\n\r \xA0]+/, null, '\t\n\r \xA0'],
            // Not escaped as a string.  See note on minimalism above.
            [PR['PR_PLAIN'],       /^(?:\"(?:[^\"\\]|\\[\s\S])*(?:\"|$)|\'(?:[^\'\\]|\\[\s\S])+(?:\'|$))/, null, '"\]
           ],
           [
            // Block comments are delimited by /* and */.
            // Single-line comments begin with // and extend to the end of a line.
            [PR['PR_COMMENT'],     /^(?:\/\/[^\r\n]*|\/\*[\s\S]*?\*\/)/],
            [PR['PR_PLAIN'],       /^(?:[^\/\"\']|\/(?![\/\*]))+/i]
           ]),
       ['go']);
    

    //third_party/javascript/google_code_prettify/src/lang-hs.js /**

    * @license Copyright (C) 2009 Google Inc.
    *
    * Licensed under the Apache License, Version 2.0 (the "License");
    * you may not use this file except in compliance with the License.
    * You may obtain a copy of the License at
    *
    *      http://www.apache.org/licenses/LICENSE-2.0
    *
    * Unless required by applicable law or agreed to in writing, software
    * distributed under the License is distributed on an "AS IS" BASIS,
    * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    * See the License for the specific language governing permissions and
    * limitations under the License.
    */
    

    /**

    * @fileoverview
    * Registers a language handler for Haskell.
    *
    *
    * To use, include prettify.js and this file in your HTML page.
    * Then put your code in an HTML tag like
    
    *
    (my lisp code)
    * The lang-cl class identifies the language as common lisp.
    * This file supports the following language extensions:
    *     lang-cl - Common Lisp
    *     lang-el - Emacs Lisp
    *     lang-lisp - Lisp
    *     lang-scm - Scheme
    *
    *
    * I used http://www.informatik.uni-freiburg.de/~thiemann/haskell/haskell98-report-html/syntax-iso.html
    * as the basis, but ignore the way the ncomment production nests since this
    * makes the lexical grammar irregular.  It might be possible to support
    * ncomments using the lookbehind filter.
    *
    *
    * @author mikesamuel@gmail.com
    */
    

    PR['registerLangHandler'](

       PR['createSimpleLexer'](
           [
            // Whitespace
            // whitechar    ->    newline | vertab | space | tab | uniWhite
            // newline      ->    return linefeed | return | linefeed | formfeed
            [PR['PR_PLAIN'],       /^[\t\n\x0B\x0C\r ]+/, null, '\t\n\x0B\x0C\r '],
            // Single line double and single-quoted strings.
            // char         ->    ' (graphic<' | \> | space | escape<\&>) '
            // string       ->    " {graphic<" | \> | space | escape | gap}"
            // escape       ->    \ ( charesc | ascii | decimal | o octal
            //                        | x hexadecimal )
            // charesc      ->    a | b | f | n | r | t | v | \ | " | ' | &
            [PR['PR_STRING'],      /^\"(?:[^\"\\\n\x0C\r]|\\[\s\S])*(?:\"|$)/,
             null, '"'],
            [PR['PR_STRING'],      /^\'(?:[^\'\\\n\x0C\r]|\\[^&])\'?/,
             null, "'"],
            // decimal      ->    digit{digit}
            // octal        ->    octit{octit}
            // hexadecimal  ->    hexit{hexit}
            // integer      ->    decimal
            //               |    0o octal | 0O octal
            //               |    0x hexadecimal | 0X hexadecimal
            // float        ->    decimal . decimal [exponent]
            //               |    decimal exponent
            // exponent     ->    (e | E) [+ | -] decimal
            [PR['PR_LITERAL'],
             /^(?:0o[0-7]+|0x[\da-f]+|\d+(?:\.\d+)?(?:e[+\-]?\d+)?)/i,
             null, '0123456789']
           ],
           [
            // Haskell does not have a regular lexical grammar due to the nested
            // ncomment.
            // comment      ->    dashes [ any<symbol> {any}] newline
            // ncomment     ->    opencom ANYseq {ncomment ANYseq}closecom
            // dashes       ->    '--' {'-'}
            // opencom      ->    '{-'
            // closecom     ->    '-}'
            [PR['PR_COMMENT'],     /^(?:(?:--+(?:[^\r\n\x0C]*)?)|(?:\{-(?:[^-]|-+[^-\}])*-\}))/],
            // reservedid   ->    case | class | data | default | deriving | do
            //               |    else | if | import | in | infix | infixl | infixr
            //               |    instance | let | module | newtype | of | then
            //               |    type | where | _
            [PR['PR_KEYWORD'],     /^(?:case|class|data|default|deriving|do|else|if|import|in|infix|infixl|infixr|instance|let|module|newtype|of|then|type|where|_)(?=[^a-zA-Z0-9\']|$)/, null],
            // qvarid       ->    [ modid . ] varid
            // qconid       ->    [ modid . ] conid
            // varid        ->    (small {small | large | digit | ' })<reservedid>
            // conid        ->    large {small | large | digit | ' }
            // modid        ->    conid
            // small        ->    ascSmall | uniSmall | _
            // ascSmall     ->    a | b | ... | z
            // uniSmall     ->    any Unicode lowercase letter
            // large        ->    ascLarge | uniLarge
            // ascLarge     ->    A | B | ... | Z
            // uniLarge     ->    any uppercase or titlecase Unicode letter
            [PR['PR_PLAIN'],  /^(?:[A-Z][\w\']*\.)*[a-zA-Z][\w\']*/],
            // matches the symbol production
            [PR['PR_PUNCTUATION'], /^[^\t\n\x0B\x0C\r a-zA-Z0-9\'\"]+/]
           ]),
       ['hs']);
    

    //third_party/javascript/google_code_prettify/src/lang-lisp.js /**

    * @license Copyright (C) 2008 Google Inc.
    *
    * Licensed under the Apache License, Version 2.0 (the "License");
    * you may not use this file except in compliance with the License.
    * You may obtain a copy of the License at
    *
    *      http://www.apache.org/licenses/LICENSE-2.0
    *
    * Unless required by applicable law or agreed to in writing, software
    * distributed under the License is distributed on an "AS IS" BASIS,
    * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    * See the License for the specific language governing permissions and
    * limitations under the License.
    */
    

    /**

    * @fileoverview
    * Registers a language handler for Common Lisp and related languages.
    *
    *
    * To use, include prettify.js and this file in your HTML page.
    * Then put your code in an HTML tag like
    
    *
    (my lisp code)
    * The lang-cl class identifies the language as common lisp.
    * This file supports the following language extensions:
    *     lang-cl - Common Lisp
    *     lang-el - Emacs Lisp
    *     lang-lisp - Lisp
    *     lang-scm - Scheme
    *
    *
    * I used http://www.devincook.com/goldparser/doc/meta-language/grammar-LISP.htm
    * as the basis, but added line comments that start with ; and changed the atom
    * production to disallow unquoted semicolons.
    *
    * "Name"    = 'LISP'
    * "Author"  = 'John McCarthy'
    * "Version" = 'Minimal'
    * "About"   = 'LISP is an abstract language that organizes ALL'
    *           | 'data around "lists".'
    *
    * "Start Symbol" = [s-Expression]
    *
    * {Atom Char}   = {Printable} - {Whitespace} - [()"\]
    *
    * Atom = ( {Atom Char} | '\'{Printable} )+
    *
    * [s-Expression] ::= [Quote] Atom
    *                  | [Quote] '(' [Series] ')'
    *                  | [Quote] '(' [s-Expression] '.' [s-Expression] ')'
    *
    * [Series] ::= [s-Expression] [Series]
    *            |
    *
    * [Quote]  ::=       !Quote = do not evaluate
    *            |
    *
    *
    * I used <a href="http://gigamonkeys.com/book/">Practical Common Lisp</a> as
    * the basis for the reserved word list.
    *
    *
    * @author mikesamuel@gmail.com
    */
    

    PR['registerLangHandler'](

       PR['createSimpleLexer'](
           [
            ['opn',             /^\(+/, null, '('],
            ['clo',             /^\)+/, null, ')'],
            // A line comment that starts with ;
            [PR['PR_COMMENT'],     /^;[^\r\n]*/, null, ';'],
            // Whitespace
            [PR['PR_PLAIN'],       /^[\t\n\r \xA0]+/, null, '\t\n\r \xA0'],
            // A double quoted, possibly multi-line, string.
            [PR['PR_STRING'],      /^\"(?:[^\"\\]|\\[\s\S])*(?:\"|$)/, null, '"']
           ],
           [
            [PR['PR_KEYWORD'],     /^(?:block|c[ad]+r|catch|con[ds]|def(?:ine|un)|do|eq|eql|equal|equalp|eval-when|flet|format|go|if|labels|lambda|let|load-time-value|locally|macrolet|multiple-value-call|nil|progn|progv|quote|require|return-from|setq|symbol-macrolet|t|tagbody|the|throw|unwind)\b/, null],
            [PR['PR_LITERAL'],
             /^[+\-]?(?:[0#]x[0-9a-f]+|\d+\/\d+|(?:\.\d+|\d+(?:\.\d*)?)(?:[ed][+\-]?\d+)?)/i],
            // A single quote possibly followed by a word that optionally ends with
            // = ! or ?.
            [PR['PR_LITERAL'],
             /^\'(?:-*(?:\w|\\[\x21-\x7e])(?:[\w-]*|\\[\x21-\x7e])[=!?]?)?/],
            // A word that optionally ends with = ! or ?.
            [PR['PR_PLAIN'],
             /^-*(?:[a-z_]|\\[\x21-\x7e])(?:[\w-]*|\\[\x21-\x7e])[=!?]?/i],
            // A printable non-space non-special character
            [PR['PR_PUNCTUATION'], /^[^\w\t\n\r \xA0()\"\\\';]+/]
           ]),
       ['cl', 'el', 'lisp', 'scm']);
    

    //third_party/javascript/google_code_prettify/src/lang-lua.js /**

    * @license Copyright (C) 2008 Google Inc.
    *
    * Licensed under the Apache License, Version 2.0 (the "License");
    * you may not use this file except in compliance with the License.
    * You may obtain a copy of the License at
    *
    *      http://www.apache.org/licenses/LICENSE-2.0
    *
    * Unless required by applicable law or agreed to in writing, software
    * distributed under the License is distributed on an "AS IS" BASIS,
    * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    * See the License for the specific language governing permissions and
    * limitations under the License.
    */
    

    /**

    * @fileoverview
    * Registers a language handler for Lua.
    *
    *
    * To use, include prettify.js and this file in your HTML page.
    * Then put your code in an HTML tag like
    
    *
    (my Lua code)
    *
    *
    * I used http://www.lua.org/manual/5.1/manual.html#2.1
    * Because of the long-bracket concept used in strings and comments, Lua does
    * not have a regular lexical grammar, but luckily it fits within the space
    * of irregular grammars supported by javascript regular expressions.
    *
    * @author mikesamuel@gmail.com
    */
    

    PR['registerLangHandler'](

       PR['createSimpleLexer'](
           [
            // Whitespace
            [PR['PR_PLAIN'],       /^[\t\n\r \xA0]+/, null, '\t\n\r \xA0'],
            // A double or single quoted, possibly multi-line, string.
            [PR['PR_STRING'],      /^(?:\"(?:[^\"\\]|\\[\s\S])*(?:\"|$)|\'(?:[^\'\\]|\\[\s\S])*(?:\'|$))/, null, '"\]
           ],
           [
            // A comment is either a line comment that starts with two dashes, or
            // two dashes preceding a long bracketed block.
            [PR['PR_COMMENT'], /^--(?:\[(=*)\[[\s\S]*?(?:\]\1\]|$)|[^\r\n]*)/],
            // A long bracketed block not preceded by -- is a string.
            [PR['PR_STRING'],  /^\[(=*)\[[\s\S]*?(?:\]\1\]|$)/],
            [PR['PR_KEYWORD'], /^(?:and|break|do|else|elseif|end|false|for|function|if|in|local|nil|not|or|repeat|return|then|true|until|while)\b/, null],
            // A number is a hex integer literal, a decimal real literal, or in
            // scientific notation.
            [PR['PR_LITERAL'],
             /^[+-]?(?:0x[\da-f]+|(?:(?:\.\d+|\d+(?:\.\d*)?)(?:e[+\-]?\d+)?))/i],
            // An identifier
            [PR['PR_PLAIN'], /^[a-z_]\w*/i],
            // A run of punctuation
            [PR['PR_PUNCTUATION'], /^[^\w\t\n\r \xA0][^\w\t\n\r \xA0\"\'\-\+=]*/]
           ]),
       ['lua']);
    

    //third_party/javascript/google_code_prettify/src/lang-ml.js /**

    * @license Copyright (C) 2008 Google Inc.
    *
    * Licensed under the Apache License, Version 2.0 (the "License");
    * you may not use this file except in compliance with the License.
    * You may obtain a copy of the License at
    *
    *      http://www.apache.org/licenses/LICENSE-2.0
    *
    * Unless required by applicable law or agreed to in writing, software
    * distributed under the License is distributed on an "AS IS" BASIS,
    * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    * See the License for the specific language governing permissions and
    * limitations under the License.
    */
    

    /**

    * @fileoverview
    * Registers a language handler for OCaml, SML, F# and similar languages.
    *
    * Based on the lexical grammar at
    * http://research.microsoft.com/en-us/um/cambridge/projects/fsharp/manual/spec.html#_Toc270597388
    *
    * @author mikesamuel@gmail.com
    */
    

    PR['registerLangHandler'](

       PR['createSimpleLexer'](
           [
            // Whitespace is made up of spaces, tabs and newline characters.
            [PR['PR_PLAIN'],       /^[\t\n\r \xA0]+/, null, '\t\n\r \xA0'],
            // #if ident/#else/#endif directives delimit conditional compilation
            // sections
            [PR['PR_COMMENT'],
             /^#(?:if[\t\n\r \xA0]+(?:[a-z_$][\w\']*|``[^\r\n\t`]*(?:``|$))|else|endif|light)/i,
             null, '#'],
            // A double or single quoted, possibly multi-line, string.
            // F# allows escaped newlines in strings.
            [PR['PR_STRING'],      /^(?:\"(?:[^\"\\]|\\[\s\S])*(?:\"|$)|\'(?:[^\'\\]|\\[\s\S])(?:\'|$))/, null, '"\]
           ],
           [
            // Block comments are delimited by (* and *) and may be
            // nested. Single-line comments begin with // and extend to
            // the end of a line.
            // TODO: (*...*) comments can be nested.  This does not handle that.
            [PR['PR_COMMENT'],     /^(?:\/\/[^\r\n]*|\(\*[\s\S]*?\*\))/],
            [PR['PR_KEYWORD'],     /^(?:abstract|and|as|assert|begin|class|default|delegate|do|done|downcast|downto|elif|else|end|exception|extern|false|finally|for|fun|function|if|in|inherit|inline|interface|internal|lazy|let|match|member|module|mutable|namespace|new|null|of|open|or|override|private|public|rec|return|static|struct|then|to|true|try|type|upcast|use|val|void|when|while|with|yield|asr|land|lor|lsl|lsr|lxor|mod|sig|atomic|break|checked|component|const|constraint|constructor|continue|eager|event|external|fixed|functor|global|include|method|mixin|object|parallel|process|protected|pure|sealed|trait|virtual|volatile)\b/],
            // A number is a hex integer literal, a decimal real literal, or in
            // scientific notation.
            [PR['PR_LITERAL'],
             /^[+\-]?(?:0x[\da-f]+|(?:(?:\.\d+|\d+(?:\.\d*)?)(?:e[+\-]?\d+)?))/i],
            [PR['PR_PLAIN'],       /^(?:[a-z_][\w']*[!?#]?|``[^\r\n\t`]*(?:``|$))/i],
            // A printable non-space non-special character
            [PR['PR_PUNCTUATION'], /^[^\t\n\r \xA0\"\'\w]+/]
           ]),
       ['fs', 'ml']);
    

    //third_party/javascript/google_code_prettify/src/lang-proto.js /**

    * @license Copyright (C) 2006 Google Inc.
    *
    * Licensed under the Apache License, Version 2.0 (the "License");
    * you may not use this file except in compliance with the License.
    * You may obtain a copy of the License at
    *
    *      http://www.apache.org/licenses/LICENSE-2.0
    *
    * Unless required by applicable law or agreed to in writing, software
    * distributed under the License is distributed on an "AS IS" BASIS,
    * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    * See the License for the specific language governing permissions and
    * limitations under the License.
    */
    

    /**

    * @fileoverview
    * Registers a language handler for Protocol Buffers as described at
    * http://code.google.com/p/protobuf/.
    *
    * Based on the lexical grammar at
    * http://research.microsoft.com/fsharp/manual/spec2.aspx#_Toc202383715
    *
    * @author mikesamuel@gmail.com
    */
    

    PR['registerLangHandler'](PR['sourceDecorator']({

           'keywords': (
               'bool bytes default double enum extend extensions false fixed32 '
               + 'fixed64 float group import int32 int64 max message option '
               + 'optional package repeated required returns rpc service '
               + 'sfixed32 sfixed64 sint32 sint64 string syntax to true uint32 '
               + 'uint64'),
           'cStyleComments': true
         }), ['proto']);
    

    //third_party/javascript/google_code_prettify/src/lang-scala.js /**

    * @license Copyright (C) 2010 Google Inc.
    *
    * Licensed under the Apache License, Version 2.0 (the "License");
    * you may not use this file except in compliance with the License.
    * You may obtain a copy of the License at
    *
    *      http://www.apache.org/licenses/LICENSE-2.0
    *
    * Unless required by applicable law or agreed to in writing, software
    * distributed under the License is distributed on an "AS IS" BASIS,
    * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    * See the License for the specific language governing permissions and
    * limitations under the License.
    */
    

    /**

    * @fileoverview
    * Registers a language handler for Scala.
    *
    * Derived from http://lampsvn.epfl.ch/svn-repos/scala/scala-documentation/trunk/src/reference/SyntaxSummary.tex
    *
    * @author mikesamuel@gmail.com
    */
    

    PR['registerLangHandler'](

       PR['createSimpleLexer'](
           [
            // Whitespace
            [PR['PR_PLAIN'],       /^[\t\n\r \xA0]+/, null, '\t\n\r \xA0'],
            // A double or single quoted string
             // or a triple double-quoted multi-line string.
            [PR['PR_STRING'],
             /^(?:"(?:(?:""(?:""?(?!")|[^\\"]|\\.)*"{0,3})|(?:[^"\r\n\\]|\\.)*"?))/,
             null, '"'],
            [PR['PR_LITERAL'],     /^`(?:[^\r\n\\`]|\\.)*`?/, null, '`'],
            [PR['PR_PUNCTUATION'], /^[!#%&()*+,\-:;<=>?@\[\\\]^{|}~]+/, null,
             '!#%&()*+,-:;<=>?@[\\]^{|}~']
           ],
           [
            // A symbol literal is a single quote followed by an identifier with no
            // single quote following
            // A character literal has single quotes on either side
            [PR['PR_STRING'],      /^'(?:[^\r\n\\']|\\(?:'|[^\r\n']+))'/],
            [PR['PR_LITERAL'],     /^'[a-zA-Z_$][\w$]*(?!['$\w])/],
            [PR['PR_KEYWORD'],     /^(?:abstract|case|catch|class|def|do|else|extends|final|finally|for|forSome|if|implicit|import|lazy|match|new|object|override|package|private|protected|requires|return|sealed|super|throw|trait|try|type|val|var|while|with|yield)\b/],
            [PR['PR_LITERAL'],     /^(?:true|false|null|this)\b/],
            [PR['PR_LITERAL'],     /^(?:(?:0(?:[0-7]+|X[0-9A-F]+))L?|(?:(?:0|[1-9][0-9]*)(?:(?:\.[0-9]+)?(?:E[+\-]?[0-9]+)?F?|L?))|\\.[0-9]+(?:E[+\-]?[0-9]+)?F?)/i],
            // Treat upper camel case identifiers as types.
            [PR['PR_TYPE'],        /^[$_]*[A-Z][_$A-Z0-9]*[a-z][\w$]*/],
            [PR['PR_PLAIN'],       /^[$a-zA-Z_][\w$]*/],
            [PR['PR_COMMENT'],     /^\/(?:\/.*|\*(?:\/|\**[^*/])*(?:\*+\/?)?)/],
            [PR['PR_PUNCTUATION'], /^(?:\.+|\/)/]
           ]),
       ['scala']);
    

    //third_party/javascript/google_code_prettify/src/lang-sql.js /**

    * @license Copyright (C) 2008 Google Inc.
    *
    * Licensed under the Apache License, Version 2.0 (the "License");
    * you may not use this file except in compliance with the License.
    * You may obtain a copy of the License at
    *
    *      http://www.apache.org/licenses/LICENSE-2.0
    *
    * Unless required by applicable law or agreed to in writing, software
    * distributed under the License is distributed on an "AS IS" BASIS,
    * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    * See the License for the specific language governing permissions and
    * limitations under the License.
    */
    


    /**

    * @fileoverview
    * Registers a language handler for SQL.
    *
    *
    * To use, include prettify.js and this file in your HTML page.
    * Then put your code in an HTML tag like
    
    *
    (my SQL code)
    *
    *
    * http://savage.net.au/SQL/sql-99.bnf.html is the basis for the grammar, and
    * http://msdn.microsoft.com/en-us/library/aa238507(SQL.80).aspx as the basis
    * for the keyword list.
    *
    * @author mikesamuel@gmail.com
    */
    

    PR['registerLangHandler'](

       PR['createSimpleLexer'](
           [
            // Whitespace
            [PR['PR_PLAIN'],       /^[\t\n\r \xA0]+/, null, '\t\n\r \xA0'],
            // A double or single quoted, possibly multi-line, string.
            [PR['PR_STRING'],      /^(?:"(?:[^\"\\]|\\.)*"|'(?:[^\'\\]|\\.)*')/, null,
             '"\]
           ],
           [
            // A comment is either a line comment that starts with two dashes, or
            // two dashes preceding a long bracketed block.
            [PR['PR_COMMENT'], /^(?:--[^\r\n]*|\/\*[\s\S]*?(?:\*\/|$))/],
            [PR['PR_KEYWORD'], /^(?:ADD|ALL|ALTER|AND|ANY|AS|ASC|AUTHORIZATION|BACKUP|BEGIN|BETWEEN|BREAK|BROWSE|BULK|BY|CASCADE|CASE|CHECK|CHECKPOINT|CLOSE|CLUSTERED|COALESCE|COLLATE|COLUMN|COMMIT|COMPUTE|CONSTRAINT|CONTAINS|CONTAINSTABLE|CONTINUE|CONVERT|CREATE|CROSS|CURRENT|CURRENT_DATE|CURRENT_TIME|CURRENT_TIMESTAMP|CURRENT_USER|CURSOR|DATABASE|DBCC|DEALLOCATE|DECLARE|DEFAULT|DELETE|DENY|DESC|DISK|DISTINCT|DISTRIBUTED|DOUBLE|DROP|DUMMY|DUMP|ELSE|END|ERRLVL|ESCAPE|EXCEPT|EXEC|EXECUTE|EXISTS|EXIT|FETCH|FILE|FILLFACTOR|FOR|FOREIGN|FREETEXT|FREETEXTTABLE|FROM|FULL|FUNCTION|GOTO|GRANT|GROUP|HAVING|HOLDLOCK|IDENTITY|IDENTITYCOL|IDENTITY_INSERT|IF|IN|INDEX|INNER|INSERT|INTERSECT|INTO|IS|JOIN|KEY|KILL|LEFT|LIKE|LINENO|LOAD|NATIONAL|NOCHECK|NONCLUSTERED|NOT|NULL|NULLIF|OF|OFF|OFFSETS|ON|OPEN|OPENDATASOURCE|OPENQUERY|OPENROWSET|OPENXML|OPTION|OR|ORDER|OUTER|OVER|PERCENT|PLAN|PRECISION|PRIMARY|PRINT|PROC|PROCEDURE|PUBLIC|RAISERROR|READ|READTEXT|RECONFIGURE|REFERENCES|REPLICATION|RESTORE|RESTRICT|RETURN|REVOKE|RIGHT|ROLLBACK|ROWCOUNT|ROWGUIDCOL|RULE|SAVE|SCHEMA|SELECT|SESSION_USER|SET|SETUSER|SHUTDOWN|SOME|STATISTICS|SYSTEM_USER|TABLE|TEXTSIZE|THEN|TO|TOP|TRAN|TRANSACTION|TRIGGER|TRUNCATE|TSEQUAL|UNION|UNIQUE|UPDATE|UPDATETEXT|USE|USER|VALUES|VARYING|VIEW|WAITFOR|WHEN|WHERE|WHILE|WITH|WRITETEXT)(?=[^\w-]|$)/i, null],
            // A number is a hex integer literal, a decimal real literal, or in
            // scientific notation.
            [PR['PR_LITERAL'],
             /^[+-]?(?:0x[\da-f]+|(?:(?:\.\d+|\d+(?:\.\d*)?)(?:e[+\-]?\d+)?))/i],
            // An identifier
            [PR['PR_PLAIN'], /^[a-z_][\w-]*/i],
            // A run of punctuation
            [PR['PR_PUNCTUATION'], /^[^\w\t\n\r \xA0\"\'][^\w\t\n\r \xA0+\-\"\']*/]
           ]),
       ['sql']);
    

    //third_party/javascript/google_code_prettify/src/lang-swift.js /**

    * @license Copyright (C) 2015 Google Inc.
    * Licensed under the Apache License, Version 2.0 (the "License");
    * you may not use this file except in compliance with the License.
    * You may obtain a copy of the License at
    *
    *      http://www.apache.org/licenses/LICENSE-2.0
    * Unless required by applicable law or agreed to in writing, software
    * distributed under the License is distributed on an "AS IS" BASIS,
    * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    * See the License for the specific language governing permissions and
    * limitations under the License.
    */
    

    /**

    * @fileoverview
    * Registers a language handler for Swift
    *
    *
    * To use, include prettify.js and this file in your HTML page.
    * Then put your code in an HTML tag like
    
    *
    (my swift code)
    * This file supports the following language extensions:
    *     lang-swift - Swift
    *
    * I used https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/AboutTheLanguageReference.html
    * as the basis for this. In particular, I targeted the revision from
    * 2015-04-08. Swift is still evolving, and this was the latest version
    * available at the time. I will keep the code unoptimized to ease changes that come with new Swift standards.
    *
    * @author cerech@google.com
    */
    

    PR['registerLangHandler'](

       PR['createSimpleLexer'](
           [
             //whitespace
             [PR['PR_PLAIN'],                /^[ \n\r\t\v\f\0]+/, null, ' \n\r\t\v\f\0'],
             //string literals
             [PR['PR_STRING'],               /^"(?:[^"\\]|(?:\\.)|(?:\\\((?:[^"\\)]|\\.)*\)))*"/, null, '"']
           ],
           [
             //floating point literals
             [PR['PR_LITERAL'],              /^(?:(?:0x[\da-fA-F][\da-fA-F_]*\.[\da-fA-F][\da-fA-F_]*[pP]?)|(?:\d[\d_]*\.\d[\d_]*[eE]?))[+-]?\d[\d_]*/, null],
             //integer literals
             [PR['PR_LITERAL'],              /^-?(?:(?:0(?:(?:b[01][01_]*)|(?:o[0-7][0-7_]*)|(?:x[\da-fA-F][\da-fA-F_]*)))|(?:\d[\d_]*))/, null],
             //some other literals
             [PR['PR_LITERAL'],              /^(?:true|false|nil)\b/, null],
             //keywords
             [PR['PR_KEYWORD'],              /^\b(?:__COLUMN__|__FILE__|__FUNCTION__|__LINE__|associativity|as|break|case|class|continue|convenience|default|deinit|didSet|do|dynamic|dynamicType|else|enum|fallthrough|final|for|func|get|import|infix|init|inout|internal|if|in|is|lazy|left|let|mutating|none|nonmutating|operator|optional|override|postfix|precedence|prefix|private|protocol|Protocol|public|required|return|right|safe|self|set|static|struct|subscript|super|switch|Type|typealias|unowned|unsafe|var|weak|while|willSet)\b/, null],
             //double slash comments
             [PR['PR_COMMENT'],              /^\/\/.*?[\n\r]/, null],
             //slash star comments
             [PR['PR_COMMENT'],              /^\/\*[\s\S]*?(?:\*\/|$)/, null],
             //punctuation
             [PR['PR_PUNCTUATION'],          /^<<=|<=|<<|>>=|>=|>>|===|==|\.\.\.|&&=|\.\.<|!==|!=|&=|~=|~|\(|\)|\[|\]|{|}|@|#|;|\.|,|:|\|\|=|\?\?|\|\||&&|&\*|&\+|&-|&=|\+=|-=|\/=|\*=|\^=|%=|\|=|->|`|==|\+\+|--|\/|\+|!|\*|%|<|>|&|\||\^|\?|=|-|_/, null],
             [PR['PR_TYPE'],                 /^\b(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/, null]   //borrowing the type regex given by the main program for C-family languages
           ]),
       ['swift']); 
    

    //third_party/javascript/google_code_prettify/src/lang-vb.js /**

    * @license Copyright (C) 2009 Google Inc.
    *
    * Licensed under the Apache License, Version 2.0 (the "License");
    * you may not use this file except in compliance with the License.
    * You may obtain a copy of the License at
    *
    *      http://www.apache.org/licenses/LICENSE-2.0
    *
    * Unless required by applicable law or agreed to in writing, software
    * distributed under the License is distributed on an "AS IS" BASIS,
    * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    * See the License for the specific language governing permissions and
    * limitations under the License.
    */
    


    /**

    * @fileoverview
    * Registers a language handler for various flavors of basic.
    *
    *
    * To use, include prettify.js and this file in your HTML page.
    * Then put your code in an HTML tag like
    
    *
    
    
    *
    *
    * http://msdn.microsoft.com/en-us/library/aa711638(VS.71).aspx defines the
    * visual basic grammar lexical grammar.
    *
    * @author mikesamuel@gmail.com
    */
    

    PR['registerLangHandler'](

       PR['createSimpleLexer'](
           [
            // Whitespace
            [PR['PR_PLAIN'],       /^[\t\n\r \xA0\u2028\u2029]+/, null, '\t\n\r \xA0\u2028\u2029'],
            // A double quoted string with quotes escaped by doubling them.
            // A single character can be suffixed with C.
            [PR['PR_STRING'],      /^(?:[\"\u201C\u201D](?:[^\"\u201C\u201D]|[\"\u201C\u201D]{2})(?:[\"\u201C\u201D]c|$)|[\"\u201C\u201D](?:[^\"\u201C\u201D]|[\"\u201C\u201D]{2})*(?:[\"\u201C\u201D]|$))/i, null,
             '"\u201C\u201D'],
            // A comment starts with a single quote and runs until the end of the
            // line.
            [PR['PR_COMMENT'],     /^[\'\u2018\u2019][^\r\n\u2028\u2029]*/, null, '\'\u2018\u2019']
           ],
           [
            [PR['PR_KEYWORD'], /^(?:AddHandler|AddressOf|Alias|And|AndAlso|Ansi|As|Assembly|Auto|Boolean|ByRef|Byte|ByVal|Call|Case|Catch|CBool|CByte|CChar|CDate|CDbl|CDec|Char|CInt|Class|CLng|CObj|Const|CShort|CSng|CStr|CType|Date|Decimal|Declare|Default|Delegate|Dim|DirectCast|Do|Double|Each|Else|ElseIf|End|EndIf|Enum|Erase|Error|Event|Exit|Finally|For|Friend|Function|Get|GetType|GoSub|GoTo|Handles|If|Implements|Imports|In|Inherits|Integer|Interface|Is|Let|Lib|Like|Long|Loop|Me|Mod|Module|MustInherit|MustOverride|MyBase|MyClass|Namespace|New|Next|Not|NotInheritable|NotOverridable|Object|On|Option|Optional|Or|OrElse|Overloads|Overridable|Overrides|ParamArray|Preserve|Private|Property|Protected|Public|RaiseEvent|ReadOnly|ReDim|RemoveHandler|Resume|Return|Select|Set|Shadows|Shared|Short|Single|Static|Step|Stop|String|Structure|Sub|SyncLock|Then|Throw|To|Try|TypeOf|Unicode|Until|Variant|Wend|When|While|With|WithEvents|WriteOnly|Xor|EndIf|GoSub|Let|Variant|Wend)\b/i, null],
            // A second comment form
            [PR['PR_COMMENT'], /^REM[^\r\n\u2028\u2029]*/i],
            // A boolean, numeric, or date literal.
            [PR['PR_LITERAL'],
             /^(?:True\b|False\b|Nothing\b|\d+(?:E[+\-]?\d+[FRD]?|[FRDSIL])?|(?:&H[0-9A-F]+|&O[0-7]+)[SIL]?|\d*\.\d+(?:E[+\-]?\d+)?[FRD]?|#\s+(?:\d+[\-\/]\d+[\-\/]\d+(?:\s+\d+:\d+(?::\d+)?(\s*(?:AM|PM))?)?|\d+:\d+(?::\d+)?(\s*(?:AM|PM))?)\s+#)/i],
            // An identifier?
            [PR['PR_PLAIN'], /^(?:(?:[a-z]|_\w)\w*|\[(?:[a-z]|_\w)\w*\])/i],
            // A run of punctuation
            [PR['PR_PUNCTUATION'],
             /^[^\w\t\n\r \"\'\[\]\xA0\u2018\u2019\u201C\u201D\u2028\u2029]+/],
            // Square brackets
            [PR['PR_PUNCTUATION'], /^(?:\[|\])/]
           ]),
       ['vb', 'vbs']);
    

    //third_party/javascript/google_code_prettify/src/lang-vhdl.js /**

    * @fileoverview
    * Registers a language handler for VHDL '93.
    *
    * Based on the lexical grammar and keywords at
    * http://www.iis.ee.ethz.ch/~zimmi/download/vhdl93_syntax.html
    *
    * @author benoit@ryder.fr
    */
    

    PR['registerLangHandler'](

       PR['createSimpleLexer'](
           [
            // Whitespace
            [PR['PR_PLAIN'], /^[\t\n\r \xA0]+/, null, '\t\n\r \xA0']
           ],
           [
            // String, character or bit string
            [PR['PR_STRING'], /^(?:[BOX]?"(?:[^\"]|"")*"|'.')/i],
            // Comment, from two dashes until end of line.
            [PR['PR_COMMENT'], /^--[^\r\n]*/],
            [PR['PR_KEYWORD'], /^(?:abs|access|after|alias|all|and|architecture|array|assert|attribute|begin|block|body|buffer|bus|case|component|configuration|constant|disconnect|downto|else|elsif|end|entity|exit|file|for|function|generate|generic|group|guarded|if|impure|in|inertial|inout|is|label|library|linkage|literal|loop|map|mod|nand|new|next|nor|not|null|of|on|open|or|others|out|package|port|postponed|procedure|process|pure|range|record|register|reject|rem|report|return|rol|ror|select|severity|shared|signal|sla|sll|sra|srl|subtype|then|to|transport|type|unaffected|units|until|use|variable|wait|when|while|with|xnor|xor)(?=[^\w-]|$)/i, null],
            // Type, predefined or standard
            [PR['PR_TYPE'], /^(?:bit|bit_vector|character|boolean|integer|real|time|string|severity_level|positive|natural|signed|unsigned|line|text|std_u?logic(?:_vector)?)(?=[^\w-]|$)/i, null],
            // Predefined attributes
            [PR['PR_TYPE'], /^\'(?:ACTIVE|ASCENDING|BASE|DELAYED|DRIVING|DRIVING_VALUE|EVENT|HIGH|IMAGE|INSTANCE_NAME|LAST_ACTIVE|LAST_EVENT|LAST_VALUE|LEFT|LEFTOF|LENGTH|LOW|PATH_NAME|POS|PRED|QUIET|RANGE|REVERSE_RANGE|RIGHT|RIGHTOF|SIMPLE_NAME|STABLE|SUCC|TRANSACTION|VAL|VALUE)(?=[^\w-]|$)/i, null],
            // Number, decimal or based literal
            [PR['PR_LITERAL'], /^\d+(?:_\d+)*(?:#[\w\\.]+#(?:[+\-]?\d+(?:_\d+)*)?|(?:\.\d+(?:_\d+)*)?(?:E[+\-]?\d+(?:_\d+)*)?)/i],
            // Identifier, basic or extended
            [PR['PR_PLAIN'], /^(?:[a-z]\w*|\\[^\\]*\\)/i],
            // Punctuation
            [PR['PR_PUNCTUATION'], /^[^\w\t\n\r \xA0\"\'][^\w\t\n\r \xA0\-\"\']*/]
           ]),
       ['vhdl', 'vhd']);
    

    //third_party/javascript/google_code_prettify/src/lang-wiki.js /**

    * @license Copyright (C) 2009 Google Inc.
    *
    * Licensed under the Apache License, Version 2.0 (the "License");
    * you may not use this file except in compliance with the License.
    * You may obtain a copy of the License at
    *
    *      http://www.apache.org/licenses/LICENSE-2.0
    *
    * Unless required by applicable law or agreed to in writing, software
    * distributed under the License is distributed on an "AS IS" BASIS,
    * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    * See the License for the specific language governing permissions and
    * limitations under the License.
    */
    

    /**

    * @fileoverview
    * Registers a language handler for Wiki pages.
    *
    * Based on WikiSyntax at http://code.google.com/p/support/wiki/WikiSyntax
    *
    * @author mikesamuel@gmail.com
    */
    

    PR['registerLangHandler'](

       PR['createSimpleLexer'](
           [
            // Whitespace
            [PR['PR_PLAIN'],       /^[\t \xA0a-gi-z0-9]+/, null,
             '\t \xA0abcdefgijklmnopqrstuvwxyz0123456789'],
            // Wiki formatting
            [PR['PR_PUNCTUATION'], /^[=*~\^\[\]]+/, null, '=*~^[]']
           ],
           [
            // Meta-info like #summary, #labels, etc.
            ['lang-wiki.meta',  /(?:^^|\r\n?|\n)(#[a-z]+)\b/],
            // A WikiWord
            [PR['PR_LITERAL'],     /^(?:[A-Z][a-z][a-z0-9]+[A-Z][a-z][a-zA-Z0-9]+)\b/
             ],
            // A preformatted block in an unknown language
            ['lang-',           /^\{\{\{([\s\S]+?)\}\}\}/],
            // A block of source code in an unknown language
            ['lang-',           /^`([^\r\n`]+)`/],
            // An inline URL.
            [PR['PR_STRING'],
             /^https?:\/\/[^\/?#\s]*(?:\/[^?#\s]*)?(?:\?[^#\s]*)?(?:#\S*)?/i],
            [PR['PR_PLAIN'],       /^(?:\r\n|[\s\S])[^#=*~^A-Zh\{`\[\r\n]*/]
           ]),
       ['wiki']);
    

    PR['registerLangHandler'](

       PR['createSimpleLexer']([[PR['PR_KEYWORD'], /^#[a-z]+/i, null, '#']], []),
       ['wiki.meta']);
    

    //third_party/javascript/google_code_prettify/src/lang-yaml.js /** Contributed by ribrdb @ code.google.com

    */
    

    /**

    * @fileoverview
    * Registers a language handler for YAML.
    *
    * @author ribrdb
    */
    

    PR['registerLangHandler'](

     PR['createSimpleLexer'](
       [
         [PR['PR_PUNCTUATION'], /^[:|>?]+/, null, ':|>?'],
         [PR['PR_DECLARATION'],  /^%(?:YAML|TAG)[^#\r\n]+/, null, '%'],
         [PR['PR_TYPE'], /^[&]\S+/, null, '&'],
         [PR['PR_TYPE'], /^!\S*/, null, '!'],
         [PR['PR_STRING'], /^"(?:[^\\"]|\\.)*(?:"|$)/, null, '"'],
         [PR['PR_STRING'], /^'(?:[^']|)*(?:'|$)/, null, "'"],
         [PR['PR_COMMENT'], /^#[^\r\n]*/, null, '#'],
         [PR['PR_PLAIN'], /^\s+/, null, ' \t\r\n']
       ],
       [
         [PR['PR_DECLARATION'], /^(?:---|\.\.\.)(?:[\r\n]|$)/],
         [PR['PR_PUNCTUATION'], /^-/],
         [PR['PR_KEYWORD'], /^\w+:[ \r\n]/],
         [PR['PR_PLAIN'], /^\w+/]
       ]), ['yaml', 'yml']);