define([], function() { return (function(e,t,n){function r(n,i){if(!t[n]){if(!e[n]){var s=typeof require=="function"&&require;if(!i&&s)return s(n,!0);throw new Error("Cannot find module '"+n+"'")}var o=t[n]={exports:{}};e[n][0](function(t){var i=e[n][1][t];return r(i?i:t)},o,o.exports)}return t[n].exports}for(var i=0;i<n.length;i++)r(n[i]);

                                                var myexps = {};

                                                for(var i in t) {
                                                    for(var j in t[i].exports){
                                                        myexps[j] = t[i].exports[j]
                                                    }
                                                };
                                                
                                                return myexps;

                                               })({1:[function(require,module,exports){
                                                   var nwmatcher = require("nwmatcher/src/nwmatcher-noqsa");

                                               },{"nwmatcher/src/nwmatcher-noqsa":2}],2:[function(require,module,exports){
                                                   (function(global){/*
                                                                      * Copyright (C) 2007-2013 Diego Perini
                                                                      * All rights reserved.
                                                                      *
                                                                      * nwmatcher-noqsa.js - A fast CSS selector engine and matcher
                                                                      *
                                                                      * Author: Diego Perini <diego.perini at gmail com>
                                                                      * Version: 1.3.1
                                                                      * Created: 20070722
                                                                      * Release: 20130211
                                                                      *
                                                                      * License:
                                                                      *  http://javascript.nwbox.com/NWMatcher/MIT-LICENSE
                                                                      * Download:
                                                                      *  http://javascript.nwbox.com/NWMatcher/nwmatcher.js
                                                                      */

                                                       (function(global, factory) {

                                                           if (typeof module == 'object' && typeof exports == 'object') {
                                                               module.exports = function (browserGlobal) {
                                                                   var exports = { };
                                                                   factory(browserGlobal, exports);
                                                                   return exports;
                                                               };
                                                           } else {
                                                               factory(global,
                                                                       (global.NW || (global.NW = { })) &&
                                                                       (global.NW.Dom || (global.NW.Dom = { })));
                                                           }

                                                       })(this, function(global, exports) {

                                                           var Dom = exports,

                                                           doc = global.document,
                                                           root = doc.documentElement,

                                                           isSingleMatch,
                                                           isSingleSelect,

                                                           lastSlice,
                                                           lastContext,
                                                           lastPosition,

                                                           lastMatcher,
                                                           lastSelector,

                                                           lastPartsMatch,
                                                           lastPartsSelect,

                                                           operators = '([~*^$|!]?={1})',
                                                           combinators = '[\\s]|[>+~][^>+~]',
                                                           pseudoparms = '(?:[-+]?\\d*n)?[-+]?\\d*',

                                                           quotedvalue = '"[^"]*"' + "|'[^']*'",
                                                           skipgroup = '\\[.*\\]|\\(.*\\)|\\{.*\\}',

                                                           encoding = '(?:[-\\w]|[^\\x00-\\xa0]|\\\\.)',
                                                           identifier = '(?:-?[_a-zA-Z]{1}[-\\w]*|[^\\x00-\\xa0]+|\\\\.+)+',

                                                           attrcheck = '(' + quotedvalue + '|' + identifier + ')',
                                                           attributes = '\\s*(' + encoding + '*:?' + encoding + '+)\\s*(?:' + operators + '\\s*' + attrcheck + ')?\\s*',

                                                           attrmatcher = attributes.replace(attrcheck, '([\\x22\\x27]*)((?:\\\\?.)*?)\\3'),

                                                           pseudoclass = '((?:' +
                                                               pseudoparms + '|' + quotedvalue + '|' +
                                                               '[#.:]?|' + encoding + '+|' +
                                                               '\\[' + attributes + '\\]|' +
                                                               '\\(.+\\)|\\s*|' +
                                                               ',)+)',

                                                           extensions = '.+',

                                                           standardValidator =
                                                               '(?=\\s*[^>+~(){}<>])' +
                                                               '(' +
                                                               '\\*' +
                                                               '|(?:[#.:]?' + identifier + ')' +
                                                               '|' + combinators +
                                                               '|\\[' + attributes + '\\]' +
                                                               '|\\(' + pseudoclass + '\\)' +
                                                               '|\\{' + extensions + '\\}' +
                                                               '|(?:,|\\s*)' +
                                                               ')+',

                                                           extendedValidator = standardValidator.replace(pseudoclass, '.*'),

                                                           reValidator = RegExp(standardValidator, 'g'),

                                                           reTrimSpaces = /^\s*|\s*$/g,

                                                           reSimpleNot = RegExp('^(' +
                                                                                '(?!:not)' +
                                                                                '([#.:]?' +
                                                                                '|' + identifier +
                                                                                '|\\([^()]*\\))+' +
                                                                                '|\\[' + attributes + '\\]' +
                                                                                ')$'),

                                                           reSplitGroup = /([^,\\()[\]]+|\[[^[\]]*\]|\[.*\]|\([^()]+\)|\(.*\)|\{[^{}]+\}|\{.*\}|\\.)+/g,

                                                           reSplitToken = RegExp('(' +
                                                                                 '\\[' + attributes + '\\]|' +
                                                                                 '\\(' + pseudoclass + '\\)|' +
                                                                                 '\\\\.|[^\\s>+~])+', 'g'),

                                                           reOptimizeSelector = RegExp(identifier + '|^$'),

                                                           QUIRKS_MODE,
                                                           XML_DOCUMENT,

                                                           GEBTN = 'getElementsByTagName' in doc,
                                                           GEBCN = 'getElementsByClassName' in doc,

                                                           LINK_NODES = { a: 1, A: 1, area: 1, AREA: 1, link: 1, LINK: 1 },

                                                           ATTR_BOOLEAN = {
                                                               checked: 1, disabled: 1, ismap: 1,
                                                               multiple: 1, readonly: 1, selected: 1
                                                           },

                                                           ATTR_DEFAULT = {
                                                               value: 'defaultValue',
                                                               checked: 'defaultChecked',
                                                               selected: 'defaultSelected'
                                                           },

                                                           ATTR_URIDATA = {
                                                               action: 2, cite: 2, codebase: 2, data: 2, href: 2,
                                                               longdesc: 2, lowsrc: 2, src: 2, usemap: 2
                                                           },

                                                           Selectors = {
                                                           },

                                                           Operators = {
                                                               '=': "n=='%m'",
                                                               '^=': "n.indexOf('%m')==0",
                                                               '*=': "n.indexOf('%m')>-1",
                                                               '|=': "(n+'-').indexOf('%m-')==0",
                                                               '~=': "(' '+n+' ').indexOf(' %m ')>-1",
                                                               '$=': "n.substr(n.length-'%m'.length)=='%m'"
                                                           },

                                                           Optimize = {
                                                               ID: RegExp('^\\*?#(' + encoding + '+)|' + skipgroup),
                                                               TAG: RegExp('^(' + encoding + '+)|' + skipgroup),
                                                               CLASS: RegExp('^\\*?\\.(' + encoding + '+$)|' + skipgroup)
                                                           },

                                                           Patterns = {
                                                               spseudos: /^\:(root|empty|(?:first|last|only)(?:-child|-of-type)|nth(?:-last)?(?:-child|-of-type)\(\s*(even|odd|(?:[-+]{0,1}\d*n\s*)?[-+]{0,1}\s*\d*)\s*\))?(.*)/i,
                                                               dpseudos: /^\:(link|visited|target|active|focus|hover|checked|disabled|enabled|selected|lang\(([-\w]{2,})\)|not\(([^()]*|.*)\))?(.*)/i,
                                                               attribute: RegExp('^\\[' + attrmatcher + '\\](.*)'),
                                                               children: /^\s*\>\s*(.*)/,
                                                               adjacent: /^\s*\+\s*(.*)/,
                                                               relative: /^\s*\~\s*(.*)/,
                                                               ancestor: /^\s+(.*)/,
                                                               universal: /^\*(.*)/,
                                                               id: RegExp('^#(' + encoding + '+)(.*)'),
                                                               tagName: RegExp('^(' + encoding + '+)(.*)'),
                                                               className: RegExp('^\\.(' + encoding + '+)(.*)')
                                                           },

                                                           concatCall =
                                                               function(data, elements, callback) {
                                                                   var i = -1, element;
                                                                   while ((element = elements[++i])) {
                                                                       if (false === callback(data[data.length] = element)) { break; }
                                                                   }
                                                                   return data;
                                                               },

                                                           switchContext =
                                                               function(from, force) {
                                                                   var oldDoc = doc;
                                                                   lastContext = from;
                                                                   doc = from.ownerDocument || from;
                                                                   if (force || oldDoc !== doc) {
                                                                       root = doc.documentElement;
                                                                       XML_DOCUMENT = doc.createElement('DiV').nodeName == 'DiV';
                                                                       QUIRKS_MODE = !XML_DOCUMENT &&
                                                                           typeof doc.compatMode == 'string' ?
                                                                           doc.compatMode.indexOf('CSS') < 0 :
                                                                           (function() {
                                                                               var style = doc.createElement('div').style;
                                                                               return style && (style.width = 1) && style.width == '1px';
                                                                           })();

                                                                       Config.CACHING && Dom.setCache(true, doc);
                                                                   }
                                                               },

                                                           byIdRaw =
                                                               function(id, elements) {
                                                                   var i = -1, element = null;
                                                                   while ((element = elements[++i])) {
                                                                       if (element.getAttribute('id') == id) {
                                                                           break;
                                                                       }
                                                                   }
                                                                   return element;
                                                               },

                                                           _byId = !('fileSize' in doc) ?
                                                               function(id, from) {
                                                                   id = id.replace(/\\([^\\]{1})/g, '$1');
                                                                   return from.getElementById && from.getElementById(id) ||
                                                                       byIdRaw(id, from.getElementsByTagName('*'));
                                                               } :
                                                           function(id, from) {
                                                               var element = null;
                                                               id = id.replace(/\\([^\\]{1})/g, '$1');
                                                               if (XML_DOCUMENT || from.nodeType != 9) {
                                                                   return byIdRaw(id, from.getElementsByTagName('*'));
                                                               }
                                                               if ((element = from.getElementById(id)) &&
                                                                   element.name == id && from.getElementsByName) {
                                                                   return byIdRaw(id, from.getElementsByName(id));
                                                               }
                                                               return element;
                                                           },

                                                           byId =
                                                               function(id, from) {
                                                                   from || (from = doc);
                                                                   if (lastContext !== from) { switchContext(from); }
                                                                   return _byId(id, from);
                                                               },

                                                           contains = 'compareDocumentPosition' in root ?
                                                               function(container, element) {
                                                                   return (container.compareDocumentPosition(element) & 16) == 16;
                                                               } : 'contains' in root ?
                                                               function(container, element) {
                                                                   return element.nodeType == 1 && container.contains(element);
                                                               } :
                                                           function(container, element) {
                                                               while ((element = element.parentNode) && element.nodeType == 1) {
                                                                   if (element === container) return true;
                                                               }
                                                               return false;
                                                           },

                                                           getAttribute =
                                                               function(node, attribute) {
                                                                   attribute = attribute.toLowerCase();
                                                                   if (typeof node[attribute] == 'object') {
                                                                       return node.attributes[attribute] &&
                                                                           node.attributes[attribute].value || '';
                                                                   }
                                                                   return (
                                                                       attribute == 'type' ? node.getAttribute(attribute) || '' :
                                                                           ATTR_URIDATA[attribute] ? node.getAttribute(attribute, 2) || '' :
                                                                           ATTR_BOOLEAN[attribute] ? node.getAttribute(attribute) ? attribute : 'false' :
                                                                       ((node = node.getAttributeNode(attribute)) && node.value) || '');
                                                               },

                                                           hasAttribute = root.hasAttribute ?
                                                               function(node, attribute) {
                                                                   return node.hasAttribute(attribute);
                                                               } :
                                                           function(node, attribute) {
                                                               attribute = attribute.toLowerCase();
                                                               if (ATTR_DEFAULT[attribute]) {
                                                                   return !!node[ATTR_DEFAULT[attribute]];
                                                               }
                                                               node = node.getAttributeNode(attribute);
                                                               return !!(node && node.specified);
                                                           },

                                                           isLink =
                                                               function(element) {
                                                                   return element.getAttribute('href') && LINK_NODES[element.nodeName];
                                                               },

                                                           isEmpty =
                                                               function(node) {
                                                                   node = node.firstChild;
                                                                   while (node) {
                                                                       if (node.nodeType == 3 || node.nodeName > '@') return false;
                                                                       node = node.nextSibling;
                                                                   }
                                                                   return true;
                                                               },

                                                           nthElement =
                                                               function(element, last) {
                                                                   var count = 1, succ = last ? 'nextSibling' : 'previousSibling';
                                                                   while ((element = element[succ])) {
                                                                       if (element.nodeName > '@') ++count;
                                                                   }
                                                                   return count;
                                                               },

                                                           nthOfType =
                                                               function(element, last) {
                                                                   var count = 1, succ = last ? 'nextSibling' : 'previousSibling', type = element.nodeName;
                                                                   while ((element = element[succ])) {
                                                                       if (element.nodeName == type) ++count;
                                                                   }
                                                                   return count;
                                                               },

                                                           configure =
                                                               function(option) {
                                                                   if (typeof option == 'string') { return Config[option]; }
                                                                   if (typeof option != 'object') { return false; }
                                                                   for (var i in option) {
                                                                       Config[i] = !!option[i];
                                                                       if (i == 'SIMPLENOT') {
                                                                           matchContexts = { };
                                                                           matchResolvers = { };
                                                                           selectContexts = { };
                                                                           selectResolvers = { };
                                                                       }
                                                                   }
                                                                   reValidator = RegExp(Config.SIMPLENOT ?
                                                                                        standardValidator : extendedValidator, 'g');
                                                                   return true;
                                                               },

                                                           emit =
                                                               function(message) {
                                                                   if (Config.VERBOSITY) { throw Error(message); }
                                                                   if (global.console && global.console.log) {
                                                                       global.console.log(message);
                                                                   }
                                                               },

                                                           Config = {
                                                               CACHING: false,
                                                               SIMPLENOT: true,
                                                               UNIQUE_ID: true,
                                                               USE_HTML5: true,
                                                               VERBOSITY: true
                                                           },

                                                           IE_LT_9 = typeof doc.addEventListener != 'function',

                                                           INSENSITIVE_MAP = {
                                                               href: 1, lang: 1, src: 1, style: 1, title: 1,
                                                               type: 1, xmlns: 1, 'xml:lang': 1, 'xml:space': 1
                                                           },

                                                           TO_UPPER_CASE = IE_LT_9 ? '.toUpperCase()' : '',

                                                           ACCEPT_NODE = 'r[r.length]=c[k];if(f&&false===f(c[k]))break main;else continue main;',
                                                           REJECT_NODE = IE_LT_9 ? 'if(e.nodeName<"A")continue;' : '',

                                                           compile =
                                                               function(selector, source, mode) {

                                                                   var parts = typeof selector == 'string' ? selector.match(reSplitGroup) : selector;

                                                                   typeof source == 'string' || (source = '');

                                                                   if (parts.length == 1) {
                                                                       source += compileSelector(parts[0], mode ? ACCEPT_NODE : 'f&&f(k);return true;', mode);
                                                                   } else {
                                                                       var i = -1, seen = { }, token;
                                                                       while ((token = parts[++i])) {
                                                                           token = token.replace(reTrimSpaces, '');
                                                                           if (!seen[token] && (seen[token] = true)) {
                                                                               source += compileSelector(token, mode ? ACCEPT_NODE : 'f&&f(k);return true;', mode);
                                                                           }
                                                                       }
                                                                   }

                                                                   if (mode) {
                                                                       return Function('c,s,r,d,h,g,f,v',
                                                                                       'var N,n,x=0,k=-1,e;main:while((e=c[++k])){' + source + '}return r;');
                                                                   } else {
                                                                       return Function('e,s,r,d,h,g,f,v',
                                                                                       'var N,n,x=0,k=e;' + source + 'return false;');
                                                                   }
                                                               },

                                                           FILTER =
                                                               'var z=v[@]||(v[@]=[]),l=z.length-1;' +
                                                               'while(l>=0&&z[l]!==e)--l;' +
                                                               'if(l!==-1){break;}' +
                                                               'z[z.length]=e;',

                                                           compileSelector =
                                                               function(selector, source, mode) {

                                                                   var k = 0, expr, match, name, result, status, test, type;

                                                                   while (selector) {

                                                                       k++;

                                                                       if ((match = selector.match(Patterns.universal))) {
                                                                           expr = '';
                                                                       }

                                                                       else if ((match = selector.match(Patterns.id))) {
                                                                           source = 'if(' + (XML_DOCUMENT ?
                                                                                             's.getAttribute(e,"id")' :
                                                                                             '(e.submit?s.getAttribute(e,"id"):e.id)') +
                                                                               '=="' + match[1] + '"' +
                                                                               '){' + source + '}';
                                                                       }

                                                                       else if ((match = selector.match(Patterns.tagName))) {
                                                                           source = 'if(e.nodeName' + (XML_DOCUMENT ?
                                                                                                       '=="' + match[1] + '"' : TO_UPPER_CASE +
                                                                                                       '=="' + match[1].toUpperCase() + '"') +
                                                                               '){' + source + '}';
                                                                       }

                                                                       else if ((match = selector.match(Patterns.className))) {
                                                                           source = 'if((n=' + (XML_DOCUMENT ?
                                                                                                'e.getAttribute("class")' : 'e.className') +
                                                                               ')&&n.length&&(" "+' + (QUIRKS_MODE ? 'n.toLowerCase()' : 'n') +
                                                                               '.replace(/\\s+/g," ")+" ").indexOf(" ' +
                                                                               (QUIRKS_MODE ? match[1].toLowerCase() : match[1]) + ' ")>-1' +
                                                                               '){' + source + '}';
                                                                       }

                                                                       else if ((match = selector.match(Patterns.attribute))) {
                                                                           if (match[2] && !Operators[match[2]]) {
                                                                               emit('Unsupported operator in attribute selectors "' + selector + '"');
                                                                               return '';
                                                                           }
                                                                           test = 'false';
                                                                           if (match[4]) {
                                                                               type = INSENSITIVE_MAP[match[1].toLowerCase()];
                                                                               match[4] =
                                                                                   (type ? match[4].toLowerCase() : match[4])
                                                                                   .replace(/\\([0-9a-f]{2,2})/g, '\\x$1')
                                                                                   .replace(/(\x22|\x27)/g, '\\$1');
                                                                           }
                                                                           if (match[2] && match[4] && (test = Operators[match[2]])) {
                                                                               test = test.replace(/\%m/g, match[4]);
                                                                           } else if (match[2] == '!=' || match[2] == '=') {
                                                                               test = 'n' + match[2] + '="' + match[4] + '"';
                                                                           }
                                                                           expr = 'n=s.' + (match[2] ? 'get' : 'has') + 'Attribute(e,"' + match[1] + '")' + (type ? '.toLowerCase();' : ';');
                                                                           source = expr + 'if(' + (match[2] ? test : 'n') + '){' + source + '}';
                                                                       }

                                                                       else if ((match = selector.match(Patterns.adjacent))) {
                                                                           source = (mode ? '' : FILTER.replace(/@/g, k)) + source;
                                                                           source = 'var N' + k + '=e;while(e&&(e=e.previousSibling)){if(e.nodeName>"@"){' + source + 'break;}}e=N' + k + ';';
                                                                       }

                                                                       else if ((match = selector.match(Patterns.relative))) {
                                                                           source = (mode ? '' : FILTER.replace(/@/g, k)) + source;
                                                                           source = 'var N' + k + '=e;e=e.parentNode.firstChild;while(e&&e!==N' + k + '){if(e.nodeName>"@"){' + source + '}e=e.nextSibling;}e=N' + k + ';';
                                                                       }

                                                                       else if ((match = selector.match(Patterns.children))) {
                                                                           source = (mode ? '' : FILTER.replace(/@/g, k)) + source;
                                                                           source = 'var N' + k + '=e;while(e&&e!==h&&e!==g&&(e=e.parentNode)){' + source + 'break;}e=N' + k + ';';
                                                                       }

                                                                       else if ((match = selector.match(Patterns.ancestor))) {
                                                                           source = (mode ? '' : FILTER.replace(/@/g, k)) + source;
                                                                           source = 'var N' + k + '=e;while(e&&e!==h&&e!==g&&(e=e.parentNode)){' + source + '}e=N' + k + ';';
                                                                       }

                                                                       else if ((match = selector.match(Patterns.spseudos)) && match[1]) {
                                                                           switch (match[1]) {
                                                                           case 'root':
                                                                               if (match[3]) {
                                                                                   source = 'if(e===h||s.contains(h,e)){' + source + '}';
                                                                               } else {
                                                                                   source = 'if(e===h){' + source + '}';
                                                                               }
                                                                               break;
                                                                           case 'empty':
                                                                               source = 'if(s.isEmpty(e)){' + source + '}';
                                                                               break;
                                                                           default:
                                                                               if (match[1] && match[2]) {
                                                                                   if (match[2] == 'n') {
                                                                                       source = 'if(e!==h){' + source + '}';
                                                                                       break;
                                                                                   } else if (match[2] == 'even') {
                                                                                       a = 2;
                                                                                       b = 0;
                                                                                   } else if (match[2] == 'odd') {
                                                                                       a = 2;
                                                                                       b = 1;
                                                                                   } else {
                                                                                       b = ((n = match[2].match(/(-?\d+)$/)) ? parseInt(n[1], 10) : 0);
                                                                                       a = ((n = match[2].match(/(-?\d*)n/i)) ? parseInt(n[1], 10) : 0);
                                                                                       if (n && n[1] == '-') a = -1;
                                                                                   }
                                                                                   test = a > 1 ?
                                                                                       (/last/i.test(match[1])) ? '(n-(' + b + '))%' + a + '==0' :
                                                                                       'n>=' + b + '&&(n-(' + b + '))%' + a + '==0' : a < -1 ?
                                                                                       (/last/i.test(match[1])) ? '(n-(' + b + '))%' + a + '==0' :
                                                                                       'n<=' + b + '&&(n-(' + b + '))%' + a + '==0' : a=== 0 ?
                                                                                       'n==' + b :
                                                                                       (/last/i.test(match[1])) ?
                                                                                       a == -1 ? 'n>=' + b : 'n<=' + b :
                                                                                   a == -1 ? 'n<=' + b : 'n>=' + b;
                                                                                   source =
                                                                                       'if(e!==h){' +
                                                                                       'n=s[' + (/-of-type/i.test(match[1]) ? '"nthOfType"' : '"nthElement"') + ']' +
                                                                                       '(e,' + (/last/i.test(match[1]) ? 'true' : 'false') + ');' +
                                                                                       'if(' + test + '){' + source + '}' +
                                                                                       '}';
                                                                               } else {
                                                                                   a = /first/i.test(match[1]) ? 'previous' : 'next';
                                                                                   n = /only/i.test(match[1]) ? 'previous' : 'next';
                                                                                   b = /first|last/i.test(match[1]);
                                                                                   type = /-of-type/i.test(match[1]) ? '&&n.nodeName!=e.nodeName' : '&&n.nodeName<"@"';
                                                                                   source = 'if(e!==h){' +
                                                                                       ( 'n=e;while((n=n.' + a + 'Sibling)' + type + ');if(!n){' + (b ? source :
                                                                                                                                                    'n=e;while((n=n.' + n + 'Sibling)' + type + ');if(!n){' + source + '}') + '}' ) + '}';
                                                                               }
                                                                               break;
                                                                           }
                                                                       }

                                                                       else if ((match = selector.match(Patterns.dpseudos)) && match[1]) {
                                                                           switch (match[1].match(/^\w+/)[0]) {
                                                                           case 'not':
                                                                               expr = match[3].replace(reTrimSpaces, '');
                                                                               if (Config.SIMPLENOT && !reSimpleNot.test(expr)) {
                                                                                   emit('Negation pseudo-class only accepts simple selectors "' + match.join('') + '"');
                                                                                   return '';
                                                                               } else {
                                                                                   if ('compatMode' in doc) {
                                                                                       source = 'if(!' + compile(expr, '', false) + '(e,s,r,d,h,g)){' + source + '}';
                                                                                   } else {
                                                                                       source = 'if(!s.match(e, "' + expr.replace(/\x22/g, '\\"') + '",g)){' + source +'}';
                                                                                   }
                                                                               }
                                                                               break;
                                                                           case 'checked':
                                                                               source = 'if((typeof e.form!=="undefined"&&(/^(?:radio|checkbox)$/i).test(e.type)&&e.checked)' +
                                                                                   (Config.USE_HTML5 ? '||(/^option$/i.test(e.nodeName)&&(e.selected||e.checked))' : '') +
                                                                                   '){' + source + '}';
                                                                               break;
                                                                           case 'disabled':
                                                                               source = 'if(((typeof e.form!=="undefined"' +
                                                                                   (Config.USE_HTML5 ? '' : '&&!(/^hidden$/i).test(e.type)') +
                                                                                   ')||s.isLink(e))&&e.disabled===true){' + source + '}';
                                                                               break;
                                                                           case 'enabled':
                                                                               source = 'if(((typeof e.form!=="undefined"' +
                                                                                   (Config.USE_HTML5 ? '' : '&&!(/^hidden$/i).test(e.type)') +
                                                                                   ')||s.isLink(e))&&e.disabled===false){' + source + '}';
                                                                               break;
                                                                           case 'lang':
                                                                               test = '';
                                                                               if (match[2]) test = match[2].substr(0, 2) + '-';
                                                                               source = 'do{(n=e.lang||"").toLowerCase();' +
                                                                                   'if((n==""&&h.lang=="' + match[2].toLowerCase() + '")||' +
                                                                                   '(n&&(n=="' + match[2].toLowerCase() +
                                                                                   '"||n.substr(0,3)=="' + test.toLowerCase() + '")))' +
                                                                                   '{' + source + 'break;}}while((e=e.parentNode)&&e!==g);';
                                                                               break;
                                                                           case 'target':
                                                                               n = doc.location ? doc.location.hash : '';
                                                                               if (n) {
                                                                                   source = 'if(e.id=="' + n.slice(1) + '"){' + source + '}';
                                                                               }
                                                                               break;
                                                                           case 'link':
                                                                               source = 'if(s.isLink(e)&&!e.visited){' + source + '}';
                                                                               break;
                                                                           case 'visited':
                                                                               source = 'if(s.isLink(e)&&e.visited){' + source + '}';
                                                                               break;
                                                                           case 'active':
                                                                               source = 'if(e===d.activeElement){' + source + '}';
                                                                               break;
                                                                           case 'hover':
                                                                               source = 'if(e===d.hoverElement){' + source + '}';
                                                                               break;
                                                                           case 'focus':
                                                                               source = 'hasFocus' in doc ?
                                                                                   'if(e===d.activeElement&&d.hasFocus()&&(e.type||e.href||!isNaN(e.tabIndex))){' + source + '}' :
                                                                                   'if(e===d.activeElement&&(e.type||e.href)){' + source + '}';
                                                                               break;
                                                                           case 'selected':
                                                                               source = 'if(/^option$/i.test(e.nodeName)&&(e.selected||e.checked)){' + source + '}';
                                                                               break;
                                                                           default:
                                                                               break;
                                                                           }
                                                                       }

                                                                       else {

                                                                           expr = false;
                                                                           status = false;
                                                                           for (expr in Selectors) {
                                                                               if ((match = selector.match(Selectors[expr].Expression)) && match[1]) {
                                                                                   result = Selectors[expr].Callback(match, source);
                                                                                   source = result.source;
                                                                                   status = result.status;
                                                                                   if (status) { break; }
                                                                               }
                                                                           }

                                                                           if (!status) {
                                                                               emit('Unknown pseudo-class selector "' + selector + '"');
                                                                               return '';
                                                                           }

                                                                           if (!expr) {
                                                                               emit('Unknown token in selector "' + selector + '"');
                                                                               return '';
                                                                           }

                                                                       }

                                                                       if (!match) {
                                                                           emit('Invalid syntax in selector "' + selector + '"');
                                                                           return '';
                                                                       }

                                                                       selector = match && match[match.length - 1];
                                                                   }

                                                                   return source;
                                                               },

                                                           match =
                                                               function(element, selector, from, callback) {

                                                                   var parts;

                                                                   if (!(element && element.nodeName > '@')) {
                                                                       emit('Invalid element argument');
                                                                       return false;
                                                                   } else if (typeof selector != 'string') {
                                                                       emit('Invalid selector argument');
                                                                       return false;
                                                                   } else if (lastContext !== from) {
                                                                       switchContext(from || (from = element.ownerDocument));
                                                                   }

                                                                   selector = selector.replace(reTrimSpaces, '');

                                                                   Config.SHORTCUTS && (selector = NW.Dom.shortcuts(selector, element, from));

                                                                   if (lastMatcher != selector) {
                                                                       if ((parts = selector.match(reValidator)) && parts[0] == selector) {
                                                                           isSingleMatch = (parts = selector.match(reSplitGroup)).length < 2;
                                                                           lastMatcher = selector;
                                                                           lastPartsMatch = parts;
                                                                       } else {
                                                                           emit('The string "' + selector + '", is not a valid CSS selector');
                                                                           return false;
                                                                       }
                                                                   } else parts = lastPartsMatch;

                                                                   if (!matchResolvers[selector] || matchContexts[selector] !== from) {
                                                                       matchResolvers[selector] = compile(isSingleMatch ? [selector] : parts, '', false);
                                                                       matchContexts[selector] = from;
                                                                   }

                                                                   return matchResolvers[selector](element, Snapshot, [ ], doc, root, from, callback, { });
                                                               },

                                                           first =
                                                               function(selector, from) {
                                                                   return select(selector, from, function() { return false; })[0] || null;
                                                               },

                                                           select =
                                                               function(selector, from, callback) {

                                                                   var i, changed, element, elements, parts, token, original = selector;

                                                                   if (arguments.length === 0) {
                                                                       emit('Not enough arguments');
                                                                       return [ ];
                                                                   } else if (typeof selector != 'string') {
                                                                       return [ ];
                                                                   } else if (from && !(/1|9|11/).test(from.nodeType)) {
                                                                       emit('Invalid or illegal context element');
                                                                       return [ ];
                                                                   } else if (lastContext !== from) {
                                                                       switchContext(from || (from = doc));
                                                                   }

                                                                   if (Config.CACHING && (elements = Dom.loadResults(original, from, doc, root))) {
                                                                       return callback ? concatCall([ ], elements, callback) : elements;
                                                                   }

                                                                   selector = selector.replace(reTrimSpaces, '');

                                                                   Config.SHORTCUTS && (selector = NW.Dom.shortcuts(selector, from));

                                                                   if ((changed = lastSelector != selector)) {
                                                                       if ((parts = selector.match(reValidator)) && parts[0] == selector) {
                                                                           isSingleSelect = (parts = selector.match(reSplitGroup)).length < 2;
                                                                           lastSelector = selector;
                                                                           lastPartsSelect = parts;
                                                                       } else {
                                                                           emit('The string "' + selector + '", is not a valid CSS selector');
                                                                           return [ ];
                                                                       }
                                                                   } else parts = lastPartsSelect;

                                                                   if (from.nodeType == 11) {

                                                                       elements = from.childNodes;

                                                                   } else if (isSingleSelect) {

                                                                       if (changed) {
                                                                           parts = selector.match(reSplitToken);
                                                                           token = parts[parts.length - 1];
                                                                           lastSlice = token.split(':not')[0];
                                                                           lastPosition = selector.length - token.length;
                                                                       }

                                                                       if (Config.UNIQUE_ID && (parts = lastSlice.match(Optimize.ID)) && (token = parts[1])) {
                                                                           if ((element = _byId(token, from))) {
                                                                               if (match(element, selector)) {
                                                                                   callback && callback(element);
                                                                                   elements = [ element ];
                                                                               } else elements = [ ];
                                                                           }
                                                                       }

                                                                       else if (Config.UNIQUE_ID && (parts = selector.match(Optimize.ID)) && (token = parts[1])) {
                                                                           if ((element = _byId(token, doc))) {
                                                                               if ('#' + token == selector) {
                                                                                   callback && callback(element);
                                                                                   elements = [ element ];
                                                                               } else if (/[>+~]/.test(selector)) {
                                                                                   from = element.parentNode;
                                                                               } else {
                                                                                   from = element;
                                                                               }
                                                                           } else elements = [ ];
                                                                       }

                                                                       if (elements) {
                                                                           Config.CACHING && Dom.saveResults(original, from, doc, elements);
                                                                           return elements;
                                                                       }

                                                                       if (!XML_DOCUMENT && GEBTN && (parts = lastSlice.match(Optimize.TAG)) && (token = parts[1])) {
                                                                           if ((elements = from.getElementsByTagName(token)).length === 0) { return [ ]; }
                                                                           selector = selector.slice(0, lastPosition) + selector.slice(lastPosition).replace(token, '*');
                                                                       }

                                                                       else if (!XML_DOCUMENT && GEBCN && (parts = lastSlice.match(Optimize.CLASS)) && (token = parts[1])) {
                                                                           if ((elements = from.getElementsByClassName(token.replace(/\\([^\\]{1})/g, '$1'))).length === 0) { return [ ]; }
                                                                           selector = selector.slice(0, lastPosition) + selector.slice(lastPosition).replace('.' + token,
                                                                                                                                                             reOptimizeSelector.test(selector.charAt(selector.indexOf(token) - 1)) ? '' : '*');
                                                                       }

                                                                   }

                                                                   if (!elements) {
                                                                       if (IE_LT_9) {
                                                                           elements = /^(?:applet|object)$/i.test(from.nodeName) ?
                                                                               from.childNodes : from.all;
                                                                       } else {
                                                                           elements = from.getElementsByTagName('*');
                                                                       }
                                                                   }

                                                                   if (!selectResolvers[selector] || selectContexts[selector] !== from) {
                                                                       selectResolvers[selector] = compile(isSingleSelect ? [selector] : parts, REJECT_NODE, true);
                                                                       selectContexts[selector] = from;
                                                                   }

                                                                   elements = selectResolvers[selector](elements, Snapshot, [ ], doc, root, from, callback, { });

                                                                   Config.CACHING && Dom.saveResults(original, from, doc, elements);

                                                                   return elements;
                                                               },

                                                           FN = function(x) { return x; },

                                                           matchContexts = { },
                                                           matchResolvers = { },

                                                           selectContexts = { },
                                                           selectResolvers = { },

                                                           Snapshot = {
                                                               byId: _byId,
                                                               match: match,
                                                               select: select,
                                                               isLink: isLink,
                                                               isEmpty: isEmpty,
                                                               contains: contains,
                                                               nthOfType: nthOfType,
                                                               nthElement: nthElement,
                                                               getAttribute: getAttribute,
                                                               hasAttribute: hasAttribute
                                                           };

                                                           Dom.ACCEPT_NODE = ACCEPT_NODE;

                                                           Dom.byId = byId;
                                                           Dom.match = match;
                                                           Dom.first = first;
                                                           Dom.select = select;
                                                           Dom.compile = compile;
                                                           Dom.contains = contains;
                                                           Dom.configure = configure;
                                                           Dom.getAttribute = getAttribute;
                                                           Dom.hasAttribute = hasAttribute;

                                                           Dom.setCache = FN;
                                                           Dom.shortcuts = FN;
                                                           Dom.loadResults = FN;
                                                           Dom.saveResults = FN;

                                                           Dom.emit = emit;
                                                           Dom.Config = Config;
                                                           Dom.Snapshot = Snapshot;

                                                           Dom.Operators = Operators;
                                                           Dom.Selectors = Selectors;

                                                           Dom.registerOperator =
                                                               function(symbol, resolver) {
                                                                   Operators[symbol] || (Operators[symbol] = resolver);
                                                               };

                                                           Dom.registerSelector =
                                                               function(name, rexp, func) {
                                                                   Selectors[name] || (Selectors[name] = {
                                                                       Expression: rexp,
                                                                       Callback: func
                                                                   });
                                                               };

                                                           switchContext(doc, true);

                                                       });

                                                   })(this)
                                               },{}]},{},[1])
                      })
