pax_global_header00006660000000000000000000000064125711012100014500gustar00rootroot0000000000000052 comment=419b0cbb83e67af53f9fd3f7ff98605ea2020eb6 parse-json-2.2.0/000077500000000000000000000000001257110121000135625ustar00rootroot00000000000000parse-json-2.2.0/.editorconfig000066400000000000000000000003471257110121000162430ustar00rootroot00000000000000root = true [*] indent_style = tab end_of_line = lf charset = utf-8 trim_trailing_whitespace = true insert_final_newline = true [{package.json,*.yml}] indent_style = space indent_size = 2 [*.md] trim_trailing_whitespace = false parse-json-2.2.0/.gitattributes000066400000000000000000000000141257110121000164500ustar00rootroot00000000000000* text=auto parse-json-2.2.0/.gitignore000066400000000000000000000000151257110121000155460ustar00rootroot00000000000000node_modules parse-json-2.2.0/.travis.yml000066400000000000000000000000741257110121000156740ustar00rootroot00000000000000language: node_js node_js: - 'iojs' - '0.12' - '0.10' parse-json-2.2.0/index.js000066400000000000000000000011151257110121000152250ustar00rootroot00000000000000'use strict'; var errorEx = require('error-ex'); var fallback = require('./vendor/parse'); var JSONError = errorEx('JSONError', { fileName: errorEx.append('in %s') }); module.exports = function (x, reviver, filename) { if (typeof reviver === 'string') { filename = reviver; reviver = null; } try { try { return JSON.parse(x, reviver); } catch (err) { fallback.parse(x, { mode: 'json', reviver: reviver }); throw err; } } catch (err) { var jsonErr = new JSONError(err); if (filename) { jsonErr.fileName = filename; } throw jsonErr; } }; parse-json-2.2.0/license000066400000000000000000000021371257110121000151320ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) Sindre Sorhus (sindresorhus.com) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. parse-json-2.2.0/package.json000066400000000000000000000013651257110121000160550ustar00rootroot00000000000000{ "name": "parse-json", "version": "2.2.0", "description": "Parse JSON with more helpful errors", "license": "MIT", "repository": "sindresorhus/parse-json", "author": { "name": "Sindre Sorhus", "email": "sindresorhus@gmail.com", "url": "sindresorhus.com" }, "engines": { "node": ">=0.10.0" }, "scripts": { "test": "xo && node test.js" }, "files": [ "index.js", "vendor" ], "keywords": [ "parse", "json", "graceful", "error", "message", "humanize", "friendly", "helpful", "string", "str" ], "dependencies": { "error-ex": "^1.2.0" }, "devDependencies": { "ava": "0.0.4", "xo": "*" }, "xo": { "ignores": [ "vendor/**" ] } } parse-json-2.2.0/readme.md000066400000000000000000000023711257110121000153440ustar00rootroot00000000000000# parse-json [![Build Status](https://travis-ci.org/sindresorhus/parse-json.svg?branch=master)](https://travis-ci.org/sindresorhus/parse-json) > Parse JSON with more helpful errors ## Install ``` $ npm install --save parse-json ``` ## Usage ```js var parseJson = require('parse-json'); var json = '{\n\t"foo": true,\n}'; JSON.parse(json); /* undefined:3 } ^ SyntaxError: Unexpected token } */ parseJson(json); /* JSONError: Trailing comma in object at 3:1 } ^ */ parseJson(json, 'foo.json'); /* JSONError: Trailing comma in object at 3:1 in foo.json } ^ */ // you can also add the filename at a later point try { parseJson(json); } catch (err) { err.fileName = 'foo.json'; throw err; } /* JSONError: Trailing comma in object at 3:1 in foo.json } ^ */ ``` ## API ### parseJson(input, [reviver], [filename]) #### input Type: `string` #### reviver Type: `function` Prescribes how the value originally produced by parsing is transformed, before being returned. See [`JSON.parse` docs](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse#Using_the_reviver_parameter ) for more. #### filename Type: `string` Filename displayed in the error message. ## License MIT © [Sindre Sorhus](http://sindresorhus.com) parse-json-2.2.0/test.js000066400000000000000000000013041257110121000150750ustar00rootroot00000000000000'use strict'; var assert = require('assert'); var test = require('ava'); var fn = require('./'); var reJsonErr = /JSONError: Trailing.*in foo\.json/; test(function (t) { t.assert(fn('{"foo": true}')); assert.throws(function () { fn('{\n\t"foo": true,\n}'); }, /JSONError: Trailing/); assert.throws(function () { try { fn('{\n\t"foo": true,\n}'); } catch (err) { err.fileName = 'foo.json'; throw err; } }, reJsonErr); assert.throws(function () { fn('{\n\t"foo": true,\n}', 'foo.json'); }, reJsonErr); assert.throws(function () { try { fn('{\n\t"foo": true,\n}', 'bar.json'); } catch (err) { err.fileName = 'foo.json'; throw err; } }, reJsonErr); t.end(); }); parse-json-2.2.0/vendor/000077500000000000000000000000001257110121000150575ustar00rootroot00000000000000parse-json-2.2.0/vendor/parse.js000066400000000000000000000441211257110121000165310ustar00rootroot00000000000000/* * Author: Alex Kocharin * GIT: https://github.com/rlidwka/jju * License: WTFPL, grab your copy here: http://www.wtfpl.net/txt/copying/ */ // RTFM: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf var Uni = require('./unicode') function isHexDigit(x) { return (x >= '0' && x <= '9') || (x >= 'A' && x <= 'F') || (x >= 'a' && x <= 'f') } function isOctDigit(x) { return x >= '0' && x <= '7' } function isDecDigit(x) { return x >= '0' && x <= '9' } var unescapeMap = { '\'': '\'', '"' : '"', '\\': '\\', 'b' : '\b', 'f' : '\f', 'n' : '\n', 'r' : '\r', 't' : '\t', 'v' : '\v', '/' : '/', } function formatError(input, msg, position, lineno, column, json5) { var result = msg + ' at ' + (lineno + 1) + ':' + (column + 1) , tmppos = position - column - 1 , srcline = '' , underline = '' var isLineTerminator = json5 ? Uni.isLineTerminator : Uni.isLineTerminatorJSON // output no more than 70 characters before the wrong ones if (tmppos < position - 70) { tmppos = position - 70 } while (1) { var chr = input[++tmppos] if (isLineTerminator(chr) || tmppos === input.length) { if (position >= tmppos) { // ending line error, so show it after the last char underline += '^' } break } srcline += chr if (position === tmppos) { underline += '^' } else if (position > tmppos) { underline += input[tmppos] === '\t' ? '\t' : ' ' } // output no more than 78 characters on the string if (srcline.length > 78) break } return result + '\n' + srcline + '\n' + underline } function parse(input, options) { // parse as a standard JSON mode var json5 = !(options.mode === 'json' || options.legacy) var isLineTerminator = json5 ? Uni.isLineTerminator : Uni.isLineTerminatorJSON var isWhiteSpace = json5 ? Uni.isWhiteSpace : Uni.isWhiteSpaceJSON var length = input.length , lineno = 0 , linestart = 0 , position = 0 , stack = [] var tokenStart = function() {} var tokenEnd = function(v) {return v} /* tokenize({ raw: '...', type: 'whitespace'|'comment'|'key'|'literal'|'separator'|'newline', value: 'number'|'string'|'whatever', path: [...], }) */ if (options._tokenize) { ;(function() { var start = null tokenStart = function() { if (start !== null) throw Error('internal error, token overlap') start = position } tokenEnd = function(v, type) { if (start != position) { var hash = { raw: input.substr(start, position-start), type: type, stack: stack.slice(0), } if (v !== undefined) hash.value = v options._tokenize.call(null, hash) } start = null return v } })() } function fail(msg) { var column = position - linestart if (!msg) { if (position < length) { var token = '\'' + JSON .stringify(input[position]) .replace(/^"|"$/g, '') .replace(/'/g, "\\'") .replace(/\\"/g, '"') + '\'' if (!msg) msg = 'Unexpected token ' + token } else { if (!msg) msg = 'Unexpected end of input' } } var error = SyntaxError(formatError(input, msg, position, lineno, column, json5)) error.row = lineno + 1 error.column = column + 1 throw error } function newline(chr) { // account for if (chr === '\r' && input[position] === '\n') position++ linestart = position lineno++ } function parseGeneric() { var result while (position < length) { tokenStart() var chr = input[position++] if (chr === '"' || (chr === '\'' && json5)) { return tokenEnd(parseString(chr), 'literal') } else if (chr === '{') { tokenEnd(undefined, 'separator') return parseObject() } else if (chr === '[') { tokenEnd(undefined, 'separator') return parseArray() } else if (chr === '-' || chr === '.' || isDecDigit(chr) // + number Infinity NaN || (json5 && (chr === '+' || chr === 'I' || chr === 'N')) ) { return tokenEnd(parseNumber(), 'literal') } else if (chr === 'n') { parseKeyword('null') return tokenEnd(null, 'literal') } else if (chr === 't') { parseKeyword('true') return tokenEnd(true, 'literal') } else if (chr === 'f') { parseKeyword('false') return tokenEnd(false, 'literal') } else { position-- return tokenEnd(undefined) } } } function parseKey() { var result while (position < length) { tokenStart() var chr = input[position++] if (chr === '"' || (chr === '\'' && json5)) { return tokenEnd(parseString(chr), 'key') } else if (chr === '{') { tokenEnd(undefined, 'separator') return parseObject() } else if (chr === '[') { tokenEnd(undefined, 'separator') return parseArray() } else if (chr === '.' || isDecDigit(chr) ) { return tokenEnd(parseNumber(true), 'key') } else if (json5 && Uni.isIdentifierStart(chr) || (chr === '\\' && input[position] === 'u')) { // unicode char or a unicode sequence var rollback = position - 1 var result = parseIdentifier() if (result === undefined) { position = rollback return tokenEnd(undefined) } else { return tokenEnd(result, 'key') } } else { position-- return tokenEnd(undefined) } } } function skipWhiteSpace() { tokenStart() while (position < length) { var chr = input[position++] if (isLineTerminator(chr)) { position-- tokenEnd(undefined, 'whitespace') tokenStart() position++ newline(chr) tokenEnd(undefined, 'newline') tokenStart() } else if (isWhiteSpace(chr)) { // nothing } else if (chr === '/' && json5 && (input[position] === '/' || input[position] === '*') ) { position-- tokenEnd(undefined, 'whitespace') tokenStart() position++ skipComment(input[position++] === '*') tokenEnd(undefined, 'comment') tokenStart() } else { position-- break } } return tokenEnd(undefined, 'whitespace') } function skipComment(multi) { while (position < length) { var chr = input[position++] if (isLineTerminator(chr)) { // LineTerminator is an end of singleline comment if (!multi) { // let parent function deal with newline position-- return } newline(chr) } else if (chr === '*' && multi) { // end of multiline comment if (input[position] === '/') { position++ return } } else { // nothing } } if (multi) { fail('Unclosed multiline comment') } } function parseKeyword(keyword) { // keyword[0] is not checked because it should've checked earlier var _pos = position var len = keyword.length for (var i=1; i= length || keyword[i] != input[position]) { position = _pos-1 fail() } position++ } } function parseObject() { var result = options.null_prototype ? Object.create(null) : {} , empty_object = {} , is_non_empty = false while (position < length) { skipWhiteSpace() var item1 = parseKey() skipWhiteSpace() tokenStart() var chr = input[position++] tokenEnd(undefined, 'separator') if (chr === '}' && item1 === undefined) { if (!json5 && is_non_empty) { position-- fail('Trailing comma in object') } return result } else if (chr === ':' && item1 !== undefined) { skipWhiteSpace() stack.push(item1) var item2 = parseGeneric() stack.pop() if (item2 === undefined) fail('No value found for key ' + item1) if (typeof(item1) !== 'string') { if (!json5 || typeof(item1) !== 'number') { fail('Wrong key type: ' + item1) } } if ((item1 in empty_object || empty_object[item1] != null) && options.reserved_keys !== 'replace') { if (options.reserved_keys === 'throw') { fail('Reserved key: ' + item1) } else { // silently ignore it } } else { if (typeof(options.reviver) === 'function') { item2 = options.reviver.call(null, item1, item2) } if (item2 !== undefined) { is_non_empty = true Object.defineProperty(result, item1, { value: item2, enumerable: true, configurable: true, writable: true, }) } } skipWhiteSpace() tokenStart() var chr = input[position++] tokenEnd(undefined, 'separator') if (chr === ',') { continue } else if (chr === '}') { return result } else { fail() } } else { position-- fail() } } fail() } function parseArray() { var result = [] while (position < length) { skipWhiteSpace() stack.push(result.length) var item = parseGeneric() stack.pop() skipWhiteSpace() tokenStart() var chr = input[position++] tokenEnd(undefined, 'separator') if (item !== undefined) { if (typeof(options.reviver) === 'function') { item = options.reviver.call(null, String(result.length), item) } if (item === undefined) { result.length++ item = true // hack for check below, not included into result } else { result.push(item) } } if (chr === ',') { if (item === undefined) { fail('Elisions are not supported') } } else if (chr === ']') { if (!json5 && item === undefined && result.length) { position-- fail('Trailing comma in array') } return result } else { position-- fail() } } } function parseNumber() { // rewind because we don't know first char position-- var start = position , chr = input[position++] , t var to_num = function(is_octal) { var str = input.substr(start, position - start) if (is_octal) { var result = parseInt(str.replace(/^0o?/, ''), 8) } else { var result = Number(str) } if (Number.isNaN(result)) { position-- fail('Bad numeric literal - "' + input.substr(start, position - start + 1) + '"') } else if (!json5 && !str.match(/^-?(0|[1-9][0-9]*)(\.[0-9]+)?(e[+-]?[0-9]+)?$/i)) { // additional restrictions imposed by json position-- fail('Non-json numeric literal - "' + input.substr(start, position - start + 1) + '"') } else { return result } } // ex: -5982475.249875e+29384 // ^ skipping this if (chr === '-' || (chr === '+' && json5)) chr = input[position++] if (chr === 'N' && json5) { parseKeyword('NaN') return NaN } if (chr === 'I' && json5) { parseKeyword('Infinity') // returning +inf or -inf return to_num() } if (chr >= '1' && chr <= '9') { // ex: -5982475.249875e+29384 // ^^^ skipping these while (position < length && isDecDigit(input[position])) position++ chr = input[position++] } // special case for leading zero: 0.123456 if (chr === '0') { chr = input[position++] // new syntax, "0o777" old syntax, "0777" var is_octal = chr === 'o' || chr === 'O' || isOctDigit(chr) var is_hex = chr === 'x' || chr === 'X' if (json5 && (is_octal || is_hex)) { while (position < length && (is_hex ? isHexDigit : isOctDigit)( input[position] ) ) position++ var sign = 1 if (input[start] === '-') { sign = -1 start++ } else if (input[start] === '+') { start++ } return sign * to_num(is_octal) } } if (chr === '.') { // ex: -5982475.249875e+29384 // ^^^ skipping these while (position < length && isDecDigit(input[position])) position++ chr = input[position++] } if (chr === 'e' || chr === 'E') { chr = input[position++] if (chr === '-' || chr === '+') position++ // ex: -5982475.249875e+29384 // ^^^ skipping these while (position < length && isDecDigit(input[position])) position++ chr = input[position++] } // we have char in the buffer, so count for it position-- return to_num() } function parseIdentifier() { // rewind because we don't know first char position-- var result = '' while (position < length) { var chr = input[position++] if (chr === '\\' && input[position] === 'u' && isHexDigit(input[position+1]) && isHexDigit(input[position+2]) && isHexDigit(input[position+3]) && isHexDigit(input[position+4]) ) { // UnicodeEscapeSequence chr = String.fromCharCode(parseInt(input.substr(position+1, 4), 16)) position += 5 } if (result.length) { // identifier started if (Uni.isIdentifierPart(chr)) { result += chr } else { position-- return result } } else { if (Uni.isIdentifierStart(chr)) { result += chr } else { return undefined } } } fail() } function parseString(endChar) { // 7.8.4 of ES262 spec var result = '' while (position < length) { var chr = input[position++] if (chr === endChar) { return result } else if (chr === '\\') { if (position >= length) fail() chr = input[position++] if (unescapeMap[chr] && (json5 || (chr != 'v' && chr != "'"))) { result += unescapeMap[chr] } else if (json5 && isLineTerminator(chr)) { // line continuation newline(chr) } else if (chr === 'u' || (chr === 'x' && json5)) { // unicode/character escape sequence var off = chr === 'u' ? 4 : 2 // validation for \uXXXX for (var i=0; i= length) fail() if (!isHexDigit(input[position])) fail('Bad escape sequence') position++ } result += String.fromCharCode(parseInt(input.substr(position-off, off), 16)) } else if (json5 && isOctDigit(chr)) { if (chr < '4' && isOctDigit(input[position]) && isOctDigit(input[position+1])) { // three-digit octal var digits = 3 } else if (isOctDigit(input[position])) { // two-digit octal var digits = 2 } else { var digits = 1 } position += digits - 1 result += String.fromCharCode(parseInt(input.substr(position-digits, digits), 8)) /*if (!isOctDigit(input[position])) { // \0 is allowed still result += '\0' } else { fail('Octal literals are not supported') }*/ } else if (json5) { // \X -> x result += chr } else { position-- fail() } } else if (isLineTerminator(chr)) { fail() } else { if (!json5 && chr.charCodeAt(0) < 32) { position-- fail('Unexpected control character') } // SourceCharacter but not one of " or \ or LineTerminator result += chr } } fail() } skipWhiteSpace() var return_value = parseGeneric() if (return_value !== undefined || position < length) { skipWhiteSpace() if (position >= length) { if (typeof(options.reviver) === 'function') { return_value = options.reviver.call(null, '', return_value) } return return_value } else { fail() } } else { if (position) { fail('No data, only a whitespace') } else { fail('No data, empty input') } } } /* * parse(text, options) * or * parse(text, reviver) * * where: * text - string * options - object * reviver - function */ module.exports.parse = function parseJSON(input, options) { // support legacy functions if (typeof(options) === 'function') { options = { reviver: options } } if (input === undefined) { // parse(stringify(x)) should be equal x // with JSON functions it is not 'cause of undefined // so we're fixing it return undefined } // JSON.parse compat if (typeof(input) !== 'string') input = String(input) if (options == null) options = {} if (options.reserved_keys == null) options.reserved_keys = 'ignore' if (options.reserved_keys === 'throw' || options.reserved_keys === 'ignore') { if (options.null_prototype == null) { options.null_prototype = true } } try { return parse(input, options) } catch(err) { // jju is a recursive parser, so JSON.parse("{{{{{{{") could blow up the stack // // this catch is used to skip all those internal calls if (err instanceof SyntaxError && err.row != null && err.column != null) { var old_err = err err = SyntaxError(old_err.message) err.column = old_err.column err.row = old_err.row } throw err } } module.exports.tokenize = function tokenizeJSON(input, options) { if (options == null) options = {} options._tokenize = function(smth) { if (options._addstack) smth.stack.unshift.apply(smth.stack, options._addstack) tokens.push(smth) } var tokens = [] tokens.data = module.exports.parse(input, options) return tokens } parse-json-2.2.0/vendor/unicode.js000066400000000000000000000257171257110121000170570ustar00rootroot00000000000000 // This is autogenerated with esprima tools, see: // https://github.com/ariya/esprima/blob/master/esprima.js // // PS: oh God, I hate Unicode // ECMAScript 5.1/Unicode v6.3.0 NonAsciiIdentifierStart: var Uni = module.exports module.exports.isWhiteSpace = function isWhiteSpace(x) { // section 7.2, table 2 return x === '\u0020' || x === '\u00A0' || x === '\uFEFF' // <-- this is not a Unicode WS, only a JS one || (x >= '\u0009' && x <= '\u000D') // 9 A B C D // + whitespace characters from unicode, category Zs || x === '\u1680' || x === '\u180E' || (x >= '\u2000' && x <= '\u200A') // 0 1 2 3 4 5 6 7 8 9 A || x === '\u2028' || x === '\u2029' || x === '\u202F' || x === '\u205F' || x === '\u3000' } module.exports.isWhiteSpaceJSON = function isWhiteSpaceJSON(x) { return x === '\u0020' || x === '\u0009' || x === '\u000A' || x === '\u000D' } module.exports.isLineTerminator = function isLineTerminator(x) { // ok, here is the part when JSON is wrong // section 7.3, table 3 return x === '\u000A' || x === '\u000D' || x === '\u2028' || x === '\u2029' } module.exports.isLineTerminatorJSON = function isLineTerminatorJSON(x) { return x === '\u000A' || x === '\u000D' } module.exports.isIdentifierStart = function isIdentifierStart(x) { return x === '$' || x === '_' || (x >= 'A' && x <= 'Z') || (x >= 'a' && x <= 'z') || (x >= '\u0080' && Uni.NonAsciiIdentifierStart.test(x)) } module.exports.isIdentifierPart = function isIdentifierPart(x) { return x === '$' || x === '_' || (x >= 'A' && x <= 'Z') || (x >= 'a' && x <= 'z') || (x >= '0' && x <= '9') // <-- addition to Start || (x >= '\u0080' && Uni.NonAsciiIdentifierPart.test(x)) } module.exports.NonAsciiIdentifierStart = /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0\u08A2-\u08AC\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0977\u0979-\u097F\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F0\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]/ // ECMAScript 5.1/Unicode v6.3.0 NonAsciiIdentifierPart: module.exports.NonAsciiIdentifierPart = /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u08A0\u08A2-\u08AC\u08E4-\u08FE\u0900-\u0963\u0966-\u096F\u0971-\u0977\u0979-\u097F\u0981-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C01-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58\u0C59\u0C60-\u0C63\u0C66-\u0C6F\u0C82\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D02\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D57\u0D60-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1380-\u138F\u13A0-\u13F4\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F0\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191C\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19D9\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1CD0-\u1CD2\u1CD4-\u1CF6\u1D00-\u1DE6\u1DFC-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u200C\u200D\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u2E2F\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099\u309A\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA697\uA69F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA827\uA840-\uA873\uA880-\uA8C4\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A\uAA7B\uAA80-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uABC0-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE26\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]/