(function (global, factory) {
							 | 
						|
								  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
							 | 
						|
								  typeof define === 'function' && define.amd ? define(factory) :
							 | 
						|
								  (global = global || self, global.esquery = factory());
							 | 
						|
								}(this, (function () { 'use strict';
							 | 
						|
								
							 | 
						|
								  function _iterableToArrayLimit(arr, i) {
							 | 
						|
								    var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"];
							 | 
						|
								    if (null != _i) {
							 | 
						|
								      var _s,
							 | 
						|
								        _e,
							 | 
						|
								        _x,
							 | 
						|
								        _r,
							 | 
						|
								        _arr = [],
							 | 
						|
								        _n = !0,
							 | 
						|
								        _d = !1;
							 | 
						|
								      try {
							 | 
						|
								        if (_x = (_i = _i.call(arr)).next, 0 === i) {
							 | 
						|
								          if (Object(_i) !== _i) return;
							 | 
						|
								          _n = !1;
							 | 
						|
								        } else for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i); _n = !0);
							 | 
						|
								      } catch (err) {
							 | 
						|
								        _d = !0, _e = err;
							 | 
						|
								      } finally {
							 | 
						|
								        try {
							 | 
						|
								          if (!_n && null != _i.return && (_r = _i.return(), Object(_r) !== _r)) return;
							 | 
						|
								        } finally {
							 | 
						|
								          if (_d) throw _e;
							 | 
						|
								        }
							 | 
						|
								      }
							 | 
						|
								      return _arr;
							 | 
						|
								    }
							 | 
						|
								  }
							 | 
						|
								  function _typeof(obj) {
							 | 
						|
								    "@babel/helpers - typeof";
							 | 
						|
								
							 | 
						|
								    return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) {
							 | 
						|
								      return typeof obj;
							 | 
						|
								    } : function (obj) {
							 | 
						|
								      return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
							 | 
						|
								    }, _typeof(obj);
							 | 
						|
								  }
							 | 
						|
								  function _slicedToArray(arr, i) {
							 | 
						|
								    return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();
							 | 
						|
								  }
							 | 
						|
								  function _toConsumableArray(arr) {
							 | 
						|
								    return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();
							 | 
						|
								  }
							 | 
						|
								  function _arrayWithoutHoles(arr) {
							 | 
						|
								    if (Array.isArray(arr)) return _arrayLikeToArray(arr);
							 | 
						|
								  }
							 | 
						|
								  function _arrayWithHoles(arr) {
							 | 
						|
								    if (Array.isArray(arr)) return arr;
							 | 
						|
								  }
							 | 
						|
								  function _iterableToArray(iter) {
							 | 
						|
								    if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
							 | 
						|
								  }
							 | 
						|
								  function _unsupportedIterableToArray(o, minLen) {
							 | 
						|
								    if (!o) return;
							 | 
						|
								    if (typeof o === "string") return _arrayLikeToArray(o, minLen);
							 | 
						|
								    var n = Object.prototype.toString.call(o).slice(8, -1);
							 | 
						|
								    if (n === "Object" && o.constructor) n = o.constructor.name;
							 | 
						|
								    if (n === "Map" || n === "Set") return Array.from(o);
							 | 
						|
								    if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
							 | 
						|
								  }
							 | 
						|
								  function _arrayLikeToArray(arr, len) {
							 | 
						|
								    if (len == null || len > arr.length) len = arr.length;
							 | 
						|
								    for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];
							 | 
						|
								    return arr2;
							 | 
						|
								  }
							 | 
						|
								  function _nonIterableSpread() {
							 | 
						|
								    throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
							 | 
						|
								  }
							 | 
						|
								  function _nonIterableRest() {
							 | 
						|
								    throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
							 | 
						|
								  }
							 | 
						|
								
							 | 
						|
								  var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
							 | 
						|
								
							 | 
						|
								  function createCommonjsModule(fn, module) {
							 | 
						|
								  	return module = { exports: {} }, fn(module, module.exports), module.exports;
							 | 
						|
								  }
							 | 
						|
								
							 | 
						|
								  var estraverse = createCommonjsModule(function (module, exports) {
							 | 
						|
								    /*
							 | 
						|
								      Copyright (C) 2012-2013 Yusuke Suzuki <utatane.tea@gmail.com>
							 | 
						|
								      Copyright (C) 2012 Ariya Hidayat <ariya.hidayat@gmail.com>
							 | 
						|
								    
							 | 
						|
								      Redistribution and use in source and binary forms, with or without
							 | 
						|
								      modification, are permitted provided that the following conditions are met:
							 | 
						|
								    
							 | 
						|
								        * Redistributions of source code must retain the above copyright
							 | 
						|
								          notice, this list of conditions and the following disclaimer.
							 | 
						|
								        * Redistributions in binary form must reproduce the above copyright
							 | 
						|
								          notice, this list of conditions and the following disclaimer in the
							 | 
						|
								          documentation and/or other materials provided with the distribution.
							 | 
						|
								    
							 | 
						|
								      THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
							 | 
						|
								      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
							 | 
						|
								      IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
							 | 
						|
								      ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
							 | 
						|
								      DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
							 | 
						|
								      (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
							 | 
						|
								      LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
							 | 
						|
								      ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
							 | 
						|
								      (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
							 | 
						|
								      THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
							 | 
						|
								    */
							 | 
						|
								    /*jslint vars:false, bitwise:true*/
							 | 
						|
								    /*jshint indent:4*/
							 | 
						|
								    /*global exports:true*/
							 | 
						|
								    (function clone(exports) {
							 | 
						|
								
							 | 
						|
								      var Syntax, VisitorOption, VisitorKeys, BREAK, SKIP, REMOVE;
							 | 
						|
								      function deepCopy(obj) {
							 | 
						|
								        var ret = {},
							 | 
						|
								          key,
							 | 
						|
								          val;
							 | 
						|
								        for (key in obj) {
							 | 
						|
								          if (obj.hasOwnProperty(key)) {
							 | 
						|
								            val = obj[key];
							 | 
						|
								            if (typeof val === 'object' && val !== null) {
							 | 
						|
								              ret[key] = deepCopy(val);
							 | 
						|
								            } else {
							 | 
						|
								              ret[key] = val;
							 | 
						|
								            }
							 | 
						|
								          }
							 | 
						|
								        }
							 | 
						|
								        return ret;
							 | 
						|
								      }
							 | 
						|
								
							 | 
						|
								      // based on LLVM libc++ upper_bound / lower_bound
							 | 
						|
								      // MIT License
							 | 
						|
								
							 | 
						|
								      function upperBound(array, func) {
							 | 
						|
								        var diff, len, i, current;
							 | 
						|
								        len = array.length;
							 | 
						|
								        i = 0;
							 | 
						|
								        while (len) {
							 | 
						|
								          diff = len >>> 1;
							 | 
						|
								          current = i + diff;
							 | 
						|
								          if (func(array[current])) {
							 | 
						|
								            len = diff;
							 | 
						|
								          } else {
							 | 
						|
								            i = current + 1;
							 | 
						|
								            len -= diff + 1;
							 | 
						|
								          }
							 | 
						|
								        }
							 | 
						|
								        return i;
							 | 
						|
								      }
							 | 
						|
								      Syntax = {
							 | 
						|
								        AssignmentExpression: 'AssignmentExpression',
							 | 
						|
								        AssignmentPattern: 'AssignmentPattern',
							 | 
						|
								        ArrayExpression: 'ArrayExpression',
							 | 
						|
								        ArrayPattern: 'ArrayPattern',
							 | 
						|
								        ArrowFunctionExpression: 'ArrowFunctionExpression',
							 | 
						|
								        AwaitExpression: 'AwaitExpression',
							 | 
						|
								        // CAUTION: It's deferred to ES7.
							 | 
						|
								        BlockStatement: 'BlockStatement',
							 | 
						|
								        BinaryExpression: 'BinaryExpression',
							 | 
						|
								        BreakStatement: 'BreakStatement',
							 | 
						|
								        CallExpression: 'CallExpression',
							 | 
						|
								        CatchClause: 'CatchClause',
							 | 
						|
								        ChainExpression: 'ChainExpression',
							 | 
						|
								        ClassBody: 'ClassBody',
							 | 
						|
								        ClassDeclaration: 'ClassDeclaration',
							 | 
						|
								        ClassExpression: 'ClassExpression',
							 | 
						|
								        ComprehensionBlock: 'ComprehensionBlock',
							 | 
						|
								        // CAUTION: It's deferred to ES7.
							 | 
						|
								        ComprehensionExpression: 'ComprehensionExpression',
							 | 
						|
								        // CAUTION: It's deferred to ES7.
							 | 
						|
								        ConditionalExpression: 'ConditionalExpression',
							 | 
						|
								        ContinueStatement: 'ContinueStatement',
							 | 
						|
								        DebuggerStatement: 'DebuggerStatement',
							 | 
						|
								        DirectiveStatement: 'DirectiveStatement',
							 | 
						|
								        DoWhileStatement: 'DoWhileStatement',
							 | 
						|
								        EmptyStatement: 'EmptyStatement',
							 | 
						|
								        ExportAllDeclaration: 'ExportAllDeclaration',
							 | 
						|
								        ExportDefaultDeclaration: 'ExportDefaultDeclaration',
							 | 
						|
								        ExportNamedDeclaration: 'ExportNamedDeclaration',
							 | 
						|
								        ExportSpecifier: 'ExportSpecifier',
							 | 
						|
								        ExpressionStatement: 'ExpressionStatement',
							 | 
						|
								        ForStatement: 'ForStatement',
							 | 
						|
								        ForInStatement: 'ForInStatement',
							 | 
						|
								        ForOfStatement: 'ForOfStatement',
							 | 
						|
								        FunctionDeclaration: 'FunctionDeclaration',
							 | 
						|
								        FunctionExpression: 'FunctionExpression',
							 | 
						|
								        GeneratorExpression: 'GeneratorExpression',
							 | 
						|
								        // CAUTION: It's deferred to ES7.
							 | 
						|
								        Identifier: 'Identifier',
							 | 
						|
								        IfStatement: 'IfStatement',
							 | 
						|
								        ImportExpression: 'ImportExpression',
							 | 
						|
								        ImportDeclaration: 'ImportDeclaration',
							 | 
						|
								        ImportDefaultSpecifier: 'ImportDefaultSpecifier',
							 | 
						|
								        ImportNamespaceSpecifier: 'ImportNamespaceSpecifier',
							 | 
						|
								        ImportSpecifier: 'ImportSpecifier',
							 | 
						|
								        Literal: 'Literal',
							 | 
						|
								        LabeledStatement: 'LabeledStatement',
							 | 
						|
								        LogicalExpression: 'LogicalExpression',
							 | 
						|
								        MemberExpression: 'MemberExpression',
							 | 
						|
								        MetaProperty: 'MetaProperty',
							 | 
						|
								        MethodDefinition: 'MethodDefinition',
							 | 
						|
								        ModuleSpecifier: 'ModuleSpecifier',
							 | 
						|
								        NewExpression: 'NewExpression',
							 | 
						|
								        ObjectExpression: 'ObjectExpression',
							 | 
						|
								        ObjectPattern: 'ObjectPattern',
							 | 
						|
								        PrivateIdentifier: 'PrivateIdentifier',
							 | 
						|
								        Program: 'Program',
							 | 
						|
								        Property: 'Property',
							 | 
						|
								        PropertyDefinition: 'PropertyDefinition',
							 | 
						|
								        RestElement: 'RestElement',
							 | 
						|
								        ReturnStatement: 'ReturnStatement',
							 | 
						|
								        SequenceExpression: 'SequenceExpression',
							 | 
						|
								        SpreadElement: 'SpreadElement',
							 | 
						|
								        Super: 'Super',
							 | 
						|
								        SwitchStatement: 'SwitchStatement',
							 | 
						|
								        SwitchCase: 'SwitchCase',
							 | 
						|
								        TaggedTemplateExpression: 'TaggedTemplateExpression',
							 | 
						|
								        TemplateElement: 'TemplateElement',
							 | 
						|
								        TemplateLiteral: 'TemplateLiteral',
							 | 
						|
								        ThisExpression: 'ThisExpression',
							 | 
						|
								        ThrowStatement: 'ThrowStatement',
							 | 
						|
								        TryStatement: 'TryStatement',
							 | 
						|
								        UnaryExpression: 'UnaryExpression',
							 | 
						|
								        UpdateExpression: 'UpdateExpression',
							 | 
						|
								        VariableDeclaration: 'VariableDeclaration',
							 | 
						|
								        VariableDeclarator: 'VariableDeclarator',
							 | 
						|
								        WhileStatement: 'WhileStatement',
							 | 
						|
								        WithStatement: 'WithStatement',
							 | 
						|
								        YieldExpression: 'YieldExpression'
							 | 
						|
								      };
							 | 
						|
								      VisitorKeys = {
							 | 
						|
								        AssignmentExpression: ['left', 'right'],
							 | 
						|
								        AssignmentPattern: ['left', 'right'],
							 | 
						|
								        ArrayExpression: ['elements'],
							 | 
						|
								        ArrayPattern: ['elements'],
							 | 
						|
								        ArrowFunctionExpression: ['params', 'body'],
							 | 
						|
								        AwaitExpression: ['argument'],
							 | 
						|
								        // CAUTION: It's deferred to ES7.
							 | 
						|
								        BlockStatement: ['body'],
							 | 
						|
								        BinaryExpression: ['left', 'right'],
							 | 
						|
								        BreakStatement: ['label'],
							 | 
						|
								        CallExpression: ['callee', 'arguments'],
							 | 
						|
								        CatchClause: ['param', 'body'],
							 | 
						|
								        ChainExpression: ['expression'],
							 | 
						|
								        ClassBody: ['body'],
							 | 
						|
								        ClassDeclaration: ['id', 'superClass', 'body'],
							 | 
						|
								        ClassExpression: ['id', 'superClass', 'body'],
							 | 
						|
								        ComprehensionBlock: ['left', 'right'],
							 | 
						|
								        // CAUTION: It's deferred to ES7.
							 | 
						|
								        ComprehensionExpression: ['blocks', 'filter', 'body'],
							 | 
						|
								        // CAUTION: It's deferred to ES7.
							 | 
						|
								        ConditionalExpression: ['test', 'consequent', 'alternate'],
							 | 
						|
								        ContinueStatement: ['label'],
							 | 
						|
								        DebuggerStatement: [],
							 | 
						|
								        DirectiveStatement: [],
							 | 
						|
								        DoWhileStatement: ['body', 'test'],
							 | 
						|
								        EmptyStatement: [],
							 | 
						|
								        ExportAllDeclaration: ['source'],
							 | 
						|
								        ExportDefaultDeclaration: ['declaration'],
							 | 
						|
								        ExportNamedDeclaration: ['declaration', 'specifiers', 'source'],
							 | 
						|
								        ExportSpecifier: ['exported', 'local'],
							 | 
						|
								        ExpressionStatement: ['expression'],
							 | 
						|
								        ForStatement: ['init', 'test', 'update', 'body'],
							 | 
						|
								        ForInStatement: ['left', 'right', 'body'],
							 | 
						|
								        ForOfStatement: ['left', 'right', 'body'],
							 | 
						|
								        FunctionDeclaration: ['id', 'params', 'body'],
							 | 
						|
								        FunctionExpression: ['id', 'params', 'body'],
							 | 
						|
								        GeneratorExpression: ['blocks', 'filter', 'body'],
							 | 
						|
								        // CAUTION: It's deferred to ES7.
							 | 
						|
								        Identifier: [],
							 | 
						|
								        IfStatement: ['test', 'consequent', 'alternate'],
							 | 
						|
								        ImportExpression: ['source'],
							 | 
						|
								        ImportDeclaration: ['specifiers', 'source'],
							 | 
						|
								        ImportDefaultSpecifier: ['local'],
							 | 
						|
								        ImportNamespaceSpecifier: ['local'],
							 | 
						|
								        ImportSpecifier: ['imported', 'local'],
							 | 
						|
								        Literal: [],
							 | 
						|
								        LabeledStatement: ['label', 'body'],
							 | 
						|
								        LogicalExpression: ['left', 'right'],
							 | 
						|
								        MemberExpression: ['object', 'property'],
							 | 
						|
								        MetaProperty: ['meta', 'property'],
							 | 
						|
								        MethodDefinition: ['key', 'value'],
							 | 
						|
								        ModuleSpecifier: [],
							 | 
						|
								        NewExpression: ['callee', 'arguments'],
							 | 
						|
								        ObjectExpression: ['properties'],
							 | 
						|
								        ObjectPattern: ['properties'],
							 | 
						|
								        PrivateIdentifier: [],
							 | 
						|
								        Program: ['body'],
							 | 
						|
								        Property: ['key', 'value'],
							 | 
						|
								        PropertyDefinition: ['key', 'value'],
							 | 
						|
								        RestElement: ['argument'],
							 | 
						|
								        ReturnStatement: ['argument'],
							 | 
						|
								        SequenceExpression: ['expressions'],
							 | 
						|
								        SpreadElement: ['argument'],
							 | 
						|
								        Super: [],
							 | 
						|
								        SwitchStatement: ['discriminant', 'cases'],
							 | 
						|
								        SwitchCase: ['test', 'consequent'],
							 | 
						|
								        TaggedTemplateExpression: ['tag', 'quasi'],
							 | 
						|
								        TemplateElement: [],
							 | 
						|
								        TemplateLiteral: ['quasis', 'expressions'],
							 | 
						|
								        ThisExpression: [],
							 | 
						|
								        ThrowStatement: ['argument'],
							 | 
						|
								        TryStatement: ['block', 'handler', 'finalizer'],
							 | 
						|
								        UnaryExpression: ['argument'],
							 | 
						|
								        UpdateExpression: ['argument'],
							 | 
						|
								        VariableDeclaration: ['declarations'],
							 | 
						|
								        VariableDeclarator: ['id', 'init'],
							 | 
						|
								        WhileStatement: ['test', 'body'],
							 | 
						|
								        WithStatement: ['object', 'body'],
							 | 
						|
								        YieldExpression: ['argument']
							 | 
						|
								      };
							 | 
						|
								
							 | 
						|
								      // unique id
							 | 
						|
								      BREAK = {};
							 | 
						|
								      SKIP = {};
							 | 
						|
								      REMOVE = {};
							 | 
						|
								      VisitorOption = {
							 | 
						|
								        Break: BREAK,
							 | 
						|
								        Skip: SKIP,
							 | 
						|
								        Remove: REMOVE
							 | 
						|
								      };
							 | 
						|
								      function Reference(parent, key) {
							 | 
						|
								        this.parent = parent;
							 | 
						|
								        this.key = key;
							 | 
						|
								      }
							 | 
						|
								      Reference.prototype.replace = function replace(node) {
							 | 
						|
								        this.parent[this.key] = node;
							 | 
						|
								      };
							 | 
						|
								      Reference.prototype.remove = function remove() {
							 | 
						|
								        if (Array.isArray(this.parent)) {
							 | 
						|
								          this.parent.splice(this.key, 1);
							 | 
						|
								          return true;
							 | 
						|
								        } else {
							 | 
						|
								          this.replace(null);
							 | 
						|
								          return false;
							 | 
						|
								        }
							 | 
						|
								      };
							 | 
						|
								      function Element(node, path, wrap, ref) {
							 | 
						|
								        this.node = node;
							 | 
						|
								        this.path = path;
							 | 
						|
								        this.wrap = wrap;
							 | 
						|
								        this.ref = ref;
							 | 
						|
								      }
							 | 
						|
								      function Controller() {}
							 | 
						|
								
							 | 
						|
								      // API:
							 | 
						|
								      // return property path array from root to current node
							 | 
						|
								      Controller.prototype.path = function path() {
							 | 
						|
								        var i, iz, j, jz, result, element;
							 | 
						|
								        function addToPath(result, path) {
							 | 
						|
								          if (Array.isArray(path)) {
							 | 
						|
								            for (j = 0, jz = path.length; j < jz; ++j) {
							 | 
						|
								              result.push(path[j]);
							 | 
						|
								            }
							 | 
						|
								          } else {
							 | 
						|
								            result.push(path);
							 | 
						|
								          }
							 | 
						|
								        }
							 | 
						|
								
							 | 
						|
								        // root node
							 | 
						|
								        if (!this.__current.path) {
							 | 
						|
								          return null;
							 | 
						|
								        }
							 | 
						|
								
							 | 
						|
								        // first node is sentinel, second node is root element
							 | 
						|
								        result = [];
							 | 
						|
								        for (i = 2, iz = this.__leavelist.length; i < iz; ++i) {
							 | 
						|
								          element = this.__leavelist[i];
							 | 
						|
								          addToPath(result, element.path);
							 | 
						|
								        }
							 | 
						|
								        addToPath(result, this.__current.path);
							 | 
						|
								        return result;
							 | 
						|
								      };
							 | 
						|
								
							 | 
						|
								      // API:
							 | 
						|
								      // return type of current node
							 | 
						|
								      Controller.prototype.type = function () {
							 | 
						|
								        var node = this.current();
							 | 
						|
								        return node.type || this.__current.wrap;
							 | 
						|
								      };
							 | 
						|
								
							 | 
						|
								      // API:
							 | 
						|
								      // return array of parent elements
							 | 
						|
								      Controller.prototype.parents = function parents() {
							 | 
						|
								        var i, iz, result;
							 | 
						|
								
							 | 
						|
								        // first node is sentinel
							 | 
						|
								        result = [];
							 | 
						|
								        for (i = 1, iz = this.__leavelist.length; i < iz; ++i) {
							 | 
						|
								          result.push(this.__leavelist[i].node);
							 | 
						|
								        }
							 | 
						|
								        return result;
							 | 
						|
								      };
							 | 
						|
								
							 | 
						|
								      // API:
							 | 
						|
								      // return current node
							 | 
						|
								      Controller.prototype.current = function current() {
							 | 
						|
								        return this.__current.node;
							 | 
						|
								      };
							 | 
						|
								      Controller.prototype.__execute = function __execute(callback, element) {
							 | 
						|
								        var previous, result;
							 | 
						|
								        result = undefined;
							 | 
						|
								        previous = this.__current;
							 | 
						|
								        this.__current = element;
							 | 
						|
								        this.__state = null;
							 | 
						|
								        if (callback) {
							 | 
						|
								          result = callback.call(this, element.node, this.__leavelist[this.__leavelist.length - 1].node);
							 | 
						|
								        }
							 | 
						|
								        this.__current = previous;
							 | 
						|
								        return result;
							 | 
						|
								      };
							 | 
						|
								
							 | 
						|
								      // API:
							 | 
						|
								      // notify control skip / break
							 | 
						|
								      Controller.prototype.notify = function notify(flag) {
							 | 
						|
								        this.__state = flag;
							 | 
						|
								      };
							 | 
						|
								
							 | 
						|
								      // API:
							 | 
						|
								      // skip child nodes of current node
							 | 
						|
								      Controller.prototype.skip = function () {
							 | 
						|
								        this.notify(SKIP);
							 | 
						|
								      };
							 | 
						|
								
							 | 
						|
								      // API:
							 | 
						|
								      // break traversals
							 | 
						|
								      Controller.prototype['break'] = function () {
							 | 
						|
								        this.notify(BREAK);
							 | 
						|
								      };
							 | 
						|
								
							 | 
						|
								      // API:
							 | 
						|
								      // remove node
							 | 
						|
								      Controller.prototype.remove = function () {
							 | 
						|
								        this.notify(REMOVE);
							 | 
						|
								      };
							 | 
						|
								      Controller.prototype.__initialize = function (root, visitor) {
							 | 
						|
								        this.visitor = visitor;
							 | 
						|
								        this.root = root;
							 | 
						|
								        this.__worklist = [];
							 | 
						|
								        this.__leavelist = [];
							 | 
						|
								        this.__current = null;
							 | 
						|
								        this.__state = null;
							 | 
						|
								        this.__fallback = null;
							 | 
						|
								        if (visitor.fallback === 'iteration') {
							 | 
						|
								          this.__fallback = Object.keys;
							 | 
						|
								        } else if (typeof visitor.fallback === 'function') {
							 | 
						|
								          this.__fallback = visitor.fallback;
							 | 
						|
								        }
							 | 
						|
								        this.__keys = VisitorKeys;
							 | 
						|
								        if (visitor.keys) {
							 | 
						|
								          this.__keys = Object.assign(Object.create(this.__keys), visitor.keys);
							 | 
						|
								        }
							 | 
						|
								      };
							 | 
						|
								      function isNode(node) {
							 | 
						|
								        if (node == null) {
							 | 
						|
								          return false;
							 | 
						|
								        }
							 | 
						|
								        return typeof node === 'object' && typeof node.type === 'string';
							 | 
						|
								      }
							 | 
						|
								      function isProperty(nodeType, key) {
							 | 
						|
								        return (nodeType === Syntax.ObjectExpression || nodeType === Syntax.ObjectPattern) && 'properties' === key;
							 | 
						|
								      }
							 | 
						|
								      function candidateExistsInLeaveList(leavelist, candidate) {
							 | 
						|
								        for (var i = leavelist.length - 1; i >= 0; --i) {
							 | 
						|
								          if (leavelist[i].node === candidate) {
							 | 
						|
								            return true;
							 | 
						|
								          }
							 | 
						|
								        }
							 | 
						|
								        return false;
							 | 
						|
								      }
							 | 
						|
								      Controller.prototype.traverse = function traverse(root, visitor) {
							 | 
						|
								        var worklist, leavelist, element, node, nodeType, ret, key, current, current2, candidates, candidate, sentinel;
							 | 
						|
								        this.__initialize(root, visitor);
							 | 
						|
								        sentinel = {};
							 | 
						|
								
							 | 
						|
								        // reference
							 | 
						|
								        worklist = this.__worklist;
							 | 
						|
								        leavelist = this.__leavelist;
							 | 
						|
								
							 | 
						|
								        // initialize
							 | 
						|
								        worklist.push(new Element(root, null, null, null));
							 | 
						|
								        leavelist.push(new Element(null, null, null, null));
							 | 
						|
								        while (worklist.length) {
							 | 
						|
								          element = worklist.pop();
							 | 
						|
								          if (element === sentinel) {
							 | 
						|
								            element = leavelist.pop();
							 | 
						|
								            ret = this.__execute(visitor.leave, element);
							 | 
						|
								            if (this.__state === BREAK || ret === BREAK) {
							 | 
						|
								              return;
							 | 
						|
								            }
							 | 
						|
								            continue;
							 | 
						|
								          }
							 | 
						|
								          if (element.node) {
							 | 
						|
								            ret = this.__execute(visitor.enter, element);
							 | 
						|
								            if (this.__state === BREAK || ret === BREAK) {
							 | 
						|
								              return;
							 | 
						|
								            }
							 | 
						|
								            worklist.push(sentinel);
							 | 
						|
								            leavelist.push(element);
							 | 
						|
								            if (this.__state === SKIP || ret === SKIP) {
							 | 
						|
								              continue;
							 | 
						|
								            }
							 | 
						|
								            node = element.node;
							 | 
						|
								            nodeType = node.type || element.wrap;
							 | 
						|
								            candidates = this.__keys[nodeType];
							 | 
						|
								            if (!candidates) {
							 | 
						|
								              if (this.__fallback) {
							 | 
						|
								                candidates = this.__fallback(node);
							 | 
						|
								              } else {
							 | 
						|
								                throw new Error('Unknown node type ' + nodeType + '.');
							 | 
						|
								              }
							 | 
						|
								            }
							 | 
						|
								            current = candidates.length;
							 | 
						|
								            while ((current -= 1) >= 0) {
							 | 
						|
								              key = candidates[current];
							 | 
						|
								              candidate = node[key];
							 | 
						|
								              if (!candidate) {
							 | 
						|
								                continue;
							 | 
						|
								              }
							 | 
						|
								              if (Array.isArray(candidate)) {
							 | 
						|
								                current2 = candidate.length;
							 | 
						|
								                while ((current2 -= 1) >= 0) {
							 | 
						|
								                  if (!candidate[current2]) {
							 | 
						|
								                    continue;
							 | 
						|
								                  }
							 | 
						|
								                  if (candidateExistsInLeaveList(leavelist, candidate[current2])) {
							 | 
						|
								                    continue;
							 | 
						|
								                  }
							 | 
						|
								                  if (isProperty(nodeType, candidates[current])) {
							 | 
						|
								                    element = new Element(candidate[current2], [key, current2], 'Property', null);
							 | 
						|
								                  } else if (isNode(candidate[current2])) {
							 | 
						|
								                    element = new Element(candidate[current2], [key, current2], null, null);
							 | 
						|
								                  } else {
							 | 
						|
								                    continue;
							 | 
						|
								                  }
							 | 
						|
								                  worklist.push(element);
							 | 
						|
								                }
							 | 
						|
								              } else if (isNode(candidate)) {
							 | 
						|
								                if (candidateExistsInLeaveList(leavelist, candidate)) {
							 | 
						|
								                  continue;
							 | 
						|
								                }
							 | 
						|
								                worklist.push(new Element(candidate, key, null, null));
							 | 
						|
								              }
							 | 
						|
								            }
							 | 
						|
								          }
							 | 
						|
								        }
							 | 
						|
								      };
							 | 
						|
								      Controller.prototype.replace = function replace(root, visitor) {
							 | 
						|
								        var worklist, leavelist, node, nodeType, target, element, current, current2, candidates, candidate, sentinel, outer, key;
							 | 
						|
								        function removeElem(element) {
							 | 
						|
								          var i, key, nextElem, parent;
							 | 
						|
								          if (element.ref.remove()) {
							 | 
						|
								            // When the reference is an element of an array.
							 | 
						|
								            key = element.ref.key;
							 | 
						|
								            parent = element.ref.parent;
							 | 
						|
								
							 | 
						|
								            // If removed from array, then decrease following items' keys.
							 | 
						|
								            i = worklist.length;
							 | 
						|
								            while (i--) {
							 | 
						|
								              nextElem = worklist[i];
							 | 
						|
								              if (nextElem.ref && nextElem.ref.parent === parent) {
							 | 
						|
								                if (nextElem.ref.key < key) {
							 | 
						|
								                  break;
							 | 
						|
								                }
							 | 
						|
								                --nextElem.ref.key;
							 | 
						|
								              }
							 | 
						|
								            }
							 | 
						|
								          }
							 | 
						|
								        }
							 | 
						|
								        this.__initialize(root, visitor);
							 | 
						|
								        sentinel = {};
							 | 
						|
								
							 | 
						|
								        // reference
							 | 
						|
								        worklist = this.__worklist;
							 | 
						|
								        leavelist = this.__leavelist;
							 | 
						|
								
							 | 
						|
								        // initialize
							 | 
						|
								        outer = {
							 | 
						|
								          root: root
							 | 
						|
								        };
							 | 
						|
								        element = new Element(root, null, null, new Reference(outer, 'root'));
							 | 
						|
								        worklist.push(element);
							 | 
						|
								        leavelist.push(element);
							 | 
						|
								        while (worklist.length) {
							 | 
						|
								          element = worklist.pop();
							 | 
						|
								          if (element === sentinel) {
							 | 
						|
								            element = leavelist.pop();
							 | 
						|
								            target = this.__execute(visitor.leave, element);
							 | 
						|
								
							 | 
						|
								            // node may be replaced with null,
							 | 
						|
								            // so distinguish between undefined and null in this place
							 | 
						|
								            if (target !== undefined && target !== BREAK && target !== SKIP && target !== REMOVE) {
							 | 
						|
								              // replace
							 | 
						|
								              element.ref.replace(target);
							 | 
						|
								            }
							 | 
						|
								            if (this.__state === REMOVE || target === REMOVE) {
							 | 
						|
								              removeElem(element);
							 | 
						|
								            }
							 | 
						|
								            if (this.__state === BREAK || target === BREAK) {
							 | 
						|
								              return outer.root;
							 | 
						|
								            }
							 | 
						|
								            continue;
							 | 
						|
								          }
							 | 
						|
								          target = this.__execute(visitor.enter, element);
							 | 
						|
								
							 | 
						|
								          // node may be replaced with null,
							 | 
						|
								          // so distinguish between undefined and null in this place
							 | 
						|
								          if (target !== undefined && target !== BREAK && target !== SKIP && target !== REMOVE) {
							 | 
						|
								            // replace
							 | 
						|
								            element.ref.replace(target);
							 | 
						|
								            element.node = target;
							 | 
						|
								          }
							 | 
						|
								          if (this.__state === REMOVE || target === REMOVE) {
							 | 
						|
								            removeElem(element);
							 | 
						|
								            element.node = null;
							 | 
						|
								          }
							 | 
						|
								          if (this.__state === BREAK || target === BREAK) {
							 | 
						|
								            return outer.root;
							 | 
						|
								          }
							 | 
						|
								
							 | 
						|
								          // node may be null
							 | 
						|
								          node = element.node;
							 | 
						|
								          if (!node) {
							 | 
						|
								            continue;
							 | 
						|
								          }
							 | 
						|
								          worklist.push(sentinel);
							 | 
						|
								          leavelist.push(element);
							 | 
						|
								          if (this.__state === SKIP || target === SKIP) {
							 | 
						|
								            continue;
							 | 
						|
								          }
							 | 
						|
								          nodeType = node.type || element.wrap;
							 | 
						|
								          candidates = this.__keys[nodeType];
							 | 
						|
								          if (!candidates) {
							 | 
						|
								            if (this.__fallback) {
							 | 
						|
								              candidates = this.__fallback(node);
							 | 
						|
								            } else {
							 | 
						|
								              throw new Error('Unknown node type ' + nodeType + '.');
							 | 
						|
								            }
							 | 
						|
								          }
							 | 
						|
								          current = candidates.length;
							 | 
						|
								          while ((current -= 1) >= 0) {
							 | 
						|
								            key = candidates[current];
							 | 
						|
								            candidate = node[key];
							 | 
						|
								            if (!candidate) {
							 | 
						|
								              continue;
							 | 
						|
								            }
							 | 
						|
								            if (Array.isArray(candidate)) {
							 | 
						|
								              current2 = candidate.length;
							 | 
						|
								              while ((current2 -= 1) >= 0) {
							 | 
						|
								                if (!candidate[current2]) {
							 | 
						|
								                  continue;
							 | 
						|
								                }
							 | 
						|
								                if (isProperty(nodeType, candidates[current])) {
							 | 
						|
								                  element = new Element(candidate[current2], [key, current2], 'Property', new Reference(candidate, current2));
							 | 
						|
								                } else if (isNode(candidate[current2])) {
							 | 
						|
								                  element = new Element(candidate[current2], [key, current2], null, new Reference(candidate, current2));
							 | 
						|
								                } else {
							 | 
						|
								                  continue;
							 | 
						|
								                }
							 | 
						|
								                worklist.push(element);
							 | 
						|
								              }
							 | 
						|
								            } else if (isNode(candidate)) {
							 | 
						|
								              worklist.push(new Element(candidate, key, null, new Reference(node, key)));
							 | 
						|
								            }
							 | 
						|
								          }
							 | 
						|
								        }
							 | 
						|
								        return outer.root;
							 | 
						|
								      };
							 | 
						|
								      function traverse(root, visitor) {
							 | 
						|
								        var controller = new Controller();
							 | 
						|
								        return controller.traverse(root, visitor);
							 | 
						|
								      }
							 | 
						|
								      function replace(root, visitor) {
							 | 
						|
								        var controller = new Controller();
							 | 
						|
								        return controller.replace(root, visitor);
							 | 
						|
								      }
							 | 
						|
								      function extendCommentRange(comment, tokens) {
							 | 
						|
								        var target;
							 | 
						|
								        target = upperBound(tokens, function search(token) {
							 | 
						|
								          return token.range[0] > comment.range[0];
							 | 
						|
								        });
							 | 
						|
								        comment.extendedRange = [comment.range[0], comment.range[1]];
							 | 
						|
								        if (target !== tokens.length) {
							 | 
						|
								          comment.extendedRange[1] = tokens[target].range[0];
							 | 
						|
								        }
							 | 
						|
								        target -= 1;
							 | 
						|
								        if (target >= 0) {
							 | 
						|
								          comment.extendedRange[0] = tokens[target].range[1];
							 | 
						|
								        }
							 | 
						|
								        return comment;
							 | 
						|
								      }
							 | 
						|
								      function attachComments(tree, providedComments, tokens) {
							 | 
						|
								        // At first, we should calculate extended comment ranges.
							 | 
						|
								        var comments = [],
							 | 
						|
								          comment,
							 | 
						|
								          len,
							 | 
						|
								          i,
							 | 
						|
								          cursor;
							 | 
						|
								        if (!tree.range) {
							 | 
						|
								          throw new Error('attachComments needs range information');
							 | 
						|
								        }
							 | 
						|
								
							 | 
						|
								        // tokens array is empty, we attach comments to tree as 'leadingComments'
							 | 
						|
								        if (!tokens.length) {
							 | 
						|
								          if (providedComments.length) {
							 | 
						|
								            for (i = 0, len = providedComments.length; i < len; i += 1) {
							 | 
						|
								              comment = deepCopy(providedComments[i]);
							 | 
						|
								              comment.extendedRange = [0, tree.range[0]];
							 | 
						|
								              comments.push(comment);
							 | 
						|
								            }
							 | 
						|
								            tree.leadingComments = comments;
							 | 
						|
								          }
							 | 
						|
								          return tree;
							 | 
						|
								        }
							 | 
						|
								        for (i = 0, len = providedComments.length; i < len; i += 1) {
							 | 
						|
								          comments.push(extendCommentRange(deepCopy(providedComments[i]), tokens));
							 | 
						|
								        }
							 | 
						|
								
							 | 
						|
								        // This is based on John Freeman's implementation.
							 | 
						|
								        cursor = 0;
							 | 
						|
								        traverse(tree, {
							 | 
						|
								          enter: function (node) {
							 | 
						|
								            var comment;
							 | 
						|
								            while (cursor < comments.length) {
							 | 
						|
								              comment = comments[cursor];
							 | 
						|
								              if (comment.extendedRange[1] > node.range[0]) {
							 | 
						|
								                break;
							 | 
						|
								              }
							 | 
						|
								              if (comment.extendedRange[1] === node.range[0]) {
							 | 
						|
								                if (!node.leadingComments) {
							 | 
						|
								                  node.leadingComments = [];
							 | 
						|
								                }
							 | 
						|
								                node.leadingComments.push(comment);
							 | 
						|
								                comments.splice(cursor, 1);
							 | 
						|
								              } else {
							 | 
						|
								                cursor += 1;
							 | 
						|
								              }
							 | 
						|
								            }
							 | 
						|
								
							 | 
						|
								            // already out of owned node
							 | 
						|
								            if (cursor === comments.length) {
							 | 
						|
								              return VisitorOption.Break;
							 | 
						|
								            }
							 | 
						|
								            if (comments[cursor].extendedRange[0] > node.range[1]) {
							 | 
						|
								              return VisitorOption.Skip;
							 | 
						|
								            }
							 | 
						|
								          }
							 | 
						|
								        });
							 | 
						|
								        cursor = 0;
							 | 
						|
								        traverse(tree, {
							 | 
						|
								          leave: function (node) {
							 | 
						|
								            var comment;
							 | 
						|
								            while (cursor < comments.length) {
							 | 
						|
								              comment = comments[cursor];
							 | 
						|
								              if (node.range[1] < comment.extendedRange[0]) {
							 | 
						|
								                break;
							 | 
						|
								              }
							 | 
						|
								              if (node.range[1] === comment.extendedRange[0]) {
							 | 
						|
								                if (!node.trailingComments) {
							 | 
						|
								                  node.trailingComments = [];
							 | 
						|
								                }
							 | 
						|
								                node.trailingComments.push(comment);
							 | 
						|
								                comments.splice(cursor, 1);
							 | 
						|
								              } else {
							 | 
						|
								                cursor += 1;
							 | 
						|
								              }
							 | 
						|
								            }
							 | 
						|
								
							 | 
						|
								            // already out of owned node
							 | 
						|
								            if (cursor === comments.length) {
							 | 
						|
								              return VisitorOption.Break;
							 | 
						|
								            }
							 | 
						|
								            if (comments[cursor].extendedRange[0] > node.range[1]) {
							 | 
						|
								              return VisitorOption.Skip;
							 | 
						|
								            }
							 | 
						|
								          }
							 | 
						|
								        });
							 | 
						|
								        return tree;
							 | 
						|
								      }
							 | 
						|
								      exports.Syntax = Syntax;
							 | 
						|
								      exports.traverse = traverse;
							 | 
						|
								      exports.replace = replace;
							 | 
						|
								      exports.attachComments = attachComments;
							 | 
						|
								      exports.VisitorKeys = VisitorKeys;
							 | 
						|
								      exports.VisitorOption = VisitorOption;
							 | 
						|
								      exports.Controller = Controller;
							 | 
						|
								      exports.cloneEnvironment = function () {
							 | 
						|
								        return clone({});
							 | 
						|
								      };
							 | 
						|
								      return exports;
							 | 
						|
								    })(exports);
							 | 
						|
								    /* vim: set sw=4 ts=4 et tw=80 : */
							 | 
						|
								  });
							 | 
						|
								
							 | 
						|
								  var parser = createCommonjsModule(function (module) {
							 | 
						|
								    /*
							 | 
						|
								     * Generated by PEG.js 0.10.0.
							 | 
						|
								     *
							 | 
						|
								     * http://pegjs.org/
							 | 
						|
								     */
							 | 
						|
								    (function (root, factory) {
							 | 
						|
								      if ( module.exports) {
							 | 
						|
								        module.exports = factory();
							 | 
						|
								      }
							 | 
						|
								    })(commonjsGlobal, function () {
							 | 
						|
								
							 | 
						|
								      function peg$subclass(child, parent) {
							 | 
						|
								        function ctor() {
							 | 
						|
								          this.constructor = child;
							 | 
						|
								        }
							 | 
						|
								        ctor.prototype = parent.prototype;
							 | 
						|
								        child.prototype = new ctor();
							 | 
						|
								      }
							 | 
						|
								      function peg$SyntaxError(message, expected, found, location) {
							 | 
						|
								        this.message = message;
							 | 
						|
								        this.expected = expected;
							 | 
						|
								        this.found = found;
							 | 
						|
								        this.location = location;
							 | 
						|
								        this.name = "SyntaxError";
							 | 
						|
								        if (typeof Error.captureStackTrace === "function") {
							 | 
						|
								          Error.captureStackTrace(this, peg$SyntaxError);
							 | 
						|
								        }
							 | 
						|
								      }
							 | 
						|
								      peg$subclass(peg$SyntaxError, Error);
							 | 
						|
								      peg$SyntaxError.buildMessage = function (expected, found) {
							 | 
						|
								        var DESCRIBE_EXPECTATION_FNS = {
							 | 
						|
								          literal: function literal(expectation) {
							 | 
						|
								            return "\"" + literalEscape(expectation.text) + "\"";
							 | 
						|
								          },
							 | 
						|
								          "class": function _class(expectation) {
							 | 
						|
								            var escapedParts = "",
							 | 
						|
								              i;
							 | 
						|
								            for (i = 0; i < expectation.parts.length; i++) {
							 | 
						|
								              escapedParts += expectation.parts[i] instanceof Array ? classEscape(expectation.parts[i][0]) + "-" + classEscape(expectation.parts[i][1]) : classEscape(expectation.parts[i]);
							 | 
						|
								            }
							 | 
						|
								            return "[" + (expectation.inverted ? "^" : "") + escapedParts + "]";
							 | 
						|
								          },
							 | 
						|
								          any: function any(expectation) {
							 | 
						|
								            return "any character";
							 | 
						|
								          },
							 | 
						|
								          end: function end(expectation) {
							 | 
						|
								            return "end of input";
							 | 
						|
								          },
							 | 
						|
								          other: function other(expectation) {
							 | 
						|
								            return expectation.description;
							 | 
						|
								          }
							 | 
						|
								        };
							 | 
						|
								        function hex(ch) {
							 | 
						|
								          return ch.charCodeAt(0).toString(16).toUpperCase();
							 | 
						|
								        }
							 | 
						|
								        function literalEscape(s) {
							 | 
						|
								          return s.replace(/\\/g, '\\\\').replace(/"/g, '\\"').replace(/\0/g, '\\0').replace(/\t/g, '\\t').replace(/\n/g, '\\n').replace(/\r/g, '\\r').replace(/[\x00-\x0F]/g, function (ch) {
							 | 
						|
								            return '\\x0' + hex(ch);
							 | 
						|
								          }).replace(/[\x10-\x1F\x7F-\x9F]/g, function (ch) {
							 | 
						|
								            return '\\x' + hex(ch);
							 | 
						|
								          });
							 | 
						|
								        }
							 | 
						|
								        function classEscape(s) {
							 | 
						|
								          return s.replace(/\\/g, '\\\\').replace(/\]/g, '\\]').replace(/\^/g, '\\^').replace(/-/g, '\\-').replace(/\0/g, '\\0').replace(/\t/g, '\\t').replace(/\n/g, '\\n').replace(/\r/g, '\\r').replace(/[\x00-\x0F]/g, function (ch) {
							 | 
						|
								            return '\\x0' + hex(ch);
							 | 
						|
								          }).replace(/[\x10-\x1F\x7F-\x9F]/g, function (ch) {
							 | 
						|
								            return '\\x' + hex(ch);
							 | 
						|
								          });
							 | 
						|
								        }
							 | 
						|
								        function describeExpectation(expectation) {
							 | 
						|
								          return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);
							 | 
						|
								        }
							 | 
						|
								        function describeExpected(expected) {
							 | 
						|
								          var descriptions = new Array(expected.length),
							 | 
						|
								            i,
							 | 
						|
								            j;
							 | 
						|
								          for (i = 0; i < expected.length; i++) {
							 | 
						|
								            descriptions[i] = describeExpectation(expected[i]);
							 | 
						|
								          }
							 | 
						|
								          descriptions.sort();
							 | 
						|
								          if (descriptions.length > 0) {
							 | 
						|
								            for (i = 1, j = 1; i < descriptions.length; i++) {
							 | 
						|
								              if (descriptions[i - 1] !== descriptions[i]) {
							 | 
						|
								                descriptions[j] = descriptions[i];
							 | 
						|
								                j++;
							 | 
						|
								              }
							 | 
						|
								            }
							 | 
						|
								            descriptions.length = j;
							 | 
						|
								          }
							 | 
						|
								          switch (descriptions.length) {
							 | 
						|
								            case 1:
							 | 
						|
								              return descriptions[0];
							 | 
						|
								            case 2:
							 | 
						|
								              return descriptions[0] + " or " + descriptions[1];
							 | 
						|
								            default:
							 | 
						|
								              return descriptions.slice(0, -1).join(", ") + ", or " + descriptions[descriptions.length - 1];
							 | 
						|
								          }
							 | 
						|
								        }
							 | 
						|
								        function describeFound(found) {
							 | 
						|
								          return found ? "\"" + literalEscape(found) + "\"" : "end of input";
							 | 
						|
								        }
							 | 
						|
								        return "Expected " + describeExpected(expected) + " but " + describeFound(found) + " found.";
							 | 
						|
								      };
							 | 
						|
								      function peg$parse(input, options) {
							 | 
						|
								        options = options !== void 0 ? options : {};
							 | 
						|
								        var peg$FAILED = {},
							 | 
						|
								          peg$startRuleFunctions = {
							 | 
						|
								            start: peg$parsestart
							 | 
						|
								          },
							 | 
						|
								          peg$startRuleFunction = peg$parsestart,
							 | 
						|
								          peg$c0 = function peg$c0(ss) {
							 | 
						|
								            return ss.length === 1 ? ss[0] : {
							 | 
						|
								              type: 'matches',
							 | 
						|
								              selectors: ss
							 | 
						|
								            };
							 | 
						|
								          },
							 | 
						|
								          peg$c1 = function peg$c1() {
							 | 
						|
								            return void 0;
							 | 
						|
								          },
							 | 
						|
								          peg$c2 = " ",
							 | 
						|
								          peg$c3 = peg$literalExpectation(" ", false),
							 | 
						|
								          peg$c4 = /^[^ [\],():#!=><~+.]/,
							 | 
						|
								          peg$c5 = peg$classExpectation([" ", "[", "]", ",", "(", ")", ":", "#", "!", "=", ">", "<", "~", "+", "."], true, false),
							 | 
						|
								          peg$c6 = function peg$c6(i) {
							 | 
						|
								            return i.join('');
							 | 
						|
								          },
							 | 
						|
								          peg$c7 = ">",
							 | 
						|
								          peg$c8 = peg$literalExpectation(">", false),
							 | 
						|
								          peg$c9 = function peg$c9() {
							 | 
						|
								            return 'child';
							 | 
						|
								          },
							 | 
						|
								          peg$c10 = "~",
							 | 
						|
								          peg$c11 = peg$literalExpectation("~", false),
							 | 
						|
								          peg$c12 = function peg$c12() {
							 | 
						|
								            return 'sibling';
							 | 
						|
								          },
							 | 
						|
								          peg$c13 = "+",
							 | 
						|
								          peg$c14 = peg$literalExpectation("+", false),
							 | 
						|
								          peg$c15 = function peg$c15() {
							 | 
						|
								            return 'adjacent';
							 | 
						|
								          },
							 | 
						|
								          peg$c16 = function peg$c16() {
							 | 
						|
								            return 'descendant';
							 | 
						|
								          },
							 | 
						|
								          peg$c17 = ",",
							 | 
						|
								          peg$c18 = peg$literalExpectation(",", false),
							 | 
						|
								          peg$c19 = function peg$c19(s, ss) {
							 | 
						|
								            return [s].concat(ss.map(function (s) {
							 | 
						|
								              return s[3];
							 | 
						|
								            }));
							 | 
						|
								          },
							 | 
						|
								          peg$c20 = function peg$c20(op, s) {
							 | 
						|
								            if (!op) return s;
							 | 
						|
								            return {
							 | 
						|
								              type: op,
							 | 
						|
								              left: {
							 | 
						|
								                type: 'exactNode'
							 | 
						|
								              },
							 | 
						|
								              right: s
							 | 
						|
								            };
							 | 
						|
								          },
							 | 
						|
								          peg$c21 = function peg$c21(a, ops) {
							 | 
						|
								            return ops.reduce(function (memo, rhs) {
							 | 
						|
								              return {
							 | 
						|
								                type: rhs[0],
							 | 
						|
								                left: memo,
							 | 
						|
								                right: rhs[1]
							 | 
						|
								              };
							 | 
						|
								            }, a);
							 | 
						|
								          },
							 | 
						|
								          peg$c22 = "!",
							 | 
						|
								          peg$c23 = peg$literalExpectation("!", false),
							 | 
						|
								          peg$c24 = function peg$c24(subject, as) {
							 | 
						|
								            var b = as.length === 1 ? as[0] : {
							 | 
						|
								              type: 'compound',
							 | 
						|
								              selectors: as
							 | 
						|
								            };
							 | 
						|
								            if (subject) b.subject = true;
							 | 
						|
								            return b;
							 | 
						|
								          },
							 | 
						|
								          peg$c25 = "*",
							 | 
						|
								          peg$c26 = peg$literalExpectation("*", false),
							 | 
						|
								          peg$c27 = function peg$c27(a) {
							 | 
						|
								            return {
							 | 
						|
								              type: 'wildcard',
							 | 
						|
								              value: a
							 | 
						|
								            };
							 | 
						|
								          },
							 | 
						|
								          peg$c28 = "#",
							 | 
						|
								          peg$c29 = peg$literalExpectation("#", false),
							 | 
						|
								          peg$c30 = function peg$c30(i) {
							 | 
						|
								            return {
							 | 
						|
								              type: 'identifier',
							 | 
						|
								              value: i
							 | 
						|
								            };
							 | 
						|
								          },
							 | 
						|
								          peg$c31 = "[",
							 | 
						|
								          peg$c32 = peg$literalExpectation("[", false),
							 | 
						|
								          peg$c33 = "]",
							 | 
						|
								          peg$c34 = peg$literalExpectation("]", false),
							 | 
						|
								          peg$c35 = function peg$c35(v) {
							 | 
						|
								            return v;
							 | 
						|
								          },
							 | 
						|
								          peg$c36 = /^[><!]/,
							 | 
						|
								          peg$c37 = peg$classExpectation([">", "<", "!"], false, false),
							 | 
						|
								          peg$c38 = "=",
							 | 
						|
								          peg$c39 = peg$literalExpectation("=", false),
							 | 
						|
								          peg$c40 = function peg$c40(a) {
							 | 
						|
								            return (a || '') + '=';
							 | 
						|
								          },
							 | 
						|
								          peg$c41 = /^[><]/,
							 | 
						|
								          peg$c42 = peg$classExpectation([">", "<"], false, false),
							 | 
						|
								          peg$c43 = ".",
							 | 
						|
								          peg$c44 = peg$literalExpectation(".", false),
							 | 
						|
								          peg$c45 = function peg$c45(a, as) {
							 | 
						|
								            return [].concat.apply([a], as).join('');
							 | 
						|
								          },
							 | 
						|
								          peg$c46 = function peg$c46(name, op, value) {
							 | 
						|
								            return {
							 | 
						|
								              type: 'attribute',
							 | 
						|
								              name: name,
							 | 
						|
								              operator: op,
							 | 
						|
								              value: value
							 | 
						|
								            };
							 | 
						|
								          },
							 | 
						|
								          peg$c47 = function peg$c47(name) {
							 | 
						|
								            return {
							 | 
						|
								              type: 'attribute',
							 | 
						|
								              name: name
							 | 
						|
								            };
							 | 
						|
								          },
							 | 
						|
								          peg$c48 = "\"",
							 | 
						|
								          peg$c49 = peg$literalExpectation("\"", false),
							 | 
						|
								          peg$c50 = /^[^\\"]/,
							 | 
						|
								          peg$c51 = peg$classExpectation(["\\", "\""], true, false),
							 | 
						|
								          peg$c52 = "\\",
							 | 
						|
								          peg$c53 = peg$literalExpectation("\\", false),
							 | 
						|
								          peg$c54 = peg$anyExpectation(),
							 | 
						|
								          peg$c55 = function peg$c55(a, b) {
							 | 
						|
								            return a + b;
							 | 
						|
								          },
							 | 
						|
								          peg$c56 = function peg$c56(d) {
							 | 
						|
								            return {
							 | 
						|
								              type: 'literal',
							 | 
						|
								              value: strUnescape(d.join(''))
							 | 
						|
								            };
							 | 
						|
								          },
							 | 
						|
								          peg$c57 = "'",
							 | 
						|
								          peg$c58 = peg$literalExpectation("'", false),
							 | 
						|
								          peg$c59 = /^[^\\']/,
							 | 
						|
								          peg$c60 = peg$classExpectation(["\\", "'"], true, false),
							 | 
						|
								          peg$c61 = /^[0-9]/,
							 | 
						|
								          peg$c62 = peg$classExpectation([["0", "9"]], false, false),
							 | 
						|
								          peg$c63 = function peg$c63(a, b) {
							 | 
						|
								            // Can use `a.flat().join('')` once supported
							 | 
						|
								            var leadingDecimals = a ? [].concat.apply([], a).join('') : '';
							 | 
						|
								            return {
							 | 
						|
								              type: 'literal',
							 | 
						|
								              value: parseFloat(leadingDecimals + b.join(''))
							 | 
						|
								            };
							 | 
						|
								          },
							 | 
						|
								          peg$c64 = function peg$c64(i) {
							 | 
						|
								            return {
							 | 
						|
								              type: 'literal',
							 | 
						|
								              value: i
							 | 
						|
								            };
							 | 
						|
								          },
							 | 
						|
								          peg$c65 = "type(",
							 | 
						|
								          peg$c66 = peg$literalExpectation("type(", false),
							 | 
						|
								          peg$c67 = /^[^ )]/,
							 | 
						|
								          peg$c68 = peg$classExpectation([" ", ")"], true, false),
							 | 
						|
								          peg$c69 = ")",
							 | 
						|
								          peg$c70 = peg$literalExpectation(")", false),
							 | 
						|
								          peg$c71 = function peg$c71(t) {
							 | 
						|
								            return {
							 | 
						|
								              type: 'type',
							 | 
						|
								              value: t.join('')
							 | 
						|
								            };
							 | 
						|
								          },
							 | 
						|
								          peg$c72 = /^[imsu]/,
							 | 
						|
								          peg$c73 = peg$classExpectation(["i", "m", "s", "u"], false, false),
							 | 
						|
								          peg$c74 = "/",
							 | 
						|
								          peg$c75 = peg$literalExpectation("/", false),
							 | 
						|
								          peg$c76 = /^[^\/]/,
							 | 
						|
								          peg$c77 = peg$classExpectation(["/"], true, false),
							 | 
						|
								          peg$c78 = function peg$c78(d, flgs) {
							 | 
						|
								            return {
							 | 
						|
								              type: 'regexp',
							 | 
						|
								              value: new RegExp(d.join(''), flgs ? flgs.join('') : '')
							 | 
						|
								            };
							 | 
						|
								          },
							 | 
						|
								          peg$c79 = function peg$c79(i, is) {
							 | 
						|
								            return {
							 | 
						|
								              type: 'field',
							 | 
						|
								              name: is.reduce(function (memo, p) {
							 | 
						|
								                return memo + p[0] + p[1];
							 | 
						|
								              }, i)
							 | 
						|
								            };
							 | 
						|
								          },
							 | 
						|
								          peg$c80 = ":not(",
							 | 
						|
								          peg$c81 = peg$literalExpectation(":not(", false),
							 | 
						|
								          peg$c82 = function peg$c82(ss) {
							 | 
						|
								            return {
							 | 
						|
								              type: 'not',
							 | 
						|
								              selectors: ss
							 | 
						|
								            };
							 | 
						|
								          },
							 | 
						|
								          peg$c83 = ":matches(",
							 | 
						|
								          peg$c84 = peg$literalExpectation(":matches(", false),
							 | 
						|
								          peg$c85 = function peg$c85(ss) {
							 | 
						|
								            return {
							 | 
						|
								              type: 'matches',
							 | 
						|
								              selectors: ss
							 | 
						|
								            };
							 | 
						|
								          },
							 | 
						|
								          peg$c86 = ":has(",
							 | 
						|
								          peg$c87 = peg$literalExpectation(":has(", false),
							 | 
						|
								          peg$c88 = function peg$c88(ss) {
							 | 
						|
								            return {
							 | 
						|
								              type: 'has',
							 | 
						|
								              selectors: ss
							 | 
						|
								            };
							 | 
						|
								          },
							 | 
						|
								          peg$c89 = ":first-child",
							 | 
						|
								          peg$c90 = peg$literalExpectation(":first-child", false),
							 | 
						|
								          peg$c91 = function peg$c91() {
							 | 
						|
								            return nth(1);
							 | 
						|
								          },
							 | 
						|
								          peg$c92 = ":last-child",
							 | 
						|
								          peg$c93 = peg$literalExpectation(":last-child", false),
							 | 
						|
								          peg$c94 = function peg$c94() {
							 | 
						|
								            return nthLast(1);
							 | 
						|
								          },
							 | 
						|
								          peg$c95 = ":nth-child(",
							 | 
						|
								          peg$c96 = peg$literalExpectation(":nth-child(", false),
							 | 
						|
								          peg$c97 = function peg$c97(n) {
							 | 
						|
								            return nth(parseInt(n.join(''), 10));
							 | 
						|
								          },
							 | 
						|
								          peg$c98 = ":nth-last-child(",
							 | 
						|
								          peg$c99 = peg$literalExpectation(":nth-last-child(", false),
							 | 
						|
								          peg$c100 = function peg$c100(n) {
							 | 
						|
								            return nthLast(parseInt(n.join(''), 10));
							 | 
						|
								          },
							 | 
						|
								          peg$c101 = ":",
							 | 
						|
								          peg$c102 = peg$literalExpectation(":", false),
							 | 
						|
								          peg$c103 = function peg$c103(c) {
							 | 
						|
								            return {
							 | 
						|
								              type: 'class',
							 | 
						|
								              name: c
							 | 
						|
								            };
							 | 
						|
								          },
							 | 
						|
								          peg$currPos = 0,
							 | 
						|
								          peg$posDetailsCache = [{
							 | 
						|
								            line: 1,
							 | 
						|
								            column: 1
							 | 
						|
								          }],
							 | 
						|
								          peg$maxFailPos = 0,
							 | 
						|
								          peg$maxFailExpected = [],
							 | 
						|
								          peg$resultsCache = {},
							 | 
						|
								          peg$result;
							 | 
						|
								        if ("startRule" in options) {
							 | 
						|
								          if (!(options.startRule in peg$startRuleFunctions)) {
							 | 
						|
								            throw new Error("Can't start parsing from rule \"" + options.startRule + "\".");
							 | 
						|
								          }
							 | 
						|
								          peg$startRuleFunction = peg$startRuleFunctions[options.startRule];
							 | 
						|
								        }
							 | 
						|
								        function peg$literalExpectation(text, ignoreCase) {
							 | 
						|
								          return {
							 | 
						|
								            type: "literal",
							 | 
						|
								            text: text,
							 | 
						|
								            ignoreCase: ignoreCase
							 | 
						|
								          };
							 | 
						|
								        }
							 | 
						|
								        function peg$classExpectation(parts, inverted, ignoreCase) {
							 | 
						|
								          return {
							 | 
						|
								            type: "class",
							 | 
						|
								            parts: parts,
							 | 
						|
								            inverted: inverted,
							 | 
						|
								            ignoreCase: ignoreCase
							 | 
						|
								          };
							 | 
						|
								        }
							 | 
						|
								        function peg$anyExpectation() {
							 | 
						|
								          return {
							 | 
						|
								            type: "any"
							 | 
						|
								          };
							 | 
						|
								        }
							 | 
						|
								        function peg$endExpectation() {
							 | 
						|
								          return {
							 | 
						|
								            type: "end"
							 | 
						|
								          };
							 | 
						|
								        }
							 | 
						|
								        function peg$computePosDetails(pos) {
							 | 
						|
								          var details = peg$posDetailsCache[pos],
							 | 
						|
								            p;
							 | 
						|
								          if (details) {
							 | 
						|
								            return details;
							 | 
						|
								          } else {
							 | 
						|
								            p = pos - 1;
							 | 
						|
								            while (!peg$posDetailsCache[p]) {
							 | 
						|
								              p--;
							 | 
						|
								            }
							 | 
						|
								            details = peg$posDetailsCache[p];
							 | 
						|
								            details = {
							 | 
						|
								              line: details.line,
							 | 
						|
								              column: details.column
							 | 
						|
								            };
							 | 
						|
								            while (p < pos) {
							 | 
						|
								              if (input.charCodeAt(p) === 10) {
							 | 
						|
								                details.line++;
							 | 
						|
								                details.column = 1;
							 | 
						|
								              } else {
							 | 
						|
								                details.column++;
							 | 
						|
								              }
							 | 
						|
								              p++;
							 | 
						|
								            }
							 | 
						|
								            peg$posDetailsCache[pos] = details;
							 | 
						|
								            return details;
							 | 
						|
								          }
							 | 
						|
								        }
							 | 
						|
								        function peg$computeLocation(startPos, endPos) {
							 | 
						|
								          var startPosDetails = peg$computePosDetails(startPos),
							 | 
						|
								            endPosDetails = peg$computePosDetails(endPos);
							 | 
						|
								          return {
							 | 
						|
								            start: {
							 | 
						|
								              offset: startPos,
							 | 
						|
								              line: startPosDetails.line,
							 | 
						|
								              column: startPosDetails.column
							 | 
						|
								            },
							 | 
						|
								            end: {
							 | 
						|
								              offset: endPos,
							 | 
						|
								              line: endPosDetails.line,
							 | 
						|
								              column: endPosDetails.column
							 | 
						|
								            }
							 | 
						|
								          };
							 | 
						|
								        }
							 | 
						|
								        function peg$fail(expected) {
							 | 
						|
								          if (peg$currPos < peg$maxFailPos) {
							 | 
						|
								            return;
							 | 
						|
								          }
							 | 
						|
								          if (peg$currPos > peg$maxFailPos) {
							 | 
						|
								            peg$maxFailPos = peg$currPos;
							 | 
						|
								            peg$maxFailExpected = [];
							 | 
						|
								          }
							 | 
						|
								          peg$maxFailExpected.push(expected);
							 | 
						|
								        }
							 | 
						|
								        function peg$buildStructuredError(expected, found, location) {
							 | 
						|
								          return new peg$SyntaxError(peg$SyntaxError.buildMessage(expected, found), expected, found, location);
							 | 
						|
								        }
							 | 
						|
								        function peg$parsestart() {
							 | 
						|
								          var s0, s1, s2, s3;
							 | 
						|
								          var key = peg$currPos * 32 + 0,
							 | 
						|
								            cached = peg$resultsCache[key];
							 | 
						|
								          if (cached) {
							 | 
						|
								            peg$currPos = cached.nextPos;
							 | 
						|
								            return cached.result;
							 | 
						|
								          }
							 | 
						|
								          s0 = peg$currPos;
							 | 
						|
								          s1 = peg$parse_();
							 | 
						|
								          if (s1 !== peg$FAILED) {
							 | 
						|
								            s2 = peg$parseselectors();
							 | 
						|
								            if (s2 !== peg$FAILED) {
							 | 
						|
								              s3 = peg$parse_();
							 | 
						|
								              if (s3 !== peg$FAILED) {
							 | 
						|
								                s1 = peg$c0(s2);
							 | 
						|
								                s0 = s1;
							 | 
						|
								              } else {
							 | 
						|
								                peg$currPos = s0;
							 | 
						|
								                s0 = peg$FAILED;
							 | 
						|
								              }
							 | 
						|
								            } else {
							 | 
						|
								              peg$currPos = s0;
							 | 
						|
								              s0 = peg$FAILED;
							 | 
						|
								            }
							 | 
						|
								          } else {
							 | 
						|
								            peg$currPos = s0;
							 | 
						|
								            s0 = peg$FAILED;
							 | 
						|
								          }
							 | 
						|
								          if (s0 === peg$FAILED) {
							 | 
						|
								            s0 = peg$currPos;
							 | 
						|
								            s1 = peg$parse_();
							 | 
						|
								            if (s1 !== peg$FAILED) {
							 | 
						|
								              s1 = peg$c1();
							 | 
						|
								            }
							 | 
						|
								            s0 = s1;
							 | 
						|
								          }
							 | 
						|
								          peg$resultsCache[key] = {
							 | 
						|
								            nextPos: peg$currPos,
							 | 
						|
								            result: s0
							 | 
						|
								          };
							 | 
						|
								          return s0;
							 | 
						|
								        }
							 | 
						|
								        function peg$parse_() {
							 | 
						|
								          var s0, s1;
							 | 
						|
								          var key = peg$currPos * 32 + 1,
							 | 
						|
								            cached = peg$resultsCache[key];
							 | 
						|
								          if (cached) {
							 | 
						|
								            peg$currPos = cached.nextPos;
							 | 
						|
								            return cached.result;
							 | 
						|
								          }
							 | 
						|
								          s0 = [];
							 | 
						|
								          if (input.charCodeAt(peg$currPos) === 32) {
							 | 
						|
								            s1 = peg$c2;
							 | 
						|
								            peg$currPos++;
							 | 
						|
								          } else {
							 | 
						|
								            s1 = peg$FAILED;
							 | 
						|
								            {
							 | 
						|
								              peg$fail(peg$c3);
							 | 
						|
								            }
							 | 
						|
								          }
							 | 
						|
								          while (s1 !== peg$FAILED) {
							 | 
						|
								            s0.push(s1);
							 | 
						|
								            if (input.charCodeAt(peg$currPos) === 32) {
							 | 
						|
								              s1 = peg$c2;
							 | 
						|
								              peg$currPos++;
							 | 
						|
								            } else {
							 | 
						|
								              s1 = peg$FAILED;
							 | 
						|
								              {
							 | 
						|
								                peg$fail(peg$c3);
							 | 
						|
								              }
							 | 
						|
								            }
							 | 
						|
								          }
							 | 
						|
								          peg$resultsCache[key] = {
							 | 
						|
								            nextPos: peg$currPos,
							 | 
						|
								            result: s0
							 | 
						|
								          };
							 | 
						|
								          return s0;
							 | 
						|
								        }
							 | 
						|
								        function peg$parseidentifierName() {
							 | 
						|
								          var s0, s1, s2;
							 | 
						|
								          var key = peg$currPos * 32 + 2,
							 | 
						|
								            cached = peg$resultsCache[key];
							 | 
						|
								          if (cached) {
							 | 
						|
								            peg$currPos = cached.nextPos;
							 | 
						|
								            return cached.result;
							 | 
						|
								          }
							 | 
						|
								          s0 = peg$currPos;
							 | 
						|
								          s1 = [];
							 | 
						|
								          if (peg$c4.test(input.charAt(peg$currPos))) {
							 | 
						|
								            s2 = input.charAt(peg$currPos);
							 | 
						|
								            peg$currPos++;
							 | 
						|
								          } else {
							 | 
						|
								            s2 = peg$FAILED;
							 | 
						|
								            {
							 | 
						|
								              peg$fail(peg$c5);
							 | 
						|
								            }
							 | 
						|
								          }
							 | 
						|
								          if (s2 !== peg$FAILED) {
							 | 
						|
								            while (s2 !== peg$FAILED) {
							 | 
						|
								              s1.push(s2);
							 | 
						|
								              if (peg$c4.test(input.charAt(peg$currPos))) {
							 | 
						|
								                s2 = input.charAt(peg$currPos);
							 | 
						|
								                peg$currPos++;
							 | 
						|
								              } else {
							 | 
						|
								                s2 = peg$FAILED;
							 | 
						|
								                {
							 | 
						|
								                  peg$fail(peg$c5);
							 | 
						|
								                }
							 | 
						|
								              }
							 | 
						|
								            }
							 | 
						|
								          } else {
							 | 
						|
								            s1 = peg$FAILED;
							 | 
						|
								          }
							 | 
						|
								          if (s1 !== peg$FAILED) {
							 | 
						|
								            s1 = peg$c6(s1);
							 | 
						|
								          }
							 | 
						|
								          s0 = s1;
							 | 
						|
								          peg$resultsCache[key] = {
							 | 
						|
								            nextPos: peg$currPos,
							 | 
						|
								            result: s0
							 | 
						|
								          };
							 | 
						|
								          return s0;
							 | 
						|
								        }
							 | 
						|
								        function peg$parsebinaryOp() {
							 | 
						|
								          var s0, s1, s2, s3;
							 | 
						|
								          var key = peg$currPos * 32 + 3,
							 | 
						|
								            cached = peg$resultsCache[key];
							 | 
						|
								          if (cached) {
							 | 
						|
								            peg$currPos = cached.nextPos;
							 | 
						|
								            return cached.result;
							 | 
						|
								          }
							 | 
						|
								          s0 = peg$currPos;
							 | 
						|
								          s1 = peg$parse_();
							 | 
						|
								          if (s1 !== peg$FAILED) {
							 | 
						|
								            if (input.charCodeAt(peg$currPos) === 62) {
							 | 
						|
								              s2 = peg$c7;
							 | 
						|
								              peg$currPos++;
							 | 
						|
								            } else {
							 | 
						|
								              s2 = peg$FAILED;
							 | 
						|
								              {
							 | 
						|
								                peg$fail(peg$c8);
							 | 
						|
								              }
							 | 
						|
								            }
							 | 
						|
								            if (s2 !== peg$FAILED) {
							 | 
						|
								              s3 = peg$parse_();
							 | 
						|
								              if (s3 !== peg$FAILED) {
							 | 
						|
								                s1 = peg$c9();
							 | 
						|
								                s0 = s1;
							 | 
						|
								              } else {
							 | 
						|
								                peg$currPos = s0;
							 | 
						|
								                s0 = peg$FAILED;
							 | 
						|
								              }
							 | 
						|
								            } else {
							 | 
						|
								              peg$currPos = s0;
							 | 
						|
								              s0 = peg$FAILED;
							 | 
						|
								            }
							 | 
						|
								          } else {
							 | 
						|
								            peg$currPos = s0;
							 | 
						|
								            s0 = peg$FAILED;
							 | 
						|
								          }
							 | 
						|
								          if (s0 === peg$FAILED) {
							 | 
						|
								            s0 = peg$currPos;
							 | 
						|
								            s1 = peg$parse_();
							 | 
						|
								            if (s1 !== peg$FAILED) {
							 | 
						|
								              if (input.charCodeAt(peg$currPos) === 126) {
							 | 
						|
								                s2 = peg$c10;
							 | 
						|
								                peg$currPos++;
							 | 
						|
								              } else {
							 | 
						|
								                s2 = peg$FAILED;
							 | 
						|
								                {
							 | 
						|
								                  peg$fail(peg$c11);
							 | 
						|
								                }
							 | 
						|
								              }
							 | 
						|
								              if (s2 !== peg$FAILED) {
							 | 
						|
								                s3 = peg$parse_();
							 | 
						|
								                if (s3 !== peg$FAILED) {
							 | 
						|
								                  s1 = peg$c12();
							 | 
						|
								                  s0 = s1;
							 | 
						|
								                } else {
							 | 
						|
								                  peg$currPos = s0;
							 | 
						|
								                  s0 = peg$FAILED;
							 | 
						|
								                }
							 | 
						|
								              } else {
							 | 
						|
								                peg$currPos = s0;
							 | 
						|
								                s0 = peg$FAILED;
							 | 
						|
								              }
							 | 
						|
								            } else {
							 | 
						|
								              peg$currPos = s0;
							 | 
						|
								              s0 = peg$FAILED;
							 | 
						|
								            }
							 | 
						|
								            if (s0 === peg$FAILED) {
							 | 
						|
								              s0 = peg$currPos;
							 | 
						|
								              s1 = peg$parse_();
							 | 
						|
								              if (s1 !== peg$FAILED) {
							 | 
						|
								                if (input.charCodeAt(peg$currPos) === 43) {
							 | 
						|
								                  s2 = peg$c13;
							 | 
						|
								                  peg$currPos++;
							 | 
						|
								                } else {
							 | 
						|
								                  s2 = peg$FAILED;
							 | 
						|
								                  {
							 | 
						|
								                    peg$fail(peg$c14);
							 | 
						|
								                  }
							 | 
						|
								                }
							 | 
						|
								                if (s2 !== peg$FAILED) {
							 | 
						|
								                  s3 = peg$parse_();
							 | 
						|
								                  if (s3 !== peg$FAILED) {
							 | 
						|
								                    s1 = peg$c15();
							 | 
						|
								                    s0 = s1;
							 | 
						|
								                  } else {
							 | 
						|
								                    peg$currPos = s0;
							 | 
						|
								                    s0 = peg$FAILED;
							 | 
						|
								                  }
							 | 
						|
								                } else {
							 | 
						|
								                  peg$currPos = s0;
							 | 
						|
								                  s0 = peg$FAILED;
							 | 
						|
								                }
							 | 
						|
								              } else {
							 | 
						|
								                peg$currPos = s0;
							 | 
						|
								                s0 = peg$FAILED;
							 | 
						|
								              }
							 | 
						|
								              if (s0 === peg$FAILED) {
							 | 
						|
								                s0 = peg$currPos;
							 | 
						|
								                if (input.charCodeAt(peg$currPos) === 32) {
							 | 
						|
								                  s1 = peg$c2;
							 | 
						|
								                  peg$currPos++;
							 | 
						|
								                } else {
							 | 
						|
								                  s1 = peg$FAILED;
							 | 
						|
								                  {
							 | 
						|
								                    peg$fail(peg$c3);
							 | 
						|
								                  }
							 | 
						|
								                }
							 | 
						|
								                if (s1 !== peg$FAILED) {
							 | 
						|
								                  s2 = peg$parse_();
							 | 
						|
								                  if (s2 !== peg$FAILED) {
							 | 
						|
								                    s1 = peg$c16();
							 | 
						|
								                    s0 = s1;
							 | 
						|
								                  } else {
							 | 
						|
								                    peg$currPos = s0;
							 | 
						|
								                    s0 = peg$FAILED;
							 | 
						|
								                  }
							 | 
						|
								                } else {
							 | 
						|
								                  peg$currPos = s0;
							 | 
						|
								                  s0 = peg$FAILED;
							 | 
						|
								                }
							 | 
						|
								              }
							 | 
						|
								            }
							 | 
						|
								          }
							 | 
						|
								          peg$resultsCache[key] = {
							 | 
						|
								            nextPos: peg$currPos,
							 | 
						|
								            result: s0
							 | 
						|
								          };
							 | 
						|
								          return s0;
							 | 
						|
								        }
							 | 
						|
								        function peg$parsehasSelectors() {
							 | 
						|
								          var s0, s1, s2, s3, s4, s5, s6, s7;
							 | 
						|
								          var key = peg$currPos * 32 + 4,
							 | 
						|
								            cached = peg$resultsCache[key];
							 | 
						|
								          if (cached) {
							 | 
						|
								            peg$currPos = cached.nextPos;
							 | 
						|
								            return cached.result;
							 | 
						|
								          }
							 | 
						|
								          s0 = peg$currPos;
							 | 
						|
								          s1 = peg$parsehasSelector();
							 | 
						|
								          if (s1 !== peg$FAILED) {
							 | 
						|
								            s2 = [];
							 | 
						|
								            s3 = peg$currPos;
							 | 
						|
								            s4 = peg$parse_();
							 | 
						|
								            if (s4 !== peg$FAILED) {
							 | 
						|
								              if (input.charCodeAt(peg$currPos) === 44) {
							 | 
						|
								                s5 = peg$c17;
							 | 
						|
								                peg$currPos++;
							 | 
						|
								              } else {
							 | 
						|
								                s5 = peg$FAILED;
							 | 
						|
								                {
							 | 
						|
								                  peg$fail(peg$c18);
							 | 
						|
								                }
							 | 
						|
								              }
							 | 
						|
								              if (s5 !== peg$FAILED) {
							 | 
						|
								                s6 = peg$parse_();
							 | 
						|
								                if (s6 !== peg$FAILED) {
							 | 
						|
								                  s7 = peg$parsehasSelector();
							 | 
						|
								                  if (s7 !== peg$FAILED) {
							 | 
						|
								                    s4 = [s4, s5, s6, s7];
							 | 
						|
								                    s3 = s4;
							 | 
						|
								                  } else {
							 | 
						|
								                    peg$currPos = s3;
							 | 
						|
								                    s3 = peg$FAILED;
							 | 
						|
								                  }
							 | 
						|
								                } else {
							 | 
						|
								                  peg$currPos = s3;
							 | 
						|
								                  s3 = peg$FAILED;
							 | 
						|
								                }
							 | 
						|
								              } else {
							 | 
						|
								                peg$currPos = s3;
							 | 
						|
								                s3 = peg$FAILED;
							 | 
						|
								              }
							 | 
						|
								            } else {
							 | 
						|
								              peg$currPos = s3;
							 | 
						|
								              s3 = peg$FAILED;
							 | 
						|
								            }
							 | 
						|
								            while (s3 !== peg$FAILED) {
							 | 
						|
								              s2.push(s3);
							 | 
						|
								              s3 = peg$currPos;
							 | 
						|
								              s4 = peg$parse_();
							 | 
						|
								              if (s4 !== peg$FAILED) {
							 | 
						|
								                if (input.charCodeAt(peg$currPos) === 44) {
							 | 
						|
								                  s5 = peg$c17;
							 | 
						|
								                  peg$currPos++;
							 | 
						|
								                } else {
							 | 
						|
								                  s5 = peg$FAILED;
							 | 
						|
								                  {
							 | 
						|
								                    peg$fail(peg$c18);
							 | 
						|
								                  }
							 | 
						|
								                }
							 | 
						|
								                if (s5 !== peg$FAILED) {
							 | 
						|
								                  s6 = peg$parse_();
							 | 
						|
								                  if (s6 !== peg$FAILED) {
							 | 
						|
								                    s7 = peg$parsehasSelector();
							 | 
						|
								                    if (s7 !== peg$FAILED) {
							 | 
						|
								                      s4 = [s4, s5, s6, s7];
							 | 
						|
								                      s3 = s4;
							 | 
						|
								                    } else {
							 | 
						|
								                      peg$currPos = s3;
							 | 
						|
								                      s3 = peg$FAILED;
							 | 
						|
								                    }
							 | 
						|
								                  } else {
							 | 
						|
								                    peg$currPos = s3;
							 | 
						|
								                    s3 = peg$FAILED;
							 | 
						|
								                  }
							 | 
						|
								                } else {
							 | 
						|
								                  peg$currPos = s3;
							 | 
						|
								                  s3 = peg$FAILED;
							 | 
						|
								                }
							 | 
						|
								              } else {
							 | 
						|
								                peg$currPos = s3;
							 | 
						|
								                s3 = peg$FAILED;
							 | 
						|
								              }
							 | 
						|
								            }
							 | 
						|
								            if (s2 !== peg$FAILED) {
							 | 
						|
								              s1 = peg$c19(s1, s2);
							 | 
						|
								              s0 = s1;
							 | 
						|
								            } else {
							 | 
						|
								              peg$currPos = s0;
							 | 
						|
								              s0 = peg$FAILED;
							 | 
						|
								            }
							 | 
						|
								          } else {
							 | 
						|
								            peg$currPos = s0;
							 | 
						|
								            s0 = peg$FAILED;
							 | 
						|
								          }
							 | 
						|
								          peg$resultsCache[key] = {
							 | 
						|
								            nextPos: peg$currPos,
							 | 
						|
								            result: s0
							 | 
						|
								          };
							 | 
						|
								          return s0;
							 | 
						|
								        }
							 | 
						|
								        function peg$parseselectors() {
							 | 
						|
								          var s0, s1, s2, s3, s4, s5, s6, s7;
							 | 
						|
								          var key = peg$currPos * 32 + 5,
							 | 
						|
								            cached = peg$resultsCache[key];
							 | 
						|
								          if (cached) {
							 | 
						|
								            peg$currPos = cached.nextPos;
							 | 
						|
								            return cached.result;
							 | 
						|
								          }
							 | 
						|
								          s0 = peg$currPos;
							 | 
						|
								          s1 = peg$parseselector();
							 | 
						|
								          if (s1 !== peg$FAILED) {
							 | 
						|
								            s2 = [];
							 | 
						|
								            s3 = peg$currPos;
							 | 
						|
								            s4 = peg$parse_();
							 | 
						|
								            if (s4 !== peg$FAILED) {
							 | 
						|
								              if (input.charCodeAt(peg$currPos) === 44) {
							 | 
						|
								                s5 = peg$c17;
							 | 
						|
								                peg$currPos++;
							 | 
						|
								              } else {
							 | 
						|
								                s5 = peg$FAILED;
							 | 
						|
								                {
							 | 
						|
								                  peg$fail(peg$c18);
							 | 
						|
								                }
							 | 
						|
								              }
							 | 
						|
								              if (s5 !== peg$FAILED) {
							 | 
						|
								                s6 = peg$parse_();
							 | 
						|
								                if (s6 !== peg$FAILED) {
							 | 
						|
								                  s7 = peg$parseselector();
							 | 
						|
								                  if (s7 !== peg$FAILED) {
							 | 
						|
								                    s4 = [s4, s5, s6, s7];
							 | 
						|
								                    s3 = s4;
							 | 
						|
								                  } else {
							 | 
						|
								                    peg$currPos = s3;
							 | 
						|
								                    s3 = peg$FAILED;
							 | 
						|
								                  }
							 | 
						|
								                } else {
							 | 
						|
								                  peg$currPos = s3;
							 | 
						|
								                  s3 = peg$FAILED;
							 | 
						|
								                }
							 | 
						|
								              } else {
							 | 
						|
								                peg$currPos = s3;
							 | 
						|
								                s3 = peg$FAILED;
							 | 
						|
								              }
							 | 
						|
								            } else {
							 | 
						|
								              peg$currPos = s3;
							 | 
						|
								              s3 = peg$FAILED;
							 | 
						|
								            }
							 | 
						|
								            while (s3 !== peg$FAILED) {
							 | 
						|
								              s2.push(s3);
							 | 
						|
								              s3 = peg$currPos;
							 | 
						|
								              s4 = peg$parse_();
							 | 
						|
								              if (s4 !== peg$FAILED) {
							 | 
						|
								                if (input.charCodeAt(peg$currPos) === 44) {
							 | 
						|
								                  s5 = peg$c17;
							 | 
						|
								                  peg$currPos++;
							 | 
						|
								                } else {
							 | 
						|
								                  s5 = peg$FAILED;
							 | 
						|
								                  {
							 | 
						|
								                    peg$fail(peg$c18);
							 | 
						|
								                  }
							 | 
						|
								                }
							 | 
						|
								                if (s5 !== peg$FAILED) {
							 | 
						|
								                  s6 = peg$parse_();
							 | 
						|
								                  if (s6 !== peg$FAILED) {
							 | 
						|
								                    s7 = peg$parseselector();
							 | 
						|
								                    if (s7 !== peg$FAILED) {
							 | 
						|
								                      s4 = [s4, s5, s6, s7];
							 | 
						|
								                      s3 = s4;
							 | 
						|
								                    } else {
							 | 
						|
								                      peg$currPos = s3;
							 | 
						|
								                      s3 = peg$FAILED;
							 | 
						|
								                    }
							 | 
						|
								                  } else {
							 | 
						|
								                    peg$currPos = s3;
							 | 
						|
								                    s3 = peg$FAILED;
							 | 
						|
								                  }
							 | 
						|
								                } else {
							 | 
						|
								                  peg$currPos = s3;
							 | 
						|
								                  s3 = peg$FAILED;
							 | 
						|
								                }
							 | 
						|
								              } else {
							 | 
						|
								                peg$currPos = s3;
							 | 
						|
								                s3 = peg$FAILED;
							 | 
						|
								              }
							 | 
						|
								            }
							 | 
						|
								            if (s2 !== peg$FAILED) {
							 | 
						|
								              s1 = peg$c19(s1, s2);
							 | 
						|
								              s0 = s1;
							 | 
						|
								            } else {
							 | 
						|
								              peg$currPos = s0;
							 | 
						|
								              s0 = peg$FAILED;
							 | 
						|
								            }
							 | 
						|
								          } else {
							 | 
						|
								            peg$currPos = s0;
							 | 
						|
								            s0 = peg$FAILED;
							 | 
						|
								          }
							 | 
						|
								          peg$resultsCache[key] = {
							 | 
						|
								            nextPos: peg$currPos,
							 | 
						|
								            result: s0
							 | 
						|
								          };
							 | 
						|
								          return s0;
							 | 
						|
								        }
							 | 
						|
								        function peg$parsehasSelector() {
							 | 
						|
								          var s0, s1, s2;
							 | 
						|
								          var key = peg$currPos * 32 + 6,
							 | 
						|
								            cached = peg$resultsCache[key];
							 | 
						|
								          if (cached) {
							 | 
						|
								            peg$currPos = cached.nextPos;
							 | 
						|
								            return cached.result;
							 | 
						|
								          }
							 | 
						|
								          s0 = peg$currPos;
							 | 
						|
								          s1 = peg$parsebinaryOp();
							 | 
						|
								          if (s1 === peg$FAILED) {
							 | 
						|
								            s1 = null;
							 | 
						|
								          }
							 | 
						|
								          if (s1 !== peg$FAILED) {
							 | 
						|
								            s2 = peg$parseselector();
							 | 
						|
								            if (s2 !== peg$FAILED) {
							 | 
						|
								              s1 = peg$c20(s1, s2);
							 | 
						|
								              s0 = s1;
							 | 
						|
								            } else {
							 | 
						|
								              peg$currPos = s0;
							 | 
						|
								              s0 = peg$FAILED;
							 | 
						|
								            }
							 | 
						|
								          } else {
							 | 
						|
								            peg$currPos = s0;
							 | 
						|
								            s0 = peg$FAILED;
							 | 
						|
								          }
							 | 
						|
								          peg$resultsCache[key] = {
							 | 
						|
								            nextPos: peg$currPos,
							 | 
						|
								            result: s0
							 | 
						|
								          };
							 | 
						|
								          return s0;
							 | 
						|
								        }
							 | 
						|
								        function peg$parseselector() {
							 | 
						|
								          var s0, s1, s2, s3, s4, s5;
							 | 
						|
								          var key = peg$currPos * 32 + 7,
							 | 
						|
								            cached = peg$resultsCache[key];
							 | 
						|
								          if (cached) {
							 | 
						|
								            peg$currPos = cached.nextPos;
							 | 
						|
								            return cached.result;
							 | 
						|
								          }
							 | 
						|
								          s0 = peg$currPos;
							 | 
						|
								          s1 = peg$parsesequence();
							 | 
						|
								          if (s1 !== peg$FAILED) {
							 | 
						|
								            s2 = [];
							 | 
						|
								            s3 = peg$currPos;
							 | 
						|
								            s4 = peg$parsebinaryOp();
							 | 
						|
								            if (s4 !== peg$FAILED) {
							 | 
						|
								              s5 = peg$parsesequence();
							 | 
						|
								              if (s5 !== peg$FAILED) {
							 | 
						|
								                s4 = [s4, s5];
							 | 
						|
								                s3 = s4;
							 | 
						|
								              } else {
							 | 
						|
								                peg$currPos = s3;
							 | 
						|
								                s3 = peg$FAILED;
							 | 
						|
								              }
							 | 
						|
								            } else {
							 | 
						|
								              peg$currPos = s3;
							 | 
						|
								              s3 = peg$FAILED;
							 | 
						|
								            }
							 | 
						|
								            while (s3 !== peg$FAILED) {
							 | 
						|
								              s2.push(s3);
							 | 
						|
								              s3 = peg$currPos;
							 | 
						|
								              s4 = peg$parsebinaryOp();
							 | 
						|
								              if (s4 !== peg$FAILED) {
							 | 
						|
								                s5 = peg$parsesequence();
							 | 
						|
								                if (s5 !== peg$FAILED) {
							 | 
						|
								                  s4 = [s4, s5];
							 | 
						|
								                  s3 = s4;
							 | 
						|
								                } else {
							 | 
						|
								                  peg$currPos = s3;
							 | 
						|
								                  s3 = peg$FAILED;
							 | 
						|
								                }
							 | 
						|
								              } else {
							 | 
						|
								                peg$currPos = s3;
							 | 
						|
								                s3 = peg$FAILED;
							 | 
						|
								              }
							 | 
						|
								            }
							 | 
						|
								            if (s2 !== peg$FAILED) {
							 | 
						|
								              s1 = peg$c21(s1, s2);
							 | 
						|
								              s0 = s1;
							 | 
						|
								            } else {
							 | 
						|
								              peg$currPos = s0;
							 | 
						|
								              s0 = peg$FAILED;
							 | 
						|
								            }
							 | 
						|
								          } else {
							 | 
						|
								            peg$currPos = s0;
							 | 
						|
								            s0 = peg$FAILED;
							 | 
						|
								          }
							 | 
						|
								          peg$resultsCache[key] = {
							 | 
						|
								            nextPos: peg$currPos,
							 | 
						|
								            result: s0
							 | 
						|
								          };
							 | 
						|
								          return s0;
							 | 
						|
								        }
							 | 
						|
								        function peg$parsesequence() {
							 | 
						|
								          var s0, s1, s2, s3;
							 | 
						|
								          var key = peg$currPos * 32 + 8,
							 | 
						|
								            cached = peg$resultsCache[key];
							 | 
						|
								          if (cached) {
							 | 
						|
								            peg$currPos = cached.nextPos;
							 | 
						|
								            return cached.result;
							 | 
						|
								          }
							 | 
						|
								          s0 = peg$currPos;
							 | 
						|
								          if (input.charCodeAt(peg$currPos) === 33) {
							 | 
						|
								            s1 = peg$c22;
							 | 
						|
								            peg$currPos++;
							 | 
						|
								          } else {
							 | 
						|
								            s1 = peg$FAILED;
							 | 
						|
								            {
							 | 
						|
								              peg$fail(peg$c23);
							 | 
						|
								            }
							 | 
						|
								          }
							 | 
						|
								          if (s1 === peg$FAILED) {
							 | 
						|
								            s1 = null;
							 | 
						|
								          }
							 | 
						|
								          if (s1 !== peg$FAILED) {
							 | 
						|
								            s2 = [];
							 | 
						|
								            s3 = peg$parseatom();
							 | 
						|
								            if (s3 !== peg$FAILED) {
							 | 
						|
								              while (s3 !== peg$FAILED) {
							 | 
						|
								                s2.push(s3);
							 | 
						|
								                s3 = peg$parseatom();
							 | 
						|
								              }
							 | 
						|
								            } else {
							 | 
						|
								              s2 = peg$FAILED;
							 | 
						|
								            }
							 | 
						|
								            if (s2 !== peg$FAILED) {
							 | 
						|
								              s1 = peg$c24(s1, s2);
							 | 
						|
								              s0 = s1;
							 | 
						|
								            } else {
							 | 
						|
								              peg$currPos = s0;
							 | 
						|
								              s0 = peg$FAILED;
							 | 
						|
								            }
							 | 
						|
								          } else {
							 | 
						|
								            peg$currPos = s0;
							 | 
						|
								            s0 = peg$FAILED;
							 | 
						|
								          }
							 | 
						|
								          peg$resultsCache[key] = {
							 | 
						|
								            nextPos: peg$currPos,
							 | 
						|
								            result: s0
							 | 
						|
								          };
							 | 
						|
								          return s0;
							 | 
						|
								        }
							 | 
						|
								        function peg$parseatom() {
							 | 
						|
								          var s0;
							 | 
						|
								          var key = peg$currPos * 32 + 9,
							 | 
						|
								            cached = peg$resultsCache[key];
							 | 
						|
								          if (cached) {
							 | 
						|
								            peg$currPos = cached.nextPos;
							 | 
						|
								            return cached.result;
							 | 
						|
								          }
							 | 
						|
								          s0 = peg$parsewildcard();
							 | 
						|
								          if (s0 === peg$FAILED) {
							 | 
						|
								            s0 = peg$parseidentifier();
							 | 
						|
								            if (s0 === peg$FAILED) {
							 | 
						|
								              s0 = peg$parseattr();
							 | 
						|
								              if (s0 === peg$FAILED) {
							 | 
						|
								                s0 = peg$parsefield();
							 | 
						|
								                if (s0 === peg$FAILED) {
							 | 
						|
								                  s0 = peg$parsenegation();
							 | 
						|
								                  if (s0 === peg$FAILED) {
							 | 
						|
								                    s0 = peg$parsematches();
							 | 
						|
								                    if (s0 === peg$FAILED) {
							 | 
						|
								                      s0 = peg$parsehas();
							 | 
						|
								                      if (s0 === peg$FAILED) {
							 | 
						|
								                        s0 = peg$parsefirstChild();
							 | 
						|
								                        if (s0 === peg$FAILED) {
							 | 
						|
								                          s0 = peg$parselastChild();
							 | 
						|
								                          if (s0 === peg$FAILED) {
							 | 
						|
								                            s0 = peg$parsenthChild();
							 | 
						|
								                            if (s0 === peg$FAILED) {
							 | 
						|
								                              s0 = peg$parsenthLastChild();
							 | 
						|
								                              if (s0 === peg$FAILED) {
							 | 
						|
								                                s0 = peg$parseclass();
							 | 
						|
								                              }
							 | 
						|
								                            }
							 | 
						|
								                          }
							 | 
						|
								                        }
							 | 
						|
								                      }
							 | 
						|
								                    }
							 | 
						|
								                  }
							 | 
						|
								                }
							 | 
						|
								              }
							 | 
						|
								            }
							 | 
						|
								          }
							 | 
						|
								          peg$resultsCache[key] = {
							 | 
						|
								            nextPos: peg$currPos,
							 | 
						|
								            result: s0
							 | 
						|
								          };
							 | 
						|
								          return s0;
							 | 
						|
								        }
							 | 
						|
								        function peg$parsewildcard() {
							 | 
						|
								          var s0, s1;
							 | 
						|
								          var key = peg$currPos * 32 + 10,
							 | 
						|
								            cached = peg$resultsCache[key];
							 | 
						|
								          if (cached) {
							 | 
						|
								            peg$currPos = cached.nextPos;
							 | 
						|
								            return cached.result;
							 | 
						|
								          }
							 | 
						|
								          s0 = peg$currPos;
							 | 
						|
								          if (input.charCodeAt(peg$currPos) === 42) {
							 | 
						|
								            s1 = peg$c25;
							 | 
						|
								            peg$currPos++;
							 | 
						|
								          } else {
							 | 
						|
								            s1 = peg$FAILED;
							 | 
						|
								            {
							 | 
						|
								              peg$fail(peg$c26);
							 | 
						|
								            }
							 | 
						|
								          }
							 | 
						|
								          if (s1 !== peg$FAILED) {
							 | 
						|
								            s1 = peg$c27(s1);
							 | 
						|
								          }
							 | 
						|
								          s0 = s1;
							 | 
						|
								          peg$resultsCache[key] = {
							 | 
						|
								            nextPos: peg$currPos,
							 | 
						|
								            result: s0
							 | 
						|
								          };
							 | 
						|
								          return s0;
							 | 
						|
								        }
							 | 
						|
								        function peg$parseidentifier() {
							 | 
						|
								          var s0, s1, s2;
							 | 
						|
								          var key = peg$currPos * 32 + 11,
							 | 
						|
								            cached = peg$resultsCache[key];
							 | 
						|
								          if (cached) {
							 | 
						|
								            peg$currPos = cached.nextPos;
							 | 
						|
								            return cached.result;
							 | 
						|
								          }
							 | 
						|
								          s0 = peg$currPos;
							 | 
						|
								          if (input.charCodeAt(peg$currPos) === 35) {
							 | 
						|
								            s1 = peg$c28;
							 | 
						|
								            peg$currPos++;
							 | 
						|
								          } else {
							 | 
						|
								            s1 = peg$FAILED;
							 | 
						|
								            {
							 | 
						|
								              peg$fail(peg$c29);
							 | 
						|
								            }
							 | 
						|
								          }
							 | 
						|
								          if (s1 === peg$FAILED) {
							 | 
						|
								            s1 = null;
							 | 
						|
								          }
							 | 
						|
								          if (s1 !== peg$FAILED) {
							 | 
						|
								            s2 = peg$parseidentifierName();
							 | 
						|
								            if (s2 !== peg$FAILED) {
							 | 
						|
								              s1 = peg$c30(s2);
							 | 
						|
								              s0 = s1;
							 | 
						|
								            } else {
							 | 
						|
								              peg$currPos = s0;
							 | 
						|
								              s0 = peg$FAILED;
							 | 
						|
								            }
							 | 
						|
								          } else {
							 | 
						|
								            peg$currPos = s0;
							 | 
						|
								            s0 = peg$FAILED;
							 | 
						|
								          }
							 | 
						|
								          peg$resultsCache[key] = {
							 | 
						|
								            nextPos: peg$currPos,
							 | 
						|
								            result: s0
							 | 
						|
								          };
							 | 
						|
								          return s0;
							 | 
						|
								        }
							 | 
						|
								        function peg$parseattr() {
							 | 
						|
								          var s0, s1, s2, s3, s4, s5;
							 | 
						|
								          var key = peg$currPos * 32 + 12,
							 | 
						|
								            cached = peg$resultsCache[key];
							 | 
						|
								          if (cached) {
							 | 
						|
								            peg$currPos = cached.nextPos;
							 | 
						|
								            return cached.result;
							 | 
						|
								          }
							 | 
						|
								          s0 = peg$currPos;
							 | 
						|
								          if (input.charCodeAt(peg$currPos) === 91) {
							 | 
						|
								            s1 = peg$c31;
							 | 
						|
								            peg$currPos++;
							 | 
						|
								          } else {
							 | 
						|
								            s1 = peg$FAILED;
							 | 
						|
								            {
							 | 
						|
								              peg$fail(peg$c32);
							 | 
						|
								            }
							 | 
						|
								          }
							 | 
						|
								          if (s1 !== peg$FAILED) {
							 | 
						|
								            s2 = peg$parse_();
							 | 
						|
								            if (s2 !== peg$FAILED) {
							 | 
						|
								              s3 = peg$parseattrValue();
							 | 
						|
								              if (s3 !== peg$FAILED) {
							 | 
						|
								                s4 = peg$parse_();
							 | 
						|
								                if (s4 !== peg$FAILED) {
							 | 
						|
								                  if (input.charCodeAt(peg$currPos) === 93) {
							 | 
						|
								                    s5 = peg$c33;
							 | 
						|
								                    peg$currPos++;
							 | 
						|
								                  } else {
							 | 
						|
								                    s5 = peg$FAILED;
							 | 
						|
								                    {
							 | 
						|
								                      peg$fail(peg$c34);
							 | 
						|
								                    }
							 | 
						|
								                  }
							 | 
						|
								                  if (s5 !== peg$FAILED) {
							 | 
						|
								                    s1 = peg$c35(s3);
							 | 
						|
								                    s0 = s1;
							 | 
						|
								                  } else {
							 | 
						|
								                    peg$currPos = s0;
							 | 
						|
								                    s0 = peg$FAILED;
							 | 
						|
								                  }
							 | 
						|
								                } else {
							 | 
						|
								                  peg$currPos = s0;
							 | 
						|
								                  s0 = peg$FAILED;
							 | 
						|
								                }
							 | 
						|
								              } else {
							 | 
						|
								                peg$currPos = s0;
							 | 
						|
								                s0 = peg$FAILED;
							 | 
						|
								              }
							 | 
						|
								            } else {
							 | 
						|
								              peg$currPos = s0;
							 | 
						|
								              s0 = peg$FAILED;
							 | 
						|
								            }
							 | 
						|
								          } else {
							 | 
						|
								            peg$currPos = s0;
							 | 
						|
								            s0 = peg$FAILED;
							 | 
						|
								          }
							 | 
						|
								          peg$resultsCache[key] = {
							 | 
						|
								            nextPos: peg$currPos,
							 | 
						|
								            result: s0
							 | 
						|
								          };
							 | 
						|
								          return s0;
							 | 
						|
								        }
							 | 
						|
								        function peg$parseattrOps() {
							 | 
						|
								          var s0, s1, s2;
							 | 
						|
								          var key = peg$currPos * 32 + 13,
							 | 
						|
								            cached = peg$resultsCache[key];
							 | 
						|
								          if (cached) {
							 | 
						|
								            peg$currPos = cached.nextPos;
							 | 
						|
								            return cached.result;
							 | 
						|
								          }
							 | 
						|
								          s0 = peg$currPos;
							 | 
						|
								          if (peg$c36.test(input.charAt(peg$currPos))) {
							 | 
						|
								            s1 = input.charAt(peg$currPos);
							 | 
						|
								            peg$currPos++;
							 | 
						|
								          } else {
							 | 
						|
								            s1 = peg$FAILED;
							 | 
						|
								            {
							 | 
						|
								              peg$fail(peg$c37);
							 | 
						|
								            }
							 | 
						|
								          }
							 | 
						|
								          if (s1 === peg$FAILED) {
							 | 
						|
								            s1 = null;
							 | 
						|
								          }
							 | 
						|
								          if (s1 !== peg$FAILED) {
							 | 
						|
								            if (input.charCodeAt(peg$currPos) === 61) {
							 | 
						|
								              s2 = peg$c38;
							 | 
						|
								              peg$currPos++;
							 | 
						|
								            } else {
							 | 
						|
								              s2 = peg$FAILED;
							 | 
						|
								              {
							 | 
						|
								                peg$fail(peg$c39);
							 | 
						|
								              }
							 | 
						|
								            }
							 | 
						|
								            if (s2 !== peg$FAILED) {
							 | 
						|
								              s1 = peg$c40(s1);
							 | 
						|
								              s0 = s1;
							 | 
						|
								            } else {
							 | 
						|
								              peg$currPos = s0;
							 | 
						|
								              s0 = peg$FAILED;
							 | 
						|
								            }
							 | 
						|
								          } else {
							 | 
						|
								            peg$currPos = s0;
							 | 
						|
								            s0 = peg$FAILED;
							 | 
						|
								          }
							 | 
						|
								          if (s0 === peg$FAILED) {
							 | 
						|
								            if (peg$c41.test(input.charAt(peg$currPos))) {
							 | 
						|
								              s0 = input.charAt(peg$currPos);
							 | 
						|
								              peg$currPos++;
							 | 
						|
								            } else {
							 | 
						|
								              s0 = peg$FAILED;
							 | 
						|
								              {
							 | 
						|
								                peg$fail(peg$c42);
							 | 
						|
								              }
							 | 
						|
								            }
							 | 
						|
								          }
							 | 
						|
								          peg$resultsCache[key] = {
							 | 
						|
								            nextPos: peg$currPos,
							 | 
						|
								            result: s0
							 | 
						|
								          };
							 | 
						|
								          return s0;
							 | 
						|
								        }
							 | 
						|
								        function peg$parseattrEqOps() {
							 | 
						|
								          var s0, s1, s2;
							 | 
						|
								          var key = peg$currPos * 32 + 14,
							 | 
						|
								            cached = peg$resultsCache[key];
							 | 
						|
								          if (cached) {
							 | 
						|
								            peg$currPos = cached.nextPos;
							 | 
						|
								            return cached.result;
							 | 
						|
								          }
							 | 
						|
								          s0 = peg$currPos;
							 | 
						|
								          if (input.charCodeAt(peg$currPos) === 33) {
							 | 
						|
								            s1 = peg$c22;
							 | 
						|
								            peg$currPos++;
							 | 
						|
								          } else {
							 | 
						|
								            s1 = peg$FAILED;
							 | 
						|
								            {
							 | 
						|
								              peg$fail(peg$c23);
							 | 
						|
								            }
							 | 
						|
								          }
							 | 
						|
								          if (s1 === peg$FAILED) {
							 | 
						|
								            s1 = null;
							 | 
						|
								          }
							 | 
						|
								          if (s1 !== peg$FAILED) {
							 | 
						|
								            if (input.charCodeAt(peg$currPos) === 61) {
							 | 
						|
								              s2 = peg$c38;
							 | 
						|
								              peg$currPos++;
							 | 
						|
								            } else {
							 | 
						|
								              s2 = peg$FAILED;
							 | 
						|
								              {
							 | 
						|
								                peg$fail(peg$c39);
							 | 
						|
								              }
							 | 
						|
								            }
							 | 
						|
								            if (s2 !== peg$FAILED) {
							 | 
						|
								              s1 = peg$c40(s1);
							 | 
						|
								              s0 = s1;
							 | 
						|
								            } else {
							 | 
						|
								              peg$currPos = s0;
							 | 
						|
								              s0 = peg$FAILED;
							 | 
						|
								            }
							 | 
						|
								          } else {
							 | 
						|
								            peg$currPos = s0;
							 | 
						|
								            s0 = peg$FAILED;
							 | 
						|
								          }
							 | 
						|
								          peg$resultsCache[key] = {
							 | 
						|
								            nextPos: peg$currPos,
							 | 
						|
								            result: s0
							 | 
						|
								          };
							 | 
						|
								          return s0;
							 | 
						|
								        }
							 | 
						|
								        function peg$parseattrName() {
							 | 
						|
								          var s0, s1, s2, s3, s4, s5;
							 | 
						|
								          var key = peg$currPos * 32 + 15,
							 | 
						|
								            cached = peg$resultsCache[key];
							 | 
						|
								          if (cached) {
							 | 
						|
								            peg$currPos = cached.nextPos;
							 | 
						|
								            return cached.result;
							 | 
						|
								          }
							 | 
						|
								          s0 = peg$currPos;
							 | 
						|
								          s1 = peg$parseidentifierName();
							 | 
						|
								          if (s1 !== peg$FAILED) {
							 | 
						|
								            s2 = [];
							 | 
						|
								            s3 = peg$currPos;
							 | 
						|
								            if (input.charCodeAt(peg$currPos) === 46) {
							 | 
						|
								              s4 = peg$c43;
							 | 
						|
								              peg$currPos++;
							 | 
						|
								            } else {
							 | 
						|
								              s4 = peg$FAILED;
							 | 
						|
								              {
							 | 
						|
								                peg$fail(peg$c44);
							 | 
						|
								              }
							 | 
						|
								            }
							 | 
						|
								            if (s4 !== peg$FAILED) {
							 | 
						|
								              s5 = peg$parseidentifierName();
							 | 
						|
								              if (s5 !== peg$FAILED) {
							 | 
						|
								                s4 = [s4, s5];
							 | 
						|
								                s3 = s4;
							 | 
						|
								              } else {
							 | 
						|
								                peg$currPos = s3;
							 | 
						|
								                s3 = peg$FAILED;
							 | 
						|
								              }
							 | 
						|
								            } else {
							 | 
						|
								              peg$currPos = s3;
							 | 
						|
								              s3 = peg$FAILED;
							 | 
						|
								            }
							 | 
						|
								            while (s3 !== peg$FAILED) {
							 | 
						|
								              s2.push(s3);
							 | 
						|
								              s3 = peg$currPos;
							 | 
						|
								              if (input.charCodeAt(peg$currPos) === 46) {
							 | 
						|
								                s4 = peg$c43;
							 | 
						|
								                peg$currPos++;
							 | 
						|
								              } else {
							 | 
						|
								                s4 = peg$FAILED;
							 | 
						|
								                {
							 | 
						|
								                  peg$fail(peg$c44);
							 | 
						|
								                }
							 | 
						|
								              }
							 | 
						|
								              if (s4 !== peg$FAILED) {
							 | 
						|
								                s5 = peg$parseidentifierName();
							 | 
						|
								                if (s5 !== peg$FAILED) {
							 | 
						|
								                  s4 = [s4, s5];
							 | 
						|
								                  s3 = s4;
							 | 
						|
								                } else {
							 | 
						|
								                  peg$currPos = s3;
							 | 
						|
								                  s3 = peg$FAILED;
							 | 
						|
								                }
							 | 
						|
								              } else {
							 | 
						|
								                peg$currPos = s3;
							 | 
						|
								                s3 = peg$FAILED;
							 | 
						|
								              }
							 | 
						|
								            }
							 | 
						|
								            if (s2 !== peg$FAILED) {
							 | 
						|
								              s1 = peg$c45(s1, s2);
							 | 
						|
								              s0 = s1;
							 | 
						|
								            } else {
							 | 
						|
								              peg$currPos = s0;
							 | 
						|
								              s0 = peg$FAILED;
							 | 
						|
								            }
							 | 
						|
								          } else {
							 | 
						|
								            peg$currPos = s0;
							 | 
						|
								            s0 = peg$FAILED;
							 | 
						|
								          }
							 | 
						|
								          peg$resultsCache[key] = {
							 | 
						|
								            nextPos: peg$currPos,
							 | 
						|
								            result: s0
							 | 
						|
								          };
							 | 
						|
								          return s0;
							 | 
						|
								        }
							 | 
						|
								        function peg$parseattrValue() {
							 | 
						|
								          var s0, s1, s2, s3, s4, s5;
							 | 
						|
								          var key = peg$currPos * 32 + 16,
							 | 
						|
								            cached = peg$resultsCache[key];
							 | 
						|
								          if (cached) {
							 | 
						|
								            peg$currPos = cached.nextPos;
							 | 
						|
								            return cached.result;
							 | 
						|
								          }
							 | 
						|
								          s0 = peg$currPos;
							 | 
						|
								          s1 = peg$parseattrName();
							 | 
						|
								          if (s1 !== peg$FAILED) {
							 | 
						|
								            s2 = peg$parse_();
							 | 
						|
								            if (s2 !== peg$FAILED) {
							 | 
						|
								              s3 = peg$parseattrEqOps();
							 | 
						|
								              if (s3 !== peg$FAILED) {
							 | 
						|
								                s4 = peg$parse_();
							 | 
						|
								                if (s4 !== peg$FAILED) {
							 | 
						|
								                  s5 = peg$parsetype();
							 | 
						|
								                  if (s5 === peg$FAILED) {
							 | 
						|
								                    s5 = peg$parseregex();
							 | 
						|
								                  }
							 | 
						|
								                  if (s5 !== peg$FAILED) {
							 | 
						|
								                    s1 = peg$c46(s1, s3, s5);
							 | 
						|
								                    s0 = s1;
							 | 
						|
								                  } else {
							 | 
						|
								                    peg$currPos = s0;
							 | 
						|
								                    s0 = peg$FAILED;
							 | 
						|
								                  }
							 | 
						|
								                } else {
							 | 
						|
								                  peg$currPos = s0;
							 | 
						|
								                  s0 = peg$FAILED;
							 | 
						|
								                }
							 | 
						|
								              } else {
							 | 
						|
								                peg$currPos = s0;
							 | 
						|
								                s0 = peg$FAILED;
							 | 
						|
								              }
							 | 
						|
								            } else {
							 | 
						|
								              peg$currPos = s0;
							 | 
						|
								              s0 = peg$FAILED;
							 | 
						|
								            }
							 | 
						|
								          } else {
							 | 
						|
								            peg$currPos = s0;
							 | 
						|
								            s0 = peg$FAILED;
							 | 
						|
								          }
							 | 
						|
								          if (s0 === peg$FAILED) {
							 | 
						|
								            s0 = peg$currPos;
							 | 
						|
								            s1 = peg$parseattrName();
							 | 
						|
								            if (s1 !== peg$FAILED) {
							 | 
						|
								              s2 = peg$parse_();
							 | 
						|
								              if (s2 !== peg$FAILED) {
							 | 
						|
								                s3 = peg$parseattrOps();
							 | 
						|
								                if (s3 !== peg$FAILED) {
							 | 
						|
								                  s4 = peg$parse_();
							 | 
						|
								                  if (s4 !== peg$FAILED) {
							 | 
						|
								                    s5 = peg$parsestring();
							 | 
						|
								                    if (s5 === peg$FAILED) {
							 | 
						|
								                      s5 = peg$parsenumber();
							 | 
						|
								                      if (s5 === peg$FAILED) {
							 | 
						|
								                        s5 = peg$parsepath();
							 | 
						|
								                      }
							 | 
						|
								                    }
							 | 
						|
								                    if (s5 !== peg$FAILED) {
							 | 
						|
								                      s1 = peg$c46(s1, s3, s5);
							 | 
						|
								                      s0 = s1;
							 | 
						|
								                    } else {
							 | 
						|
								                      peg$currPos = s0;
							 | 
						|
								                      s0 = peg$FAILED;
							 | 
						|
								                    }
							 | 
						|
								                  } else {
							 | 
						|
								                    peg$currPos = s0;
							 | 
						|
								                    s0 = peg$FAILED;
							 | 
						|
								                  }
							 | 
						|
								                } else {
							 | 
						|
								                  peg$currPos = s0;
							 | 
						|
								                  s0 = peg$FAILED;
							 | 
						|
								                }
							 | 
						|
								              } else {
							 | 
						|
								                peg$currPos = s0;
							 | 
						|
								                s0 = peg$FAILED;
							 | 
						|
								              }
							 | 
						|
								            } else {
							 | 
						|
								              peg$currPos = s0;
							 | 
						|
								              s0 = peg$FAILED;
							 | 
						|
								            }
							 | 
						|
								            if (s0 === peg$FAILED) {
							 | 
						|
								              s0 = peg$currPos;
							 | 
						|
								              s1 = peg$parseattrName();
							 | 
						|
								              if (s1 !== peg$FAILED) {
							 | 
						|
								                s1 = peg$c47(s1);
							 | 
						|
								              }
							 | 
						|
								              s0 = s1;
							 | 
						|
								            }
							 | 
						|
								          }
							 | 
						|
								          peg$resultsCache[key] = {
							 | 
						|
								            nextPos: peg$currPos,
							 | 
						|
								            result: s0
							 | 
						|
								          };
							 | 
						|
								          return s0;
							 | 
						|
								        }
							 | 
						|
								        function peg$parsestring() {
							 | 
						|
								          var s0, s1, s2, s3, s4, s5;
							 | 
						|
								          var key = peg$currPos * 32 + 17,
							 | 
						|
								            cached = peg$resultsCache[key];
							 | 
						|
								          if (cached) {
							 | 
						|
								            peg$currPos = cached.nextPos;
							 | 
						|
								            return cached.result;
							 | 
						|
								          }
							 | 
						|
								          s0 = peg$currPos;
							 | 
						|
								          if (input.charCodeAt(peg$currPos) === 34) {
							 | 
						|
								            s1 = peg$c48;
							 | 
						|
								            peg$currPos++;
							 | 
						|
								          } else {
							 | 
						|
								            s1 = peg$FAILED;
							 | 
						|
								            {
							 | 
						|
								              peg$fail(peg$c49);
							 | 
						|
								            }
							 | 
						|
								          }
							 | 
						|
								          if (s1 !== peg$FAILED) {
							 | 
						|
								            s2 = [];
							 | 
						|
								            if (peg$c50.test(input.charAt(peg$currPos))) {
							 | 
						|
								              s3 = input.charAt(peg$currPos);
							 | 
						|
								              peg$currPos++;
							 | 
						|
								            } else {
							 | 
						|
								              s3 = peg$FAILED;
							 | 
						|
								              {
							 | 
						|
								                peg$fail(peg$c51);
							 | 
						|
								              }
							 | 
						|
								            }
							 | 
						|
								            if (s3 === peg$FAILED) {
							 | 
						|
								              s3 = peg$currPos;
							 | 
						|
								              if (input.charCodeAt(peg$currPos) === 92) {
							 | 
						|
								                s4 = peg$c52;
							 | 
						|
								                peg$currPos++;
							 | 
						|
								              } else {
							 | 
						|
								                s4 = peg$FAILED;
							 | 
						|
								                {
							 | 
						|
								                  peg$fail(peg$c53);
							 | 
						|
								                }
							 | 
						|
								              }
							 | 
						|
								              if (s4 !== peg$FAILED) {
							 | 
						|
								                if (input.length > peg$currPos) {
							 | 
						|
								                  s5 = input.charAt(peg$currPos);
							 | 
						|
								                  peg$currPos++;
							 | 
						|
								                } else {
							 | 
						|
								                  s5 = peg$FAILED;
							 | 
						|
								                  {
							 | 
						|
								                    peg$fail(peg$c54);
							 | 
						|
								                  }
							 | 
						|
								                }
							 | 
						|
								                if (s5 !== peg$FAILED) {
							 | 
						|
								                  s4 = peg$c55(s4, s5);
							 | 
						|
								                  s3 = s4;
							 | 
						|
								                } else {
							 | 
						|
								                  peg$currPos = s3;
							 | 
						|
								                  s3 = peg$FAILED;
							 | 
						|
								                }
							 | 
						|
								              } else {
							 | 
						|
								                peg$currPos = s3;
							 | 
						|
								                s3 = peg$FAILED;
							 | 
						|
								              }
							 | 
						|
								            }
							 | 
						|
								            while (s3 !== peg$FAILED) {
							 | 
						|
								              s2.push(s3);
							 | 
						|
								              if (peg$c50.test(input.charAt(peg$currPos))) {
							 | 
						|
								                s3 = input.charAt(peg$currPos);
							 | 
						|
								                peg$currPos++;
							 | 
						|
								              } else {
							 | 
						|
								                s3 = peg$FAILED;
							 | 
						|
								                {
							 | 
						|
								                  peg$fail(peg$c51);
							 | 
						|
								                }
							 | 
						|
								              }
							 | 
						|
								              if (s3 === peg$FAILED) {
							 | 
						|
								                s3 = peg$currPos;
							 | 
						|
								                if (input.charCodeAt(peg$currPos) === 92) {
							 | 
						|
								                  s4 = peg$c52;
							 | 
						|
								                  peg$currPos++;
							 | 
						|
								                } else {
							 | 
						|
								                  s4 = peg$FAILED;
							 | 
						|
								                  {
							 | 
						|
								                    peg$fail(peg$c53);
							 | 
						|
								                  }
							 | 
						|
								                }
							 | 
						|
								                if (s4 !== peg$FAILED) {
							 | 
						|
								                  if (input.length > peg$currPos) {
							 | 
						|
								                    s5 = input.charAt(peg$currPos);
							 | 
						|
								                    peg$currPos++;
							 | 
						|
								                  } else {
							 | 
						|
								                    s5 = peg$FAILED;
							 | 
						|
								                    {
							 | 
						|
								                      peg$fail(peg$c54);
							 | 
						|
								                    }
							 | 
						|
								                  }
							 | 
						|
								                  if (s5 !== peg$FAILED) {
							 | 
						|
								                    s4 = peg$c55(s4, s5);
							 | 
						|
								                    s3 = s4;
							 | 
						|
								                  } else {
							 | 
						|
								                    peg$currPos = s3;
							 | 
						|
								                    s3 = peg$FAILED;
							 | 
						|
								                  }
							 | 
						|
								                } else {
							 | 
						|
								                  peg$currPos = s3;
							 | 
						|
								                  s3 = peg$FAILED;
							 | 
						|
								                }
							 | 
						|
								              }
							 | 
						|
								            }
							 | 
						|
								            if (s2 !== peg$FAILED) {
							 | 
						|
								              if (input.charCodeAt(peg$currPos) === 34) {
							 | 
						|
								                s3 = peg$c48;
							 | 
						|
								                peg$currPos++;
							 | 
						|
								              } else {
							 | 
						|
								                s3 = peg$FAILED;
							 | 
						|
								                {
							 | 
						|
								                  peg$fail(peg$c49);
							 | 
						|
								                }
							 | 
						|
								              }
							 | 
						|
								              if (s3 !== peg$FAILED) {
							 | 
						|
								                s1 = peg$c56(s2);
							 | 
						|
								                s0 = s1;
							 | 
						|
								              } else {
							 | 
						|
								                peg$currPos = s0;
							 | 
						|
								                s0 = peg$FAILED;
							 | 
						|
								              }
							 | 
						|
								            } else {
							 | 
						|
								              peg$currPos = s0;
							 | 
						|
								              s0 = peg$FAILED;
							 | 
						|
								            }
							 | 
						|
								          } else {
							 | 
						|
								            peg$currPos = s0;
							 | 
						|
								            s0 = peg$FAILED;
							 | 
						|
								          }
							 | 
						|
								          if (s0 === peg$FAILED) {
							 | 
						|
								            s0 = peg$currPos;
							 | 
						|
								            if (input.charCodeAt(peg$currPos) === 39) {
							 | 
						|
								              s1 = peg$c57;
							 | 
						|
								              peg$currPos++;
							 | 
						|
								            } else {
							 | 
						|
								              s1 = peg$FAILED;
							 | 
						|
								              {
							 | 
						|
								                peg$fail(peg$c58);
							 | 
						|
								              }
							 | 
						|
								            }
							 | 
						|
								            if (s1 !== peg$FAILED) {
							 | 
						|
								              s2 = [];
							 | 
						|
								              if (peg$c59.test(input.charAt(peg$currPos))) {
							 | 
						|
								                s3 = input.charAt(peg$currPos);
							 | 
						|
								                peg$currPos++;
							 | 
						|
								              } else {
							 | 
						|
								                s3 = peg$FAILED;
							 | 
						|
								                {
							 | 
						|
								                  peg$fail(peg$c60);
							 | 
						|
								                }
							 | 
						|
								              }
							 | 
						|
								              if (s3 === peg$FAILED) {
							 | 
						|
								                s3 = peg$currPos;
							 | 
						|
								                if (input.charCodeAt(peg$currPos) === 92) {
							 | 
						|
								                  s4 = peg$c52;
							 | 
						|
								                  peg$currPos++;
							 | 
						|
								                } else {
							 | 
						|
								                  s4 = peg$FAILED;
							 | 
						|
								                  {
							 | 
						|
								                    peg$fail(peg$c53);
							 | 
						|
								                  }
							 | 
						|
								                }
							 | 
						|
								                if (s4 !== peg$FAILED) {
							 | 
						|
								                  if (input.length > peg$currPos) {
							 | 
						|
								                    s5 = input.charAt(peg$currPos);
							 | 
						|
								                    peg$currPos++;
							 | 
						|
								                  } else {
							 | 
						|
								                    s5 = peg$FAILED;
							 | 
						|
								                    {
							 | 
						|
								                      peg$fail(peg$c54);
							 | 
						|
								                    }
							 | 
						|
								                  }
							 | 
						|
								                  if (s5 !== peg$FAILED) {
							 | 
						|
								                    s4 = peg$c55(s4, s5);
							 | 
						|
								                    s3 = s4;
							 | 
						|
								                  } else {
							 | 
						|
								                    peg$currPos = s3;
							 | 
						|
								                    s3 = peg$FAILED;
							 | 
						|
								                  }
							 | 
						|
								                } else {
							 | 
						|
								                  peg$currPos = s3;
							 | 
						|
								                  s3 = peg$FAILED;
							 | 
						|
								                }
							 | 
						|
								              }
							 | 
						|
								              while (s3 !== peg$FAILED) {
							 | 
						|
								                s2.push(s3);
							 | 
						|
								                if (peg$c59.test(input.charAt(peg$currPos))) {
							 | 
						|
								                  s3 = input.charAt(peg$currPos);
							 | 
						|
								                  peg$currPos++;
							 | 
						|
								                } else {
							 | 
						|
								                  s3 = peg$FAILED;
							 | 
						|
								                  {
							 | 
						|
								                    peg$fail(peg$c60);
							 | 
						|
								                  }
							 | 
						|
								                }
							 | 
						|
								                if (s3 === peg$FAILED) {
							 | 
						|
								                  s3 = peg$currPos;
							 | 
						|
								                  if (input.charCodeAt(peg$currPos) === 92) {
							 | 
						|
								                    s4 = peg$c52;
							 | 
						|
								                    peg$currPos++;
							 | 
						|
								                  } else {
							 | 
						|
								                    s4 = peg$FAILED;
							 | 
						|
								                    {
							 | 
						|
								                      peg$fail(peg$c53);
							 | 
						|
								                    }
							 | 
						|
								                  }
							 | 
						|
								                  if (s4 !== peg$FAILED) {
							 | 
						|
								                    if (input.length > peg$currPos) {
							 | 
						|
								                      s5 = input.charAt(peg$currPos);
							 | 
						|
								                      peg$currPos++;
							 | 
						|
								                    } else {
							 | 
						|
								                      s5 = peg$FAILED;
							 | 
						|
								                      {
							 | 
						|
								                        peg$fail(peg$c54);
							 | 
						|
								                      }
							 | 
						|
								                    }
							 | 
						|
								                    if (s5 !== peg$FAILED) {
							 | 
						|
								                      s4 = peg$c55(s4, s5);
							 | 
						|
								                      s3 = s4;
							 | 
						|
								                    } else {
							 | 
						|
								                      peg$currPos = s3;
							 | 
						|
								                      s3 = peg$FAILED;
							 | 
						|
								                    }
							 | 
						|
								                  } else {
							 | 
						|
								                    peg$currPos = s3;
							 | 
						|
								                    s3 = peg$FAILED;
							 | 
						|
								                  }
							 | 
						|
								                }
							 | 
						|
								              }
							 | 
						|
								              if (s2 !== peg$FAILED) {
							 | 
						|
								                if (input.charCodeAt(peg$currPos) === 39) {
							 | 
						|
								                  s3 = peg$c57;
							 | 
						|
								                  peg$currPos++;
							 | 
						|
								                } else {
							 | 
						|
								                  s3 = peg$FAILED;
							 | 
						|
								                  {
							 | 
						|
								                    peg$fail(peg$c58);
							 | 
						|
								                  }
							 | 
						|
								                }
							 | 
						|
								                if (s3 !== peg$FAILED) {
							 | 
						|
								                  s1 = peg$c56(s2);
							 | 
						|
								                  s0 = s1;
							 | 
						|
								                } else {
							 | 
						|
								                  peg$currPos = s0;
							 | 
						|
								                  s0 = peg$FAILED;
							 | 
						|
								                }
							 | 
						|
								              } else {
							 | 
						|
								                peg$currPos = s0;
							 | 
						|
								                s0 = peg$FAILED;
							 | 
						|
								              }
							 | 
						|
								            } else {
							 | 
						|
								              peg$currPos = s0;
							 | 
						|
								              s0 = peg$FAILED;
							 | 
						|
								            }
							 | 
						|
								          }
							 | 
						|
								          peg$resultsCache[key] = {
							 | 
						|
								            nextPos: peg$currPos,
							 | 
						|
								            result: s0
							 | 
						|
								          };
							 | 
						|
								          return s0;
							 | 
						|
								        }
							 | 
						|
								        function peg$parsenumber() {
							 | 
						|
								          var s0, s1, s2, s3;
							 | 
						|
								          var key = peg$currPos * 32 + 18,
							 | 
						|
								            cached = peg$resultsCache[key];
							 | 
						|
								          if (cached) {
							 | 
						|
								            peg$currPos = cached.nextPos;
							 | 
						|
								            return cached.result;
							 | 
						|
								          }
							 | 
						|
								          s0 = peg$currPos;
							 | 
						|
								          s1 = peg$currPos;
							 | 
						|
								          s2 = [];
							 | 
						|
								          if (peg$c61.test(input.charAt(peg$currPos))) {
							 | 
						|
								            s3 = input.charAt(peg$currPos);
							 | 
						|
								            peg$currPos++;
							 | 
						|
								          } else {
							 | 
						|
								            s3 = peg$FAILED;
							 | 
						|
								            {
							 | 
						|
								              peg$fail(peg$c62);
							 | 
						|
								            }
							 | 
						|
								          }
							 | 
						|
								          while (s3 !== peg$FAILED) {
							 | 
						|
								            s2.push(s3);
							 | 
						|
								            if (peg$c61.test(input.charAt(peg$currPos))) {
							 | 
						|
								              s3 = input.charAt(peg$currPos);
							 | 
						|
								              peg$currPos++;
							 | 
						|
								            } else {
							 | 
						|
								              s3 = peg$FAILED;
							 | 
						|
								              {
							 | 
						|
								                peg$fail(peg$c62);
							 | 
						|
								              }
							 | 
						|
								            }
							 | 
						|
								          }
							 | 
						|
								          if (s2 !== peg$FAILED) {
							 | 
						|
								            if (input.charCodeAt(peg$currPos) === 46) {
							 | 
						|
								              s3 = peg$c43;
							 | 
						|
								              peg$currPos++;
							 | 
						|
								            } else {
							 | 
						|
								              s3 = peg$FAILED;
							 | 
						|
								              {
							 | 
						|
								                peg$fail(peg$c44);
							 | 
						|
								              }
							 | 
						|
								            }
							 | 
						|
								            if (s3 !== peg$FAILED) {
							 | 
						|
								              s2 = [s2, s3];
							 | 
						|
								              s1 = s2;
							 | 
						|
								            } else {
							 | 
						|
								              peg$currPos = s1;
							 | 
						|
								              s1 = peg$FAILED;
							 | 
						|
								            }
							 | 
						|
								          } else {
							 | 
						|
								            peg$currPos = s1;
							 | 
						|
								            s1 = peg$FAILED;
							 | 
						|
								          }
							 | 
						|
								          if (s1 === peg$FAILED) {
							 | 
						|
								            s1 = null;
							 | 
						|
								          }
							 | 
						|
								          if (s1 !== peg$FAILED) {
							 | 
						|
								            s2 = [];
							 | 
						|
								            if (peg$c61.test(input.charAt(peg$currPos))) {
							 | 
						|
								              s3 = input.charAt(peg$currPos);
							 | 
						|
								              peg$currPos++;
							 | 
						|
								            } else {
							 | 
						|
								              s3 = peg$FAILED;
							 | 
						|
								              {
							 | 
						|
								                peg$fail(peg$c62);
							 | 
						|
								              }
							 | 
						|
								            }
							 | 
						|
								            if (s3 !== peg$FAILED) {
							 | 
						|
								              while (s3 !== peg$FAILED) {
							 | 
						|
								                s2.push(s3);
							 | 
						|
								                if (peg$c61.test(input.charAt(peg$currPos))) {
							 | 
						|
								                  s3 = input.charAt(peg$currPos);
							 | 
						|
								                  peg$currPos++;
							 | 
						|
								                } else {
							 | 
						|
								                  s3 = peg$FAILED;
							 | 
						|
								                  {
							 | 
						|
								                    peg$fail(peg$c62);
							 | 
						|
								                  }
							 | 
						|
								                }
							 | 
						|
								              }
							 | 
						|
								            } else {
							 | 
						|
								              s2 = peg$FAILED;
							 | 
						|
								            }
							 | 
						|
								            if (s2 !== peg$FAILED) {
							 | 
						|
								              s1 = peg$c63(s1, s2);
							 | 
						|
								              s0 = s1;
							 | 
						|
								            } else {
							 | 
						|
								              peg$currPos = s0;
							 | 
						|
								              s0 = peg$FAILED;
							 | 
						|
								            }
							 | 
						|
								          } else {
							 | 
						|
								            peg$currPos = s0;
							 | 
						|
								            s0 = peg$FAILED;
							 | 
						|
								          }
							 | 
						|
								          peg$resultsCache[key] = {
							 | 
						|
								            nextPos: peg$currPos,
							 | 
						|
								            result: s0
							 | 
						|
								          };
							 | 
						|
								          return s0;
							 | 
						|
								        }
							 | 
						|
								        function peg$parsepath() {
							 | 
						|
								          var s0, s1;
							 | 
						|
								          var key = peg$currPos * 32 + 19,
							 | 
						|
								            cached = peg$resultsCache[key];
							 | 
						|
								          if (cached) {
							 | 
						|
								            peg$currPos = cached.nextPos;
							 | 
						|
								            return cached.result;
							 | 
						|
								          }
							 | 
						|
								          s0 = peg$currPos;
							 | 
						|
								          s1 = peg$parseidentifierName();
							 | 
						|
								          if (s1 !== peg$FAILED) {
							 | 
						|
								            s1 = peg$c64(s1);
							 | 
						|
								          }
							 | 
						|
								          s0 = s1;
							 | 
						|
								          peg$resultsCache[key] = {
							 | 
						|
								            nextPos: peg$currPos,
							 | 
						|
								            result: s0
							 | 
						|
								          };
							 | 
						|
								          return s0;
							 | 
						|
								        }
							 | 
						|
								        function peg$parsetype() {
							 | 
						|
								          var s0, s1, s2, s3, s4, s5;
							 | 
						|
								          var key = peg$currPos * 32 + 20,
							 | 
						|
								            cached = peg$resultsCache[key];
							 | 
						|
								          if (cached) {
							 | 
						|
								            peg$currPos = cached.nextPos;
							 | 
						|
								            return cached.result;
							 | 
						|
								          }
							 | 
						|
								          s0 = peg$currPos;
							 | 
						|
								          if (input.substr(peg$currPos, 5) === peg$c65) {
							 | 
						|
								            s1 = peg$c65;
							 | 
						|
								            peg$currPos += 5;
							 | 
						|
								          } else {
							 | 
						|
								            s1 = peg$FAILED;
							 | 
						|
								            {
							 | 
						|
								              peg$fail(peg$c66);
							 | 
						|
								            }
							 | 
						|
								          }
							 | 
						|
								          if (s1 !== peg$FAILED) {
							 | 
						|
								            s2 = peg$parse_();
							 | 
						|
								            if (s2 !== peg$FAILED) {
							 | 
						|
								              s3 = [];
							 | 
						|
								              if (peg$c67.test(input.charAt(peg$currPos))) {
							 | 
						|
								                s4 = input.charAt(peg$currPos);
							 | 
						|
								                peg$currPos++;
							 | 
						|
								              } else {
							 | 
						|
								                s4 = peg$FAILED;
							 | 
						|
								                {
							 | 
						|
								                  peg$fail(peg$c68);
							 | 
						|
								                }
							 | 
						|
								              }
							 | 
						|
								              if (s4 !== peg$FAILED) {
							 | 
						|
								                while (s4 !== peg$FAILED) {
							 | 
						|
								                  s3.push(s4);
							 | 
						|
								                  if (peg$c67.test(input.charAt(peg$currPos))) {
							 | 
						|
								                    s4 = input.charAt(peg$currPos);
							 | 
						|
								                    peg$currPos++;
							 | 
						|
								                  } else {
							 | 
						|
								                    s4 = peg$FAILED;
							 | 
						|
								                    {
							 | 
						|
								                      peg$fail(peg$c68);
							 | 
						|
								                    }
							 | 
						|
								                  }
							 | 
						|
								                }
							 | 
						|
								              } else {
							 | 
						|
								                s3 = peg$FAILED;
							 | 
						|
								              }
							 | 
						|
								              if (s3 !== peg$FAILED) {
							 | 
						|
								                s4 = peg$parse_();
							 | 
						|
								                if (s4 !== peg$FAILED) {
							 | 
						|
								                  if (input.charCodeAt(peg$currPos) === 41) {
							 | 
						|
								                    s5 = peg$c69;
							 | 
						|
								                    peg$currPos++;
							 | 
						|
								                  } else {
							 | 
						|
								                    s5 = peg$FAILED;
							 | 
						|
								                    {
							 | 
						|
								                      peg$fail(peg$c70);
							 | 
						|
								                    }
							 | 
						|
								                  }
							 | 
						|
								                  if (s5 !== peg$FAILED) {
							 | 
						|
								                    s1 = peg$c71(s3);
							 | 
						|
								                    s0 = s1;
							 | 
						|
								                  } else {
							 | 
						|
								                    peg$currPos = s0;
							 | 
						|
								                    s0 = peg$FAILED;
							 | 
						|
								                  }
							 | 
						|
								                } else {
							 | 
						|
								                  peg$currPos = s0;
							 | 
						|
								                  s0 = peg$FAILED;
							 | 
						|
								                }
							 | 
						|
								              } else {
							 | 
						|
								                peg$currPos = s0;
							 | 
						|
								                s0 = peg$FAILED;
							 | 
						|
								              }
							 | 
						|
								            } else {
							 | 
						|
								              peg$currPos = s0;
							 | 
						|
								              s0 = peg$FAILED;
							 | 
						|
								            }
							 | 
						|
								          } else {
							 | 
						|
								            peg$currPos = s0;
							 | 
						|
								            s0 = peg$FAILED;
							 | 
						|
								          }
							 | 
						|
								          peg$resultsCache[key] = {
							 | 
						|
								            nextPos: peg$currPos,
							 | 
						|
								            result: s0
							 | 
						|
								          };
							 | 
						|
								          return s0;
							 | 
						|
								        }
							 | 
						|
								        function peg$parseflags() {
							 | 
						|
								          var s0, s1;
							 | 
						|
								          var key = peg$currPos * 32 + 21,
							 | 
						|
								            cached = peg$resultsCache[key];
							 | 
						|
								          if (cached) {
							 | 
						|
								            peg$currPos = cached.nextPos;
							 | 
						|
								            return cached.result;
							 | 
						|
								          }
							 | 
						|
								          s0 = [];
							 | 
						|
								          if (peg$c72.test(input.charAt(peg$currPos))) {
							 | 
						|
								            s1 = input.charAt(peg$currPos);
							 | 
						|
								            peg$currPos++;
							 | 
						|
								          } else {
							 | 
						|
								            s1 = peg$FAILED;
							 | 
						|
								            {
							 | 
						|
								              peg$fail(peg$c73);
							 | 
						|
								            }
							 | 
						|
								          }
							 | 
						|
								          if (s1 !== peg$FAILED) {
							 | 
						|
								            while (s1 !== peg$FAILED) {
							 | 
						|
								              s0.push(s1);
							 | 
						|
								              if (peg$c72.test(input.charAt(peg$currPos))) {
							 | 
						|
								                s1 = input.charAt(peg$currPos);
							 | 
						|
								                peg$currPos++;
							 | 
						|
								              } else {
							 | 
						|
								                s1 = peg$FAILED;
							 | 
						|
								                {
							 | 
						|
								                  peg$fail(peg$c73);
							 | 
						|
								                }
							 | 
						|
								              }
							 | 
						|
								            }
							 | 
						|
								          } else {
							 | 
						|
								            s0 = peg$FAILED;
							 | 
						|
								          }
							 | 
						|
								          peg$resultsCache[key] = {
							 | 
						|
								            nextPos: peg$currPos,
							 | 
						|
								            result: s0
							 | 
						|
								          };
							 | 
						|
								          return s0;
							 | 
						|
								        }
							 | 
						|
								        function peg$parseregex() {
							 | 
						|
								          var s0, s1, s2, s3, s4;
							 | 
						|
								          var key = peg$currPos * 32 + 22,
							 | 
						|
								            cached = peg$resultsCache[key];
							 | 
						|
								          if (cached) {
							 | 
						|
								            peg$currPos = cached.nextPos;
							 | 
						|
								            return cached.result;
							 | 
						|
								          }
							 | 
						|
								          s0 = peg$currPos;
							 | 
						|
								          if (input.charCodeAt(peg$currPos) === 47) {
							 | 
						|
								            s1 = peg$c74;
							 | 
						|
								            peg$currPos++;
							 | 
						|
								          } else {
							 | 
						|
								            s1 = peg$FAILED;
							 | 
						|
								            {
							 | 
						|
								              peg$fail(peg$c75);
							 | 
						|
								            }
							 | 
						|
								          }
							 | 
						|
								          if (s1 !== peg$FAILED) {
							 | 
						|
								            s2 = [];
							 | 
						|
								            if (peg$c76.test(input.charAt(peg$currPos))) {
							 | 
						|
								              s3 = input.charAt(peg$currPos);
							 | 
						|
								              peg$currPos++;
							 | 
						|
								            } else {
							 | 
						|
								              s3 = peg$FAILED;
							 | 
						|
								              {
							 | 
						|
								                peg$fail(peg$c77);
							 | 
						|
								              }
							 | 
						|
								            }
							 | 
						|
								            if (s3 !== peg$FAILED) {
							 | 
						|
								              while (s3 !== peg$FAILED) {
							 | 
						|
								                s2.push(s3);
							 | 
						|
								                if (peg$c76.test(input.charAt(peg$currPos))) {
							 | 
						|
								                  s3 = input.charAt(peg$currPos);
							 | 
						|
								                  peg$currPos++;
							 | 
						|
								                } else {
							 | 
						|
								                  s3 = peg$FAILED;
							 | 
						|
								                  {
							 | 
						|
								                    peg$fail(peg$c77);
							 | 
						|
								                  }
							 | 
						|
								                }
							 | 
						|
								              }
							 | 
						|
								            } else {
							 | 
						|
								              s2 = peg$FAILED;
							 | 
						|
								            }
							 | 
						|
								            if (s2 !== peg$FAILED) {
							 | 
						|
								              if (input.charCodeAt(peg$currPos) === 47) {
							 | 
						|
								                s3 = peg$c74;
							 | 
						|
								                peg$currPos++;
							 | 
						|
								              } else {
							 | 
						|
								                s3 = peg$FAILED;
							 | 
						|
								                {
							 | 
						|
								                  peg$fail(peg$c75);
							 | 
						|
								                }
							 | 
						|
								              }
							 | 
						|
								              if (s3 !== peg$FAILED) {
							 | 
						|
								                s4 = peg$parseflags();
							 | 
						|
								                if (s4 === peg$FAILED) {
							 | 
						|
								                  s4 = null;
							 | 
						|
								                }
							 | 
						|
								                if (s4 !== peg$FAILED) {
							 | 
						|
								                  s1 = peg$c78(s2, s4);
							 | 
						|
								                  s0 = s1;
							 | 
						|
								                } else {
							 | 
						|
								                  peg$currPos = s0;
							 | 
						|
								                  s0 = peg$FAILED;
							 | 
						|
								                }
							 | 
						|
								              } else {
							 | 
						|
								                peg$currPos = s0;
							 | 
						|
								                s0 = peg$FAILED;
							 | 
						|
								              }
							 | 
						|
								            } else {
							 | 
						|
								              peg$currPos = s0;
							 | 
						|
								              s0 = peg$FAILED;
							 | 
						|
								            }
							 | 
						|
								          } else {
							 | 
						|
								            peg$currPos = s0;
							 | 
						|
								            s0 = peg$FAILED;
							 | 
						|
								          }
							 | 
						|
								          peg$resultsCache[key] = {
							 | 
						|
								            nextPos: peg$currPos,
							 | 
						|
								            result: s0
							 | 
						|
								          };
							 | 
						|
								          return s0;
							 | 
						|
								        }
							 | 
						|
								        function peg$parsefield() {
							 | 
						|
								          var s0, s1, s2, s3, s4, s5, s6;
							 | 
						|
								          var key = peg$currPos * 32 + 23,
							 | 
						|
								            cached = peg$resultsCache[key];
							 | 
						|
								          if (cached) {
							 | 
						|
								            peg$currPos = cached.nextPos;
							 | 
						|
								            return cached.result;
							 | 
						|
								          }
							 | 
						|
								          s0 = peg$currPos;
							 | 
						|
								          if (input.charCodeAt(peg$currPos) === 46) {
							 | 
						|
								            s1 = peg$c43;
							 | 
						|
								            peg$currPos++;
							 | 
						|
								          } else {
							 | 
						|
								            s1 = peg$FAILED;
							 | 
						|
								            {
							 | 
						|
								              peg$fail(peg$c44);
							 | 
						|
								            }
							 | 
						|
								          }
							 | 
						|
								          if (s1 !== peg$FAILED) {
							 | 
						|
								            s2 = peg$parseidentifierName();
							 | 
						|
								            if (s2 !== peg$FAILED) {
							 | 
						|
								              s3 = [];
							 | 
						|
								              s4 = peg$currPos;
							 | 
						|
								              if (input.charCodeAt(peg$currPos) === 46) {
							 | 
						|
								                s5 = peg$c43;
							 | 
						|
								                peg$currPos++;
							 | 
						|
								              } else {
							 | 
						|
								                s5 = peg$FAILED;
							 | 
						|
								                {
							 | 
						|
								                  peg$fail(peg$c44);
							 | 
						|
								                }
							 | 
						|
								              }
							 | 
						|
								              if (s5 !== peg$FAILED) {
							 | 
						|
								                s6 = peg$parseidentifierName();
							 | 
						|
								                if (s6 !== peg$FAILED) {
							 | 
						|
								                  s5 = [s5, s6];
							 | 
						|
								                  s4 = s5;
							 | 
						|
								                } else {
							 | 
						|
								                  peg$currPos = s4;
							 | 
						|
								                  s4 = peg$FAILED;
							 | 
						|
								                }
							 | 
						|
								              } else {
							 | 
						|
								                peg$currPos = s4;
							 | 
						|
								                s4 = peg$FAILED;
							 | 
						|
								              }
							 | 
						|
								              while (s4 !== peg$FAILED) {
							 | 
						|
								                s3.push(s4);
							 | 
						|
								                s4 = peg$currPos;
							 | 
						|
								                if (input.charCodeAt(peg$currPos) === 46) {
							 | 
						|
								                  s5 = peg$c43;
							 | 
						|
								                  peg$currPos++;
							 | 
						|
								                } else {
							 | 
						|
								                  s5 = peg$FAILED;
							 | 
						|
								                  {
							 | 
						|
								                    peg$fail(peg$c44);
							 | 
						|
								                  }
							 | 
						|
								                }
							 | 
						|
								                if (s5 !== peg$FAILED) {
							 | 
						|
								                  s6 = peg$parseidentifierName();
							 | 
						|
								                  if (s6 !== peg$FAILED) {
							 | 
						|
								                    s5 = [s5, s6];
							 | 
						|
								                    s4 = s5;
							 | 
						|
								                  } else {
							 | 
						|
								                    peg$currPos = s4;
							 | 
						|
								                    s4 = peg$FAILED;
							 | 
						|
								                  }
							 | 
						|
								                } else {
							 | 
						|
								                  peg$currPos = s4;
							 | 
						|
								                  s4 = peg$FAILED;
							 | 
						|
								                }
							 | 
						|
								              }
							 | 
						|
								              if (s3 !== peg$FAILED) {
							 | 
						|
								                s1 = peg$c79(s2, s3);
							 | 
						|
								                s0 = s1;
							 | 
						|
								              } else {
							 | 
						|
								                peg$currPos = s0;
							 | 
						|
								                s0 = peg$FAILED;
							 | 
						|
								              }
							 | 
						|
								            } else {
							 | 
						|
								              peg$currPos = s0;
							 | 
						|
								              s0 = peg$FAILED;
							 | 
						|
								            }
							 | 
						|
								          } else {
							 | 
						|
								            peg$currPos = s0;
							 | 
						|
								            s0 = peg$FAILED;
							 | 
						|
								          }
							 | 
						|
								          peg$resultsCache[key] = {
							 | 
						|
								            nextPos: peg$currPos,
							 | 
						|
								            result: s0
							 | 
						|
								          };
							 | 
						|
								          return s0;
							 | 
						|
								        }
							 | 
						|
								        function peg$parsenegation() {
							 | 
						|
								          var s0, s1, s2, s3, s4, s5;
							 | 
						|
								          var key = peg$currPos * 32 + 24,
							 | 
						|
								            cached = peg$resultsCache[key];
							 | 
						|
								          if (cached) {
							 | 
						|
								            peg$currPos = cached.nextPos;
							 | 
						|
								            return cached.result;
							 | 
						|
								          }
							 | 
						|
								          s0 = peg$currPos;
							 | 
						|
								          if (input.substr(peg$currPos, 5) === peg$c80) {
							 | 
						|
								            s1 = peg$c80;
							 | 
						|
								            peg$currPos += 5;
							 | 
						|
								          } else {
							 | 
						|
								            s1 = peg$FAILED;
							 | 
						|
								            {
							 | 
						|
								              peg$fail(peg$c81);
							 | 
						|
								            }
							 | 
						|
								          }
							 | 
						|
								          if (s1 !== peg$FAILED) {
							 | 
						|
								            s2 = peg$parse_();
							 | 
						|
								            if (s2 !== peg$FAILED) {
							 | 
						|
								              s3 = peg$parseselectors();
							 | 
						|
								              if (s3 !== peg$FAILED) {
							 | 
						|
								                s4 = peg$parse_();
							 | 
						|
								                if (s4 !== peg$FAILED) {
							 | 
						|
								                  if (input.charCodeAt(peg$currPos) === 41) {
							 | 
						|
								                    s5 = peg$c69;
							 | 
						|
								                    peg$currPos++;
							 | 
						|
								                  } else {
							 | 
						|
								                    s5 = peg$FAILED;
							 | 
						|
								                    {
							 | 
						|
								                      peg$fail(peg$c70);
							 | 
						|
								                    }
							 | 
						|
								                  }
							 | 
						|
								                  if (s5 !== peg$FAILED) {
							 | 
						|
								                    s1 = peg$c82(s3);
							 | 
						|
								                    s0 = s1;
							 | 
						|
								                  } else {
							 | 
						|
								                    peg$currPos = s0;
							 | 
						|
								                    s0 = peg$FAILED;
							 | 
						|
								                  }
							 | 
						|
								                } else {
							 | 
						|
								                  peg$currPos = s0;
							 | 
						|
								                  s0 = peg$FAILED;
							 | 
						|
								                }
							 | 
						|
								              } else {
							 | 
						|
								                peg$currPos = s0;
							 | 
						|
								                s0 = peg$FAILED;
							 | 
						|
								              }
							 | 
						|
								            } else {
							 | 
						|
								              peg$currPos = s0;
							 | 
						|
								              s0 = peg$FAILED;
							 | 
						|
								            }
							 | 
						|
								          } else {
							 | 
						|
								            peg$currPos = s0;
							 | 
						|
								            s0 = peg$FAILED;
							 | 
						|
								          }
							 | 
						|
								          peg$resultsCache[key] = {
							 | 
						|
								            nextPos: peg$currPos,
							 | 
						|
								            result: s0
							 | 
						|
								          };
							 | 
						|
								          return s0;
							 | 
						|
								        }
							 | 
						|
								        function peg$parsematches() {
							 | 
						|
								          var s0, s1, s2, s3, s4, s5;
							 | 
						|
								          var key = peg$currPos * 32 + 25,
							 | 
						|
								            cached = peg$resultsCache[key];
							 | 
						|
								          if (cached) {
							 | 
						|
								            peg$currPos = cached.nextPos;
							 | 
						|
								            return cached.result;
							 | 
						|
								          }
							 | 
						|
								          s0 = peg$currPos;
							 | 
						|
								          if (input.substr(peg$currPos, 9) === peg$c83) {
							 | 
						|
								            s1 = peg$c83;
							 | 
						|
								            peg$currPos += 9;
							 | 
						|
								          } else {
							 | 
						|
								            s1 = peg$FAILED;
							 | 
						|
								            {
							 | 
						|
								              peg$fail(peg$c84);
							 | 
						|
								            }
							 | 
						|
								          }
							 | 
						|
								          if (s1 !== peg$FAILED) {
							 | 
						|
								            s2 = peg$parse_();
							 | 
						|
								            if (s2 !== peg$FAILED) {
							 | 
						|
								              s3 = peg$parseselectors();
							 | 
						|
								              if (s3 !== peg$FAILED) {
							 | 
						|
								                s4 = peg$parse_();
							 | 
						|
								                if (s4 !== peg$FAILED) {
							 | 
						|
								                  if (input.charCodeAt(peg$currPos) === 41) {
							 | 
						|
								                    s5 = peg$c69;
							 | 
						|
								                    peg$currPos++;
							 | 
						|
								                  } else {
							 | 
						|
								                    s5 = peg$FAILED;
							 | 
						|
								                    {
							 | 
						|
								                      peg$fail(peg$c70);
							 | 
						|
								                    }
							 | 
						|
								                  }
							 | 
						|
								                  if (s5 !== peg$FAILED) {
							 | 
						|
								                    s1 = peg$c85(s3);
							 | 
						|
								                    s0 = s1;
							 | 
						|
								                  } else {
							 | 
						|
								                    peg$currPos = s0;
							 | 
						|
								                    s0 = peg$FAILED;
							 | 
						|
								                  }
							 | 
						|
								                } else {
							 | 
						|
								                  peg$currPos = s0;
							 | 
						|
								                  s0 = peg$FAILED;
							 | 
						|
								                }
							 | 
						|
								              } else {
							 | 
						|
								                peg$currPos = s0;
							 | 
						|
								                s0 = peg$FAILED;
							 | 
						|
								              }
							 | 
						|
								            } else {
							 | 
						|
								              peg$currPos = s0;
							 | 
						|
								              s0 = peg$FAILED;
							 | 
						|
								            }
							 | 
						|
								          } else {
							 | 
						|
								            peg$currPos = s0;
							 | 
						|
								            s0 = peg$FAILED;
							 | 
						|
								          }
							 | 
						|
								          peg$resultsCache[key] = {
							 | 
						|
								            nextPos: peg$currPos,
							 | 
						|
								            result: s0
							 | 
						|
								          };
							 | 
						|
								          return s0;
							 | 
						|
								        }
							 | 
						|
								        function peg$parsehas() {
							 | 
						|
								          var s0, s1, s2, s3, s4, s5;
							 | 
						|
								          var key = peg$currPos * 32 + 26,
							 | 
						|
								            cached = peg$resultsCache[key];
							 | 
						|
								          if (cached) {
							 | 
						|
								            peg$currPos = cached.nextPos;
							 | 
						|
								            return cached.result;
							 | 
						|
								          }
							 | 
						|
								          s0 = peg$currPos;
							 | 
						|
								          if (input.substr(peg$currPos, 5) === peg$c86) {
							 | 
						|
								            s1 = peg$c86;
							 | 
						|
								            peg$currPos += 5;
							 | 
						|
								          } else {
							 | 
						|
								            s1 = peg$FAILED;
							 | 
						|
								            {
							 | 
						|
								              peg$fail(peg$c87);
							 | 
						|
								            }
							 | 
						|
								          }
							 | 
						|
								          if (s1 !== peg$FAILED) {
							 | 
						|
								            s2 = peg$parse_();
							 | 
						|
								            if (s2 !== peg$FAILED) {
							 | 
						|
								              s3 = peg$parsehasSelectors();
							 | 
						|
								              if (s3 !== peg$FAILED) {
							 | 
						|
								                s4 = peg$parse_();
							 | 
						|
								                if (s4 !== peg$FAILED) {
							 | 
						|
								                  if (input.charCodeAt(peg$currPos) === 41) {
							 | 
						|
								                    s5 = peg$c69;
							 | 
						|
								                    peg$currPos++;
							 | 
						|
								                  } else {
							 | 
						|
								                    s5 = peg$FAILED;
							 | 
						|
								                    {
							 | 
						|
								                      peg$fail(peg$c70);
							 | 
						|
								                    }
							 | 
						|
								                  }
							 | 
						|
								                  if (s5 !== peg$FAILED) {
							 | 
						|
								                    s1 = peg$c88(s3);
							 | 
						|
								                    s0 = s1;
							 | 
						|
								                  } else {
							 | 
						|
								                    peg$currPos = s0;
							 | 
						|
								                    s0 = peg$FAILED;
							 | 
						|
								                  }
							 | 
						|
								                } else {
							 | 
						|
								                  peg$currPos = s0;
							 | 
						|
								                  s0 = peg$FAILED;
							 | 
						|
								                }
							 | 
						|
								              } else {
							 | 
						|
								                peg$currPos = s0;
							 | 
						|
								                s0 = peg$FAILED;
							 | 
						|
								              }
							 | 
						|
								            } else {
							 | 
						|
								              peg$currPos = s0;
							 | 
						|
								              s0 = peg$FAILED;
							 | 
						|
								            }
							 | 
						|
								          } else {
							 | 
						|
								            peg$currPos = s0;
							 | 
						|
								            s0 = peg$FAILED;
							 | 
						|
								          }
							 | 
						|
								          peg$resultsCache[key] = {
							 | 
						|
								            nextPos: peg$currPos,
							 | 
						|
								            result: s0
							 | 
						|
								          };
							 | 
						|
								          return s0;
							 | 
						|
								        }
							 | 
						|
								        function peg$parsefirstChild() {
							 | 
						|
								          var s0, s1;
							 | 
						|
								          var key = peg$currPos * 32 + 27,
							 | 
						|
								            cached = peg$resultsCache[key];
							 | 
						|
								          if (cached) {
							 | 
						|
								            peg$currPos = cached.nextPos;
							 | 
						|
								            return cached.result;
							 | 
						|
								          }
							 | 
						|
								          s0 = peg$currPos;
							 | 
						|
								          if (input.substr(peg$currPos, 12) === peg$c89) {
							 | 
						|
								            s1 = peg$c89;
							 | 
						|
								            peg$currPos += 12;
							 | 
						|
								          } else {
							 | 
						|
								            s1 = peg$FAILED;
							 | 
						|
								            {
							 | 
						|
								              peg$fail(peg$c90);
							 | 
						|
								            }
							 | 
						|
								          }
							 | 
						|
								          if (s1 !== peg$FAILED) {
							 | 
						|
								            s1 = peg$c91();
							 | 
						|
								          }
							 | 
						|
								          s0 = s1;
							 | 
						|
								          peg$resultsCache[key] = {
							 | 
						|
								            nextPos: peg$currPos,
							 | 
						|
								            result: s0
							 | 
						|
								          };
							 | 
						|
								          return s0;
							 | 
						|
								        }
							 | 
						|
								        function peg$parselastChild() {
							 | 
						|
								          var s0, s1;
							 | 
						|
								          var key = peg$currPos * 32 + 28,
							 | 
						|
								            cached = peg$resultsCache[key];
							 | 
						|
								          if (cached) {
							 | 
						|
								            peg$currPos = cached.nextPos;
							 | 
						|
								            return cached.result;
							 | 
						|
								          }
							 | 
						|
								          s0 = peg$currPos;
							 | 
						|
								          if (input.substr(peg$currPos, 11) === peg$c92) {
							 | 
						|
								            s1 = peg$c92;
							 | 
						|
								            peg$currPos += 11;
							 | 
						|
								          } else {
							 | 
						|
								            s1 = peg$FAILED;
							 | 
						|
								            {
							 | 
						|
								              peg$fail(peg$c93);
							 | 
						|
								            }
							 | 
						|
								          }
							 | 
						|
								          if (s1 !== peg$FAILED) {
							 | 
						|
								            s1 = peg$c94();
							 | 
						|
								          }
							 | 
						|
								          s0 = s1;
							 | 
						|
								          peg$resultsCache[key] = {
							 | 
						|
								            nextPos: peg$currPos,
							 | 
						|
								            result: s0
							 | 
						|
								          };
							 | 
						|
								          return s0;
							 | 
						|
								        }
							 | 
						|
								        function peg$parsenthChild() {
							 | 
						|
								          var s0, s1, s2, s3, s4, s5;
							 | 
						|
								          var key = peg$currPos * 32 + 29,
							 | 
						|
								            cached = peg$resultsCache[key];
							 | 
						|
								          if (cached) {
							 | 
						|
								            peg$currPos = cached.nextPos;
							 | 
						|
								            return cached.result;
							 | 
						|
								          }
							 | 
						|
								          s0 = peg$currPos;
							 | 
						|
								          if (input.substr(peg$currPos, 11) === peg$c95) {
							 | 
						|
								            s1 = peg$c95;
							 | 
						|
								            peg$currPos += 11;
							 | 
						|
								          } else {
							 | 
						|
								            s1 = peg$FAILED;
							 | 
						|
								            {
							 | 
						|
								              peg$fail(peg$c96);
							 | 
						|
								            }
							 | 
						|
								          }
							 | 
						|
								          if (s1 !== peg$FAILED) {
							 | 
						|
								            s2 = peg$parse_();
							 | 
						|
								            if (s2 !== peg$FAILED) {
							 | 
						|
								              s3 = [];
							 | 
						|
								              if (peg$c61.test(input.charAt(peg$currPos))) {
							 | 
						|
								                s4 = input.charAt(peg$currPos);
							 | 
						|
								                peg$currPos++;
							 | 
						|
								              } else {
							 | 
						|
								                s4 = peg$FAILED;
							 | 
						|
								                {
							 | 
						|
								                  peg$fail(peg$c62);
							 | 
						|
								                }
							 | 
						|
								              }
							 | 
						|
								              if (s4 !== peg$FAILED) {
							 | 
						|
								                while (s4 !== peg$FAILED) {
							 | 
						|
								                  s3.push(s4);
							 | 
						|
								                  if (peg$c61.test(input.charAt(peg$currPos))) {
							 | 
						|
								                    s4 = input.charAt(peg$currPos);
							 | 
						|
								                    peg$currPos++;
							 | 
						|
								                  } else {
							 | 
						|
								                    s4 = peg$FAILED;
							 | 
						|
								                    {
							 | 
						|
								                      peg$fail(peg$c62);
							 | 
						|
								                    }
							 | 
						|
								                  }
							 | 
						|
								                }
							 | 
						|
								              } else {
							 | 
						|
								                s3 = peg$FAILED;
							 | 
						|
								              }
							 | 
						|
								              if (s3 !== peg$FAILED) {
							 | 
						|
								                s4 = peg$parse_();
							 | 
						|
								                if (s4 !== peg$FAILED) {
							 | 
						|
								                  if (input.charCodeAt(peg$currPos) === 41) {
							 | 
						|
								                    s5 = peg$c69;
							 | 
						|
								                    peg$currPos++;
							 | 
						|
								                  } else {
							 | 
						|
								                    s5 = peg$FAILED;
							 | 
						|
								                    {
							 | 
						|
								                      peg$fail(peg$c70);
							 | 
						|
								                    }
							 | 
						|
								                  }
							 | 
						|
								                  if (s5 !== peg$FAILED) {
							 | 
						|
								                    s1 = peg$c97(s3);
							 | 
						|
								                    s0 = s1;
							 | 
						|
								                  } else {
							 | 
						|
								                    peg$currPos = s0;
							 | 
						|
								                    s0 = peg$FAILED;
							 | 
						|
								                  }
							 | 
						|
								                } else {
							 | 
						|
								                  peg$currPos = s0;
							 | 
						|
								                  s0 = peg$FAILED;
							 | 
						|
								                }
							 | 
						|
								              } else {
							 | 
						|
								                peg$currPos = s0;
							 | 
						|
								                s0 = peg$FAILED;
							 | 
						|
								              }
							 | 
						|
								            } else {
							 | 
						|
								              peg$currPos = s0;
							 | 
						|
								              s0 = peg$FAILED;
							 | 
						|
								            }
							 | 
						|
								          } else {
							 | 
						|
								            peg$currPos = s0;
							 | 
						|
								            s0 = peg$FAILED;
							 | 
						|
								          }
							 | 
						|
								          peg$resultsCache[key] = {
							 | 
						|
								            nextPos: peg$currPos,
							 | 
						|
								            result: s0
							 | 
						|
								          };
							 | 
						|
								          return s0;
							 | 
						|
								        }
							 | 
						|
								        function peg$parsenthLastChild() {
							 | 
						|
								          var s0, s1, s2, s3, s4, s5;
							 | 
						|
								          var key = peg$currPos * 32 + 30,
							 | 
						|
								            cached = peg$resultsCache[key];
							 | 
						|
								          if (cached) {
							 | 
						|
								            peg$currPos = cached.nextPos;
							 | 
						|
								            return cached.result;
							 | 
						|
								          }
							 | 
						|
								          s0 = peg$currPos;
							 | 
						|
								          if (input.substr(peg$currPos, 16) === peg$c98) {
							 | 
						|
								            s1 = peg$c98;
							 | 
						|
								            peg$currPos += 16;
							 | 
						|
								          } else {
							 | 
						|
								            s1 = peg$FAILED;
							 | 
						|
								            {
							 | 
						|
								              peg$fail(peg$c99);
							 | 
						|
								            }
							 | 
						|
								          }
							 | 
						|
								          if (s1 !== peg$FAILED) {
							 | 
						|
								            s2 = peg$parse_();
							 | 
						|
								            if (s2 !== peg$FAILED) {
							 | 
						|
								              s3 = [];
							 | 
						|
								              if (peg$c61.test(input.charAt(peg$currPos))) {
							 | 
						|
								                s4 = input.charAt(peg$currPos);
							 | 
						|
								                peg$currPos++;
							 | 
						|
								              } else {
							 | 
						|
								                s4 = peg$FAILED;
							 | 
						|
								                {
							 | 
						|
								                  peg$fail(peg$c62);
							 | 
						|
								                }
							 | 
						|
								              }
							 | 
						|
								              if (s4 !== peg$FAILED) {
							 | 
						|
								                while (s4 !== peg$FAILED) {
							 | 
						|
								                  s3.push(s4);
							 | 
						|
								                  if (peg$c61.test(input.charAt(peg$currPos))) {
							 | 
						|
								                    s4 = input.charAt(peg$currPos);
							 | 
						|
								                    peg$currPos++;
							 | 
						|
								                  } else {
							 | 
						|
								                    s4 = peg$FAILED;
							 | 
						|
								                    {
							 | 
						|
								                      peg$fail(peg$c62);
							 | 
						|
								                    }
							 | 
						|
								                  }
							 | 
						|
								                }
							 | 
						|
								              } else {
							 | 
						|
								                s3 = peg$FAILED;
							 | 
						|
								              }
							 | 
						|
								              if (s3 !== peg$FAILED) {
							 | 
						|
								                s4 = peg$parse_();
							 | 
						|
								                if (s4 !== peg$FAILED) {
							 | 
						|
								                  if (input.charCodeAt(peg$currPos) === 41) {
							 | 
						|
								                    s5 = peg$c69;
							 | 
						|
								                    peg$currPos++;
							 | 
						|
								                  } else {
							 | 
						|
								                    s5 = peg$FAILED;
							 | 
						|
								                    {
							 | 
						|
								                      peg$fail(peg$c70);
							 | 
						|
								                    }
							 | 
						|
								                  }
							 | 
						|
								                  if (s5 !== peg$FAILED) {
							 | 
						|
								                    s1 = peg$c100(s3);
							 | 
						|
								                    s0 = s1;
							 | 
						|
								                  } else {
							 | 
						|
								                    peg$currPos = s0;
							 | 
						|
								                    s0 = peg$FAILED;
							 | 
						|
								                  }
							 | 
						|
								                } else {
							 | 
						|
								                  peg$currPos = s0;
							 | 
						|
								                  s0 = peg$FAILED;
							 | 
						|
								                }
							 | 
						|
								              } else {
							 | 
						|
								                peg$currPos = s0;
							 | 
						|
								                s0 = peg$FAILED;
							 | 
						|
								              }
							 | 
						|
								            } else {
							 | 
						|
								              peg$currPos = s0;
							 | 
						|
								              s0 = peg$FAILED;
							 | 
						|
								            }
							 | 
						|
								          } else {
							 | 
						|
								            peg$currPos = s0;
							 | 
						|
								            s0 = peg$FAILED;
							 | 
						|
								          }
							 | 
						|
								          peg$resultsCache[key] = {
							 | 
						|
								            nextPos: peg$currPos,
							 | 
						|
								            result: s0
							 | 
						|
								          };
							 | 
						|
								          return s0;
							 | 
						|
								        }
							 | 
						|
								        function peg$parseclass() {
							 | 
						|
								          var s0, s1, s2;
							 | 
						|
								          var key = peg$currPos * 32 + 31,
							 | 
						|
								            cached = peg$resultsCache[key];
							 | 
						|
								          if (cached) {
							 | 
						|
								            peg$currPos = cached.nextPos;
							 | 
						|
								            return cached.result;
							 | 
						|
								          }
							 | 
						|
								          s0 = peg$currPos;
							 | 
						|
								          if (input.charCodeAt(peg$currPos) === 58) {
							 | 
						|
								            s1 = peg$c101;
							 | 
						|
								            peg$currPos++;
							 | 
						|
								          } else {
							 | 
						|
								            s1 = peg$FAILED;
							 | 
						|
								            {
							 | 
						|
								              peg$fail(peg$c102);
							 | 
						|
								            }
							 | 
						|
								          }
							 | 
						|
								          if (s1 !== peg$FAILED) {
							 | 
						|
								            s2 = peg$parseidentifierName();
							 | 
						|
								            if (s2 !== peg$FAILED) {
							 | 
						|
								              s1 = peg$c103(s2);
							 | 
						|
								              s0 = s1;
							 | 
						|
								            } else {
							 | 
						|
								              peg$currPos = s0;
							 | 
						|
								              s0 = peg$FAILED;
							 | 
						|
								            }
							 | 
						|
								          } else {
							 | 
						|
								            peg$currPos = s0;
							 | 
						|
								            s0 = peg$FAILED;
							 | 
						|
								          }
							 | 
						|
								          peg$resultsCache[key] = {
							 | 
						|
								            nextPos: peg$currPos,
							 | 
						|
								            result: s0
							 | 
						|
								          };
							 | 
						|
								          return s0;
							 | 
						|
								        }
							 | 
						|
								        function nth(n) {
							 | 
						|
								          return {
							 | 
						|
								            type: 'nth-child',
							 | 
						|
								            index: {
							 | 
						|
								              type: 'literal',
							 | 
						|
								              value: n
							 | 
						|
								            }
							 | 
						|
								          };
							 | 
						|
								        }
							 | 
						|
								        function nthLast(n) {
							 | 
						|
								          return {
							 | 
						|
								            type: 'nth-last-child',
							 | 
						|
								            index: {
							 | 
						|
								              type: 'literal',
							 | 
						|
								              value: n
							 | 
						|
								            }
							 | 
						|
								          };
							 | 
						|
								        }
							 | 
						|
								        function strUnescape(s) {
							 | 
						|
								          return s.replace(/\\(.)/g, function (match, ch) {
							 | 
						|
								            switch (ch) {
							 | 
						|
								              case 'b':
							 | 
						|
								                return '\b';
							 | 
						|
								              case 'f':
							 | 
						|
								                return '\f';
							 | 
						|
								              case 'n':
							 | 
						|
								                return '\n';
							 | 
						|
								              case 'r':
							 | 
						|
								                return '\r';
							 | 
						|
								              case 't':
							 | 
						|
								                return '\t';
							 | 
						|
								              case 'v':
							 | 
						|
								                return '\v';
							 | 
						|
								              default:
							 | 
						|
								                return ch;
							 | 
						|
								            }
							 | 
						|
								          });
							 | 
						|
								        }
							 | 
						|
								        peg$result = peg$startRuleFunction();
							 | 
						|
								        if (peg$result !== peg$FAILED && peg$currPos === input.length) {
							 | 
						|
								          return peg$result;
							 | 
						|
								        } else {
							 | 
						|
								          if (peg$result !== peg$FAILED && peg$currPos < input.length) {
							 | 
						|
								            peg$fail(peg$endExpectation());
							 | 
						|
								          }
							 | 
						|
								          throw peg$buildStructuredError(peg$maxFailExpected, peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null, peg$maxFailPos < input.length ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1) : peg$computeLocation(peg$maxFailPos, peg$maxFailPos));
							 | 
						|
								        }
							 | 
						|
								      }
							 | 
						|
								      return {
							 | 
						|
								        SyntaxError: peg$SyntaxError,
							 | 
						|
								        parse: peg$parse
							 | 
						|
								      };
							 | 
						|
								    });
							 | 
						|
								  });
							 | 
						|
								
							 | 
						|
								  /**
							 | 
						|
								  * @typedef {"LEFT_SIDE"|"RIGHT_SIDE"} Side
							 | 
						|
								  */
							 | 
						|
								
							 | 
						|
								  var LEFT_SIDE = 'LEFT_SIDE';
							 | 
						|
								  var RIGHT_SIDE = 'RIGHT_SIDE';
							 | 
						|
								
							 | 
						|
								  /**
							 | 
						|
								   * @external AST
							 | 
						|
								   * @see https://esprima.readthedocs.io/en/latest/syntax-tree-format.html
							 | 
						|
								   */
							 | 
						|
								
							 | 
						|
								  /**
							 | 
						|
								   * One of the rules of `grammar.pegjs`
							 | 
						|
								   * @typedef {PlainObject} SelectorAST
							 | 
						|
								   * @see grammar.pegjs
							 | 
						|
								  */
							 | 
						|
								
							 | 
						|
								  /**
							 | 
						|
								   * The `sequence` production of `grammar.pegjs`
							 | 
						|
								   * @typedef {PlainObject} SelectorSequenceAST
							 | 
						|
								  */
							 | 
						|
								
							 | 
						|
								  /**
							 | 
						|
								   * Get the value of a property which may be multiple levels down
							 | 
						|
								   * in the object.
							 | 
						|
								   * @param {?PlainObject} obj
							 | 
						|
								   * @param {string[]} keys
							 | 
						|
								   * @returns {undefined|boolean|string|number|external:AST}
							 | 
						|
								   */
							 | 
						|
								  function getPath(obj, keys) {
							 | 
						|
								    for (var i = 0; i < keys.length; ++i) {
							 | 
						|
								      if (obj == null) {
							 | 
						|
								        return obj;
							 | 
						|
								      }
							 | 
						|
								      obj = obj[keys[i]];
							 | 
						|
								    }
							 | 
						|
								    return obj;
							 | 
						|
								  }
							 | 
						|
								
							 | 
						|
								  /**
							 | 
						|
								   * Determine whether `node` can be reached by following `path`,
							 | 
						|
								   * starting at `ancestor`.
							 | 
						|
								   * @param {?external:AST} node
							 | 
						|
								   * @param {?external:AST} ancestor
							 | 
						|
								   * @param {string[]} path
							 | 
						|
								   * @param {Integer} fromPathIndex
							 | 
						|
								   * @returns {boolean}
							 | 
						|
								   */
							 | 
						|
								  function inPath(node, ancestor, path, fromPathIndex) {
							 | 
						|
								    var current = ancestor;
							 | 
						|
								    for (var i = fromPathIndex; i < path.length; ++i) {
							 | 
						|
								      if (current == null) {
							 | 
						|
								        return false;
							 | 
						|
								      }
							 | 
						|
								      var field = current[path[i]];
							 | 
						|
								      if (Array.isArray(field)) {
							 | 
						|
								        for (var k = 0; k < field.length; ++k) {
							 | 
						|
								          if (inPath(node, field[k], path, i + 1)) {
							 | 
						|
								            return true;
							 | 
						|
								          }
							 | 
						|
								        }
							 | 
						|
								        return false;
							 | 
						|
								      }
							 | 
						|
								      current = field;
							 | 
						|
								    }
							 | 
						|
								    return node === current;
							 | 
						|
								  }
							 | 
						|
								
							 | 
						|
								  /**
							 | 
						|
								   * A generated matcher function for a selector.
							 | 
						|
								   * @callback SelectorMatcher
							 | 
						|
								   * @param {?SelectorAST} selector
							 | 
						|
								   * @param {external:AST[]} [ancestry=[]]
							 | 
						|
								   * @param {ESQueryOptions} [options]
							 | 
						|
								   * @returns {void}
							 | 
						|
								  */
							 | 
						|
								
							 | 
						|
								  /**
							 | 
						|
								   * A WeakMap for holding cached matcher functions for selectors.
							 | 
						|
								   * @type {WeakMap<SelectorAST, SelectorMatcher>}
							 | 
						|
								  */
							 | 
						|
								  var MATCHER_CACHE = typeof WeakMap === 'function' ? new WeakMap() : null;
							 | 
						|
								
							 | 
						|
								  /**
							 | 
						|
								   * Look up a matcher function for `selector` in the cache.
							 | 
						|
								   * If it does not exist, generate it with `generateMatcher` and add it to the cache.
							 | 
						|
								   * In engines without WeakMap, the caching is skipped and matchers are generated with every call.
							 | 
						|
								   * @param {?SelectorAST} selector
							 | 
						|
								   * @returns {SelectorMatcher}
							 | 
						|
								   */
							 | 
						|
								  function getMatcher(selector) {
							 | 
						|
								    if (selector == null) {
							 | 
						|
								      return function () {
							 | 
						|
								        return true;
							 | 
						|
								      };
							 | 
						|
								    }
							 | 
						|
								    if (MATCHER_CACHE != null) {
							 | 
						|
								      var matcher = MATCHER_CACHE.get(selector);
							 | 
						|
								      if (matcher != null) {
							 | 
						|
								        return matcher;
							 | 
						|
								      }
							 | 
						|
								      matcher = generateMatcher(selector);
							 | 
						|
								      MATCHER_CACHE.set(selector, matcher);
							 | 
						|
								      return matcher;
							 | 
						|
								    }
							 | 
						|
								    return generateMatcher(selector);
							 | 
						|
								  }
							 | 
						|
								
							 | 
						|
								  /**
							 | 
						|
								   * Create a matcher function for `selector`,
							 | 
						|
								   * @param {?SelectorAST} selector
							 | 
						|
								   * @returns {SelectorMatcher}
							 | 
						|
								   */
							 | 
						|
								  function generateMatcher(selector) {
							 | 
						|
								    switch (selector.type) {
							 | 
						|
								      case 'wildcard':
							 | 
						|
								        return function () {
							 | 
						|
								          return true;
							 | 
						|
								        };
							 | 
						|
								      case 'identifier':
							 | 
						|
								        {
							 | 
						|
								          var value = selector.value.toLowerCase();
							 | 
						|
								          return function (node, ancestry, options) {
							 | 
						|
								            var nodeTypeKey = options && options.nodeTypeKey || 'type';
							 | 
						|
								            return value === node[nodeTypeKey].toLowerCase();
							 | 
						|
								          };
							 | 
						|
								        }
							 | 
						|
								      case 'exactNode':
							 | 
						|
								        return function (node, ancestry) {
							 | 
						|
								          return ancestry.length === 0;
							 | 
						|
								        };
							 | 
						|
								      case 'field':
							 | 
						|
								        {
							 | 
						|
								          var path = selector.name.split('.');
							 | 
						|
								          return function (node, ancestry) {
							 | 
						|
								            var ancestor = ancestry[path.length - 1];
							 | 
						|
								            return inPath(node, ancestor, path, 0);
							 | 
						|
								          };
							 | 
						|
								        }
							 | 
						|
								      case 'matches':
							 | 
						|
								        {
							 | 
						|
								          var matchers = selector.selectors.map(getMatcher);
							 | 
						|
								          return function (node, ancestry, options) {
							 | 
						|
								            for (var i = 0; i < matchers.length; ++i) {
							 | 
						|
								              if (matchers[i](node, ancestry, options)) {
							 | 
						|
								                return true;
							 | 
						|
								              }
							 | 
						|
								            }
							 | 
						|
								            return false;
							 | 
						|
								          };
							 | 
						|
								        }
							 | 
						|
								      case 'compound':
							 | 
						|
								        {
							 | 
						|
								          var _matchers = selector.selectors.map(getMatcher);
							 | 
						|
								          return function (node, ancestry, options) {
							 | 
						|
								            for (var i = 0; i < _matchers.length; ++i) {
							 | 
						|
								              if (!_matchers[i](node, ancestry, options)) {
							 | 
						|
								                return false;
							 | 
						|
								              }
							 | 
						|
								            }
							 | 
						|
								            return true;
							 | 
						|
								          };
							 | 
						|
								        }
							 | 
						|
								      case 'not':
							 | 
						|
								        {
							 | 
						|
								          var _matchers2 = selector.selectors.map(getMatcher);
							 | 
						|
								          return function (node, ancestry, options) {
							 | 
						|
								            for (var i = 0; i < _matchers2.length; ++i) {
							 | 
						|
								              if (_matchers2[i](node, ancestry, options)) {
							 | 
						|
								                return false;
							 | 
						|
								              }
							 | 
						|
								            }
							 | 
						|
								            return true;
							 | 
						|
								          };
							 | 
						|
								        }
							 | 
						|
								      case 'has':
							 | 
						|
								        {
							 | 
						|
								          var _matchers3 = selector.selectors.map(getMatcher);
							 | 
						|
								          return function (node, ancestry, options) {
							 | 
						|
								            var result = false;
							 | 
						|
								            var a = [];
							 | 
						|
								            estraverse.traverse(node, {
							 | 
						|
								              enter: function enter(node, parent) {
							 | 
						|
								                if (parent != null) {
							 | 
						|
								                  a.unshift(parent);
							 | 
						|
								                }
							 | 
						|
								                for (var i = 0; i < _matchers3.length; ++i) {
							 | 
						|
								                  if (_matchers3[i](node, a, options)) {
							 | 
						|
								                    result = true;
							 | 
						|
								                    this["break"]();
							 | 
						|
								                    return;
							 | 
						|
								                  }
							 | 
						|
								                }
							 | 
						|
								              },
							 | 
						|
								              leave: function leave() {
							 | 
						|
								                a.shift();
							 | 
						|
								              },
							 | 
						|
								              keys: options && options.visitorKeys,
							 | 
						|
								              fallback: options && options.fallback || 'iteration'
							 | 
						|
								            });
							 | 
						|
								            return result;
							 | 
						|
								          };
							 | 
						|
								        }
							 | 
						|
								      case 'child':
							 | 
						|
								        {
							 | 
						|
								          var left = getMatcher(selector.left);
							 | 
						|
								          var right = getMatcher(selector.right);
							 | 
						|
								          return function (node, ancestry, options) {
							 | 
						|
								            if (ancestry.length > 0 && right(node, ancestry, options)) {
							 | 
						|
								              return left(ancestry[0], ancestry.slice(1), options);
							 | 
						|
								            }
							 | 
						|
								            return false;
							 | 
						|
								          };
							 | 
						|
								        }
							 | 
						|
								      case 'descendant':
							 | 
						|
								        {
							 | 
						|
								          var _left = getMatcher(selector.left);
							 | 
						|
								          var _right = getMatcher(selector.right);
							 | 
						|
								          return function (node, ancestry, options) {
							 | 
						|
								            if (_right(node, ancestry, options)) {
							 | 
						|
								              for (var i = 0, l = ancestry.length; i < l; ++i) {
							 | 
						|
								                if (_left(ancestry[i], ancestry.slice(i + 1), options)) {
							 | 
						|
								                  return true;
							 | 
						|
								                }
							 | 
						|
								              }
							 | 
						|
								            }
							 | 
						|
								            return false;
							 | 
						|
								          };
							 | 
						|
								        }
							 | 
						|
								      case 'attribute':
							 | 
						|
								        {
							 | 
						|
								          var _path = selector.name.split('.');
							 | 
						|
								          switch (selector.operator) {
							 | 
						|
								            case void 0:
							 | 
						|
								              return function (node) {
							 | 
						|
								                return getPath(node, _path) != null;
							 | 
						|
								              };
							 | 
						|
								            case '=':
							 | 
						|
								              switch (selector.value.type) {
							 | 
						|
								                case 'regexp':
							 | 
						|
								                  return function (node) {
							 | 
						|
								                    var p = getPath(node, _path);
							 | 
						|
								                    return typeof p === 'string' && selector.value.value.test(p);
							 | 
						|
								                  };
							 | 
						|
								                case 'literal':
							 | 
						|
								                  {
							 | 
						|
								                    var literal = "".concat(selector.value.value);
							 | 
						|
								                    return function (node) {
							 | 
						|
								                      return literal === "".concat(getPath(node, _path));
							 | 
						|
								                    };
							 | 
						|
								                  }
							 | 
						|
								                case 'type':
							 | 
						|
								                  return function (node) {
							 | 
						|
								                    return selector.value.value === _typeof(getPath(node, _path));
							 | 
						|
								                  };
							 | 
						|
								              }
							 | 
						|
								              throw new Error("Unknown selector value type: ".concat(selector.value.type));
							 | 
						|
								            case '!=':
							 | 
						|
								              switch (selector.value.type) {
							 | 
						|
								                case 'regexp':
							 | 
						|
								                  return function (node) {
							 | 
						|
								                    return !selector.value.value.test(getPath(node, _path));
							 | 
						|
								                  };
							 | 
						|
								                case 'literal':
							 | 
						|
								                  {
							 | 
						|
								                    var _literal = "".concat(selector.value.value);
							 | 
						|
								                    return function (node) {
							 | 
						|
								                      return _literal !== "".concat(getPath(node, _path));
							 | 
						|
								                    };
							 | 
						|
								                  }
							 | 
						|
								                case 'type':
							 | 
						|
								                  return function (node) {
							 | 
						|
								                    return selector.value.value !== _typeof(getPath(node, _path));
							 | 
						|
								                  };
							 | 
						|
								              }
							 | 
						|
								              throw new Error("Unknown selector value type: ".concat(selector.value.type));
							 | 
						|
								            case '<=':
							 | 
						|
								              return function (node) {
							 | 
						|
								                return getPath(node, _path) <= selector.value.value;
							 | 
						|
								              };
							 | 
						|
								            case '<':
							 | 
						|
								              return function (node) {
							 | 
						|
								                return getPath(node, _path) < selector.value.value;
							 | 
						|
								              };
							 | 
						|
								            case '>':
							 | 
						|
								              return function (node) {
							 | 
						|
								                return getPath(node, _path) > selector.value.value;
							 | 
						|
								              };
							 | 
						|
								            case '>=':
							 | 
						|
								              return function (node) {
							 | 
						|
								                return getPath(node, _path) >= selector.value.value;
							 | 
						|
								              };
							 | 
						|
								          }
							 | 
						|
								          throw new Error("Unknown operator: ".concat(selector.operator));
							 | 
						|
								        }
							 | 
						|
								      case 'sibling':
							 | 
						|
								        {
							 | 
						|
								          var _left2 = getMatcher(selector.left);
							 | 
						|
								          var _right2 = getMatcher(selector.right);
							 | 
						|
								          return function (node, ancestry, options) {
							 | 
						|
								            return _right2(node, ancestry, options) && sibling(node, _left2, ancestry, LEFT_SIDE, options) || selector.left.subject && _left2(node, ancestry, options) && sibling(node, _right2, ancestry, RIGHT_SIDE, options);
							 | 
						|
								          };
							 | 
						|
								        }
							 | 
						|
								      case 'adjacent':
							 | 
						|
								        {
							 | 
						|
								          var _left3 = getMatcher(selector.left);
							 | 
						|
								          var _right3 = getMatcher(selector.right);
							 | 
						|
								          return function (node, ancestry, options) {
							 | 
						|
								            return _right3(node, ancestry, options) && adjacent(node, _left3, ancestry, LEFT_SIDE, options) || selector.right.subject && _left3(node, ancestry, options) && adjacent(node, _right3, ancestry, RIGHT_SIDE, options);
							 | 
						|
								          };
							 | 
						|
								        }
							 | 
						|
								      case 'nth-child':
							 | 
						|
								        {
							 | 
						|
								          var nth = selector.index.value;
							 | 
						|
								          var _right4 = getMatcher(selector.right);
							 | 
						|
								          return function (node, ancestry, options) {
							 | 
						|
								            return _right4(node, ancestry, options) && nthChild(node, ancestry, nth, options);
							 | 
						|
								          };
							 | 
						|
								        }
							 | 
						|
								      case 'nth-last-child':
							 | 
						|
								        {
							 | 
						|
								          var _nth = -selector.index.value;
							 | 
						|
								          var _right5 = getMatcher(selector.right);
							 | 
						|
								          return function (node, ancestry, options) {
							 | 
						|
								            return _right5(node, ancestry, options) && nthChild(node, ancestry, _nth, options);
							 | 
						|
								          };
							 | 
						|
								        }
							 | 
						|
								      case 'class':
							 | 
						|
								        {
							 | 
						|
								          var name = selector.name.toLowerCase();
							 | 
						|
								          return function (node, ancestry, options) {
							 | 
						|
								            if (options && options.matchClass) {
							 | 
						|
								              return options.matchClass(selector.name, node, ancestry);
							 | 
						|
								            }
							 | 
						|
								            if (options && options.nodeTypeKey) return false;
							 | 
						|
								            switch (name) {
							 | 
						|
								              case 'statement':
							 | 
						|
								                if (node.type.slice(-9) === 'Statement') return true;
							 | 
						|
								              // fallthrough: interface Declaration <: Statement { }
							 | 
						|
								              case 'declaration':
							 | 
						|
								                return node.type.slice(-11) === 'Declaration';
							 | 
						|
								              case 'pattern':
							 | 
						|
								                if (node.type.slice(-7) === 'Pattern') return true;
							 | 
						|
								              // fallthrough: interface Expression <: Node, Pattern { }
							 | 
						|
								              case 'expression':
							 | 
						|
								                return node.type.slice(-10) === 'Expression' || node.type.slice(-7) === 'Literal' || node.type === 'Identifier' && (ancestry.length === 0 || ancestry[0].type !== 'MetaProperty') || node.type === 'MetaProperty';
							 | 
						|
								              case 'function':
							 | 
						|
								                return node.type === 'FunctionDeclaration' || node.type === 'FunctionExpression' || node.type === 'ArrowFunctionExpression';
							 | 
						|
								            }
							 | 
						|
								            throw new Error("Unknown class name: ".concat(selector.name));
							 | 
						|
								          };
							 | 
						|
								        }
							 | 
						|
								    }
							 | 
						|
								    throw new Error("Unknown selector type: ".concat(selector.type));
							 | 
						|
								  }
							 | 
						|
								
							 | 
						|
								  /**
							 | 
						|
								   * @callback TraverseOptionFallback
							 | 
						|
								   * @param {external:AST} node The given node.
							 | 
						|
								   * @returns {string[]} An array of visitor keys for the given node.
							 | 
						|
								   */
							 | 
						|
								
							 | 
						|
								  /**
							 | 
						|
								   * @callback ClassMatcher
							 | 
						|
								   * @param {string} className The name of the class to match.
							 | 
						|
								   * @param {external:AST} node The node to match against.
							 | 
						|
								   * @param {Array<external:AST>} ancestry The ancestry of the node.
							 | 
						|
								   * @returns {boolean} True if the node matches the class, false if not.
							 | 
						|
								   */
							 | 
						|
								
							 | 
						|
								  /**
							 | 
						|
								   * @typedef {object} ESQueryOptions
							 | 
						|
								   * @property {string} [nodeTypeKey="type"] By passing `nodeTypeKey`, we can allow other ASTs to use ESQuery.
							 | 
						|
								   * @property { { [nodeType: string]: string[] } } [visitorKeys] By passing `visitorKeys` mapping, we can extend the properties of the nodes that traverse the node.
							 | 
						|
								   * @property {TraverseOptionFallback} [fallback] By passing `fallback` option, we can control the properties of traversing nodes when encountering unknown nodes.
							 | 
						|
								   * @property {ClassMatcher} [matchClass] By passing `matchClass` option, we can customize the interpretation of classes.
							 | 
						|
								   */
							 | 
						|
								
							 | 
						|
								  /**
							 | 
						|
								   * Given a `node` and its ancestors, determine if `node` is matched
							 | 
						|
								   * by `selector`.
							 | 
						|
								   * @param {?external:AST} node
							 | 
						|
								   * @param {?SelectorAST} selector
							 | 
						|
								   * @param {external:AST[]} [ancestry=[]]
							 | 
						|
								   * @param {ESQueryOptions} [options]
							 | 
						|
								   * @throws {Error} Unknowns (operator, class name, selector type, or
							 | 
						|
								   * selector value type)
							 | 
						|
								   * @returns {boolean}
							 | 
						|
								   */
							 | 
						|
								  function matches(node, selector, ancestry, options) {
							 | 
						|
								    if (!selector) {
							 | 
						|
								      return true;
							 | 
						|
								    }
							 | 
						|
								    if (!node) {
							 | 
						|
								      return false;
							 | 
						|
								    }
							 | 
						|
								    if (!ancestry) {
							 | 
						|
								      ancestry = [];
							 | 
						|
								    }
							 | 
						|
								    return getMatcher(selector)(node, ancestry, options);
							 | 
						|
								  }
							 | 
						|
								
							 | 
						|
								  /**
							 | 
						|
								   * Get visitor keys of a given node.
							 | 
						|
								   * @param {external:AST} node The AST node to get keys.
							 | 
						|
								   * @param {ESQueryOptions|undefined} options
							 | 
						|
								   * @returns {string[]} Visitor keys of the node.
							 | 
						|
								   */
							 | 
						|
								  function getVisitorKeys(node, options) {
							 | 
						|
								    var nodeTypeKey = options && options.nodeTypeKey || 'type';
							 | 
						|
								    var nodeType = node[nodeTypeKey];
							 | 
						|
								    if (options && options.visitorKeys && options.visitorKeys[nodeType]) {
							 | 
						|
								      return options.visitorKeys[nodeType];
							 | 
						|
								    }
							 | 
						|
								    if (estraverse.VisitorKeys[nodeType]) {
							 | 
						|
								      return estraverse.VisitorKeys[nodeType];
							 | 
						|
								    }
							 | 
						|
								    if (options && typeof options.fallback === 'function') {
							 | 
						|
								      return options.fallback(node);
							 | 
						|
								    }
							 | 
						|
								    // 'iteration' fallback
							 | 
						|
								    return Object.keys(node).filter(function (key) {
							 | 
						|
								      return key !== nodeTypeKey;
							 | 
						|
								    });
							 | 
						|
								  }
							 | 
						|
								
							 | 
						|
								  /**
							 | 
						|
								   * Check whether the given value is an ASTNode or not.
							 | 
						|
								   * @param {any} node The value to check.
							 | 
						|
								   * @param {ESQueryOptions|undefined} options The options to use.
							 | 
						|
								   * @returns {boolean} `true` if the value is an ASTNode.
							 | 
						|
								   */
							 | 
						|
								  function isNode(node, options) {
							 | 
						|
								    var nodeTypeKey = options && options.nodeTypeKey || 'type';
							 | 
						|
								    return node !== null && _typeof(node) === 'object' && typeof node[nodeTypeKey] === 'string';
							 | 
						|
								  }
							 | 
						|
								
							 | 
						|
								  /**
							 | 
						|
								   * Determines if the given node has a sibling that matches the
							 | 
						|
								   * given selector matcher.
							 | 
						|
								   * @param {external:AST} node
							 | 
						|
								   * @param {SelectorMatcher} matcher
							 | 
						|
								   * @param {external:AST[]} ancestry
							 | 
						|
								   * @param {Side} side
							 | 
						|
								   * @param {ESQueryOptions|undefined} options
							 | 
						|
								   * @returns {boolean}
							 | 
						|
								   */
							 | 
						|
								  function sibling(node, matcher, ancestry, side, options) {
							 | 
						|
								    var _ancestry = _slicedToArray(ancestry, 1),
							 | 
						|
								      parent = _ancestry[0];
							 | 
						|
								    if (!parent) {
							 | 
						|
								      return false;
							 | 
						|
								    }
							 | 
						|
								    var keys = getVisitorKeys(parent, options);
							 | 
						|
								    for (var i = 0; i < keys.length; ++i) {
							 | 
						|
								      var listProp = parent[keys[i]];
							 | 
						|
								      if (Array.isArray(listProp)) {
							 | 
						|
								        var startIndex = listProp.indexOf(node);
							 | 
						|
								        if (startIndex < 0) {
							 | 
						|
								          continue;
							 | 
						|
								        }
							 | 
						|
								        var lowerBound = void 0,
							 | 
						|
								          upperBound = void 0;
							 | 
						|
								        if (side === LEFT_SIDE) {
							 | 
						|
								          lowerBound = 0;
							 | 
						|
								          upperBound = startIndex;
							 | 
						|
								        } else {
							 | 
						|
								          lowerBound = startIndex + 1;
							 | 
						|
								          upperBound = listProp.length;
							 | 
						|
								        }
							 | 
						|
								        for (var k = lowerBound; k < upperBound; ++k) {
							 | 
						|
								          if (isNode(listProp[k], options) && matcher(listProp[k], ancestry, options)) {
							 | 
						|
								            return true;
							 | 
						|
								          }
							 | 
						|
								        }
							 | 
						|
								      }
							 | 
						|
								    }
							 | 
						|
								    return false;
							 | 
						|
								  }
							 | 
						|
								
							 | 
						|
								  /**
							 | 
						|
								   * Determines if the given node has an adjacent sibling that matches
							 | 
						|
								   * the given selector matcher.
							 | 
						|
								   * @param {external:AST} node
							 | 
						|
								   * @param {SelectorMatcher} matcher
							 | 
						|
								   * @param {external:AST[]} ancestry
							 | 
						|
								   * @param {Side} side
							 | 
						|
								   * @param {ESQueryOptions|undefined} options
							 | 
						|
								   * @returns {boolean}
							 | 
						|
								   */
							 | 
						|
								  function adjacent(node, matcher, ancestry, side, options) {
							 | 
						|
								    var _ancestry2 = _slicedToArray(ancestry, 1),
							 | 
						|
								      parent = _ancestry2[0];
							 | 
						|
								    if (!parent) {
							 | 
						|
								      return false;
							 | 
						|
								    }
							 | 
						|
								    var keys = getVisitorKeys(parent, options);
							 | 
						|
								    for (var i = 0; i < keys.length; ++i) {
							 | 
						|
								      var listProp = parent[keys[i]];
							 | 
						|
								      if (Array.isArray(listProp)) {
							 | 
						|
								        var idx = listProp.indexOf(node);
							 | 
						|
								        if (idx < 0) {
							 | 
						|
								          continue;
							 | 
						|
								        }
							 | 
						|
								        if (side === LEFT_SIDE && idx > 0 && isNode(listProp[idx - 1], options) && matcher(listProp[idx - 1], ancestry, options)) {
							 | 
						|
								          return true;
							 | 
						|
								        }
							 | 
						|
								        if (side === RIGHT_SIDE && idx < listProp.length - 1 && isNode(listProp[idx + 1], options) && matcher(listProp[idx + 1], ancestry, options)) {
							 | 
						|
								          return true;
							 | 
						|
								        }
							 | 
						|
								      }
							 | 
						|
								    }
							 | 
						|
								    return false;
							 | 
						|
								  }
							 | 
						|
								
							 | 
						|
								  /**
							 | 
						|
								   * Determines if the given node is the `nth` child.
							 | 
						|
								   * If `nth` is negative then the position is counted
							 | 
						|
								   * from the end of the list of children.
							 | 
						|
								   * @param {external:AST} node
							 | 
						|
								   * @param {external:AST[]} ancestry
							 | 
						|
								   * @param {Integer} nth
							 | 
						|
								   * @param {ESQueryOptions|undefined} options
							 | 
						|
								   * @returns {boolean}
							 | 
						|
								   */
							 | 
						|
								  function nthChild(node, ancestry, nth, options) {
							 | 
						|
								    if (nth === 0) {
							 | 
						|
								      return false;
							 | 
						|
								    }
							 | 
						|
								    var _ancestry3 = _slicedToArray(ancestry, 1),
							 | 
						|
								      parent = _ancestry3[0];
							 | 
						|
								    if (!parent) {
							 | 
						|
								      return false;
							 | 
						|
								    }
							 | 
						|
								    var keys = getVisitorKeys(parent, options);
							 | 
						|
								    for (var i = 0; i < keys.length; ++i) {
							 | 
						|
								      var listProp = parent[keys[i]];
							 | 
						|
								      if (Array.isArray(listProp)) {
							 | 
						|
								        var idx = nth < 0 ? listProp.length + nth : nth - 1;
							 | 
						|
								        if (idx >= 0 && idx < listProp.length && listProp[idx] === node) {
							 | 
						|
								          return true;
							 | 
						|
								        }
							 | 
						|
								      }
							 | 
						|
								    }
							 | 
						|
								    return false;
							 | 
						|
								  }
							 | 
						|
								
							 | 
						|
								  /**
							 | 
						|
								   * For each selector node marked as a subject, find the portion of the
							 | 
						|
								   * selector that the subject must match.
							 | 
						|
								   * @param {SelectorAST} selector
							 | 
						|
								   * @param {SelectorAST} [ancestor] Defaults to `selector`
							 | 
						|
								   * @returns {SelectorAST[]}
							 | 
						|
								   */
							 | 
						|
								  function subjects(selector, ancestor) {
							 | 
						|
								    if (selector == null || _typeof(selector) != 'object') {
							 | 
						|
								      return [];
							 | 
						|
								    }
							 | 
						|
								    if (ancestor == null) {
							 | 
						|
								      ancestor = selector;
							 | 
						|
								    }
							 | 
						|
								    var results = selector.subject ? [ancestor] : [];
							 | 
						|
								    var keys = Object.keys(selector);
							 | 
						|
								    for (var i = 0; i < keys.length; ++i) {
							 | 
						|
								      var p = keys[i];
							 | 
						|
								      var sel = selector[p];
							 | 
						|
								      results.push.apply(results, _toConsumableArray(subjects(sel, p === 'left' ? sel : ancestor)));
							 | 
						|
								    }
							 | 
						|
								    return results;
							 | 
						|
								  }
							 | 
						|
								
							 | 
						|
								  /**
							 | 
						|
								  * @callback TraverseVisitor
							 | 
						|
								  * @param {?external:AST} node
							 | 
						|
								  * @param {?external:AST} parent
							 | 
						|
								  * @param {external:AST[]} ancestry
							 | 
						|
								  */
							 | 
						|
								
							 | 
						|
								  /**
							 | 
						|
								   * From a JS AST and a selector AST, collect all JS AST nodes that
							 | 
						|
								   * match the selector.
							 | 
						|
								   * @param {external:AST} ast
							 | 
						|
								   * @param {?SelectorAST} selector
							 | 
						|
								   * @param {TraverseVisitor} visitor
							 | 
						|
								   * @param {ESQueryOptions} [options]
							 | 
						|
								   * @returns {external:AST[]}
							 | 
						|
								   */
							 | 
						|
								  function traverse(ast, selector, visitor, options) {
							 | 
						|
								    if (!selector) {
							 | 
						|
								      return;
							 | 
						|
								    }
							 | 
						|
								    var ancestry = [];
							 | 
						|
								    var matcher = getMatcher(selector);
							 | 
						|
								    var altSubjects = subjects(selector).map(getMatcher);
							 | 
						|
								    estraverse.traverse(ast, {
							 | 
						|
								      enter: function enter(node, parent) {
							 | 
						|
								        if (parent != null) {
							 | 
						|
								          ancestry.unshift(parent);
							 | 
						|
								        }
							 | 
						|
								        if (matcher(node, ancestry, options)) {
							 | 
						|
								          if (altSubjects.length) {
							 | 
						|
								            for (var i = 0, l = altSubjects.length; i < l; ++i) {
							 | 
						|
								              if (altSubjects[i](node, ancestry, options)) {
							 | 
						|
								                visitor(node, parent, ancestry);
							 | 
						|
								              }
							 | 
						|
								              for (var k = 0, m = ancestry.length; k < m; ++k) {
							 | 
						|
								                var succeedingAncestry = ancestry.slice(k + 1);
							 | 
						|
								                if (altSubjects[i](ancestry[k], succeedingAncestry, options)) {
							 | 
						|
								                  visitor(ancestry[k], parent, succeedingAncestry);
							 | 
						|
								                }
							 | 
						|
								              }
							 | 
						|
								            }
							 | 
						|
								          } else {
							 | 
						|
								            visitor(node, parent, ancestry);
							 | 
						|
								          }
							 | 
						|
								        }
							 | 
						|
								      },
							 | 
						|
								      leave: function leave() {
							 | 
						|
								        ancestry.shift();
							 | 
						|
								      },
							 | 
						|
								      keys: options && options.visitorKeys,
							 | 
						|
								      fallback: options && options.fallback || 'iteration'
							 | 
						|
								    });
							 | 
						|
								  }
							 | 
						|
								
							 | 
						|
								  /**
							 | 
						|
								   * From a JS AST and a selector AST, collect all JS AST nodes that
							 | 
						|
								   * match the selector.
							 | 
						|
								   * @param {external:AST} ast
							 | 
						|
								   * @param {?SelectorAST} selector
							 | 
						|
								   * @param {ESQueryOptions} [options]
							 | 
						|
								   * @returns {external:AST[]}
							 | 
						|
								   */
							 | 
						|
								  function match(ast, selector, options) {
							 | 
						|
								    var results = [];
							 | 
						|
								    traverse(ast, selector, function (node) {
							 | 
						|
								      results.push(node);
							 | 
						|
								    }, options);
							 | 
						|
								    return results;
							 | 
						|
								  }
							 | 
						|
								
							 | 
						|
								  /**
							 | 
						|
								   * Parse a selector string and return its AST.
							 | 
						|
								   * @param {string} selector
							 | 
						|
								   * @returns {SelectorAST}
							 | 
						|
								   */
							 | 
						|
								  function parse(selector) {
							 | 
						|
								    return parser.parse(selector);
							 | 
						|
								  }
							 | 
						|
								
							 | 
						|
								  /**
							 | 
						|
								   * Query the code AST using the selector string.
							 | 
						|
								   * @param {external:AST} ast
							 | 
						|
								   * @param {string} selector
							 | 
						|
								   * @param {ESQueryOptions} [options]
							 | 
						|
								   * @returns {external:AST[]}
							 | 
						|
								   */
							 | 
						|
								  function query(ast, selector, options) {
							 | 
						|
								    return match(ast, parse(selector), options);
							 | 
						|
								  }
							 | 
						|
								  query.parse = parse;
							 | 
						|
								  query.match = match;
							 | 
						|
								  query.traverse = traverse;
							 | 
						|
								  query.matches = matches;
							 | 
						|
								  query.query = query;
							 | 
						|
								
							 | 
						|
								  return query;
							 | 
						|
								
							 | 
						|
								})));
							 |