diff --git a/index.html b/index.html new file mode 100644 index 0000000..1ecf653 --- /dev/null +++ b/index.html @@ -0,0 +1,161 @@ + + + + + + + Does MrDoob Approves? + + + + + + + +

Is your code style approved by mrdoob?

+ + + + + +
Protip 1: check the console
+ +
Protip 2: To learn more about Mr.doob's Code Style™, check out the wiki, discussion and history.
+ +
About: another quick random idea by @blurspline.
+(unfortunately this was code in a couple of minutes, so the code for this page is not mdcs approved either :)
+ + + + + + + + + \ No newline at end of file diff --git a/jscs-browser.js b/jscs-browser.js new file mode 100644 index 0000000..eea5b97 --- /dev/null +++ b/jscs-browser.js @@ -0,0 +1,22854 @@ +!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),f.JscsStringChecker=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o 0 || isNaN(maxErrors) || maxErrors === null, + '`maxErrors` option requires number or null value' + ); + this._maxErrors = maxErrors; + } + + if (config.hasOwnProperty('esnext')) { + assert( + typeof config.esnext === 'boolean' || config.esnext === null, + '`esnext` option requires boolean or null value' + ); + this._esnextEnabled = Boolean(config.esnext); + } + + if (config.hasOwnProperty('esprima')) { + this._loadEsprima(config.esprima); + } + + if (config.hasOwnProperty('errorFilter')) { + this._loadErrorFilter(config.errorFilter); + } + + // Apply config options + Object.keys(config).forEach(function(key) { + if (!BUILTIN_OPTIONS[key]) { + ruleSettings[key] = config[key]; + } + }); + + return ruleSettings; +}; + +/** + * Loads plugin data. + * + * @param {function(Configuration)} plugin + * @protected + */ +Configuration.prototype._loadPlugin = function(plugin) { + assert(typeof plugin === 'function', '`plugin` should be a function'); + plugin(this); +}; + +/** + * Loads an error filter. + * + * @param {Function|null} errorFilter + * @protected + */ +Configuration.prototype._loadErrorFilter = function(errorFilter) { + assert( + typeof errorFilter === 'function' || + errorFilter === null, + '`errorFilter` option requires a function or null value' + ); + this._errorFilter = errorFilter; +}; + +/** + * Loads a custom esprima. + * + * @param {Object|null} esprima + * @protected + */ +Configuration.prototype._loadEsprima = function(esprima) { + assert( + (esprima && typeof esprima.parse === 'function') || + esprima === null, + '`esprima` option requires a null value or an object with a parse function' + ); + this._esprima = esprima; +}; + +/** + * Includes plugin in the configuration environment. + * + * @param {function(Configuration)|*} plugin + */ +Configuration.prototype.usePlugin = function(plugin) { + this._loadPlugin(plugin); +}; + +/** + * Loads additional rule. + * + * @param {Rule} additionalRule + * @protected + */ +Configuration.prototype._loadAdditionalRule = function(additionalRule) { + assert(typeof additionalRule === 'object', '`additionalRule` should be an object'); + this.registerRule(additionalRule); +}; + +/** + * Throws error for non camel-case options. + * + * @param {Object} ruleSettings + * @protected + */ +Configuration.prototype._throwNonCamelCaseErrorIfNeeded = function(ruleSettings) { + function symbolToUpperCase(s, symbol) { + return symbol.toUpperCase(); + } + function fixSettings(originalSettings) { + var result = {}; + Object.keys(originalSettings).forEach(function(key) { + var camelCaseName = key.replace(/_([a-zA-Z])/g, symbolToUpperCase); + var value = originalSettings[key]; + if (typeof value === 'object' && value !== null && !Array.isArray(value)) { + value = fixSettings(value); + } + result[camelCaseName] = value; + }); + return result; + } + + Object.keys(ruleSettings).forEach(function(key) { + if (key.indexOf('_') !== -1) { + throw new Error( + 'JSCS now accepts configuration options in camel case. Sorry for inconvenience. ' + + 'On the bright side, we tried to convert your jscs config to camel case.\n' + + '----------------------------------------\n' + + JSON.stringify(fixSettings(ruleSettings), null, 4) + + '\n----------------------------------------\n' + ); + } + }); +}; + +/** + * Adds rule to the collection. + * + * @param {Rule|function} rule Rule instance or rule class. + */ +Configuration.prototype.registerRule = function(rule) { + if (typeof rule === 'function') { + var RuleClass = rule; + rule = new RuleClass(); + } + + var optionName = rule.getOptionName(); + assert(!this._rules.hasOwnProperty(optionName), 'Rule "' + optionName + '" is already registered'); + this._rules[optionName] = rule; +}; + +/** + * Returns list of registered rules. + * + * @returns {Rule[]} + */ +Configuration.prototype.getRegisteredRules = function() { + var rules = this._rules; + return Object.keys(rules).map(function(ruleOptionName) { + return rules[ruleOptionName]; + }); +}; + +/** + * Adds preset to the collection. + * + * @param {String} presetName + * @param {Object} presetConfig + */ +Configuration.prototype.registerPreset = function(presetName, presetConfig) { + this._presets[presetName] = presetConfig; +}; + +/** + * Returns registered presets object (key - preset name, value - preset content). + * + * @returns {Object} + */ +Configuration.prototype.getRegisteredPresets = function() { + return this._presets; +}; + +/** + * Returns `true` if preset with specified name exists. + * + * @param {String} presetName + * @return {Boolean} + */ +Configuration.prototype.hasPreset = function(presetName) { + return this._presets.hasOwnProperty(presetName); +}; + +/** + * Registers built-in Code Style cheking rules. + */ +Configuration.prototype.registerDefaultRules = function() { + + /* + Important! + These rules are linked explicitly to keep browser-version supported. + */ + + this.registerRule(require('../rules/require-curly-braces')); + this.registerRule(require('../rules/require-multiple-var-decl')); + this.registerRule(require('../rules/disallow-multiple-var-decl')); + this.registerRule(require('../rules/disallow-empty-blocks')); + this.registerRule(require('../rules/require-space-after-keywords')); + this.registerRule(require('../rules/require-space-before-keywords')); + this.registerRule(require('../rules/disallow-space-after-keywords')); + this.registerRule(require('../rules/disallow-space-before-keywords')); + this.registerRule(require('../rules/require-parentheses-around-iife')); + + /* deprecated rules */ + this.registerRule(require('../rules/require-left-sticked-operators')); + this.registerRule(require('../rules/disallow-left-sticked-operators')); + this.registerRule(require('../rules/require-right-sticked-operators')); + this.registerRule(require('../rules/disallow-right-sticked-operators')); + this.registerRule(require('../rules/validate-jsdoc')); + /* deprecated rules (end) */ + + this.registerRule(require('../rules/require-operator-before-line-break')); + this.registerRule(require('../rules/disallow-operator-before-line-break')); + this.registerRule(require('../rules/disallow-implicit-type-conversion')); + this.registerRule(require('../rules/require-camelcase-or-uppercase-identifiers')); + this.registerRule(require('../rules/disallow-keywords')); + this.registerRule(require('../rules/disallow-multiple-line-breaks')); + this.registerRule(require('../rules/disallow-multiple-line-strings')); + this.registerRule(require('../rules/validate-line-breaks')); + this.registerRule(require('../rules/validate-quote-marks')); + this.registerRule(require('../rules/validate-indentation')); + this.registerRule(require('../rules/disallow-trailing-whitespace')); + this.registerRule(require('../rules/disallow-mixed-spaces-and-tabs')); + this.registerRule(require('../rules/require-keywords-on-new-line')); + this.registerRule(require('../rules/disallow-keywords-on-new-line')); + this.registerRule(require('../rules/require-line-feed-at-file-end')); + this.registerRule(require('../rules/maximum-line-length')); + this.registerRule(require('../rules/require-yoda-conditions')); + this.registerRule(require('../rules/disallow-yoda-conditions')); + this.registerRule(require('../rules/require-spaces-inside-object-brackets')); + this.registerRule(require('../rules/require-spaces-inside-array-brackets')); + this.registerRule(require('../rules/require-spaces-inside-parentheses')); + this.registerRule(require('../rules/disallow-spaces-inside-object-brackets')); + this.registerRule(require('../rules/disallow-spaces-inside-array-brackets')); + this.registerRule(require('../rules/disallow-spaces-inside-parentheses')); + this.registerRule(require('../rules/require-blocks-on-newline')); + this.registerRule(require('../rules/require-space-after-object-keys')); + this.registerRule(require('../rules/require-space-before-object-values')); + this.registerRule(require('../rules/disallow-space-after-object-keys')); + this.registerRule(require('../rules/disallow-space-before-object-values')); + this.registerRule(require('../rules/disallow-quoted-keys-in-objects')); + this.registerRule(require('../rules/disallow-dangling-underscores')); + this.registerRule(require('../rules/require-aligned-object-values')); + + this.registerRule(require('../rules/disallow-padding-newlines-in-blocks')); + this.registerRule(require('../rules/require-padding-newlines-in-blocks')); + this.registerRule(require('../rules/require-padding-newlines-in-objects')); + this.registerRule(require('../rules/disallow-padding-newlines-in-objects')); + this.registerRule(require('../rules/require-newline-before-block-statements')); + this.registerRule(require('../rules/disallow-newline-before-block-statements')); + + this.registerRule(require('../rules/require-padding-newlines-before-keywords')); + this.registerRule(require('../rules/disallow-padding-newlines-before-keywords')); + + this.registerRule(require('../rules/disallow-trailing-comma')); + this.registerRule(require('../rules/require-trailing-comma')); + + this.registerRule(require('../rules/disallow-comma-before-line-break')); + this.registerRule(require('../rules/require-comma-before-line-break')); + + this.registerRule(require('../rules/disallow-space-before-block-statements.js')); + this.registerRule(require('../rules/require-space-before-block-statements.js')); + + this.registerRule(require('../rules/disallow-space-before-postfix-unary-operators.js')); + this.registerRule(require('../rules/require-space-before-postfix-unary-operators.js')); + + this.registerRule(require('../rules/disallow-space-after-prefix-unary-operators.js')); + this.registerRule(require('../rules/require-space-after-prefix-unary-operators.js')); + + this.registerRule(require('../rules/disallow-space-before-binary-operators')); + this.registerRule(require('../rules/require-space-before-binary-operators')); + + this.registerRule(require('../rules/disallow-space-after-binary-operators')); + this.registerRule(require('../rules/require-space-after-binary-operators')); + + this.registerRule(require('../rules/require-spaces-in-conditional-expression')); + this.registerRule(require('../rules/disallow-spaces-in-conditional-expression')); + + this.registerRule(require('../rules/require-spaces-in-function')); + this.registerRule(require('../rules/disallow-spaces-in-function')); + this.registerRule(require('../rules/require-spaces-in-function-expression')); + this.registerRule(require('../rules/disallow-spaces-in-function-expression')); + this.registerRule(require('../rules/require-spaces-in-anonymous-function-expression')); + this.registerRule(require('../rules/disallow-spaces-in-anonymous-function-expression')); + this.registerRule(require('../rules/require-spaces-in-named-function-expression')); + this.registerRule(require('../rules/disallow-spaces-in-named-function-expression')); + this.registerRule(require('../rules/require-spaces-in-function-declaration')); + this.registerRule(require('../rules/disallow-spaces-in-function-declaration')); + + this.registerRule(require('../rules/require-spaces-in-call-expression')); + this.registerRule(require('../rules/disallow-spaces-in-call-expression')); + + this.registerRule(require('../rules/validate-parameter-separator')); + this.registerRule(require('../rules/require-space-between-arguments')); + this.registerRule(require('../rules/disallow-space-between-arguments')); + + this.registerRule(require('../rules/require-capitalized-constructors')); + + this.registerRule(require('../rules/safe-context-keyword')); + + this.registerRule(require('../rules/require-dot-notation')); + + this.registerRule(require('../rules/require-space-after-line-comment')); + this.registerRule(require('../rules/disallow-space-after-line-comment')); + + this.registerRule(require('../rules/require-anonymous-functions')); + this.registerRule(require('../rules/disallow-anonymous-functions')); + + this.registerRule(require('../rules/require-function-declarations')); + this.registerRule(require('../rules/disallow-function-declarations')); + + this.registerRule(require('../rules/require-capitalized-comments')); + this.registerRule(require('../rules/disallow-capitalized-comments')); + + this.registerRule(require('../rules/require-line-break-after-variable-assignment')); + + this.registerRule(require('../rules/disallow-semicolons')); +}; + +/** + * Registers built-in Code Style cheking presets. + */ +Configuration.prototype.registerDefaultPresets = function() { + // https://github.com/airbnb/javascript + this.registerPreset('airbnb', require('../../presets/airbnb.json')); + + // http://javascript.crockford.com/code.html + this.registerPreset('crockford', require('../../presets/crockford.json')); + + // https://google-styleguide.googlecode.com/svn/trunk/javascriptguide.xml + this.registerPreset('google', require('../../presets/google.json')); + + // http://gruntjs.com/contributing#syntax + this.registerPreset('grunt', require('../../presets/grunt.json')); + + // https://contribute.jquery.org/style-guide/js/ + this.registerPreset('jquery', require('../../presets/jquery.json')); + + // https://github.com/mrdoob/three.js/wiki/Mr.doob's-Code-Style%E2%84%A2 + this.registerPreset('mdcs', require('../../presets/mdcs.json')); + + // https://www.mediawiki.org/wiki/Manual:Coding_conventions/JavaScript + this.registerPreset('wikimedia', require('../../presets/wikimedia.json')); + + // https://github.com/yandex/codestyle/blob/master/js.md + this.registerPreset('yandex', require('../../presets/yandex.json')); +}; + +module.exports = Configuration; + +function copyConfiguration(source, dest) { + Object.keys(source).forEach(function(key) { + dest[key] = source[key]; + }); + if (source.configPath) { + dest.configPath = source.configPath; + } +} + +},{"../../presets/airbnb.json":139,"../../presets/crockford.json":140,"../../presets/google.json":141,"../../presets/grunt.json":142,"../../presets/jquery.json":143,"../../presets/mdcs.json":144,"../../presets/wikimedia.json":145,"../../presets/yandex.json":146,"../rules/disallow-anonymous-functions":5,"../rules/disallow-capitalized-comments":6,"../rules/disallow-comma-before-line-break":7,"../rules/disallow-dangling-underscores":8,"../rules/disallow-empty-blocks":9,"../rules/disallow-function-declarations":10,"../rules/disallow-implicit-type-conversion":11,"../rules/disallow-keywords":13,"../rules/disallow-keywords-on-new-line":12,"../rules/disallow-left-sticked-operators":14,"../rules/disallow-mixed-spaces-and-tabs":15,"../rules/disallow-multiple-line-breaks":16,"../rules/disallow-multiple-line-strings":17,"../rules/disallow-multiple-var-decl":18,"../rules/disallow-newline-before-block-statements":19,"../rules/disallow-operator-before-line-break":20,"../rules/disallow-padding-newlines-before-keywords":21,"../rules/disallow-padding-newlines-in-blocks":22,"../rules/disallow-padding-newlines-in-objects":23,"../rules/disallow-quoted-keys-in-objects":24,"../rules/disallow-right-sticked-operators":25,"../rules/disallow-semicolons":26,"../rules/disallow-space-after-binary-operators":27,"../rules/disallow-space-after-keywords":28,"../rules/disallow-space-after-line-comment":29,"../rules/disallow-space-after-object-keys":30,"../rules/disallow-space-after-prefix-unary-operators.js":31,"../rules/disallow-space-before-binary-operators":32,"../rules/disallow-space-before-block-statements.js":33,"../rules/disallow-space-before-keywords":34,"../rules/disallow-space-before-object-values":35,"../rules/disallow-space-before-postfix-unary-operators.js":36,"../rules/disallow-space-between-arguments":37,"../rules/disallow-spaces-in-anonymous-function-expression":38,"../rules/disallow-spaces-in-call-expression":39,"../rules/disallow-spaces-in-conditional-expression":40,"../rules/disallow-spaces-in-function":43,"../rules/disallow-spaces-in-function-declaration":41,"../rules/disallow-spaces-in-function-expression":42,"../rules/disallow-spaces-in-named-function-expression":44,"../rules/disallow-spaces-inside-array-brackets":45,"../rules/disallow-spaces-inside-object-brackets":46,"../rules/disallow-spaces-inside-parentheses":47,"../rules/disallow-trailing-comma":48,"../rules/disallow-trailing-whitespace":49,"../rules/disallow-yoda-conditions":50,"../rules/maximum-line-length":51,"../rules/require-aligned-object-values":52,"../rules/require-anonymous-functions":53,"../rules/require-blocks-on-newline":54,"../rules/require-camelcase-or-uppercase-identifiers":55,"../rules/require-capitalized-comments":56,"../rules/require-capitalized-constructors":57,"../rules/require-comma-before-line-break":58,"../rules/require-curly-braces":59,"../rules/require-dot-notation":60,"../rules/require-function-declarations":61,"../rules/require-keywords-on-new-line":62,"../rules/require-left-sticked-operators":63,"../rules/require-line-break-after-variable-assignment":64,"../rules/require-line-feed-at-file-end":65,"../rules/require-multiple-var-decl":66,"../rules/require-newline-before-block-statements":67,"../rules/require-operator-before-line-break":68,"../rules/require-padding-newlines-before-keywords":69,"../rules/require-padding-newlines-in-blocks":70,"../rules/require-padding-newlines-in-objects":71,"../rules/require-parentheses-around-iife":72,"../rules/require-right-sticked-operators":73,"../rules/require-space-after-binary-operators":74,"../rules/require-space-after-keywords":75,"../rules/require-space-after-line-comment":76,"../rules/require-space-after-object-keys":77,"../rules/require-space-after-prefix-unary-operators.js":78,"../rules/require-space-before-binary-operators":79,"../rules/require-space-before-block-statements.js":80,"../rules/require-space-before-keywords":81,"../rules/require-space-before-object-values":82,"../rules/require-space-before-postfix-unary-operators.js":83,"../rules/require-space-between-arguments":84,"../rules/require-spaces-in-anonymous-function-expression":85,"../rules/require-spaces-in-call-expression":86,"../rules/require-spaces-in-conditional-expression":87,"../rules/require-spaces-in-function":90,"../rules/require-spaces-in-function-declaration":88,"../rules/require-spaces-in-function-expression":89,"../rules/require-spaces-in-named-function-expression":91,"../rules/require-spaces-inside-array-brackets":92,"../rules/require-spaces-inside-object-brackets":93,"../rules/require-spaces-inside-parentheses":94,"../rules/require-trailing-comma":95,"../rules/require-yoda-conditions":96,"../rules/safe-context-keyword":97,"../rules/validate-indentation":98,"../rules/validate-jsdoc":99,"../rules/validate-line-breaks":100,"../rules/validate-parameter-separator":101,"../rules/validate-quote-marks":102,"assert":108,"minimatch":129,"path":111}],3:[function(require,module,exports){ +var assert = require('assert'); +var colors = require('colors'); +var TokenAssert = require('./token-assert'); + +/** + * Set of errors for specified file. + * + * @name Errors + * @param {JsFile} file + * @param {Boolean} verbose + */ +var Errors = function(file, verbose) { + this._errorList = []; + this._file = file; + this._currentRule = ''; + this._verbose = verbose || false; + + /** + * @type {TokenAssert} + * @public + */ + this.assert = new TokenAssert(file); + this.assert.on('error', this._addError.bind(this)); +}; + +Errors.prototype = { + /** + * Adds style error to the list + * + * @param {String} message + * @param {Number|Object} line + * @param {Number} [column] optional if line is an object + */ + add: function(message, line, column) { + if (typeof line === 'object') { + column = line.column; + line = line.line; + } + + // line and column numbers should be explicit + assert(typeof line === 'number' && line > 0, + 'Unable to add an error, `line` should be a number greater than 0 but ' + line + ' given'); + assert(typeof column === 'number' && column >= 0, + 'Unable to add an error, `column` should be a positive number but ' + column + ' given'); + + this._addError({ + message: message, + line: line, + column: column + }); + }, + + /** + * Adds error to error list. + * + * @param {Object} errorInfo + * @private + */ + _addError: function(errorInfo) { + if (!this._file.isEnabledRule(this._currentRule, errorInfo.line)) { + return; + } + + this._errorList.push({ + filename: this._file.getFilename(), + rule: this._currentRule, + message: this._verbose ? this._currentRule + ': ' + errorInfo.message : errorInfo.message, + line: errorInfo.line, + column: errorInfo.column + }); + }, + + /** + * Returns style error list. + * + * @returns {Object[]} + */ + getErrorList: function() { + return this._errorList; + }, + + /** + * Returns filename of file this error list is for. + * + * @returns {String} + */ + getFilename: function() { + return this._file.getFilename(); + }, + + /** + * Returns true if no errors are added. + * + * @returns {Boolean} + */ + isEmpty: function() { + return this._errorList.length === 0; + }, + + /** + * Returns amount of errors added by the rules. + * + * @returns {Number} + */ + getErrorCount: function() { + return this._errorList.length; + }, + + /** + * Strips error list to the specified length. + * + * @param {Number} length + */ + stripErrorList: function(length) { + this._errorList.splice(length); + }, + + /** + * Filters out errors based on the supplied filter function + * + * @param {Function} filter + */ + filter: function(filter) { + this._errorList = this._errorList.filter(filter); + }, + + /** + * Formats error for further output. + * + * @param {Object} error + * @param {Boolean} colorize + * @returns {String} + */ + explainError: function(error, colorize) { + var lineNumber = error.line - 1; + var lines = this._file.getLines(); + var result = [ + renderLine(lineNumber, lines[lineNumber], colorize), + renderPointer(error.column, colorize) + ]; + var i = lineNumber - 1; + var linesAround = 2; + while (i >= 0 && i >= (lineNumber - linesAround)) { + result.unshift(renderLine(i, lines[i], colorize)); + i--; + } + i = lineNumber + 1; + while (i < lines.length && i <= (lineNumber + linesAround)) { + result.push(renderLine(i, lines[i], colorize)); + i++; + } + result.unshift(formatErrorMessage(error.message, this.getFilename(), colorize)); + return result.join('\n'); + }, + + /** + * Sets the current rule so that errors are aware + * of which rule triggered them. + * + * @param {String} rule + */ + setCurrentRule: function(rule) { + this._currentRule = rule; + } + +}; + +/** + * Formats error message header. + * + * @param {String} message + * @param {String} filename + * @param {Boolean} colorize + * @returns {String} + */ +function formatErrorMessage(message, filename, colorize) { + return (colorize ? colors.bold(message) : message) + + ' at ' + + (colorize ? colors.green(filename) : filename) + ' :'; +} + +/** + * Simple util for prepending spaces to the string until it fits specified size. + * + * @param {String} s + * @param {Number} len + * @returns {String} + */ +function prependSpaces(s, len) { + while (s.length < len) { + s = ' ' + s; + } + return s; +} + +/** + * Renders single line of code in style error formatted output. + * + * @param {Number} n line number + * @param {String} line + * @param {Boolean} colorize + * @returns {String} + */ +function renderLine(n, line, colorize) { + // Convert tabs to spaces, so errors in code lines with tabs as indention symbol + // could be correctly rendered, plus it will provide less verbose output + line = line.replace(/\t/g, ' '); + + // "n + 1" to print lines in human way (counted from 1) + var lineNumber = prependSpaces((n + 1).toString(), 5) + ' |'; + return ' ' + (colorize ? colors.grey(lineNumber) : lineNumber) + line; +} + +/** + * Renders pointer: + * ---------------^ + * + * @param {Number} column + * @param {Boolean} colorize + * @returns {String} + */ +function renderPointer(column, colorize) { + var res = (new Array(column + 9)).join('-') + '^'; + return colorize ? colors.grey(res) : res; +} + +module.exports = Errors; + +},{"./token-assert":104,"assert":108,"colors":119}],4:[function(require,module,exports){ +var treeIterator = require('./tree-iterator'); + +/** + * Operator list which are represented as keywords in token list. + */ +var KEYWORD_OPERATORS = { + 'instanceof': true, + 'in': true +}; + +/** + * File representation for JSCS. + * + * @name JsFile + */ +var JsFile = function(filename, source, tree) { + this._filename = filename; + this._source = source; + this._tree = tree || {tokens: []}; + this._lines = source.split(/\r\n|\r|\n/); + this._tokenRangeStartIndex = null; + this._tokenRangeEndIndex = null; + var index = this._index = {}; + var _this = this; + + this._buildTokenIndex(); + + this.iterate(function(node, parentNode, parentCollection) { + var type = node.type; + + node.parentNode = parentNode; + node.parentCollection = parentCollection; + (index[type] || (index[type] = [])).push(node); + + // Temporary fix (i hope) for esprima tokenizer + // (https://code.google.com/p/esprima/issues/detail?id=481) + // Fixes #83, #180 + switch (type) { + case 'Property': + convertKeywordToIdentifierIfRequired(node.key); + break; + case 'MemberExpression': + convertKeywordToIdentifierIfRequired(node.property); + break; + } + }); + + this._buildDisabledRuleIndex(); + + // Part of temporary esprima fix. + function convertKeywordToIdentifierIfRequired(node) { + var tokenPos = _this.getTokenPosByRangeStart(node.range[0]); + var token = _this._tree.tokens[tokenPos]; + if (token.type === 'Keyword') { + token.type = 'Identifier'; + } + } +}; + +JsFile.prototype = { + /** + * Builds an index of disabled rules by starting line for error suppression. + */ + _buildDisabledRuleIndex: function() { + this._disabledRuleIndex = []; + + var comments = this.getComments() || []; + var commentRe = /(jscs\s*:\s*(en|dis)able)(.*)/; + + comments.forEach(function(comment) { + var enabled; + var parsed = commentRe.exec(comment.value.trim()); + + if (!parsed || parsed.index !== 0) { + return; + } + + enabled = parsed[2] === 'en'; + this._addToDisabledRuleIndex(enabled, parsed[3], comment.loc.start.line); + }, this); + }, + + /** + * Returns whether a specific rule is disabled on the given line. + * + * @param {String} ruleName the rule name being tested + * @param {Number} line the line number being tested + * @returns {Boolean} true if the rule is enabled + */ + isEnabledRule: function(ruleName, line) { + var enabled = true; + this._disabledRuleIndex.some(function(region) { + // once the comment we're inspecting occurs after the location of the error, + // no longer check for whether the state is enabled or disable + if (region.line > line) { + return true; + } + + if (region.rule === ruleName || region.rule === '*') { + enabled = region.enabled; + } + }, this); + + return enabled; + }, + + /** + * Adds rules to the disabled index given a string containing rules (or '' for all). + * + * @param {Boolean} enabled whether the rule is disabled or enabled on this line + * @param {String} rulesStr the string containing specific rules to en/disable + * @param {Number} line the line the comment appears on + */ + _addToDisabledRuleIndex: function(enabled, rulesStr, line) { + rulesStr = rulesStr || '*'; + + rulesStr.split(',').forEach(function(rule) { + rule = rule.trim(); + + if (!rule) { + return; + } + + this._disabledRuleIndex.push({ + rule: rule, + enabled: enabled, + line: line + }); + }, this); + }, + + /** + * Builds token index by starting pos for futher navigation. + */ + _buildTokenIndex: function() { + var tokens = this._tree.tokens; + var tokenRangeStartIndex = {}; + var tokenRangeEndIndex = {}; + for (var i = 0, l = tokens.length; i < l; i++) { + tokenRangeStartIndex[tokens[i].range[0]] = i; + tokenRangeEndIndex[tokens[i].range[1]] = i; + tokens[i]._tokenIndex = i; + } + this._tokenRangeStartIndex = tokenRangeStartIndex; + this._tokenRangeEndIndex = tokenRangeEndIndex; + }, + /** + * Returns token position using range start from the index. + * + * @returns {Object} + */ + getTokenPosByRangeStart: function(start) { + return this._tokenRangeStartIndex[start]; + }, + /** + * Returns token using range start from the index. + * + * @returns {Object|undefined} + */ + getTokenByRangeStart: function(start) { + var tokenIndex = this._tokenRangeStartIndex[start]; + return tokenIndex === undefined ? undefined : this._tree.tokens[tokenIndex]; + }, + /** + * Returns token using range end from the index. + * + * @returns {Object|undefined} + */ + getTokenByRangeEnd: function(end) { + var tokenIndex = this._tokenRangeEndIndex[end]; + return tokenIndex === undefined ? undefined : this._tree.tokens[tokenIndex]; + }, + /** + * Returns the first token for the node from the AST. + * + * @param {Object} node + * @returns {Object} + */ + getFirstNodeToken: function(node) { + return this.getTokenByRangeStart(node.range[0]); + }, + /** + * Returns the last token for the node from the AST. + * + * @param {Object} node + * @returns {Object} + */ + getLastNodeToken: function(node) { + return this.getTokenByRangeEnd(node.range[1]); + }, + /** + * Returns the first token before the given. + * + * @param {Object} token + * @returns {Object|undefined} + */ + getPrevToken: function(token) { + var index = token._tokenIndex - 1; + return index >= 0 ? this._tree.tokens[index] : undefined; + }, + /** + * Returns the first token after the given. + * + * @param {Object} token + * @returns {Object|undefined} + */ + getNextToken: function(token) { + var index = token._tokenIndex + 1; + return index < this._tree.tokens.length ? this._tree.tokens[index] : undefined; + }, + /** + * Returns the first token before the given which matches type (and value). + * + * @param {Object} token + * @param {String} type + * @param {String} [value] + * @returns {Object|undefined} + */ + findPrevToken: function(token, type, value) { + var prevToken = this.getPrevToken(token); + while (prevToken) { + if (prevToken.type === type && (value === undefined || prevToken.value === value)) { + return prevToken; + } + prevToken = this.getPrevToken(prevToken); + } + return prevToken; + }, + /** + * Returns the first token after the given which matches type (and value). + * + * @param {Object} token + * @param {String} type + * @param {String} [value] + * @returns {Object|undefined} + */ + findNextToken: function(token, type, value) { + var nextToken = this.getNextToken(token); + while (nextToken) { + if (nextToken.type === type && (value === undefined || nextToken.value === value)) { + return nextToken; + } + nextToken = this.getNextToken(nextToken); + } + return nextToken; + }, + /** + * Returns the first token before the given which matches type (and value). + * + * @param {Object} token + * @param {String} value + * @returns {Object|undefined} + */ + findPrevOperatorToken: function(token, value) { + return this.findPrevToken(token, value in KEYWORD_OPERATORS ? 'Keyword' : 'Punctuator', value); + }, + /** + * Returns the first token after the given which matches type (and value). + * + * @param {Object} token + * @param {String} value + * @returns {Object|undefined} + */ + findNextOperatorToken: function(token, value) { + return this.findNextToken(token, value in KEYWORD_OPERATORS ? 'Keyword' : 'Punctuator', value); + }, + /** + * Iterates through the token tree using tree iterator. + * Calls passed function for every token. + * + * @param {Function} cb + * @param {Object} [tree] + */ + iterate: function(cb, tree) { + return treeIterator.iterate(tree || this._tree, cb); + }, + /** + * Returns node by its range position + * + * @returns {Object} + */ + getNodeByRange: function(number) { + var result = {}; + this.iterate(function(node) { + if (number > node.range[0] && number < node.range[1]) { + result = node; + } + if (number < node.range[0]) { + return false; + } + }); + return result; + }, + /** + * Returns nodes by type(s) from earlier built index. + * + * @param {String|String[]} type + * @returns {Object[]} + */ + getNodesByType: function(type) { + if (typeof type === 'string') { + return this._index[type] || []; + } else { + var result = []; + for (var i = 0, l = type.length; i < l; i++) { + var nodes = this._index[type[i]]; + if (nodes) { + result = result.concat(nodes); + } + } + return result; + } + }, + /** + * Iterates nodes by type(s) from earlier built index. + * Calls passed function for every matched node. + * + * @param {String|String[]} type + * @param {Function} cb + */ + iterateNodesByType: function(type, cb) { + return this.getNodesByType(type).forEach(cb); + }, + /** + * Iterates tokens by type(s) from the token array. + * Calls passed function for every matched token. + * + * @param {String|String[]} type + * @param {Function} cb + */ + iterateTokensByType: function(type, cb) { + var types = (typeof type === 'string') ? [type] : type; + var typeIndex = {}; + types.forEach(function(type) { + typeIndex[type] = true; + }); + + this.getTokens().forEach(function(token, index, tokens) { + if (typeIndex[token.type]) { + cb(token, index, tokens); + } + }); + }, + /** + * Iterates token by value from the token array. + * Calls passed function for every matched token. + * + * @param {String|String[]} name + * @param {Function} cb + */ + iterateTokenByValue: function(name, cb) { + var names = (typeof name === 'string') ? [name] : name; + var nameIndex = {}; + names.forEach(function(type) { + nameIndex[type] = true; + }); + + this.getTokens().forEach(function(token, index, tokens) { + if (nameIndex.hasOwnProperty(token.value)) { + cb(token, index, tokens); + } + }); + }, + /** + * Returns string representing contents of the file. + * + * @returns {String} + */ + getSource: function() { + return this._source; + }, + /** + * Returns token tree, built using esprima. + * + * @returns {Object} + */ + getTree: function() { + return this._tree; + }, + /** + * Returns token list, built using esprima. + * + * @returns {Object[]} + */ + getTokens: function() { + return this._tree.tokens; + }, + /** + * Returns comment token list, built using esprima. + */ + getComments: function() { + return this._tree.comments; + }, + /** + * Returns source filename for this object representation. + * + * @returns {String} + */ + getFilename: function() { + return this._filename; + }, + /** + * Returns array of source lines for the file. + * + * @returns {String[]} + */ + getLines: function() { + return this._lines; + } +}; + +module.exports = JsFile; + +},{"./tree-iterator":106}],5:[function(require,module,exports){ +var assert = require('assert'); + +module.exports = function() {}; + +module.exports.prototype = { + configure: function(disallowAnonymousFunctions) { + assert( + disallowAnonymousFunctions === true, + 'disallowAnonymousFunctions option requires true value or should be removed' + ); + }, + + getOptionName: function() { + return 'disallowAnonymousFunctions'; + }, + + check: function(file, errors) { + file.iterateNodesByType(['FunctionExpression', 'FunctionDeclaration'], function(node) { + if (node.id === null) { + errors.add('Anonymous functions needs to be named', node.loc.start); + } + }); + } +}; + +},{"assert":108}],6:[function(require,module,exports){ +var assert = require('assert'); +var regenerate = require('regenerate'); +var Lu = require('unicode-6.3.0/categories/Lu/code-points'); +var Ll = require('unicode-6.3.0/categories/Ll/code-points'); +var Lt = require('unicode-6.3.0/categories/Lt/code-points'); +var Lm = require('unicode-6.3.0/categories/Lm/code-points'); +var Lo = require('unicode-6.3.0/categories/Lo/code-points'); + +var letterPattern = regenerate(Lu, Ll, Lt, Lm, Lo).toRegExp(); +var lowerCasePattern = regenerate(Ll).toRegExp(); + +module.exports = function() {}; + +module.exports.prototype = { + configure: function(disallowCapitalizedComments) { + assert( + disallowCapitalizedComments === true, + 'disallowCapitalizedComments option requires a value of true or should be removed' + ); + }, + + getOptionName: function() { + return 'disallowCapitalizedComments'; + }, + + check: function(file, errors) { + file.getComments().forEach(function(comment) { + var stripped = comment.value.replace(/[\n\s\*]/g, ''); + var firstChar = stripped[0]; + + if (letterPattern.test(firstChar) && !lowerCasePattern.test(firstChar)) { + errors.add( + 'Comments must start with a lowercase letter', + comment.loc.start + ); + } + }); + } +}; + +},{"assert":108,"regenerate":133,"unicode-6.3.0/categories/Ll/code-points":134,"unicode-6.3.0/categories/Lm/code-points":135,"unicode-6.3.0/categories/Lo/code-points":136,"unicode-6.3.0/categories/Lt/code-points":137,"unicode-6.3.0/categories/Lu/code-points":138}],7:[function(require,module,exports){ +var assert = require('assert'); + +module.exports = function() {}; + +module.exports.prototype = { + + configure: function(disallowCommaBeforeLineBreak) { + assert( + typeof disallowCommaBeforeLineBreak === 'boolean', + 'disallowCommaBeforeLineBreak option requires boolean value' + ); + assert( + disallowCommaBeforeLineBreak === true, + 'disallowCommaBeforeLineBreak option requires true value or should be removed' + ); + }, + + getOptionName: function() { + return 'disallowCommaBeforeLineBreak'; + }, + + check: function(file, errors) { + file.iterateTokensByType('Punctuator', function(token) { + if (token.value === ',') { + errors.assert.sameLine({ + token: token, + nextToken: file.getNextToken(token), + message: 'Commas should be placed on new line' + }); + } + }); + } + +}; + +},{"assert":108}],8:[function(require,module,exports){ +var assert = require('assert'); + +module.exports = function() {}; + +module.exports.prototype = { + + configure: function(identifiers) { + assert( + identifiers === true || + typeof identifiers === 'object', + this.getOptionName() + ' option requires the value `true` ' + + 'or an object with String[] `allExcept` property' + ); + + // verify first item in `allExcept` property in object (if it's an object) + assert( + typeof identifiers !== 'object' || + Array.isArray(identifiers.allExcept) && + typeof identifiers.allExcept[0] === 'string', + 'Property `allExcept` in requireSpaceAfterLineComment should be an array of strings' + ); + + var isTrue = identifiers === true; + var defaultIdentifiers = [ + '__proto__', + '_', + '__dirname', + '__filename', + 'super_' + ]; + + if (isTrue) { + identifiers = defaultIdentifiers; + } else { + identifiers = (identifiers.allExcept).concat(defaultIdentifiers); + } + + this._identifierIndex = {}; + for (var i = 0, l = identifiers.length; i < l; i++) { + this._identifierIndex[identifiers[i]] = true; + } + }, + + getOptionName: function() { + return 'disallowDanglingUnderscores'; + }, + + check: function(file, errors) { + var allowedIdentifiers = this._identifierIndex; + + file.iterateTokensByType('Identifier', function(token) { + var value = token.value; + if ((value[0] === '_' || value.slice(-1) === '_') && + !allowedIdentifiers[value] + ) { + errors.add( + 'Invalid dangling underscore found', + token.loc.start.line, + token.loc.start.column + ); + } + }); + } + +}; + +},{"assert":108}],9:[function(require,module,exports){ +var assert = require('assert'); + +module.exports = function() {}; + +module.exports.prototype = { + + configure: function(disallowEmptyBlocks) { + assert( + typeof disallowEmptyBlocks === 'boolean', + 'disallowEmptyBlocks option requires boolean value' + ); + assert( + disallowEmptyBlocks === true, + 'disallowEmptyBlocks option requires true value or should be removed' + ); + }, + + getOptionName: function() { + return 'disallowEmptyBlocks'; + }, + + check: function(file, errors) { + file.iterateNodesByType('BlockStatement', function(node) { + if (node.body.length === 0 && + node.parentNode.type !== 'CatchClause' && + node.parentNode.type !== 'FunctionDeclaration' && + node.parentNode.type !== 'FunctionExpression') { + errors.add('Empty block found', node.loc.end); + } + }); + } + +}; + +},{"assert":108}],10:[function(require,module,exports){ +var assert = require('assert'); + +module.exports = function() {}; + +module.exports.prototype = { + configure: function(disallowFunctionDeclarations) { + assert( + disallowFunctionDeclarations === true, + 'disallowFunctionDeclarations option requires true value or should be removed' + ); + }, + + getOptionName: function() { + return 'disallowFunctionDeclarations'; + }, + + check: function(file, errors) { + file.iterateNodesByType('FunctionDeclaration', function(node) { + errors.add('Illegal function declaration', node.loc.start); + }); + } +}; + +},{"assert":108}],11:[function(require,module,exports){ +var assert = require('assert'); + +module.exports = function() {}; + +module.exports.prototype = { + + configure: function(types) { + assert(Array.isArray(types), 'disallowImplicitTypeConversion option requires array value'); + this._typeIndex = {}; + for (var i = 0, l = types.length; i < l; i++) { + this._typeIndex[types[i]] = true; + } + }, + + getOptionName: function() { + return 'disallowImplicitTypeConversion'; + }, + + check: function(file, errors) { + var types = this._typeIndex; + if (types.numeric || types.boolean || types.binary) { + file.iterateNodesByType('UnaryExpression', function(node) { + if (types.numeric && node.operator === '+') { + errors.add('Implicit numeric conversion', node.loc.start); + } + if (types.binary && node.operator === '~') { + errors.add('Implicit binary conversion', node.loc.start); + } + if (types.boolean && + node.operator === '!' && + node.argument.type === 'UnaryExpression' && + node.argument.operator === '!' + ) { + errors.add('Implicit boolean conversion', node.loc.start); + } + }); + } + if (types.string) { + file.iterateNodesByType('BinaryExpression', function(node) { + if (node.operator === '+' && ( + (node.left.type === 'Literal' && node.left.value === '') || + (node.right.type === 'Literal' && node.right.value === '') + ) + ) { + errors.add('Implicit string conversion', node.loc.start); + } + }); + } + } + +}; + +},{"assert":108}],12:[function(require,module,exports){ +var assert = require('assert'); + +module.exports = function() {}; + +module.exports.prototype = { + + configure: function(keywords) { + assert(Array.isArray(keywords), 'disallowKeywordsOnNewLine option requires array value'); + this._keywordIndex = {}; + for (var i = 0, l = keywords.length; i < l; i++) { + this._keywordIndex[keywords[i]] = true; + } + }, + + getOptionName: function() { + return 'disallowKeywordsOnNewLine'; + }, + + check: function(file, errors) { + var keywordIndex = this._keywordIndex; + + file.iterateTokensByType('Keyword', function(token, i, tokens) { + if (keywordIndex[token.value]) { + var prevToken = tokens[i - 1]; + if (prevToken && prevToken.loc.end.line !== token.loc.start.line) { + errors.add( + 'Keyword `' + token.value + '` should not be placed on new line', + token.loc.start.line, + token.loc.start.column + ); + } + } + }); + } + +}; + +},{"assert":108}],13:[function(require,module,exports){ +var assert = require('assert'); + +module.exports = function() {}; + +module.exports.prototype = { + + configure: function(keywords) { + assert(Array.isArray(keywords), 'disallowKeywords option requires array value'); + this._keywordIndex = {}; + for (var i = 0, l = keywords.length; i < l; i++) { + this._keywordIndex[keywords[i]] = true; + } + }, + + getOptionName: function() { + return 'disallowKeywords'; + }, + + check: function(file, errors) { + var keywordIndex = this._keywordIndex; + + file.iterateTokensByType('Keyword', function(token) { + if (keywordIndex[token.value]) { + errors.add( + 'Illegal keyword: ' + token.value, + token.loc.start + ); + } + }); + } + +}; + +},{"assert":108}],14:[function(require,module,exports){ +module.exports = function() {}; + +module.exports.prototype = { + + configure: function() {}, + + getOptionName: function() { + return 'disallowLeftStickedOperators'; + }, + + check: function(file, errors) { + errors.add( + 'The disallowLeftStickedOperators rule is no longer supported.' + + '\nPlease use the following rules instead:' + + '\n' + + '\nrequireSpaceBeforeBinaryOperators' + + '\nrequireSpaceBeforePostfixUnaryOperators' + + '\nrequireSpacesInConditionalExpression', + 1, + 0 + ); + } + +}; + +},{}],15:[function(require,module,exports){ +var assert = require('assert'); + +module.exports = function() {}; + +module.exports.prototype = { + + configure: function(disallowMixedSpacesAndTabs) { + assert( + disallowMixedSpacesAndTabs === true || disallowMixedSpacesAndTabs === 'smart', + 'disallowMixedSpacesAndTabs option requires true or "smart" value' + ); + + this._disallowMixedSpacesAndTabs = disallowMixedSpacesAndTabs; + }, + + getOptionName: function() { + return 'disallowMixedSpacesAndTabs'; + }, + + check: function(file, errors) { + var disallowMixedSpacesAndTabs = this._disallowMixedSpacesAndTabs; + + var lines = file.getLines().concat(); + + var test = disallowMixedSpacesAndTabs === true ? + (/ \t|\t [^\*]|\t $/) : + (/ \t/); + + // remove comments from the code + var comments = file.getComments(); + if (comments) { + comments.forEach(function(comment) { + var loc = comment.loc; + var start = loc.start; + var end = loc.end; + var startIndex = start.line - 1; + + if (comment.type === 'Line') { + lines[startIndex] = lines[startIndex].substring(0, start.column); + } else if (start.line !== end.line) { + for (var x = startIndex; x < end.line; x++) { + // remove all multine content to the right of the star + var starPos = lines[x].search(/ \*/); + if (starPos > -1) { + lines[x] = lines[x].substring(0, starPos + 2); + } + } + } + }); + } + + lines.forEach(function(line, i) { + if (line.match(test)) { + errors.add('Mixed spaces and tabs found', i + 1, 0); + } + }); + } + +}; + +},{"assert":108}],16:[function(require,module,exports){ +var assert = require('assert'); + +module.exports = function() {}; + +module.exports.prototype = { + + configure: function(disallowMultipleLineBreaks) { + assert( + typeof disallowMultipleLineBreaks === 'boolean', + 'disallowMultipleLineBreaks option requires boolean value' + ); + assert( + disallowMultipleLineBreaks === true, + 'disallowMultipleLineBreaks option requires true value or should be removed' + ); + }, + + getOptionName: function() { + return 'disallowMultipleLineBreaks'; + }, + + check: function(file, errors) { + var lines = file.getLines(); + for (var i = 1, l = lines.length; i < l; i++) { + var line = lines[i]; + if (line === '' && lines[i - 1] === '') { + while (++i < l && lines[i] === '') {} + errors.add('Multiple line break', i - 1, 0); + } + } + } + +}; + +},{"assert":108}],17:[function(require,module,exports){ +var assert = require('assert'); + +module.exports = function() {}; + +module.exports.prototype = { + + configure: function(disallowMultipleLineStrings) { + assert( + typeof disallowMultipleLineStrings === 'boolean', + 'disallowMultipleLineStrings option requires boolean value' + ); + assert( + disallowMultipleLineStrings === true, + 'disallowMultipleLineStrings option requires true value or should be removed' + ); + }, + + getOptionName: function() { + return 'disallowMultipleLineStrings'; + }, + + check: function(file, errors) { + file.iterateTokensByType('String', function(token) { + if (token.loc.start.line !== token.loc.end.line) { + errors.add( + 'Multiline strings are disallowed.', + token.loc.start.line, + token.loc.start.column + ); + } + }); + } + +}; + +},{"assert":108}],18:[function(require,module,exports){ +var assert = require('assert'); + +module.exports = function() {}; + +module.exports.prototype = { + + configure: function(disallowMultipleVarDecl) { + assert( + disallowMultipleVarDecl === true || + disallowMultipleVarDecl === 'strict' || + disallowMultipleVarDecl === 'exceptUndefined', + 'disallowMultipleVarDecl option requires true, "strict", or "exceptUndefined" value' + ); + + this.strictMode = disallowMultipleVarDecl === 'strict'; + this.exceptUndefined = disallowMultipleVarDecl === 'exceptUndefined'; + }, + + getOptionName: function() { + return 'disallowMultipleVarDecl'; + }, + + check: function(file, errors) { + var inStrictMode = this.strictMode; + var exceptUndefined = this.exceptUndefined; + + file.iterateNodesByType('VariableDeclaration', function(node) { + var hasDefinedVariables = node.declarations.some(function(declaration) { + return !!declaration.init; + }); + + var isForStatement = node.parentNode.type === 'ForStatement'; + + // allow single var declarations + if (node.declarations.length === 1 || + // allow multiple var declarations in for statement unless we're in strict mode + // for (var i = 0, j = myArray.length; i < j; i++) {} + !inStrictMode && isForStatement || + // allow multiple var declarations with all undefined variables in exceptUndefined mode + // var a, b, c + exceptUndefined && !hasDefinedVariables) { + return; + } + + errors.add('Multiple var declaration', node.loc.start); + }); + } + +}; + +},{"assert":108}],19:[function(require,module,exports){ +var assert = require('assert'); + +module.exports = function() {}; + +module.exports.prototype = { + configure: function(disallowNewlineBeforeBlockStatements) { + assert( + typeof disallowNewlineBeforeBlockStatements === 'boolean', + 'disallowNewlineBeforeBlockStatements option requires boolean value' + ); + assert( + disallowNewlineBeforeBlockStatements === true, + 'disallowNewlineBeforeBlockStatements option requires true value or should be removed' + ); + }, + + getOptionName: function() { + return 'disallowNewlineBeforeBlockStatements'; + }, + + check: function(file, errors) { + file.iterateNodesByType('BlockStatement', function(node) { + var tokens = file.getTokens(); + + var openingBracePos = file.getTokenPosByRangeStart(node.range[0]); + var openingBrace = tokens[openingBracePos]; + var prevToken = tokens[openingBracePos - 1]; + + if (openingBrace.loc.start.line !== prevToken.loc.start.line) { + errors.add( + 'Newline before curly brace for block statement is disallowed', + node.loc.start + ); + } + }); + } +}; + +},{"assert":108}],20:[function(require,module,exports){ +var assert = require('assert'); +var defaultOperators = require('../utils').binaryOperators.slice().concat(['.']); + +module.exports = function() {}; + +module.exports.prototype = { + configure: function(operators) { + assert(Array.isArray(operators) || operators === true, + 'disallowOperatorBeforeLineBreak option requires array or true value'); + + if (operators === true) { + operators = defaultOperators; + } + this._operators = operators; + }, + + getOptionName: function() { + return 'disallowOperatorBeforeLineBreak'; + }, + + check: function(file, errors) { + var tokens = file.getTokens(); + var lastToken; + var operators = this._operators; + + tokens.forEach(function(token, i) { + if (lastToken) { + if (lastToken.type === 'Punctuator' && operators.indexOf(lastToken.value) > -1) { + if (lastToken.loc.end.line < token.loc.end.line) { + errors.add( + 'Operator needs to either be on the same line or after a line break.', + token.loc.start + ); + } + } + } + lastToken = token; + }); + } +}; + +},{"../utils":107,"assert":108}],21:[function(require,module,exports){ +var assert = require('assert'); +var defaultKeywords = require('../utils').spacedKeywords; + +module.exports = function() { }; + +module.exports.prototype = { + + configure: function(keywords) { + assert(Array.isArray(keywords) || keywords === true, + 'disallowPaddingNewlinesBeforeKeywords option requires array or true value'); + + if (keywords === true) { + keywords = defaultKeywords; + } + + this._keywordIndex = {}; + for (var i = 0, l = keywords.length; i < l; i++) { + this._keywordIndex[keywords[i]] = true; + } + }, + + getOptionName: function() { + return 'disallowPaddingNewlinesBeforeKeywords'; + }, + + check: function(file, errors) { + var keywordIndex = this._keywordIndex; + + file.iterateTokensByType('Keyword', function(token, i, tokens) { + if (keywordIndex[token.value]) { + var prevToken = tokens[i - 1]; + + if (prevToken && token.loc.start.line - prevToken.loc.end.line > 1) { + errors.add( + 'Keyword `' + token.value + '` should not have an empty line above it', + token.loc.start.line, + token.loc.start.column + ); + } + } + }); + } +}; + +},{"../utils":107,"assert":108}],22:[function(require,module,exports){ +var assert = require('assert'); + +module.exports = function() {}; + +module.exports.prototype = { + + configure: function(disallowPaddingNewlinesInBlocks) { + assert( + disallowPaddingNewlinesInBlocks === true, + 'disallowPaddingNewlinesInBlocks option requires the value true or should be removed' + ); + }, + + getOptionName: function() { + return 'disallowPaddingNewlinesInBlocks'; + }, + + check: function(file, errors) { + var lines = file.getLines(); + var tokens = file.getTokens(); + + file.iterateNodesByType('BlockStatement', function(node) { + var openingBracketPos = file.getTokenPosByRangeStart(node.range[0]); + var openingBracket = tokens[openingBracketPos]; + var startLine = openingBracket.loc.start.line; + + var closingBracketPos = file.getTokenPosByRangeStart(node.range[1] - 1); + var closingBracket = tokens[closingBracketPos]; + var closingLine = closingBracket.loc.start.line; + + if (startLine === closingLine) { + return; + } + + if (lines[startLine] === '') { + errors.add('Expected no padding newline after opening curly brace', openingBracket.loc.end); + } + + if (lines[closingLine - 2] === '') { + errors.add('Expected no padding newline before closing curly brace', closingBracket.loc.start); + } + }); + } + +}; + +},{"assert":108}],23:[function(require,module,exports){ +var assert = require('assert'); + +module.exports = function() {}; + +module.exports.prototype = { + + configure: function(value) { + assert( + typeof value === 'boolean', + 'disallowPaddingNewLinesInObjects option requires boolean value' + ); + assert( + value === true, + 'disallowPaddingNewLinesInObjects option requires true value or should be removed' + ); + }, + + getOptionName: function() { + return 'disallowPaddingNewLinesInObjects'; + }, + + check: function(file, errors) { + file.iterateNodesByType('ObjectExpression', function(node) { + var tokens = file.getTokens(); + var openingBracketPos = file.getTokenPosByRangeStart(node.range[0]); + + var openingBracket = tokens[openingBracketPos]; + var nextToken = tokens[openingBracketPos + 1]; + + if (nextToken.type === 'Punctuator' && nextToken.value === '}') { + return; + } + + if (openingBracket.loc.end.line !== nextToken.loc.start.line) { + errors.add('Illegal newline after opening curly brace', nextToken.loc.start); + } + + var closingBracketPos = file.getTokenPosByRangeStart(node.range[1] - 1); + var closingBracket = tokens[closingBracketPos]; + var prevToken = tokens[closingBracketPos - 1]; + + if (closingBracket.loc.start.line !== prevToken.loc.end.line) { + errors.add('Illegal newline before closing curly brace', closingBracket.loc.start); + } + }); + } + +}; + +},{"assert":108}],24:[function(require,module,exports){ +var assert = require('assert'); +var utils = require('../utils'); + +module.exports = function() {}; + +module.exports.prototype = { + + configure: function(disallowQuotedKeysInObjects) { + assert( + disallowQuotedKeysInObjects === true || disallowQuotedKeysInObjects === 'allButReserved', + this.getOptionName() + ' options should be true or "allButReserved" value' + ); + + this._mode = disallowQuotedKeysInObjects; + }, + + getOptionName: function() { + return 'disallowQuotedKeysInObjects'; + }, + + check: function(file, errors) { + var KEY_NAME_RE = /^(0|[1-9][0-9]*|[a-zA-Z_$]+[\w$]*)$/; // number or identifier + var mode = this._mode; + + file.iterateNodesByType('ObjectExpression', function(node) { + node.properties.forEach(function(prop) { + var key = prop.key; + if (key.type === 'Literal' && + typeof key.value === 'string' && + KEY_NAME_RE.test(key.value) + ) { + if (mode === 'allButReserved' && + (utils.isEs3Keyword(key.value) || utils.isEs3FutureReservedWord(key.value)) + ) { + return; + } + errors.add('Extra quotes for key', prop.loc.start); + } + }); + }); + } + +}; + +},{"../utils":107,"assert":108}],25:[function(require,module,exports){ +module.exports = function() {}; + +module.exports.prototype = { + + configure: function() {}, + + getOptionName: function() { + return 'disallowRightStickedOperators'; + }, + + check: function(file, errors) { + errors.add( + 'The disallowRightStickedOperators rule is no longer supported.' + + '\nPlease use the following rules instead:' + + '\n' + + '\nrequireSpaceAfterBinaryOperators' + + '\nrequireSpaceAfterPrefixUnaryOperators' + + '\nrequireSpacesInConditionalExpression', + 1, + 0 + ); + } + +}; + +},{}],26:[function(require,module,exports){ +var assert = require('assert'); +var tokenHelper = require('../token-helper'); + +module.exports = function() {}; + +module.exports.prototype = { + configure: function(disallowSemicolons) { + assert( + disallowSemicolons === true, + 'disallowSemicolons option requires true value or should be removed' + ); + }, + + getOptionName: function() { + return 'disallowSemicolons'; + }, + + check: function(file, errors) { + file.getTokens() + .filter(function(token) { + return token.type === 'Punctuator' && token.value === ';'; + }) + .forEach(function(token) { + var nextToken = file.getNextToken(token); + if (!nextToken || nextToken.loc.end.line > token.loc.end.line) { + errors.add('semicolons are disallowed at the end of a line.', token.loc.end); + } + }); + } +}; + +},{"../token-helper":105,"assert":108}],27:[function(require,module,exports){ +var assert = require('assert'); +var allOperators = require('../utils').binaryOperators; + +module.exports = function() {}; + +module.exports.prototype = { + configure: function(operators) { + var isTrue = operators === true; + + assert( + Array.isArray(operators) || isTrue, + 'disallowSpaceAfterBinaryOperators option requires array or true value' + ); + + if (isTrue) { + operators = allOperators; + } + + this._operatorIndex = {}; + for (var i = 0, l = operators.length; i < l; i++) { + this._operatorIndex[operators[i]] = true; + } + }, + + getOptionName: function() { + return 'disallowSpaceAfterBinaryOperators'; + }, + + check: function(file, errors) { + var operators = this._operatorIndex; + + // Comma + if (operators[',']) { + file.iterateTokensByType('Punctuator', function(token) { + if (token.value === ',') { + errors.assert.noWhitespaceBetween({ + token: token, + nextToken: file.getNextToken(token), + message: 'Operator , should stick to following expression' + }); + } + }); + } + + // For everything else + file.iterateNodesByType( + ['BinaryExpression', 'AssignmentExpression', 'VariableDeclarator', 'LogicalExpression'], + function(node) { + var operator; + var expression; + + if (node.type === 'VariableDeclarator') { + expression = node.init; + operator = '='; + } else { + operator = node.operator; + expression = node.right; + } + + if (expression === null) { + return; + } + + var operatorToken = file.findPrevOperatorToken( + file.getFirstNodeToken(expression), + operator + ); + + var nextToken = file.getNextToken(operatorToken); + + if (operators[operator]) { + errors.assert.noWhitespaceBetween({ + token: operatorToken, + nextToken: nextToken, + message: 'Operator ' + node.operator + ' should stick to following expression' + }); + } + } + ); + } + +}; + +},{"../utils":107,"assert":108}],28:[function(require,module,exports){ +var assert = require('assert'); +var defaultKeywords = require('../utils').spacedKeywords; + +module.exports = function() {}; + +module.exports.prototype = { + + configure: function(keywords) { + assert( + Array.isArray(keywords) || keywords === true, + 'disallowSpaceAfterKeywords option requires array or true value' + ); + + if (keywords === true) { + keywords = defaultKeywords; + } + + this._keywordIndex = {}; + for (var i = 0, l = keywords.length; i < l; i++) { + this._keywordIndex[keywords[i]] = true; + } + }, + + getOptionName: function() { + return 'disallowSpaceAfterKeywords'; + }, + + check: function(file, errors) { + var keywordIndex = this._keywordIndex; + + file.iterateTokensByType('Keyword', function(token, i, tokens) { + if (keywordIndex[token.value]) { + var nextToken = tokens[i + 1]; + if (nextToken && nextToken.range[0] !== token.range[1]) { + errors.add( + 'Illegal space after `' + token.value + '` keyword', + nextToken.loc.start.line, + nextToken.loc.start.column + ); + } + } + }); + } + +}; + +},{"../utils":107,"assert":108}],29:[function(require,module,exports){ +var assert = require('assert'); + +module.exports = function() {}; + +module.exports.prototype = { + + configure: function(disallowSpaceAfterLineComment) { + assert( + disallowSpaceAfterLineComment === true, + 'disallowSpaceAfterLineComment option requires the value true' + ); + }, + + getOptionName: function() { + return 'disallowSpaceAfterLineComment'; + }, + + check: function(file, errors) { + var comments = file.getComments(); + + comments.forEach(function(comment) { + if (comment.type === 'Line') { + var value = comment.value; + if (value.length > 0 && value[0] === ' ') { + errors.add('Illegal space after line comment', comment.loc.start); + } + } + }); + } +}; + +},{"assert":108}],30:[function(require,module,exports){ +var assert = require('assert'); + +module.exports = function() {}; + +module.exports.prototype = { + + configure: function(disallow) { + assert( + typeof disallow === 'boolean', + this.getOptionName() + ' option requires boolean value' + ); + assert( + disallow === true, + this.getOptionName() + ' option requires true value or should be removed' + ); + }, + + getOptionName: function() { + return 'disallowSpaceAfterObjectKeys'; + }, + + check: function(file, errors) { + var tokens = file.getTokens(); + file.iterateNodesByType('ObjectExpression', function(node) { + node.properties.forEach(function(property) { + var key = property.key; + var keyPos = file.getTokenPosByRangeStart(key.range[0]); + var colon = tokens[keyPos + 1]; + if (colon.range[0] !== key.range[1]) { + errors.add('Illegal space after key', key.loc.end); + } + }); + }); + } + +}; + +},{"assert":108}],31:[function(require,module,exports){ +var assert = require('assert'); +var defaultOperators = require('../utils').unaryOperators; + +module.exports = function() {}; + +module.exports.prototype = { + + configure: function(operators) { + var isTrue = operators === true; + + assert( + Array.isArray(operators) || isTrue, + this.getOptionName() + ' option requires array or true value' + ); + + if (isTrue) { + operators = defaultOperators; + } + + this._operatorIndex = {}; + for (var i = 0, l = operators.length; i < l; i++) { + this._operatorIndex[operators[i]] = true; + } + }, + + getOptionName: function() { + return 'disallowSpaceAfterPrefixUnaryOperators'; + }, + + check: function(file, errors) { + var operatorIndex = this._operatorIndex; + var tokens = file.getTokens(); + + file.iterateNodesByType(['UnaryExpression', 'UpdateExpression'], function(node) { + // Check "node.prefix" for prefix type of (inc|dec)rement + if (node.prefix && operatorIndex[node.operator]) { + var operatorTokenIndex = file.getTokenPosByRangeStart(node.range[0]); + var operatorToken = tokens[operatorTokenIndex]; + var nextToken = tokens[operatorTokenIndex + 1]; + if (operatorToken.range[1] !== nextToken.range[0]) { + errors.add('Operator ' + node.operator + ' should stick to operand', node.loc.start); + } + } + }); + } +}; + +},{"../utils":107,"assert":108}],32:[function(require,module,exports){ +var assert = require('assert'); +var allOperators = require('../utils').binaryOperators; + +module.exports = function() {}; + +module.exports.prototype = { + + configure: function(operators) { + var isTrue = operators === true; + + assert( + Array.isArray(operators) || isTrue, + 'disallowSpaceBeforeBinaryOperators option requires array or true value' + ); + + if (isTrue) { + operators = allOperators; + } + + this._operatorIndex = {}; + for (var i = 0, l = operators.length; i < l; i++) { + this._operatorIndex[operators[i]] = true; + } + }, + + getOptionName: function() { + return 'disallowSpaceBeforeBinaryOperators'; + }, + + check: function(file, errors) { + var operators = this._operatorIndex; + + // Comma + if (operators[',']) { + file.iterateTokensByType('Punctuator', function(token) { + if (token.value === ',') { + errors.assert.noWhitespaceBetween({ + token: file.getPrevToken(token), + nextToken: token, + message: 'Operator , should stick to previous expression' + }); + } + }); + } + + // For everything else + file.iterateNodesByType( + ['BinaryExpression', 'AssignmentExpression', 'VariableDeclarator', 'LogicalExpression'], + function(node) { + var operator; + var expression; + + if (node.type === 'VariableDeclarator') { + expression = node.init; + operator = '='; + } else { + operator = node.operator; + expression = node.right; + } + + if (expression === null) { + return; + } + + var operatorToken = file.findPrevOperatorToken( + file.getFirstNodeToken(expression), + operator + ); + + var prevToken = file.getPrevToken(operatorToken); + + if (operators[operator]) { + errors.assert.noWhitespaceBetween({ + token: prevToken, + nextToken: operatorToken, + message: 'Operator ' + node.operator + ' should stick to previous expression' + }); + } + } + ); + } + +}; + +},{"../utils":107,"assert":108}],33:[function(require,module,exports){ +var assert = require('assert'); + +module.exports = function() {}; + +module.exports.prototype = { + configure: function(disallowSpaceBeforeBlockStatements) { + assert( + typeof disallowSpaceBeforeBlockStatements === 'boolean', + 'disallowSpaceBeforeBlockStatements option requires boolean value' + ); + assert( + disallowSpaceBeforeBlockStatements === true, + 'disallowSpaceBeforeBlockStatements option requires true value or should be removed' + ); + }, + + getOptionName: function() { + return 'disallowSpaceBeforeBlockStatements'; + }, + + check: function(file, errors) { + var tokens = file.getTokens(); + + file.iterateNodesByType('BlockStatement', function(node) { + var tokenBeforeBodyPos = file.getTokenPosByRangeStart(node.range[0] - 1); + var tokenBeforeBody = tokens[tokenBeforeBodyPos]; + if (!tokenBeforeBody) { + errors.add( + 'Extra space before opening curly brace for block expressions', + node.loc.start + ); + } + }); + } + +}; + +},{"assert":108}],34:[function(require,module,exports){ +var assert = require('assert'); +var util = require('util'); +var texts = [ + 'Illegal space before "%s" keyword', + 'Should be zero spaces instead of %d, before "%s" keyword' +]; + +var defaultKeywords = require('../utils').spacedKeywords; + +module.exports = function() {}; + +module.exports.prototype = { + + configure: function(keywords) { + assert( + Array.isArray(keywords) || keywords === true, + 'disallowSpaceBeforeKeywords option requires array or true value'); + + if (keywords === true) { + keywords = defaultKeywords; + } + + this._keywordIndex = {}; + for (var i = 0, l = keywords.length; i < l; i++) { + this._keywordIndex[keywords[i]] = true; + } + }, + + getOptionName: function() { + return 'disallowSpaceBeforeKeywords'; + }, + + check: function(file, errors) { + var keywordIndex = this._keywordIndex; + + function getCommentIfExists(start, end) { + return file.getComments().filter(function(comment) { + return start <= comment.range[0] && end >= comment.range[1]; + })[0]; + } + + file.iterateTokensByType(['Keyword'], function(token, i, tokens) { + if (keywordIndex[token.value]) { + var prevToken = tokens[i - 1]; + if (!prevToken) { + return; + } + + var comment = getCommentIfExists(prevToken.range[1], token.range[0]); + prevToken = comment || prevToken; + + var diff = token.range[0] - prevToken.range[1]; + + if (prevToken.loc.end.line === token.loc.start.line && diff !== 0) { + if (prevToken.type !== 'Punctuator' || prevToken.value !== ';') { + errors.add( + util.format.apply(null, + diff === 1 ? + [texts[0], token.value] : + [texts[1], diff, token.value] + ), + token.loc.start.line, + token.loc.start.column + ); + } + } + } + }); + } + +}; + +},{"../utils":107,"assert":108,"util":114}],35:[function(require,module,exports){ +var assert = require('assert'); +var tokenHelper = require('../token-helper'); + +module.exports = function() {}; + +module.exports.prototype = { + + configure: function(disallow) { + assert( + typeof disallow === 'boolean', + this.getOptionName() + ' option requires boolean value' + ); + assert( + disallow === true, + this.getOptionName() + ' option requires true value or should be removed' + ); + }, + + getOptionName: function() { + return 'disallowSpaceBeforeObjectValues'; + }, + + check: function(file, errors) { + file.iterateNodesByType('ObjectExpression', function(node) { + node.properties.forEach(function(property) { + var keyToken = file.getTokenByRangeStart(property.key.range[0]); + var valueToken = file.getTokenByRangeStart(property.value.range[0]); + var colon = file.findNextToken(keyToken, 'Punctuator', ':'); + var tokenBeforeValue = file.getPrevToken(valueToken); + + var tokenToTest; + if (tokenHelper.isTokenParenthesis(file, tokenBeforeValue.range[0], true)) { + // skip '(' if value is parenthesised + tokenToTest = tokenBeforeValue; + } else { + tokenToTest = valueToken; + } + + if (colon.range[1] !== tokenToTest.range[0]) { + errors.add('Illegal space after key colon', colon.loc.end); + } + }); + }); + } + +}; + +},{"../token-helper":105,"assert":108}],36:[function(require,module,exports){ +var assert = require('assert'); +var defaultOperators = require('../utils').incrementAndDecrementOperators; + +module.exports = function() {}; + +module.exports.prototype = { + + configure: function(operators) { + var isTrue = operators === true; + + assert( + Array.isArray(operators) || isTrue, + this.getOptionName() + ' option requires array or true value' + ); + + if (isTrue) { + operators = defaultOperators; + } + + this._operatorIndex = {}; + for (var i = 0, l = operators.length; i < l; i++) { + this._operatorIndex[operators[i]] = true; + } + }, + + getOptionName: function() { + return 'disallowSpaceBeforePostfixUnaryOperators'; + }, + + check: function(file, errors) { + var operatorIndex = this._operatorIndex; + var tokens = file.getTokens(); + + // 'UpdateExpression' involve only ++ and -- operators + file.iterateNodesByType('UpdateExpression', function(node) { + // "!node.prefix" means postfix type of (inc|dec)rement + if (!node.prefix && operatorIndex[node.operator]) { + var operatorStartPos = node.range[1] - node.operator.length; + var operatorTokenIndex = file.getTokenPosByRangeStart(operatorStartPos); + var operatorToken = tokens[operatorTokenIndex]; + var prevToken = tokens[operatorTokenIndex - 1]; + if (operatorToken.range[0] !== prevToken.range[1]) { + errors.add('Operator ' + node.operator + ' should stick to operand', node.loc.start); + } + } + }); + } +}; + +},{"../utils":107,"assert":108}],37:[function(require,module,exports){ +var assert = require('assert'); + +module.exports = function() {}; + +module.exports.prototype = { + + configure: function(disallowSpaceBetweenArguments) { + assert( + typeof disallowSpaceBetweenArguments === 'boolean', + this.getOptionName() + ' option requires boolean value' + ); + assert( + disallowSpaceBetweenArguments === true, + this.getOptionName() + ' option requires true value or should be removed' + ); + }, + + getOptionName: function() { + return 'disallowSpaceBetweenArguments'; + }, + + check: function(file, errors) { + + var tokens = file.getTokens(); + + file.iterateNodesByType(['CallExpression'], function(node) { + + node.arguments.forEach(function(param, i) { + + var paramTokenPos = file.getTokenPosByRangeStart(param.range[0]); + var punctuatorToken = tokens[paramTokenPos + 1]; + var argumentIndex = i + 1; + + if (punctuatorToken.value === ',') { + + var nextParamToken = tokens[paramTokenPos + 2]; + + if (punctuatorToken.range[1] < nextParamToken.range[0] && + param.loc.start.line === nextParamToken.loc.start.line) { + + errors.add( + 'Unexpected space before argument ' + argumentIndex, + nextParamToken.loc.start + ); + } + } + }); + }); + } + +}; + +},{"assert":108}],38:[function(require,module,exports){ +var assert = require('assert'); + +module.exports = function() {}; + +module.exports.prototype = { + configure: function(options) { + assert( + typeof options === 'object', + 'disallowSpacesInAnonymousFunctionExpression option must be the object' + ); + + if ('beforeOpeningRoundBrace' in options) { + assert( + options.beforeOpeningRoundBrace === true, + 'disallowSpacesInAnonymousFunctionExpression.beforeOpeningRoundBrace ' + + 'property requires true value or should be removed' + ); + } + + if ('beforeOpeningCurlyBrace' in options) { + assert( + options.beforeOpeningCurlyBrace === true, + 'disallowSpacesInAnonymousFunctionExpression.beforeOpeningCurlyBrace ' + + 'property requires true value or should be removed' + ); + } + + assert( + options.beforeOpeningCurlyBrace || options.beforeOpeningRoundBrace, + 'disallowSpacesInAnonymousFunctionExpression must have beforeOpeningCurlyBrace ' + + ' or beforeOpeningRoundBrace property' + ); + + this._beforeOpeningRoundBrace = Boolean(options.beforeOpeningRoundBrace); + this._beforeOpeningCurlyBrace = Boolean(options.beforeOpeningCurlyBrace); + }, + + getOptionName: function() { + return 'disallowSpacesInAnonymousFunctionExpression'; + }, + + check: function(file, errors) { + var beforeOpeningRoundBrace = this._beforeOpeningRoundBrace; + var beforeOpeningCurlyBrace = this._beforeOpeningCurlyBrace; + var tokens = file.getTokens(); + + file.iterateNodesByType(['FunctionExpression'], function(node) { + var parent = node.parentNode; + + // Ignore syntactic sugar for getters and setters. + if (parent.type === 'Property' && (parent.kind === 'get' || parent.kind === 'set')) { + return; + } + + // anonymous function expressions only + if (!node.id) { + + if (beforeOpeningRoundBrace) { + var nodeBeforeRoundBrace = node; + + var functionTokenPos = file.getTokenPosByRangeStart(nodeBeforeRoundBrace.range[0]); + var functionToken = tokens[functionTokenPos]; + + var nextTokenPos = file.getTokenPosByRangeStart(functionToken.range[1]); + var nextToken = tokens[nextTokenPos]; + + if (!nextToken) { + errors.add( + 'Illegal space before opening round brace', + functionToken.loc.end + ); + } + } + + if (beforeOpeningCurlyBrace) { + var tokenBeforeBodyPos = file.getTokenPosByRangeStart(node.body.range[0] - 1); + var tokenBeforeBody = tokens[tokenBeforeBodyPos]; + + if (!tokenBeforeBody) { + errors.add( + 'Illegal space before opening curly brace', + node.body.loc.start + ); + } + } + } + }); + } + +}; + +},{"assert":108}],39:[function(require,module,exports){ +var assert = require('assert'); + +module.exports = function() {}; + +module.exports.prototype = { + configure: function(requireSpacesInCallExpression) { + assert( + requireSpacesInCallExpression === true, + 'disallowSpacesInCallExpression option requires true value or should be removed' + ); + }, + + getOptionName: function() { + return 'disallowSpacesInCallExpression'; + }, + + check: function(file, errors) { + var tokens = file.getTokens(); + + file.iterateNodesByType('CallExpression', function(node) { + var nodeBeforeRoundBrace = node; + if (node.callee) { + nodeBeforeRoundBrace = node.callee; + } + + var roundBraceToken = file.getTokenByRangeStart(nodeBeforeRoundBrace.range[0]); + do { + roundBraceToken = file.findNextToken(roundBraceToken, 'Punctuator', '('); + } while (roundBraceToken.range[0] < nodeBeforeRoundBrace.range[1]); + + var functionEndToken = file.getPrevToken(roundBraceToken); + + if (roundBraceToken.value === '(' && functionEndToken.range[1] !== roundBraceToken.range[0]) { + errors.add( + 'Illegal space before opening round brace', + roundBraceToken.loc.start + ); + } + }); + } +}; + +},{"assert":108}],40:[function(require,module,exports){ +var assert = require('assert'); + +module.exports = function() {}; + +module.exports.prototype = { + configure: function(options) { + var validProperties = [ + 'afterTest', + 'beforeConsequent', + 'afterConsequent', + 'beforeAlternate' + ]; + var optionName = this.getOptionName(); + + if (options === true) { + options = { + 'afterTest': true, + 'beforeConsequent': true, + 'afterConsequent': true, + 'beforeAlternate': true + }; + } + + assert( + typeof options === 'object', + optionName + ' option must be an object or boolean true' + ); + + var isProperlyConfigured = validProperties.some(function(key) { + var isPresent = key in options; + + if (isPresent) { + assert( + options[key] === true, + optionName + '.' + key + ' property requires true value or should be removed' + ); + } + + return isPresent; + }); + + assert( + isProperlyConfigured, + optionName + ' must have at least 1 of the following properties: ' + validProperties.join(', ') + ); + + validProperties.forEach(function(property) { + this['_' + property] = Boolean(options[property]); + }.bind(this)); + }, + + getOptionName: function() { + return 'disallowSpacesInConditionalExpression'; + }, + + check: function(file, errors) { + var tokens = file.getTokens(); + + file.iterateNodesByType(['ConditionalExpression'], function(node) { + + var test = node.test; + var testTokenPos = file.getTokenPosByRangeStart(test.range[0]); + var consequent = node.consequent; + var consequentTokenPos = file.getTokenPosByRangeStart(consequent.range[0]); + var alternate = node.alternate; + var questionMarkToken = tokens[testTokenPos + 1]; + var colonToken = tokens[consequentTokenPos + 1]; + var questionMark; + var colon; + + if (this._afterTest && test.loc.end.line === questionMarkToken.loc.start.line) { + questionMark = tokens[file.getTokenPosByRangeStart(test.range[1])]; + if (!questionMark || questionMark.value !== '?') { + errors.add( + 'Illegal space after test', + test.loc.end + ); + } + } + + if (this._beforeConsequent && consequent.loc.end.line === questionMarkToken.loc.start.line) { + questionMark = tokens[file.getTokenPosByRangeStart(consequent.range[0] - 1)]; + if (!questionMark || questionMark.value !== '?') { + errors.add( + 'Illegal space before consequent', + consequent.loc.start + ); + } + } + + if (this._afterConsequent && consequent.loc.end.line === colonToken.loc.start.line) { + colon = tokens[file.getTokenPosByRangeStart(consequent.range[1])]; + if (!colon || colon.value !== ':') { + errors.add( + 'Illegal space after consequent', + consequent.loc.end + ); + } + } + + if (this._beforeAlternate && alternate.loc.end.line === colonToken.loc.start.line) { + colon = tokens[file.getTokenPosByRangeStart(alternate.range[0] - 1)]; + if (!colon || colon.value !== ':') { + errors.add( + 'Illegal space before alternate', + alternate.loc.start + ); + } + } + }.bind(this)); + } + +}; + +},{"assert":108}],41:[function(require,module,exports){ +var assert = require('assert'); + +module.exports = function() {}; + +module.exports.prototype = { + configure: function(options) { + assert( + typeof options === 'object', + 'disallowSpacesInFunctionDeclaration option must be the object' + ); + + if ('beforeOpeningRoundBrace' in options) { + assert( + options.beforeOpeningRoundBrace === true, + 'disallowSpacesInFunctionDeclaration.beforeOpeningRoundBrace ' + + 'property requires true value or should be removed' + ); + } + + if ('beforeOpeningCurlyBrace' in options) { + assert( + options.beforeOpeningCurlyBrace === true, + 'disallowSpacesInFunctionDeclaration.beforeOpeningCurlyBrace ' + + 'property requires true value or should be removed' + ); + } + + assert( + options.beforeOpeningCurlyBrace || options.beforeOpeningRoundBrace, + 'disallowSpacesInFunctionDeclaration must have beforeOpeningCurlyBrace or beforeOpeningRoundBrace property' + ); + + this._beforeOpeningRoundBrace = Boolean(options.beforeOpeningRoundBrace); + this._beforeOpeningCurlyBrace = Boolean(options.beforeOpeningCurlyBrace); + }, + + getOptionName: function() { + return 'disallowSpacesInFunctionDeclaration'; + }, + + check: function(file, errors) { + var beforeOpeningRoundBrace = this._beforeOpeningRoundBrace; + var beforeOpeningCurlyBrace = this._beforeOpeningCurlyBrace; + var tokens = file.getTokens(); + + file.iterateNodesByType(['FunctionDeclaration'], function(node) { + + if (beforeOpeningRoundBrace) { + var nodeBeforeRoundBrace = node; + // named function + if (node.id) { + nodeBeforeRoundBrace = node.id; + } + + var functionTokenPos = file.getTokenPosByRangeStart(nodeBeforeRoundBrace.range[0]); + var functionToken = tokens[functionTokenPos]; + + var nextTokenPos = file.getTokenPosByRangeStart(functionToken.range[1]); + var nextToken = tokens[nextTokenPos]; + + if (!nextToken) { + errors.add( + 'Illegal space before opening round brace', + functionToken.loc.start + ); + } + } + + if (beforeOpeningCurlyBrace) { + var tokenBeforeBodyPos = file.getTokenPosByRangeStart(node.body.range[0] - 1); + var tokenBeforeBody = tokens[tokenBeforeBodyPos]; + + if (!tokenBeforeBody) { + errors.add( + 'Illegal space before opening curly brace', + node.body.loc.start + ); + } + } + }); + } + +}; + +},{"assert":108}],42:[function(require,module,exports){ +var assert = require('assert'); + +module.exports = function() {}; + +module.exports.prototype = { + configure: function(options) { + assert( + typeof options === 'object', + 'disallowSpacesInFunctionExpression option must be the object' + ); + + if ('beforeOpeningRoundBrace' in options) { + assert( + options.beforeOpeningRoundBrace === true, + 'disallowSpacesInFunctionExpression.beforeOpeningRoundBrace ' + + 'property requires true value or should be removed' + ); + } + + if ('beforeOpeningCurlyBrace' in options) { + assert( + options.beforeOpeningCurlyBrace === true, + 'disallowSpacesInFunctionExpression.beforeOpeningCurlyBrace ' + + 'property requires true value or should be removed' + ); + } + + assert( + options.beforeOpeningCurlyBrace || options.beforeOpeningRoundBrace, + 'disallowSpacesInFunctionExpression must have beforeOpeningCurlyBrace or beforeOpeningRoundBrace property' + ); + + this._beforeOpeningRoundBrace = Boolean(options.beforeOpeningRoundBrace); + this._beforeOpeningCurlyBrace = Boolean(options.beforeOpeningCurlyBrace); + }, + + getOptionName: function() { + return 'disallowSpacesInFunctionExpression'; + }, + + check: function(file, errors) { + var beforeOpeningRoundBrace = this._beforeOpeningRoundBrace; + var beforeOpeningCurlyBrace = this._beforeOpeningCurlyBrace; + var tokens = file.getTokens(); + + file.iterateNodesByType('FunctionExpression', function(node) { + var parent = node.parentNode; + + // Ignore syntactic sugar for getters and setters. + if (parent.type === 'Property' && (parent.kind === 'get' || parent.kind === 'set')) { + return; + } + + if (beforeOpeningRoundBrace) { + var nodeBeforeRoundBrace = node; + // named function + if (node.id) { + nodeBeforeRoundBrace = node.id; + } + + var functionTokenPos = file.getTokenPosByRangeStart(nodeBeforeRoundBrace.range[0]); + var functionToken = tokens[functionTokenPos]; + + var nextTokenPos = file.getTokenPosByRangeStart(functionToken.range[1]); + var nextToken = tokens[nextTokenPos]; + + if (!nextToken) { + errors.add( + 'Illegal space before opening round brace', + functionToken.loc.start + ); + } + } + + if (beforeOpeningCurlyBrace) { + var tokenBeforeBodyPos = file.getTokenPosByRangeStart(node.body.range[0] - 1); + var tokenBeforeBody = tokens[tokenBeforeBodyPos]; + + if (!tokenBeforeBody) { + errors.add( + 'Illegal space before opening curly brace', + node.body.loc.start + ); + } + } + }); + } + +}; + +},{"assert":108}],43:[function(require,module,exports){ +var assert = require('assert'); + +module.exports = function() {}; + +module.exports.prototype = { + configure: function(options) { + assert( + typeof options === 'object', + 'disallowSpacesInFunction option must be the object' + ); + + if ('beforeOpeningRoundBrace' in options) { + assert( + options.beforeOpeningRoundBrace === true, + 'disallowSpacesInFunction.beforeOpeningRoundBrace ' + + 'property requires true value or should be removed' + ); + } + + if ('beforeOpeningCurlyBrace' in options) { + assert( + options.beforeOpeningCurlyBrace === true, + 'disallowSpacesInFunction.beforeOpeningCurlyBrace ' + + 'property requires true value or should be removed' + ); + } + + assert( + options.beforeOpeningCurlyBrace || options.beforeOpeningRoundBrace, + 'disallowSpacesInFunction must have beforeOpeningCurlyBrace or beforeOpeningRoundBrace property' + ); + + this._beforeOpeningRoundBrace = Boolean(options.beforeOpeningRoundBrace); + this._beforeOpeningCurlyBrace = Boolean(options.beforeOpeningCurlyBrace); + }, + + getOptionName: function() { + return 'disallowSpacesInFunction'; + }, + + check: function(file, errors) { + var beforeOpeningRoundBrace = this._beforeOpeningRoundBrace; + var beforeOpeningCurlyBrace = this._beforeOpeningCurlyBrace; + var tokens = file.getTokens(); + + file.iterateNodesByType(['FunctionDeclaration', 'FunctionExpression'], function(node) { + var parent = node.parentNode; + + // Ignore syntactic sugar for getters and setters. + if (parent.type === 'Property' && (parent.kind === 'get' || parent.kind === 'set')) { + return; + } + + if (beforeOpeningRoundBrace) { + var nodeBeforeRoundBrace = node; + // named function + if (node.id) { + nodeBeforeRoundBrace = node.id; + } + + var functionTokenPos = file.getTokenPosByRangeStart(nodeBeforeRoundBrace.range[0]); + var functionToken = tokens[functionTokenPos]; + + var nextTokenPos = file.getTokenPosByRangeStart(functionToken.range[1]); + var nextToken = tokens[nextTokenPos]; + + if (!nextToken) { + errors.add( + 'Illegal space before opening round brace', + functionToken.loc.start + ); + } + } + + if (beforeOpeningCurlyBrace) { + var tokenBeforeBodyPos = file.getTokenPosByRangeStart(node.body.range[0] - 1); + var tokenBeforeBody = tokens[tokenBeforeBodyPos]; + + if (!tokenBeforeBody) { + errors.add( + 'Illegal space before opening curly brace', + node.body.loc.start + ); + } + } + }); + } + +}; + +},{"assert":108}],44:[function(require,module,exports){ +var assert = require('assert'); + +module.exports = function() {}; + +module.exports.prototype = { + configure: function(options) { + assert( + typeof options === 'object', + 'disallowSpacesInNamedFunctionExpression option must be the object' + ); + + if ('beforeOpeningRoundBrace' in options) { + assert( + options.beforeOpeningRoundBrace === true, + 'disallowSpacesInNamedFunctionExpression.beforeOpeningRoundBrace ' + + 'property requires true value or should be removed' + ); + } + + if ('beforeOpeningCurlyBrace' in options) { + assert( + options.beforeOpeningCurlyBrace === true, + 'disallowSpacesInNamedFunctionExpression.beforeOpeningCurlyBrace ' + + 'property requires true value or should be removed' + ); + } + + assert( + options.beforeOpeningCurlyBrace || options.beforeOpeningRoundBrace, + 'disallowSpacesInNamedFunctionExpression must have beforeOpeningCurlyBrace ' + + 'or beforeOpeningRoundBrace property' + ); + + this._beforeOpeningRoundBrace = Boolean(options.beforeOpeningRoundBrace); + this._beforeOpeningCurlyBrace = Boolean(options.beforeOpeningCurlyBrace); + }, + + getOptionName: function() { + return 'disallowSpacesInNamedFunctionExpression'; + }, + + check: function(file, errors) { + var beforeOpeningRoundBrace = this._beforeOpeningRoundBrace; + var beforeOpeningCurlyBrace = this._beforeOpeningCurlyBrace; + var tokens = file.getTokens(); + + file.iterateNodesByType(['FunctionExpression'], function(node) { + + // named function expressions only + if (node.id) { + + if (beforeOpeningRoundBrace) { + var nodeBeforeRoundBrace = node.id; + + var functionTokenPos = file.getTokenPosByRangeStart(nodeBeforeRoundBrace.range[0]); + var functionToken = tokens[functionTokenPos]; + + var nextTokenPos = file.getTokenPosByRangeStart(functionToken.range[1]); + var nextToken = tokens[nextTokenPos]; + + if (!nextToken) { + errors.add( + 'Illegal space before opening round brace', + functionToken.loc.start + ); + } + } + + if (beforeOpeningCurlyBrace) { + var tokenBeforeBodyPos = file.getTokenPosByRangeStart(node.body.range[0] - 1); + var tokenBeforeBody = tokens[tokenBeforeBodyPos]; + + if (!tokenBeforeBody) { + errors.add( + 'Illegal space before opening curly brace', + node.body.loc.start + ); + } + } + } + }); + } + +}; + +},{"assert":108}],45:[function(require,module,exports){ +var assert = require('assert'); + +module.exports = function() {}; + +module.exports.prototype = { + + configure: function(disallow) { + assert( + disallow === true || disallow === 'all' || disallow === 'nested', + this.getOptionName() + ' option requires "all"(true value) or "nested" string' + ); + + this._mode = disallow === true ? 'all' : disallow; + }, + + getOptionName: function() { + return 'disallowSpacesInsideArrayBrackets'; + }, + + check: function(file, errors) { + var mode = this._mode; + + file.iterateNodesByType(['ArrayExpression'], function(node) { + var tokens = file.getTokens(); + + var openingBracketPos = file.getTokenPosByRangeStart(node.range[0]); + var closingBracketPos = file.getTokenPosByRangeStart(node.range[1] - 1); + + var brackets = { + opening: tokens[openingBracketPos], + closing: tokens[closingBracketPos] + }; + + var insideTokens = { + prev: tokens[closingBracketPos - 1], + next: tokens[openingBracketPos + 1] + }; + + if (mode === 'all') { + check(brackets, errors, insideTokens); + + } else if (node.parentNode.type === 'ArrayExpression') { + check(brackets, errors, insideTokens); + } + }); + } +}; + +function check(brackets, errors, insideTokens) { + if (brackets.opening.loc.start.line === insideTokens.next.loc.start.line && + brackets.opening.range[1] !== insideTokens.next.range[0] + ) { + errors.add('Illegal space after opening square brace', brackets.opening.loc.end); + } + + if (brackets.closing.loc.start.line === insideTokens.prev.loc.start.line && + brackets.closing.range[0] !== insideTokens.prev.range[1] + ) { + errors.add('Illegal space before closing square brace', insideTokens.prev.loc.end); + } +} + +},{"assert":108}],46:[function(require,module,exports){ +var assert = require('assert'); + +module.exports = function() {}; + +module.exports.prototype = { + + configure: function(disallowSpacesInsideObjectBrackets) { + assert( + disallowSpacesInsideObjectBrackets === true || disallowSpacesInsideObjectBrackets === 'all' || + disallowSpacesInsideObjectBrackets === 'nested', + 'disallowSpacesInsideObjectBrackets option requires "all"(true value) or "nested" string' + ); + + this._mode = disallowSpacesInsideObjectBrackets === true ? 'all' : disallowSpacesInsideObjectBrackets; + }, + + getOptionName: function() { + return 'disallowSpacesInsideObjectBrackets'; + }, + + check: function(file, errors) { + var mode = this._mode; + + file.iterateNodesByType('ObjectExpression', function(node) { + var tokens = file.getTokens(); + + var openingBracketPos = file.getTokenPosByRangeStart(node.range[0]); + var closingBracketPos = file.getTokenPosByRangeStart(node.range[1] - 1); + + var brackets = { + opening: tokens[openingBracketPos], + closing: tokens[closingBracketPos] + }; + + var insideTokens = { + prev: tokens[closingBracketPos - 1], + next: tokens[openingBracketPos + 1] + }; + + if (mode === 'all') { + check(brackets, errors, insideTokens); + + } else if (node.parentNode.type === 'Property') { + check(brackets, errors, insideTokens); + } + }); + } +}; + +function check(brackets, errors, insideTokens) { + if (brackets.opening.loc.start.line === insideTokens.next.loc.start.line && + brackets.opening.range[1] !== insideTokens.next.range[0] + ) { + errors.add('Illegal space after opening curly brace', brackets.opening.loc.end); + } + + if (brackets.closing.loc.start.line === insideTokens.prev.loc.start.line && + brackets.closing.range[0] !== insideTokens.prev.range[1] + ) { + errors.add('Illegal space before closing curly brace', insideTokens.prev.loc.end); + } +} + +},{"assert":108}],47:[function(require,module,exports){ +var assert = require('assert'); + +module.exports = function() {}; + +module.exports.prototype = { + + configure: function(option) { + var isObject = typeof option === 'object'; + + var error = 'disallowSpacesInsideParentheses option requires' + + ' true or object value with "all" or "only" properties '; + + if (typeof option === 'boolean') { + assert(option === true, error); + + } else if (isObject) { + assert(!('all' in option && 'only' in option), error); + assert('all' in option || 'only' in option, error); + + } else { + assert(false, error); + } + + if (option.only) { + this._only = {}; + (option.only || []).forEach(function(value) { + this._only[value] = true; + }, this); + } else { + this._only = null; + } + }, + + getOptionName: function() { + return 'disallowSpacesInsideParentheses'; + }, + + check: function(file, errors) { + var only = this._only; + + function isCommentInRange(start, end) { + return file.getComments().some(function(comment) { + return start <= comment.range[0] && end >= comment.range[1]; + }); + } + + file.iterateTokenByValue('(', function(token, index, tokens) { + var nextToken = file.getNextToken(token); + var value = nextToken.value; + var type = nextToken.type; + + if (only && !(value in only)) { + return; + } + + if (token.range[1] !== nextToken.range[0] && + token.loc.end.line === nextToken.loc.start.line && + !isCommentInRange(token.range[1], nextToken.range[0])) { + errors.add('Illegal space after opening round bracket', token.loc.end); + } + }); + + file.iterateTokenByValue(')', function(token, index, tokens) { + var prevToken = file.getPrevToken(token); + var value = prevToken.value; + var type = prevToken.type; + + if (only) { + if (!(value in only)) { + return; + } + + if ( + value === ']' && + file.getNodeByRange(prevToken.range[0]).type === 'MemberExpression' + ) { + return; + } + } + + if (prevToken.range[1] !== token.range[0] && + prevToken.loc.end.line === token.loc.start.line && + !isCommentInRange(prevToken.range[1], token.range[0])) { + errors.add('Illegal space before closing round bracket', prevToken.loc.end); + } + }); + } + +}; + +},{"assert":108}],48:[function(require,module,exports){ +var assert = require('assert'); + +module.exports = function() {}; + +module.exports.prototype = { + configure: function(disallowTrailingComma) { + assert( + typeof disallowTrailingComma === 'boolean', + 'disallowTrailingComma option requires boolean value' + ); + assert( + disallowTrailingComma === true, + 'disallowTrailingComma option requires true value or should be removed' + ); + }, + + getOptionName: function() { + return 'disallowTrailingComma'; + }, + + check: function(file, errors) { + file.iterateNodesByType(['ObjectExpression', 'ArrayExpression'], function(node) { + var closingToken = file.getLastNodeToken(node); + + errors.assert.noTokenBefore({ + token: closingToken, + expectedTokenBefore: {type: 'Punctuator', value: ','}, + message: 'Extra comma following the final element of an array or object literal' + }); + }); + } + +}; + +},{"assert":108}],49:[function(require,module,exports){ +var assert = require('assert'); + +module.exports = function() {}; + +module.exports.prototype = { + + configure: function(disallowTrailingWhitespace) { + assert( + typeof disallowTrailingWhitespace === 'boolean', + 'disallowTrailingWhitespace option requires boolean value' + ); + assert( + disallowTrailingWhitespace === true, + 'disallowTrailingWhitespace option requires true value or should be removed' + ); + }, + + getOptionName: function() { + return 'disallowTrailingWhitespace'; + }, + + check: function(file, errors) { + var lines = file.getLines(); + for (var i = 0, l = lines.length; i < l; i++) { + if (lines[i].match(/\s$/)) { + errors.add('Illegal trailing whitespace', i + 1, lines[i].length); + } + } + } + +}; + +},{"assert":108}],50:[function(require,module,exports){ +var assert = require('assert'); + +module.exports = function() {}; + +module.exports.prototype = { + + configure: function(disallowYodaConditions) { + assert( + typeof disallowYodaConditions === 'boolean', + 'disallowYodaConditions option requires boolean value' + ); + assert( + disallowYodaConditions === true, + 'disallowYodaConditions option requires true value or should be removed' + ); + this._operatorIndex = { + '==': true, + '===': true, + '!=': true, + '!==': true, + '>': true, + '<': true, + '>=': true, + '<=': true + }; + }, + + getOptionName: function() { + return 'disallowYodaConditions'; + }, + + check: function(file, errors) { + var operators = this._operatorIndex; + file.iterateNodesByType('BinaryExpression', function(node) { + if (operators[node.operator]) { + if (node.left.type === 'Literal' || + (node.left.type === 'Identifier' && node.left.name === 'undefined') + ) { + errors.add('Yoda condition', node.left.loc.start); + } + } + }); + } + +}; + +},{"assert":108}],51:[function(require,module,exports){ +var assert = require('assert'); +var commentHelper = require('../comment-helper'); + +module.exports = function() {}; + +module.exports.prototype = { + + configure: function(maximumLineLength) { + this._tabSize = ''; + this._allowRegex = false; + this._allowComments = false; + this._allowUrlComments = false; + + if (typeof maximumLineLength === 'object') { + assert( + typeof maximumLineLength.value === 'number', + 'maximumLineLength option requires the "value" property to be defined' + ); + + this._maximumLineLength = maximumLineLength.value; + var tabSize = maximumLineLength.tabSize || 0; + + while (tabSize--) { + this._tabSize += ' '; + } + + this._allowRegex = (maximumLineLength.allowRegex === true); + this._allowComments = (maximumLineLength.allowComments === true); + this._allowUrlComments = (maximumLineLength.allowUrlComments === true); + } else { + assert( + typeof maximumLineLength === 'number', + 'maximumLineLength option requires number value or options object' + ); + + this._maximumLineLength = maximumLineLength; + } + }, + + getOptionName: function() { + return 'maximumLineLength'; + }, + + check: function(file, errors) { + var maximumLineLength = this._maximumLineLength; + + var line; + var lines = this._allowComments ? + commentHelper.getLinesWithCommentsRemoved(file) : file.getLines(); + + // This check should not be destructive + lines = lines.slice(); + + if (this._allowRegex) { + file.iterateTokensByType('RegularExpression', function(token) { + for (var i = token.loc.start.line; i <= token.loc.end.line; i++) { + lines[i - 1] = ''; + } + }); + } + + if (this._allowUrlComments) { + file.getComments().forEach(function(comment) { + for (var i = comment.loc.start.line; i <= comment.loc.end.line; i++) { + lines[i - 1] = lines[i - 1].replace(/(http|https|ftp):\/\/[^\s$]+/, ''); + } + }); + } + + for (var i = 0, l = lines.length; i < l; i++) { + line = this._tabSize ? lines[i].replace(/\t/g, this._tabSize) : lines[i]; + + if (line.length > maximumLineLength) { + errors.add( + 'Line must be at most ' + maximumLineLength + ' characters', + i + 1, + lines[i].length + ); + } + } + } + +}; + +},{"../comment-helper":1,"assert":108}],52:[function(require,module,exports){ +var assert = require('assert'); + +module.exports = function() {}; + +module.exports.prototype = { + + configure: function(mode) { + var modes = { + 'all': 'all', + 'ignoreFunction': 'ignoreFunction', + 'ignoreLineBreak': 'ignoreLineBreak', + 'skipWithFunction': 'ignoreFunction', + 'skipWithLineBreak': 'ignoreLineBreak' + }; + assert( + typeof mode === 'string' && modes[mode], + this.getOptionName() + ' requires one of the following values: ' + Object.keys(modes).join(', ') + ); + this._mode = modes[mode]; + }, + + getOptionName: function() { + return 'requireAlignedObjectValues'; + }, + + check: function(file, errors) { + var tokens = file.getTokens(); + var mode = this._mode; + file.iterateNodesByType('ObjectExpression', function(node) { + if (node.loc.start.line === node.loc.end.line || node.properties < 2) { + return; + } + + var maxKeyEndPos = 0; + var skip = node.properties.some(function(property, index) { + maxKeyEndPos = Math.max(maxKeyEndPos, property.key.loc.end.column); + + if (mode === 'ignoreFunction' && property.value.type === 'FunctionExpression') { + return true; + } + + if (mode === 'ignoreLineBreak' && index > 0 && + node.properties[index - 1].loc.end.line !== property.loc.start.line - 1) { + return true; + } + }); + + if (skip) { + return; + } + + node.properties.forEach(function(property) { + var keyPos = file.getTokenPosByRangeStart(property.key.range[0]); + var colon = tokens[keyPos + 1]; + if (colon.loc.start.column !== maxKeyEndPos + 1) { + errors.add('Alignment required', colon.loc.start); + } + }); + }); + } + +}; + +},{"assert":108}],53:[function(require,module,exports){ +var assert = require('assert'); + +module.exports = function() {}; + +module.exports.prototype = { + configure: function(requireAnonymousFunctions) { + assert( + requireAnonymousFunctions === true, + 'requireAnonymousFunctions option requires true value or should be removed' + ); + }, + + getOptionName: function() { + return 'requireAnonymousFunctions'; + }, + + check: function(file, errors) { + file.iterateNodesByType(['FunctionExpression', 'FunctionDeclaration'], function(node) { + if (node.id !== null) { + errors.add('Functions must not be named', node.loc.start); + } + }); + } +}; + +},{"assert":108}],54:[function(require,module,exports){ +var assert = require('assert'); + +module.exports = function() {}; + +module.exports.prototype = { + + configure: function(requireBlocksOnNewline) { + assert( + requireBlocksOnNewline === true || typeof requireBlocksOnNewline === 'number', + 'requireBlocksOnNewline option requires the value true or an Integer' + ); + + this._minStatements = requireBlocksOnNewline === true ? 0 : requireBlocksOnNewline; + }, + + getOptionName: function() { + return 'requireBlocksOnNewline'; + }, + + check: function(file, errors) { + var minStatements = this._minStatements; + + file.iterateNodesByType('BlockStatement', function(node) { + if (node.body.length <= minStatements) { + return; + } + var tokens = file.getTokens(); + var openingBracketPos = file.getTokenPosByRangeStart(node.range[0]); + + var openingBracket = tokens[openingBracketPos]; + var nextToken = tokens[openingBracketPos + 1]; + + if (openingBracket.loc.start.line === nextToken.loc.start.line) { + errors.add('Missing newline after opening curly brace', openingBracket.loc.end); + } + + var closingBracketPos = file.getTokenPosByRangeStart(node.range[1] - 1); + var closingBracket = tokens[closingBracketPos]; + var prevToken = tokens[closingBracketPos - 1]; + + if (closingBracket.loc.start.line === prevToken.loc.start.line) { + errors.add('Missing newline before closing curly brace', prevToken.loc.end); + } + }); + } + +}; + +},{"assert":108}],55:[function(require,module,exports){ +var assert = require('assert'); + +module.exports = function() {}; + +module.exports.prototype = { + + configure: function(requireCamelCase) { + assert( + requireCamelCase === true || requireCamelCase === 'ignoreProperties', + 'requireCamelCaseOrUpperCaseIdentifiers option requires true value or `ignoreProperties` string' + ); + + this._ignoreProperties = (requireCamelCase === 'ignoreProperties'); + }, + + getOptionName: function() { + return 'requireCamelCaseOrUpperCaseIdentifiers'; + }, + + check: function(file, errors) { + file.iterateTokensByType('Identifier', function(token, index, tokens) { + var value = token.value; + if (value.replace(/^_+|_+$/g, '').indexOf('_') === -1 || value.toUpperCase() === value) { + return; + } + if (this._ignoreProperties) { + if (index + 1 < tokens.length && tokens[index + 1].value === ':') { + return; + } + if (index > 0 && tokens[index - 1].value === '.') { + return; + } + } + errors.add( + 'All identifiers must be camelCase or UPPER_CASE', + token.loc.start.line, + token.loc.start.column + ); + }.bind(this)); + } + +}; + +},{"assert":108}],56:[function(require,module,exports){ +var assert = require('assert'); +var regenerate = require('regenerate'); +var Lu = require('unicode-6.3.0/categories/Lu/code-points'); +var Ll = require('unicode-6.3.0/categories/Ll/code-points'); +var Lt = require('unicode-6.3.0/categories/Lt/code-points'); +var Lm = require('unicode-6.3.0/categories/Lm/code-points'); +var Lo = require('unicode-6.3.0/categories/Lo/code-points'); + +var letterPattern = regenerate(Lu, Ll, Lt, Lm, Lo).toRegExp(); +var upperCasePattern = regenerate(Lu).toRegExp(); + +module.exports = function() {}; + +module.exports.prototype = { + configure: function(requireCapitalizedComments) { + assert( + requireCapitalizedComments === true, + 'requireCapitalizedComments option requires a value of true or should be removed' + ); + }, + + getOptionName: function() { + return 'requireCapitalizedComments'; + }, + + check: function(file, errors) { + var inTextBlock = null; + + file.getComments().forEach(function(comment) { + var stripped = comment.value.replace(/[\n\s\*]/g, ''); + var firstChar = stripped[0]; + var isLetter = firstChar && letterPattern.test(firstChar); + + if (!isLetter) { + inTextBlock = false; + return; + } + + var isUpperCase = upperCasePattern.test(firstChar); + var isValid = isUpperCase || (inTextBlock && !isUpperCase); + + if (!isValid) { + errors.add( + 'Comments must start with an uppercase letter, unless it is part of a textblock', + comment.loc.start + ); + } + + inTextBlock = !inTextBlock ? isLetter && isUpperCase : isLetter; + }); + } +}; + +},{"assert":108,"regenerate":133,"unicode-6.3.0/categories/Ll/code-points":134,"unicode-6.3.0/categories/Lm/code-points":135,"unicode-6.3.0/categories/Lo/code-points":136,"unicode-6.3.0/categories/Lt/code-points":137,"unicode-6.3.0/categories/Lu/code-points":138}],57:[function(require,module,exports){ +var assert = require('assert'); + +module.exports = function() {}; + +module.exports.prototype = { + + configure: function(requireCapitalizedConstructors) { + assert( + typeof requireCapitalizedConstructors === 'boolean', + 'requireCapitalizedConstructors option requires boolean value' + ); + assert( + requireCapitalizedConstructors === true, + 'requireCapitalizedConstructors option requires true value or should be removed' + ); + }, + + getOptionName: function() { + return 'requireCapitalizedConstructors'; + }, + + check: function(file, errors) { + file.iterateNodesByType('NewExpression', function(node) { + if (node.callee.type === 'Identifier' && + node.callee.name[0].toUpperCase() !== node.callee.name[0] + ) { + errors.add( + 'Constructor functions should be capitalized', + node.callee.loc.start.line, + node.callee.loc.start.column + ); + } + }); + } + +}; + +},{"assert":108}],58:[function(require,module,exports){ +var assert = require('assert'); + +module.exports = function() {}; + +module.exports.prototype = { + + configure: function(requireCommaBeforeLineBreak) { + assert( + typeof requireCommaBeforeLineBreak === 'boolean', + 'requireCommaBeforeLineBreak option requires boolean value' + ); + assert( + requireCommaBeforeLineBreak === true, + 'requireCommaBeforeLineBreak option requires true value or should be removed' + ); + }, + + getOptionName: function() { + return 'requireCommaBeforeLineBreak'; + }, + + check: function(file, errors) { + file.iterateTokensByType('Punctuator', function(token) { + if (token.value === ',') { + errors.assert.sameLine({ + token: file.getPrevToken(token), + nextToken: token, + message: 'Commas should not be placed on new line' + }); + } + }); + } + +}; + +},{"assert":108}],59:[function(require,module,exports){ +var assert = require('assert'); +var defaultKeywords = require('../utils').curlyBracedKeywords; + +module.exports = function() {}; + +module.exports.prototype = { + + configure: function(statementTypes) { + assert( + Array.isArray(statementTypes) || statementTypes === true, + 'requireCurlyBraces option requires array or true value' + ); + + if (statementTypes === true) { + statementTypes = defaultKeywords; + } + + this._typeIndex = {}; + for (var i = 0, l = statementTypes.length; i < l; i++) { + this._typeIndex[statementTypes[i]] = true; + } + }, + + getOptionName: function() { + return 'requireCurlyBraces'; + }, + + check: function(file, errors) { + + function addError(typeString, node) { + var entity = node; + + if (typeString === 'Else') { + entity = file.findPrevToken( + file.getTokenByRangeStart(node.alternate.range[0]), + 'Keyword', + 'else' + ); + } + + errors.add( + typeString + ' statement without curly braces', + entity.loc.start.line, + entity.loc.start.column + ); + } + + function checkBody(type, typeString) { + file.iterateNodesByType(type, function(node) { + if (node.body && node.body.type !== 'BlockStatement') { + addError(typeString, node); + } + }); + } + + var typeIndex = this._typeIndex; + + if (typeIndex['if'] || typeIndex['else']) { + file.iterateNodesByType('IfStatement', function(node) { + if (typeIndex.if && node.consequent && node.consequent.type !== 'BlockStatement') { + addError('If', node); + } + if (typeIndex['else'] && node.alternate && + node.alternate.type !== 'BlockStatement' && + node.alternate.type !== 'IfStatement' + ) { + addError('Else', node); + } + }); + } + + if (typeIndex['case'] || typeIndex['default']) { + file.iterateNodesByType('SwitchCase', function(node) { + // empty case statement + if (!node.consequent || node.consequent.length === 0) { + return; + } + + if (node.consequent.length === 1 && node.consequent[0].type === 'BlockStatement') { + return; + } + + if (node.test === null && typeIndex['default']) { + addError('Default', node); + } + + if (node.test !== null && typeIndex['case']) { + addError('Case', node); + } + }); + } + + if (typeIndex['while']) { + checkBody('WhileStatement', 'While'); + } + + if (typeIndex['for']) { + checkBody('ForStatement', 'For'); + checkBody('ForInStatement', 'For in'); + } + + if (typeIndex['do']) { + checkBody('DoWhileStatement', 'Do while'); + } + + if (typeIndex['with']) { + checkBody('WithStatement', 'With'); + } + } + +}; + +},{"../utils":107,"assert":108}],60:[function(require,module,exports){ +var assert = require('assert'); +var utils = require('../utils'); + +module.exports = function() {}; + +module.exports.prototype = { + + configure: function(requireDotNotation) { + assert( + typeof requireDotNotation === 'boolean', + 'requireDotNotation option requires boolean value' + ); + assert( + requireDotNotation === true, + 'requireDotNotation option requires true value or should be removed' + ); + }, + + getOptionName: function() { + return 'requireDotNotation'; + }, + + check: function(file, errors) { + file.iterateNodesByType('MemberExpression', function(node) { + if (!node.computed || node.property.type !== 'Literal') { + return; + } + + var value = node.property.value; + if (typeof value === 'number' || (typeof value === 'string' && !utils.isValidIdentifierName(value))) { + return; + } + + if (value === null || + typeof value === 'boolean' || + value === 'null' || + value === 'true' || + value === 'false' || + utils.isEs3Keyword(value) || + utils.isEs3FutureReservedWord(value) + ) { + return; + } + + errors.add( + 'Use dot notation instead of brackets for member expressions', + node.property.loc.start + ); + }); + } + +}; + +},{"../utils":107,"assert":108}],61:[function(require,module,exports){ +var assert = require('assert'); + +module.exports = function() {}; + +module.exports.prototype = { + configure: function(requireFunctionDeclarations) { + assert( + requireFunctionDeclarations === true, + 'requireFunctionDeclarations option requires true value or should be removed' + ); + }, + + getOptionName: function() { + return 'requireFunctionDeclarations'; + }, + + check: function(file, errors) { + file.iterateNodesByType( + 'VariableDeclarator', + function(node) { + if (node.init && node.init.type === 'FunctionExpression') { + errors.add('Use a function declaration instead', node.loc.start); + } + } + ); + + file.iterateNodesByType( + 'AssignmentExpression', + function(node) { + if (node.left.type !== 'MemberExpression' && + node.right.type === 'FunctionExpression') { + errors.add('Use a function declaration instead', node.loc.start); + } + } + ); + } +}; + +},{"assert":108}],62:[function(require,module,exports){ +var assert = require('assert'); + +module.exports = function() {}; + +module.exports.prototype = { + + configure: function(keywords) { + assert(Array.isArray(keywords), 'requireKeywordsOnNewLine option requires array value'); + this._keywordIndex = {}; + for (var i = 0, l = keywords.length; i < l; i++) { + this._keywordIndex[keywords[i]] = true; + } + }, + + getOptionName: function() { + return 'requireKeywordsOnNewLine'; + }, + + check: function(file, errors) { + var keywordIndex = this._keywordIndex; + + file.iterateTokensByType('Keyword', function(token, i, tokens) { + if (keywordIndex[token.value]) { + var prevToken = tokens[i - 1]; + if (prevToken && prevToken.loc.end.line === token.loc.start.line) { + errors.add( + 'Keyword `' + token.value + '` should be placed on new line', + token.loc.start.line, + token.loc.start.column + ); + } + } + }); + } + +}; + +},{"assert":108}],63:[function(require,module,exports){ +module.exports = function() {}; + +module.exports.prototype = { + + configure: function() {}, + + getOptionName: function() { + return 'requireLeftStickedOperators'; + }, + + check: function(file, errors) { + errors.add( + 'The requireLeftStickedOperators rule is no longer supported.' + + '\nPlease use the following rules instead:' + + '\n' + + '\ndisallowSpaceBeforeBinaryOperators' + + '\ndisallowSpaceBeforePostfixUnaryOperators' + + '\ndisallowSpacesInConditionalExpression', + 1, + 0 + ); + } + +}; + +},{}],64:[function(require,module,exports){ +var assert = require('assert'); + +module.exports = function() {}; + +module.exports.prototype = { + + configure: function(requireLineBreakAfterVariableAssignment) { + assert( + typeof requireLineBreakAfterVariableAssignment === 'boolean', + 'requireLineFeedAtFileEnd option requires boolean value' + ); + assert( + requireLineBreakAfterVariableAssignment === true, + 'requireLineFeedAtFileEnd option requires true value or should be removed' + ); + }, + + getOptionName: function() { + return 'requireLineBreakAfterVariableAssignment'; + }, + + check: function(file, errors) { + file.iterate(function(node) { + var lastDeclaration; + + if (node && node.type === 'VariableDeclaration') { + for (var i = 0; i < node.declarations.length; i++) { + var thisDeclaration = node.declarations[i]; + if (lastDeclaration && lastDeclaration.init && + thisDeclaration.loc.start.line === lastDeclaration.loc.start.line) { + errors.add('Variable assignments should be followed by new line', + thisDeclaration.loc.start.line, thisDeclaration.loc.start.column); + } + lastDeclaration = thisDeclaration; + } + } + }); + } + +}; + +},{"assert":108}],65:[function(require,module,exports){ +var assert = require('assert'); + +module.exports = function() {}; + +module.exports.prototype = { + + configure: function(requireLineFeedAtFileEnd) { + assert( + typeof requireLineFeedAtFileEnd === 'boolean', + 'requireLineFeedAtFileEnd option requires boolean value' + ); + assert( + requireLineFeedAtFileEnd === true, + 'requireLineFeedAtFileEnd option requires true value or should be removed' + ); + }, + + getOptionName: function() { + return 'requireLineFeedAtFileEnd'; + }, + + check: function(file, errors) { + var lines = file.getLines(); + if (lines[lines.length - 1] !== '') { + errors.add('Missing line feed at file end', lines.length, 0); + } + } + +}; + +},{"assert":108}],66:[function(require,module,exports){ +var assert = require('assert'); + +function consecutive(file, errors) { + file.iterateNodesByType('VariableDeclaration', function(node) { + var pos = node.parentCollection.indexOf(node); + if (pos < node.parentCollection.length - 1) { + var sibling = node.parentCollection[pos + 1]; + if (sibling.type === 'VariableDeclaration' && sibling.kind === node.kind) { + errors.add( + node.kind[0].toUpperCase() + node.kind.slice(1) + ' declarations should be joined', + sibling.loc.start + ); + } + } + }); +} + +function onevar(file, errors) { + file.iterateNodesByType(['Program', 'FunctionDeclaration', 'FunctionExpression'], function(node) { + var firstVar = true; + var firstConst = true; + var firstParent = true; + + file.iterate(function(node) { + var type = node.type; + var kind = node.kind; + + // Don't go in nested scopes + if (!firstParent && ['FunctionDeclaration', 'FunctionExpression'].indexOf(type) > -1) { + return false; + } + + if (firstParent) { + firstParent = false; + } + + if (type === 'VariableDeclaration') { + if (kind === 'var') { + if (!firstVar) { + errors.add( + 'Var declarations should be joined', + node.loc.start + ); + } else { + firstVar = false; + } + } + + if (kind === 'const') { + if (!firstConst) { + errors.add( + 'Const declarations should be joined', + node.loc.start + ); + } else { + firstConst = false; + } + } + } + }, node); + }); +} + +module.exports = function() {}; + +module.exports.prototype = { + configure: function(requireMultipleVarDecl) { + assert( + typeof requireMultipleVarDecl === 'boolean' || + typeof requireMultipleVarDecl === 'string', + 'requireMultipleVarDecl option requires boolean or string' + ); + assert( + requireMultipleVarDecl === true || requireMultipleVarDecl === 'onevar', + 'requireMultipleVarDecl option requires true value or `onevar` string' + ); + + this._check = typeof requireMultipleVarDecl === 'string' ? onevar : consecutive; + }, + + getOptionName: function() { + return 'requireMultipleVarDecl'; + }, + + check: function() { + return this._check.apply(this, arguments); + } +}; + +},{"assert":108}],67:[function(require,module,exports){ +var assert = require('assert'); + +module.exports = function() {}; + +module.exports.prototype = { + configure: function(requireNewlineBeforeBlockStatements) { + assert( + typeof requireNewlineBeforeBlockStatements === 'boolean', + 'requireNewlineBeforeBlockStatements option requires boolean value' + ); + assert( + requireNewlineBeforeBlockStatements === true, + 'requireNewlineBeforeBlockStatements option requires true value or should be removed' + ); + }, + + getOptionName: function() { + return 'requireNewlineBeforeBlockStatements'; + }, + + check: function(file, errors) { + file.iterateNodesByType('BlockStatement', function(node) { + var tokens = file.getTokens(); + + var openingBracePos = file.getTokenPosByRangeStart(node.range[0]); + var openingBrace = tokens[openingBracePos]; + var prevToken = tokens[openingBracePos - 1]; + + if (openingBrace.loc.start.line === prevToken.loc.start.line) { + errors.add( + 'Missing newline before curly brace for block statement', + node.loc.start + ); + } + }); + } +}; + +},{"assert":108}],68:[function(require,module,exports){ +var assert = require('assert'); +var tokenHelper = require('../token-helper'); +var defaultOperators = require('../utils').binaryOperators.slice(); + +defaultOperators.push('?'); + +module.exports = function() {}; + +module.exports.prototype = { + + configure: function(operators) { + var isTrue = operators === true; + + assert( + Array.isArray(operators) || isTrue, + 'requireOperatorBeforeLineBreak option requires array value or true value' + ); + + if (isTrue) { + operators = defaultOperators; + } + + this._operatorIndex = {}; + for (var i = 0, l = operators.length; i < l; i++) { + this._operatorIndex[operators[i]] = true; + } + }, + + getOptionName: function() { + return 'requireOperatorBeforeLineBreak'; + }, + + check: function(file, errors) { + var operators = this._operatorIndex; + var tokens = file.getTokens(); + var throughTokens = ['?', ',']; + + function errorIfApplicable(token, prevToken) { + if (prevToken && prevToken.loc.end.line !== token.loc.start.line) { + var loc = token.loc.start; + + errors.add( + 'Operator ' + token.value + ' should not be on a new line', + loc.line, + tokenHelper.getPointerEntities(loc.column, token.value.length) + ); + } + } + + throughTokens = throughTokens.filter(function(operator) { + return operators[operator]; + }); + + if (throughTokens.length) { + file.iterateTokensByType('Punctuator', function(token, i, tokens) { + var operator = token.value; + + if (throughTokens.every(function() { + return throughTokens.indexOf(operator) >= 0; + })) { + errorIfApplicable(token, tokens[i - 1]); + } + }); + } + + file.iterateNodesByType( + ['BinaryExpression', 'AssignmentExpression', 'LogicalExpression'], + function(node) { + var operator = node.operator; + + if (!operators[operator]) { + return; + } + + var token = tokenHelper.findOperatorByRangeStart( + file, + node.argument ? node.argument.range[0] : node.right.range[0], + operator, + true + ); + + errorIfApplicable( + token, + tokens[tokens.indexOf(token) - 1] + ); + } + ); + } +}; + +},{"../token-helper":105,"../utils":107,"assert":108}],69:[function(require,module,exports){ +var assert = require('assert'); +var defaultKeywords = require('../utils').spacedKeywords; + +module.exports = function() { }; + +module.exports.prototype = { + + configure: function(keywords) { + assert(Array.isArray(keywords) || keywords === true, + 'requirePaddingNewlinesBeforeKeywords option requires array or true value'); + + if (keywords === true) { + keywords = defaultKeywords; + } + + this._keywordIndex = {}; + for (var i = 0, l = keywords.length; i < l; i++) { + this._keywordIndex[keywords[i]] = true; + } + }, + + getOptionName: function() { + return 'requirePaddingNewlinesBeforeKeywords'; + }, + + check: function(file, errors) { + var excludedTokens = [':', ',', '(', '=']; + var keywordIndex = this._keywordIndex; + + file.iterateTokensByType('Keyword', function(token, i, tokens) { + if (keywordIndex[token.value]) { + var prevToken = tokens[i - 1]; + + // Handle special case of 'else if' construct. + if (token.value === 'if' && prevToken && prevToken.value === 'else') { + return; + // Handling for special cases. + } else if (prevToken && excludedTokens.indexOf(prevToken.value) > -1) { + return; + } + + // Handle all other cases + // The { character is there to handle the case of a matching token which happens to be the first + // statement in a block + // The ) character is there to handle the case of `if (...) matchingKeyword` in which case + // requiring padding would break the statement + if (prevToken && prevToken.value !== '{' && prevToken.value !== ')' && + token.loc.start.line - prevToken.loc.end.line < 2) { + errors.add( + 'Keyword `' + token.value + '` should have an empty line above it', + token.loc.start.line, + token.loc.start.column + ); + } + } + }); + } +}; + +},{"../utils":107,"assert":108}],70:[function(require,module,exports){ +var assert = require('assert'); + +module.exports = function() {}; + +module.exports.prototype = { + + configure: function(requirePaddingNewlinesInBlocks) { + assert( + requirePaddingNewlinesInBlocks === true || typeof requirePaddingNewlinesInBlocks === 'number', + 'requirePaddingNewlinesInBlocks option requires the value true or an Integer' + ); + + this._minStatements = requirePaddingNewlinesInBlocks === true ? 0 : requirePaddingNewlinesInBlocks; + }, + + getOptionName: function() { + return 'requirePaddingNewlinesInBlocks'; + }, + + check: function(file, errors) { + var minStatements = this._minStatements; + + file.iterateNodesByType('BlockStatement', function(node) { + if (node.body.length <= minStatements) { + return; + } + + var tokens = file.getTokens(); + var openingBracketPos = file.getTokenPosByRangeStart(node.range[0]); + + var openingBracket = tokens[openingBracketPos]; + var nextToken = tokens[openingBracketPos + 1]; + + if (nextToken.loc.start.line - openingBracket.loc.start.line < 2) { + errors.add('Expected a padding newline after opening curly brace', openingBracket.loc.end); + } + + var closingBracketPos = file.getTokenPosByRangeStart(node.range[1] - 1); + var closingBracket = tokens[closingBracketPos]; + var prevToken = tokens[closingBracketPos - 1]; + + if (closingBracket.loc.start.line - prevToken.loc.start.line < 2) { + errors.add('Expected a padding newline before closing curly brace', prevToken.loc.end); + } + + file.getComments().some(function(comment) { + if (comment.range[1] < openingBracket.range[0] || closingBracket.range[1] < comment.range[0]) { + return false; + } + + if (comment.loc.start.line - openingBracket.loc.start.line < 2) { + errors.add('Expected a padding newline after opening curly brace', comment.loc.start); + } else if (closingBracket.loc.start.line - comment.loc.end.line < 2) { + errors.add('Expected a padding newline before closing curly brace', comment.loc.end); + } + + return false; + }); + }); + } + +}; + +},{"assert":108}],71:[function(require,module,exports){ +var assert = require('assert'); + +module.exports = function() {}; + +module.exports.prototype = { + + configure: function(value) { + assert( + typeof value === 'boolean', + 'requirePaddingNewLinesInObjects option requires boolean value' + ); + assert( + value === true, + 'requirePaddingNewLinesInObjects option requires true value or should be removed' + ); + }, + + getOptionName: function() { + return 'requirePaddingNewLinesInObjects'; + }, + + check: function(file, errors) { + file.iterateNodesByType('ObjectExpression', function(node) { + var tokens = file.getTokens(); + var openingBracketPos = file.getTokenPosByRangeStart(node.range[0]); + + var openingBracket = tokens[openingBracketPos]; + var nextToken = tokens[openingBracketPos + 1]; + + if (nextToken.type === 'Punctuator' && nextToken.value === '}') { + return; + } + + if (openingBracket.loc.end.line === nextToken.loc.start.line) { + errors.add('Missing newline after opening curly brace', nextToken.loc.start); + } + + var closingBracketPos = file.getTokenPosByRangeStart(node.range[1] - 1); + var closingBracket = tokens[closingBracketPos]; + var prevToken = tokens[closingBracketPos - 1]; + + if (closingBracket.loc.start.line === prevToken.loc.end.line) { + errors.add('Missing newline before closing curly brace', closingBracket.loc.start); + } + }); + } + +}; + +},{"assert":108}],72:[function(require,module,exports){ +var assert = require('assert'); + +module.exports = function() {}; + +module.exports.prototype = { + + configure: function(requireParenthesesAroundIIFE) { + assert( + typeof requireParenthesesAroundIIFE === 'boolean', + 'requireParenthesesAroundIIFE option requires boolean value' + ); + assert( + requireParenthesesAroundIIFE === true, + 'requireParenthesesAroundIIFE option requires true value or should be removed' + ); + }, + + getOptionName: function() { + return 'requireParenthesesAroundIIFE'; + }, + + check: function(file, errors) { + + function isWrapped(node) { + var tokens = file.getTokens(); + var openingToken = file.getTokenPosByRangeStart(node.range[0]); + var closingToken = file.getTokenPosByRangeStart(node.range[1] - 1); + + return tokens[openingToken - 1].value + tokens[closingToken + 1].value === '()'; + } + + file.iterateNodesByType('CallExpression', function(node) { + var callee = node.callee; + var outer = node; + var inner; + + if (callee.type === 'MemberExpression' && + callee.object.type === 'FunctionExpression' && + callee.property.type === 'Identifier' && + (callee.property.name === 'call' || callee.property.name === 'apply') + ) { + inner = callee.object; + } else if (callee.type === 'FunctionExpression') { + inner = callee; + } else { + return; + } + + if (!isWrapped(inner) && !isWrapped(outer)) { + errors.add( + 'Wrap immediately invoked function expressions in parentheses', + node.loc.start.line, + node.loc.start.column + ); + + } + }); + } + +}; + +},{"assert":108}],73:[function(require,module,exports){ +module.exports = function() {}; + +module.exports.prototype = { + + configure: function() {}, + + getOptionName: function() { + return 'requireRightStickedOperators'; + }, + + check: function(file, errors) { + errors.add( + 'The requireRightStickedOperators rule is no longer supported.' + + '\nPlease use the following rules instead:' + + '\n' + + '\ndisallowSpaceAfterBinaryOperators' + + '\ndisallowSpaceAfterPrefixUnaryOperators' + + '\ndisallowSpacesInConditionalExpression', + 1, + 0 + ); + } + +}; + +},{}],74:[function(require,module,exports){ +var assert = require('assert'); +var allOperators = require('../utils').binaryOperators; + +module.exports = function() {}; + +module.exports.prototype = { + + configure: function(operators) { + var isTrue = operators === true; + + assert( + Array.isArray(operators) || isTrue, + 'requireSpaceAfterBinaryOperators option requires array or true value' + ); + + if (isTrue) { + operators = allOperators; + } + + this._operatorIndex = {}; + for (var i = 0, l = operators.length; i < l; i++) { + this._operatorIndex[operators[i]] = true; + } + }, + + getOptionName: function() { + return 'requireSpaceAfterBinaryOperators'; + }, + + check: function(file, errors) { + var operators = this._operatorIndex; + + // Comma + if (operators[',']) { + file.iterateTokensByType('Punctuator', function(token) { + if (token.value === ',') { + errors.assert.whitespaceBetween({ + token: token, + nextToken: file.getNextToken(token), + message: 'Operator , should not stick to following expression' + }); + } + }); + } + + // For everything else + file.iterateNodesByType( + ['BinaryExpression', 'AssignmentExpression', 'VariableDeclarator', 'LogicalExpression'], + function(node) { + var operator; + var expression; + + if (node.type === 'VariableDeclarator') { + expression = node.init; + operator = '='; + } else { + operator = node.operator; + expression = node.right; + } + + if (expression === null) { + return; + } + + var operatorToken = file.findPrevOperatorToken( + file.getFirstNodeToken(expression), + operator + ); + + var nextToken = file.getNextToken(operatorToken); + + if (operators[operator]) { + errors.assert.whitespaceBetween({ + token: operatorToken, + nextToken: nextToken, + message: 'Operator ' + node.operator + ' should not stick to following expression' + }); + } + } + ); + } + +}; + +},{"../utils":107,"assert":108}],75:[function(require,module,exports){ +var assert = require('assert'); +var util = require('util'); +var texts = [ + 'Missing space after "%s" keyword', + 'Should be one space instead of %d, after "%s" keyword' +]; + +var defaultKeywords = require('../utils').spacedKeywords; + +module.exports = function() {}; + +module.exports.prototype = { + + configure: function(keywords) { + assert( + Array.isArray(keywords) || keywords === true, + 'requireSpaceAfterKeywords option requires array or true value'); + + if (keywords === true) { + keywords = defaultKeywords; + } + + this._keywordIndex = {}; + for (var i = 0, l = keywords.length; i < l; i++) { + this._keywordIndex[keywords[i]] = true; + } + }, + + getOptionName: function() { + return 'requireSpaceAfterKeywords'; + }, + + check: function(file, errors) { + var keywordIndex = this._keywordIndex; + + function getCommentIfExists(start, end) { + return file.getComments().filter(function(comment) { + return start <= comment.range[0] && end >= comment.range[1]; + })[0]; + } + + file.iterateTokensByType(['Keyword'], function(token, i, tokens) { + if (keywordIndex[token.value]) { + var nextToken = tokens[i + 1]; + var comment = getCommentIfExists(token.range[1], nextToken.range[0]); + nextToken = comment || nextToken; + + var diff = nextToken.range[0] - token.range[1]; + + if (nextToken && + nextToken.loc.end.line === token.loc.start.line && + diff !== 1 + ) { + if (nextToken.type !== 'Punctuator' || nextToken.value !== ';') { + errors.add( + util.format.apply(null, + diff === 0 ? + [texts[0], token.value] : + [texts[1], diff, token.value] + ), + nextToken.loc.start.line, + nextToken.loc.start.column + ); + } + } + } + }); + } + +}; + +},{"../utils":107,"assert":108,"util":114}],76:[function(require,module,exports){ +var assert = require('assert'); + +module.exports = function() {}; + +module.exports.prototype = { + + configure: function(requireSpaceAfterLineComment) { + assert( + requireSpaceAfterLineComment === true || + requireSpaceAfterLineComment === 'allowSlash' || + typeof requireSpaceAfterLineComment === 'object', + 'requireSpaceAfterLineComment option requires the value `true` ' + + 'or an object with String[] `allExcept` property' + ); + + // verify first item in `allExcept` property in object (if it's an object) + assert( + typeof requireSpaceAfterLineComment !== 'object' || + Array.isArray(requireSpaceAfterLineComment.allExcept) && + typeof requireSpaceAfterLineComment.allExcept[0] === 'string', + 'Property `allExcept` in requireSpaceAfterLineComment should be an array of strings' + ); + + // don't check triple slashed comments, microsoft js doc convention. see #593 + // exceptions. see #592 + // need to drop allowSlash support in 2.0. Fixes #697 + this._allExcept = requireSpaceAfterLineComment === 'allowSlash' ? ['/'] : + requireSpaceAfterLineComment.allExcept || []; + }, + + getOptionName: function() { + return 'requireSpaceAfterLineComment'; + }, + + check: function(file, errors) { + var comments = file.getComments(); + var allExcept = this._allExcept; + + comments.forEach(function(comment) { + if (comment.type === 'Line') { + var value = comment.value; + + // cutout exceptions + allExcept.forEach(function(el) { + if (value.indexOf(el) === 0) { + value = value.substr(el.length); + } + }); + + if (value.length === 0) { + return; + } + + if (value[0] !== ' ') { + errors.add('Missing space after line comment', comment.loc.start); + } + } + }); + } +}; + +},{"assert":108}],77:[function(require,module,exports){ +var assert = require('assert'); + +module.exports = function() {}; + +module.exports.prototype = { + + configure: function(requireSpaceAfterObjectKeys) { + assert( + typeof requireSpaceAfterObjectKeys === 'boolean', + this.getOptionName() + ' option requires boolean value' + ); + assert( + requireSpaceAfterObjectKeys === true, + this.getOptionName() + ' option requires true value or should be removed' + ); + }, + + getOptionName: function() { + return 'requireSpaceAfterObjectKeys'; + }, + + check: function(file, errors) { + var tokens = file.getTokens(); + file.iterateNodesByType('ObjectExpression', function(node) { + node.properties.forEach(function(property) { + var key = property.key; + var keyPos = file.getTokenPosByRangeStart(key.range[0]); + var colon = tokens[keyPos + 1]; + if (colon.range[0] === key.range[1]) { + errors.add('Missing space after key', key.loc.end); + } + }); + }); + } + +}; + +},{"assert":108}],78:[function(require,module,exports){ +var assert = require('assert'); +var defaultOperators = require('../utils').unaryOperators; + +module.exports = function() {}; + +module.exports.prototype = { + + configure: function(operators) { + var isTrue = operators === true; + + assert( + Array.isArray(operators) || isTrue, + this.getOptionName() + ' option requires array or true value' + ); + + if (isTrue) { + operators = defaultOperators; + } + + this._operatorIndex = {}; + for (var i = 0, l = operators.length; i < l; i++) { + this._operatorIndex[operators[i]] = true; + } + }, + + getOptionName: function() { + return 'requireSpaceAfterPrefixUnaryOperators'; + }, + + check: function(file, errors) { + var operatorIndex = this._operatorIndex; + var tokens = file.getTokens(); + + file.iterateNodesByType(['UnaryExpression', 'UpdateExpression'], function(node) { + // Check "node.prefix" for prefix type of (inc|dec)rement + if (node.prefix && operatorIndex[node.operator]) { + var argument = node.argument.type; + var operatorTokenIndex = file.getTokenPosByRangeStart(node.range[0]); + var operatorToken = tokens[operatorTokenIndex]; + var nextToken = tokens[operatorTokenIndex + 1]; + + // Do not report consecutive operators (#405) + if ( + argument === 'UnaryExpression' || argument === 'UpdateExpression' && + nextToken.value !== '(' + ) { + return; + } + + if (operatorToken.range[1] === nextToken.range[0]) { + errors.add('Operator ' + node.operator + ' should not stick to operand', node.loc.start); + } + } + }); + } +}; + +},{"../utils":107,"assert":108}],79:[function(require,module,exports){ +var assert = require('assert'); +var allOperators = require('../../lib/utils').binaryOperators.filter(function(operator) { + return operator !== ','; +}); + +module.exports = function() {}; + +module.exports.prototype = { + + configure: function(operators) { + var isTrue = operators === true; + + assert( + Array.isArray(operators) || isTrue, + 'requireSpaceBeforeBinaryOperators option requires array or true value' + ); + + if (isTrue) { + operators = allOperators; + } + + this._operatorIndex = {}; + for (var i = 0, l = operators.length; i < l; i++) { + this._operatorIndex[operators[i]] = true; + } + }, + + getOptionName: function() { + return 'requireSpaceBeforeBinaryOperators'; + }, + + check: function(file, errors) { + var operators = this._operatorIndex; + + // Comma + if (operators[',']) { + file.iterateTokensByType('Punctuator', function(token) { + if (token.value === ',') { + errors.assert.whitespaceBetween({ + token: file.getPrevToken(token), + nextToken: token, + message: 'Operator , should not stick to preceding expression' + }); + } + }); + } + + // For everything else + file.iterateNodesByType( + ['BinaryExpression', 'AssignmentExpression', 'VariableDeclarator', 'LogicalExpression'], + function(node) { + var operator; + var expression; + + if (node.type === 'VariableDeclarator') { + expression = node.init; + operator = '='; + } else { + operator = node.operator; + expression = node.right; + } + + if (expression === null) { + return; + } + + var operatorToken = file.findPrevOperatorToken( + file.getFirstNodeToken(expression), + operator + ); + + var prevToken = file.getPrevToken(operatorToken); + + if (operators[operator]) { + errors.assert.whitespaceBetween({ + token: prevToken, + nextToken: operatorToken, + message: 'Operator ' + node.operator + ' should not stick to preceding expression' + }); + } + } + ); + } + +}; + +},{"../../lib/utils":107,"assert":108}],80:[function(require,module,exports){ +var assert = require('assert'); + +module.exports = function() {}; + +module.exports.prototype = { + configure: function(requireSpaceBeforeBlockStatements) { + assert( + typeof requireSpaceBeforeBlockStatements === 'boolean', + 'requireSpaceBeforeBlockStatements option requires boolean value' + ); + assert( + requireSpaceBeforeBlockStatements === true, + 'requireSpaceBeforeBlockStatements option requires true value or should be removed' + ); + }, + + getOptionName: function() { + return 'requireSpaceBeforeBlockStatements'; + }, + + check: function(file, errors) { + var tokens = file.getTokens(); + + file.iterateNodesByType('BlockStatement', function(node) { + var tokenBeforeBodyPos = file.getTokenPosByRangeStart(node.range[0] - 1); + var tokenBeforeBody = tokens[tokenBeforeBodyPos]; + if (tokenBeforeBody) { + errors.add( + 'Missing space before opening curly brace for block expressions', + tokenBeforeBody.loc.start + ); + } + }); + } + +}; + +},{"assert":108}],81:[function(require,module,exports){ +var assert = require('assert'); +var util = require('util'); +var texts = [ + 'Missing space before "%s" keyword', + 'Should be one space instead of %d, before "%s" keyword' +]; + +var defaultKeywords = require('../utils').spacedKeywords; + +module.exports = function() {}; + +module.exports.prototype = { + + configure: function(keywords) { + assert( + Array.isArray(keywords) || keywords === true, + 'requireSpaceAfterKeywords option requires array or true value'); + + if (keywords === true) { + keywords = defaultKeywords; + } + + this._keywordIndex = {}; + for (var i = 0, l = keywords.length; i < l; i++) { + this._keywordIndex[keywords[i]] = true; + } + }, + + getOptionName: function() { + return 'requireSpaceBeforeKeywords'; + }, + + check: function(file, errors) { + var keywordIndex = this._keywordIndex; + + function getCommentIfExists(start, end) { + return file.getComments().filter(function(comment) { + return start <= comment.range[0] && end >= comment.range[1]; + })[0]; + } + + file.iterateTokensByType(['Keyword'], function(token, i, tokens) { + if (keywordIndex[token.value]) { + var prevToken = tokens[i - 1]; + if (!prevToken) { + return; + } + + var comment = getCommentIfExists(prevToken.range[1], token.range[0]); + prevToken = comment || prevToken; + + var diff = token.range[0] - prevToken.range[1]; + + if (prevToken.loc.end.line === token.loc.start.line && diff !== 1) { + if (prevToken.type !== 'Punctuator' || prevToken.value !== ';') { + errors.add( + util.format.apply(null, + diff === 0 ? + [texts[0], token.value] : + [texts[1], diff, token.value] + ), + token.loc.start.line, + token.loc.start.column + ); + } + } + } + }); + } + +}; + +},{"../utils":107,"assert":108,"util":114}],82:[function(require,module,exports){ +var assert = require('assert'); +var tokenHelper = require('../token-helper'); + +module.exports = function() {}; + +module.exports.prototype = { + + configure: function(disallow) { + assert( + typeof disallow === 'boolean', + this.getOptionName() + ' option requires boolean value' + ); + assert( + disallow === true, + this.getOptionName() + ' option requires true value or should be removed' + ); + }, + + getOptionName: function() { + return 'requireSpaceBeforeObjectValues'; + }, + + check: function(file, errors) { + var tokens = file.getTokens(); + file.iterateNodesByType('ObjectExpression', function(node) { + node.properties.forEach(function(property) { + var value = property.value; + var valuePos = file.getTokenPosByRangeStart(value.range[0]); + var colon = tokens[valuePos - 1]; + if (tokenHelper.isTokenParenthesis(file, colon.range[0], true)) { + colon = file.getPrevToken(colon); + } + if (colon.range[1] === value.range[0]) { + errors.add('Missing space after key colon', colon.loc.end); + } + }); + }); + } + +}; + +},{"../token-helper":105,"assert":108}],83:[function(require,module,exports){ +var assert = require('assert'); +var defaultOperators = require('../utils').incrementAndDecrementOperators; + +module.exports = function() {}; + +module.exports.prototype = { + + configure: function(operators) { + var isTrue = operators === true; + + assert( + Array.isArray(operators) || isTrue, + this.getOptionName() + ' option requires array or true value' + ); + + if (isTrue) { + operators = defaultOperators; + } + + this._operatorIndex = {}; + for (var i = 0, l = operators.length; i < l; i++) { + this._operatorIndex[operators[i]] = true; + } + }, + + getOptionName: function() { + return 'requireSpaceBeforePostfixUnaryOperators'; + }, + + check: function(file, errors) { + var operatorIndex = this._operatorIndex; + var tokens = file.getTokens(); + + // 'UpdateExpression' involve only ++ and -- operators + file.iterateNodesByType('UpdateExpression', function(node) { + // "!node.prefix" means postfix type of (inc|dec)rement + if (!node.prefix && operatorIndex[node.operator]) { + var operatorStartPos = node.range[1] - node.operator.length; + var operatorTokenIndex = file.getTokenPosByRangeStart(operatorStartPos); + var operatorToken = tokens[operatorTokenIndex]; + var prevToken = tokens[operatorTokenIndex - 1]; + if (operatorToken.range[0] === prevToken.range[1]) { + errors.add('Operator ' + node.operator + ' should not stick to operand', node.loc.start); + } + } + }); + } +}; + +},{"../utils":107,"assert":108}],84:[function(require,module,exports){ +var assert = require('assert'); + +module.exports = function() {}; + +module.exports.prototype = { + + configure: function(requireSpaceBetweenArguments) { + assert( + typeof requireSpaceBetweenArguments === 'boolean', + this.getOptionName() + ' option requires boolean value' + ); + assert( + requireSpaceBetweenArguments === true, + this.getOptionName() + ' option requires true value or should be removed' + ); + }, + + getOptionName: function() { + return 'requireSpaceBetweenArguments'; + }, + + check: function(file, errors) { + + var tokens = file.getTokens(); + + file.iterateNodesByType(['CallExpression'], function(node) { + + node.arguments.forEach(function(param, i) { + + var paramTokenPos = file.getTokenPosByRangeStart(param.range[0]); + var punctuatorToken = tokens[paramTokenPos + 1]; + var argumentIndex = i + 1; + + if (punctuatorToken.value === ',') { + + var nextParamToken = tokens[paramTokenPos + 2]; + + if (punctuatorToken.range[1] === nextParamToken.range[0]) { + errors.add( + 'Missing space before argument ' + argumentIndex, + nextParamToken.loc.start + ); + } + } + }); + }); + } + +}; + +},{"assert":108}],85:[function(require,module,exports){ +var assert = require('assert'); + +module.exports = function() {}; + +module.exports.prototype = { + configure: function(options) { + assert( + typeof options === 'object', + 'requireSpacesInAnonymousFunctionExpression option must be the object' + ); + + if ('beforeOpeningRoundBrace' in options) { + assert( + options.beforeOpeningRoundBrace === true, + 'requireSpacesInAnonymousFunctionExpression.beforeOpeningRoundBrace ' + + 'property requires true value or should be removed' + ); + } + + if ('beforeOpeningCurlyBrace' in options) { + assert( + options.beforeOpeningCurlyBrace === true, + 'requireSpacesInAnonymousFunctionExpression.beforeOpeningCurlyBrace ' + + 'property requires true value or should be removed' + ); + } + + assert( + options.beforeOpeningCurlyBrace || options.beforeOpeningRoundBrace, + 'requireSpacesInAnonymousFunctionExpression must have beforeOpeningCurlyBrace ' + + ' or beforeOpeningRoundBrace property' + ); + + this._beforeOpeningRoundBrace = Boolean(options.beforeOpeningRoundBrace); + this._beforeOpeningCurlyBrace = Boolean(options.beforeOpeningCurlyBrace); + }, + + getOptionName: function() { + return 'requireSpacesInAnonymousFunctionExpression'; + }, + + check: function(file, errors) { + var beforeOpeningRoundBrace = this._beforeOpeningRoundBrace; + var beforeOpeningCurlyBrace = this._beforeOpeningCurlyBrace; + var tokens = file.getTokens(); + + file.iterateNodesByType(['FunctionExpression'], function(node) { + var parent = node.parentNode; + + // Ignore syntactic sugar for getters and setters. + if (parent.type === 'Property' && (parent.kind === 'get' || parent.kind === 'set')) { + return; + } + + if (!node.id) { + + if (beforeOpeningRoundBrace) { + var nodeBeforeRoundBrace = node; + + var functionTokenPos = file.getTokenPosByRangeStart(nodeBeforeRoundBrace.range[0]); + var functionToken = tokens[functionTokenPos]; + + var nextTokenPos = file.getTokenPosByRangeStart(functionToken.range[1]); + var nextToken = tokens[nextTokenPos]; + + if (nextToken) { + errors.add( + 'Missing space before opening round brace', + nextToken.loc.start + ); + } + } + + if (beforeOpeningCurlyBrace) { + var tokenBeforeBodyPos = file.getTokenPosByRangeStart(node.body.range[0] - 1); + var tokenBeforeBody = tokens[tokenBeforeBodyPos]; + + if (tokenBeforeBody) { + errors.add( + 'Missing space before opening curly brace', + tokenBeforeBody.loc.start + ); + } + } + } + }); + } + +}; + +},{"assert":108}],86:[function(require,module,exports){ +var assert = require('assert'); + +module.exports = function() {}; + +module.exports.prototype = { + configure: function(requireSpacesInCallExpression) { + assert( + requireSpacesInCallExpression === true, + 'requireSpacesInCallExpression option requires true value or should be removed' + ); + }, + + getOptionName: function() { + return 'requireSpacesInCallExpression'; + }, + + check: function(file, errors) { + var tokens = file.getTokens(); + + file.iterateNodesByType('CallExpression', function(node) { + var nodeBeforeRoundBrace = node; + if (node.callee) { + nodeBeforeRoundBrace = node.callee; + } + + var roundBraceToken = file.getTokenByRangeStart(nodeBeforeRoundBrace.range[0]); + do { + roundBraceToken = file.findNextToken(roundBraceToken, 'Punctuator', '('); + } while (roundBraceToken.range[0] < nodeBeforeRoundBrace.range[1]); + + var functionEndToken = file.getPrevToken(roundBraceToken); + + if (roundBraceToken.value === '(' && functionEndToken.range[1] === roundBraceToken.range[0]) { + errors.add( + 'Missing space before opening round brace', + roundBraceToken.loc.start + ); + } + }); + } +}; + +},{"assert":108}],87:[function(require,module,exports){ +var assert = require('assert'); + +module.exports = function() {}; + +module.exports.prototype = { + configure: function(options) { + var validProperties = [ + 'afterTest', + 'beforeConsequent', + 'afterConsequent', + 'beforeAlternate' + ]; + var optionName = this.getOptionName(); + + if (options === true) { + options = { + 'afterTest': true, + 'beforeConsequent': true, + 'afterConsequent': true, + 'beforeAlternate': true + }; + } + + assert( + typeof options === 'object', + optionName + ' option must be an object or boolean true' + ); + + var isProperlyConfigured = validProperties.some(function(key) { + var isPresent = key in options; + + if (isPresent) { + assert( + options[key] === true, + optionName + '.' + key + ' property requires true value or should be removed' + ); + } + + return isPresent; + }); + + assert( + isProperlyConfigured, + optionName + ' must have at least 1 of the following properties: ' + validProperties.join(', ') + ); + + validProperties.forEach(function(property) { + this['_' + property] = Boolean(options[property]); + }.bind(this)); + }, + + getOptionName: function() { + return 'requireSpacesInConditionalExpression'; + }, + + check: function(file, errors) { + var tokens = file.getTokens(); + + file.iterateNodesByType(['ConditionalExpression'], function(node) { + var test = node.test; + var consequent = node.consequent; + var alternate = node.alternate; + var questionMark; + var colon; + + if (this._afterTest) { + questionMark = tokens[file.getTokenPosByRangeStart(test.range[1])]; + if (questionMark && questionMark.value === '?') { + errors.add( + 'Missing space after test', + test.loc.end + ); + } + } + + if (this._beforeConsequent) { + questionMark = tokens[file.getTokenPosByRangeStart(consequent.range[0] - 1)]; + if (questionMark && questionMark.value === '?') { + errors.add( + 'Missing space before consequent', + consequent.loc.start + ); + } + } + + if (this._afterConsequent) { + colon = tokens[file.getTokenPosByRangeStart(consequent.range[1])]; + if (colon && colon.value === ':') { + errors.add( + 'Missing space after consequent', + consequent.loc.end + ); + } + } + + if (this._beforeAlternate) { + colon = tokens[file.getTokenPosByRangeStart(alternate.range[0] - 1)]; + if (colon && colon.value === ':') { + errors.add( + 'Missing space before alternate', + alternate.loc.start + ); + } + } + }.bind(this)); + } + +}; + +},{"assert":108}],88:[function(require,module,exports){ +var assert = require('assert'); + +module.exports = function() {}; + +module.exports.prototype = { + configure: function(options) { + assert( + typeof options === 'object', + 'requireSpacesInFunctionDeclaration option must be the object' + ); + + if ('beforeOpeningRoundBrace' in options) { + assert( + options.beforeOpeningRoundBrace === true, + 'requireSpacesInFunctionDeclaration.beforeOpeningRoundBrace ' + + 'property requires true value or should be removed' + ); + } + + if ('beforeOpeningCurlyBrace' in options) { + assert( + options.beforeOpeningCurlyBrace === true, + 'requireSpacesInFunctionDeclaration.beforeOpeningCurlyBrace ' + + 'property requires true value or should be removed' + ); + } + + assert( + options.beforeOpeningCurlyBrace || options.beforeOpeningRoundBrace, + 'requireSpacesInFunctionDeclaration must have beforeOpeningCurlyBrace or beforeOpeningRoundBrace property' + ); + + this._beforeOpeningRoundBrace = Boolean(options.beforeOpeningRoundBrace); + this._beforeOpeningCurlyBrace = Boolean(options.beforeOpeningCurlyBrace); + }, + + getOptionName: function() { + return 'requireSpacesInFunctionDeclaration'; + }, + + check: function(file, errors) { + var beforeOpeningRoundBrace = this._beforeOpeningRoundBrace; + var beforeOpeningCurlyBrace = this._beforeOpeningCurlyBrace; + var tokens = file.getTokens(); + + file.iterateNodesByType(['FunctionDeclaration'], function(node) { + + if (beforeOpeningRoundBrace) { + var nodeBeforeRoundBrace = node; + // named function + if (node.id) { + nodeBeforeRoundBrace = node.id; + } + + var functionTokenPos = file.getTokenPosByRangeStart(nodeBeforeRoundBrace.range[0]); + var functionToken = tokens[functionTokenPos]; + + var nextTokenPos = file.getTokenPosByRangeStart(functionToken.range[1]); + var nextToken = tokens[nextTokenPos]; + + if (nextToken) { + errors.add( + 'Missing space before opening round brace', + nextToken.loc.start + ); + } + } + + if (beforeOpeningCurlyBrace) { + var tokenBeforeBodyPos = file.getTokenPosByRangeStart(node.body.range[0] - 1); + var tokenBeforeBody = tokens[tokenBeforeBodyPos]; + + if (tokenBeforeBody) { + errors.add( + 'Missing space before opening curly brace', + tokenBeforeBody.loc.start + ); + } + } + }); + } + +}; + +},{"assert":108}],89:[function(require,module,exports){ +var assert = require('assert'); + +module.exports = function() {}; + +module.exports.prototype = { + configure: function(options) { + assert( + typeof options === 'object', + 'requireSpacesInFunctionExpression option must be the object' + ); + + if ('beforeOpeningRoundBrace' in options) { + assert( + options.beforeOpeningRoundBrace === true, + 'requireSpacesInFunctionExpression.beforeOpeningRoundBrace ' + + 'property requires true value or should be removed' + ); + } + + if ('beforeOpeningCurlyBrace' in options) { + assert( + options.beforeOpeningCurlyBrace === true, + 'requireSpacesInFunctionExpression.beforeOpeningCurlyBrace ' + + 'property requires true value or should be removed' + ); + } + + assert( + options.beforeOpeningCurlyBrace || options.beforeOpeningRoundBrace, + 'requireSpacesInFunctionExpression must have beforeOpeningCurlyBrace or beforeOpeningRoundBrace property' + ); + + this._beforeOpeningRoundBrace = Boolean(options.beforeOpeningRoundBrace); + this._beforeOpeningCurlyBrace = Boolean(options.beforeOpeningCurlyBrace); + }, + + getOptionName: function() { + return 'requireSpacesInFunctionExpression'; + }, + + check: function(file, errors) { + var beforeOpeningRoundBrace = this._beforeOpeningRoundBrace; + var beforeOpeningCurlyBrace = this._beforeOpeningCurlyBrace; + var tokens = file.getTokens(); + + file.iterateNodesByType('FunctionExpression', function(node) { + var parent = node.parentNode; + + // Ignore syntactic sugar for getters and setters. + if (parent.type === 'Property' && (parent.kind === 'get' || parent.kind === 'set')) { + return; + } + + if (beforeOpeningRoundBrace) { + var nodeBeforeRoundBrace = node; + // named function + if (node.id) { + nodeBeforeRoundBrace = node.id; + } + + var functionTokenPos = file.getTokenPosByRangeStart(nodeBeforeRoundBrace.range[0]); + var functionToken = tokens[functionTokenPos]; + + var nextTokenPos = file.getTokenPosByRangeStart(functionToken.range[1]); + var nextToken = tokens[nextTokenPos]; + + if (nextToken) { + errors.add( + 'Missing space before opening round brace', + nextToken.loc.start + ); + } + } + + if (beforeOpeningCurlyBrace) { + var tokenBeforeBodyPos = file.getTokenPosByRangeStart(node.body.range[0] - 1); + var tokenBeforeBody = tokens[tokenBeforeBodyPos]; + + if (tokenBeforeBody) { + errors.add( + 'Missing space before opening curly brace', + tokenBeforeBody.loc.start + ); + } + } + }); + } + +}; + +},{"assert":108}],90:[function(require,module,exports){ +var assert = require('assert'); + +module.exports = function() {}; + +module.exports.prototype = { + configure: function(options) { + assert( + typeof options === 'object', + 'requireSpacesInFunction option must be the object' + ); + + if ('beforeOpeningRoundBrace' in options) { + assert( + options.beforeOpeningRoundBrace === true, + 'requireSpacesInFunction.beforeOpeningRoundBrace ' + + 'property requires true value or should be removed' + ); + } + + if ('beforeOpeningCurlyBrace' in options) { + assert( + options.beforeOpeningCurlyBrace === true, + 'requireSpacesInFunction.beforeOpeningCurlyBrace ' + + 'property requires true value or should be removed' + ); + } + + assert( + options.beforeOpeningCurlyBrace || options.beforeOpeningRoundBrace, + 'requireSpacesInFunction must have beforeOpeningCurlyBrace or beforeOpeningRoundBrace property' + ); + + this._beforeOpeningRoundBrace = Boolean(options.beforeOpeningRoundBrace); + this._beforeOpeningCurlyBrace = Boolean(options.beforeOpeningCurlyBrace); + }, + + getOptionName: function() { + return 'requireSpacesInFunction'; + }, + + check: function(file, errors) { + var beforeOpeningRoundBrace = this._beforeOpeningRoundBrace; + var beforeOpeningCurlyBrace = this._beforeOpeningCurlyBrace; + var tokens = file.getTokens(); + + file.iterateNodesByType(['FunctionDeclaration', 'FunctionExpression'], function(node) { + var parent = node.parentNode; + + // Ignore syntactic sugar for getters and setters. + if (parent.type === 'Property' && (parent.kind === 'get' || parent.kind === 'set')) { + return; + } + + if (beforeOpeningRoundBrace) { + var nodeBeforeRoundBrace = node; + // named function + if (node.id) { + nodeBeforeRoundBrace = node.id; + } + + var functionTokenPos = file.getTokenPosByRangeStart(nodeBeforeRoundBrace.range[0]); + var functionToken = tokens[functionTokenPos]; + + var nextTokenPos = file.getTokenPosByRangeStart(functionToken.range[1]); + var nextToken = tokens[nextTokenPos]; + + if (nextToken) { + errors.add( + 'Missing space before opening round brace', + nextToken.loc.start + ); + } + } + + if (beforeOpeningCurlyBrace) { + var tokenBeforeBodyPos = file.getTokenPosByRangeStart(node.body.range[0] - 1); + var tokenBeforeBody = tokens[tokenBeforeBodyPos]; + + if (tokenBeforeBody) { + errors.add( + 'Missing space before opening curly brace', + tokenBeforeBody.loc.start + ); + } + } + }); + } + +}; + +},{"assert":108}],91:[function(require,module,exports){ +var assert = require('assert'); + +module.exports = function() {}; + +module.exports.prototype = { + configure: function(options) { + assert( + typeof options === 'object', + 'requireSpacesInNamedFunctionExpression option must be the object' + ); + + if ('beforeOpeningRoundBrace' in options) { + assert( + options.beforeOpeningRoundBrace === true, + 'requireSpacesInNamedFunctionExpression.beforeOpeningRoundBrace ' + + 'property requires true value or should be removed' + ); + } + + if ('beforeOpeningCurlyBrace' in options) { + assert( + options.beforeOpeningCurlyBrace === true, + 'requireSpacesInNamedFunctionExpression.beforeOpeningCurlyBrace ' + + 'property requires true value or should be removed' + ); + } + + assert( + options.beforeOpeningCurlyBrace || options.beforeOpeningRoundBrace, + 'requireSpacesInNamedFunctionExpression must have beforeOpeningCurlyBrace ' + + 'or beforeOpeningRoundBrace property' + ); + + this._beforeOpeningRoundBrace = Boolean(options.beforeOpeningRoundBrace); + this._beforeOpeningCurlyBrace = Boolean(options.beforeOpeningCurlyBrace); + }, + + getOptionName: function() { + return 'requireSpacesInNamedFunctionExpression'; + }, + + check: function(file, errors) { + var beforeOpeningRoundBrace = this._beforeOpeningRoundBrace; + var beforeOpeningCurlyBrace = this._beforeOpeningCurlyBrace; + var tokens = file.getTokens(); + + file.iterateNodesByType(['FunctionExpression'], function(node) { + + if (node.id) { + + if (beforeOpeningRoundBrace) { + var nodeBeforeRoundBrace = node.id; + + var functionTokenPos = file.getTokenPosByRangeStart(nodeBeforeRoundBrace.range[0]); + var functionToken = tokens[functionTokenPos]; + + var nextTokenPos = file.getTokenPosByRangeStart(functionToken.range[1]); + var nextToken = tokens[nextTokenPos]; + + if (nextToken) { + errors.add( + 'Missing space before opening round brace', + nextToken.loc.start + ); + } + } + + if (beforeOpeningCurlyBrace) { + var tokenBeforeBodyPos = file.getTokenPosByRangeStart(node.body.range[0] - 1); + var tokenBeforeBody = tokens[tokenBeforeBodyPos]; + + if (tokenBeforeBody) { + errors.add( + 'Missing space before opening curly brace', + tokenBeforeBody.loc.start + ); + } + } + } + }); + } + +}; + +},{"assert":108}],92:[function(require,module,exports){ +var assert = require('assert'); + +module.exports = function() {}; + +module.exports.prototype = { + + configure: function(mode) { + var modes = { + 'all': true, + 'allButNested': true + }; + assert( + typeof mode === 'string' && + modes[mode], + 'requireSpacesInsideArrayBrackets option requires string value \'all\' or \'allButNested\'' + ); + this._mode = mode; + }, + + getOptionName: function() { + return 'requireSpacesInsideArrayBrackets'; + }, + + check: function(file, errors) { + var mode = this._mode; + file.iterateNodesByType('ArrayExpression', function(node) { + var tokens = file.getTokens(); + var openingBracketPos = file.getTokenPosByRangeStart(node.range[0]); + + var openingBracket = tokens[openingBracketPos]; + var nextToken = tokens[openingBracketPos + 1]; + + if (nextToken.type === 'Punctuator' && nextToken.value === ']') { + return; + } + + if (mode === 'allButNested' && nextToken.type === 'Punctuator' && nextToken.value === '[') { + return; + } + + if (openingBracket.range[1] === nextToken.range[0]) { + errors.add('Missing space after opening square bracket', nextToken.loc.start); + } + + var closingBracketPos = file.getTokenPosByRangeStart(node.range[1] - 1); + var closingBracket = tokens[closingBracketPos]; + var prevToken = tokens[closingBracketPos - 1]; + + if (closingBracket.range[0] === prevToken.range[1]) { + if (!(mode === 'allButNested' && + prevToken.type === 'Punctuator' && + prevToken.value === ']' + )) { + errors.add('Missing space before closing square bracket', closingBracket.loc.start); + } + } + }); + } + +}; + +},{"assert":108}],93:[function(require,module,exports){ +var assert = require('assert'); + +module.exports = function() {}; + +module.exports.prototype = { + + configure: function(mode) { + var modes = { + 'all': true, + 'allButNested': true + }; + assert( + typeof mode === 'string' && + modes[mode], + 'requireSpacesInsideObjectBrackets option requires string value \'all\' or \'allButNested\'' + ); + this._mode = mode; + }, + + getOptionName: function() { + return 'requireSpacesInsideObjectBrackets'; + }, + + check: function(file, errors) { + var mode = this._mode; + file.iterateNodesByType('ObjectExpression', function(node) { + var tokens = file.getTokens(); + var openingBracketPos = file.getTokenPosByRangeStart(node.range[0]); + + var openingBracket = tokens[openingBracketPos]; + var nextToken = tokens[openingBracketPos + 1]; + + if (nextToken.type === 'Punctuator' && nextToken.value === '}') { + return; + } + + if (openingBracket.range[1] === nextToken.range[0]) { + errors.add('Missing space after opening curly brace', nextToken.loc.start); + } + + var closingBracketPos = file.getTokenPosByRangeStart(node.range[1] - 1); + var closingBracket = tokens[closingBracketPos]; + var prevToken = tokens[closingBracketPos - 1]; + var isNested = mode === 'allButNested' && + prevToken.type === 'Punctuator' && + prevToken.value === '}'; + + if (closingBracket.range[0] === prevToken.range[1] && !isNested) { + errors.add('Missing space before closing curly brace', closingBracket.loc.start); + } + }); + } + +}; + +},{"assert":108}],94:[function(require,module,exports){ +var assert = require('assert'); + +module.exports = function() {}; + +module.exports.prototype = { + + configure: function(value) { + var mode; + var modes = { + 'all': true, + 'allButNested': true + }; + var isObject = typeof value === 'object'; + + var error = 'requireSpacesInsideParentheses rule' + + ' requires string value \'all\' or \'allButNested\' or object'; + + if (typeof value === 'string') { + assert(modes[value], error); + + } else if (isObject) { + assert( + 'all' in value || 'allButNested' in value, + error + ); + } else { + assert(false, error); + } + + this._exceptions = {}; + + if (isObject) { + mode = 'all' in value ? 'all' : 'allButNested'; + + (value.except || []).forEach(function(value) { + this._exceptions[value] = true; + }, this); + + } else { + mode = value; + } + + if (mode === 'allButNested') { + this._exceptions[')'] = this._exceptions['('] = true; + } + }, + + getOptionName: function() { + return 'requireSpacesInsideParentheses'; + }, + + check: function(file, errors) { + var exceptions = this._exceptions; + + function isComment(position) { + return file.getComments().some(function(comment) { + return position >= comment.range[0] && position < comment.range[1]; + }); + } + + file.iterateTokenByValue('(', function(token, index, tokens) { + var nextToken = file.getNextToken(token); + var value = nextToken.value; + var type = nextToken.type; + + if (value in exceptions) { + return; + } + + // Skip for empty parentheses + if (value === ')') { + return; + } + + if ( + (token.range[1] === nextToken.range[0] && + token.loc.end.line === nextToken.loc.start.line) || + isComment(token.range[1]) + ) { + errors.add('Missing space after opening round bracket', token.loc.end); + } + }); + + file.iterateTokenByValue(')', function(token, index, tokens) { + var prevToken = file.getPrevToken(token); + var value = prevToken.value; + var type = prevToken.type; + + if (value in exceptions) { + + // Special case - foo( object[i] ) + if (!( + value === ']' && + file.getNodeByRange(token.range[0] - 1).type === 'MemberExpression' + )) { + return; + } + } + + // Skip for empty parentheses + if (value === '(') { + return; + } + + if ( + (token.range[0] === prevToken.range[1] && + token.loc.end.line === prevToken.loc.start.line) || + isComment(token.range[0] - 1) + ) { + errors.add('Missing space before closing round bracket', + token.loc.end.line, + token.loc.end.column - 2); + } + }); + } +}; + +},{"assert":108}],95:[function(require,module,exports){ +var assert = require('assert'); + +module.exports = function() {}; + +module.exports.prototype = { + configure: function(requireTrailingComma) { + + if (typeof requireTrailingComma === 'object') { + if ('ignoreSingleValue' in requireTrailingComma) { + assert( + requireTrailingComma.ignoreSingleValue === true, + 'requireTrailingComma option ignoreSingleValue requires true value or should be removed' + ); + this._ignoreSingleValue = true; + } + if ('ignoreSingleLine' in requireTrailingComma) { + assert( + requireTrailingComma.ignoreSingleLine === true, + 'requireTrailingComma option ignoreSingleLine requires true value or should be removed' + ); + this._ignoreSingleLine = true; + } + } else { + assert( + requireTrailingComma === true, + 'requireTrailingComma option requires true value or should be removed' + ); + } + }, + + getOptionName: function() { + return 'requireTrailingComma'; + }, + + check: function(file, errors) { + var _this = this; + + file.iterateNodesByType(['ObjectExpression', 'ArrayExpression'], function(node) { + var isObject = node.type === 'ObjectExpression'; + var entities = isObject ? node.properties : node.elements; + + if (entities.length === 0) { + return; + } + + if (_this._ignoreSingleValue && entities.length === 1) { + return; + } + + if (_this._ignoreSingleLine && node.loc.start.line === node.loc.end.line) { + return; + } + + var closingToken = file.getLastNodeToken(node); + + errors.assert.tokenBefore({ + token: closingToken, + expectedTokenBefore: {type: 'Punctuator', value: ','}, + message: 'Missing comma before closing ' + (isObject ? ' curly brace' : ' bracket') + }); + }); + } + +}; + +},{"assert":108}],96:[function(require,module,exports){ +var assert = require('assert'); + +module.exports = function() {}; + +module.exports.prototype = { + + configure: function(requireYodaConditions) { + assert( + typeof requireYodaConditions === 'boolean', + 'requireYodaConditions option requires boolean value' + ); + assert( + requireYodaConditions === true, + 'requireYodaConditions option requires true value or should be removed' + ); + this._operatorIndex = { + '==': true, + '===': true, + '!=': true, + '!==': true, + '>': true, + '<': true, + '>=': true, + '<=': true + }; + }, + + getOptionName: function() { + return 'requireYodaConditions'; + }, + + check: function(file, errors) { + var operators = this._operatorIndex; + file.iterateNodesByType('BinaryExpression', function(node) { + if (operators[node.operator]) { + if (node.right.type === 'Literal' || + (node.right.type === 'Identifier' && node.right.name === 'undefined') + ) { + errors.add('Not yoda condition', node.left.loc.start); + } + } + }); + } + +}; + +},{"assert":108}],97:[function(require,module,exports){ +var assert = require('assert'); + +module.exports = function() {}; + +module.exports.prototype = { + + configure: function(keywords) { + assert( + typeof keywords === 'string' || + typeof Array.isArray(keywords), + 'safeContextKeyword option requires string or array value' + ); + + this._keywords = keywords; + }, + + getOptionName: function() { + return 'safeContextKeyword'; + }, + + check: function(file, errors) { + var keywords = typeof this._keywords === 'string' ? [this._keywords] : this._keywords; + + // var that = this + file.iterateNodesByType('VariableDeclaration', function(node) { + for (var i = 0; i < node.declarations.length; i++) { + var decl = node.declarations[i]; + + // decl.init === null in case of "var foo;" + if (decl.init && + (decl.init.type === 'ThisExpression' && checkKeywords(decl.id.name, keywords)) + ) { + errors.add( + 'You should use "' + keywords.join('" or "') + '" to save a reference to "this"', + node.loc.start + ); + } + } + }); + + // that = this + file.iterateNodesByType('AssignmentExpression', function(node) { + + if ( + // filter property assignments "foo.bar = this" + node.left.type === 'Identifier' && + (node.right.type === 'ThisExpression' && checkKeywords(node.left.name, keywords)) + ) { + errors.add( + 'You should use "' + keywords.join('" or "') + '" to save a reference to "this"', + node.loc.start + ); + } + }); + } +}; + +/** + * Check if at least one keyword equals to passed name + * @param {String} name + * @param {Array} keywords + * @return {Boolean} + */ +function checkKeywords(name, keywords) { + for (var i = 0; i < keywords.length; i++) { + if (name === keywords[i]) { + return false; + } + } + + return true; +} + +},{"assert":108}],98:[function(require,module,exports){ +var assert = require('assert'); +var commentHelper = require('../comment-helper'); + +module.exports = function() {}; + +module.exports.prototype = { + + configure: function(validateIndentation) { + assert( + validateIndentation === '\t' || + (typeof validateIndentation === 'number' && validateIndentation > 0), + 'validateIndentation option requires a positive number of spaces or "\\t"' + ); + + if (typeof validateIndentation === 'number') { + this._indentChar = ' '; + this._indentSize = validateIndentation; + } else { + this._indentChar = '\t'; + this._indentSize = 1; + } + + this._breakIndents = null; + + this._indentableNodes = { + BlockStatement: 'body', + Program: 'body', + ObjectExpression: 'properties', + ArrayExpression: 'elements', + SwitchStatement: 'cases', + SwitchCase: 'consequent' + }; + }, + + getOptionName: function() { + return 'validateIndentation'; + }, + + check: function(file, errors) { + function isMultiline(node) { + return node.loc.start.line !== node.loc.end.line; + } + + function getIndentationFromLine(i) { + var rNotIndentChar = new RegExp('[^' + indentChar + ']'); + var firstContent = Math.max(lines[i].search(rNotIndentChar), 0); + return firstContent; + } + + function markPop(node, outdents) { + linesToCheck[node.loc.end.line - 1].pop = outdents; + } + + function markExtraPops(node, count) { + linesToCheck[node.loc.end.line - 1].extraPops = count; + } + + function markCasePop(caseNode, children) { + var outdentNode = getCaseOutdent(children); + var outdents; + + // If a case statement has a `break` or `return` as a direct child and it is the + // first one encountered, use it as the example for all future case indentation + if (outdentNode && _this._breakIndents === null) { + _this._breakIndents = (caseNode.loc.start.column === outdentNode.loc.start.column) ? 1 : 0; + } + + // If a case statement has no `break` nor `return` as a direct child + // (e.g. an if nested in a case statement), mark that there is an extra + // pop because there is no statement that "closes" the case statement + if (!outdentNode) { + markExtraPops(caseNode, 1); + } else { + markPop(caseNode, _this._breakIndents); + } + } + + function markPushAndCheck(pushNode, indents) { + linesToCheck[pushNode.loc.start.line - 1].push = indents; + linesToCheck[pushNode.loc.end.line - 1].check = true; + } + + function markChildren(node) { + var childrenProperty = indentableNodes[node.type]; + var children = node[childrenProperty]; + + children.forEach(function(childNode, i) { + if (childNode.loc.start.line !== node.loc.start.line) { + linesToCheck[childNode.loc.start.line - 1].check = true; + } + }); + } + + function checkIndentations() { + linesToCheck.forEach(function(line, i) { + var actualIndentation = getIndentationFromLine(i); + + var expectedIndentation = getExpectedIndentation(line, actualIndentation); + + if (line.check) { + if (actualIndentation !== expectedIndentation) { + errors.add( + 'Expected indentation of ' + expectedIndentation + ' characters', + i + 1, + expectedIndentation + ); + // correct the indentation so that future lines + // can be validated appropriately + actualIndentation = expectedIndentation; + } + } + + if (line.push !== null) { + pushExpectedIndentations(line, actualIndentation); + } + }); + } + + function getExpectedIndentation(line, actual) { + var outdent = indentSize * line.pop; + var expected; + var idx = indentStack.length - 1; + var extraPops = line.extraPops; + + if (line.pop === null) { + expected = indentStack[idx]; + } else { + expected = indentStack.pop(); + + if (Array.isArray(expected)) { + expected[0] -= outdent; + expected[1] -= outdent; + } else { + expected -= outdent; + } + } + + // when the expected is an array, resolve the value + // back into a Number by checking both values are the actual indentation + if (line.check && Array.isArray(expected)) { + expected = actual === expected[1] ? expected[1] : expected[0]; + if (!line.pop) { + indentStack[idx] = expected; + } + } + + while (extraPops--) { + indentStack.pop(); + } + + return expected; + } + + function pushExpectedIndentations(line, actualIndentation) { + var expectedIndentation = actualIndentation + (indentSize * line.push); + var expectedIndentation2; + + // when a line has an alternate indentation, push an array of possible values + // on the stack, to be resolved when checked against an actual indentation + if (line.pushAltLine !== null) { + expectedIndentation2 = getIndentationFromLine(line.pushAltLine) + (indentSize * line.push); + indentStack.push([expectedIndentation, expectedIndentation2]); + } else { + indentStack.push(expectedIndentation); + } + } + + function checkAlternateBlockStatement(node, property) { + var child = node[property]; + if (child && child.type === 'BlockStatement') { + linesToCheck[child.loc.start.line - 1].push = 1; + linesToCheck[child.loc.start.line - 1].check = true; + } + } + + function getCaseOutdent(caseChildren) { + var outdentNode; + caseChildren.some(function(node) { + if (node.type === 'BreakStatement' || node.type === 'ReturnStatement') { + outdentNode = node; + return true; + } + }); + + return outdentNode; + } + + function generateIndentations() { + file.iterateNodesByType([ + 'Program' + ], function(node) { + if (!isMultiline(node)) { + return; + } + + markChildren(node); + }); + + file.iterateNodesByType('BlockStatement', function(node) { + if (!isMultiline(node)) { + return; + } + + markChildren(node); + markPop(node, 1); + + // The parent of an else block statement is the entire if/else + // block. In order to avoid over indenting in the case of a + // non-block if with a block else, mark push where the else starts, + // not where the if starts! + if (node.parentNode.type === 'IfStatement' && + node.parentNode.alternate === node) { + markPushAndCheck(node, 1); + } else { + markPushAndCheck(node.parentNode, 1); + } + }); + + file.iterateNodesByType('IfStatement', function(node) { + checkAlternateBlockStatement(node, 'alternate'); + + var test = node.test; + var endLine = test.loc.end.line - 1; + + // Assume that if the test starts on the line following the parens, + // that the closing parens is on the line after the end of the test. + if (node.loc.start.line + 1 === test.loc.start.line) { + endLine++; + } + + if (isMultiline(test) && linesToCheck[endLine].pop !== null) { + linesToCheck[endLine].push = 1; + } + }); + + file.iterateNodesByType('TryStatement', function(node) { + checkAlternateBlockStatement(node, 'handler'); + checkAlternateBlockStatement(node, 'finalizer'); + }); + + file.iterateNodesByType('SwitchStatement', function(node) { + if (!isMultiline(node)) { + return; + } + var indents = 1; + + var childrenProperty = indentableNodes[node.type]; + var children = node[childrenProperty]; + + if (children.length > 0 && + node.loc.start.column === children[0].loc.start.column) { + indents = 0; + } + + markChildren(node); + markPop(node, indents); + markPushAndCheck(node, indents); + }); + + file.iterateNodesByType('SwitchCase', function(node) { + if (!isMultiline(node)) { + return; + } + + var childrenProperty = indentableNodes[node.type]; + var children = node[childrenProperty]; + + if (children.length > 1 || + (children[0] && children[0].type !== 'BlockStatement')) { + markChildren(node); + markCasePop(node, children); + markPushAndCheck(node, 1); + } else if (children.length === 0) { + linesToCheck[node.loc.start.line - 1].push = 1; + linesToCheck[node.loc.start.line - 1].check = true; + markPop(node, 0); + } + }); + + // indentations inside of function expressions can be offset from + // either the start of the function or the end of the function, therefore + // mark all starting lines of functions as potential indentations + file.iterateNodesByType(['FunctionDeclaration', 'FunctionExpression'], function(node) { + linesToCheck[node.loc.start.line - 1].pushAltLine = node.loc.end.line - 1; + }); + + file.iterateNodesByType('VariableDeclaration', function(node) { + var startLine = node.loc.start.line - 1; + var decls = node.declarations; + var declStartLine = decls[0].loc.start.line - 1; + var actualIndents; + var newIndents; + + if (startLine !== declStartLine) { + return; + } + + if (linesToCheck[startLine].push !== null) { + actualIndents = getIndentationFromLine(startLine); + + if (decls.length > 1) { + newIndents = getIndentationFromLine(decls[1].loc.start.line - 1); + } else { + newIndents = getIndentationFromLine(decls[0].loc.end.line - 1); + } + linesToCheck[startLine].push = ((newIndents - actualIndents) / indentSize) + 1; + } + }); + } + + var _this = this; + + var indentableNodes = this._indentableNodes; + var indentChar = this._indentChar; + var indentSize = this._indentSize; + + var lines = commentHelper.getLinesWithCommentsRemoved(file, errors); + var indentStack = [0]; + var linesToCheck = lines.map(function() { + return { + push: null, + pushAltLine: null, + pop: null, + check: null, + extraPops: 0 + }; + }); + + generateIndentations(); + checkIndentations(); + } + +}; + +},{"../comment-helper":1,"assert":108}],99:[function(require,module,exports){ +var assert = require('assert'); + +module.exports = function() {}; + +module.exports.prototype = { + + configure: function(options) { + assert(typeof options === 'object', 'validateJSDoc option requires object value'); + this._options = options; + }, + + getOptionName: function() { + return 'validateJSDoc'; + }, + + check: function(file, errors) { + var options = this._options; + var comments = file.getComments(); + file.iterateNodesByType(['FunctionDeclaration', 'FunctionExpression'], function(node) { + var jsDoc = getJsDocForLine(node.loc.start.line); + if (jsDoc) { + var jsDocData = jsDoc.value; + var jsDocLines = jsDocData.split('\n'); + var paramIndex = 0; + if (options.checkParamNames || options.checkRedundantParams || options.requireParamTypes) { + for (var i = 0, l = jsDocLines.length; i < l; i++) { + var line = jsDocLines[i].trim(); + if (line.charAt(0) === '*') { + line = line.substr(1).trim(); + if (line.indexOf('@param') === 0) { + var match = line.match(/^@param\s+(?:{(.+?)})?\s*(?:\[)?([a-zA-Z0-9_\.\$]+)/); + if (match) { + var jsDocParamType = match[1]; + var jsDocParamName = match[2]; + if (options.requireParamTypes && !jsDocParamType) { + errors.add( + 'Missing JSDoc @param type', + jsDoc.loc.start.line + i, + jsDocLines[i].indexOf('@param') + ); + } + if (jsDocParamName.indexOf('.') === -1) { + var param = node.params[paramIndex]; + if (param) { + if (jsDocParamName !== param.name) { + if (options.checkParamNames) { + errors.add( + 'Invalid JSDoc @param argument name', + jsDoc.loc.start.line + i, + jsDocLines[i].indexOf('@param') + ); + } + } + } else { + if (options.checkRedundantParams) { + errors.add( + 'Redundant JSDoc @param', + jsDoc.loc.start.line + i, + jsDocLines[i].indexOf('@param') + ); + } + } + paramIndex++; + } + } else { + errors.add( + 'Invalid JSDoc @param', + jsDoc.loc.start.line + i, + jsDocLines[i].indexOf('@param') + ); + } + } + } + } + } + } + }); + + function getJsDocForLine(line) { + line--; + for (var i = 0, l = comments.length; i < l; i++) { + var comment = comments[i]; + if (comment.loc.end.line === line && comment.type === 'Block' && comment.value.charAt(0) === '*') { + return comment; + } + } + return null; + } + } + +}; + +},{"assert":108}],100:[function(require,module,exports){ +var assert = require('assert'); + +module.exports = function() {}; + +module.exports.prototype = { + + configure: function(options) { + assert( + typeof options === 'string' || typeof options === 'object', + 'validateLineBreaks option requires string or object value' + ); + + if (typeof options === 'string') { + options = { character: options }; + } + + var lineBreaks = { + CR: '\r', + LF: '\n', + CRLF: '\r\n' + }; + this._allowedLineBreak = lineBreaks[options.character]; + + this._reportOncePerFile = options.reportOncePerFile !== false; + }, + + getOptionName: function() { + return 'validateLineBreaks'; + }, + + check: function(file, errors) { + var lines = file.getLines(); + if (lines.length < 2) { + return; + } + + var lineBreaks = file.getSource().match(/\r\n|\r|\n/g); + for (var i = 0, len = lineBreaks.length; i < len; i++) { + if (lineBreaks[i] !== this._allowedLineBreak) { + errors.add('Invalid line break', i + 1, lines[i].length); + if (this._reportOncePerFile) { + break; + } + } + } + } + +}; + +},{"assert":108}],101:[function(require,module,exports){ +var assert = require('assert'); + +module.exports = function() {}; + +module.exports.prototype = { + + configure: function(validateParameterSeparator) { + assert( + typeof validateParameterSeparator === 'string' && /^[ ]?,[ ]?$/.test(validateParameterSeparator), + 'validateParameterSpacing option requires string value containing only a comma and optional spaces' + ); + + this._separator = validateParameterSeparator; + }, + + getOptionName: function() { + return 'validateParameterSeparator'; + }, + + check: function(file, errors) { + + var separators = this._separator.split(','); + var whitespaceBeforeComma = Boolean(separators.shift()); + var whitespaceAfterComma = Boolean(separators.pop()); + + file.iterateNodesByType(['FunctionDeclaration', 'FunctionExpression'], function(node) { + + node.params.forEach(function(paramNode) { + + var prevParamToken = file.getFirstNodeToken(paramNode); + var punctuatorToken = file.getNextToken(prevParamToken); + + if (punctuatorToken.value === ',') { + + if (whitespaceBeforeComma) { + errors.assert.whitespaceBetween({ + token: prevParamToken, + nextToken: punctuatorToken, + spaces: 1, + message: 'Missing space after function parameter \'' + prevParamToken.value + '\'' + }); + } else { + errors.assert.noWhitespaceBetween({ + token: prevParamToken, + nextToken: punctuatorToken, + message: 'Unexpected space after function parameter \'' + prevParamToken.value + '\'' + }); + } + + var nextParamToken = file.getNextToken(punctuatorToken); + + if (whitespaceAfterComma) { + errors.assert.whitespaceBetween({ + token: punctuatorToken, + nextToken: nextParamToken, + spaces: 1, + message: 'Missing space before function parameter \'' + nextParamToken.value + '\'' + }); + } else { + errors.assert.noWhitespaceBetween({ + token: punctuatorToken, + nextToken: nextParamToken, + message: 'Unexpected space before function parameter \'' + nextParamToken.value + '\'' + }); + } + } + }); + }); + } + +}; + +},{"assert":108}],102:[function(require,module,exports){ +var assert = require('assert'); + +module.exports = function() {}; + +module.exports.prototype = { + + configure: function(quoteMark) { + this._allowEscape = false; + + if (typeof quoteMark === 'object') { + assert( + typeof quoteMark.escape === 'boolean' && quoteMark.mark !== undefined, + 'validateQuoteMarks option requires the "escape" and "mark" property to be defined' + ); + this._allowEscape = quoteMark.escape; + quoteMark = quoteMark.mark; + } + + assert( + quoteMark === '"' || quoteMark === '\'' || quoteMark === true, + 'validateQuoteMarks option requires \'"\', "\'", or boolean true' + ); + + this._quoteMark = quoteMark; + }, + + getOptionName: function() { + return 'validateQuoteMarks'; + }, + + check: function(file, errors) { + var quoteMark = this._quoteMark; + var allowEscape = this._allowEscape; + var opposite = { + '"': '\'', + '\'': '"' + }; + + file.iterateTokensByType('String', function(token) { + var str = token.value; + var mark = str[0]; + var stripped = str.substring(1, str.length - 1); + + if (quoteMark === true) { + quoteMark = mark; + } + + if (mark !== quoteMark) { + if (allowEscape && stripped.indexOf(opposite[mark]) > -1) { + return; + } + + errors.add( + 'Invalid quote mark found', + token.loc.start.line, + token.loc.start.column + ); + } + }); + } + +}; + +},{"assert":108}],103:[function(require,module,exports){ +var defaultEsprima = require('esprima'); +var harmonyEsprima = require('esprima-harmony-jscs'); +var Errors = require('./errors'); +var JsFile = require('./js-file'); +var Configuration = require('./config/configuration'); + +/** + * Starts Code Style checking process. + * + * @name StringChecker + * @param {Boolean|Object} options either a boolean flag representing verbosity (deprecated), or an options object + * @param {Boolean} options.verbose true adds the rule name to the error messages it produces, false does not + * @param {Boolean} options.esnext true attempts to parse the code as es6, false does not + * @param {Object} options.esprima if provided, will be used to parse source code instead of the built-in esprima parser + */ +var StringChecker = function(options) { + this._configuredRules = []; + + this._errorsFound = 0; + this._maxErrorsExceeded = false; + + this._configuration = this._createConfiguration(); + this._configuration.registerDefaultPresets(); + + if (typeof options === 'boolean') { + this._verbose = options; + } else { + options = options || {}; + this._verbose = options.verbose || false; + this._esprima = options.esprima || (options.esnext ? harmonyEsprima : defaultEsprima); + } +}; + +StringChecker.prototype = { + /** + * Registers single Code Style checking rule. + * + * @param {Rule} rule + */ + registerRule: function(rule) { + this._configuration.registerRule(rule); + }, + + /** + * Registers built-in Code Style checking rules. + */ + registerDefaultRules: function() { + this._configuration.registerDefaultRules(); + }, + + /** + * Get processed config. + * + * @return {Object} + */ + getProcessedConfig: function() { + return this._configuration.getProcessedConfig(); + }, + + /** + * Loads configuration from JS Object. Activates and configures required rules. + * + * @param {Object} config + */ + configure: function(config) { + this._configuration.load(config); + + if (this._configuration.hasCustomEsprima()) { + this._esprima = this._configuration.getCustomEsprima(); + } else if (this._configuration.isESNextEnabled()) { + this._esprima = harmonyEsprima; + } + + this._configuredRules = this._configuration.getConfiguredRules(); + this._maxErrors = this._configuration.getMaxErrors(); + }, + + /** + * Checks file provided with a string. + * @param {String} str + * @param {String} filename + * @returns {Errors} + */ + checkString: function(str, filename) { + filename = filename || 'input'; + str = str.replace(/^#!?[^\n]+\n/gm, ''); + + var tree; + var parseError; + + try { + tree = this._esprima.parse(str, {loc: true, range: true, comment: true, tokens: true}); + } catch (e) { + parseError = e; + } + var file = new JsFile(filename, str, tree); + var errors = new Errors(file, this._verbose); + var errorFilter = this._configuration.getErrorFilter(); + + if (!this._maxErrorsExceeded) { + if (parseError) { + errors.setCurrentRule('parseError'); + errors.add(parseError.description, parseError.lineNumber, parseError.column); + + return errors; + } + + this._configuredRules.forEach(function(rule) { + errors.setCurrentRule(rule.getOptionName()); + rule.check(file, errors); + }, this); + + this._configuration.getUnsupportedRuleNames().forEach(function(rulename) { + errors.add('Unsupported rule: ' + rulename, 1, 0); + }); + + // sort errors list to show errors as they appear in source + errors.getErrorList().sort(function(a, b) { + return (a.line - b.line) || (a.column - b.column); + }); + + if (errorFilter) { + errors.filter(errorFilter); + } + + if (this._maxErrors !== null && !isNaN(this._maxErrors)) { + if (!this._maxErrorsExceeded) { + this._maxErrorsExceeded = this._errorsFound + errors.getErrorCount() > this._maxErrors; + } + errors.stripErrorList(Math.max(0, this._maxErrors - this._errorsFound)); + } + + this._errorsFound += errors.getErrorCount(); + } + + return errors; + }, + + /** + * Returns `true` if error count exceeded `maxErrors` option value. + * + * @returns {Boolean} + */ + maxErrorsExceeded: function() { + return this._maxErrorsExceeded; + }, + + /** + * Returns new configuration instance. + * + * @protected + * @returns {Configuration} + */ + _createConfiguration: function() { + return new Configuration(); + }, + + /** + * Returns current configuration instance. + * + * @returns {Configuration} + */ + getConfiguration: function() { + return this._configuration; + } +}; + +module.exports = StringChecker; + +},{"./config/configuration":2,"./errors":3,"./js-file":4,"esprima":127,"esprima-harmony-jscs":126}],104:[function(require,module,exports){ +var utils = require('util'); +var EventEmitter = require('events').EventEmitter; + +/** + * Token assertions class. + * + * @name {TokenAssert} + * @param {JsFile} file + */ +function TokenAssert(file) { + EventEmitter.call(this); + + this._file = file; +} + +utils.inherits(TokenAssert, EventEmitter); + +/** + * Requires to have whitespace between specified tokens. Ignores newlines. + * + * @param {Object} options.token + * @param {Object} options.nextToken + * @param {String} [options.message] + * @param {Number} [options.spaces] Amount of spaces between tokens. + */ +TokenAssert.prototype.whitespaceBetween = function(options) { + var token = options.token; + var nextToken = options.nextToken; + if (options.hasOwnProperty('spaces')) { + var spaces = options.spaces; + if (nextToken.loc.start.line === token.loc.end.line && + (nextToken.loc.start.column - token.loc.end.column) !== spaces + ) { + this.emit('error', { + message: options.message || + spaces + ' spaces required between ' + token.value + ' and ' + nextToken.value, + line: token.loc.end.line, + column: token.loc.end.column + }); + } + } else { + if (nextToken.range[0] === token.range[1]) { + this.emit('error', { + message: options.message || 'Missing space between ' + token.value + ' and ' + nextToken.value, + line: token.loc.end.line, + column: token.loc.end.column + }); + } + } +}; + +/** + * Requires to have no whitespace between specified tokens. + * + * @param {Object} options.token + * @param {Object} options.nextToken + * @param {String} [options.message] + * @param {Boolean} [options.disallowNewLine=false] + */ +TokenAssert.prototype.noWhitespaceBetween = function(options) { + var token = options.token; + var nextToken = options.nextToken; + if (nextToken.range[0] !== token.range[1] && + (options.disallowNewLine || token.loc.end.line === nextToken.loc.start.line) + ) { + this.emit('error', { + message: options.message || 'Unexpected whitespace between ' + token.value + ' and ' + nextToken.value, + line: token.loc.end.line, + column: token.loc.end.column + }); + } +}; + +/** + * Requires tokens to be on the same line. + * + * @param {Object} options.token + * @param {Object} options.nextToken + * @param {String} [options.message] + */ +TokenAssert.prototype.sameLine = function(options) { + var token = options.token; + var nextToken = options.nextToken; + if (token.loc.end.line !== nextToken.loc.start.line) { + this.emit('error', { + message: options.message || token.value + ' and ' + nextToken.value + ' should be on the same line', + line: token.loc.end.line, + column: token.loc.end.column + }); + } +}; + +/** + * Requires tokens to be on different lines. + * + * @param {Object} options.token + * @param {Object} options.nextToken + * @param {Object} [options.message] + */ +TokenAssert.prototype.differentLine = function(options) { + var token = options.token; + var nextToken = options.nextToken; + if (token.loc.end.line === nextToken.loc.start.line) { + this.emit('error', { + message: options.message || token.value + ' and ' + nextToken.value + ' should be on different lines', + line: token.loc.end.line, + column: token.loc.end.column + }); + } +}; + +/** + * Requires specific token before given. + * + * @param {Object} options.token + * @param {Object} options.expectedTokenBefore + * @param {String} [options.message] + */ +TokenAssert.prototype.tokenBefore = function(options) { + var token = options.token; + var actualTokenBefore = this._file.getPrevToken(token); + var expectedTokenBefore = options.expectedTokenBefore; + if ( + actualTokenBefore.type !== expectedTokenBefore.type || + actualTokenBefore.value !== expectedTokenBefore.value + ) { + var message = options.message; + if (!message) { + var showTypes = expectedTokenBefore.value === actualTokenBefore.value; + message = + expectedTokenBefore.value + (showTypes ? ' (' + expectedTokenBefore.type + ')' : '') + + ' was expected before ' + token.value + + ' but ' + actualTokenBefore.value + (showTypes ? ' (' + actualTokenBefore.type + ')' : '') + ' found'; + } + this.emit('error', { + message: message, + line: token.loc.start.line, + column: token.loc.start.column + }); + } +}; +/** + * Disallows specific token before given. + * + * @param {Object} options.token + * @param {Object} options.expectedTokenBefore + * @param {String} [options.message] + */ +TokenAssert.prototype.noTokenBefore = function(options) { + var token = options.token; + var actualTokenBefore = this._file.getPrevToken(token); + var expectedTokenBefore = options.expectedTokenBefore; + if (actualTokenBefore.type === expectedTokenBefore.type && + actualTokenBefore.value === expectedTokenBefore.value + ) { + this.emit('error', { + message: options.message || 'Illegal ' + expectedTokenBefore.value + ' was found before ' + token.value, + line: token.loc.start.line, + column: token.loc.start.column + }); + } +}; + +module.exports = TokenAssert; + +},{"events":109,"util":114}],105:[function(require,module,exports){ +/** + * Returns token by range start. Ignores () + * + * @param {JsFile} file + * @param {Number} range + * @param {Boolean} [backward=false] Direction + * @returns {Object|null} + */ +exports.getTokenByRangeStart = function(file, range, backward) { + var tokens = file.getTokens(); + + // get next token + var tokenPos = file.getTokenPosByRangeStart(range); + var token = tokens[tokenPos]; + + // if token is ")" -> get next token + // for example (a) + (b) + // next token ---^ + // we should find (a) + (b) + // ------------------^ + if (this.isTokenParenthesis(file, range, backward)) { + var pos = backward ? token.range[0] - 1 : token.range[1]; + tokenPos = file.getTokenPosByRangeStart(pos); + token = tokens[tokenPos]; + } + + return token || null; +}; + +/** + * Is next/previous token a parentheses? + * + * @param {JsFile} file + * @param {Number} range + * @param {Boolean} [backward=false] Direction + * @returns {Boolean} + */ +exports.isTokenParenthesis = function(file, range, backward) { + var tokens = file.getTokens(); + + // get next token + var tokenPos = file.getTokenPosByRangeStart(range); + var token = tokens[tokenPos]; + + // we should check for "(" if we go backward + var parenthesis = backward ? '(' : ')'; + + return token && token.type === 'Punctuator' && token.value === parenthesis; +}; + +/** + * Returns true if token is punctuator + * + * @param {Object} token + * @param {String} punctuator + * @returns {Boolean} + */ +exports.tokenIsPunctuator = function(token, punctuator) { + return token && token.type === 'Punctuator' && token.value === punctuator; +}; + +/** + * Find next/previous operator by range start + * + * @param {JsFile} file + * @param {Number} range + * @param {String} operator + * @param {Boolean} [backward=false] Direction + * @returns {Object|null} + */ +exports.findOperatorByRangeStart = function(file, range, operator, backward) { + var tokens = file.getTokens(); + var index = file.getTokenPosByRangeStart(range); + + while (tokens[ index ]) { + if (tokens[ index ].value === operator) { + return tokens[ index ]; + } + + if (backward) { + index--; + } else { + index++; + } + } + + return null; +}; + +/** + * Returns token or false if there is a punctuator in a given range + * + * @param {JsFile} file + * @param {Number} range + * @param {String} operator + * @param {Boolean} [backward=false] Direction + * @returns {Object|null} + */ +exports.getTokenByRangeStartIfPunctuator = function(file, range, operator, backward) { + var part = this.getTokenByRangeStart(file, range, backward); + + if (this.tokenIsPunctuator(part, operator)) { + return part; + } + + return null; +}; + +/** + * Get column for long entities + * @param {Number} column + * @param {Number} length + * @return {Number} + */ +exports.getPointerEntities = function(column, length) { + return column - 1 + Math.ceil(length / 2); +}; + +},{}],106:[function(require,module,exports){ +var estraverse = require('estraverse'); + +module.exports = { + iterate: iterate +}; + +function iterate(node, cb) { + if ('type' in node) { + estraverse.traverse(node, { + enter: function(node, parent) { + var parentCollection = []; + + // parentCollection support + var path = this.path(); + if (path) { + var collectionKey; + while (path.length > 0) { + var pathElement = path.pop(); + if (typeof pathElement === 'string') { + collectionKey = pathElement; + } + } + + parentCollection = parent[collectionKey]; + if (!Array.isArray(parentCollection)) { + parentCollection = [parentCollection]; + } + } + + if (cb(node, parent, parentCollection) === false) { + return estraverse.VisitorOption.Skip; + } + }, + keys: { + XJSIdentifier: [], + XJSNamespacedName: ['namespace', 'name'], + XJSMemberExpression: ['object', 'property'], + XJSEmptyExpression: [], + XJSExpressionContainer: ['expression'], + XJSElement: ['openingElement', 'closingElement', 'children'], + XJSClosingElement: ['name'], + XJSOpeningElement: ['name', 'attributes'], + XJSAttribute: ['name', 'value'], + XJSSpreadAttribute: ['argument'], + XJSText: null + } + }); + } +} + +},{"estraverse":128}],107:[function(require,module,exports){ +// 7.5.2 Keywords +var ES3_KEYWORDS = { + 'break': true, + 'case': true, + 'catch': true, + 'continue': true, + 'default': true, + 'delete': true, + 'do': true, + 'else': true, + 'finally': true, + 'for': true, + 'function': true, + 'if': true, + 'in': true, + 'instanceof': true, + 'new': true, + 'null': true, + 'return': true, + 'switch': true, + 'this': true, + 'throw': true, + 'try': true, + 'typeof': true, + 'var': true, + 'void': true, + 'while': true, + 'with': true +}; + +// 7.5.3 Future Reserved Words +var ES3_FUTURE_RESERVED_WORDS = { + 'abstract': true, + 'boolean': true, + 'byte': true, + 'char': true, + 'class': true, + 'const': true, + 'debugger': true, + 'double': true, + 'enum': true, + 'export': true, + 'extends': true, + 'final': true, + 'float': true, + 'goto': true, + 'implements': true, + 'import': true, + 'int': true, + 'interface': true, + 'long': true, + 'native': true, + 'package': true, + 'private': true, + 'protected': true, + 'public': true, + 'short': true, + 'static': true, + 'super': true, + 'synchronized': true, + 'throws': true, + 'transient': true, + 'volatile': true +}; + +var IDENTIFIER_NAME_RE = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/; + +/** + * All keywords where spaces are a stylistic choice + * @type {Array} + */ +exports.spacedKeywords = [ + 'do', + 'for', + 'if', + 'else', + 'switch', + 'case', + 'try', + 'catch', + 'finally', + 'void', + 'while', + 'with', + 'return', + 'typeof', + 'function' +]; + +/** + * All keywords where curly braces are a stylistic choice + * @type {Array} + */ +exports.curlyBracedKeywords = [ + 'if', + 'else', + 'for', + 'while', + 'do', + 'case', + 'default', + 'with' +]; + +/** + * Returns true if word is keyword in ECMAScript 3 specification. + * + * @param {String} word + * @returns {Boolean} + */ +exports.isEs3Keyword = function(word) { + return Boolean(ES3_KEYWORDS[word]); +}; + +/** + * Returns true if word is future reserved word in ECMAScript 3 specification. + * + * @param {String} word + * @returns {Boolean} + */ +exports.isEs3FutureReservedWord = function(word) { + return Boolean(ES3_FUTURE_RESERVED_WORDS[word]); +}; + +/** + * Returns true if name is valid identifier name. + * + * @param {String} name + * @returns {Boolean} + */ +exports.isValidIdentifierName = function(name) { + return IDENTIFIER_NAME_RE.test(name); +}; + +/** + * All possible binary operators supported by JSCS + * @type {Array} + */ +exports.binaryOperators = [ + + // assignment operators + '=', '+=', '-=', '*=', '/=', '%=', '<<=', '>>=', '>>>=', + '&=', '|=', '^=', + + '+', '-', '*', '/', '%', '<<', '>>', '>>>', '&', + '|', '^', '&&', '||', '===', '==', '>=', + '<=', '<', '>', '!=', '!==', + + ',' +]; + +/** + * Increment and decrement operators + * @type {Array} + */ +exports.incrementAndDecrementOperators = ['++', '--']; + +/** + * All possible unary operators supported by JSCS + * @type {Array} + */ +exports.unaryOperators = ['-', '+', '!', '~'].concat(exports.incrementAndDecrementOperators); + +/** + * All possible operators support by JSCS + * @type {Array} + */ +exports.operators = exports.binaryOperators.concat(exports.unaryOperators); + +},{}],108:[function(require,module,exports){ +// http://wiki.commonjs.org/wiki/Unit_Testing/1.0 +// +// THIS IS NOT TESTED NOR LIKELY TO WORK OUTSIDE V8! +// +// Originally from narwhal.js (http://narwhaljs.org) +// Copyright (c) 2009 Thomas Robinson <280north.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 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. + +// when used in node, this will actually load the util module we depend on +// versus loading the builtin util module as happens otherwise +// this is a bug in node module loading as far as I am concerned +var util = require('util/'); + +var pSlice = Array.prototype.slice; +var hasOwn = Object.prototype.hasOwnProperty; + +// 1. The assert module provides functions that throw +// AssertionError's when particular conditions are not met. The +// assert module must conform to the following interface. + +var assert = module.exports = ok; + +// 2. The AssertionError is defined in assert. +// new assert.AssertionError({ message: message, +// actual: actual, +// expected: expected }) + +assert.AssertionError = function AssertionError(options) { + this.name = 'AssertionError'; + this.actual = options.actual; + this.expected = options.expected; + this.operator = options.operator; + if (options.message) { + this.message = options.message; + this.generatedMessage = false; + } else { + this.message = getMessage(this); + this.generatedMessage = true; + } + var stackStartFunction = options.stackStartFunction || fail; + + if (Error.captureStackTrace) { + Error.captureStackTrace(this, stackStartFunction); + } + else { + // non v8 browsers so we can have a stacktrace + var err = new Error(); + if (err.stack) { + var out = err.stack; + + // try to strip useless frames + var fn_name = stackStartFunction.name; + var idx = out.indexOf('\n' + fn_name); + if (idx >= 0) { + // once we have located the function frame + // we need to strip out everything before it (and its line) + var next_line = out.indexOf('\n', idx + 1); + out = out.substring(next_line + 1); + } + + this.stack = out; + } + } +}; + +// assert.AssertionError instanceof Error +util.inherits(assert.AssertionError, Error); + +function replacer(key, value) { + if (util.isUndefined(value)) { + return '' + value; + } + if (util.isNumber(value) && (isNaN(value) || !isFinite(value))) { + return value.toString(); + } + if (util.isFunction(value) || util.isRegExp(value)) { + return value.toString(); + } + return value; +} + +function truncate(s, n) { + if (util.isString(s)) { + return s.length < n ? s : s.slice(0, n); + } else { + return s; + } +} + +function getMessage(self) { + return truncate(JSON.stringify(self.actual, replacer), 128) + ' ' + + self.operator + ' ' + + truncate(JSON.stringify(self.expected, replacer), 128); +} + +// At present only the three keys mentioned above are used and +// understood by the spec. Implementations or sub modules can pass +// other keys to the AssertionError's constructor - they will be +// ignored. + +// 3. All of the following functions must throw an AssertionError +// when a corresponding condition is not met, with a message that +// may be undefined if not provided. All assertion methods provide +// both the actual and expected values to the assertion error for +// display purposes. + +function fail(actual, expected, message, operator, stackStartFunction) { + throw new assert.AssertionError({ + message: message, + actual: actual, + expected: expected, + operator: operator, + stackStartFunction: stackStartFunction + }); +} + +// EXTENSION! allows for well behaved errors defined elsewhere. +assert.fail = fail; + +// 4. Pure assertion tests whether a value is truthy, as determined +// by !!guard. +// assert.ok(guard, message_opt); +// This statement is equivalent to assert.equal(true, !!guard, +// message_opt);. To test strictly for the value true, use +// assert.strictEqual(true, guard, message_opt);. + +function ok(value, message) { + if (!value) fail(value, true, message, '==', assert.ok); +} +assert.ok = ok; + +// 5. The equality assertion tests shallow, coercive equality with +// ==. +// assert.equal(actual, expected, message_opt); + +assert.equal = function equal(actual, expected, message) { + if (actual != expected) fail(actual, expected, message, '==', assert.equal); +}; + +// 6. The non-equality assertion tests for whether two objects are not equal +// with != assert.notEqual(actual, expected, message_opt); + +assert.notEqual = function notEqual(actual, expected, message) { + if (actual == expected) { + fail(actual, expected, message, '!=', assert.notEqual); + } +}; + +// 7. The equivalence assertion tests a deep equality relation. +// assert.deepEqual(actual, expected, message_opt); + +assert.deepEqual = function deepEqual(actual, expected, message) { + if (!_deepEqual(actual, expected)) { + fail(actual, expected, message, 'deepEqual', assert.deepEqual); + } +}; + +function _deepEqual(actual, expected) { + // 7.1. All identical values are equivalent, as determined by ===. + if (actual === expected) { + return true; + + } else if (util.isBuffer(actual) && util.isBuffer(expected)) { + if (actual.length != expected.length) return false; + + for (var i = 0; i < actual.length; i++) { + if (actual[i] !== expected[i]) return false; + } + + return true; + + // 7.2. If the expected value is a Date object, the actual value is + // equivalent if it is also a Date object that refers to the same time. + } else if (util.isDate(actual) && util.isDate(expected)) { + return actual.getTime() === expected.getTime(); + + // 7.3 If the expected value is a RegExp object, the actual value is + // equivalent if it is also a RegExp object with the same source and + // properties (`global`, `multiline`, `lastIndex`, `ignoreCase`). + } else if (util.isRegExp(actual) && util.isRegExp(expected)) { + return actual.source === expected.source && + actual.global === expected.global && + actual.multiline === expected.multiline && + actual.lastIndex === expected.lastIndex && + actual.ignoreCase === expected.ignoreCase; + + // 7.4. Other pairs that do not both pass typeof value == 'object', + // equivalence is determined by ==. + } else if (!util.isObject(actual) && !util.isObject(expected)) { + return actual == expected; + + // 7.5 For all other Object pairs, including Array objects, equivalence is + // determined by having the same number of owned properties (as verified + // with Object.prototype.hasOwnProperty.call), the same set of keys + // (although not necessarily the same order), equivalent values for every + // corresponding key, and an identical 'prototype' property. Note: this + // accounts for both named and indexed properties on Arrays. + } else { + return objEquiv(actual, expected); + } +} + +function isArguments(object) { + return Object.prototype.toString.call(object) == '[object Arguments]'; +} + +function objEquiv(a, b) { + if (util.isNullOrUndefined(a) || util.isNullOrUndefined(b)) + return false; + // an identical 'prototype' property. + if (a.prototype !== b.prototype) return false; + //~~~I've managed to break Object.keys through screwy arguments passing. + // Converting to array solves the problem. + if (isArguments(a)) { + if (!isArguments(b)) { + return false; + } + a = pSlice.call(a); + b = pSlice.call(b); + return _deepEqual(a, b); + } + try { + var ka = objectKeys(a), + kb = objectKeys(b), + key, i; + } catch (e) {//happens when one is a string literal and the other isn't + return false; + } + // having the same number of owned properties (keys incorporates + // hasOwnProperty) + if (ka.length != kb.length) + return false; + //the same set of keys (although not necessarily the same order), + ka.sort(); + kb.sort(); + //~~~cheap key test + for (i = ka.length - 1; i >= 0; i--) { + if (ka[i] != kb[i]) + return false; + } + //equivalent values for every corresponding key, and + //~~~possibly expensive deep test + for (i = ka.length - 1; i >= 0; i--) { + key = ka[i]; + if (!_deepEqual(a[key], b[key])) return false; + } + return true; +} + +// 8. The non-equivalence assertion tests for any deep inequality. +// assert.notDeepEqual(actual, expected, message_opt); + +assert.notDeepEqual = function notDeepEqual(actual, expected, message) { + if (_deepEqual(actual, expected)) { + fail(actual, expected, message, 'notDeepEqual', assert.notDeepEqual); + } +}; + +// 9. The strict equality assertion tests strict equality, as determined by ===. +// assert.strictEqual(actual, expected, message_opt); + +assert.strictEqual = function strictEqual(actual, expected, message) { + if (actual !== expected) { + fail(actual, expected, message, '===', assert.strictEqual); + } +}; + +// 10. The strict non-equality assertion tests for strict inequality, as +// determined by !==. assert.notStrictEqual(actual, expected, message_opt); + +assert.notStrictEqual = function notStrictEqual(actual, expected, message) { + if (actual === expected) { + fail(actual, expected, message, '!==', assert.notStrictEqual); + } +}; + +function expectedException(actual, expected) { + if (!actual || !expected) { + return false; + } + + if (Object.prototype.toString.call(expected) == '[object RegExp]') { + return expected.test(actual); + } else if (actual instanceof expected) { + return true; + } else if (expected.call({}, actual) === true) { + return true; + } + + return false; +} + +function _throws(shouldThrow, block, expected, message) { + var actual; + + if (util.isString(expected)) { + message = expected; + expected = null; + } + + try { + block(); + } catch (e) { + actual = e; + } + + message = (expected && expected.name ? ' (' + expected.name + ').' : '.') + + (message ? ' ' + message : '.'); + + if (shouldThrow && !actual) { + fail(actual, expected, 'Missing expected exception' + message); + } + + if (!shouldThrow && expectedException(actual, expected)) { + fail(actual, expected, 'Got unwanted exception' + message); + } + + if ((shouldThrow && actual && expected && + !expectedException(actual, expected)) || (!shouldThrow && actual)) { + throw actual; + } +} + +// 11. Expected to throw an error: +// assert.throws(block, Error_opt, message_opt); + +assert.throws = function(block, /*optional*/error, /*optional*/message) { + _throws.apply(this, [true].concat(pSlice.call(arguments))); +}; + +// EXTENSION! This is annoying to write outside this module. +assert.doesNotThrow = function(block, /*optional*/message) { + _throws.apply(this, [false].concat(pSlice.call(arguments))); +}; + +assert.ifError = function(err) { if (err) {throw err;}}; + +var objectKeys = Object.keys || function (obj) { + var keys = []; + for (var key in obj) { + if (hasOwn.call(obj, key)) keys.push(key); + } + return keys; +}; + +},{"util/":114}],109:[function(require,module,exports){ +// Copyright Joyent, Inc. and other Node contributors. +// +// 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. + +function EventEmitter() { + this._events = this._events || {}; + this._maxListeners = this._maxListeners || undefined; +} +module.exports = EventEmitter; + +// Backwards-compat with node 0.10.x +EventEmitter.EventEmitter = EventEmitter; + +EventEmitter.prototype._events = undefined; +EventEmitter.prototype._maxListeners = undefined; + +// By default EventEmitters will print a warning if more than 10 listeners are +// added to it. This is a useful default which helps finding memory leaks. +EventEmitter.defaultMaxListeners = 10; + +// Obviously not all Emitters should be limited to 10. This function allows +// that to be increased. Set to zero for unlimited. +EventEmitter.prototype.setMaxListeners = function(n) { + if (!isNumber(n) || n < 0 || isNaN(n)) + throw TypeError('n must be a positive number'); + this._maxListeners = n; + return this; +}; + +EventEmitter.prototype.emit = function(type) { + var er, handler, len, args, i, listeners; + + if (!this._events) + this._events = {}; + + // If there is no 'error' event listener then throw. + if (type === 'error') { + if (!this._events.error || + (isObject(this._events.error) && !this._events.error.length)) { + er = arguments[1]; + if (er instanceof Error) { + throw er; // Unhandled 'error' event + } + throw TypeError('Uncaught, unspecified "error" event.'); + } + } + + handler = this._events[type]; + + if (isUndefined(handler)) + return false; + + if (isFunction(handler)) { + switch (arguments.length) { + // fast cases + case 1: + handler.call(this); + break; + case 2: + handler.call(this, arguments[1]); + break; + case 3: + handler.call(this, arguments[1], arguments[2]); + break; + // slower + default: + len = arguments.length; + args = new Array(len - 1); + for (i = 1; i < len; i++) + args[i - 1] = arguments[i]; + handler.apply(this, args); + } + } else if (isObject(handler)) { + len = arguments.length; + args = new Array(len - 1); + for (i = 1; i < len; i++) + args[i - 1] = arguments[i]; + + listeners = handler.slice(); + len = listeners.length; + for (i = 0; i < len; i++) + listeners[i].apply(this, args); + } + + return true; +}; + +EventEmitter.prototype.addListener = function(type, listener) { + var m; + + if (!isFunction(listener)) + throw TypeError('listener must be a function'); + + if (!this._events) + this._events = {}; + + // To avoid recursion in the case that type === "newListener"! Before + // adding it to the listeners, first emit "newListener". + if (this._events.newListener) + this.emit('newListener', type, + isFunction(listener.listener) ? + listener.listener : listener); + + if (!this._events[type]) + // Optimize the case of one listener. Don't need the extra array object. + this._events[type] = listener; + else if (isObject(this._events[type])) + // If we've already got an array, just append. + this._events[type].push(listener); + else + // Adding the second element, need to change to array. + this._events[type] = [this._events[type], listener]; + + // Check for listener leak + if (isObject(this._events[type]) && !this._events[type].warned) { + var m; + if (!isUndefined(this._maxListeners)) { + m = this._maxListeners; + } else { + m = EventEmitter.defaultMaxListeners; + } + + if (m && m > 0 && this._events[type].length > m) { + this._events[type].warned = true; + console.error('(node) warning: possible EventEmitter memory ' + + 'leak detected. %d listeners added. ' + + 'Use emitter.setMaxListeners() to increase limit.', + this._events[type].length); + if (typeof console.trace === 'function') { + // not supported in IE 10 + console.trace(); + } + } + } + + return this; +}; + +EventEmitter.prototype.on = EventEmitter.prototype.addListener; + +EventEmitter.prototype.once = function(type, listener) { + if (!isFunction(listener)) + throw TypeError('listener must be a function'); + + var fired = false; + + function g() { + this.removeListener(type, g); + + if (!fired) { + fired = true; + listener.apply(this, arguments); + } + } + + g.listener = listener; + this.on(type, g); + + return this; +}; + +// emits a 'removeListener' event iff the listener was removed +EventEmitter.prototype.removeListener = function(type, listener) { + var list, position, length, i; + + if (!isFunction(listener)) + throw TypeError('listener must be a function'); + + if (!this._events || !this._events[type]) + return this; + + list = this._events[type]; + length = list.length; + position = -1; + + if (list === listener || + (isFunction(list.listener) && list.listener === listener)) { + delete this._events[type]; + if (this._events.removeListener) + this.emit('removeListener', type, listener); + + } else if (isObject(list)) { + for (i = length; i-- > 0;) { + if (list[i] === listener || + (list[i].listener && list[i].listener === listener)) { + position = i; + break; + } + } + + if (position < 0) + return this; + + if (list.length === 1) { + list.length = 0; + delete this._events[type]; + } else { + list.splice(position, 1); + } + + if (this._events.removeListener) + this.emit('removeListener', type, listener); + } + + return this; +}; + +EventEmitter.prototype.removeAllListeners = function(type) { + var key, listeners; + + if (!this._events) + return this; + + // not listening for removeListener, no need to emit + if (!this._events.removeListener) { + if (arguments.length === 0) + this._events = {}; + else if (this._events[type]) + delete this._events[type]; + return this; + } + + // emit removeListener for all listeners on all events + if (arguments.length === 0) { + for (key in this._events) { + if (key === 'removeListener') continue; + this.removeAllListeners(key); + } + this.removeAllListeners('removeListener'); + this._events = {}; + return this; + } + + listeners = this._events[type]; + + if (isFunction(listeners)) { + this.removeListener(type, listeners); + } else { + // LIFO order + while (listeners.length) + this.removeListener(type, listeners[listeners.length - 1]); + } + delete this._events[type]; + + return this; +}; + +EventEmitter.prototype.listeners = function(type) { + var ret; + if (!this._events || !this._events[type]) + ret = []; + else if (isFunction(this._events[type])) + ret = [this._events[type]]; + else + ret = this._events[type].slice(); + return ret; +}; + +EventEmitter.listenerCount = function(emitter, type) { + var ret; + if (!emitter._events || !emitter._events[type]) + ret = 0; + else if (isFunction(emitter._events[type])) + ret = 1; + else + ret = emitter._events[type].length; + return ret; +}; + +function isFunction(arg) { + return typeof arg === 'function'; +} + +function isNumber(arg) { + return typeof arg === 'number'; +} + +function isObject(arg) { + return typeof arg === 'object' && arg !== null; +} + +function isUndefined(arg) { + return arg === void 0; +} + +},{}],110:[function(require,module,exports){ +if (typeof Object.create === 'function') { + // implementation from standard node.js 'util' module + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }); + }; +} else { + // old school shim for old browsers + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + var TempCtor = function () {} + TempCtor.prototype = superCtor.prototype + ctor.prototype = new TempCtor() + ctor.prototype.constructor = ctor + } +} + +},{}],111:[function(require,module,exports){ +(function (process){ +// Copyright Joyent, Inc. and other Node contributors. +// +// 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. + +// resolves . and .. elements in a path array with directory names there +// must be no slashes, empty elements, or device names (c:\) in the array +// (so also no leading and trailing slashes - it does not distinguish +// relative and absolute paths) +function normalizeArray(parts, allowAboveRoot) { + // if the path tries to go above the root, `up` ends up > 0 + var up = 0; + for (var i = parts.length - 1; i >= 0; i--) { + var last = parts[i]; + if (last === '.') { + parts.splice(i, 1); + } else if (last === '..') { + parts.splice(i, 1); + up++; + } else if (up) { + parts.splice(i, 1); + up--; + } + } + + // if the path is allowed to go above the root, restore leading ..s + if (allowAboveRoot) { + for (; up--; up) { + parts.unshift('..'); + } + } + + return parts; +} + +// Split a filename into [root, dir, basename, ext], unix version +// 'root' is just a slash, or nothing. +var splitPathRe = + /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/; +var splitPath = function(filename) { + return splitPathRe.exec(filename).slice(1); +}; + +// path.resolve([from ...], to) +// posix version +exports.resolve = function() { + var resolvedPath = '', + resolvedAbsolute = false; + + for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) { + var path = (i >= 0) ? arguments[i] : process.cwd(); + + // Skip empty and invalid entries + if (typeof path !== 'string') { + throw new TypeError('Arguments to path.resolve must be strings'); + } else if (!path) { + continue; + } + + resolvedPath = path + '/' + resolvedPath; + resolvedAbsolute = path.charAt(0) === '/'; + } + + // At this point the path should be resolved to a full absolute path, but + // handle relative paths to be safe (might happen when process.cwd() fails) + + // Normalize the path + resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) { + return !!p; + }), !resolvedAbsolute).join('/'); + + return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.'; +}; + +// path.normalize(path) +// posix version +exports.normalize = function(path) { + var isAbsolute = exports.isAbsolute(path), + trailingSlash = substr(path, -1) === '/'; + + // Normalize the path + path = normalizeArray(filter(path.split('/'), function(p) { + return !!p; + }), !isAbsolute).join('/'); + + if (!path && !isAbsolute) { + path = '.'; + } + if (path && trailingSlash) { + path += '/'; + } + + return (isAbsolute ? '/' : '') + path; +}; + +// posix version +exports.isAbsolute = function(path) { + return path.charAt(0) === '/'; +}; + +// posix version +exports.join = function() { + var paths = Array.prototype.slice.call(arguments, 0); + return exports.normalize(filter(paths, function(p, index) { + if (typeof p !== 'string') { + throw new TypeError('Arguments to path.join must be strings'); + } + return p; + }).join('/')); +}; + + +// path.relative(from, to) +// posix version +exports.relative = function(from, to) { + from = exports.resolve(from).substr(1); + to = exports.resolve(to).substr(1); + + function trim(arr) { + var start = 0; + for (; start < arr.length; start++) { + if (arr[start] !== '') break; + } + + var end = arr.length - 1; + for (; end >= 0; end--) { + if (arr[end] !== '') break; + } + + if (start > end) return []; + return arr.slice(start, end - start + 1); + } + + var fromParts = trim(from.split('/')); + var toParts = trim(to.split('/')); + + var length = Math.min(fromParts.length, toParts.length); + var samePartsLength = length; + for (var i = 0; i < length; i++) { + if (fromParts[i] !== toParts[i]) { + samePartsLength = i; + break; + } + } + + var outputParts = []; + for (var i = samePartsLength; i < fromParts.length; i++) { + outputParts.push('..'); + } + + outputParts = outputParts.concat(toParts.slice(samePartsLength)); + + return outputParts.join('/'); +}; + +exports.sep = '/'; +exports.delimiter = ':'; + +exports.dirname = function(path) { + var result = splitPath(path), + root = result[0], + dir = result[1]; + + if (!root && !dir) { + // No dirname whatsoever + return '.'; + } + + if (dir) { + // It has a dirname, strip trailing slash + dir = dir.substr(0, dir.length - 1); + } + + return root + dir; +}; + + +exports.basename = function(path, ext) { + var f = splitPath(path)[2]; + // TODO: make this comparison case-insensitive on windows? + if (ext && f.substr(-1 * ext.length) === ext) { + f = f.substr(0, f.length - ext.length); + } + return f; +}; + + +exports.extname = function(path) { + return splitPath(path)[3]; +}; + +function filter (xs, f) { + if (xs.filter) return xs.filter(f); + var res = []; + for (var i = 0; i < xs.length; i++) { + if (f(xs[i], i, xs)) res.push(xs[i]); + } + return res; +} + +// String.prototype.substr - negative index don't work in IE8 +var substr = 'ab'.substr(-1) === 'b' + ? function (str, start, len) { return str.substr(start, len) } + : function (str, start, len) { + if (start < 0) start = str.length + start; + return str.substr(start, len); + } +; + +}).call(this,require('_process')) +},{"_process":112}],112:[function(require,module,exports){ +// shim for using process in browser + +var process = module.exports = {}; + +process.nextTick = (function () { + var canSetImmediate = typeof window !== 'undefined' + && window.setImmediate; + var canMutationObserver = typeof window !== 'undefined' + && window.MutationObserver; + var canPost = typeof window !== 'undefined' + && window.postMessage && window.addEventListener + ; + + if (canSetImmediate) { + return function (f) { return window.setImmediate(f) }; + } + + var queue = []; + + if (canMutationObserver) { + var hiddenDiv = document.createElement("div"); + var observer = new MutationObserver(function () { + var queueList = queue.slice(); + queue.length = 0; + queueList.forEach(function (fn) { + fn(); + }); + }); + + observer.observe(hiddenDiv, { attributes: true }); + + return function nextTick(fn) { + if (!queue.length) { + hiddenDiv.setAttribute('yes', 'no'); + } + queue.push(fn); + }; + } + + if (canPost) { + window.addEventListener('message', function (ev) { + var source = ev.source; + if ((source === window || source === null) && ev.data === 'process-tick') { + ev.stopPropagation(); + if (queue.length > 0) { + var fn = queue.shift(); + fn(); + } + } + }, true); + + return function nextTick(fn) { + queue.push(fn); + window.postMessage('process-tick', '*'); + }; + } + + return function nextTick(fn) { + setTimeout(fn, 0); + }; +})(); + +process.title = 'browser'; +process.browser = true; +process.env = {}; +process.argv = []; + +function noop() {} + +process.on = noop; +process.addListener = noop; +process.once = noop; +process.off = noop; +process.removeListener = noop; +process.removeAllListeners = noop; +process.emit = noop; + +process.binding = function (name) { + throw new Error('process.binding is not supported'); +}; + +// TODO(shtylman) +process.cwd = function () { return '/' }; +process.chdir = function (dir) { + throw new Error('process.chdir is not supported'); +}; + +},{}],113:[function(require,module,exports){ +module.exports = function isBuffer(arg) { + return arg && typeof arg === 'object' + && typeof arg.copy === 'function' + && typeof arg.fill === 'function' + && typeof arg.readUInt8 === 'function'; +} +},{}],114:[function(require,module,exports){ +(function (process,global){ +// Copyright Joyent, Inc. and other Node contributors. +// +// 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. + +var formatRegExp = /%[sdj%]/g; +exports.format = function(f) { + if (!isString(f)) { + var objects = []; + for (var i = 0; i < arguments.length; i++) { + objects.push(inspect(arguments[i])); + } + return objects.join(' '); + } + + var i = 1; + var args = arguments; + var len = args.length; + var str = String(f).replace(formatRegExp, function(x) { + if (x === '%%') return '%'; + if (i >= len) return x; + switch (x) { + case '%s': return String(args[i++]); + case '%d': return Number(args[i++]); + case '%j': + try { + return JSON.stringify(args[i++]); + } catch (_) { + return '[Circular]'; + } + default: + return x; + } + }); + for (var x = args[i]; i < len; x = args[++i]) { + if (isNull(x) || !isObject(x)) { + str += ' ' + x; + } else { + str += ' ' + inspect(x); + } + } + return str; +}; + + +// Mark that a method should not be used. +// Returns a modified function which warns once by default. +// If --no-deprecation is set, then it is a no-op. +exports.deprecate = function(fn, msg) { + // Allow for deprecating things in the process of starting up. + if (isUndefined(global.process)) { + return function() { + return exports.deprecate(fn, msg).apply(this, arguments); + }; + } + + if (process.noDeprecation === true) { + return fn; + } + + var warned = false; + function deprecated() { + if (!warned) { + if (process.throwDeprecation) { + throw new Error(msg); + } else if (process.traceDeprecation) { + console.trace(msg); + } else { + console.error(msg); + } + warned = true; + } + return fn.apply(this, arguments); + } + + return deprecated; +}; + + +var debugs = {}; +var debugEnviron; +exports.debuglog = function(set) { + if (isUndefined(debugEnviron)) + debugEnviron = process.env.NODE_DEBUG || ''; + set = set.toUpperCase(); + if (!debugs[set]) { + if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) { + var pid = process.pid; + debugs[set] = function() { + var msg = exports.format.apply(exports, arguments); + console.error('%s %d: %s', set, pid, msg); + }; + } else { + debugs[set] = function() {}; + } + } + return debugs[set]; +}; + + +/** + * Echos the value of a value. Trys to print the value out + * in the best way possible given the different types. + * + * @param {Object} obj The object to print out. + * @param {Object} opts Optional options object that alters the output. + */ +/* legacy: obj, showHidden, depth, colors*/ +function inspect(obj, opts) { + // default options + var ctx = { + seen: [], + stylize: stylizeNoColor + }; + // legacy... + if (arguments.length >= 3) ctx.depth = arguments[2]; + if (arguments.length >= 4) ctx.colors = arguments[3]; + if (isBoolean(opts)) { + // legacy... + ctx.showHidden = opts; + } else if (opts) { + // got an "options" object + exports._extend(ctx, opts); + } + // set default options + if (isUndefined(ctx.showHidden)) ctx.showHidden = false; + if (isUndefined(ctx.depth)) ctx.depth = 2; + if (isUndefined(ctx.colors)) ctx.colors = false; + if (isUndefined(ctx.customInspect)) ctx.customInspect = true; + if (ctx.colors) ctx.stylize = stylizeWithColor; + return formatValue(ctx, obj, ctx.depth); +} +exports.inspect = inspect; + + +// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics +inspect.colors = { + 'bold' : [1, 22], + 'italic' : [3, 23], + 'underline' : [4, 24], + 'inverse' : [7, 27], + 'white' : [37, 39], + 'grey' : [90, 39], + 'black' : [30, 39], + 'blue' : [34, 39], + 'cyan' : [36, 39], + 'green' : [32, 39], + 'magenta' : [35, 39], + 'red' : [31, 39], + 'yellow' : [33, 39] +}; + +// Don't use 'blue' not visible on cmd.exe +inspect.styles = { + 'special': 'cyan', + 'number': 'yellow', + 'boolean': 'yellow', + 'undefined': 'grey', + 'null': 'bold', + 'string': 'green', + 'date': 'magenta', + // "name": intentionally not styling + 'regexp': 'red' +}; + + +function stylizeWithColor(str, styleType) { + var style = inspect.styles[styleType]; + + if (style) { + return '\u001b[' + inspect.colors[style][0] + 'm' + str + + '\u001b[' + inspect.colors[style][1] + 'm'; + } else { + return str; + } +} + + +function stylizeNoColor(str, styleType) { + return str; +} + + +function arrayToHash(array) { + var hash = {}; + + array.forEach(function(val, idx) { + hash[val] = true; + }); + + return hash; +} + + +function formatValue(ctx, value, recurseTimes) { + // Provide a hook for user-specified inspect functions. + // Check that value is an object with an inspect function on it + if (ctx.customInspect && + value && + isFunction(value.inspect) && + // Filter out the util module, it's inspect function is special + value.inspect !== exports.inspect && + // Also filter out any prototype objects using the circular check. + !(value.constructor && value.constructor.prototype === value)) { + var ret = value.inspect(recurseTimes, ctx); + if (!isString(ret)) { + ret = formatValue(ctx, ret, recurseTimes); + } + return ret; + } + + // Primitive types cannot have properties + var primitive = formatPrimitive(ctx, value); + if (primitive) { + return primitive; + } + + // Look up the keys of the object. + var keys = Object.keys(value); + var visibleKeys = arrayToHash(keys); + + if (ctx.showHidden) { + keys = Object.getOwnPropertyNames(value); + } + + // IE doesn't make error fields non-enumerable + // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx + if (isError(value) + && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) { + return formatError(value); + } + + // Some type of object without properties can be shortcutted. + if (keys.length === 0) { + if (isFunction(value)) { + var name = value.name ? ': ' + value.name : ''; + return ctx.stylize('[Function' + name + ']', 'special'); + } + if (isRegExp(value)) { + return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); + } + if (isDate(value)) { + return ctx.stylize(Date.prototype.toString.call(value), 'date'); + } + if (isError(value)) { + return formatError(value); + } + } + + var base = '', array = false, braces = ['{', '}']; + + // Make Array say that they are Array + if (isArray(value)) { + array = true; + braces = ['[', ']']; + } + + // Make functions say that they are functions + if (isFunction(value)) { + var n = value.name ? ': ' + value.name : ''; + base = ' [Function' + n + ']'; + } + + // Make RegExps say that they are RegExps + if (isRegExp(value)) { + base = ' ' + RegExp.prototype.toString.call(value); + } + + // Make dates with properties first say the date + if (isDate(value)) { + base = ' ' + Date.prototype.toUTCString.call(value); + } + + // Make error with message first say the error + if (isError(value)) { + base = ' ' + formatError(value); + } + + if (keys.length === 0 && (!array || value.length == 0)) { + return braces[0] + base + braces[1]; + } + + if (recurseTimes < 0) { + if (isRegExp(value)) { + return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); + } else { + return ctx.stylize('[Object]', 'special'); + } + } + + ctx.seen.push(value); + + var output; + if (array) { + output = formatArray(ctx, value, recurseTimes, visibleKeys, keys); + } else { + output = keys.map(function(key) { + return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array); + }); + } + + ctx.seen.pop(); + + return reduceToSingleString(output, base, braces); +} + + +function formatPrimitive(ctx, value) { + if (isUndefined(value)) + return ctx.stylize('undefined', 'undefined'); + if (isString(value)) { + var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '') + .replace(/'/g, "\\'") + .replace(/\\"/g, '"') + '\''; + return ctx.stylize(simple, 'string'); + } + if (isNumber(value)) + return ctx.stylize('' + value, 'number'); + if (isBoolean(value)) + return ctx.stylize('' + value, 'boolean'); + // For some reason typeof null is "object", so special case here. + if (isNull(value)) + return ctx.stylize('null', 'null'); +} + + +function formatError(value) { + return '[' + Error.prototype.toString.call(value) + ']'; +} + + +function formatArray(ctx, value, recurseTimes, visibleKeys, keys) { + var output = []; + for (var i = 0, l = value.length; i < l; ++i) { + if (hasOwnProperty(value, String(i))) { + output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, + String(i), true)); + } else { + output.push(''); + } + } + keys.forEach(function(key) { + if (!key.match(/^\d+$/)) { + output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, + key, true)); + } + }); + return output; +} + + +function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) { + var name, str, desc; + desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] }; + if (desc.get) { + if (desc.set) { + str = ctx.stylize('[Getter/Setter]', 'special'); + } else { + str = ctx.stylize('[Getter]', 'special'); + } + } else { + if (desc.set) { + str = ctx.stylize('[Setter]', 'special'); + } + } + if (!hasOwnProperty(visibleKeys, key)) { + name = '[' + key + ']'; + } + if (!str) { + if (ctx.seen.indexOf(desc.value) < 0) { + if (isNull(recurseTimes)) { + str = formatValue(ctx, desc.value, null); + } else { + str = formatValue(ctx, desc.value, recurseTimes - 1); + } + if (str.indexOf('\n') > -1) { + if (array) { + str = str.split('\n').map(function(line) { + return ' ' + line; + }).join('\n').substr(2); + } else { + str = '\n' + str.split('\n').map(function(line) { + return ' ' + line; + }).join('\n'); + } + } + } else { + str = ctx.stylize('[Circular]', 'special'); + } + } + if (isUndefined(name)) { + if (array && key.match(/^\d+$/)) { + return str; + } + name = JSON.stringify('' + key); + if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) { + name = name.substr(1, name.length - 2); + name = ctx.stylize(name, 'name'); + } else { + name = name.replace(/'/g, "\\'") + .replace(/\\"/g, '"') + .replace(/(^"|"$)/g, "'"); + name = ctx.stylize(name, 'string'); + } + } + + return name + ': ' + str; +} + + +function reduceToSingleString(output, base, braces) { + var numLinesEst = 0; + var length = output.reduce(function(prev, cur) { + numLinesEst++; + if (cur.indexOf('\n') >= 0) numLinesEst++; + return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1; + }, 0); + + if (length > 60) { + return braces[0] + + (base === '' ? '' : base + '\n ') + + ' ' + + output.join(',\n ') + + ' ' + + braces[1]; + } + + return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1]; +} + + +// NOTE: These type checking functions intentionally don't use `instanceof` +// because it is fragile and can be easily faked with `Object.create()`. +function isArray(ar) { + return Array.isArray(ar); +} +exports.isArray = isArray; + +function isBoolean(arg) { + return typeof arg === 'boolean'; +} +exports.isBoolean = isBoolean; + +function isNull(arg) { + return arg === null; +} +exports.isNull = isNull; + +function isNullOrUndefined(arg) { + return arg == null; +} +exports.isNullOrUndefined = isNullOrUndefined; + +function isNumber(arg) { + return typeof arg === 'number'; +} +exports.isNumber = isNumber; + +function isString(arg) { + return typeof arg === 'string'; +} +exports.isString = isString; + +function isSymbol(arg) { + return typeof arg === 'symbol'; +} +exports.isSymbol = isSymbol; + +function isUndefined(arg) { + return arg === void 0; +} +exports.isUndefined = isUndefined; + +function isRegExp(re) { + return isObject(re) && objectToString(re) === '[object RegExp]'; +} +exports.isRegExp = isRegExp; + +function isObject(arg) { + return typeof arg === 'object' && arg !== null; +} +exports.isObject = isObject; + +function isDate(d) { + return isObject(d) && objectToString(d) === '[object Date]'; +} +exports.isDate = isDate; + +function isError(e) { + return isObject(e) && + (objectToString(e) === '[object Error]' || e instanceof Error); +} +exports.isError = isError; + +function isFunction(arg) { + return typeof arg === 'function'; +} +exports.isFunction = isFunction; + +function isPrimitive(arg) { + return arg === null || + typeof arg === 'boolean' || + typeof arg === 'number' || + typeof arg === 'string' || + typeof arg === 'symbol' || // ES6 symbol + typeof arg === 'undefined'; +} +exports.isPrimitive = isPrimitive; + +exports.isBuffer = require('./support/isBuffer'); + +function objectToString(o) { + return Object.prototype.toString.call(o); +} + + +function pad(n) { + return n < 10 ? '0' + n.toString(10) : n.toString(10); +} + + +var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', + 'Oct', 'Nov', 'Dec']; + +// 26 Feb 16:19:34 +function timestamp() { + var d = new Date(); + var time = [pad(d.getHours()), + pad(d.getMinutes()), + pad(d.getSeconds())].join(':'); + return [d.getDate(), months[d.getMonth()], time].join(' '); +} + + +// log is just a thin wrapper to console.log that prepends a timestamp +exports.log = function() { + console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments)); +}; + + +/** + * Inherit the prototype methods from one constructor into another. + * + * The Function.prototype.inherits from lang.js rewritten as a standalone + * function (not on Function.prototype). NOTE: If this file is to be loaded + * during bootstrapping this function needs to be rewritten using some native + * functions as prototype setup using normal JavaScript does not work as + * expected during bootstrapping (see mirror.js in r114903). + * + * @param {function} ctor Constructor function which needs to inherit the + * prototype. + * @param {function} superCtor Constructor function to inherit prototype from. + */ +exports.inherits = require('inherits'); + +exports._extend = function(origin, add) { + // Don't do anything if add isn't an object + if (!add || !isObject(add)) return origin; + + var keys = Object.keys(add); + var i = keys.length; + while (i--) { + origin[keys[i]] = add[keys[i]]; + } + return origin; +}; + +function hasOwnProperty(obj, prop) { + return Object.prototype.hasOwnProperty.call(obj, prop); +} + +}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"./support/isBuffer":113,"_process":112,"inherits":110}],115:[function(require,module,exports){ +/* + +The MIT License (MIT) + +Original Library + - Copyright (c) Marak Squires + +Additional functionality + - 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. + +*/ + +var colors = {}; +module['exports'] = colors; + +colors.themes = {}; + +var ansiStyles = colors.styles = require('./styles'); +var defineProps = Object.defineProperties; + +colors.supportsColor = require('./system/supports-colors'); + +if (typeof colors.enabled === "undefined") { + colors.enabled = colors.supportsColor; +} + +colors.stripColors = colors.strip = function(str){ + return ("" + str).replace(/\x1B\[\d+m/g, ''); +}; + + +var stylize = colors.stylize = function stylize (str, style) { + return ansiStyles[style].open + str + ansiStyles[style].close; +} + +var matchOperatorsRe = /[|\\{}()[\]^$+*?.]/g; +var escapeStringRegexp = function (str) { + if (typeof str !== 'string') { + throw new TypeError('Expected a string'); + } + return str.replace(matchOperatorsRe, '\\$&'); +} + +function build(_styles) { + var builder = function builder() { + return applyStyle.apply(builder, arguments); + }; + builder._styles = _styles; + // __proto__ is used because we must return a function, but there is + // no way to create a function with a different prototype. + builder.__proto__ = proto; + return builder; +} + +var styles = (function () { + var ret = {}; + ansiStyles.grey = ansiStyles.gray; + Object.keys(ansiStyles).forEach(function (key) { + ansiStyles[key].closeRe = new RegExp(escapeStringRegexp(ansiStyles[key].close), 'g'); + ret[key] = { + get: function () { + return build(this._styles.concat(key)); + } + }; + }); + return ret; +})(); + +var proto = defineProps(function colors() {}, styles); + +function applyStyle() { + var args = arguments; + var argsLen = args.length; + var str = argsLen !== 0 && String(arguments[0]); + if (argsLen > 1) { + for (var a = 1; a < argsLen; a++) { + str += ' ' + args[a]; + } + } + + if (!colors.enabled || !str) { + return str; + } + + var nestedStyles = this._styles; + + var i = nestedStyles.length; + while (i--) { + var code = ansiStyles[nestedStyles[i]]; + str = code.open + str.replace(code.closeRe, code.open) + code.close; + } + + return str; +} + +function applyTheme (theme) { + for (var style in theme) { + (function(style){ + colors[style] = function(str){ + return colors[theme[style]](str); + }; + })(style) + } +} + +colors.setTheme = function (theme) { + if (typeof theme === 'string') { + try { + colors.themes[theme] = require(theme); + applyTheme(colors.themes[theme]); + return colors.themes[theme]; + } catch (err) { + console.log(err); + return err; + } + } else { + applyTheme(theme); + } +}; + +function init() { + var ret = {}; + Object.keys(styles).forEach(function (name) { + ret[name] = { + get: function () { + return build([name]); + } + }; + }); + return ret; +} + +var sequencer = function sequencer (map, str) { + var exploded = str.split(""), i = 0; + exploded = exploded.map(map); + return exploded.join(""); +}; + +// custom formatter methods +colors.trap = require('./custom/trap'); +colors.zalgo = require('./custom/zalgo'); + +// maps +colors.maps = {}; +colors.maps.america = require('./maps/america'); +colors.maps.zebra = require('./maps/zebra'); +colors.maps.rainbow = require('./maps/rainbow'); +colors.maps.random = require('./maps/random') + +for (var map in colors.maps) { + (function(map){ + colors[map] = function (str) { + return sequencer(colors.maps[map], str); + } + })(map) +} + +defineProps(colors, init()); +},{"./custom/trap":116,"./custom/zalgo":117,"./maps/america":120,"./maps/rainbow":121,"./maps/random":122,"./maps/zebra":123,"./styles":124,"./system/supports-colors":125}],116:[function(require,module,exports){ +module['exports'] = function runTheTrap (text, options) { + var result = ""; + text = text || "Run the trap, drop the bass"; + text = text.split(''); + var trap = { + a: ["\u0040", "\u0104", "\u023a", "\u0245", "\u0394", "\u039b", "\u0414"], + b: ["\u00df", "\u0181", "\u0243", "\u026e", "\u03b2", "\u0e3f"], + c: ["\u00a9", "\u023b", "\u03fe"], + d: ["\u00d0", "\u018a", "\u0500" , "\u0501" ,"\u0502", "\u0503"], + e: ["\u00cb", "\u0115", "\u018e", "\u0258", "\u03a3", "\u03be", "\u04bc", "\u0a6c"], + f: ["\u04fa"], + g: ["\u0262"], + h: ["\u0126", "\u0195", "\u04a2", "\u04ba", "\u04c7", "\u050a"], + i: ["\u0f0f"], + j: ["\u0134"], + k: ["\u0138", "\u04a0", "\u04c3", "\u051e"], + l: ["\u0139"], + m: ["\u028d", "\u04cd", "\u04ce", "\u0520", "\u0521", "\u0d69"], + n: ["\u00d1", "\u014b", "\u019d", "\u0376", "\u03a0", "\u048a"], + o: ["\u00d8", "\u00f5", "\u00f8", "\u01fe", "\u0298", "\u047a", "\u05dd", "\u06dd", "\u0e4f"], + p: ["\u01f7", "\u048e"], + q: ["\u09cd"], + r: ["\u00ae", "\u01a6", "\u0210", "\u024c", "\u0280", "\u042f"], + s: ["\u00a7", "\u03de", "\u03df", "\u03e8"], + t: ["\u0141", "\u0166", "\u0373"], + u: ["\u01b1", "\u054d"], + v: ["\u05d8"], + w: ["\u0428", "\u0460", "\u047c", "\u0d70"], + x: ["\u04b2", "\u04fe", "\u04fc", "\u04fd"], + y: ["\u00a5", "\u04b0", "\u04cb"], + z: ["\u01b5", "\u0240"] + } + text.forEach(function(c){ + c = c.toLowerCase(); + var chars = trap[c] || [" "]; + var rand = Math.floor(Math.random() * chars.length); + if (typeof trap[c] !== "undefined") { + result += trap[c][rand]; + } else { + result += c; + } + }); + return result; + +} + +},{}],117:[function(require,module,exports){ +// please no +module['exports'] = function zalgo(text, options) { + text = text || " he is here "; + var soul = { + "up" : [ + '̍', '̎', '̄', '̅', + '̿', '̑', '̆', '̐', + '͒', '͗', '͑', '̇', + '̈', '̊', '͂', '̓', + '̈', '͊', '͋', '͌', + '̃', '̂', '̌', '͐', + '̀', '́', '̋', '̏', + '̒', '̓', '̔', '̽', + '̉', 'ͣ', 'ͤ', 'ͥ', + 'ͦ', 'ͧ', 'ͨ', 'ͩ', + 'ͪ', 'ͫ', 'ͬ', 'ͭ', + 'ͮ', 'ͯ', '̾', '͛', + '͆', '̚' + ], + "down" : [ + '̖', '̗', '̘', '̙', + '̜', '̝', '̞', '̟', + '̠', '̤', '̥', '̦', + '̩', '̪', '̫', '̬', + '̭', '̮', '̯', '̰', + '̱', '̲', '̳', '̹', + '̺', '̻', '̼', 'ͅ', + '͇', '͈', '͉', '͍', + '͎', '͓', '͔', '͕', + '͖', '͙', '͚', '̣' + ], + "mid" : [ + '̕', '̛', '̀', '́', + '͘', '̡', '̢', '̧', + '̨', '̴', '̵', '̶', + '͜', '͝', '͞', + '͟', '͠', '͢', '̸', + '̷', '͡', ' ҉' + ] + }, + all = [].concat(soul.up, soul.down, soul.mid), + zalgo = {}; + + function randomNumber(range) { + var r = Math.floor(Math.random() * range); + return r; + } + + function is_char(character) { + var bool = false; + all.filter(function (i) { + bool = (i === character); + }); + return bool; + } + + + function heComes(text, options) { + var result = '', counts, l; + options = options || {}; + options["up"] = options["up"] || true; + options["mid"] = options["mid"] || true; + options["down"] = options["down"] || true; + options["size"] = options["size"] || "maxi"; + text = text.split(''); + for (l in text) { + if (is_char(l)) { + continue; + } + result = result + text[l]; + counts = {"up" : 0, "down" : 0, "mid" : 0}; + switch (options.size) { + case 'mini': + counts.up = randomNumber(8); + counts.min = randomNumber(2); + counts.down = randomNumber(8); + break; + case 'maxi': + counts.up = randomNumber(16) + 3; + counts.min = randomNumber(4) + 1; + counts.down = randomNumber(64) + 3; + break; + default: + counts.up = randomNumber(8) + 1; + counts.mid = randomNumber(6) / 2; + counts.down = randomNumber(8) + 1; + break; + } + + var arr = ["up", "mid", "down"]; + for (var d in arr) { + var index = arr[d]; + for (var i = 0 ; i <= counts[index]; i++) { + if (options[index]) { + result = result + soul[index][randomNumber(soul[index].length)]; + } + } + } + } + return result; + } + // don't summon him + return heComes(text); +} + +},{}],118:[function(require,module,exports){ +var colors = require('./colors'), + styles = require('./styles'); + +module['exports'] = function () { + + // + // Extends prototype of native string object to allow for "foo".red syntax + // + var addProperty = function (color, func) { + String.prototype.__defineGetter__(color, func); + }; + + var sequencer = function sequencer (map, str) { + return function () { + var exploded = this.split(""), i = 0; + exploded = exploded.map(map); + return exploded.join(""); + } + }; + + var stylize = function stylize (str, style) { + return styles[style].open + str + styles[style].close; + } + + addProperty('strip', function () { + return colors.strip(this); + }); + + addProperty('stripColors', function () { + return colors.strip(this); + }); + + addProperty("trap", function(){ + return colors.trap(this); + }); + + addProperty("zalgo", function(){ + return colors.zalgo(this); + }); + + addProperty("zebra", function(){ + return colors.zebra(this); + }); + + addProperty("rainbow", function(){ + return colors.rainbow(this); + }); + + addProperty("random", function(){ + return colors.random(this); + }); + + addProperty("america", function(){ + return colors.america(this); + }); + + // + // Iterate through all default styles and colors + // + var x = Object.keys(colors.styles); + x.forEach(function (style) { + addProperty(style, function () { + return stylize(this, style); + }); + }); + + function applyTheme(theme) { + // + // Remark: This is a list of methods that exist + // on String that you should not overwrite. + // + var stringPrototypeBlacklist = [ + '__defineGetter__', '__defineSetter__', '__lookupGetter__', '__lookupSetter__', 'charAt', 'constructor', + 'hasOwnProperty', 'isPrototypeOf', 'propertyIsEnumerable', 'toLocaleString', 'toString', 'valueOf', 'charCodeAt', + 'indexOf', 'lastIndexof', 'length', 'localeCompare', 'match', 'replace', 'search', 'slice', 'split', 'substring', + 'toLocaleLowerCase', 'toLocaleUpperCase', 'toLowerCase', 'toUpperCase', 'trim', 'trimLeft', 'trimRight' + ]; + + Object.keys(theme).forEach(function (prop) { + if (stringPrototypeBlacklist.indexOf(prop) !== -1) { + console.log('warn: '.red + ('String.prototype' + prop).magenta + ' is probably something you don\'t want to override. Ignoring style name'); + } + else { + if (typeof(theme[prop]) === 'string') { + colors[prop] = colors[theme[prop]]; + addProperty(prop, function () { + return colors[theme[prop]](this); + }); + } + else { + addProperty(prop, function () { + var ret = this; + for (var t = 0; t < theme[prop].length; t++) { + ret = exports[theme[prop][t]](ret); + } + return ret; + }); + } + } + }); + } + + colors.setTheme = function (theme) { + if (typeof theme === 'string') { + try { + colors.themes[theme] = require(theme); + applyTheme(colors.themes[theme]); + return colors.themes[theme]; + } catch (err) { + console.log(err); + return err; + } + } else { + applyTheme(theme); + } + }; + +}; +},{"./colors":115,"./styles":124}],119:[function(require,module,exports){ +var colors = require('./colors'); +module['exports'] = colors; + +// Remark: By default, colors will add style properties to String.prototype +// +// If you don't wish to extend String.prototype you can do this instead and native String will not be touched +// +// var colors = require('colors/safe); +// colors.red("foo") +// +// +var extendStringPrototype = require('./extendStringPrototype')(); +},{"./colors":115,"./extendStringPrototype":118}],120:[function(require,module,exports){ +var colors = require('../colors'); + +module['exports'] = (function() { + return function (letter, i, exploded) { + if(letter === " ") return letter; + switch(i%3) { + case 0: return colors.red(letter); + case 1: return colors.white(letter) + case 2: return colors.blue(letter) + } + } +})(); +},{"../colors":115}],121:[function(require,module,exports){ +var colors = require('../colors'); + +module['exports'] = (function () { + var rainbowColors = ['red', 'yellow', 'green', 'blue', 'magenta']; //RoY G BiV + return function (letter, i, exploded) { + if (letter === " ") { + return letter; + } else { + return colors[rainbowColors[i++ % rainbowColors.length]](letter); + } + }; +})(); + + +},{"../colors":115}],122:[function(require,module,exports){ +var colors = require('../colors'); + +module['exports'] = (function () { + var available = ['underline', 'inverse', 'grey', 'yellow', 'red', 'green', 'blue', 'white', 'cyan', 'magenta']; + return function(letter, i, exploded) { + return letter === " " ? letter : colors[available[Math.round(Math.random() * (available.length - 1))]](letter); + }; +})(); +},{"../colors":115}],123:[function(require,module,exports){ +var colors = require('../colors'); + +module['exports'] = function (letter, i, exploded) { + return i % 2 === 0 ? letter : colors.inverse(letter); +}; +},{"../colors":115}],124:[function(require,module,exports){ +/* +The 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. + +*/ + +var styles = {}; +module['exports'] = styles; + +var codes = { + reset: [0, 0], + + bold: [1, 22], + dim: [2, 22], + italic: [3, 23], + underline: [4, 24], + inverse: [7, 27], + hidden: [8, 28], + strikethrough: [9, 29], + + black: [30, 39], + red: [31, 39], + green: [32, 39], + yellow: [33, 39], + blue: [34, 39], + magenta: [35, 39], + cyan: [36, 39], + white: [37, 39], + gray: [90, 39], + grey: [90, 39], + + bgBlack: [40, 49], + bgRed: [41, 49], + bgGreen: [42, 49], + bgYellow: [43, 49], + bgBlue: [44, 49], + bgMagenta: [45, 49], + bgCyan: [46, 49], + bgWhite: [47, 49], + + // legacy styles for colors pre v1.0.0 + blackBG: [40, 49], + redBG: [41, 49], + greenBG: [42, 49], + yellowBG: [43, 49], + blueBG: [44, 49], + magentaBG: [45, 49], + cyanBG: [46, 49], + whiteBG: [47, 49] + +}; + +Object.keys(codes).forEach(function (key) { + var val = codes[key]; + var style = styles[key] = []; + style.open = '\u001b[' + val[0] + 'm'; + style.close = '\u001b[' + val[1] + 'm'; +}); +},{}],125:[function(require,module,exports){ +(function (process){ +/* +The 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. + +*/ + +var argv = process.argv; + +module.exports = (function () { + if (argv.indexOf('--no-color') !== -1 || + argv.indexOf('--color=false') !== -1) { + return false; + } + + if (argv.indexOf('--color') !== -1 || + argv.indexOf('--color=true') !== -1 || + argv.indexOf('--color=always') !== -1) { + return true; + } + + if (process.stdout && !process.stdout.isTTY) { + return false; + } + + if (process.platform === 'win32') { + return true; + } + + if ('COLORTERM' in process.env) { + return true; + } + + if (process.env.TERM === 'dumb') { + return false; + } + + if (/^screen|^xterm|^vt100|color|ansi|cygwin|linux/i.test(process.env.TERM)) { + return true; + } + + return false; +})(); +}).call(this,require('_process')) +},{"_process":112}],126:[function(require,module,exports){ +/* + Copyright (C) 2013 Ariya Hidayat + Copyright (C) 2013 Thaddee Tyl + Copyright (C) 2012 Ariya Hidayat + Copyright (C) 2012 Mathias Bynens + Copyright (C) 2012 Joost-Wim Boekesteijn + Copyright (C) 2012 Kris Kowal + Copyright (C) 2012 Yusuke Suzuki + Copyright (C) 2012 Arpad Borsos + Copyright (C) 2011 Ariya Hidayat + + 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 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 bitwise:true plusplus:true */ +/*global esprima:true, define:true, exports:true, window: true, +throwError: true, generateStatement: true, peek: true, +parseAssignmentExpression: true, parseBlock: true, +parseClassExpression: true, parseClassDeclaration: true, parseExpression: true, +parseForStatement: true, +parseFunctionDeclaration: true, parseFunctionExpression: true, +parseFunctionSourceElements: true, parseVariableIdentifier: true, +parseImportSpecifier: true, +parseLeftHandSideExpression: true, parseParams: true, validateParam: true, +parseSpreadOrAssignmentExpression: true, +parseStatement: true, parseSourceElement: true, parseConciseBody: true, +parseYieldExpression: true +*/ + +(function (root, factory) { + 'use strict'; + + // Universal Module Definition (UMD) to support AMD, CommonJS/Node.js, + // Rhino, and plain browser loading. + if (typeof define === 'function' && define.amd) { + define(['exports'], factory); + } else if (typeof exports !== 'undefined') { + factory(exports); + } else { + factory((root.esprima = {})); + } +}(this, function (exports) { + 'use strict'; + + var Token, + TokenName, + FnExprTokens, + Syntax, + PropertyKind, + Messages, + Regex, + SyntaxTreeDelegate, + ClassPropertyType, + source, + strict, + index, + lineNumber, + lineStart, + length, + delegate, + lookahead, + state, + extra; + + Token = { + BooleanLiteral: 1, + EOF: 2, + Identifier: 3, + Keyword: 4, + NullLiteral: 5, + NumericLiteral: 6, + Punctuator: 7, + StringLiteral: 8, + RegularExpression: 9, + Template: 10 + }; + + TokenName = {}; + TokenName[Token.BooleanLiteral] = 'Boolean'; + TokenName[Token.EOF] = ''; + TokenName[Token.Identifier] = 'Identifier'; + TokenName[Token.Keyword] = 'Keyword'; + TokenName[Token.NullLiteral] = 'Null'; + TokenName[Token.NumericLiteral] = 'Numeric'; + TokenName[Token.Punctuator] = 'Punctuator'; + TokenName[Token.StringLiteral] = 'String'; + TokenName[Token.RegularExpression] = 'RegularExpression'; + + // A function following one of those tokens is an expression. + FnExprTokens = ['(', '{', '[', 'in', 'typeof', 'instanceof', 'new', + 'return', 'case', 'delete', 'throw', 'void', + // assignment operators + '=', '+=', '-=', '*=', '/=', '%=', '<<=', '>>=', '>>>=', + '&=', '|=', '^=', ',', + // binary/unary operators + '+', '-', '*', '/', '%', '++', '--', '<<', '>>', '>>>', '&', + '|', '^', '!', '~', '&&', '||', '?', ':', '===', '==', '>=', + '<=', '<', '>', '!=', '!==']; + + Syntax = { + ArrayExpression: 'ArrayExpression', + ArrayPattern: 'ArrayPattern', + ArrowFunctionExpression: 'ArrowFunctionExpression', + AssignmentExpression: 'AssignmentExpression', + BinaryExpression: 'BinaryExpression', + BlockStatement: 'BlockStatement', + BreakStatement: 'BreakStatement', + CallExpression: 'CallExpression', + CatchClause: 'CatchClause', + ClassBody: 'ClassBody', + ClassDeclaration: 'ClassDeclaration', + ClassExpression: 'ClassExpression', + ComprehensionBlock: 'ComprehensionBlock', + ComprehensionExpression: 'ComprehensionExpression', + ConditionalExpression: 'ConditionalExpression', + ContinueStatement: 'ContinueStatement', + DebuggerStatement: 'DebuggerStatement', + DoWhileStatement: 'DoWhileStatement', + EmptyStatement: 'EmptyStatement', + ExportDeclaration: 'ExportDeclaration', + ExportBatchSpecifier: 'ExportBatchSpecifier', + ExportSpecifier: 'ExportSpecifier', + ExpressionStatement: 'ExpressionStatement', + ForInStatement: 'ForInStatement', + ForOfStatement: 'ForOfStatement', + ForStatement: 'ForStatement', + FunctionDeclaration: 'FunctionDeclaration', + FunctionExpression: 'FunctionExpression', + Identifier: 'Identifier', + IfStatement: 'IfStatement', + ImportDeclaration: 'ImportDeclaration', + ImportDefaultSpecifier: 'ImportDefaultSpecifier', + ImportNamespaceSpecifier: 'ImportNamespaceSpecifier', + ImportSpecifier: 'ImportSpecifier', + LabeledStatement: 'LabeledStatement', + Literal: 'Literal', + LogicalExpression: 'LogicalExpression', + MemberExpression: 'MemberExpression', + MethodDefinition: 'MethodDefinition', + ModuleSpecifier: 'ModuleSpecifier', + NewExpression: 'NewExpression', + ObjectExpression: 'ObjectExpression', + ObjectPattern: 'ObjectPattern', + Program: 'Program', + Property: 'Property', + ReturnStatement: 'ReturnStatement', + SequenceExpression: 'SequenceExpression', + SpreadElement: 'SpreadElement', + SwitchCase: 'SwitchCase', + SwitchStatement: 'SwitchStatement', + 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' + }; + + PropertyKind = { + Data: 1, + Get: 2, + Set: 4 + }; + + ClassPropertyType = { + 'static': 'static', + prototype: 'prototype' + }; + + // Error messages should be identical to V8. + Messages = { + UnexpectedToken: 'Unexpected token %0', + UnexpectedNumber: 'Unexpected number', + UnexpectedString: 'Unexpected string', + UnexpectedIdentifier: 'Unexpected identifier', + UnexpectedReserved: 'Unexpected reserved word', + UnexpectedTemplate: 'Unexpected quasi %0', + UnexpectedEOS: 'Unexpected end of input', + NewlineAfterThrow: 'Illegal newline after throw', + InvalidRegExp: 'Invalid regular expression', + UnterminatedRegExp: 'Invalid regular expression: missing /', + InvalidLHSInAssignment: 'Invalid left-hand side in assignment', + InvalidLHSInFormalsList: 'Invalid left-hand side in formals list', + InvalidLHSInForIn: 'Invalid left-hand side in for-in', + MultipleDefaultsInSwitch: 'More than one default clause in switch statement', + NoCatchOrFinally: 'Missing catch or finally after try', + UnknownLabel: 'Undefined label \'%0\'', + Redeclaration: '%0 \'%1\' has already been declared', + IllegalContinue: 'Illegal continue statement', + IllegalBreak: 'Illegal break statement', + IllegalDuplicateClassProperty: 'Illegal duplicate property in class definition', + IllegalReturn: 'Illegal return statement', + IllegalYield: 'Illegal yield expression', + IllegalSpread: 'Illegal spread element', + StrictModeWith: 'Strict mode code may not include a with statement', + StrictCatchVariable: 'Catch variable may not be eval or arguments in strict mode', + StrictVarName: 'Variable name may not be eval or arguments in strict mode', + StrictParamName: 'Parameter name eval or arguments is not allowed in strict mode', + StrictParamDupe: 'Strict mode function may not have duplicate parameter names', + ParameterAfterRestParameter: 'Rest parameter must be final parameter of an argument list', + DefaultRestParameter: 'Rest parameter can not have a default value', + ElementAfterSpreadElement: 'Spread must be the final element of an element list', + ObjectPatternAsRestParameter: 'Invalid rest parameter', + ObjectPatternAsSpread: 'Invalid spread argument', + StrictFunctionName: 'Function name may not be eval or arguments in strict mode', + StrictOctalLiteral: 'Octal literals are not allowed in strict mode.', + StrictDelete: 'Delete of an unqualified identifier in strict mode.', + StrictDuplicateProperty: 'Duplicate data property in object literal not allowed in strict mode', + AccessorDataProperty: 'Object literal may not have data and accessor property with the same name', + AccessorGetSet: 'Object literal may not have multiple get/set accessors with the same name', + StrictLHSAssignment: 'Assignment to eval or arguments is not allowed in strict mode', + StrictLHSPostfix: 'Postfix increment/decrement may not have eval or arguments operand in strict mode', + StrictLHSPrefix: 'Prefix increment/decrement may not have eval or arguments operand in strict mode', + StrictReservedWord: 'Use of future reserved word in strict mode', + MissingFromClause: 'Missing from clause', + NoAsAfterImportNamespace: 'Missing as after import *', + InvalidModuleSpecifier: 'Invalid module specifier', + NoUnintializedConst: 'Const must be initialized', + ComprehensionRequiresBlock: 'Comprehension must have at least one block', + ComprehensionError: 'Comprehension Error', + EachNotAllowed: 'Each is not supported' + }; + + // See also tools/generate-unicode-regex.py. + Regex = { + NonAsciiIdentifierStart: new RegExp('[\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]'), + NonAsciiIdentifierPart: new RegExp('[\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]') + }; + + // Ensure the condition is true, otherwise throw an error. + // This is only to have a better contract semantic, i.e. another safety net + // to catch a logic error. The condition shall be fulfilled in normal case. + // Do NOT use this to enforce a certain condition on any user input. + + function assert(condition, message) { + if (!condition) { + throw new Error('ASSERT: ' + message); + } + } + + function isDecimalDigit(ch) { + return (ch >= 48 && ch <= 57); // 0..9 + } + + function isHexDigit(ch) { + return '0123456789abcdefABCDEF'.indexOf(ch) >= 0; + } + + function isOctalDigit(ch) { + return '01234567'.indexOf(ch) >= 0; + } + + + // 7.2 White Space + + function isWhiteSpace(ch) { + return (ch === 32) || // space + (ch === 9) || // tab + (ch === 0xB) || + (ch === 0xC) || + (ch === 0xA0) || + (ch >= 0x1680 && '\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\uFEFF'.indexOf(String.fromCharCode(ch)) > 0); + } + + // 7.3 Line Terminators + + function isLineTerminator(ch) { + return (ch === 10) || (ch === 13) || (ch === 0x2028) || (ch === 0x2029); + } + + // 7.6 Identifier Names and Identifiers + + function isIdentifierStart(ch) { + return (ch === 36) || (ch === 95) || // $ (dollar) and _ (underscore) + (ch >= 65 && ch <= 90) || // A..Z + (ch >= 97 && ch <= 122) || // a..z + (ch === 92) || // \ (backslash) + ((ch >= 0x80) && Regex.NonAsciiIdentifierStart.test(String.fromCharCode(ch))); + } + + function isIdentifierPart(ch) { + return (ch === 36) || (ch === 95) || // $ (dollar) and _ (underscore) + (ch >= 65 && ch <= 90) || // A..Z + (ch >= 97 && ch <= 122) || // a..z + (ch >= 48 && ch <= 57) || // 0..9 + (ch === 92) || // \ (backslash) + ((ch >= 0x80) && Regex.NonAsciiIdentifierPart.test(String.fromCharCode(ch))); + } + + // 7.6.1.2 Future Reserved Words + + function isFutureReservedWord(id) { + switch (id) { + case 'class': + case 'enum': + case 'export': + case 'extends': + case 'import': + case 'super': + return true; + default: + return false; + } + } + + function isStrictModeReservedWord(id) { + switch (id) { + case 'implements': + case 'interface': + case 'package': + case 'private': + case 'protected': + case 'public': + case 'static': + case 'yield': + case 'let': + return true; + default: + return false; + } + } + + function isRestrictedWord(id) { + return id === 'eval' || id === 'arguments'; + } + + // 7.6.1.1 Keywords + + function isKeyword(id) { + if (strict && isStrictModeReservedWord(id)) { + return true; + } + + // 'const' is specialized as Keyword in V8. + // 'yield' is only treated as a keyword in strict mode. + // 'let' is for compatiblity with SpiderMonkey and ES.next. + // Some others are from future reserved words. + + switch (id.length) { + case 2: + return (id === 'if') || (id === 'in') || (id === 'do'); + case 3: + return (id === 'var') || (id === 'for') || (id === 'new') || + (id === 'try') || (id === 'let'); + case 4: + return (id === 'this') || (id === 'else') || (id === 'case') || + (id === 'void') || (id === 'with') || (id === 'enum'); + case 5: + return (id === 'while') || (id === 'break') || (id === 'catch') || + (id === 'throw') || (id === 'const') || + (id === 'class') || (id === 'super'); + case 6: + return (id === 'return') || (id === 'typeof') || (id === 'delete') || + (id === 'switch') || (id === 'export') || (id === 'import'); + case 7: + return (id === 'default') || (id === 'finally') || (id === 'extends'); + case 8: + return (id === 'function') || (id === 'continue') || (id === 'debugger'); + case 10: + return (id === 'instanceof'); + default: + return false; + } + } + + // 7.4 Comments + + function skipComment() { + var ch, blockComment, lineComment; + + blockComment = false; + lineComment = false; + + while (index < length) { + ch = source.charCodeAt(index); + + if (lineComment) { + ++index; + if (isLineTerminator(ch)) { + lineComment = false; + if (ch === 13 && source.charCodeAt(index) === 10) { + ++index; + } + ++lineNumber; + lineStart = index; + } + } else if (blockComment) { + if (isLineTerminator(ch)) { + if (ch === 13 && source.charCodeAt(index + 1) === 10) { + ++index; + } + ++lineNumber; + ++index; + lineStart = index; + if (index >= length) { + throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); + } + } else { + ch = source.charCodeAt(index++); + if (index >= length) { + throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); + } + // Block comment ends with '*/' (char #42, char #47). + if (ch === 42) { + ch = source.charCodeAt(index); + if (ch === 47) { + ++index; + blockComment = false; + } + } + } + } else if (ch === 47) { + ch = source.charCodeAt(index + 1); + // Line comment starts with '//' (char #47, char #47). + if (ch === 47) { + index += 2; + lineComment = true; + } else if (ch === 42) { + // Block comment starts with '/*' (char #47, char #42). + index += 2; + blockComment = true; + if (index >= length) { + throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); + } + } else { + break; + } + } else if (isWhiteSpace(ch)) { + ++index; + } else if (isLineTerminator(ch)) { + ++index; + if (ch === 13 && source.charCodeAt(index) === 10) { + ++index; + } + ++lineNumber; + lineStart = index; + } else { + break; + } + } + } + + function scanHexEscape(prefix) { + var i, len, ch, code = 0; + + len = (prefix === 'u') ? 4 : 2; + for (i = 0; i < len; ++i) { + if (index < length && isHexDigit(source[index])) { + ch = source[index++]; + code = code * 16 + '0123456789abcdef'.indexOf(ch.toLowerCase()); + } else { + return ''; + } + } + return String.fromCharCode(code); + } + + function scanUnicodeCodePointEscape() { + var ch, code, cu1, cu2; + + ch = source[index]; + code = 0; + + // At least, one hex digit is required. + if (ch === '}') { + throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); + } + + while (index < length) { + ch = source[index++]; + if (!isHexDigit(ch)) { + break; + } + code = code * 16 + '0123456789abcdef'.indexOf(ch.toLowerCase()); + } + + if (code > 0x10FFFF || ch !== '}') { + throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); + } + + // UTF-16 Encoding + if (code <= 0xFFFF) { + return String.fromCharCode(code); + } + cu1 = ((code - 0x10000) >> 10) + 0xD800; + cu2 = ((code - 0x10000) & 1023) + 0xDC00; + return String.fromCharCode(cu1, cu2); + } + + function getEscapedIdentifier() { + var ch, id; + + ch = source.charCodeAt(index++); + id = String.fromCharCode(ch); + + // '\u' (char #92, char #117) denotes an escaped character. + if (ch === 92) { + if (source.charCodeAt(index) !== 117) { + throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); + } + ++index; + ch = scanHexEscape('u'); + if (!ch || ch === '\\' || !isIdentifierStart(ch.charCodeAt(0))) { + throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); + } + id = ch; + } + + while (index < length) { + ch = source.charCodeAt(index); + if (!isIdentifierPart(ch)) { + break; + } + ++index; + id += String.fromCharCode(ch); + + // '\u' (char #92, char #117) denotes an escaped character. + if (ch === 92) { + id = id.substr(0, id.length - 1); + if (source.charCodeAt(index) !== 117) { + throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); + } + ++index; + ch = scanHexEscape('u'); + if (!ch || ch === '\\' || !isIdentifierPart(ch.charCodeAt(0))) { + throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); + } + id += ch; + } + } + + return id; + } + + function getIdentifier() { + var start, ch; + + start = index++; + while (index < length) { + ch = source.charCodeAt(index); + if (ch === 92) { + // Blackslash (char #92) marks Unicode escape sequence. + index = start; + return getEscapedIdentifier(); + } + if (isIdentifierPart(ch)) { + ++index; + } else { + break; + } + } + + return source.slice(start, index); + } + + function scanIdentifier() { + var start, id, type; + + start = index; + + // Backslash (char #92) starts an escaped character. + id = (source.charCodeAt(index) === 92) ? getEscapedIdentifier() : getIdentifier(); + + // There is no keyword or literal with only one character. + // Thus, it must be an identifier. + if (id.length === 1) { + type = Token.Identifier; + } else if (isKeyword(id)) { + type = Token.Keyword; + } else if (id === 'null') { + type = Token.NullLiteral; + } else if (id === 'true' || id === 'false') { + type = Token.BooleanLiteral; + } else { + type = Token.Identifier; + } + + return { + type: type, + value: id, + lineNumber: lineNumber, + lineStart: lineStart, + range: [start, index] + }; + } + + + // 7.7 Punctuators + + function scanPunctuator() { + var start = index, + code = source.charCodeAt(index), + code2, + ch1 = source[index], + ch2, + ch3, + ch4; + + switch (code) { + // Check for most common single-character punctuators. + case 40: // ( open bracket + case 41: // ) close bracket + case 59: // ; semicolon + case 44: // , comma + case 123: // { open curly brace + case 125: // } close curly brace + case 91: // [ + case 93: // ] + case 58: // : + case 63: // ? + case 126: // ~ + ++index; + if (extra.tokenize) { + if (code === 40) { + extra.openParenToken = extra.tokens.length; + } else if (code === 123) { + extra.openCurlyToken = extra.tokens.length; + } + } + return { + type: Token.Punctuator, + value: String.fromCharCode(code), + lineNumber: lineNumber, + lineStart: lineStart, + range: [start, index] + }; + + default: + code2 = source.charCodeAt(index + 1); + + // '=' (char #61) marks an assignment or comparison operator. + if (code2 === 61) { + switch (code) { + case 37: // % + case 38: // & + case 42: // *: + case 43: // + + case 45: // - + case 47: // / + case 60: // < + case 62: // > + case 94: // ^ + case 124: // | + index += 2; + return { + type: Token.Punctuator, + value: String.fromCharCode(code) + String.fromCharCode(code2), + lineNumber: lineNumber, + lineStart: lineStart, + range: [start, index] + }; + + case 33: // ! + case 61: // = + index += 2; + + // !== and === + if (source.charCodeAt(index) === 61) { + ++index; + } + return { + type: Token.Punctuator, + value: source.slice(start, index), + lineNumber: lineNumber, + lineStart: lineStart, + range: [start, index] + }; + default: + break; + } + } + break; + } + + // Peek more characters. + + ch2 = source[index + 1]; + ch3 = source[index + 2]; + ch4 = source[index + 3]; + + // 4-character punctuator: >>>= + + if (ch1 === '>' && ch2 === '>' && ch3 === '>') { + if (ch4 === '=') { + index += 4; + return { + type: Token.Punctuator, + value: '>>>=', + lineNumber: lineNumber, + lineStart: lineStart, + range: [start, index] + }; + } + } + + // 3-character punctuators: === !== >>> <<= >>= + + if (ch1 === '>' && ch2 === '>' && ch3 === '>') { + index += 3; + return { + type: Token.Punctuator, + value: '>>>', + lineNumber: lineNumber, + lineStart: lineStart, + range: [start, index] + }; + } + + if (ch1 === '<' && ch2 === '<' && ch3 === '=') { + index += 3; + return { + type: Token.Punctuator, + value: '<<=', + lineNumber: lineNumber, + lineStart: lineStart, + range: [start, index] + }; + } + + if (ch1 === '>' && ch2 === '>' && ch3 === '=') { + index += 3; + return { + type: Token.Punctuator, + value: '>>=', + lineNumber: lineNumber, + lineStart: lineStart, + range: [start, index] + }; + } + + if (ch1 === '.' && ch2 === '.' && ch3 === '.') { + index += 3; + return { + type: Token.Punctuator, + value: '...', + lineNumber: lineNumber, + lineStart: lineStart, + range: [start, index] + }; + } + + // Other 2-character punctuators: ++ -- << >> && || + + if (ch1 === ch2 && ('+-<>&|'.indexOf(ch1) >= 0)) { + index += 2; + return { + type: Token.Punctuator, + value: ch1 + ch2, + lineNumber: lineNumber, + lineStart: lineStart, + range: [start, index] + }; + } + + if (ch1 === '=' && ch2 === '>') { + index += 2; + return { + type: Token.Punctuator, + value: '=>', + lineNumber: lineNumber, + lineStart: lineStart, + range: [start, index] + }; + } + + if ('<>=!+-*%&|^/'.indexOf(ch1) >= 0) { + ++index; + return { + type: Token.Punctuator, + value: ch1, + lineNumber: lineNumber, + lineStart: lineStart, + range: [start, index] + }; + } + + if (ch1 === '.') { + ++index; + return { + type: Token.Punctuator, + value: ch1, + lineNumber: lineNumber, + lineStart: lineStart, + range: [start, index] + }; + } + + throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); + } + + // 7.8.3 Numeric Literals + + function scanHexLiteral(start) { + var number = ''; + + while (index < length) { + if (!isHexDigit(source[index])) { + break; + } + number += source[index++]; + } + + if (number.length === 0) { + throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); + } + + if (isIdentifierStart(source.charCodeAt(index))) { + throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); + } + + return { + type: Token.NumericLiteral, + value: parseInt('0x' + number, 16), + lineNumber: lineNumber, + lineStart: lineStart, + range: [start, index] + }; + } + + function scanOctalLiteral(prefix, start) { + var number, octal; + + if (isOctalDigit(prefix)) { + octal = true; + number = '0' + source[index++]; + } else { + octal = false; + ++index; + number = ''; + } + + while (index < length) { + if (!isOctalDigit(source[index])) { + break; + } + number += source[index++]; + } + + if (!octal && number.length === 0) { + // only 0o or 0O + throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); + } + + if (isIdentifierStart(source.charCodeAt(index)) || isDecimalDigit(source.charCodeAt(index))) { + throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); + } + + return { + type: Token.NumericLiteral, + value: parseInt(number, 8), + octal: octal, + lineNumber: lineNumber, + lineStart: lineStart, + range: [start, index] + }; + } + + function scanNumericLiteral() { + var number, start, ch, octal; + + ch = source[index]; + assert(isDecimalDigit(ch.charCodeAt(0)) || (ch === '.'), + 'Numeric literal must start with a decimal digit or a decimal point'); + + start = index; + number = ''; + if (ch !== '.') { + number = source[index++]; + ch = source[index]; + + // Hex number starts with '0x'. + // Octal number starts with '0'. + // Octal number in ES6 starts with '0o'. + // Binary number in ES6 starts with '0b'. + if (number === '0') { + if (ch === 'x' || ch === 'X') { + ++index; + return scanHexLiteral(start); + } + if (ch === 'b' || ch === 'B') { + ++index; + number = ''; + + while (index < length) { + ch = source[index]; + if (ch !== '0' && ch !== '1') { + break; + } + number += source[index++]; + } + + if (number.length === 0) { + // only 0b or 0B + throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); + } + + if (index < length) { + ch = source.charCodeAt(index); + if (isIdentifierStart(ch) || isDecimalDigit(ch)) { + throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); + } + } + return { + type: Token.NumericLiteral, + value: parseInt(number, 2), + lineNumber: lineNumber, + lineStart: lineStart, + range: [start, index] + }; + } + if (ch === 'o' || ch === 'O' || isOctalDigit(ch)) { + return scanOctalLiteral(ch, start); + } + // decimal number starts with '0' such as '09' is illegal. + if (ch && isDecimalDigit(ch.charCodeAt(0))) { + throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); + } + } + + while (isDecimalDigit(source.charCodeAt(index))) { + number += source[index++]; + } + ch = source[index]; + } + + if (ch === '.') { + number += source[index++]; + while (isDecimalDigit(source.charCodeAt(index))) { + number += source[index++]; + } + ch = source[index]; + } + + if (ch === 'e' || ch === 'E') { + number += source[index++]; + + ch = source[index]; + if (ch === '+' || ch === '-') { + number += source[index++]; + } + if (isDecimalDigit(source.charCodeAt(index))) { + while (isDecimalDigit(source.charCodeAt(index))) { + number += source[index++]; + } + } else { + throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); + } + } + + if (isIdentifierStart(source.charCodeAt(index))) { + throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); + } + + return { + type: Token.NumericLiteral, + value: parseFloat(number), + lineNumber: lineNumber, + lineStart: lineStart, + range: [start, index] + }; + } + + // 7.8.4 String Literals + + function scanStringLiteral() { + var str = '', quote, start, ch, code, unescaped, restore, octal = false; + + quote = source[index]; + assert((quote === '\'' || quote === '"'), + 'String literal must starts with a quote'); + + start = index; + ++index; + + while (index < length) { + ch = source[index++]; + + if (ch === quote) { + quote = ''; + break; + } else if (ch === '\\') { + ch = source[index++]; + if (!ch || !isLineTerminator(ch.charCodeAt(0))) { + switch (ch) { + case 'n': + str += '\n'; + break; + case 'r': + str += '\r'; + break; + case 't': + str += '\t'; + break; + case 'u': + case 'x': + if (source[index] === '{') { + ++index; + str += scanUnicodeCodePointEscape(); + } else { + restore = index; + unescaped = scanHexEscape(ch); + if (unescaped) { + str += unescaped; + } else { + index = restore; + str += ch; + } + } + break; + case 'b': + str += '\b'; + break; + case 'f': + str += '\f'; + break; + case 'v': + str += '\x0B'; + break; + + default: + if (isOctalDigit(ch)) { + code = '01234567'.indexOf(ch); + + // \0 is not octal escape sequence + if (code !== 0) { + octal = true; + } + + if (index < length && isOctalDigit(source[index])) { + octal = true; + code = code * 8 + '01234567'.indexOf(source[index++]); + + // 3 digits are only allowed when string starts + // with 0, 1, 2, 3 + if ('0123'.indexOf(ch) >= 0 && + index < length && + isOctalDigit(source[index])) { + code = code * 8 + '01234567'.indexOf(source[index++]); + } + } + str += String.fromCharCode(code); + } else { + str += ch; + } + break; + } + } else { + ++lineNumber; + if (ch === '\r' && source[index] === '\n') { + ++index; + } + lineStart = index; + } + } else if (isLineTerminator(ch.charCodeAt(0))) { + break; + } else { + str += ch; + } + } + + if (quote !== '') { + throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); + } + + return { + type: Token.StringLiteral, + value: str, + octal: octal, + lineNumber: lineNumber, + lineStart: lineStart, + range: [start, index] + }; + } + + function scanTemplate() { + var cooked = '', ch, start, terminated, tail, restore, unescaped, code, octal; + + terminated = false; + tail = false; + start = index; + + ++index; + + while (index < length) { + ch = source[index++]; + if (ch === '`') { + tail = true; + terminated = true; + break; + } else if (ch === '$') { + if (source[index] === '{') { + ++index; + terminated = true; + break; + } + cooked += ch; + } else if (ch === '\\') { + ch = source[index++]; + if (!isLineTerminator(ch.charCodeAt(0))) { + switch (ch) { + case 'n': + cooked += '\n'; + break; + case 'r': + cooked += '\r'; + break; + case 't': + cooked += '\t'; + break; + case 'u': + case 'x': + if (source[index] === '{') { + ++index; + cooked += scanUnicodeCodePointEscape(); + } else { + restore = index; + unescaped = scanHexEscape(ch); + if (unescaped) { + cooked += unescaped; + } else { + index = restore; + cooked += ch; + } + } + break; + case 'b': + cooked += '\b'; + break; + case 'f': + cooked += '\f'; + break; + case 'v': + cooked += '\v'; + break; + + default: + if (isOctalDigit(ch)) { + code = '01234567'.indexOf(ch); + + // \0 is not octal escape sequence + if (code !== 0) { + octal = true; + } + + if (index < length && isOctalDigit(source[index])) { + octal = true; + code = code * 8 + '01234567'.indexOf(source[index++]); + + // 3 digits are only allowed when string starts + // with 0, 1, 2, 3 + if ('0123'.indexOf(ch) >= 0 && + index < length && + isOctalDigit(source[index])) { + code = code * 8 + '01234567'.indexOf(source[index++]); + } + } + cooked += String.fromCharCode(code); + } else { + cooked += ch; + } + break; + } + } else { + ++lineNumber; + if (ch === '\r' && source[index] === '\n') { + ++index; + } + lineStart = index; + } + } else if (isLineTerminator(ch.charCodeAt(0))) { + ++lineNumber; + if (ch === '\r' && source[index] === '\n') { + ++index; + } + lineStart = index; + cooked += '\n'; + } else { + cooked += ch; + } + } + + if (!terminated) { + throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); + } + + return { + type: Token.Template, + value: { + cooked: cooked, + raw: source.slice(start + 1, index - ((tail) ? 1 : 2)) + }, + tail: tail, + octal: octal, + lineNumber: lineNumber, + lineStart: lineStart, + range: [start, index] + }; + } + + function scanTemplateElement(option) { + var startsWith, template; + + lookahead = null; + skipComment(); + + startsWith = (option.head) ? '`' : '}'; + + if (source[index] !== startsWith) { + throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); + } + + template = scanTemplate(); + + peek(); + + return template; + } + + function scanRegExp() { + var str, ch, start, pattern, flags, value, classMarker = false, restore, terminated = false, tmp; + + lookahead = null; + skipComment(); + + start = index; + ch = source[index]; + assert(ch === '/', 'Regular expression literal must start with a slash'); + str = source[index++]; + + while (index < length) { + ch = source[index++]; + str += ch; + if (classMarker) { + if (ch === ']') { + classMarker = false; + } + } else { + if (ch === '\\') { + ch = source[index++]; + // ECMA-262 7.8.5 + if (isLineTerminator(ch.charCodeAt(0))) { + throwError({}, Messages.UnterminatedRegExp); + } + str += ch; + } else if (ch === '/') { + terminated = true; + break; + } else if (ch === '[') { + classMarker = true; + } else if (isLineTerminator(ch.charCodeAt(0))) { + throwError({}, Messages.UnterminatedRegExp); + } + } + } + + if (!terminated) { + throwError({}, Messages.UnterminatedRegExp); + } + + // Exclude leading and trailing slash. + pattern = str.substr(1, str.length - 2); + + flags = ''; + while (index < length) { + ch = source[index]; + if (!isIdentifierPart(ch.charCodeAt(0))) { + break; + } + + ++index; + if (ch === '\\' && index < length) { + ch = source[index]; + if (ch === 'u') { + ++index; + restore = index; + ch = scanHexEscape('u'); + if (ch) { + flags += ch; + for (str += '\\u'; restore < index; ++restore) { + str += source[restore]; + } + } else { + index = restore; + flags += 'u'; + str += '\\u'; + } + } else { + str += '\\'; + } + } else { + flags += ch; + str += ch; + } + } + + tmp = pattern; + if (flags.indexOf('u') >= 0) { + // Replace each astral symbol and every Unicode code point + // escape sequence that represents such a symbol with a single + // ASCII symbol to avoid throwing on regular expressions that + // are only valid in combination with the `/u` flag. + tmp = tmp + .replace(/\\u\{([0-9a-fA-F]{5,6})\}/g, 'x') + .replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g, 'x'); + } + + // First, detect invalid regular expressions. + try { + value = new RegExp(tmp); + } catch (e) { + throwError({}, Messages.InvalidRegExp); + } + + // Return a regular expression object for this pattern-flag pair, or + // `null` in case the current environment doesn't support the flags it + // uses. + try { + value = new RegExp(pattern, flags); + } catch (exception) { + value = null; + } + + peek(); + + if (extra.tokenize) { + return { + type: Token.RegularExpression, + value: value, + regex: { + pattern: pattern, + flags: flags + }, + lineNumber: lineNumber, + lineStart: lineStart, + range: [start, index] + }; + } + return { + literal: str, + value: value, + regex: { + pattern: pattern, + flags: flags + }, + range: [start, index] + }; + } + + function isIdentifierName(token) { + return token.type === Token.Identifier || + token.type === Token.Keyword || + token.type === Token.BooleanLiteral || + token.type === Token.NullLiteral; + } + + function advanceSlash() { + var prevToken, + checkToken; + // Using the following algorithm: + // https://github.com/mozilla/sweet.js/wiki/design + prevToken = extra.tokens[extra.tokens.length - 1]; + if (!prevToken) { + // Nothing before that: it cannot be a division. + return scanRegExp(); + } + if (prevToken.type === 'Punctuator') { + if (prevToken.value === ')') { + checkToken = extra.tokens[extra.openParenToken - 1]; + if (checkToken && + checkToken.type === 'Keyword' && + (checkToken.value === 'if' || + checkToken.value === 'while' || + checkToken.value === 'for' || + checkToken.value === 'with')) { + return scanRegExp(); + } + return scanPunctuator(); + } + if (prevToken.value === '}') { + // Dividing a function by anything makes little sense, + // but we have to check for that. + if (extra.tokens[extra.openCurlyToken - 3] && + extra.tokens[extra.openCurlyToken - 3].type === 'Keyword') { + // Anonymous function. + checkToken = extra.tokens[extra.openCurlyToken - 4]; + if (!checkToken) { + return scanPunctuator(); + } + } else if (extra.tokens[extra.openCurlyToken - 4] && + extra.tokens[extra.openCurlyToken - 4].type === 'Keyword') { + // Named function. + checkToken = extra.tokens[extra.openCurlyToken - 5]; + if (!checkToken) { + return scanRegExp(); + } + } else { + return scanPunctuator(); + } + // checkToken determines whether the function is + // a declaration or an expression. + if (FnExprTokens.indexOf(checkToken.value) >= 0) { + // It is an expression. + return scanPunctuator(); + } + // It is a declaration. + return scanRegExp(); + } + return scanRegExp(); + } + if (prevToken.type === 'Keyword') { + return scanRegExp(); + } + return scanPunctuator(); + } + + function advance() { + var ch; + + skipComment(); + + if (index >= length) { + return { + type: Token.EOF, + lineNumber: lineNumber, + lineStart: lineStart, + range: [index, index] + }; + } + + ch = source.charCodeAt(index); + + // Very common: ( and ) and ; + if (ch === 40 || ch === 41 || ch === 58) { + return scanPunctuator(); + } + + // String literal starts with single quote (#39) or double quote (#34). + if (ch === 39 || ch === 34) { + return scanStringLiteral(); + } + + if (ch === 96) { + return scanTemplate(); + } + if (isIdentifierStart(ch)) { + return scanIdentifier(); + } + + // Dot (.) char #46 can also start a floating-point number, hence the need + // to check the next character. + if (ch === 46) { + if (isDecimalDigit(source.charCodeAt(index + 1))) { + return scanNumericLiteral(); + } + return scanPunctuator(); + } + + if (isDecimalDigit(ch)) { + return scanNumericLiteral(); + } + + // Slash (/) char #47 can also start a regex. + if (extra.tokenize && ch === 47) { + return advanceSlash(); + } + + return scanPunctuator(); + } + + function lex() { + var token; + + token = lookahead; + index = token.range[1]; + lineNumber = token.lineNumber; + lineStart = token.lineStart; + + lookahead = advance(); + + index = token.range[1]; + lineNumber = token.lineNumber; + lineStart = token.lineStart; + + return token; + } + + function peek() { + var pos, line, start; + + pos = index; + line = lineNumber; + start = lineStart; + lookahead = advance(); + index = pos; + lineNumber = line; + lineStart = start; + } + + function lookahead2() { + var adv, pos, line, start, result; + + // If we are collecting the tokens, don't grab the next one yet. + adv = (typeof extra.advance === 'function') ? extra.advance : advance; + + pos = index; + line = lineNumber; + start = lineStart; + + // Scan for the next immediate token. + if (lookahead === null) { + lookahead = adv(); + } + index = lookahead.range[1]; + lineNumber = lookahead.lineNumber; + lineStart = lookahead.lineStart; + + // Grab the token right after. + result = adv(); + index = pos; + lineNumber = line; + lineStart = start; + + return result; + } + + function markerCreate() { + if (!extra.loc && !extra.range) { + return undefined; + } + skipComment(); + return {offset: index, line: lineNumber, col: index - lineStart}; + } + + function processComment(node) { + var lastChild, + trailingComments, + bottomRight = extra.bottomRightStack, + last = bottomRight[bottomRight.length - 1]; + + if (node.type === Syntax.Program) { + if (node.body.length > 0) { + return; + } + } + + if (extra.trailingComments.length > 0) { + if (extra.trailingComments[0].range[0] >= node.range[1]) { + trailingComments = extra.trailingComments; + extra.trailingComments = []; + } else { + extra.trailingComments.length = 0; + } + } else { + if (last && last.trailingComments && last.trailingComments[0].range[0] >= node.range[1]) { + trailingComments = last.trailingComments; + delete last.trailingComments; + } + } + + // Eating the stack. + if (last) { + while (last && last.range[0] >= node.range[0]) { + lastChild = last; + last = bottomRight.pop(); + } + } + + if (lastChild) { + if (lastChild.leadingComments && lastChild.leadingComments[lastChild.leadingComments.length - 1].range[1] <= node.range[0]) { + node.leadingComments = lastChild.leadingComments; + delete lastChild.leadingComments; + } + } else if (extra.leadingComments.length > 0 && extra.leadingComments[extra.leadingComments.length - 1].range[1] <= node.range[0]) { + node.leadingComments = extra.leadingComments; + extra.leadingComments = []; + } + + if (trailingComments) { + node.trailingComments = trailingComments; + } + + bottomRight.push(node); + } + + function markerApply(marker, node) { + if (extra.range) { + node.range = [marker.offset, index]; + } + if (extra.loc) { + node.loc = { + start: { + line: marker.line, + column: marker.col + }, + end: { + line: lineNumber, + column: index - lineStart + } + }; + node = delegate.postProcess(node); + } + if (extra.attachComment) { + processComment(node); + } + return node; + } + + SyntaxTreeDelegate = { + + name: 'SyntaxTree', + + postProcess: function (node) { + return node; + }, + + createArrayExpression: function (elements) { + return { + type: Syntax.ArrayExpression, + elements: elements + }; + }, + + createAssignmentExpression: function (operator, left, right) { + return { + type: Syntax.AssignmentExpression, + operator: operator, + left: left, + right: right + }; + }, + + createBinaryExpression: function (operator, left, right) { + var type = (operator === '||' || operator === '&&') ? Syntax.LogicalExpression : + Syntax.BinaryExpression; + return { + type: type, + operator: operator, + left: left, + right: right + }; + }, + + createBlockStatement: function (body) { + return { + type: Syntax.BlockStatement, + body: body + }; + }, + + createBreakStatement: function (label) { + return { + type: Syntax.BreakStatement, + label: label + }; + }, + + createCallExpression: function (callee, args) { + return { + type: Syntax.CallExpression, + callee: callee, + 'arguments': args + }; + }, + + createCatchClause: function (param, body) { + return { + type: Syntax.CatchClause, + param: param, + body: body + }; + }, + + createConditionalExpression: function (test, consequent, alternate) { + return { + type: Syntax.ConditionalExpression, + test: test, + consequent: consequent, + alternate: alternate + }; + }, + + createContinueStatement: function (label) { + return { + type: Syntax.ContinueStatement, + label: label + }; + }, + + createDebuggerStatement: function () { + return { + type: Syntax.DebuggerStatement + }; + }, + + createDoWhileStatement: function (body, test) { + return { + type: Syntax.DoWhileStatement, + body: body, + test: test + }; + }, + + createEmptyStatement: function () { + return { + type: Syntax.EmptyStatement + }; + }, + + createExpressionStatement: function (expression) { + return { + type: Syntax.ExpressionStatement, + expression: expression + }; + }, + + createForStatement: function (init, test, update, body) { + return { + type: Syntax.ForStatement, + init: init, + test: test, + update: update, + body: body + }; + }, + + createForInStatement: function (left, right, body) { + return { + type: Syntax.ForInStatement, + left: left, + right: right, + body: body, + each: false + }; + }, + + createForOfStatement: function (left, right, body) { + return { + type: Syntax.ForOfStatement, + left: left, + right: right, + body: body + }; + }, + + createFunctionDeclaration: function (id, params, defaults, body, rest, generator, expression) { + return { + type: Syntax.FunctionDeclaration, + id: id, + params: params, + defaults: defaults, + body: body, + rest: rest, + generator: generator, + expression: expression + }; + }, + + createFunctionExpression: function (id, params, defaults, body, rest, generator, expression) { + return { + type: Syntax.FunctionExpression, + id: id, + params: params, + defaults: defaults, + body: body, + rest: rest, + generator: generator, + expression: expression + }; + }, + + createIdentifier: function (name) { + return { + type: Syntax.Identifier, + name: name + }; + }, + + createIfStatement: function (test, consequent, alternate) { + return { + type: Syntax.IfStatement, + test: test, + consequent: consequent, + alternate: alternate + }; + }, + + createLabeledStatement: function (label, body) { + return { + type: Syntax.LabeledStatement, + label: label, + body: body + }; + }, + + createLiteral: function (token) { + var object = { + type: Syntax.Literal, + value: token.value, + raw: source.slice(token.range[0], token.range[1]) + }; + if (token.regex) { + object.regex = token.regex; + } + return object; + }, + + createMemberExpression: function (accessor, object, property) { + return { + type: Syntax.MemberExpression, + computed: accessor === '[', + object: object, + property: property + }; + }, + + createNewExpression: function (callee, args) { + return { + type: Syntax.NewExpression, + callee: callee, + 'arguments': args + }; + }, + + createObjectExpression: function (properties) { + return { + type: Syntax.ObjectExpression, + properties: properties + }; + }, + + createPostfixExpression: function (operator, argument) { + return { + type: Syntax.UpdateExpression, + operator: operator, + argument: argument, + prefix: false + }; + }, + + createProgram: function (body) { + return { + type: Syntax.Program, + body: body + }; + }, + + createProperty: function (kind, key, value, method, shorthand, computed) { + return { + type: Syntax.Property, + key: key, + value: value, + kind: kind, + method: method, + shorthand: shorthand, + computed: computed + }; + }, + + createReturnStatement: function (argument) { + return { + type: Syntax.ReturnStatement, + argument: argument + }; + }, + + createSequenceExpression: function (expressions) { + return { + type: Syntax.SequenceExpression, + expressions: expressions + }; + }, + + createSwitchCase: function (test, consequent) { + return { + type: Syntax.SwitchCase, + test: test, + consequent: consequent + }; + }, + + createSwitchStatement: function (discriminant, cases) { + return { + type: Syntax.SwitchStatement, + discriminant: discriminant, + cases: cases + }; + }, + + createThisExpression: function () { + return { + type: Syntax.ThisExpression + }; + }, + + createThrowStatement: function (argument) { + return { + type: Syntax.ThrowStatement, + argument: argument + }; + }, + + createTryStatement: function (block, guardedHandlers, handlers, finalizer) { + return { + type: Syntax.TryStatement, + block: block, + guardedHandlers: guardedHandlers, + handlers: handlers, + finalizer: finalizer + }; + }, + + createUnaryExpression: function (operator, argument) { + if (operator === '++' || operator === '--') { + return { + type: Syntax.UpdateExpression, + operator: operator, + argument: argument, + prefix: true + }; + } + return { + type: Syntax.UnaryExpression, + operator: operator, + argument: argument, + prefix: true + }; + }, + + createVariableDeclaration: function (declarations, kind) { + return { + type: Syntax.VariableDeclaration, + declarations: declarations, + kind: kind + }; + }, + + createVariableDeclarator: function (id, init) { + return { + type: Syntax.VariableDeclarator, + id: id, + init: init + }; + }, + + createWhileStatement: function (test, body) { + return { + type: Syntax.WhileStatement, + test: test, + body: body + }; + }, + + createWithStatement: function (object, body) { + return { + type: Syntax.WithStatement, + object: object, + body: body + }; + }, + + createTemplateElement: function (value, tail) { + return { + type: Syntax.TemplateElement, + value: value, + tail: tail + }; + }, + + createTemplateLiteral: function (quasis, expressions) { + return { + type: Syntax.TemplateLiteral, + quasis: quasis, + expressions: expressions + }; + }, + + createSpreadElement: function (argument) { + return { + type: Syntax.SpreadElement, + argument: argument + }; + }, + + createTaggedTemplateExpression: function (tag, quasi) { + return { + type: Syntax.TaggedTemplateExpression, + tag: tag, + quasi: quasi + }; + }, + + createArrowFunctionExpression: function (params, defaults, body, rest, expression) { + return { + type: Syntax.ArrowFunctionExpression, + id: null, + params: params, + defaults: defaults, + body: body, + rest: rest, + generator: false, + expression: expression + }; + }, + + createMethodDefinition: function (propertyType, kind, key, value) { + return { + type: Syntax.MethodDefinition, + key: key, + value: value, + kind: kind, + 'static': propertyType === ClassPropertyType.static + }; + }, + + createClassBody: function (body) { + return { + type: Syntax.ClassBody, + body: body + }; + }, + + createClassExpression: function (id, superClass, body) { + return { + type: Syntax.ClassExpression, + id: id, + superClass: superClass, + body: body + }; + }, + + createClassDeclaration: function (id, superClass, body) { + return { + type: Syntax.ClassDeclaration, + id: id, + superClass: superClass, + body: body + }; + }, + + createModuleSpecifier: function (token) { + return { + type: Syntax.ModuleSpecifier, + value: token.value, + raw: source.slice(token.range[0], token.range[1]) + }; + }, + + createExportSpecifier: function (id, name) { + return { + type: Syntax.ExportSpecifier, + id: id, + name: name + }; + }, + + createExportBatchSpecifier: function () { + return { + type: Syntax.ExportBatchSpecifier + }; + }, + + createImportDefaultSpecifier: function (id) { + return { + type: Syntax.ImportDefaultSpecifier, + id: id + }; + }, + + createImportNamespaceSpecifier: function (id) { + return { + type: Syntax.ImportNamespaceSpecifier, + id: id + }; + }, + + createExportDeclaration: function (isDefault, declaration, specifiers, source) { + return { + type: Syntax.ExportDeclaration, + 'default': !!isDefault, + declaration: declaration, + specifiers: specifiers, + source: source + }; + }, + + createImportSpecifier: function (id, name) { + return { + type: Syntax.ImportSpecifier, + id: id, + name: name + }; + }, + + createImportDeclaration: function (specifiers, source) { + return { + type: Syntax.ImportDeclaration, + specifiers: specifiers, + source: source + }; + }, + + createYieldExpression: function (argument, delegate) { + return { + type: Syntax.YieldExpression, + argument: argument, + delegate: delegate + }; + }, + + createComprehensionExpression: function (filter, blocks, body) { + return { + type: Syntax.ComprehensionExpression, + filter: filter, + blocks: blocks, + body: body + }; + } + + }; + + // Return true if there is a line terminator before the next token. + + function peekLineTerminator() { + var pos, line, start, found; + + pos = index; + line = lineNumber; + start = lineStart; + skipComment(); + found = lineNumber !== line; + index = pos; + lineNumber = line; + lineStart = start; + + return found; + } + + // Throw an exception + + function throwError(token, messageFormat) { + var error, + args = Array.prototype.slice.call(arguments, 2), + msg = messageFormat.replace( + /%(\d)/g, + function (whole, index) { + assert(index < args.length, 'Message reference must be in range'); + return args[index]; + } + ); + + if (typeof token.lineNumber === 'number') { + error = new Error('Line ' + token.lineNumber + ': ' + msg); + error.index = token.range[0]; + error.lineNumber = token.lineNumber; + error.column = token.range[0] - lineStart + 1; + } else { + error = new Error('Line ' + lineNumber + ': ' + msg); + error.index = index; + error.lineNumber = lineNumber; + error.column = index - lineStart + 1; + } + + error.description = msg; + throw error; + } + + function throwErrorTolerant() { + try { + throwError.apply(null, arguments); + } catch (e) { + if (extra.errors) { + extra.errors.push(e); + } else { + throw e; + } + } + } + + + // Throw an exception because of the token. + + function throwUnexpected(token) { + if (token.type === Token.EOF) { + throwError(token, Messages.UnexpectedEOS); + } + + if (token.type === Token.NumericLiteral) { + throwError(token, Messages.UnexpectedNumber); + } + + if (token.type === Token.StringLiteral) { + throwError(token, Messages.UnexpectedString); + } + + if (token.type === Token.Identifier) { + throwError(token, Messages.UnexpectedIdentifier); + } + + if (token.type === Token.Keyword) { + if (isFutureReservedWord(token.value)) { + throwError(token, Messages.UnexpectedReserved); + } else if (strict && isStrictModeReservedWord(token.value)) { + throwErrorTolerant(token, Messages.StrictReservedWord); + return; + } + throwError(token, Messages.UnexpectedToken, token.value); + } + + if (token.type === Token.Template) { + throwError(token, Messages.UnexpectedTemplate, token.value.raw); + } + + // BooleanLiteral, NullLiteral, or Punctuator. + throwError(token, Messages.UnexpectedToken, token.value); + } + + // Expect the next token to match the specified punctuator. + // If not, an exception will be thrown. + + function expect(value) { + var token = lex(); + if (token.type !== Token.Punctuator || token.value !== value) { + throwUnexpected(token); + } + } + + // Expect the next token to match the specified keyword. + // If not, an exception will be thrown. + + function expectKeyword(keyword) { + var token = lex(); + if (token.type !== Token.Keyword || token.value !== keyword) { + throwUnexpected(token); + } + } + + // Return true if the next token matches the specified punctuator. + + function match(value) { + return lookahead.type === Token.Punctuator && lookahead.value === value; + } + + // Return true if the next token matches the specified keyword + + function matchKeyword(keyword) { + return lookahead.type === Token.Keyword && lookahead.value === keyword; + } + + + // Return true if the next token matches the specified contextual keyword + + function matchContextualKeyword(keyword) { + return lookahead.type === Token.Identifier && lookahead.value === keyword; + } + + // Return true if the next token is an assignment operator + + function matchAssign() { + var op; + + if (lookahead.type !== Token.Punctuator) { + return false; + } + op = lookahead.value; + return op === '=' || + op === '*=' || + op === '/=' || + op === '%=' || + op === '+=' || + op === '-=' || + op === '<<=' || + op === '>>=' || + op === '>>>=' || + op === '&=' || + op === '^=' || + op === '|='; + } + + function consumeSemicolon() { + var line, oldIndex = index, oldLineNumber = lineNumber, + oldLineStart = lineStart, oldLookahead = lookahead; + + // Catch the very common case first: immediately a semicolon (char #59). + if (source.charCodeAt(index) === 59) { + lex(); + return; + } + + line = lineNumber; + skipComment(); + if (lineNumber !== line) { + index = oldIndex; + lineNumber = oldLineNumber; + lineStart = oldLineStart; + lookahead = oldLookahead; + return; + } + + if (match(';')) { + lex(); + return; + } + + if (lookahead.type !== Token.EOF && !match('}')) { + throwUnexpected(lookahead); + } + } + + // Return true if provided expression is LeftHandSideExpression + + function isLeftHandSide(expr) { + return expr.type === Syntax.Identifier || expr.type === Syntax.MemberExpression; + } + + function isAssignableLeftHandSide(expr) { + return isLeftHandSide(expr) || expr.type === Syntax.ObjectPattern || expr.type === Syntax.ArrayPattern; + } + + // 11.1.4 Array Initialiser + + function parseArrayInitialiser() { + var elements = [], blocks = [], filter = null, tmp, possiblecomprehension = true, body, + marker = markerCreate(); + + expect('['); + while (!match(']')) { + if (lookahead.value === 'for' && + lookahead.type === Token.Keyword) { + if (!possiblecomprehension) { + throwError({}, Messages.ComprehensionError); + } + matchKeyword('for'); + tmp = parseForStatement({ignoreBody: true}); + tmp.of = tmp.type === Syntax.ForOfStatement; + tmp.type = Syntax.ComprehensionBlock; + if (tmp.left.kind) { // can't be let or const + throwError({}, Messages.ComprehensionError); + } + blocks.push(tmp); + } else if (lookahead.value === 'if' && + lookahead.type === Token.Keyword) { + if (!possiblecomprehension) { + throwError({}, Messages.ComprehensionError); + } + expectKeyword('if'); + expect('('); + filter = parseExpression(); + expect(')'); + } else if (lookahead.value === ',' && + lookahead.type === Token.Punctuator) { + possiblecomprehension = false; // no longer allowed. + lex(); + elements.push(null); + } else { + tmp = parseSpreadOrAssignmentExpression(); + elements.push(tmp); + if (tmp && tmp.type === Syntax.SpreadElement) { + if (!match(']')) { + throwError({}, Messages.ElementAfterSpreadElement); + } + } else if (!(match(']') || matchKeyword('for') || matchKeyword('if'))) { + expect(','); // this lexes. + possiblecomprehension = false; + } + } + } + + expect(']'); + + if (filter && !blocks.length) { + throwError({}, Messages.ComprehensionRequiresBlock); + } + + if (blocks.length) { + if (elements.length !== 1) { + throwError({}, Messages.ComprehensionError); + } + return markerApply(marker, delegate.createComprehensionExpression(filter, blocks, elements[0])); + } + return markerApply(marker, delegate.createArrayExpression(elements)); + } + + // 11.1.5 Object Initialiser + + function parsePropertyFunction(options) { + var previousStrict, previousYieldAllowed, params, defaults, body, + marker = markerCreate(); + + previousStrict = strict; + previousYieldAllowed = state.yieldAllowed; + state.yieldAllowed = options.generator; + params = options.params || []; + defaults = options.defaults || []; + + body = parseConciseBody(); + if (options.name && strict && isRestrictedWord(params[0].name)) { + throwErrorTolerant(options.name, Messages.StrictParamName); + } + strict = previousStrict; + state.yieldAllowed = previousYieldAllowed; + + return markerApply(marker, delegate.createFunctionExpression( + null, + params, + defaults, + body, + options.rest || null, + options.generator, + body.type !== Syntax.BlockStatement + )); + } + + + function parsePropertyMethodFunction(options) { + var previousStrict, tmp, method; + + previousStrict = strict; + strict = true; + + tmp = parseParams(); + + if (tmp.stricted) { + throwErrorTolerant(tmp.stricted, tmp.message); + } + + + method = parsePropertyFunction({ + params: tmp.params, + defaults: tmp.defaults, + rest: tmp.rest, + generator: options.generator + }); + + strict = previousStrict; + + return method; + } + + + function parseObjectPropertyKey() { + var marker = markerCreate(), + token = lex(), + propertyKey, + result; + + // Note: This function is called only from parseObjectProperty(), where + // EOF and Punctuator tokens are already filtered out. + + if (token.type === Token.StringLiteral || token.type === Token.NumericLiteral) { + if (strict && token.octal) { + throwErrorTolerant(token, Messages.StrictOctalLiteral); + } + return markerApply(marker, delegate.createLiteral(token)); + } + + if (token.type === Token.Punctuator && token.value === '[') { + // For computed properties we should skip the [ and ], and + // capture in marker only the assignment expression itself. + marker = markerCreate(); + propertyKey = parseAssignmentExpression(); + result = markerApply(marker, propertyKey); + expect(']'); + return result; + } + + return markerApply(marker, delegate.createIdentifier(token.value)); + } + + function parseObjectProperty() { + var token, key, id, value, param, expr, computed, + marker = markerCreate(); + + token = lookahead; + computed = (token.value === '['); + + if (token.type === Token.Identifier || computed) { + + id = parseObjectPropertyKey(); + + // Property Assignment: Getter and Setter. + + if (token.value === 'get' && !(match(':') || match('('))) { + computed = (lookahead.value === '['); + key = parseObjectPropertyKey(); + expect('('); + expect(')'); + return markerApply(marker, delegate.createProperty('get', key, parsePropertyFunction({ generator: false }), false, false, computed)); + } + if (token.value === 'set' && !(match(':') || match('('))) { + computed = (lookahead.value === '['); + key = parseObjectPropertyKey(); + expect('('); + token = lookahead; + param = [ parseVariableIdentifier() ]; + expect(')'); + return markerApply(marker, delegate.createProperty('set', key, parsePropertyFunction({ params: param, generator: false, name: token }), false, false, computed)); + } + if (match(':')) { + lex(); + return markerApply(marker, delegate.createProperty('init', id, parseAssignmentExpression(), false, false, computed)); + } + if (match('(')) { + return markerApply(marker, delegate.createProperty('init', id, parsePropertyMethodFunction({ generator: false }), true, false, computed)); + } + if (computed) { + // Computed properties can only be used with full notation. + throwUnexpected(lookahead); + } + return markerApply(marker, delegate.createProperty('init', id, id, false, true, false)); + } + if (token.type === Token.EOF || token.type === Token.Punctuator) { + if (!match('*')) { + throwUnexpected(token); + } + lex(); + + computed = (lookahead.type === Token.Punctuator && lookahead.value === '['); + + id = parseObjectPropertyKey(); + + if (!match('(')) { + throwUnexpected(lex()); + } + + return markerApply(marker, delegate.createProperty('init', id, parsePropertyMethodFunction({ generator: true }), true, false, computed)); + } + key = parseObjectPropertyKey(); + if (match(':')) { + lex(); + return markerApply(marker, delegate.createProperty('init', key, parseAssignmentExpression(), false, false, false)); + } + if (match('(')) { + return markerApply(marker, delegate.createProperty('init', key, parsePropertyMethodFunction({ generator: false }), true, false, false)); + } + throwUnexpected(lex()); + } + + function parseObjectInitialiser() { + var properties = [], property, name, key, kind, map = {}, toString = String, + marker = markerCreate(); + + expect('{'); + + while (!match('}')) { + property = parseObjectProperty(); + + if (property.key.type === Syntax.Identifier) { + name = property.key.name; + } else { + name = toString(property.key.value); + } + kind = (property.kind === 'init') ? PropertyKind.Data : (property.kind === 'get') ? PropertyKind.Get : PropertyKind.Set; + + key = '$' + name; + if (Object.prototype.hasOwnProperty.call(map, key)) { + if (map[key] === PropertyKind.Data) { + if (strict && kind === PropertyKind.Data) { + throwErrorTolerant({}, Messages.StrictDuplicateProperty); + } else if (kind !== PropertyKind.Data) { + throwErrorTolerant({}, Messages.AccessorDataProperty); + } + } else { + if (kind === PropertyKind.Data) { + throwErrorTolerant({}, Messages.AccessorDataProperty); + } else if (map[key] & kind) { + throwErrorTolerant({}, Messages.AccessorGetSet); + } + } + map[key] |= kind; + } else { + map[key] = kind; + } + + properties.push(property); + + if (!match('}')) { + expect(','); + } + } + + expect('}'); + + return markerApply(marker, delegate.createObjectExpression(properties)); + } + + function parseTemplateElement(option) { + var marker = markerCreate(), + token = scanTemplateElement(option); + if (strict && token.octal) { + throwError(token, Messages.StrictOctalLiteral); + } + return markerApply(marker, delegate.createTemplateElement({ raw: token.value.raw, cooked: token.value.cooked }, token.tail)); + } + + function parseTemplateLiteral() { + var quasi, quasis, expressions, marker = markerCreate(); + + quasi = parseTemplateElement({ head: true }); + quasis = [ quasi ]; + expressions = []; + + while (!quasi.tail) { + expressions.push(parseExpression()); + quasi = parseTemplateElement({ head: false }); + quasis.push(quasi); + } + + return markerApply(marker, delegate.createTemplateLiteral(quasis, expressions)); + } + + // 11.1.6 The Grouping Operator + + function parseGroupExpression() { + var expr; + + expect('('); + + ++state.parenthesizedCount; + + expr = parseExpression(); + + expect(')'); + + return expr; + } + + + // 11.1 Primary Expressions + + function parsePrimaryExpression() { + var marker, type, token, expr; + + type = lookahead.type; + + if (type === Token.Identifier) { + marker = markerCreate(); + return markerApply(marker, delegate.createIdentifier(lex().value)); + } + + if (type === Token.StringLiteral || type === Token.NumericLiteral) { + if (strict && lookahead.octal) { + throwErrorTolerant(lookahead, Messages.StrictOctalLiteral); + } + marker = markerCreate(); + return markerApply(marker, delegate.createLiteral(lex())); + } + + if (type === Token.Keyword) { + if (matchKeyword('this')) { + marker = markerCreate(); + lex(); + return markerApply(marker, delegate.createThisExpression()); + } + + if (matchKeyword('function')) { + return parseFunctionExpression(); + } + + if (matchKeyword('class')) { + return parseClassExpression(); + } + + if (matchKeyword('super')) { + marker = markerCreate(); + lex(); + return markerApply(marker, delegate.createIdentifier('super')); + } + } + + if (type === Token.BooleanLiteral) { + marker = markerCreate(); + token = lex(); + token.value = (token.value === 'true'); + return markerApply(marker, delegate.createLiteral(token)); + } + + if (type === Token.NullLiteral) { + marker = markerCreate(); + token = lex(); + token.value = null; + return markerApply(marker, delegate.createLiteral(token)); + } + + if (match('[')) { + return parseArrayInitialiser(); + } + + if (match('{')) { + return parseObjectInitialiser(); + } + + if (match('(')) { + return parseGroupExpression(); + } + + if (match('/') || match('/=')) { + marker = markerCreate(); + return markerApply(marker, delegate.createLiteral(scanRegExp())); + } + + if (type === Token.Template) { + return parseTemplateLiteral(); + } + + throwUnexpected(lex()); + } + + // 11.2 Left-Hand-Side Expressions + + function parseArguments() { + var args = [], arg; + + expect('('); + + if (!match(')')) { + while (index < length) { + arg = parseSpreadOrAssignmentExpression(); + args.push(arg); + + if (match(')')) { + break; + } else if (arg.type === Syntax.SpreadElement) { + throwError({}, Messages.ElementAfterSpreadElement); + } + + expect(','); + } + } + + expect(')'); + + return args; + } + + function parseSpreadOrAssignmentExpression() { + if (match('...')) { + var marker = markerCreate(); + lex(); + return markerApply(marker, delegate.createSpreadElement(parseAssignmentExpression())); + } + return parseAssignmentExpression(); + } + + function parseNonComputedProperty() { + var marker = markerCreate(), + token = lex(); + + if (!isIdentifierName(token)) { + throwUnexpected(token); + } + + return markerApply(marker, delegate.createIdentifier(token.value)); + } + + function parseNonComputedMember() { + expect('.'); + + return parseNonComputedProperty(); + } + + function parseComputedMember() { + var expr; + + expect('['); + + expr = parseExpression(); + + expect(']'); + + return expr; + } + + function parseNewExpression() { + var callee, args, marker = markerCreate(); + + expectKeyword('new'); + callee = parseLeftHandSideExpression(); + args = match('(') ? parseArguments() : []; + + return markerApply(marker, delegate.createNewExpression(callee, args)); + } + + function parseLeftHandSideExpressionAllowCall() { + var expr, args, marker = markerCreate(); + + expr = matchKeyword('new') ? parseNewExpression() : parsePrimaryExpression(); + + while (match('.') || match('[') || match('(') || lookahead.type === Token.Template) { + if (match('(')) { + args = parseArguments(); + expr = markerApply(marker, delegate.createCallExpression(expr, args)); + } else if (match('[')) { + expr = markerApply(marker, delegate.createMemberExpression('[', expr, parseComputedMember())); + } else if (match('.')) { + expr = markerApply(marker, delegate.createMemberExpression('.', expr, parseNonComputedMember())); + } else { + expr = markerApply(marker, delegate.createTaggedTemplateExpression(expr, parseTemplateLiteral())); + } + } + + return expr; + } + + function parseLeftHandSideExpression() { + var expr, marker = markerCreate(); + + expr = matchKeyword('new') ? parseNewExpression() : parsePrimaryExpression(); + + while (match('.') || match('[') || lookahead.type === Token.Template) { + if (match('[')) { + expr = markerApply(marker, delegate.createMemberExpression('[', expr, parseComputedMember())); + } else if (match('.')) { + expr = markerApply(marker, delegate.createMemberExpression('.', expr, parseNonComputedMember())); + } else { + expr = markerApply(marker, delegate.createTaggedTemplateExpression(expr, parseTemplateLiteral())); + } + } + + return expr; + } + + // 11.3 Postfix Expressions + + function parsePostfixExpression() { + var marker = markerCreate(), + expr = parseLeftHandSideExpressionAllowCall(), + token; + + if (lookahead.type !== Token.Punctuator) { + return expr; + } + + if ((match('++') || match('--')) && !peekLineTerminator()) { + // 11.3.1, 11.3.2 + if (strict && expr.type === Syntax.Identifier && isRestrictedWord(expr.name)) { + throwErrorTolerant({}, Messages.StrictLHSPostfix); + } + + if (!isLeftHandSide(expr)) { + throwError({}, Messages.InvalidLHSInAssignment); + } + + token = lex(); + expr = markerApply(marker, delegate.createPostfixExpression(token.value, expr)); + } + + return expr; + } + + // 11.4 Unary Operators + + function parseUnaryExpression() { + var marker, token, expr; + + if (lookahead.type !== Token.Punctuator && lookahead.type !== Token.Keyword) { + return parsePostfixExpression(); + } + + if (match('++') || match('--')) { + marker = markerCreate(); + token = lex(); + expr = parseUnaryExpression(); + // 11.4.4, 11.4.5 + if (strict && expr.type === Syntax.Identifier && isRestrictedWord(expr.name)) { + throwErrorTolerant({}, Messages.StrictLHSPrefix); + } + + if (!isLeftHandSide(expr)) { + throwError({}, Messages.InvalidLHSInAssignment); + } + + return markerApply(marker, delegate.createUnaryExpression(token.value, expr)); + } + + if (match('+') || match('-') || match('~') || match('!')) { + marker = markerCreate(); + token = lex(); + expr = parseUnaryExpression(); + return markerApply(marker, delegate.createUnaryExpression(token.value, expr)); + } + + if (matchKeyword('delete') || matchKeyword('void') || matchKeyword('typeof')) { + marker = markerCreate(); + token = lex(); + expr = parseUnaryExpression(); + expr = markerApply(marker, delegate.createUnaryExpression(token.value, expr)); + if (strict && expr.operator === 'delete' && expr.argument.type === Syntax.Identifier) { + throwErrorTolerant({}, Messages.StrictDelete); + } + return expr; + } + + return parsePostfixExpression(); + } + + function binaryPrecedence(token, allowIn) { + var prec = 0; + + if (token.type !== Token.Punctuator && token.type !== Token.Keyword) { + return 0; + } + + switch (token.value) { + case '||': + prec = 1; + break; + + case '&&': + prec = 2; + break; + + case '|': + prec = 3; + break; + + case '^': + prec = 4; + break; + + case '&': + prec = 5; + break; + + case '==': + case '!=': + case '===': + case '!==': + prec = 6; + break; + + case '<': + case '>': + case '<=': + case '>=': + case 'instanceof': + prec = 7; + break; + + case 'in': + prec = allowIn ? 7 : 0; + break; + + case '<<': + case '>>': + case '>>>': + prec = 8; + break; + + case '+': + case '-': + prec = 9; + break; + + case '*': + case '/': + case '%': + prec = 11; + break; + + default: + break; + } + + return prec; + } + + // 11.5 Multiplicative Operators + // 11.6 Additive Operators + // 11.7 Bitwise Shift Operators + // 11.8 Relational Operators + // 11.9 Equality Operators + // 11.10 Binary Bitwise Operators + // 11.11 Binary Logical Operators + + function parseBinaryExpression() { + var expr, token, prec, previousAllowIn, stack, right, operator, left, i, + marker, markers; + + previousAllowIn = state.allowIn; + state.allowIn = true; + + marker = markerCreate(); + left = parseUnaryExpression(); + + token = lookahead; + prec = binaryPrecedence(token, previousAllowIn); + if (prec === 0) { + return left; + } + token.prec = prec; + lex(); + + markers = [marker, markerCreate()]; + right = parseUnaryExpression(); + + stack = [left, token, right]; + + while ((prec = binaryPrecedence(lookahead, previousAllowIn)) > 0) { + + // Reduce: make a binary expression from the three topmost entries. + while ((stack.length > 2) && (prec <= stack[stack.length - 2].prec)) { + right = stack.pop(); + operator = stack.pop().value; + left = stack.pop(); + expr = delegate.createBinaryExpression(operator, left, right); + markers.pop(); + marker = markers.pop(); + markerApply(marker, expr); + stack.push(expr); + markers.push(marker); + } + + // Shift. + token = lex(); + token.prec = prec; + stack.push(token); + markers.push(markerCreate()); + expr = parseUnaryExpression(); + stack.push(expr); + } + + state.allowIn = previousAllowIn; + + // Final reduce to clean-up the stack. + i = stack.length - 1; + expr = stack[i]; + markers.pop(); + while (i > 1) { + expr = delegate.createBinaryExpression(stack[i - 1].value, stack[i - 2], expr); + i -= 2; + marker = markers.pop(); + markerApply(marker, expr); + } + + return expr; + } + + + // 11.12 Conditional Operator + + function parseConditionalExpression() { + var expr, previousAllowIn, consequent, alternate, marker = markerCreate(); + expr = parseBinaryExpression(); + + if (match('?')) { + lex(); + previousAllowIn = state.allowIn; + state.allowIn = true; + consequent = parseAssignmentExpression(); + state.allowIn = previousAllowIn; + expect(':'); + alternate = parseAssignmentExpression(); + + expr = markerApply(marker, delegate.createConditionalExpression(expr, consequent, alternate)); + } + + return expr; + } + + // 11.13 Assignment Operators + + function reinterpretAsAssignmentBindingPattern(expr) { + var i, len, property, element; + + if (expr.type === Syntax.ObjectExpression) { + expr.type = Syntax.ObjectPattern; + for (i = 0, len = expr.properties.length; i < len; i += 1) { + property = expr.properties[i]; + if (property.kind !== 'init') { + throwError({}, Messages.InvalidLHSInAssignment); + } + reinterpretAsAssignmentBindingPattern(property.value); + } + } else if (expr.type === Syntax.ArrayExpression) { + expr.type = Syntax.ArrayPattern; + for (i = 0, len = expr.elements.length; i < len; i += 1) { + element = expr.elements[i]; + if (element) { + reinterpretAsAssignmentBindingPattern(element); + } + } + } else if (expr.type === Syntax.Identifier) { + if (isRestrictedWord(expr.name)) { + throwError({}, Messages.InvalidLHSInAssignment); + } + } else if (expr.type === Syntax.SpreadElement) { + reinterpretAsAssignmentBindingPattern(expr.argument); + if (expr.argument.type === Syntax.ObjectPattern) { + throwError({}, Messages.ObjectPatternAsSpread); + } + } else { + if (expr.type !== Syntax.MemberExpression && expr.type !== Syntax.CallExpression && expr.type !== Syntax.NewExpression) { + throwError({}, Messages.InvalidLHSInAssignment); + } + } + } + + + function reinterpretAsDestructuredParameter(options, expr) { + var i, len, property, element; + + if (expr.type === Syntax.ObjectExpression) { + expr.type = Syntax.ObjectPattern; + for (i = 0, len = expr.properties.length; i < len; i += 1) { + property = expr.properties[i]; + if (property.kind !== 'init') { + throwError({}, Messages.InvalidLHSInFormalsList); + } + reinterpretAsDestructuredParameter(options, property.value); + } + } else if (expr.type === Syntax.ArrayExpression) { + expr.type = Syntax.ArrayPattern; + for (i = 0, len = expr.elements.length; i < len; i += 1) { + element = expr.elements[i]; + if (element) { + reinterpretAsDestructuredParameter(options, element); + } + } + } else if (expr.type === Syntax.Identifier) { + validateParam(options, expr, expr.name); + } else { + if (expr.type !== Syntax.MemberExpression) { + throwError({}, Messages.InvalidLHSInFormalsList); + } + } + } + + function reinterpretAsCoverFormalsList(expressions) { + var i, len, param, params, defaults, defaultCount, options, rest; + + params = []; + defaults = []; + defaultCount = 0; + rest = null; + options = { + paramSet: {} + }; + + for (i = 0, len = expressions.length; i < len; i += 1) { + param = expressions[i]; + if (param.type === Syntax.Identifier) { + params.push(param); + defaults.push(null); + validateParam(options, param, param.name); + } else if (param.type === Syntax.ObjectExpression || param.type === Syntax.ArrayExpression) { + reinterpretAsDestructuredParameter(options, param); + params.push(param); + defaults.push(null); + } else if (param.type === Syntax.SpreadElement) { + assert(i === len - 1, 'It is guaranteed that SpreadElement is last element by parseExpression'); + reinterpretAsDestructuredParameter(options, param.argument); + rest = param.argument; + } else if (param.type === Syntax.AssignmentExpression) { + params.push(param.left); + defaults.push(param.right); + ++defaultCount; + validateParam(options, param.left, param.left.name); + } else { + return null; + } + } + + if (options.message === Messages.StrictParamDupe) { + throwError( + strict ? options.stricted : options.firstRestricted, + options.message + ); + } + + if (defaultCount === 0) { + defaults = []; + } + + return { + params: params, + defaults: defaults, + rest: rest, + stricted: options.stricted, + firstRestricted: options.firstRestricted, + message: options.message + }; + } + + function parseArrowFunctionExpression(options, marker) { + var previousStrict, previousYieldAllowed, body; + + expect('=>'); + + previousStrict = strict; + previousYieldAllowed = state.yieldAllowed; + state.yieldAllowed = false; + body = parseConciseBody(); + + if (strict && options.firstRestricted) { + throwError(options.firstRestricted, options.message); + } + if (strict && options.stricted) { + throwErrorTolerant(options.stricted, options.message); + } + + strict = previousStrict; + state.yieldAllowed = previousYieldAllowed; + + return markerApply(marker, delegate.createArrowFunctionExpression( + options.params, + options.defaults, + body, + options.rest, + body.type !== Syntax.BlockStatement + )); + } + + function parseAssignmentExpression() { + var marker, expr, token, params, oldParenthesizedCount; + + // Note that 'yield' is treated as a keyword in strict mode, but a + // contextual keyword (identifier) in non-strict mode, so we need + // to use matchKeyword and matchContextualKeyword appropriately. + if ((state.yieldAllowed && matchContextualKeyword('yield')) || (strict && matchKeyword('yield'))) { + return parseYieldExpression(); + } + + oldParenthesizedCount = state.parenthesizedCount; + + marker = markerCreate(); + + if (match('(')) { + token = lookahead2(); + if ((token.type === Token.Punctuator && token.value === ')') || token.value === '...') { + params = parseParams(); + if (!match('=>')) { + throwUnexpected(lex()); + } + return parseArrowFunctionExpression(params, marker); + } + } + + token = lookahead; + expr = parseConditionalExpression(); + + if (match('=>') && + (state.parenthesizedCount === oldParenthesizedCount || + state.parenthesizedCount === (oldParenthesizedCount + 1))) { + if (expr.type === Syntax.Identifier) { + params = reinterpretAsCoverFormalsList([ expr ]); + } else if (expr.type === Syntax.SequenceExpression) { + params = reinterpretAsCoverFormalsList(expr.expressions); + } + if (params) { + return parseArrowFunctionExpression(params, marker); + } + } + + if (matchAssign()) { + // 11.13.1 + if (strict && expr.type === Syntax.Identifier && isRestrictedWord(expr.name)) { + throwErrorTolerant(token, Messages.StrictLHSAssignment); + } + + // ES.next draf 11.13 Runtime Semantics step 1 + if (match('=') && (expr.type === Syntax.ObjectExpression || expr.type === Syntax.ArrayExpression)) { + reinterpretAsAssignmentBindingPattern(expr); + } else if (!isLeftHandSide(expr)) { + throwError({}, Messages.InvalidLHSInAssignment); + } + + expr = markerApply(marker, delegate.createAssignmentExpression(lex().value, expr, parseAssignmentExpression())); + } + + return expr; + } + + // 11.14 Comma Operator + + function parseExpression() { + var marker, expr, expressions, sequence, coverFormalsList, spreadFound, oldParenthesizedCount; + + oldParenthesizedCount = state.parenthesizedCount; + + marker = markerCreate(); + expr = parseAssignmentExpression(); + expressions = [ expr ]; + + if (match(',')) { + while (index < length) { + if (!match(',')) { + break; + } + + lex(); + expr = parseSpreadOrAssignmentExpression(); + expressions.push(expr); + + if (expr.type === Syntax.SpreadElement) { + spreadFound = true; + if (!match(')')) { + throwError({}, Messages.ElementAfterSpreadElement); + } + break; + } + } + + sequence = markerApply(marker, delegate.createSequenceExpression(expressions)); + } + + if (match('=>')) { + // Do not allow nested parentheses on the LHS of the =>. + if (state.parenthesizedCount === oldParenthesizedCount || state.parenthesizedCount === (oldParenthesizedCount + 1)) { + expr = expr.type === Syntax.SequenceExpression ? expr.expressions : expressions; + coverFormalsList = reinterpretAsCoverFormalsList(expr); + if (coverFormalsList) { + return parseArrowFunctionExpression(coverFormalsList, marker); + } + } + throwUnexpected(lex()); + } + + if (spreadFound && lookahead2().value !== '=>') { + throwError({}, Messages.IllegalSpread); + } + + return sequence || expr; + } + + // 12.1 Block + + function parseStatementList() { + var list = [], + statement; + + while (index < length) { + if (match('}')) { + break; + } + statement = parseSourceElement(); + if (typeof statement === 'undefined') { + break; + } + list.push(statement); + } + + return list; + } + + function parseBlock() { + var block, marker = markerCreate(); + + expect('{'); + + block = parseStatementList(); + + expect('}'); + + return markerApply(marker, delegate.createBlockStatement(block)); + } + + // 12.2 Variable Statement + + function parseVariableIdentifier() { + var marker = markerCreate(), + token = lex(); + + if (token.type !== Token.Identifier) { + throwUnexpected(token); + } + + return markerApply(marker, delegate.createIdentifier(token.value)); + } + + function parseVariableDeclaration(kind) { + var id, + marker = markerCreate(), + init = null; + if (match('{')) { + id = parseObjectInitialiser(); + reinterpretAsAssignmentBindingPattern(id); + } else if (match('[')) { + id = parseArrayInitialiser(); + reinterpretAsAssignmentBindingPattern(id); + } else { + id = state.allowKeyword ? parseNonComputedProperty() : parseVariableIdentifier(); + // 12.2.1 + if (strict && isRestrictedWord(id.name)) { + throwErrorTolerant({}, Messages.StrictVarName); + } + } + + if (kind === 'const') { + if (!match('=')) { + throwError({}, Messages.NoUnintializedConst); + } + expect('='); + init = parseAssignmentExpression(); + } else if (match('=')) { + lex(); + init = parseAssignmentExpression(); + } + + return markerApply(marker, delegate.createVariableDeclarator(id, init)); + } + + function parseVariableDeclarationList(kind) { + var list = []; + + do { + list.push(parseVariableDeclaration(kind)); + if (!match(',')) { + break; + } + lex(); + } while (index < length); + + return list; + } + + function parseVariableStatement() { + var declarations, marker = markerCreate(); + + expectKeyword('var'); + + declarations = parseVariableDeclarationList(); + + consumeSemicolon(); + + return markerApply(marker, delegate.createVariableDeclaration(declarations, 'var')); + } + + // kind may be `const` or `let` + // Both are experimental and not in the specification yet. + // see http://wiki.ecmascript.org/doku.php?id=harmony:const + // and http://wiki.ecmascript.org/doku.php?id=harmony:let + function parseConstLetDeclaration(kind) { + var declarations, marker = markerCreate(); + + expectKeyword(kind); + + declarations = parseVariableDeclarationList(kind); + + consumeSemicolon(); + + return markerApply(marker, delegate.createVariableDeclaration(declarations, kind)); + } + + // people.mozilla.org/~jorendorff/es6-draft.html + + function parseModuleSpecifier() { + var marker = markerCreate(), + specifier; + + if (lookahead.type !== Token.StringLiteral) { + throwError({}, Messages.InvalidModuleSpecifier); + } + specifier = delegate.createModuleSpecifier(lookahead); + lex(); + return markerApply(marker, specifier); + } + + function parseExportBatchSpecifier() { + var marker = markerCreate(); + expect('*'); + return markerApply(marker, delegate.createExportBatchSpecifier()); + } + + function parseExportSpecifier() { + var id, name = null, marker = markerCreate(), from; + if (matchKeyword('default')) { + lex(); + id = markerApply(marker, delegate.createIdentifier('default')); + // export {default} from "something"; + } else { + id = parseVariableIdentifier(); + } + if (matchContextualKeyword('as')) { + lex(); + name = parseNonComputedProperty(); + } + + return markerApply(marker, delegate.createExportSpecifier(id, name)); + } + + function parseExportDeclaration() { + var backtrackToken, id, previousAllowKeyword, declaration = null, + isExportFromIdentifier, + src = null, specifiers = [], + marker = markerCreate(); + + function rewind(token) { + index = token.range[0]; + lineNumber = token.lineNumber; + lineStart = token.lineStart; + lookahead = token; + } + + expectKeyword('export'); + + if (matchKeyword('default')) { + // covers: + // export default ... + lex(); + if (matchKeyword('function') || matchKeyword('class')) { + backtrackToken = lookahead; + lex(); + if (isIdentifierName(lookahead)) { + // covers: + // export default function foo () {} + // export default class foo {} + id = parseNonComputedProperty(); + rewind(backtrackToken); + return markerApply(marker, delegate.createExportDeclaration(true, parseSourceElement(), [id], null)); + } + // covers: + // export default function () {} + // export default class {} + rewind(backtrackToken); + switch (lookahead.value) { + case 'class': + return markerApply(marker, delegate.createExportDeclaration(true, parseClassExpression(), [], null)); + case 'function': + return markerApply(marker, delegate.createExportDeclaration(true, parseFunctionExpression(), [], null)); + } + } + + if (matchContextualKeyword('from')) { + throwError({}, Messages.UnexpectedToken, lookahead.value); + } + + // covers: + // export default {}; + // export default []; + if (match('{')) { + declaration = parseObjectInitialiser(); + } else if (match('[')) { + declaration = parseArrayInitialiser(); + } else { + declaration = parseAssignmentExpression(); + } + consumeSemicolon(); + return markerApply(marker, delegate.createExportDeclaration(true, declaration, [], null)); + } + + // non-default export + if (lookahead.type === Token.Keyword) { + // covers: + // export var f = 1; + switch (lookahead.value) { + case 'let': + case 'const': + case 'var': + case 'class': + case 'function': + return markerApply(marker, delegate.createExportDeclaration(false, parseSourceElement(), specifiers, null)); + } + } + + if (match('*')) { + // covers: + // export * from "foo"; + specifiers.push(parseExportBatchSpecifier()); + + if (!matchContextualKeyword('from')) { + throwError({}, lookahead.value ? + Messages.UnexpectedToken : Messages.MissingFromClause, lookahead.value); + } + lex(); + src = parseModuleSpecifier(); + consumeSemicolon(); + + return markerApply(marker, delegate.createExportDeclaration(false, null, specifiers, src)); + } + + expect('{'); + do { + isExportFromIdentifier = isExportFromIdentifier || matchKeyword('default'); + specifiers.push(parseExportSpecifier()); + } while (match(',') && lex()); + expect('}'); + + if (matchContextualKeyword('from')) { + // covering: + // export {default} from "foo"; + // export {foo} from "foo"; + lex(); + src = parseModuleSpecifier(); + consumeSemicolon(); + } else if (isExportFromIdentifier) { + // covering: + // export {default}; // missing fromClause + throwError({}, lookahead.value ? + Messages.UnexpectedToken : Messages.MissingFromClause, lookahead.value); + } else { + // cover + // export {foo}; + consumeSemicolon(); + } + return markerApply(marker, delegate.createExportDeclaration(false, declaration, specifiers, src)); + } + + + function parseImportSpecifier() { + // import {} ...; + var id, name = null, marker = markerCreate(); + + id = parseNonComputedProperty(); + if (matchContextualKeyword('as')) { + lex(); + name = parseVariableIdentifier(); + } + + return markerApply(marker, delegate.createImportSpecifier(id, name)); + } + + function parseNamedImports() { + var specifiers = []; + // {foo, bar as bas} + expect('{'); + do { + specifiers.push(parseImportSpecifier()); + } while (match(',') && lex()); + expect('}'); + return specifiers; + } + + function parseImportDefaultSpecifier() { + // import ...; + var id, marker = markerCreate(); + + id = parseNonComputedProperty(); + + return markerApply(marker, delegate.createImportDefaultSpecifier(id)); + } + + function parseImportNamespaceSpecifier() { + // import <* as foo> ...; + var id, marker = markerCreate(); + + expect('*'); + if (!matchContextualKeyword('as')) { + throwError({}, Messages.NoAsAfterImportNamespace); + } + lex(); + id = parseNonComputedProperty(); + + return markerApply(marker, delegate.createImportNamespaceSpecifier(id)); + } + + function parseImportDeclaration() { + var specifiers, src, marker = markerCreate(); + + expectKeyword('import'); + specifiers = []; + + if (lookahead.type === Token.StringLiteral) { + // covers: + // import "foo"; + src = parseModuleSpecifier(); + consumeSemicolon(); + return markerApply(marker, delegate.createImportDeclaration(specifiers, src)); + } + + if (!matchKeyword('default') && isIdentifierName(lookahead)) { + // covers: + // import foo + // import foo, ... + specifiers.push(parseImportDefaultSpecifier()); + if (match(',')) { + lex(); + } + } + if (match('*')) { + // covers: + // import foo, * as foo + // import * as foo + specifiers.push(parseImportNamespaceSpecifier()); + } else if (match('{')) { + // covers: + // import foo, {bar} + // import {bar} + specifiers = specifiers.concat(parseNamedImports()); + } + + if (!matchContextualKeyword('from')) { + throwError({}, lookahead.value ? + Messages.UnexpectedToken : Messages.MissingFromClause, lookahead.value); + } + lex(); + src = parseModuleSpecifier(); + consumeSemicolon(); + + return markerApply(marker, delegate.createImportDeclaration(specifiers, src)); + } + + // 12.3 Empty Statement + + function parseEmptyStatement() { + var marker = markerCreate(); + expect(';'); + return markerApply(marker, delegate.createEmptyStatement()); + } + + // 12.4 Expression Statement + + function parseExpressionStatement() { + var marker = markerCreate(), expr = parseExpression(); + consumeSemicolon(); + return markerApply(marker, delegate.createExpressionStatement(expr)); + } + + // 12.5 If statement + + function parseIfStatement() { + var test, consequent, alternate, marker = markerCreate(); + + expectKeyword('if'); + + expect('('); + + test = parseExpression(); + + expect(')'); + + consequent = parseStatement(); + + if (matchKeyword('else')) { + lex(); + alternate = parseStatement(); + } else { + alternate = null; + } + + return markerApply(marker, delegate.createIfStatement(test, consequent, alternate)); + } + + // 12.6 Iteration Statements + + function parseDoWhileStatement() { + var body, test, oldInIteration, marker = markerCreate(); + + expectKeyword('do'); + + oldInIteration = state.inIteration; + state.inIteration = true; + + body = parseStatement(); + + state.inIteration = oldInIteration; + + expectKeyword('while'); + + expect('('); + + test = parseExpression(); + + expect(')'); + + if (match(';')) { + lex(); + } + + return markerApply(marker, delegate.createDoWhileStatement(body, test)); + } + + function parseWhileStatement() { + var test, body, oldInIteration, marker = markerCreate(); + + expectKeyword('while'); + + expect('('); + + test = parseExpression(); + + expect(')'); + + oldInIteration = state.inIteration; + state.inIteration = true; + + body = parseStatement(); + + state.inIteration = oldInIteration; + + return markerApply(marker, delegate.createWhileStatement(test, body)); + } + + function parseForVariableDeclaration() { + var marker = markerCreate(), + token = lex(), + declarations = parseVariableDeclarationList(); + + return markerApply(marker, delegate.createVariableDeclaration(declarations, token.value)); + } + + function parseForStatement(opts) { + var init, test, update, left, right, body, operator, oldInIteration, + marker = markerCreate(); + init = test = update = null; + expectKeyword('for'); + + // http://wiki.ecmascript.org/doku.php?id=proposals:iterators_and_generators&s=each + if (matchContextualKeyword('each')) { + throwError({}, Messages.EachNotAllowed); + } + + expect('('); + + if (match(';')) { + lex(); + } else { + if (matchKeyword('var') || matchKeyword('let') || matchKeyword('const')) { + state.allowIn = false; + init = parseForVariableDeclaration(); + state.allowIn = true; + + if (init.declarations.length === 1) { + if (matchKeyword('in') || matchContextualKeyword('of')) { + operator = lookahead; + if (!((operator.value === 'in' || init.kind !== 'var') && init.declarations[0].init)) { + lex(); + left = init; + right = parseExpression(); + init = null; + } + } + } + } else { + state.allowIn = false; + init = parseExpression(); + state.allowIn = true; + + if (matchContextualKeyword('of')) { + operator = lex(); + left = init; + right = parseExpression(); + init = null; + } else if (matchKeyword('in')) { + // LeftHandSideExpression + if (!isAssignableLeftHandSide(init)) { + throwError({}, Messages.InvalidLHSInForIn); + } + operator = lex(); + left = init; + right = parseExpression(); + init = null; + } + } + + if (typeof left === 'undefined') { + expect(';'); + } + } + + if (typeof left === 'undefined') { + + if (!match(';')) { + test = parseExpression(); + } + expect(';'); + + if (!match(')')) { + update = parseExpression(); + } + } + + expect(')'); + + oldInIteration = state.inIteration; + state.inIteration = true; + + if (!(opts !== undefined && opts.ignoreBody)) { + body = parseStatement(); + } + + state.inIteration = oldInIteration; + + if (typeof left === 'undefined') { + return markerApply(marker, delegate.createForStatement(init, test, update, body)); + } + + if (operator.value === 'in') { + return markerApply(marker, delegate.createForInStatement(left, right, body)); + } + return markerApply(marker, delegate.createForOfStatement(left, right, body)); + } + + // 12.7 The continue statement + + function parseContinueStatement() { + var label = null, key, marker = markerCreate(); + + expectKeyword('continue'); + + // Optimize the most common form: 'continue;'. + if (source.charCodeAt(index) === 59) { + lex(); + + if (!state.inIteration) { + throwError({}, Messages.IllegalContinue); + } + + return markerApply(marker, delegate.createContinueStatement(null)); + } + + if (peekLineTerminator()) { + if (!state.inIteration) { + throwError({}, Messages.IllegalContinue); + } + + return markerApply(marker, delegate.createContinueStatement(null)); + } + + if (lookahead.type === Token.Identifier) { + label = parseVariableIdentifier(); + + key = '$' + label.name; + if (!Object.prototype.hasOwnProperty.call(state.labelSet, key)) { + throwError({}, Messages.UnknownLabel, label.name); + } + } + + consumeSemicolon(); + + if (label === null && !state.inIteration) { + throwError({}, Messages.IllegalContinue); + } + + return markerApply(marker, delegate.createContinueStatement(label)); + } + + // 12.8 The break statement + + function parseBreakStatement() { + var label = null, key, marker = markerCreate(); + + expectKeyword('break'); + + // Catch the very common case first: immediately a semicolon (char #59). + if (source.charCodeAt(index) === 59) { + lex(); + + if (!(state.inIteration || state.inSwitch)) { + throwError({}, Messages.IllegalBreak); + } + + return markerApply(marker, delegate.createBreakStatement(null)); + } + + if (peekLineTerminator()) { + if (!(state.inIteration || state.inSwitch)) { + throwError({}, Messages.IllegalBreak); + } + + return markerApply(marker, delegate.createBreakStatement(null)); + } + + if (lookahead.type === Token.Identifier) { + label = parseVariableIdentifier(); + + key = '$' + label.name; + if (!Object.prototype.hasOwnProperty.call(state.labelSet, key)) { + throwError({}, Messages.UnknownLabel, label.name); + } + } + + consumeSemicolon(); + + if (label === null && !(state.inIteration || state.inSwitch)) { + throwError({}, Messages.IllegalBreak); + } + + return markerApply(marker, delegate.createBreakStatement(label)); + } + + // 12.9 The return statement + + function parseReturnStatement() { + var argument = null, marker = markerCreate(); + + expectKeyword('return'); + + if (!state.inFunctionBody) { + throwErrorTolerant({}, Messages.IllegalReturn); + } + + // 'return' followed by a space and an identifier is very common. + if (source.charCodeAt(index) === 32) { + if (isIdentifierStart(source.charCodeAt(index + 1))) { + argument = parseExpression(); + consumeSemicolon(); + return markerApply(marker, delegate.createReturnStatement(argument)); + } + } + + if (peekLineTerminator()) { + return markerApply(marker, delegate.createReturnStatement(null)); + } + + if (!match(';')) { + if (!match('}') && lookahead.type !== Token.EOF) { + argument = parseExpression(); + } + } + + consumeSemicolon(); + + return markerApply(marker, delegate.createReturnStatement(argument)); + } + + // 12.10 The with statement + + function parseWithStatement() { + var object, body, marker = markerCreate(); + + if (strict) { + throwErrorTolerant({}, Messages.StrictModeWith); + } + + expectKeyword('with'); + + expect('('); + + object = parseExpression(); + + expect(')'); + + body = parseStatement(); + + return markerApply(marker, delegate.createWithStatement(object, body)); + } + + // 12.10 The swith statement + + function parseSwitchCase() { + var test, + consequent = [], + sourceElement, + marker = markerCreate(); + + if (matchKeyword('default')) { + lex(); + test = null; + } else { + expectKeyword('case'); + test = parseExpression(); + } + expect(':'); + + while (index < length) { + if (match('}') || matchKeyword('default') || matchKeyword('case')) { + break; + } + sourceElement = parseSourceElement(); + if (typeof sourceElement === 'undefined') { + break; + } + consequent.push(sourceElement); + } + + return markerApply(marker, delegate.createSwitchCase(test, consequent)); + } + + function parseSwitchStatement() { + var discriminant, cases, clause, oldInSwitch, defaultFound, marker = markerCreate(); + + expectKeyword('switch'); + + expect('('); + + discriminant = parseExpression(); + + expect(')'); + + expect('{'); + + cases = []; + + if (match('}')) { + lex(); + return markerApply(marker, delegate.createSwitchStatement(discriminant, cases)); + } + + oldInSwitch = state.inSwitch; + state.inSwitch = true; + defaultFound = false; + + while (index < length) { + if (match('}')) { + break; + } + clause = parseSwitchCase(); + if (clause.test === null) { + if (defaultFound) { + throwError({}, Messages.MultipleDefaultsInSwitch); + } + defaultFound = true; + } + cases.push(clause); + } + + state.inSwitch = oldInSwitch; + + expect('}'); + + return markerApply(marker, delegate.createSwitchStatement(discriminant, cases)); + } + + // 12.13 The throw statement + + function parseThrowStatement() { + var argument, marker = markerCreate(); + + expectKeyword('throw'); + + if (peekLineTerminator()) { + throwError({}, Messages.NewlineAfterThrow); + } + + argument = parseExpression(); + + consumeSemicolon(); + + return markerApply(marker, delegate.createThrowStatement(argument)); + } + + // 12.14 The try statement + + function parseCatchClause() { + var param, body, marker = markerCreate(); + + expectKeyword('catch'); + + expect('('); + if (match(')')) { + throwUnexpected(lookahead); + } + + param = parseExpression(); + // 12.14.1 + if (strict && param.type === Syntax.Identifier && isRestrictedWord(param.name)) { + throwErrorTolerant({}, Messages.StrictCatchVariable); + } + + expect(')'); + body = parseBlock(); + return markerApply(marker, delegate.createCatchClause(param, body)); + } + + function parseTryStatement() { + var block, handlers = [], finalizer = null, marker = markerCreate(); + + expectKeyword('try'); + + block = parseBlock(); + + if (matchKeyword('catch')) { + handlers.push(parseCatchClause()); + } + + if (matchKeyword('finally')) { + lex(); + finalizer = parseBlock(); + } + + if (handlers.length === 0 && !finalizer) { + throwError({}, Messages.NoCatchOrFinally); + } + + return markerApply(marker, delegate.createTryStatement(block, [], handlers, finalizer)); + } + + // 12.15 The debugger statement + + function parseDebuggerStatement() { + var marker = markerCreate(); + expectKeyword('debugger'); + + consumeSemicolon(); + + return markerApply(marker, delegate.createDebuggerStatement()); + } + + // 12 Statements + + function parseStatement() { + var type = lookahead.type, + marker, + expr, + labeledBody, + key; + + if (type === Token.EOF) { + throwUnexpected(lookahead); + } + + if (type === Token.Punctuator) { + switch (lookahead.value) { + case ';': + return parseEmptyStatement(); + case '{': + return parseBlock(); + case '(': + return parseExpressionStatement(); + default: + break; + } + } + + if (type === Token.Keyword) { + switch (lookahead.value) { + case 'break': + return parseBreakStatement(); + case 'continue': + return parseContinueStatement(); + case 'debugger': + return parseDebuggerStatement(); + case 'do': + return parseDoWhileStatement(); + case 'for': + return parseForStatement(); + case 'function': + return parseFunctionDeclaration(); + case 'class': + return parseClassDeclaration(); + case 'if': + return parseIfStatement(); + case 'return': + return parseReturnStatement(); + case 'switch': + return parseSwitchStatement(); + case 'throw': + return parseThrowStatement(); + case 'try': + return parseTryStatement(); + case 'var': + return parseVariableStatement(); + case 'while': + return parseWhileStatement(); + case 'with': + return parseWithStatement(); + default: + break; + } + } + + marker = markerCreate(); + expr = parseExpression(); + + // 12.12 Labelled Statements + if ((expr.type === Syntax.Identifier) && match(':')) { + lex(); + + key = '$' + expr.name; + if (Object.prototype.hasOwnProperty.call(state.labelSet, key)) { + throwError({}, Messages.Redeclaration, 'Label', expr.name); + } + + state.labelSet[key] = true; + labeledBody = parseStatement(); + delete state.labelSet[key]; + return markerApply(marker, delegate.createLabeledStatement(expr, labeledBody)); + } + + consumeSemicolon(); + + return markerApply(marker, delegate.createExpressionStatement(expr)); + } + + // 13 Function Definition + + function parseConciseBody() { + if (match('{')) { + return parseFunctionSourceElements(); + } + return parseAssignmentExpression(); + } + + function parseFunctionSourceElements() { + var sourceElement, sourceElements = [], token, directive, firstRestricted, + oldLabelSet, oldInIteration, oldInSwitch, oldInFunctionBody, oldParenthesizedCount, + marker = markerCreate(); + + expect('{'); + + while (index < length) { + if (lookahead.type !== Token.StringLiteral) { + break; + } + token = lookahead; + + sourceElement = parseSourceElement(); + sourceElements.push(sourceElement); + if (sourceElement.expression.type !== Syntax.Literal) { + // this is not directive + break; + } + directive = source.slice(token.range[0] + 1, token.range[1] - 1); + if (directive === 'use strict') { + strict = true; + if (firstRestricted) { + throwErrorTolerant(firstRestricted, Messages.StrictOctalLiteral); + } + } else { + if (!firstRestricted && token.octal) { + firstRestricted = token; + } + } + } + + oldLabelSet = state.labelSet; + oldInIteration = state.inIteration; + oldInSwitch = state.inSwitch; + oldInFunctionBody = state.inFunctionBody; + oldParenthesizedCount = state.parenthesizedCount; + + state.labelSet = {}; + state.inIteration = false; + state.inSwitch = false; + state.inFunctionBody = true; + state.parenthesizedCount = 0; + + while (index < length) { + if (match('}')) { + break; + } + sourceElement = parseSourceElement(); + if (typeof sourceElement === 'undefined') { + break; + } + sourceElements.push(sourceElement); + } + + expect('}'); + + state.labelSet = oldLabelSet; + state.inIteration = oldInIteration; + state.inSwitch = oldInSwitch; + state.inFunctionBody = oldInFunctionBody; + state.parenthesizedCount = oldParenthesizedCount; + + return markerApply(marker, delegate.createBlockStatement(sourceElements)); + } + + function validateParam(options, param, name) { + var key = '$' + name; + if (strict) { + if (isRestrictedWord(name)) { + options.stricted = param; + options.message = Messages.StrictParamName; + } + if (Object.prototype.hasOwnProperty.call(options.paramSet, key)) { + options.stricted = param; + options.message = Messages.StrictParamDupe; + } + } else if (!options.firstRestricted) { + if (isRestrictedWord(name)) { + options.firstRestricted = param; + options.message = Messages.StrictParamName; + } else if (isStrictModeReservedWord(name)) { + options.firstRestricted = param; + options.message = Messages.StrictReservedWord; + } else if (Object.prototype.hasOwnProperty.call(options.paramSet, key)) { + options.firstRestricted = param; + options.message = Messages.StrictParamDupe; + } + } + options.paramSet[key] = true; + } + + function parseParam(options) { + var token, rest, param, def; + + token = lookahead; + if (token.value === '...') { + token = lex(); + rest = true; + } + + if (match('[')) { + param = parseArrayInitialiser(); + reinterpretAsDestructuredParameter(options, param); + } else if (match('{')) { + if (rest) { + throwError({}, Messages.ObjectPatternAsRestParameter); + } + param = parseObjectInitialiser(); + reinterpretAsDestructuredParameter(options, param); + } else { + param = parseVariableIdentifier(); + validateParam(options, token, token.value); + } + + if (match('=')) { + if (rest) { + throwErrorTolerant(lookahead, Messages.DefaultRestParameter); + } + lex(); + def = parseAssignmentExpression(); + ++options.defaultCount; + } + + if (rest) { + if (!match(')')) { + throwError({}, Messages.ParameterAfterRestParameter); + } + options.rest = param; + return false; + } + + options.params.push(param); + options.defaults.push(def); + return !match(')'); + } + + function parseParams(firstRestricted) { + var options, marker = markerCreate(); + + options = { + params: [], + defaultCount: 0, + defaults: [], + rest: null, + firstRestricted: firstRestricted + }; + + expect('('); + + if (!match(')')) { + options.paramSet = {}; + while (index < length) { + if (!parseParam(options)) { + break; + } + expect(','); + } + } + + expect(')'); + + if (options.defaultCount === 0) { + options.defaults = []; + } + + return markerApply(marker, options); + } + + function parseFunctionDeclaration() { + var id, body, token, tmp, firstRestricted, message, previousStrict, previousYieldAllowed, generator, + marker = markerCreate(); + + expectKeyword('function'); + + generator = false; + if (match('*')) { + lex(); + generator = true; + } + + token = lookahead; + + id = parseVariableIdentifier(); + + if (strict) { + if (isRestrictedWord(token.value)) { + throwErrorTolerant(token, Messages.StrictFunctionName); + } + } else { + if (isRestrictedWord(token.value)) { + firstRestricted = token; + message = Messages.StrictFunctionName; + } else if (isStrictModeReservedWord(token.value)) { + firstRestricted = token; + message = Messages.StrictReservedWord; + } + } + + tmp = parseParams(firstRestricted); + firstRestricted = tmp.firstRestricted; + if (tmp.message) { + message = tmp.message; + } + + previousStrict = strict; + previousYieldAllowed = state.yieldAllowed; + state.yieldAllowed = generator; + + body = parseFunctionSourceElements(); + + if (strict && firstRestricted) { + throwError(firstRestricted, message); + } + if (strict && tmp.stricted) { + throwErrorTolerant(tmp.stricted, message); + } + strict = previousStrict; + state.yieldAllowed = previousYieldAllowed; + + return markerApply(marker, delegate.createFunctionDeclaration(id, tmp.params, tmp.defaults, body, tmp.rest, generator, false)); + } + + function parseFunctionExpression() { + var token, id = null, firstRestricted, message, tmp, body, previousStrict, previousYieldAllowed, generator, + marker = markerCreate(); + + expectKeyword('function'); + + generator = false; + + if (match('*')) { + lex(); + generator = true; + } + + if (!match('(')) { + token = lookahead; + id = parseVariableIdentifier(); + if (strict) { + if (isRestrictedWord(token.value)) { + throwErrorTolerant(token, Messages.StrictFunctionName); + } + } else { + if (isRestrictedWord(token.value)) { + firstRestricted = token; + message = Messages.StrictFunctionName; + } else if (isStrictModeReservedWord(token.value)) { + firstRestricted = token; + message = Messages.StrictReservedWord; + } + } + } + + tmp = parseParams(firstRestricted); + firstRestricted = tmp.firstRestricted; + if (tmp.message) { + message = tmp.message; + } + + previousStrict = strict; + previousYieldAllowed = state.yieldAllowed; + state.yieldAllowed = generator; + + body = parseFunctionSourceElements(); + + if (strict && firstRestricted) { + throwError(firstRestricted, message); + } + if (strict && tmp.stricted) { + throwErrorTolerant(tmp.stricted, message); + } + strict = previousStrict; + state.yieldAllowed = previousYieldAllowed; + + return markerApply(marker, delegate.createFunctionExpression(id, tmp.params, tmp.defaults, body, tmp.rest, generator, false)); + } + + function parseYieldExpression() { + var yieldToken, delegateFlag, expr, marker = markerCreate(); + + yieldToken = lex(); + assert(yieldToken.value === 'yield', 'Called parseYieldExpression with non-yield lookahead.'); + + if (!state.yieldAllowed) { + throwErrorTolerant({}, Messages.IllegalYield); + } + + delegateFlag = false; + if (match('*')) { + lex(); + delegateFlag = true; + } + + expr = parseAssignmentExpression(); + + return markerApply(marker, delegate.createYieldExpression(expr, delegateFlag)); + } + + // 14 Classes + + function parseMethodDefinition(existingPropNames) { + var token, key, param, propType, isValidDuplicateProp = false, + marker = markerCreate(); + + if (lookahead.value === 'static') { + propType = ClassPropertyType.static; + lex(); + } else { + propType = ClassPropertyType.prototype; + } + + if (match('*')) { + lex(); + return markerApply(marker, delegate.createMethodDefinition( + propType, + '', + parseObjectPropertyKey(), + parsePropertyMethodFunction({ generator: true }) + )); + } + + token = lookahead; + key = parseObjectPropertyKey(); + + if (token.value === 'get' && !match('(')) { + key = parseObjectPropertyKey(); + + // It is a syntax error if any other properties have a name + // duplicating this one unless they are a setter + if (existingPropNames[propType].hasOwnProperty(key.name)) { + isValidDuplicateProp = + // There isn't already a getter for this prop + existingPropNames[propType][key.name].get === undefined + // There isn't already a data prop by this name + && existingPropNames[propType][key.name].data === undefined + // The only existing prop by this name is a setter + && existingPropNames[propType][key.name].set !== undefined; + if (!isValidDuplicateProp) { + throwError(key, Messages.IllegalDuplicateClassProperty); + } + } else { + existingPropNames[propType][key.name] = {}; + } + existingPropNames[propType][key.name].get = true; + + expect('('); + expect(')'); + return markerApply(marker, delegate.createMethodDefinition( + propType, + 'get', + key, + parsePropertyFunction({ generator: false }) + )); + } + if (token.value === 'set' && !match('(')) { + key = parseObjectPropertyKey(); + + // It is a syntax error if any other properties have a name + // duplicating this one unless they are a getter + if (existingPropNames[propType].hasOwnProperty(key.name)) { + isValidDuplicateProp = + // There isn't already a setter for this prop + existingPropNames[propType][key.name].set === undefined + // There isn't already a data prop by this name + && existingPropNames[propType][key.name].data === undefined + // The only existing prop by this name is a getter + && existingPropNames[propType][key.name].get !== undefined; + if (!isValidDuplicateProp) { + throwError(key, Messages.IllegalDuplicateClassProperty); + } + } else { + existingPropNames[propType][key.name] = {}; + } + existingPropNames[propType][key.name].set = true; + + expect('('); + token = lookahead; + param = [ parseVariableIdentifier() ]; + expect(')'); + return markerApply(marker, delegate.createMethodDefinition( + propType, + 'set', + key, + parsePropertyFunction({ params: param, generator: false, name: token }) + )); + } + + // It is a syntax error if any other properties have the same name as a + // non-getter, non-setter method + if (existingPropNames[propType].hasOwnProperty(key.name)) { + throwError(key, Messages.IllegalDuplicateClassProperty); + } else { + existingPropNames[propType][key.name] = {}; + } + existingPropNames[propType][key.name].data = true; + + return markerApply(marker, delegate.createMethodDefinition( + propType, + '', + key, + parsePropertyMethodFunction({ generator: false }) + )); + } + + function parseClassElement(existingProps) { + if (match(';')) { + lex(); + return; + } + return parseMethodDefinition(existingProps); + } + + function parseClassBody() { + var classElement, classElements = [], existingProps = {}, marker = markerCreate(); + + existingProps[ClassPropertyType.static] = {}; + existingProps[ClassPropertyType.prototype] = {}; + + expect('{'); + + while (index < length) { + if (match('}')) { + break; + } + classElement = parseClassElement(existingProps); + + if (typeof classElement !== 'undefined') { + classElements.push(classElement); + } + } + + expect('}'); + + return markerApply(marker, delegate.createClassBody(classElements)); + } + + function parseClassExpression() { + var id, previousYieldAllowed, superClass = null, marker = markerCreate(); + + expectKeyword('class'); + + if (!matchKeyword('extends') && !match('{')) { + id = parseVariableIdentifier(); + } + + if (matchKeyword('extends')) { + expectKeyword('extends'); + previousYieldAllowed = state.yieldAllowed; + state.yieldAllowed = false; + superClass = parseAssignmentExpression(); + state.yieldAllowed = previousYieldAllowed; + } + + return markerApply(marker, delegate.createClassExpression(id, superClass, parseClassBody())); + } + + function parseClassDeclaration() { + var id, previousYieldAllowed, superClass = null, marker = markerCreate(); + + expectKeyword('class'); + + id = parseVariableIdentifier(); + + if (matchKeyword('extends')) { + expectKeyword('extends'); + previousYieldAllowed = state.yieldAllowed; + state.yieldAllowed = false; + superClass = parseAssignmentExpression(); + state.yieldAllowed = previousYieldAllowed; + } + + return markerApply(marker, delegate.createClassDeclaration(id, superClass, parseClassBody())); + } + + // 15 Program + + function parseSourceElement() { + if (lookahead.type === Token.Keyword) { + switch (lookahead.value) { + case 'const': + case 'let': + return parseConstLetDeclaration(lookahead.value); + case 'function': + return parseFunctionDeclaration(); + default: + return parseStatement(); + } + } + + if (lookahead.type !== Token.EOF) { + return parseStatement(); + } + } + + function parseProgramElement() { + if (lookahead.type === Token.Keyword) { + switch (lookahead.value) { + case 'export': + return parseExportDeclaration(); + case 'import': + return parseImportDeclaration(); + } + } + + return parseSourceElement(); + } + + function parseProgramElements() { + var sourceElement, sourceElements = [], token, directive, firstRestricted; + + while (index < length) { + token = lookahead; + if (token.type !== Token.StringLiteral) { + break; + } + + sourceElement = parseProgramElement(); + sourceElements.push(sourceElement); + if (sourceElement.expression.type !== Syntax.Literal) { + // this is not directive + break; + } + directive = source.slice(token.range[0] + 1, token.range[1] - 1); + if (directive === 'use strict') { + strict = true; + if (firstRestricted) { + throwErrorTolerant(firstRestricted, Messages.StrictOctalLiteral); + } + } else { + if (!firstRestricted && token.octal) { + firstRestricted = token; + } + } + } + + while (index < length) { + sourceElement = parseProgramElement(); + if (typeof sourceElement === 'undefined') { + break; + } + sourceElements.push(sourceElement); + } + return sourceElements; + } + + function parseProgram() { + var body, marker = markerCreate(); + strict = false; + peek(); + body = parseProgramElements(); + return markerApply(marker, delegate.createProgram(body)); + } + + // The following functions are needed only when the option to preserve + // the comments is active. + + function addComment(type, value, start, end, loc) { + var comment; + + assert(typeof start === 'number', 'Comment must have valid position'); + + // Because the way the actual token is scanned, often the comments + // (if any) are skipped twice during the lexical analysis. + // Thus, we need to skip adding a comment if the comment array already + // handled it. + if (state.lastCommentStart >= start) { + return; + } + state.lastCommentStart = start; + + comment = { + type: type, + value: value + }; + if (extra.range) { + comment.range = [start, end]; + } + if (extra.loc) { + comment.loc = loc; + } + extra.comments.push(comment); + if (extra.attachComment) { + extra.leadingComments.push(comment); + extra.trailingComments.push(comment); + } + } + + function scanComment() { + var comment, ch, loc, start, blockComment, lineComment; + + comment = ''; + blockComment = false; + lineComment = false; + + while (index < length) { + ch = source[index]; + + if (lineComment) { + ch = source[index++]; + if (isLineTerminator(ch.charCodeAt(0))) { + loc.end = { + line: lineNumber, + column: index - lineStart - 1 + }; + lineComment = false; + addComment('Line', comment, start, index - 1, loc); + if (ch === '\r' && source[index] === '\n') { + ++index; + } + ++lineNumber; + lineStart = index; + comment = ''; + } else if (index >= length) { + lineComment = false; + comment += ch; + loc.end = { + line: lineNumber, + column: length - lineStart + }; + addComment('Line', comment, start, length, loc); + } else { + comment += ch; + } + } else if (blockComment) { + if (isLineTerminator(ch.charCodeAt(0))) { + if (ch === '\r' && source[index + 1] === '\n') { + ++index; + comment += '\r\n'; + } else { + comment += ch; + } + ++lineNumber; + ++index; + lineStart = index; + if (index >= length) { + throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); + } + } else { + ch = source[index++]; + if (index >= length) { + throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); + } + comment += ch; + if (ch === '*') { + ch = source[index]; + if (ch === '/') { + comment = comment.substr(0, comment.length - 1); + blockComment = false; + ++index; + loc.end = { + line: lineNumber, + column: index - lineStart + }; + addComment('Block', comment, start, index, loc); + comment = ''; + } + } + } + } else if (ch === '/') { + ch = source[index + 1]; + if (ch === '/') { + loc = { + start: { + line: lineNumber, + column: index - lineStart + } + }; + start = index; + index += 2; + lineComment = true; + if (index >= length) { + loc.end = { + line: lineNumber, + column: index - lineStart + }; + lineComment = false; + addComment('Line', comment, start, index, loc); + } + } else if (ch === '*') { + start = index; + index += 2; + blockComment = true; + loc = { + start: { + line: lineNumber, + column: index - lineStart - 2 + } + }; + if (index >= length) { + throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); + } + } else { + break; + } + } else if (isWhiteSpace(ch.charCodeAt(0))) { + ++index; + } else if (isLineTerminator(ch.charCodeAt(0))) { + ++index; + if (ch === '\r' && source[index] === '\n') { + ++index; + } + ++lineNumber; + lineStart = index; + } else { + break; + } + } + } + + function collectToken() { + var start, loc, token, range, value, entry; + + skipComment(); + start = index; + loc = { + start: { + line: lineNumber, + column: index - lineStart + } + }; + + token = extra.advance(); + loc.end = { + line: lineNumber, + column: index - lineStart + }; + + if (token.type !== Token.EOF) { + range = [token.range[0], token.range[1]]; + value = source.slice(token.range[0], token.range[1]); + entry = { + type: TokenName[token.type], + value: value, + range: range, + loc: loc + }; + if (token.regex) { + entry.regex = { + pattern: token.regex.pattern, + flags: token.regex.flags + }; + } + extra.tokens.push(entry); + } + + return token; + } + + function collectRegex() { + var pos, loc, regex, token; + + skipComment(); + + pos = index; + loc = { + start: { + line: lineNumber, + column: index - lineStart + } + }; + + regex = extra.scanRegExp(); + loc.end = { + line: lineNumber, + column: index - lineStart + }; + + if (!extra.tokenize) { + // Pop the previous token, which is likely '/' or '/=' + if (extra.tokens.length > 0) { + token = extra.tokens[extra.tokens.length - 1]; + if (token.range[0] === pos && token.type === 'Punctuator') { + if (token.value === '/' || token.value === '/=') { + extra.tokens.pop(); + } + } + } + + extra.tokens.push({ + type: 'RegularExpression', + value: regex.literal, + regex: regex.regex, + range: [pos, index], + loc: loc + }); + } + + return regex; + } + + function filterTokenLocation() { + var i, entry, token, tokens = []; + + for (i = 0; i < extra.tokens.length; ++i) { + entry = extra.tokens[i]; + token = { + type: entry.type, + value: entry.value + }; + if (entry.regex) { + token.regex = { + pattern: entry.regex.pattern, + flags: entry.regex.flags + }; + } + if (extra.range) { + token.range = entry.range; + } + if (extra.loc) { + token.loc = entry.loc; + } + tokens.push(token); + } + + extra.tokens = tokens; + } + + function patch() { + if (extra.comments) { + extra.skipComment = skipComment; + skipComment = scanComment; + } + + if (typeof extra.tokens !== 'undefined') { + extra.advance = advance; + extra.scanRegExp = scanRegExp; + + advance = collectToken; + scanRegExp = collectRegex; + } + } + + function unpatch() { + if (typeof extra.skipComment === 'function') { + skipComment = extra.skipComment; + } + + if (typeof extra.scanRegExp === 'function') { + advance = extra.advance; + scanRegExp = extra.scanRegExp; + } + } + + // This is used to modify the delegate. + + function extend(object, properties) { + var entry, result = {}; + + for (entry in object) { + if (object.hasOwnProperty(entry)) { + result[entry] = object[entry]; + } + } + + for (entry in properties) { + if (properties.hasOwnProperty(entry)) { + result[entry] = properties[entry]; + } + } + + return result; + } + + function tokenize(code, options) { + var toString, + token, + tokens; + + toString = String; + if (typeof code !== 'string' && !(code instanceof String)) { + code = toString(code); + } + + delegate = SyntaxTreeDelegate; + source = code; + index = 0; + lineNumber = (source.length > 0) ? 1 : 0; + lineStart = 0; + length = source.length; + lookahead = null; + state = { + allowKeyword: true, + allowIn: true, + labelSet: {}, + inFunctionBody: false, + inIteration: false, + inSwitch: false, + lastCommentStart: -1 + }; + + extra = {}; + + // Options matching. + options = options || {}; + + // Of course we collect tokens here. + options.tokens = true; + extra.tokens = []; + extra.tokenize = true; + // The following two fields are necessary to compute the Regex tokens. + extra.openParenToken = -1; + extra.openCurlyToken = -1; + + extra.range = (typeof options.range === 'boolean') && options.range; + extra.loc = (typeof options.loc === 'boolean') && options.loc; + + if (typeof options.comment === 'boolean' && options.comment) { + extra.comments = []; + } + if (typeof options.tolerant === 'boolean' && options.tolerant) { + extra.errors = []; + } + + if (length > 0) { + if (typeof source[0] === 'undefined') { + // Try first to convert to a string. This is good as fast path + // for old IE which understands string indexing for string + // literals only and not for string object. + if (code instanceof String) { + source = code.valueOf(); + } + } + } + + patch(); + + try { + peek(); + if (lookahead.type === Token.EOF) { + return extra.tokens; + } + + token = lex(); + while (lookahead.type !== Token.EOF) { + try { + token = lex(); + } catch (lexError) { + token = lookahead; + if (extra.errors) { + extra.errors.push(lexError); + // We have to break on the first error + // to avoid infinite loops. + break; + } else { + throw lexError; + } + } + } + + filterTokenLocation(); + tokens = extra.tokens; + if (typeof extra.comments !== 'undefined') { + tokens.comments = extra.comments; + } + if (typeof extra.errors !== 'undefined') { + tokens.errors = extra.errors; + } + } catch (e) { + throw e; + } finally { + unpatch(); + extra = {}; + } + return tokens; + } + + function parse(code, options) { + var program, toString; + + toString = String; + if (typeof code !== 'string' && !(code instanceof String)) { + code = toString(code); + } + + delegate = SyntaxTreeDelegate; + source = code; + index = 0; + lineNumber = (source.length > 0) ? 1 : 0; + lineStart = 0; + length = source.length; + lookahead = null; + state = { + allowKeyword: false, + allowIn: true, + labelSet: {}, + parenthesizedCount: 0, + inFunctionBody: false, + inIteration: false, + inSwitch: false, + lastCommentStart: -1, + yieldAllowed: false + }; + + extra = {}; + if (typeof options !== 'undefined') { + extra.range = (typeof options.range === 'boolean') && options.range; + extra.loc = (typeof options.loc === 'boolean') && options.loc; + extra.attachComment = (typeof options.attachComment === 'boolean') && options.attachComment; + + if (extra.loc && options.source !== null && options.source !== undefined) { + delegate = extend(delegate, { + 'postProcess': function (node) { + node.loc.source = toString(options.source); + return node; + } + }); + } + + if (typeof options.tokens === 'boolean' && options.tokens) { + extra.tokens = []; + } + if (typeof options.comment === 'boolean' && options.comment) { + extra.comments = []; + } + if (typeof options.tolerant === 'boolean' && options.tolerant) { + extra.errors = []; + } + if (extra.attachComment) { + extra.range = true; + extra.comments = []; + extra.bottomRightStack = []; + extra.trailingComments = []; + extra.leadingComments = []; + } + } + + if (length > 0) { + if (typeof source[0] === 'undefined') { + // Try first to convert to a string. This is good as fast path + // for old IE which understands string indexing for string + // literals only and not for string object. + if (code instanceof String) { + source = code.valueOf(); + } + } + } + + patch(); + try { + program = parseProgram(); + if (typeof extra.comments !== 'undefined') { + program.comments = extra.comments; + } + if (typeof extra.tokens !== 'undefined') { + filterTokenLocation(); + program.tokens = extra.tokens; + } + if (typeof extra.errors !== 'undefined') { + program.errors = extra.errors; + } + } catch (e) { + throw e; + } finally { + unpatch(); + extra = {}; + } + + return program; + } + + // Sync with *.json manifests. + exports.version = '1.1.0-dev-harmony'; + + exports.tokenize = tokenize; + + exports.parse = parse; + + // Deep copy. + exports.Syntax = (function () { + var name, types = {}; + + if (typeof Object.create === 'function') { + types = Object.create(null); + } + + for (name in Syntax) { + if (Syntax.hasOwnProperty(name)) { + types[name] = Syntax[name]; + } + } + + if (typeof Object.freeze === 'function') { + Object.freeze(types); + } + + return types; + }()); + +})); +/* vim: set sw=4 ts=4 et tw=80 : */ + +},{}],127:[function(require,module,exports){ +/* + Copyright (C) 2013 Ariya Hidayat + Copyright (C) 2013 Thaddee Tyl + Copyright (C) 2013 Mathias Bynens + Copyright (C) 2012 Ariya Hidayat + Copyright (C) 2012 Mathias Bynens + Copyright (C) 2012 Joost-Wim Boekesteijn + Copyright (C) 2012 Kris Kowal + Copyright (C) 2012 Yusuke Suzuki + Copyright (C) 2012 Arpad Borsos + Copyright (C) 2011 Ariya Hidayat + + 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 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 bitwise:true plusplus:true */ +/*global esprima:true, define:true, exports:true, window: true, +throwErrorTolerant: true, +throwError: true, generateStatement: true, peek: true, +parseAssignmentExpression: true, parseBlock: true, parseExpression: true, +parseFunctionDeclaration: true, parseFunctionExpression: true, +parseFunctionSourceElements: true, parseVariableIdentifier: true, +parseLeftHandSideExpression: true, +parseUnaryExpression: true, +parseStatement: true, parseSourceElement: true */ + +(function (root, factory) { + 'use strict'; + + // Universal Module Definition (UMD) to support AMD, CommonJS/Node.js, + // Rhino, and plain browser loading. + + /* istanbul ignore next */ + if (typeof define === 'function' && define.amd) { + define(['exports'], factory); + } else if (typeof exports !== 'undefined') { + factory(exports); + } else { + factory((root.esprima = {})); + } +}(this, function (exports) { + 'use strict'; + + var Token, + TokenName, + FnExprTokens, + Syntax, + PropertyKind, + Messages, + Regex, + SyntaxTreeDelegate, + source, + strict, + index, + lineNumber, + lineStart, + length, + delegate, + lookahead, + state, + extra; + + Token = { + BooleanLiteral: 1, + EOF: 2, + Identifier: 3, + Keyword: 4, + NullLiteral: 5, + NumericLiteral: 6, + Punctuator: 7, + StringLiteral: 8, + RegularExpression: 9 + }; + + TokenName = {}; + TokenName[Token.BooleanLiteral] = 'Boolean'; + TokenName[Token.EOF] = ''; + TokenName[Token.Identifier] = 'Identifier'; + TokenName[Token.Keyword] = 'Keyword'; + TokenName[Token.NullLiteral] = 'Null'; + TokenName[Token.NumericLiteral] = 'Numeric'; + TokenName[Token.Punctuator] = 'Punctuator'; + TokenName[Token.StringLiteral] = 'String'; + TokenName[Token.RegularExpression] = 'RegularExpression'; + + // A function following one of those tokens is an expression. + FnExprTokens = ['(', '{', '[', 'in', 'typeof', 'instanceof', 'new', + 'return', 'case', 'delete', 'throw', 'void', + // assignment operators + '=', '+=', '-=', '*=', '/=', '%=', '<<=', '>>=', '>>>=', + '&=', '|=', '^=', ',', + // binary/unary operators + '+', '-', '*', '/', '%', '++', '--', '<<', '>>', '>>>', '&', + '|', '^', '!', '~', '&&', '||', '?', ':', '===', '==', '>=', + '<=', '<', '>', '!=', '!==']; + + Syntax = { + AssignmentExpression: 'AssignmentExpression', + ArrayExpression: 'ArrayExpression', + BlockStatement: 'BlockStatement', + BinaryExpression: 'BinaryExpression', + BreakStatement: 'BreakStatement', + CallExpression: 'CallExpression', + CatchClause: 'CatchClause', + ConditionalExpression: 'ConditionalExpression', + ContinueStatement: 'ContinueStatement', + DoWhileStatement: 'DoWhileStatement', + DebuggerStatement: 'DebuggerStatement', + EmptyStatement: 'EmptyStatement', + ExpressionStatement: 'ExpressionStatement', + ForStatement: 'ForStatement', + ForInStatement: 'ForInStatement', + FunctionDeclaration: 'FunctionDeclaration', + FunctionExpression: 'FunctionExpression', + Identifier: 'Identifier', + IfStatement: 'IfStatement', + Literal: 'Literal', + LabeledStatement: 'LabeledStatement', + LogicalExpression: 'LogicalExpression', + MemberExpression: 'MemberExpression', + NewExpression: 'NewExpression', + ObjectExpression: 'ObjectExpression', + Program: 'Program', + Property: 'Property', + ReturnStatement: 'ReturnStatement', + SequenceExpression: 'SequenceExpression', + SwitchStatement: 'SwitchStatement', + SwitchCase: 'SwitchCase', + ThisExpression: 'ThisExpression', + ThrowStatement: 'ThrowStatement', + TryStatement: 'TryStatement', + UnaryExpression: 'UnaryExpression', + UpdateExpression: 'UpdateExpression', + VariableDeclaration: 'VariableDeclaration', + VariableDeclarator: 'VariableDeclarator', + WhileStatement: 'WhileStatement', + WithStatement: 'WithStatement' + }; + + PropertyKind = { + Data: 1, + Get: 2, + Set: 4 + }; + + // Error messages should be identical to V8. + Messages = { + UnexpectedToken: 'Unexpected token %0', + UnexpectedNumber: 'Unexpected number', + UnexpectedString: 'Unexpected string', + UnexpectedIdentifier: 'Unexpected identifier', + UnexpectedReserved: 'Unexpected reserved word', + UnexpectedEOS: 'Unexpected end of input', + NewlineAfterThrow: 'Illegal newline after throw', + InvalidRegExp: 'Invalid regular expression', + UnterminatedRegExp: 'Invalid regular expression: missing /', + InvalidLHSInAssignment: 'Invalid left-hand side in assignment', + InvalidLHSInForIn: 'Invalid left-hand side in for-in', + MultipleDefaultsInSwitch: 'More than one default clause in switch statement', + NoCatchOrFinally: 'Missing catch or finally after try', + UnknownLabel: 'Undefined label \'%0\'', + Redeclaration: '%0 \'%1\' has already been declared', + IllegalContinue: 'Illegal continue statement', + IllegalBreak: 'Illegal break statement', + IllegalReturn: 'Illegal return statement', + StrictModeWith: 'Strict mode code may not include a with statement', + StrictCatchVariable: 'Catch variable may not be eval or arguments in strict mode', + StrictVarName: 'Variable name may not be eval or arguments in strict mode', + StrictParamName: 'Parameter name eval or arguments is not allowed in strict mode', + StrictParamDupe: 'Strict mode function may not have duplicate parameter names', + StrictFunctionName: 'Function name may not be eval or arguments in strict mode', + StrictOctalLiteral: 'Octal literals are not allowed in strict mode.', + StrictDelete: 'Delete of an unqualified identifier in strict mode.', + StrictDuplicateProperty: 'Duplicate data property in object literal not allowed in strict mode', + AccessorDataProperty: 'Object literal may not have data and accessor property with the same name', + AccessorGetSet: 'Object literal may not have multiple get/set accessors with the same name', + StrictLHSAssignment: 'Assignment to eval or arguments is not allowed in strict mode', + StrictLHSPostfix: 'Postfix increment/decrement may not have eval or arguments operand in strict mode', + StrictLHSPrefix: 'Prefix increment/decrement may not have eval or arguments operand in strict mode', + StrictReservedWord: 'Use of future reserved word in strict mode' + }; + + // See also tools/generate-unicode-regex.py. + Regex = { + NonAsciiIdentifierStart: new RegExp('[\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]'), + NonAsciiIdentifierPart: new RegExp('[\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]') + }; + + // Ensure the condition is true, otherwise throw an error. + // This is only to have a better contract semantic, i.e. another safety net + // to catch a logic error. The condition shall be fulfilled in normal case. + // Do NOT use this to enforce a certain condition on any user input. + + function assert(condition, message) { + /* istanbul ignore if */ + if (!condition) { + throw new Error('ASSERT: ' + message); + } + } + + function isDecimalDigit(ch) { + return (ch >= 48 && ch <= 57); // 0..9 + } + + function isHexDigit(ch) { + return '0123456789abcdefABCDEF'.indexOf(ch) >= 0; + } + + function isOctalDigit(ch) { + return '01234567'.indexOf(ch) >= 0; + } + + + // 7.2 White Space + + function isWhiteSpace(ch) { + return (ch === 0x20) || (ch === 0x09) || (ch === 0x0B) || (ch === 0x0C) || (ch === 0xA0) || + (ch >= 0x1680 && [0x1680, 0x180E, 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200A, 0x202F, 0x205F, 0x3000, 0xFEFF].indexOf(ch) >= 0); + } + + // 7.3 Line Terminators + + function isLineTerminator(ch) { + return (ch === 0x0A) || (ch === 0x0D) || (ch === 0x2028) || (ch === 0x2029); + } + + // 7.6 Identifier Names and Identifiers + + function isIdentifierStart(ch) { + return (ch === 0x24) || (ch === 0x5F) || // $ (dollar) and _ (underscore) + (ch >= 0x41 && ch <= 0x5A) || // A..Z + (ch >= 0x61 && ch <= 0x7A) || // a..z + (ch === 0x5C) || // \ (backslash) + ((ch >= 0x80) && Regex.NonAsciiIdentifierStart.test(String.fromCharCode(ch))); + } + + function isIdentifierPart(ch) { + return (ch === 0x24) || (ch === 0x5F) || // $ (dollar) and _ (underscore) + (ch >= 0x41 && ch <= 0x5A) || // A..Z + (ch >= 0x61 && ch <= 0x7A) || // a..z + (ch >= 0x30 && ch <= 0x39) || // 0..9 + (ch === 0x5C) || // \ (backslash) + ((ch >= 0x80) && Regex.NonAsciiIdentifierPart.test(String.fromCharCode(ch))); + } + + // 7.6.1.2 Future Reserved Words + + function isFutureReservedWord(id) { + switch (id) { + case 'class': + case 'enum': + case 'export': + case 'extends': + case 'import': + case 'super': + return true; + default: + return false; + } + } + + function isStrictModeReservedWord(id) { + switch (id) { + case 'implements': + case 'interface': + case 'package': + case 'private': + case 'protected': + case 'public': + case 'static': + case 'yield': + case 'let': + return true; + default: + return false; + } + } + + function isRestrictedWord(id) { + return id === 'eval' || id === 'arguments'; + } + + // 7.6.1.1 Keywords + + function isKeyword(id) { + if (strict && isStrictModeReservedWord(id)) { + return true; + } + + // 'const' is specialized as Keyword in V8. + // 'yield' and 'let' are for compatiblity with SpiderMonkey and ES.next. + // Some others are from future reserved words. + + switch (id.length) { + case 2: + return (id === 'if') || (id === 'in') || (id === 'do'); + case 3: + return (id === 'var') || (id === 'for') || (id === 'new') || + (id === 'try') || (id === 'let'); + case 4: + return (id === 'this') || (id === 'else') || (id === 'case') || + (id === 'void') || (id === 'with') || (id === 'enum'); + case 5: + return (id === 'while') || (id === 'break') || (id === 'catch') || + (id === 'throw') || (id === 'const') || (id === 'yield') || + (id === 'class') || (id === 'super'); + case 6: + return (id === 'return') || (id === 'typeof') || (id === 'delete') || + (id === 'switch') || (id === 'export') || (id === 'import'); + case 7: + return (id === 'default') || (id === 'finally') || (id === 'extends'); + case 8: + return (id === 'function') || (id === 'continue') || (id === 'debugger'); + case 10: + return (id === 'instanceof'); + default: + return false; + } + } + + // 7.4 Comments + + function addComment(type, value, start, end, loc) { + var comment, attacher; + + assert(typeof start === 'number', 'Comment must have valid position'); + + // Because the way the actual token is scanned, often the comments + // (if any) are skipped twice during the lexical analysis. + // Thus, we need to skip adding a comment if the comment array already + // handled it. + if (state.lastCommentStart >= start) { + return; + } + state.lastCommentStart = start; + + comment = { + type: type, + value: value + }; + if (extra.range) { + comment.range = [start, end]; + } + if (extra.loc) { + comment.loc = loc; + } + extra.comments.push(comment); + if (extra.attachComment) { + extra.leadingComments.push(comment); + extra.trailingComments.push(comment); + } + } + + function skipSingleLineComment(offset) { + var start, loc, ch, comment; + + start = index - offset; + loc = { + start: { + line: lineNumber, + column: index - lineStart - offset + } + }; + + while (index < length) { + ch = source.charCodeAt(index); + ++index; + if (isLineTerminator(ch)) { + if (extra.comments) { + comment = source.slice(start + offset, index - 1); + loc.end = { + line: lineNumber, + column: index - lineStart - 1 + }; + addComment('Line', comment, start, index - 1, loc); + } + if (ch === 13 && source.charCodeAt(index) === 10) { + ++index; + } + ++lineNumber; + lineStart = index; + return; + } + } + + if (extra.comments) { + comment = source.slice(start + offset, index); + loc.end = { + line: lineNumber, + column: index - lineStart + }; + addComment('Line', comment, start, index, loc); + } + } + + function skipMultiLineComment() { + var start, loc, ch, comment; + + if (extra.comments) { + start = index - 2; + loc = { + start: { + line: lineNumber, + column: index - lineStart - 2 + } + }; + } + + while (index < length) { + ch = source.charCodeAt(index); + if (isLineTerminator(ch)) { + if (ch === 0x0D && source.charCodeAt(index + 1) === 0x0A) { + ++index; + } + ++lineNumber; + ++index; + lineStart = index; + if (index >= length) { + throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); + } + } else if (ch === 0x2A) { + // Block comment ends with '*/'. + if (source.charCodeAt(index + 1) === 0x2F) { + ++index; + ++index; + if (extra.comments) { + comment = source.slice(start + 2, index - 2); + loc.end = { + line: lineNumber, + column: index - lineStart + }; + addComment('Block', comment, start, index, loc); + } + return; + } + ++index; + } else { + ++index; + } + } + + throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); + } + + function skipComment() { + var ch, start; + + start = (index === 0); + while (index < length) { + ch = source.charCodeAt(index); + + if (isWhiteSpace(ch)) { + ++index; + } else if (isLineTerminator(ch)) { + ++index; + if (ch === 0x0D && source.charCodeAt(index) === 0x0A) { + ++index; + } + ++lineNumber; + lineStart = index; + start = true; + } else if (ch === 0x2F) { // U+002F is '/' + ch = source.charCodeAt(index + 1); + if (ch === 0x2F) { + ++index; + ++index; + skipSingleLineComment(2); + start = true; + } else if (ch === 0x2A) { // U+002A is '*' + ++index; + ++index; + skipMultiLineComment(); + } else { + break; + } + } else if (start && ch === 0x2D) { // U+002D is '-' + // U+003E is '>' + if ((source.charCodeAt(index + 1) === 0x2D) && (source.charCodeAt(index + 2) === 0x3E)) { + // '-->' is a single-line comment + index += 3; + skipSingleLineComment(3); + } else { + break; + } + } else if (ch === 0x3C) { // U+003C is '<' + if (source.slice(index + 1, index + 4) === '!--') { + ++index; // `<` + ++index; // `!` + ++index; // `-` + ++index; // `-` + skipSingleLineComment(4); + } else { + break; + } + } else { + break; + } + } + } + + function scanHexEscape(prefix) { + var i, len, ch, code = 0; + + len = (prefix === 'u') ? 4 : 2; + for (i = 0; i < len; ++i) { + if (index < length && isHexDigit(source[index])) { + ch = source[index++]; + code = code * 16 + '0123456789abcdef'.indexOf(ch.toLowerCase()); + } else { + return ''; + } + } + return String.fromCharCode(code); + } + + function getEscapedIdentifier() { + var ch, id; + + ch = source.charCodeAt(index++); + id = String.fromCharCode(ch); + + // '\u' (U+005C, U+0075) denotes an escaped character. + if (ch === 0x5C) { + if (source.charCodeAt(index) !== 0x75) { + throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); + } + ++index; + ch = scanHexEscape('u'); + if (!ch || ch === '\\' || !isIdentifierStart(ch.charCodeAt(0))) { + throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); + } + id = ch; + } + + while (index < length) { + ch = source.charCodeAt(index); + if (!isIdentifierPart(ch)) { + break; + } + ++index; + id += String.fromCharCode(ch); + + // '\u' (U+005C, U+0075) denotes an escaped character. + if (ch === 0x5C) { + id = id.substr(0, id.length - 1); + if (source.charCodeAt(index) !== 0x75) { + throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); + } + ++index; + ch = scanHexEscape('u'); + if (!ch || ch === '\\' || !isIdentifierPart(ch.charCodeAt(0))) { + throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); + } + id += ch; + } + } + + return id; + } + + function getIdentifier() { + var start, ch; + + start = index++; + while (index < length) { + ch = source.charCodeAt(index); + if (ch === 0x5C) { + // Blackslash (U+005C) marks Unicode escape sequence. + index = start; + return getEscapedIdentifier(); + } + if (isIdentifierPart(ch)) { + ++index; + } else { + break; + } + } + + return source.slice(start, index); + } + + function scanIdentifier() { + var start, id, type; + + start = index; + + // Backslash (U+005C) starts an escaped character. + id = (source.charCodeAt(index) === 0x5C) ? getEscapedIdentifier() : getIdentifier(); + + // There is no keyword or literal with only one character. + // Thus, it must be an identifier. + if (id.length === 1) { + type = Token.Identifier; + } else if (isKeyword(id)) { + type = Token.Keyword; + } else if (id === 'null') { + type = Token.NullLiteral; + } else if (id === 'true' || id === 'false') { + type = Token.BooleanLiteral; + } else { + type = Token.Identifier; + } + + return { + type: type, + value: id, + lineNumber: lineNumber, + lineStart: lineStart, + start: start, + end: index + }; + } + + + // 7.7 Punctuators + + function scanPunctuator() { + var start = index, + code = source.charCodeAt(index), + code2, + ch1 = source[index], + ch2, + ch3, + ch4; + + switch (code) { + + // Check for most common single-character punctuators. + case 0x2E: // . dot + case 0x28: // ( open bracket + case 0x29: // ) close bracket + case 0x3B: // ; semicolon + case 0x2C: // , comma + case 0x7B: // { open curly brace + case 0x7D: // } close curly brace + case 0x5B: // [ + case 0x5D: // ] + case 0x3A: // : + case 0x3F: // ? + case 0x7E: // ~ + ++index; + if (extra.tokenize) { + if (code === 0x28) { + extra.openParenToken = extra.tokens.length; + } else if (code === 0x7B) { + extra.openCurlyToken = extra.tokens.length; + } + } + return { + type: Token.Punctuator, + value: String.fromCharCode(code), + lineNumber: lineNumber, + lineStart: lineStart, + start: start, + end: index + }; + + default: + code2 = source.charCodeAt(index + 1); + + // '=' (U+003D) marks an assignment or comparison operator. + if (code2 === 0x3D) { + switch (code) { + case 0x2B: // + + case 0x2D: // - + case 0x2F: // / + case 0x3C: // < + case 0x3E: // > + case 0x5E: // ^ + case 0x7C: // | + case 0x25: // % + case 0x26: // & + case 0x2A: // * + index += 2; + return { + type: Token.Punctuator, + value: String.fromCharCode(code) + String.fromCharCode(code2), + lineNumber: lineNumber, + lineStart: lineStart, + start: start, + end: index + }; + + case 0x21: // ! + case 0x3D: // = + index += 2; + + // !== and === + if (source.charCodeAt(index) === 0x3D) { + ++index; + } + return { + type: Token.Punctuator, + value: source.slice(start, index), + lineNumber: lineNumber, + lineStart: lineStart, + start: start, + end: index + }; + } + } + } + + // 4-character punctuator: >>>= + + ch4 = source.substr(index, 4); + + if (ch4 === '>>>=') { + index += 4; + return { + type: Token.Punctuator, + value: ch4, + lineNumber: lineNumber, + lineStart: lineStart, + start: start, + end: index + }; + } + + // 3-character punctuators: === !== >>> <<= >>= + + ch3 = ch4.substr(0, 3); + + if (ch3 === '>>>' || ch3 === '<<=' || ch3 === '>>=') { + index += 3; + return { + type: Token.Punctuator, + value: ch3, + lineNumber: lineNumber, + lineStart: lineStart, + start: start, + end: index + }; + } + + // Other 2-character punctuators: ++ -- << >> && || + ch2 = ch3.substr(0, 2); + + if ((ch1 === ch2[1] && ('+-<>&|'.indexOf(ch1) >= 0)) || ch2 === '=>') { + index += 2; + return { + type: Token.Punctuator, + value: ch2, + lineNumber: lineNumber, + lineStart: lineStart, + start: start, + end: index + }; + } + + // 1-character punctuators: < > = ! + - * % & | ^ / + if ('<>=!+-*%&|^/'.indexOf(ch1) >= 0) { + ++index; + return { + type: Token.Punctuator, + value: ch1, + lineNumber: lineNumber, + lineStart: lineStart, + start: start, + end: index + }; + } + + throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); + } + + // 7.8.3 Numeric Literals + + function scanHexLiteral(start) { + var number = ''; + + while (index < length) { + if (!isHexDigit(source[index])) { + break; + } + number += source[index++]; + } + + if (number.length === 0) { + throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); + } + + if (isIdentifierStart(source.charCodeAt(index))) { + throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); + } + + return { + type: Token.NumericLiteral, + value: parseInt('0x' + number, 16), + lineNumber: lineNumber, + lineStart: lineStart, + start: start, + end: index + }; + } + + function scanOctalLiteral(start) { + var number = '0' + source[index++]; + while (index < length) { + if (!isOctalDigit(source[index])) { + break; + } + number += source[index++]; + } + + if (isIdentifierStart(source.charCodeAt(index)) || isDecimalDigit(source.charCodeAt(index))) { + throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); + } + + return { + type: Token.NumericLiteral, + value: parseInt(number, 8), + octal: true, + lineNumber: lineNumber, + lineStart: lineStart, + start: start, + end: index + }; + } + + function scanNumericLiteral() { + var number, start, ch; + + ch = source[index]; + assert(isDecimalDigit(ch.charCodeAt(0)) || (ch === '.'), + 'Numeric literal must start with a decimal digit or a decimal point'); + + start = index; + number = ''; + if (ch !== '.') { + number = source[index++]; + ch = source[index]; + + // Hex number starts with '0x'. + // Octal number starts with '0'. + if (number === '0') { + if (ch === 'x' || ch === 'X') { + ++index; + return scanHexLiteral(start); + } + if (isOctalDigit(ch)) { + return scanOctalLiteral(start); + } + + // decimal number starts with '0' such as '09' is illegal. + if (ch && isDecimalDigit(ch.charCodeAt(0))) { + throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); + } + } + + while (isDecimalDigit(source.charCodeAt(index))) { + number += source[index++]; + } + ch = source[index]; + } + + if (ch === '.') { + number += source[index++]; + while (isDecimalDigit(source.charCodeAt(index))) { + number += source[index++]; + } + ch = source[index]; + } + + if (ch === 'e' || ch === 'E') { + number += source[index++]; + + ch = source[index]; + if (ch === '+' || ch === '-') { + number += source[index++]; + } + if (isDecimalDigit(source.charCodeAt(index))) { + while (isDecimalDigit(source.charCodeAt(index))) { + number += source[index++]; + } + } else { + throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); + } + } + + if (isIdentifierStart(source.charCodeAt(index))) { + throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); + } + + return { + type: Token.NumericLiteral, + value: parseFloat(number), + lineNumber: lineNumber, + lineStart: lineStart, + start: start, + end: index + }; + } + + // 7.8.4 String Literals + + function scanStringLiteral() { + var str = '', quote, start, ch, code, unescaped, restore, octal = false, startLineNumber, startLineStart; + startLineNumber = lineNumber; + startLineStart = lineStart; + + quote = source[index]; + assert((quote === '\'' || quote === '"'), + 'String literal must starts with a quote'); + + start = index; + ++index; + + while (index < length) { + ch = source[index++]; + + if (ch === quote) { + quote = ''; + break; + } else if (ch === '\\') { + ch = source[index++]; + if (!ch || !isLineTerminator(ch.charCodeAt(0))) { + switch (ch) { + case 'u': + case 'x': + restore = index; + unescaped = scanHexEscape(ch); + if (unescaped) { + str += unescaped; + } else { + index = restore; + str += ch; + } + break; + case 'n': + str += '\n'; + break; + case 'r': + str += '\r'; + break; + case 't': + str += '\t'; + break; + case 'b': + str += '\b'; + break; + case 'f': + str += '\f'; + break; + case 'v': + str += '\x0B'; + break; + + default: + if (isOctalDigit(ch)) { + code = '01234567'.indexOf(ch); + + // \0 is not octal escape sequence + if (code !== 0) { + octal = true; + } + + if (index < length && isOctalDigit(source[index])) { + octal = true; + code = code * 8 + '01234567'.indexOf(source[index++]); + + // 3 digits are only allowed when string starts + // with 0, 1, 2, 3 + if ('0123'.indexOf(ch) >= 0 && + index < length && + isOctalDigit(source[index])) { + code = code * 8 + '01234567'.indexOf(source[index++]); + } + } + str += String.fromCharCode(code); + } else { + str += ch; + } + break; + } + } else { + ++lineNumber; + if (ch === '\r' && source[index] === '\n') { + ++index; + } + lineStart = index; + } + } else if (isLineTerminator(ch.charCodeAt(0))) { + break; + } else { + str += ch; + } + } + + if (quote !== '') { + throwError({}, Messages.UnexpectedToken, 'ILLEGAL'); + } + + return { + type: Token.StringLiteral, + value: str, + octal: octal, + startLineNumber: startLineNumber, + startLineStart: startLineStart, + lineNumber: lineNumber, + lineStart: lineStart, + start: start, + end: index + }; + } + + function testRegExp(pattern, flags) { + var value; + try { + value = new RegExp(pattern, flags); + } catch (e) { + throwError({}, Messages.InvalidRegExp); + } + return value; + } + + function scanRegExpBody() { + var ch, str, classMarker, terminated, body; + + ch = source[index]; + assert(ch === '/', 'Regular expression literal must start with a slash'); + str = source[index++]; + + classMarker = false; + terminated = false; + while (index < length) { + ch = source[index++]; + str += ch; + if (ch === '\\') { + ch = source[index++]; + // ECMA-262 7.8.5 + if (isLineTerminator(ch.charCodeAt(0))) { + throwError({}, Messages.UnterminatedRegExp); + } + str += ch; + } else if (isLineTerminator(ch.charCodeAt(0))) { + throwError({}, Messages.UnterminatedRegExp); + } else if (classMarker) { + if (ch === ']') { + classMarker = false; + } + } else { + if (ch === '/') { + terminated = true; + break; + } else if (ch === '[') { + classMarker = true; + } + } + } + + if (!terminated) { + throwError({}, Messages.UnterminatedRegExp); + } + + // Exclude leading and trailing slash. + body = str.substr(1, str.length - 2); + return { + value: body, + literal: str + }; + } + + function scanRegExpFlags() { + var ch, str, flags, restore; + + str = ''; + flags = ''; + while (index < length) { + ch = source[index]; + if (!isIdentifierPart(ch.charCodeAt(0))) { + break; + } + + ++index; + if (ch === '\\' && index < length) { + ch = source[index]; + if (ch === 'u') { + ++index; + restore = index; + ch = scanHexEscape('u'); + if (ch) { + flags += ch; + for (str += '\\u'; restore < index; ++restore) { + str += source[restore]; + } + } else { + index = restore; + flags += 'u'; + str += '\\u'; + } + throwErrorTolerant({}, Messages.UnexpectedToken, 'ILLEGAL'); + } else { + str += '\\'; + throwErrorTolerant({}, Messages.UnexpectedToken, 'ILLEGAL'); + } + } else { + flags += ch; + str += ch; + } + } + + return { + value: flags, + literal: str + }; + } + + function scanRegExp() { + var start, body, flags, pattern, value; + + lookahead = null; + skipComment(); + start = index; + + body = scanRegExpBody(); + flags = scanRegExpFlags(); + value = testRegExp(body.value, flags.value); + + if (extra.tokenize) { + return { + type: Token.RegularExpression, + value: value, + lineNumber: lineNumber, + lineStart: lineStart, + start: start, + end: index + }; + } + + return { + literal: body.literal + flags.literal, + value: value, + start: start, + end: index + }; + } + + function collectRegex() { + var pos, loc, regex, token; + + skipComment(); + + pos = index; + loc = { + start: { + line: lineNumber, + column: index - lineStart + } + }; + + regex = scanRegExp(); + loc.end = { + line: lineNumber, + column: index - lineStart + }; + + /* istanbul ignore next */ + if (!extra.tokenize) { + // Pop the previous token, which is likely '/' or '/=' + if (extra.tokens.length > 0) { + token = extra.tokens[extra.tokens.length - 1]; + if (token.range[0] === pos && token.type === 'Punctuator') { + if (token.value === '/' || token.value === '/=') { + extra.tokens.pop(); + } + } + } + + extra.tokens.push({ + type: 'RegularExpression', + value: regex.literal, + range: [pos, index], + loc: loc + }); + } + + return regex; + } + + function isIdentifierName(token) { + return token.type === Token.Identifier || + token.type === Token.Keyword || + token.type === Token.BooleanLiteral || + token.type === Token.NullLiteral; + } + + function advanceSlash() { + var prevToken, + checkToken; + // Using the following algorithm: + // https://github.com/mozilla/sweet.js/wiki/design + prevToken = extra.tokens[extra.tokens.length - 1]; + if (!prevToken) { + // Nothing before that: it cannot be a division. + return collectRegex(); + } + if (prevToken.type === 'Punctuator') { + if (prevToken.value === ']') { + return scanPunctuator(); + } + if (prevToken.value === ')') { + checkToken = extra.tokens[extra.openParenToken - 1]; + if (checkToken && + checkToken.type === 'Keyword' && + (checkToken.value === 'if' || + checkToken.value === 'while' || + checkToken.value === 'for' || + checkToken.value === 'with')) { + return collectRegex(); + } + return scanPunctuator(); + } + if (prevToken.value === '}') { + // Dividing a function by anything makes little sense, + // but we have to check for that. + if (extra.tokens[extra.openCurlyToken - 3] && + extra.tokens[extra.openCurlyToken - 3].type === 'Keyword') { + // Anonymous function. + checkToken = extra.tokens[extra.openCurlyToken - 4]; + if (!checkToken) { + return scanPunctuator(); + } + } else if (extra.tokens[extra.openCurlyToken - 4] && + extra.tokens[extra.openCurlyToken - 4].type === 'Keyword') { + // Named function. + checkToken = extra.tokens[extra.openCurlyToken - 5]; + if (!checkToken) { + return collectRegex(); + } + } else { + return scanPunctuator(); + } + // checkToken determines whether the function is + // a declaration or an expression. + if (FnExprTokens.indexOf(checkToken.value) >= 0) { + // It is an expression. + return scanPunctuator(); + } + // It is a declaration. + return collectRegex(); + } + return collectRegex(); + } + if (prevToken.type === 'Keyword') { + return collectRegex(); + } + return scanPunctuator(); + } + + function advance() { + var ch; + + skipComment(); + + if (index >= length) { + return { + type: Token.EOF, + lineNumber: lineNumber, + lineStart: lineStart, + start: index, + end: index + }; + } + + ch = source.charCodeAt(index); + + if (isIdentifierStart(ch)) { + return scanIdentifier(); + } + + // Very common: ( and ) and ; + if (ch === 0x28 || ch === 0x29 || ch === 0x3B) { + return scanPunctuator(); + } + + // String literal starts with single quote (U+0027) or double quote (U+0022). + if (ch === 0x27 || ch === 0x22) { + return scanStringLiteral(); + } + + + // Dot (.) U+002E can also start a floating-point number, hence the need + // to check the next character. + if (ch === 0x2E) { + if (isDecimalDigit(source.charCodeAt(index + 1))) { + return scanNumericLiteral(); + } + return scanPunctuator(); + } + + if (isDecimalDigit(ch)) { + return scanNumericLiteral(); + } + + // Slash (/) U+002F can also start a regex. + if (extra.tokenize && ch === 0x2F) { + return advanceSlash(); + } + + return scanPunctuator(); + } + + function collectToken() { + var loc, token, range, value; + + skipComment(); + loc = { + start: { + line: lineNumber, + column: index - lineStart + } + }; + + token = advance(); + loc.end = { + line: lineNumber, + column: index - lineStart + }; + + if (token.type !== Token.EOF) { + value = source.slice(token.start, token.end); + extra.tokens.push({ + type: TokenName[token.type], + value: value, + range: [token.start, token.end], + loc: loc + }); + } + + return token; + } + + function lex() { + var token; + + token = lookahead; + index = token.end; + lineNumber = token.lineNumber; + lineStart = token.lineStart; + + lookahead = (typeof extra.tokens !== 'undefined') ? collectToken() : advance(); + + index = token.end; + lineNumber = token.lineNumber; + lineStart = token.lineStart; + + return token; + } + + function peek() { + var pos, line, start; + + pos = index; + line = lineNumber; + start = lineStart; + lookahead = (typeof extra.tokens !== 'undefined') ? collectToken() : advance(); + index = pos; + lineNumber = line; + lineStart = start; + } + + function Position(line, column) { + this.line = line; + this.column = column; + } + + function SourceLocation(startLine, startColumn, line, column) { + this.start = new Position(startLine, startColumn); + this.end = new Position(line, column); + } + + SyntaxTreeDelegate = { + + name: 'SyntaxTree', + + processComment: function (node) { + var lastChild, trailingComments; + + if (node.type === Syntax.Program) { + if (node.body.length > 0) { + return; + } + } + + if (extra.trailingComments.length > 0) { + if (extra.trailingComments[0].range[0] >= node.range[1]) { + trailingComments = extra.trailingComments; + extra.trailingComments = []; + } else { + extra.trailingComments.length = 0; + } + } else { + if (extra.bottomRightStack.length > 0 && + extra.bottomRightStack[extra.bottomRightStack.length - 1].trailingComments && + extra.bottomRightStack[extra.bottomRightStack.length - 1].trailingComments[0].range[0] >= node.range[1]) { + trailingComments = extra.bottomRightStack[extra.bottomRightStack.length - 1].trailingComments; + delete extra.bottomRightStack[extra.bottomRightStack.length - 1].trailingComments; + } + } + + // Eating the stack. + while (extra.bottomRightStack.length > 0 && extra.bottomRightStack[extra.bottomRightStack.length - 1].range[0] >= node.range[0]) { + lastChild = extra.bottomRightStack.pop(); + } + + if (lastChild) { + if (lastChild.leadingComments && lastChild.leadingComments[lastChild.leadingComments.length - 1].range[1] <= node.range[0]) { + node.leadingComments = lastChild.leadingComments; + delete lastChild.leadingComments; + } + } else if (extra.leadingComments.length > 0 && extra.leadingComments[extra.leadingComments.length - 1].range[1] <= node.range[0]) { + node.leadingComments = extra.leadingComments; + extra.leadingComments = []; + } + + + if (trailingComments) { + node.trailingComments = trailingComments; + } + + extra.bottomRightStack.push(node); + }, + + markEnd: function (node, startToken) { + if (extra.range) { + node.range = [startToken.start, index]; + } + if (extra.loc) { + node.loc = new SourceLocation( + startToken.startLineNumber === undefined ? startToken.lineNumber : startToken.startLineNumber, + startToken.start - (startToken.startLineStart === undefined ? startToken.lineStart : startToken.startLineStart), + lineNumber, + index - lineStart + ); + this.postProcess(node); + } + + if (extra.attachComment) { + this.processComment(node); + } + return node; + }, + + postProcess: function (node) { + if (extra.source) { + node.loc.source = extra.source; + } + return node; + }, + + createArrayExpression: function (elements) { + return { + type: Syntax.ArrayExpression, + elements: elements + }; + }, + + createAssignmentExpression: function (operator, left, right) { + return { + type: Syntax.AssignmentExpression, + operator: operator, + left: left, + right: right + }; + }, + + createBinaryExpression: function (operator, left, right) { + var type = (operator === '||' || operator === '&&') ? Syntax.LogicalExpression : + Syntax.BinaryExpression; + return { + type: type, + operator: operator, + left: left, + right: right + }; + }, + + createBlockStatement: function (body) { + return { + type: Syntax.BlockStatement, + body: body + }; + }, + + createBreakStatement: function (label) { + return { + type: Syntax.BreakStatement, + label: label + }; + }, + + createCallExpression: function (callee, args) { + return { + type: Syntax.CallExpression, + callee: callee, + 'arguments': args + }; + }, + + createCatchClause: function (param, body) { + return { + type: Syntax.CatchClause, + param: param, + body: body + }; + }, + + createConditionalExpression: function (test, consequent, alternate) { + return { + type: Syntax.ConditionalExpression, + test: test, + consequent: consequent, + alternate: alternate + }; + }, + + createContinueStatement: function (label) { + return { + type: Syntax.ContinueStatement, + label: label + }; + }, + + createDebuggerStatement: function () { + return { + type: Syntax.DebuggerStatement + }; + }, + + createDoWhileStatement: function (body, test) { + return { + type: Syntax.DoWhileStatement, + body: body, + test: test + }; + }, + + createEmptyStatement: function () { + return { + type: Syntax.EmptyStatement + }; + }, + + createExpressionStatement: function (expression) { + return { + type: Syntax.ExpressionStatement, + expression: expression + }; + }, + + createForStatement: function (init, test, update, body) { + return { + type: Syntax.ForStatement, + init: init, + test: test, + update: update, + body: body + }; + }, + + createForInStatement: function (left, right, body) { + return { + type: Syntax.ForInStatement, + left: left, + right: right, + body: body, + each: false + }; + }, + + createFunctionDeclaration: function (id, params, defaults, body) { + return { + type: Syntax.FunctionDeclaration, + id: id, + params: params, + defaults: defaults, + body: body, + rest: null, + generator: false, + expression: false + }; + }, + + createFunctionExpression: function (id, params, defaults, body) { + return { + type: Syntax.FunctionExpression, + id: id, + params: params, + defaults: defaults, + body: body, + rest: null, + generator: false, + expression: false + }; + }, + + createIdentifier: function (name) { + return { + type: Syntax.Identifier, + name: name + }; + }, + + createIfStatement: function (test, consequent, alternate) { + return { + type: Syntax.IfStatement, + test: test, + consequent: consequent, + alternate: alternate + }; + }, + + createLabeledStatement: function (label, body) { + return { + type: Syntax.LabeledStatement, + label: label, + body: body + }; + }, + + createLiteral: function (token) { + return { + type: Syntax.Literal, + value: token.value, + raw: source.slice(token.start, token.end) + }; + }, + + createMemberExpression: function (accessor, object, property) { + return { + type: Syntax.MemberExpression, + computed: accessor === '[', + object: object, + property: property + }; + }, + + createNewExpression: function (callee, args) { + return { + type: Syntax.NewExpression, + callee: callee, + 'arguments': args + }; + }, + + createObjectExpression: function (properties) { + return { + type: Syntax.ObjectExpression, + properties: properties + }; + }, + + createPostfixExpression: function (operator, argument) { + return { + type: Syntax.UpdateExpression, + operator: operator, + argument: argument, + prefix: false + }; + }, + + createProgram: function (body) { + return { + type: Syntax.Program, + body: body + }; + }, + + createProperty: function (kind, key, value) { + return { + type: Syntax.Property, + key: key, + value: value, + kind: kind + }; + }, + + createReturnStatement: function (argument) { + return { + type: Syntax.ReturnStatement, + argument: argument + }; + }, + + createSequenceExpression: function (expressions) { + return { + type: Syntax.SequenceExpression, + expressions: expressions + }; + }, + + createSwitchCase: function (test, consequent) { + return { + type: Syntax.SwitchCase, + test: test, + consequent: consequent + }; + }, + + createSwitchStatement: function (discriminant, cases) { + return { + type: Syntax.SwitchStatement, + discriminant: discriminant, + cases: cases + }; + }, + + createThisExpression: function () { + return { + type: Syntax.ThisExpression + }; + }, + + createThrowStatement: function (argument) { + return { + type: Syntax.ThrowStatement, + argument: argument + }; + }, + + createTryStatement: function (block, guardedHandlers, handlers, finalizer) { + return { + type: Syntax.TryStatement, + block: block, + guardedHandlers: guardedHandlers, + handlers: handlers, + finalizer: finalizer + }; + }, + + createUnaryExpression: function (operator, argument) { + if (operator === '++' || operator === '--') { + return { + type: Syntax.UpdateExpression, + operator: operator, + argument: argument, + prefix: true + }; + } + return { + type: Syntax.UnaryExpression, + operator: operator, + argument: argument, + prefix: true + }; + }, + + createVariableDeclaration: function (declarations, kind) { + return { + type: Syntax.VariableDeclaration, + declarations: declarations, + kind: kind + }; + }, + + createVariableDeclarator: function (id, init) { + return { + type: Syntax.VariableDeclarator, + id: id, + init: init + }; + }, + + createWhileStatement: function (test, body) { + return { + type: Syntax.WhileStatement, + test: test, + body: body + }; + }, + + createWithStatement: function (object, body) { + return { + type: Syntax.WithStatement, + object: object, + body: body + }; + } + }; + + // Return true if there is a line terminator before the next token. + + function peekLineTerminator() { + var pos, line, start, found; + + pos = index; + line = lineNumber; + start = lineStart; + skipComment(); + found = lineNumber !== line; + index = pos; + lineNumber = line; + lineStart = start; + + return found; + } + + // Throw an exception + + function throwError(token, messageFormat) { + var error, + args = Array.prototype.slice.call(arguments, 2), + msg = messageFormat.replace( + /%(\d)/g, + function (whole, index) { + assert(index < args.length, 'Message reference must be in range'); + return args[index]; + } + ); + + if (typeof token.lineNumber === 'number') { + error = new Error('Line ' + token.lineNumber + ': ' + msg); + error.index = token.start; + error.lineNumber = token.lineNumber; + error.column = token.start - lineStart + 1; + } else { + error = new Error('Line ' + lineNumber + ': ' + msg); + error.index = index; + error.lineNumber = lineNumber; + error.column = index - lineStart + 1; + } + + error.description = msg; + throw error; + } + + function throwErrorTolerant() { + try { + throwError.apply(null, arguments); + } catch (e) { + if (extra.errors) { + extra.errors.push(e); + } else { + throw e; + } + } + } + + + // Throw an exception because of the token. + + function throwUnexpected(token) { + if (token.type === Token.EOF) { + throwError(token, Messages.UnexpectedEOS); + } + + if (token.type === Token.NumericLiteral) { + throwError(token, Messages.UnexpectedNumber); + } + + if (token.type === Token.StringLiteral) { + throwError(token, Messages.UnexpectedString); + } + + if (token.type === Token.Identifier) { + throwError(token, Messages.UnexpectedIdentifier); + } + + if (token.type === Token.Keyword) { + if (isFutureReservedWord(token.value)) { + throwError(token, Messages.UnexpectedReserved); + } else if (strict && isStrictModeReservedWord(token.value)) { + throwErrorTolerant(token, Messages.StrictReservedWord); + return; + } + throwError(token, Messages.UnexpectedToken, token.value); + } + + // BooleanLiteral, NullLiteral, or Punctuator. + throwError(token, Messages.UnexpectedToken, token.value); + } + + // Expect the next token to match the specified punctuator. + // If not, an exception will be thrown. + + function expect(value) { + var token = lex(); + if (token.type !== Token.Punctuator || token.value !== value) { + throwUnexpected(token); + } + } + + // Expect the next token to match the specified keyword. + // If not, an exception will be thrown. + + function expectKeyword(keyword) { + var token = lex(); + if (token.type !== Token.Keyword || token.value !== keyword) { + throwUnexpected(token); + } + } + + // Return true if the next token matches the specified punctuator. + + function match(value) { + return lookahead.type === Token.Punctuator && lookahead.value === value; + } + + // Return true if the next token matches the specified keyword + + function matchKeyword(keyword) { + return lookahead.type === Token.Keyword && lookahead.value === keyword; + } + + // Return true if the next token is an assignment operator + + function matchAssign() { + var op; + + if (lookahead.type !== Token.Punctuator) { + return false; + } + op = lookahead.value; + return op === '=' || + op === '*=' || + op === '/=' || + op === '%=' || + op === '+=' || + op === '-=' || + op === '<<=' || + op === '>>=' || + op === '>>>=' || + op === '&=' || + op === '^=' || + op === '|='; + } + + function consumeSemicolon() { + var line; + + // Catch the very common case first: immediately a semicolon (U+003B). + if (source.charCodeAt(index) === 0x3B || match(';')) { + lex(); + return; + } + + line = lineNumber; + skipComment(); + if (lineNumber !== line) { + return; + } + + if (lookahead.type !== Token.EOF && !match('}')) { + throwUnexpected(lookahead); + } + } + + // Return true if provided expression is LeftHandSideExpression + + function isLeftHandSide(expr) { + return expr.type === Syntax.Identifier || expr.type === Syntax.MemberExpression; + } + + // 11.1.4 Array Initialiser + + function parseArrayInitialiser() { + var elements = [], startToken; + + startToken = lookahead; + expect('['); + + while (!match(']')) { + if (match(',')) { + lex(); + elements.push(null); + } else { + elements.push(parseAssignmentExpression()); + + if (!match(']')) { + expect(','); + } + } + } + + lex(); + + return delegate.markEnd(delegate.createArrayExpression(elements), startToken); + } + + // 11.1.5 Object Initialiser + + function parsePropertyFunction(param, first) { + var previousStrict, body, startToken; + + previousStrict = strict; + startToken = lookahead; + body = parseFunctionSourceElements(); + if (first && strict && isRestrictedWord(param[0].name)) { + throwErrorTolerant(first, Messages.StrictParamName); + } + strict = previousStrict; + return delegate.markEnd(delegate.createFunctionExpression(null, param, [], body), startToken); + } + + function parseObjectPropertyKey() { + var token, startToken; + + startToken = lookahead; + token = lex(); + + // Note: This function is called only from parseObjectProperty(), where + // EOF and Punctuator tokens are already filtered out. + + if (token.type === Token.StringLiteral || token.type === Token.NumericLiteral) { + if (strict && token.octal) { + throwErrorTolerant(token, Messages.StrictOctalLiteral); + } + return delegate.markEnd(delegate.createLiteral(token), startToken); + } + + return delegate.markEnd(delegate.createIdentifier(token.value), startToken); + } + + function parseObjectProperty() { + var token, key, id, value, param, startToken; + + token = lookahead; + startToken = lookahead; + + if (token.type === Token.Identifier) { + + id = parseObjectPropertyKey(); + + // Property Assignment: Getter and Setter. + + if (token.value === 'get' && !match(':')) { + key = parseObjectPropertyKey(); + expect('('); + expect(')'); + value = parsePropertyFunction([]); + return delegate.markEnd(delegate.createProperty('get', key, value), startToken); + } + if (token.value === 'set' && !match(':')) { + key = parseObjectPropertyKey(); + expect('('); + token = lookahead; + if (token.type !== Token.Identifier) { + expect(')'); + throwErrorTolerant(token, Messages.UnexpectedToken, token.value); + value = parsePropertyFunction([]); + } else { + param = [ parseVariableIdentifier() ]; + expect(')'); + value = parsePropertyFunction(param, token); + } + return delegate.markEnd(delegate.createProperty('set', key, value), startToken); + } + expect(':'); + value = parseAssignmentExpression(); + return delegate.markEnd(delegate.createProperty('init', id, value), startToken); + } + if (token.type === Token.EOF || token.type === Token.Punctuator) { + throwUnexpected(token); + } else { + key = parseObjectPropertyKey(); + expect(':'); + value = parseAssignmentExpression(); + return delegate.markEnd(delegate.createProperty('init', key, value), startToken); + } + } + + function parseObjectInitialiser() { + var properties = [], property, name, key, kind, map = {}, toString = String, startToken; + + startToken = lookahead; + + expect('{'); + + while (!match('}')) { + property = parseObjectProperty(); + + if (property.key.type === Syntax.Identifier) { + name = property.key.name; + } else { + name = toString(property.key.value); + } + kind = (property.kind === 'init') ? PropertyKind.Data : (property.kind === 'get') ? PropertyKind.Get : PropertyKind.Set; + + key = '$' + name; + if (Object.prototype.hasOwnProperty.call(map, key)) { + if (map[key] === PropertyKind.Data) { + if (strict && kind === PropertyKind.Data) { + throwErrorTolerant({}, Messages.StrictDuplicateProperty); + } else if (kind !== PropertyKind.Data) { + throwErrorTolerant({}, Messages.AccessorDataProperty); + } + } else { + if (kind === PropertyKind.Data) { + throwErrorTolerant({}, Messages.AccessorDataProperty); + } else if (map[key] & kind) { + throwErrorTolerant({}, Messages.AccessorGetSet); + } + } + map[key] |= kind; + } else { + map[key] = kind; + } + + properties.push(property); + + if (!match('}')) { + expect(','); + } + } + + expect('}'); + + return delegate.markEnd(delegate.createObjectExpression(properties), startToken); + } + + // 11.1.6 The Grouping Operator + + function parseGroupExpression() { + var expr; + + expect('('); + + expr = parseExpression(); + + expect(')'); + + return expr; + } + + + // 11.1 Primary Expressions + + function parsePrimaryExpression() { + var type, token, expr, startToken; + + if (match('(')) { + return parseGroupExpression(); + } + + if (match('[')) { + return parseArrayInitialiser(); + } + + if (match('{')) { + return parseObjectInitialiser(); + } + + type = lookahead.type; + startToken = lookahead; + + if (type === Token.Identifier) { + expr = delegate.createIdentifier(lex().value); + } else if (type === Token.StringLiteral || type === Token.NumericLiteral) { + if (strict && lookahead.octal) { + throwErrorTolerant(lookahead, Messages.StrictOctalLiteral); + } + expr = delegate.createLiteral(lex()); + } else if (type === Token.Keyword) { + if (matchKeyword('function')) { + return parseFunctionExpression(); + } + if (matchKeyword('this')) { + lex(); + expr = delegate.createThisExpression(); + } else { + throwUnexpected(lex()); + } + } else if (type === Token.BooleanLiteral) { + token = lex(); + token.value = (token.value === 'true'); + expr = delegate.createLiteral(token); + } else if (type === Token.NullLiteral) { + token = lex(); + token.value = null; + expr = delegate.createLiteral(token); + } else if (match('/') || match('/=')) { + if (typeof extra.tokens !== 'undefined') { + expr = delegate.createLiteral(collectRegex()); + } else { + expr = delegate.createLiteral(scanRegExp()); + } + peek(); + } else { + throwUnexpected(lex()); + } + + return delegate.markEnd(expr, startToken); + } + + // 11.2 Left-Hand-Side Expressions + + function parseArguments() { + var args = []; + + expect('('); + + if (!match(')')) { + while (index < length) { + args.push(parseAssignmentExpression()); + if (match(')')) { + break; + } + expect(','); + } + } + + expect(')'); + + return args; + } + + function parseNonComputedProperty() { + var token, startToken; + + startToken = lookahead; + token = lex(); + + if (!isIdentifierName(token)) { + throwUnexpected(token); + } + + return delegate.markEnd(delegate.createIdentifier(token.value), startToken); + } + + function parseNonComputedMember() { + expect('.'); + + return parseNonComputedProperty(); + } + + function parseComputedMember() { + var expr; + + expect('['); + + expr = parseExpression(); + + expect(']'); + + return expr; + } + + function parseNewExpression() { + var callee, args, startToken; + + startToken = lookahead; + expectKeyword('new'); + callee = parseLeftHandSideExpression(); + args = match('(') ? parseArguments() : []; + + return delegate.markEnd(delegate.createNewExpression(callee, args), startToken); + } + + function parseLeftHandSideExpressionAllowCall() { + var previousAllowIn, expr, args, property, startToken; + + startToken = lookahead; + + previousAllowIn = state.allowIn; + state.allowIn = true; + expr = matchKeyword('new') ? parseNewExpression() : parsePrimaryExpression(); + state.allowIn = previousAllowIn; + + for (;;) { + if (match('.')) { + property = parseNonComputedMember(); + expr = delegate.createMemberExpression('.', expr, property); + } else if (match('(')) { + args = parseArguments(); + expr = delegate.createCallExpression(expr, args); + } else if (match('[')) { + property = parseComputedMember(); + expr = delegate.createMemberExpression('[', expr, property); + } else { + break; + } + delegate.markEnd(expr, startToken); + } + + return expr; + } + + function parseLeftHandSideExpression() { + var previousAllowIn, expr, property, startToken; + + startToken = lookahead; + + previousAllowIn = state.allowIn; + expr = matchKeyword('new') ? parseNewExpression() : parsePrimaryExpression(); + state.allowIn = previousAllowIn; + + while (match('.') || match('[')) { + if (match('[')) { + property = parseComputedMember(); + expr = delegate.createMemberExpression('[', expr, property); + } else { + property = parseNonComputedMember(); + expr = delegate.createMemberExpression('.', expr, property); + } + delegate.markEnd(expr, startToken); + } + + return expr; + } + + // 11.3 Postfix Expressions + + function parsePostfixExpression() { + var expr, token, startToken = lookahead; + + expr = parseLeftHandSideExpressionAllowCall(); + + if (lookahead.type === Token.Punctuator) { + if ((match('++') || match('--')) && !peekLineTerminator()) { + // 11.3.1, 11.3.2 + if (strict && expr.type === Syntax.Identifier && isRestrictedWord(expr.name)) { + throwErrorTolerant({}, Messages.StrictLHSPostfix); + } + + if (!isLeftHandSide(expr)) { + throwErrorTolerant({}, Messages.InvalidLHSInAssignment); + } + + token = lex(); + expr = delegate.markEnd(delegate.createPostfixExpression(token.value, expr), startToken); + } + } + + return expr; + } + + // 11.4 Unary Operators + + function parseUnaryExpression() { + var token, expr, startToken; + + if (lookahead.type !== Token.Punctuator && lookahead.type !== Token.Keyword) { + expr = parsePostfixExpression(); + } else if (match('++') || match('--')) { + startToken = lookahead; + token = lex(); + expr = parseUnaryExpression(); + // 11.4.4, 11.4.5 + if (strict && expr.type === Syntax.Identifier && isRestrictedWord(expr.name)) { + throwErrorTolerant({}, Messages.StrictLHSPrefix); + } + + if (!isLeftHandSide(expr)) { + throwErrorTolerant({}, Messages.InvalidLHSInAssignment); + } + + expr = delegate.createUnaryExpression(token.value, expr); + expr = delegate.markEnd(expr, startToken); + } else if (match('+') || match('-') || match('~') || match('!')) { + startToken = lookahead; + token = lex(); + expr = parseUnaryExpression(); + expr = delegate.createUnaryExpression(token.value, expr); + expr = delegate.markEnd(expr, startToken); + } else if (matchKeyword('delete') || matchKeyword('void') || matchKeyword('typeof')) { + startToken = lookahead; + token = lex(); + expr = parseUnaryExpression(); + expr = delegate.createUnaryExpression(token.value, expr); + expr = delegate.markEnd(expr, startToken); + if (strict && expr.operator === 'delete' && expr.argument.type === Syntax.Identifier) { + throwErrorTolerant({}, Messages.StrictDelete); + } + } else { + expr = parsePostfixExpression(); + } + + return expr; + } + + function binaryPrecedence(token, allowIn) { + var prec = 0; + + if (token.type !== Token.Punctuator && token.type !== Token.Keyword) { + return 0; + } + + switch (token.value) { + case '||': + prec = 1; + break; + + case '&&': + prec = 2; + break; + + case '|': + prec = 3; + break; + + case '^': + prec = 4; + break; + + case '&': + prec = 5; + break; + + case '==': + case '!=': + case '===': + case '!==': + prec = 6; + break; + + case '<': + case '>': + case '<=': + case '>=': + case 'instanceof': + prec = 7; + break; + + case 'in': + prec = allowIn ? 7 : 0; + break; + + case '<<': + case '>>': + case '>>>': + prec = 8; + break; + + case '+': + case '-': + prec = 9; + break; + + case '*': + case '/': + case '%': + prec = 11; + break; + + default: + break; + } + + return prec; + } + + // 11.5 Multiplicative Operators + // 11.6 Additive Operators + // 11.7 Bitwise Shift Operators + // 11.8 Relational Operators + // 11.9 Equality Operators + // 11.10 Binary Bitwise Operators + // 11.11 Binary Logical Operators + + function parseBinaryExpression() { + var marker, markers, expr, token, prec, stack, right, operator, left, i; + + marker = lookahead; + left = parseUnaryExpression(); + + token = lookahead; + prec = binaryPrecedence(token, state.allowIn); + if (prec === 0) { + return left; + } + token.prec = prec; + lex(); + + markers = [marker, lookahead]; + right = parseUnaryExpression(); + + stack = [left, token, right]; + + while ((prec = binaryPrecedence(lookahead, state.allowIn)) > 0) { + + // Reduce: make a binary expression from the three topmost entries. + while ((stack.length > 2) && (prec <= stack[stack.length - 2].prec)) { + right = stack.pop(); + operator = stack.pop().value; + left = stack.pop(); + expr = delegate.createBinaryExpression(operator, left, right); + markers.pop(); + marker = markers[markers.length - 1]; + delegate.markEnd(expr, marker); + stack.push(expr); + } + + // Shift. + token = lex(); + token.prec = prec; + stack.push(token); + markers.push(lookahead); + expr = parseUnaryExpression(); + stack.push(expr); + } + + // Final reduce to clean-up the stack. + i = stack.length - 1; + expr = stack[i]; + markers.pop(); + while (i > 1) { + expr = delegate.createBinaryExpression(stack[i - 1].value, stack[i - 2], expr); + i -= 2; + marker = markers.pop(); + delegate.markEnd(expr, marker); + } + + return expr; + } + + + // 11.12 Conditional Operator + + function parseConditionalExpression() { + var expr, previousAllowIn, consequent, alternate, startToken; + + startToken = lookahead; + + expr = parseBinaryExpression(); + + if (match('?')) { + lex(); + previousAllowIn = state.allowIn; + state.allowIn = true; + consequent = parseAssignmentExpression(); + state.allowIn = previousAllowIn; + expect(':'); + alternate = parseAssignmentExpression(); + + expr = delegate.createConditionalExpression(expr, consequent, alternate); + delegate.markEnd(expr, startToken); + } + + return expr; + } + + // 11.13 Assignment Operators + + function parseAssignmentExpression() { + var token, left, right, node, startToken; + + token = lookahead; + startToken = lookahead; + + node = left = parseConditionalExpression(); + + if (matchAssign()) { + // LeftHandSideExpression + if (!isLeftHandSide(left)) { + throwErrorTolerant({}, Messages.InvalidLHSInAssignment); + } + + // 11.13.1 + if (strict && left.type === Syntax.Identifier && isRestrictedWord(left.name)) { + throwErrorTolerant(token, Messages.StrictLHSAssignment); + } + + token = lex(); + right = parseAssignmentExpression(); + node = delegate.markEnd(delegate.createAssignmentExpression(token.value, left, right), startToken); + } + + return node; + } + + // 11.14 Comma Operator + + function parseExpression() { + var expr, startToken = lookahead; + + expr = parseAssignmentExpression(); + + if (match(',')) { + expr = delegate.createSequenceExpression([ expr ]); + + while (index < length) { + if (!match(',')) { + break; + } + lex(); + expr.expressions.push(parseAssignmentExpression()); + } + + delegate.markEnd(expr, startToken); + } + + return expr; + } + + // 12.1 Block + + function parseStatementList() { + var list = [], + statement; + + while (index < length) { + if (match('}')) { + break; + } + statement = parseSourceElement(); + if (typeof statement === 'undefined') { + break; + } + list.push(statement); + } + + return list; + } + + function parseBlock() { + var block, startToken; + + startToken = lookahead; + expect('{'); + + block = parseStatementList(); + + expect('}'); + + return delegate.markEnd(delegate.createBlockStatement(block), startToken); + } + + // 12.2 Variable Statement + + function parseVariableIdentifier() { + var token, startToken; + + startToken = lookahead; + token = lex(); + + if (token.type !== Token.Identifier) { + throwUnexpected(token); + } + + return delegate.markEnd(delegate.createIdentifier(token.value), startToken); + } + + function parseVariableDeclaration(kind) { + var init = null, id, startToken; + + startToken = lookahead; + id = parseVariableIdentifier(); + + // 12.2.1 + if (strict && isRestrictedWord(id.name)) { + throwErrorTolerant({}, Messages.StrictVarName); + } + + if (kind === 'const') { + expect('='); + init = parseAssignmentExpression(); + } else if (match('=')) { + lex(); + init = parseAssignmentExpression(); + } + + return delegate.markEnd(delegate.createVariableDeclarator(id, init), startToken); + } + + function parseVariableDeclarationList(kind) { + var list = []; + + do { + list.push(parseVariableDeclaration(kind)); + if (!match(',')) { + break; + } + lex(); + } while (index < length); + + return list; + } + + function parseVariableStatement() { + var declarations; + + expectKeyword('var'); + + declarations = parseVariableDeclarationList(); + + consumeSemicolon(); + + return delegate.createVariableDeclaration(declarations, 'var'); + } + + // kind may be `const` or `let` + // Both are experimental and not in the specification yet. + // see http://wiki.ecmascript.org/doku.php?id=harmony:const + // and http://wiki.ecmascript.org/doku.php?id=harmony:let + function parseConstLetDeclaration(kind) { + var declarations, startToken; + + startToken = lookahead; + + expectKeyword(kind); + + declarations = parseVariableDeclarationList(kind); + + consumeSemicolon(); + + return delegate.markEnd(delegate.createVariableDeclaration(declarations, kind), startToken); + } + + // 12.3 Empty Statement + + function parseEmptyStatement() { + expect(';'); + return delegate.createEmptyStatement(); + } + + // 12.4 Expression Statement + + function parseExpressionStatement() { + var expr = parseExpression(); + consumeSemicolon(); + return delegate.createExpressionStatement(expr); + } + + // 12.5 If statement + + function parseIfStatement() { + var test, consequent, alternate; + + expectKeyword('if'); + + expect('('); + + test = parseExpression(); + + expect(')'); + + consequent = parseStatement(); + + if (matchKeyword('else')) { + lex(); + alternate = parseStatement(); + } else { + alternate = null; + } + + return delegate.createIfStatement(test, consequent, alternate); + } + + // 12.6 Iteration Statements + + function parseDoWhileStatement() { + var body, test, oldInIteration; + + expectKeyword('do'); + + oldInIteration = state.inIteration; + state.inIteration = true; + + body = parseStatement(); + + state.inIteration = oldInIteration; + + expectKeyword('while'); + + expect('('); + + test = parseExpression(); + + expect(')'); + + if (match(';')) { + lex(); + } + + return delegate.createDoWhileStatement(body, test); + } + + function parseWhileStatement() { + var test, body, oldInIteration; + + expectKeyword('while'); + + expect('('); + + test = parseExpression(); + + expect(')'); + + oldInIteration = state.inIteration; + state.inIteration = true; + + body = parseStatement(); + + state.inIteration = oldInIteration; + + return delegate.createWhileStatement(test, body); + } + + function parseForVariableDeclaration() { + var token, declarations, startToken; + + startToken = lookahead; + token = lex(); + declarations = parseVariableDeclarationList(); + + return delegate.markEnd(delegate.createVariableDeclaration(declarations, token.value), startToken); + } + + function parseForStatement() { + var init, test, update, left, right, body, oldInIteration; + + init = test = update = null; + + expectKeyword('for'); + + expect('('); + + if (match(';')) { + lex(); + } else { + if (matchKeyword('var') || matchKeyword('let')) { + state.allowIn = false; + init = parseForVariableDeclaration(); + state.allowIn = true; + + if (init.declarations.length === 1 && matchKeyword('in')) { + lex(); + left = init; + right = parseExpression(); + init = null; + } + } else { + state.allowIn = false; + init = parseExpression(); + state.allowIn = true; + + if (matchKeyword('in')) { + // LeftHandSideExpression + if (!isLeftHandSide(init)) { + throwErrorTolerant({}, Messages.InvalidLHSInForIn); + } + + lex(); + left = init; + right = parseExpression(); + init = null; + } + } + + if (typeof left === 'undefined') { + expect(';'); + } + } + + if (typeof left === 'undefined') { + + if (!match(';')) { + test = parseExpression(); + } + expect(';'); + + if (!match(')')) { + update = parseExpression(); + } + } + + expect(')'); + + oldInIteration = state.inIteration; + state.inIteration = true; + + body = parseStatement(); + + state.inIteration = oldInIteration; + + return (typeof left === 'undefined') ? + delegate.createForStatement(init, test, update, body) : + delegate.createForInStatement(left, right, body); + } + + // 12.7 The continue statement + + function parseContinueStatement() { + var label = null, key; + + expectKeyword('continue'); + + // Optimize the most common form: 'continue;'. + if (source.charCodeAt(index) === 0x3B) { + lex(); + + if (!state.inIteration) { + throwError({}, Messages.IllegalContinue); + } + + return delegate.createContinueStatement(null); + } + + if (peekLineTerminator()) { + if (!state.inIteration) { + throwError({}, Messages.IllegalContinue); + } + + return delegate.createContinueStatement(null); + } + + if (lookahead.type === Token.Identifier) { + label = parseVariableIdentifier(); + + key = '$' + label.name; + if (!Object.prototype.hasOwnProperty.call(state.labelSet, key)) { + throwError({}, Messages.UnknownLabel, label.name); + } + } + + consumeSemicolon(); + + if (label === null && !state.inIteration) { + throwError({}, Messages.IllegalContinue); + } + + return delegate.createContinueStatement(label); + } + + // 12.8 The break statement + + function parseBreakStatement() { + var label = null, key; + + expectKeyword('break'); + + // Catch the very common case first: immediately a semicolon (U+003B). + if (source.charCodeAt(index) === 0x3B) { + lex(); + + if (!(state.inIteration || state.inSwitch)) { + throwError({}, Messages.IllegalBreak); + } + + return delegate.createBreakStatement(null); + } + + if (peekLineTerminator()) { + if (!(state.inIteration || state.inSwitch)) { + throwError({}, Messages.IllegalBreak); + } + + return delegate.createBreakStatement(null); + } + + if (lookahead.type === Token.Identifier) { + label = parseVariableIdentifier(); + + key = '$' + label.name; + if (!Object.prototype.hasOwnProperty.call(state.labelSet, key)) { + throwError({}, Messages.UnknownLabel, label.name); + } + } + + consumeSemicolon(); + + if (label === null && !(state.inIteration || state.inSwitch)) { + throwError({}, Messages.IllegalBreak); + } + + return delegate.createBreakStatement(label); + } + + // 12.9 The return statement + + function parseReturnStatement() { + var argument = null; + + expectKeyword('return'); + + if (!state.inFunctionBody) { + throwErrorTolerant({}, Messages.IllegalReturn); + } + + // 'return' followed by a space and an identifier is very common. + if (source.charCodeAt(index) === 0x20) { + if (isIdentifierStart(source.charCodeAt(index + 1))) { + argument = parseExpression(); + consumeSemicolon(); + return delegate.createReturnStatement(argument); + } + } + + if (peekLineTerminator()) { + return delegate.createReturnStatement(null); + } + + if (!match(';')) { + if (!match('}') && lookahead.type !== Token.EOF) { + argument = parseExpression(); + } + } + + consumeSemicolon(); + + return delegate.createReturnStatement(argument); + } + + // 12.10 The with statement + + function parseWithStatement() { + var object, body; + + if (strict) { + // TODO(ikarienator): Should we update the test cases instead? + skipComment(); + throwErrorTolerant({}, Messages.StrictModeWith); + } + + expectKeyword('with'); + + expect('('); + + object = parseExpression(); + + expect(')'); + + body = parseStatement(); + + return delegate.createWithStatement(object, body); + } + + // 12.10 The swith statement + + function parseSwitchCase() { + var test, consequent = [], statement, startToken; + + startToken = lookahead; + if (matchKeyword('default')) { + lex(); + test = null; + } else { + expectKeyword('case'); + test = parseExpression(); + } + expect(':'); + + while (index < length) { + if (match('}') || matchKeyword('default') || matchKeyword('case')) { + break; + } + statement = parseStatement(); + consequent.push(statement); + } + + return delegate.markEnd(delegate.createSwitchCase(test, consequent), startToken); + } + + function parseSwitchStatement() { + var discriminant, cases, clause, oldInSwitch, defaultFound; + + expectKeyword('switch'); + + expect('('); + + discriminant = parseExpression(); + + expect(')'); + + expect('{'); + + cases = []; + + if (match('}')) { + lex(); + return delegate.createSwitchStatement(discriminant, cases); + } + + oldInSwitch = state.inSwitch; + state.inSwitch = true; + defaultFound = false; + + while (index < length) { + if (match('}')) { + break; + } + clause = parseSwitchCase(); + if (clause.test === null) { + if (defaultFound) { + throwError({}, Messages.MultipleDefaultsInSwitch); + } + defaultFound = true; + } + cases.push(clause); + } + + state.inSwitch = oldInSwitch; + + expect('}'); + + return delegate.createSwitchStatement(discriminant, cases); + } + + // 12.13 The throw statement + + function parseThrowStatement() { + var argument; + + expectKeyword('throw'); + + if (peekLineTerminator()) { + throwError({}, Messages.NewlineAfterThrow); + } + + argument = parseExpression(); + + consumeSemicolon(); + + return delegate.createThrowStatement(argument); + } + + // 12.14 The try statement + + function parseCatchClause() { + var param, body, startToken; + + startToken = lookahead; + expectKeyword('catch'); + + expect('('); + if (match(')')) { + throwUnexpected(lookahead); + } + + param = parseVariableIdentifier(); + // 12.14.1 + if (strict && isRestrictedWord(param.name)) { + throwErrorTolerant({}, Messages.StrictCatchVariable); + } + + expect(')'); + body = parseBlock(); + return delegate.markEnd(delegate.createCatchClause(param, body), startToken); + } + + function parseTryStatement() { + var block, handlers = [], finalizer = null; + + expectKeyword('try'); + + block = parseBlock(); + + if (matchKeyword('catch')) { + handlers.push(parseCatchClause()); + } + + if (matchKeyword('finally')) { + lex(); + finalizer = parseBlock(); + } + + if (handlers.length === 0 && !finalizer) { + throwError({}, Messages.NoCatchOrFinally); + } + + return delegate.createTryStatement(block, [], handlers, finalizer); + } + + // 12.15 The debugger statement + + function parseDebuggerStatement() { + expectKeyword('debugger'); + + consumeSemicolon(); + + return delegate.createDebuggerStatement(); + } + + // 12 Statements + + function parseStatement() { + var type = lookahead.type, + expr, + labeledBody, + key, + startToken; + + if (type === Token.EOF) { + throwUnexpected(lookahead); + } + + if (type === Token.Punctuator && lookahead.value === '{') { + return parseBlock(); + } + + startToken = lookahead; + + if (type === Token.Punctuator) { + switch (lookahead.value) { + case ';': + return delegate.markEnd(parseEmptyStatement(), startToken); + case '(': + return delegate.markEnd(parseExpressionStatement(), startToken); + default: + break; + } + } + + if (type === Token.Keyword) { + switch (lookahead.value) { + case 'break': + return delegate.markEnd(parseBreakStatement(), startToken); + case 'continue': + return delegate.markEnd(parseContinueStatement(), startToken); + case 'debugger': + return delegate.markEnd(parseDebuggerStatement(), startToken); + case 'do': + return delegate.markEnd(parseDoWhileStatement(), startToken); + case 'for': + return delegate.markEnd(parseForStatement(), startToken); + case 'function': + return delegate.markEnd(parseFunctionDeclaration(), startToken); + case 'if': + return delegate.markEnd(parseIfStatement(), startToken); + case 'return': + return delegate.markEnd(parseReturnStatement(), startToken); + case 'switch': + return delegate.markEnd(parseSwitchStatement(), startToken); + case 'throw': + return delegate.markEnd(parseThrowStatement(), startToken); + case 'try': + return delegate.markEnd(parseTryStatement(), startToken); + case 'var': + return delegate.markEnd(parseVariableStatement(), startToken); + case 'while': + return delegate.markEnd(parseWhileStatement(), startToken); + case 'with': + return delegate.markEnd(parseWithStatement(), startToken); + default: + break; + } + } + + expr = parseExpression(); + + // 12.12 Labelled Statements + if ((expr.type === Syntax.Identifier) && match(':')) { + lex(); + + key = '$' + expr.name; + if (Object.prototype.hasOwnProperty.call(state.labelSet, key)) { + throwError({}, Messages.Redeclaration, 'Label', expr.name); + } + + state.labelSet[key] = true; + labeledBody = parseStatement(); + delete state.labelSet[key]; + return delegate.markEnd(delegate.createLabeledStatement(expr, labeledBody), startToken); + } + + consumeSemicolon(); + + return delegate.markEnd(delegate.createExpressionStatement(expr), startToken); + } + + // 13 Function Definition + + function parseFunctionSourceElements() { + var sourceElement, sourceElements = [], token, directive, firstRestricted, + oldLabelSet, oldInIteration, oldInSwitch, oldInFunctionBody, startToken; + + startToken = lookahead; + expect('{'); + + while (index < length) { + if (lookahead.type !== Token.StringLiteral) { + break; + } + token = lookahead; + + sourceElement = parseSourceElement(); + sourceElements.push(sourceElement); + if (sourceElement.expression.type !== Syntax.Literal) { + // this is not directive + break; + } + directive = source.slice(token.start + 1, token.end - 1); + if (directive === 'use strict') { + strict = true; + if (firstRestricted) { + throwErrorTolerant(firstRestricted, Messages.StrictOctalLiteral); + } + } else { + if (!firstRestricted && token.octal) { + firstRestricted = token; + } + } + } + + oldLabelSet = state.labelSet; + oldInIteration = state.inIteration; + oldInSwitch = state.inSwitch; + oldInFunctionBody = state.inFunctionBody; + + state.labelSet = {}; + state.inIteration = false; + state.inSwitch = false; + state.inFunctionBody = true; + + while (index < length) { + if (match('}')) { + break; + } + sourceElement = parseSourceElement(); + if (typeof sourceElement === 'undefined') { + break; + } + sourceElements.push(sourceElement); + } + + expect('}'); + + state.labelSet = oldLabelSet; + state.inIteration = oldInIteration; + state.inSwitch = oldInSwitch; + state.inFunctionBody = oldInFunctionBody; + + return delegate.markEnd(delegate.createBlockStatement(sourceElements), startToken); + } + + function parseParams(firstRestricted) { + var param, params = [], token, stricted, paramSet, key, message; + expect('('); + + if (!match(')')) { + paramSet = {}; + while (index < length) { + token = lookahead; + param = parseVariableIdentifier(); + key = '$' + token.value; + if (strict) { + if (isRestrictedWord(token.value)) { + stricted = token; + message = Messages.StrictParamName; + } + if (Object.prototype.hasOwnProperty.call(paramSet, key)) { + stricted = token; + message = Messages.StrictParamDupe; + } + } else if (!firstRestricted) { + if (isRestrictedWord(token.value)) { + firstRestricted = token; + message = Messages.StrictParamName; + } else if (isStrictModeReservedWord(token.value)) { + firstRestricted = token; + message = Messages.StrictReservedWord; + } else if (Object.prototype.hasOwnProperty.call(paramSet, key)) { + firstRestricted = token; + message = Messages.StrictParamDupe; + } + } + params.push(param); + paramSet[key] = true; + if (match(')')) { + break; + } + expect(','); + } + } + + expect(')'); + + return { + params: params, + stricted: stricted, + firstRestricted: firstRestricted, + message: message + }; + } + + function parseFunctionDeclaration() { + var id, params = [], body, token, stricted, tmp, firstRestricted, message, previousStrict, startToken; + + startToken = lookahead; + + expectKeyword('function'); + token = lookahead; + id = parseVariableIdentifier(); + if (strict) { + if (isRestrictedWord(token.value)) { + throwErrorTolerant(token, Messages.StrictFunctionName); + } + } else { + if (isRestrictedWord(token.value)) { + firstRestricted = token; + message = Messages.StrictFunctionName; + } else if (isStrictModeReservedWord(token.value)) { + firstRestricted = token; + message = Messages.StrictReservedWord; + } + } + + tmp = parseParams(firstRestricted); + params = tmp.params; + stricted = tmp.stricted; + firstRestricted = tmp.firstRestricted; + if (tmp.message) { + message = tmp.message; + } + + previousStrict = strict; + body = parseFunctionSourceElements(); + if (strict && firstRestricted) { + throwError(firstRestricted, message); + } + if (strict && stricted) { + throwErrorTolerant(stricted, message); + } + strict = previousStrict; + + return delegate.markEnd(delegate.createFunctionDeclaration(id, params, [], body), startToken); + } + + function parseFunctionExpression() { + var token, id = null, stricted, firstRestricted, message, tmp, params = [], body, previousStrict, startToken; + + startToken = lookahead; + expectKeyword('function'); + + if (!match('(')) { + token = lookahead; + id = parseVariableIdentifier(); + if (strict) { + if (isRestrictedWord(token.value)) { + throwErrorTolerant(token, Messages.StrictFunctionName); + } + } else { + if (isRestrictedWord(token.value)) { + firstRestricted = token; + message = Messages.StrictFunctionName; + } else if (isStrictModeReservedWord(token.value)) { + firstRestricted = token; + message = Messages.StrictReservedWord; + } + } + } + + tmp = parseParams(firstRestricted); + params = tmp.params; + stricted = tmp.stricted; + firstRestricted = tmp.firstRestricted; + if (tmp.message) { + message = tmp.message; + } + + previousStrict = strict; + body = parseFunctionSourceElements(); + if (strict && firstRestricted) { + throwError(firstRestricted, message); + } + if (strict && stricted) { + throwErrorTolerant(stricted, message); + } + strict = previousStrict; + + return delegate.markEnd(delegate.createFunctionExpression(id, params, [], body), startToken); + } + + // 14 Program + + function parseSourceElement() { + if (lookahead.type === Token.Keyword) { + switch (lookahead.value) { + case 'const': + case 'let': + return parseConstLetDeclaration(lookahead.value); + case 'function': + return parseFunctionDeclaration(); + default: + return parseStatement(); + } + } + + if (lookahead.type !== Token.EOF) { + return parseStatement(); + } + } + + function parseSourceElements() { + var sourceElement, sourceElements = [], token, directive, firstRestricted; + + while (index < length) { + token = lookahead; + if (token.type !== Token.StringLiteral) { + break; + } + + sourceElement = parseSourceElement(); + sourceElements.push(sourceElement); + if (sourceElement.expression.type !== Syntax.Literal) { + // this is not directive + break; + } + directive = source.slice(token.start + 1, token.end - 1); + if (directive === 'use strict') { + strict = true; + if (firstRestricted) { + throwErrorTolerant(firstRestricted, Messages.StrictOctalLiteral); + } + } else { + if (!firstRestricted && token.octal) { + firstRestricted = token; + } + } + } + + while (index < length) { + sourceElement = parseSourceElement(); + /* istanbul ignore if */ + if (typeof sourceElement === 'undefined') { + break; + } + sourceElements.push(sourceElement); + } + return sourceElements; + } + + function parseProgram() { + var body, startToken; + + skipComment(); + peek(); + startToken = lookahead; + strict = false; + + body = parseSourceElements(); + return delegate.markEnd(delegate.createProgram(body), startToken); + } + + function filterTokenLocation() { + var i, entry, token, tokens = []; + + for (i = 0; i < extra.tokens.length; ++i) { + entry = extra.tokens[i]; + token = { + type: entry.type, + value: entry.value + }; + if (extra.range) { + token.range = entry.range; + } + if (extra.loc) { + token.loc = entry.loc; + } + tokens.push(token); + } + + extra.tokens = tokens; + } + + function tokenize(code, options) { + var toString, + token, + tokens; + + toString = String; + if (typeof code !== 'string' && !(code instanceof String)) { + code = toString(code); + } + + delegate = SyntaxTreeDelegate; + source = code; + index = 0; + lineNumber = (source.length > 0) ? 1 : 0; + lineStart = 0; + length = source.length; + lookahead = null; + state = { + allowIn: true, + labelSet: {}, + inFunctionBody: false, + inIteration: false, + inSwitch: false, + lastCommentStart: -1 + }; + + extra = {}; + + // Options matching. + options = options || {}; + + // Of course we collect tokens here. + options.tokens = true; + extra.tokens = []; + extra.tokenize = true; + // The following two fields are necessary to compute the Regex tokens. + extra.openParenToken = -1; + extra.openCurlyToken = -1; + + extra.range = (typeof options.range === 'boolean') && options.range; + extra.loc = (typeof options.loc === 'boolean') && options.loc; + + if (typeof options.comment === 'boolean' && options.comment) { + extra.comments = []; + } + if (typeof options.tolerant === 'boolean' && options.tolerant) { + extra.errors = []; + } + + try { + peek(); + if (lookahead.type === Token.EOF) { + return extra.tokens; + } + + token = lex(); + while (lookahead.type !== Token.EOF) { + try { + token = lex(); + } catch (lexError) { + token = lookahead; + if (extra.errors) { + extra.errors.push(lexError); + // We have to break on the first error + // to avoid infinite loops. + break; + } else { + throw lexError; + } + } + } + + filterTokenLocation(); + tokens = extra.tokens; + if (typeof extra.comments !== 'undefined') { + tokens.comments = extra.comments; + } + if (typeof extra.errors !== 'undefined') { + tokens.errors = extra.errors; + } + } catch (e) { + throw e; + } finally { + extra = {}; + } + return tokens; + } + + function parse(code, options) { + var program, toString; + + toString = String; + if (typeof code !== 'string' && !(code instanceof String)) { + code = toString(code); + } + + delegate = SyntaxTreeDelegate; + source = code; + index = 0; + lineNumber = (source.length > 0) ? 1 : 0; + lineStart = 0; + length = source.length; + lookahead = null; + state = { + allowIn: true, + labelSet: {}, + inFunctionBody: false, + inIteration: false, + inSwitch: false, + lastCommentStart: -1 + }; + + extra = {}; + if (typeof options !== 'undefined') { + extra.range = (typeof options.range === 'boolean') && options.range; + extra.loc = (typeof options.loc === 'boolean') && options.loc; + extra.attachComment = (typeof options.attachComment === 'boolean') && options.attachComment; + + if (extra.loc && options.source !== null && options.source !== undefined) { + extra.source = toString(options.source); + } + + if (typeof options.tokens === 'boolean' && options.tokens) { + extra.tokens = []; + } + if (typeof options.comment === 'boolean' && options.comment) { + extra.comments = []; + } + if (typeof options.tolerant === 'boolean' && options.tolerant) { + extra.errors = []; + } + if (extra.attachComment) { + extra.range = true; + extra.comments = []; + extra.bottomRightStack = []; + extra.trailingComments = []; + extra.leadingComments = []; + } + } + + try { + program = parseProgram(); + if (typeof extra.comments !== 'undefined') { + program.comments = extra.comments; + } + if (typeof extra.tokens !== 'undefined') { + filterTokenLocation(); + program.tokens = extra.tokens; + } + if (typeof extra.errors !== 'undefined') { + program.errors = extra.errors; + } + } catch (e) { + throw e; + } finally { + extra = {}; + } + + return program; + } + + // Sync with *.json manifests. + exports.version = '1.2.2'; + + exports.tokenize = tokenize; + + exports.parse = parse; + + // Deep copy. + /* istanbul ignore next */ + exports.Syntax = (function () { + var name, types = {}; + + if (typeof Object.create === 'function') { + types = Object.create(null); + } + + for (name in Syntax) { + if (Syntax.hasOwnProperty(name)) { + types[name] = Syntax[name]; + } + } + + if (typeof Object.freeze === 'function') { + Object.freeze(types); + } + + return types; + }()); + +})); +/* vim: set sw=4 ts=4 et tw=80 : */ + +},{}],128:[function(require,module,exports){ +/* + Copyright (C) 2012-2013 Yusuke Suzuki + Copyright (C) 2012 Ariya Hidayat + + 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 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, define:true*/ +(function (root, factory) { + 'use strict'; + + // Universal Module Definition (UMD) to support AMD, CommonJS/Node.js, + // and plain browser loading, + if (typeof define === 'function' && define.amd) { + define(['exports'], factory); + } else if (typeof exports !== 'undefined') { + factory(exports); + } else { + factory((root.estraverse = {})); + } +}(this, function (exports) { + 'use strict'; + + var Syntax, + isArray, + VisitorOption, + VisitorKeys, + objectCreate, + objectKeys, + BREAK, + SKIP, + REMOVE; + + function ignoreJSHintError() { } + + isArray = Array.isArray; + if (!isArray) { + isArray = function isArray(array) { + return Object.prototype.toString.call(array) === '[object Array]'; + }; + } + + 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; + } + + function shallowCopy(obj) { + var ret = {}, key; + for (key in obj) { + if (obj.hasOwnProperty(key)) { + ret[key] = obj[key]; + } + } + return ret; + } + ignoreJSHintError(shallowCopy); + + // 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; + } + + function lowerBound(array, func) { + var diff, len, i, current; + + len = array.length; + i = 0; + + while (len) { + diff = len >>> 1; + current = i + diff; + if (func(array[current])) { + i = current + 1; + len -= diff + 1; + } else { + len = diff; + } + } + return i; + } + ignoreJSHintError(lowerBound); + + objectCreate = Object.create || (function () { + function F() { } + + return function (o) { + F.prototype = o; + return new F(); + }; + })(); + + objectKeys = Object.keys || function (o) { + var keys = [], key; + for (key in o) { + keys.push(key); + } + return keys; + }; + + function extend(to, from) { + objectKeys(from).forEach(function (key) { + to[key] = from[key]; + }); + return to; + } + + Syntax = { + AssignmentExpression: 'AssignmentExpression', + ArrayExpression: 'ArrayExpression', + ArrayPattern: 'ArrayPattern', + ArrowFunctionExpression: 'ArrowFunctionExpression', + AwaitExpression: 'AwaitExpression', // CAUTION: It's deferred to ES7. + BlockStatement: 'BlockStatement', + BinaryExpression: 'BinaryExpression', + BreakStatement: 'BreakStatement', + CallExpression: 'CallExpression', + CatchClause: 'CatchClause', + 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', + ExportBatchSpecifier: 'ExportBatchSpecifier', + ExportDeclaration: 'ExportDeclaration', + 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', + ImportDeclaration: 'ImportDeclaration', + ImportDefaultSpecifier: 'ImportDefaultSpecifier', + ImportNamespaceSpecifier: 'ImportNamespaceSpecifier', + ImportSpecifier: 'ImportSpecifier', + Literal: 'Literal', + LabeledStatement: 'LabeledStatement', + LogicalExpression: 'LogicalExpression', + MemberExpression: 'MemberExpression', + MethodDefinition: 'MethodDefinition', + ModuleSpecifier: 'ModuleSpecifier', + NewExpression: 'NewExpression', + ObjectExpression: 'ObjectExpression', + ObjectPattern: 'ObjectPattern', + Program: 'Program', + Property: 'Property', + ReturnStatement: 'ReturnStatement', + SequenceExpression: 'SequenceExpression', + SpreadElement: 'SpreadElement', + 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'], + ArrayExpression: ['elements'], + ArrayPattern: ['elements'], + ArrowFunctionExpression: ['params', 'defaults', 'rest', 'body'], + AwaitExpression: ['argument'], // CAUTION: It's deferred to ES7. + BlockStatement: ['body'], + BinaryExpression: ['left', 'right'], + BreakStatement: ['label'], + CallExpression: ['callee', 'arguments'], + CatchClause: ['param', 'body'], + ClassBody: ['body'], + ClassDeclaration: ['id', 'body', 'superClass'], + ClassExpression: ['id', 'body', 'superClass'], + 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: [], + ExportBatchSpecifier: [], + ExportDeclaration: ['declaration', 'specifiers', 'source'], + ExportSpecifier: ['id', 'name'], + ExpressionStatement: ['expression'], + ForStatement: ['init', 'test', 'update', 'body'], + ForInStatement: ['left', 'right', 'body'], + ForOfStatement: ['left', 'right', 'body'], + FunctionDeclaration: ['id', 'params', 'defaults', 'rest', 'body'], + FunctionExpression: ['id', 'params', 'defaults', 'rest', 'body'], + GeneratorExpression: ['blocks', 'filter', 'body'], // CAUTION: It's deferred to ES7. + Identifier: [], + IfStatement: ['test', 'consequent', 'alternate'], + ImportDeclaration: ['specifiers', 'source'], + ImportDefaultSpecifier: ['id'], + ImportNamespaceSpecifier: ['id'], + ImportSpecifier: ['id', 'name'], + Literal: [], + LabeledStatement: ['label', 'body'], + LogicalExpression: ['left', 'right'], + MemberExpression: ['object', 'property'], + MethodDefinition: ['key', 'value'], + ModuleSpecifier: [], + NewExpression: ['callee', 'arguments'], + ObjectExpression: ['properties'], + ObjectPattern: ['properties'], + Program: ['body'], + Property: ['key', 'value'], + ReturnStatement: ['argument'], + SequenceExpression: ['expressions'], + SpreadElement: ['argument'], + SwitchStatement: ['discriminant', 'cases'], + SwitchCase: ['test', 'consequent'], + TaggedTemplateExpression: ['tag', 'quasi'], + TemplateElement: [], + TemplateLiteral: ['quasis', 'expressions'], + ThisExpression: [], + ThrowStatement: ['argument'], + TryStatement: ['block', 'handlers', 'handler', 'guardedHandlers', '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 (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 (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 = visitor.fallback === 'iteration'; + this.__keys = VisitorKeys; + if (visitor.keys) { + this.__keys = extend(objectCreate(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; + } + + 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 = element.wrap || node.type; + candidates = this.__keys[nodeType]; + if (!candidates) { + if (this.__fallback) { + candidates = objectKeys(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 (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', null); + } else if (isNode(candidate[current2])) { + element = new Element(candidate[current2], [key, current2], null, null); + } else { + continue; + } + worklist.push(element); + } + } else if (isNode(candidate)) { + worklist.push(new Element(candidate, key, null, null)); + } + } + } + } + }; + + Controller.prototype.replace = function replace(root, visitor) { + 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; + } + } + } + } + + var worklist, + leavelist, + node, + nodeType, + target, + element, + current, + current2, + candidates, + candidate, + sentinel, + outer, + 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 = element.wrap || node.type; + candidates = this.__keys[nodeType]; + if (!candidates) { + if (this.__fallback) { + candidates = objectKeys(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 (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.version = '1.8.1-dev'; + exports.Syntax = Syntax; + exports.traverse = traverse; + exports.replace = replace; + exports.attachComments = attachComments; + exports.VisitorKeys = VisitorKeys; + exports.VisitorOption = VisitorOption; + exports.Controller = Controller; +})); +/* vim: set sw=4 ts=4 et tw=80 : */ + +},{}],129:[function(require,module,exports){ +(function (process){ +module.exports = minimatch +minimatch.Minimatch = Minimatch + +var isWindows = false +if (typeof process !== 'undefined' && process.platform === 'win32') + isWindows = true + +var GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {} + , expand = require("brace-expansion") + + // any single thing other than / + // don't need to escape / when using new RegExp() + , qmark = "[^/]" + + // * => any number of characters + , star = qmark + "*?" + + // ** when dots are allowed. Anything goes, except .. and . + // not (^ or / followed by one or two dots followed by $ or /), + // followed by anything, any number of times. + , twoStarDot = "(?:(?!(?:\\\/|^)(?:\\.{1,2})($|\\\/)).)*?" + + // not a ^ or / followed by a dot, + // followed by anything, any number of times. + , twoStarNoDot = "(?:(?!(?:\\\/|^)\\.).)*?" + + // characters that need to be escaped in RegExp. + , reSpecials = charSet("().*{}+?[]^$\\!") + +// "abc" -> { a:true, b:true, c:true } +function charSet (s) { + return s.split("").reduce(function (set, c) { + set[c] = true + return set + }, {}) +} + +// normalizes slashes. +var slashSplit = /\/+/ + +minimatch.filter = filter +function filter (pattern, options) { + options = options || {} + return function (p, i, list) { + return minimatch(p, pattern, options) + } +} + +function ext (a, b) { + a = a || {} + b = b || {} + var t = {} + Object.keys(b).forEach(function (k) { + t[k] = b[k] + }) + Object.keys(a).forEach(function (k) { + t[k] = a[k] + }) + return t +} + +minimatch.defaults = function (def) { + if (!def || !Object.keys(def).length) return minimatch + + var orig = minimatch + + var m = function minimatch (p, pattern, options) { + return orig.minimatch(p, pattern, ext(def, options)) + } + + m.Minimatch = function Minimatch (pattern, options) { + return new orig.Minimatch(pattern, ext(def, options)) + } + + return m +} + +Minimatch.defaults = function (def) { + if (!def || !Object.keys(def).length) return Minimatch + return minimatch.defaults(def).Minimatch +} + + +function minimatch (p, pattern, options) { + if (typeof pattern !== "string") { + throw new TypeError("glob pattern string required") + } + + if (!options) options = {} + + // shortcut: comments match nothing. + if (!options.nocomment && pattern.charAt(0) === "#") { + return false + } + + // "" only matches "" + if (pattern.trim() === "") return p === "" + + return new Minimatch(pattern, options).match(p) +} + +function Minimatch (pattern, options) { + if (!(this instanceof Minimatch)) { + return new Minimatch(pattern, options) + } + + if (typeof pattern !== "string") { + throw new TypeError("glob pattern string required") + } + + if (!options) options = {} + pattern = pattern.trim() + + // windows support: need to use /, not \ + if (isWindows) + pattern = pattern.split("\\").join("/") + + this.options = options + this.set = [] + this.pattern = pattern + this.regexp = null + this.negate = false + this.comment = false + this.empty = false + + // make the set of regexps etc. + this.make() +} + +Minimatch.prototype.debug = function() {} + +Minimatch.prototype.make = make +function make () { + // don't do it more than once. + if (this._made) return + + var pattern = this.pattern + var options = this.options + + // empty patterns and comments match nothing. + if (!options.nocomment && pattern.charAt(0) === "#") { + this.comment = true + return + } + if (!pattern) { + this.empty = true + return + } + + // step 1: figure out negation, etc. + this.parseNegate() + + // step 2: expand braces + var set = this.globSet = this.braceExpand() + + if (options.debug) this.debug = console.error + + this.debug(this.pattern, set) + + // step 3: now we have a set, so turn each one into a series of path-portion + // matching patterns. + // These will be regexps, except in the case of "**", which is + // set to the GLOBSTAR object for globstar behavior, + // and will not contain any / characters + set = this.globParts = set.map(function (s) { + return s.split(slashSplit) + }) + + this.debug(this.pattern, set) + + // glob --> regexps + set = set.map(function (s, si, set) { + return s.map(this.parse, this) + }, this) + + this.debug(this.pattern, set) + + // filter out everything that didn't compile properly. + set = set.filter(function (s) { + return -1 === s.indexOf(false) + }) + + this.debug(this.pattern, set) + + this.set = set +} + +Minimatch.prototype.parseNegate = parseNegate +function parseNegate () { + var pattern = this.pattern + , negate = false + , options = this.options + , negateOffset = 0 + + if (options.nonegate) return + + for ( var i = 0, l = pattern.length + ; i < l && pattern.charAt(i) === "!" + ; i ++) { + negate = !negate + negateOffset ++ + } + + if (negateOffset) this.pattern = pattern.substr(negateOffset) + this.negate = negate +} + +// Brace expansion: +// a{b,c}d -> abd acd +// a{b,}c -> abc ac +// a{0..3}d -> a0d a1d a2d a3d +// a{b,c{d,e}f}g -> abg acdfg acefg +// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg +// +// Invalid sets are not expanded. +// a{2..}b -> a{2..}b +// a{b}c -> a{b}c +minimatch.braceExpand = function (pattern, options) { + return braceExpand(pattern, options) +} + +Minimatch.prototype.braceExpand = braceExpand + +function braceExpand (pattern, options) { + if (!options) { + if (this instanceof Minimatch) + options = this.options + else + options = {} + } + + pattern = typeof pattern === "undefined" + ? this.pattern : pattern + + if (typeof pattern === "undefined") { + throw new Error("undefined pattern") + } + + if (options.nobrace || + !pattern.match(/\{.*\}/)) { + // shortcut. no need to expand. + return [pattern] + } + + return expand(pattern) +} + +// parse a component of the expanded set. +// At this point, no pattern may contain "/" in it +// so we're going to return a 2d array, where each entry is the full +// pattern, split on '/', and then turned into a regular expression. +// A regexp is made at the end which joins each array with an +// escaped /, and another full one which joins each regexp with |. +// +// Following the lead of Bash 4.1, note that "**" only has special meaning +// when it is the *only* thing in a path portion. Otherwise, any series +// of * is equivalent to a single *. Globstar behavior is enabled by +// default, and can be disabled by setting options.noglobstar. +Minimatch.prototype.parse = parse +var SUBPARSE = {} +function parse (pattern, isSub) { + var options = this.options + + // shortcuts + if (!options.noglobstar && pattern === "**") return GLOBSTAR + if (pattern === "") return "" + + var re = "" + , hasMagic = !!options.nocase + , escaping = false + // ? => one single character + , patternListStack = [] + , plType + , stateChar + , inClass = false + , reClassStart = -1 + , classStart = -1 + // . and .. never match anything that doesn't start with ., + // even when options.dot is set. + , patternStart = pattern.charAt(0) === "." ? "" // anything + // not (start or / followed by . or .. followed by / or end) + : options.dot ? "(?!(?:^|\\\/)\\.{1,2}(?:$|\\\/))" + : "(?!\\.)" + , self = this + + function clearStateChar () { + if (stateChar) { + // we had some state-tracking character + // that wasn't consumed by this pass. + switch (stateChar) { + case "*": + re += star + hasMagic = true + break + case "?": + re += qmark + hasMagic = true + break + default: + re += "\\"+stateChar + break + } + self.debug('clearStateChar %j %j', stateChar, re) + stateChar = false + } + } + + for ( var i = 0, len = pattern.length, c + ; (i < len) && (c = pattern.charAt(i)) + ; i ++ ) { + + this.debug("%s\t%s %s %j", pattern, i, re, c) + + // skip over any that are escaped. + if (escaping && reSpecials[c]) { + re += "\\" + c + escaping = false + continue + } + + SWITCH: switch (c) { + case "/": + // completely not allowed, even escaped. + // Should already be path-split by now. + return false + + case "\\": + clearStateChar() + escaping = true + continue + + // the various stateChar values + // for the "extglob" stuff. + case "?": + case "*": + case "+": + case "@": + case "!": + this.debug("%s\t%s %s %j <-- stateChar", pattern, i, re, c) + + // all of those are literals inside a class, except that + // the glob [!a] means [^a] in regexp + if (inClass) { + this.debug(' in class') + if (c === "!" && i === classStart + 1) c = "^" + re += c + continue + } + + // if we already have a stateChar, then it means + // that there was something like ** or +? in there. + // Handle the stateChar, then proceed with this one. + self.debug('call clearStateChar %j', stateChar) + clearStateChar() + stateChar = c + // if extglob is disabled, then +(asdf|foo) isn't a thing. + // just clear the statechar *now*, rather than even diving into + // the patternList stuff. + if (options.noext) clearStateChar() + continue + + case "(": + if (inClass) { + re += "(" + continue + } + + if (!stateChar) { + re += "\\(" + continue + } + + plType = stateChar + patternListStack.push({ type: plType + , start: i - 1 + , reStart: re.length }) + // negation is (?:(?!js)[^/]*) + re += stateChar === "!" ? "(?:(?!" : "(?:" + this.debug('plType %j %j', stateChar, re) + stateChar = false + continue + + case ")": + if (inClass || !patternListStack.length) { + re += "\\)" + continue + } + + clearStateChar() + hasMagic = true + re += ")" + plType = patternListStack.pop().type + // negation is (?:(?!js)[^/]*) + // The others are (?:) + switch (plType) { + case "!": + re += "[^/]*?)" + break + case "?": + case "+": + case "*": re += plType + case "@": break // the default anyway + } + continue + + case "|": + if (inClass || !patternListStack.length || escaping) { + re += "\\|" + escaping = false + continue + } + + clearStateChar() + re += "|" + continue + + // these are mostly the same in regexp and glob + case "[": + // swallow any state-tracking char before the [ + clearStateChar() + + if (inClass) { + re += "\\" + c + continue + } + + inClass = true + classStart = i + reClassStart = re.length + re += c + continue + + case "]": + // a right bracket shall lose its special + // meaning and represent itself in + // a bracket expression if it occurs + // first in the list. -- POSIX.2 2.8.3.2 + if (i === classStart + 1 || !inClass) { + re += "\\" + c + escaping = false + continue + } + + // finish up the class. + hasMagic = true + inClass = false + re += c + continue + + default: + // swallow any state char that wasn't consumed + clearStateChar() + + if (escaping) { + // no need + escaping = false + } else if (reSpecials[c] + && !(c === "^" && inClass)) { + re += "\\" + } + + re += c + + } // switch + } // for + + + // handle the case where we left a class open. + // "[abc" is valid, equivalent to "\[abc" + if (inClass) { + // split where the last [ was, and escape it + // this is a huge pita. We now have to re-walk + // the contents of the would-be class to re-translate + // any characters that were passed through as-is + var cs = pattern.substr(classStart + 1) + , sp = this.parse(cs, SUBPARSE) + re = re.substr(0, reClassStart) + "\\[" + sp[0] + hasMagic = hasMagic || sp[1] + } + + // handle the case where we had a +( thing at the *end* + // of the pattern. + // each pattern list stack adds 3 chars, and we need to go through + // and escape any | chars that were passed through as-is for the regexp. + // Go through and escape them, taking care not to double-escape any + // | chars that were already escaped. + var pl + while (pl = patternListStack.pop()) { + var tail = re.slice(pl.reStart + 3) + // maybe some even number of \, then maybe 1 \, followed by a | + tail = tail.replace(/((?:\\{2})*)(\\?)\|/g, function (_, $1, $2) { + if (!$2) { + // the | isn't already escaped, so escape it. + $2 = "\\" + } + + // need to escape all those slashes *again*, without escaping the + // one that we need for escaping the | character. As it works out, + // escaping an even number of slashes can be done by simply repeating + // it exactly after itself. That's why this trick works. + // + // I am sorry that you have to see this. + return $1 + $1 + $2 + "|" + }) + + this.debug("tail=%j\n %s", tail, tail) + var t = pl.type === "*" ? star + : pl.type === "?" ? qmark + : "\\" + pl.type + + hasMagic = true + re = re.slice(0, pl.reStart) + + t + "\\(" + + tail + } + + // handle trailing things that only matter at the very end. + clearStateChar() + if (escaping) { + // trailing \\ + re += "\\\\" + } + + // only need to apply the nodot start if the re starts with + // something that could conceivably capture a dot + var addPatternStart = false + switch (re.charAt(0)) { + case ".": + case "[": + case "(": addPatternStart = true + } + + // if the re is not "" at this point, then we need to make sure + // it doesn't match against an empty path part. + // Otherwise a/* will match a/, which it should not. + if (re !== "" && hasMagic) re = "(?=.)" + re + + if (addPatternStart) re = patternStart + re + + // parsing just a piece of a larger pattern. + if (isSub === SUBPARSE) { + return [ re, hasMagic ] + } + + // skip the regexp for non-magical patterns + // unescape anything in it, though, so that it'll be + // an exact match against a file etc. + if (!hasMagic) { + return globUnescape(pattern) + } + + var flags = options.nocase ? "i" : "" + , regExp = new RegExp("^" + re + "$", flags) + + regExp._glob = pattern + regExp._src = re + + return regExp +} + +minimatch.makeRe = function (pattern, options) { + return new Minimatch(pattern, options || {}).makeRe() +} + +Minimatch.prototype.makeRe = makeRe +function makeRe () { + if (this.regexp || this.regexp === false) return this.regexp + + // at this point, this.set is a 2d array of partial + // pattern strings, or "**". + // + // It's better to use .match(). This function shouldn't + // be used, really, but it's pretty convenient sometimes, + // when you just want to work with a regex. + var set = this.set + + if (!set.length) return this.regexp = false + var options = this.options + + var twoStar = options.noglobstar ? star + : options.dot ? twoStarDot + : twoStarNoDot + , flags = options.nocase ? "i" : "" + + var re = set.map(function (pattern) { + return pattern.map(function (p) { + return (p === GLOBSTAR) ? twoStar + : (typeof p === "string") ? regExpEscape(p) + : p._src + }).join("\\\/") + }).join("|") + + // must match entire pattern + // ending in a * or ** will make it less strict. + re = "^(?:" + re + ")$" + + // can match anything, as long as it's not this. + if (this.negate) re = "^(?!" + re + ").*$" + + try { + return this.regexp = new RegExp(re, flags) + } catch (ex) { + return this.regexp = false + } +} + +minimatch.match = function (list, pattern, options) { + options = options || {} + var mm = new Minimatch(pattern, options) + list = list.filter(function (f) { + return mm.match(f) + }) + if (mm.options.nonull && !list.length) { + list.push(pattern) + } + return list +} + +Minimatch.prototype.match = match +function match (f, partial) { + this.debug("match", f, this.pattern) + // short-circuit in the case of busted things. + // comments, etc. + if (this.comment) return false + if (this.empty) return f === "" + + if (f === "/" && partial) return true + + var options = this.options + + // windows: need to use /, not \ + if (isWindows) + f = f.split("\\").join("/") + + // treat the test path as a set of pathparts. + f = f.split(slashSplit) + this.debug(this.pattern, "split", f) + + // just ONE of the pattern sets in this.set needs to match + // in order for it to be valid. If negating, then just one + // match means that we have failed. + // Either way, return on the first hit. + + var set = this.set + this.debug(this.pattern, "set", set) + + // Find the basename of the path by looking for the last non-empty segment + var filename; + for (var i = f.length - 1; i >= 0; i--) { + filename = f[i] + if (filename) break + } + + for (var i = 0, l = set.length; i < l; i ++) { + var pattern = set[i], file = f + if (options.matchBase && pattern.length === 1) { + file = [filename] + } + var hit = this.matchOne(file, pattern, partial) + if (hit) { + if (options.flipNegate) return true + return !this.negate + } + } + + // didn't get any hits. this is success if it's a negative + // pattern, failure otherwise. + if (options.flipNegate) return false + return this.negate +} + +// set partial to true to test if, for example, +// "/a/b" matches the start of "/*/b/*/d" +// Partial means, if you run out of file before you run +// out of pattern, then that's fine, as long as all +// the parts match. +Minimatch.prototype.matchOne = function (file, pattern, partial) { + var options = this.options + + this.debug("matchOne", + { "this": this + , file: file + , pattern: pattern }) + + this.debug("matchOne", file.length, pattern.length) + + for ( var fi = 0 + , pi = 0 + , fl = file.length + , pl = pattern.length + ; (fi < fl) && (pi < pl) + ; fi ++, pi ++ ) { + + this.debug("matchOne loop") + var p = pattern[pi] + , f = file[fi] + + this.debug(pattern, p, f) + + // should be impossible. + // some invalid regexp stuff in the set. + if (p === false) return false + + if (p === GLOBSTAR) { + this.debug('GLOBSTAR', [pattern, p, f]) + + // "**" + // a/**/b/**/c would match the following: + // a/b/x/y/z/c + // a/x/y/z/b/c + // a/b/x/b/x/c + // a/b/c + // To do this, take the rest of the pattern after + // the **, and see if it would match the file remainder. + // If so, return success. + // If not, the ** "swallows" a segment, and try again. + // This is recursively awful. + // + // a/**/b/**/c matching a/b/x/y/z/c + // - a matches a + // - doublestar + // - matchOne(b/x/y/z/c, b/**/c) + // - b matches b + // - doublestar + // - matchOne(x/y/z/c, c) -> no + // - matchOne(y/z/c, c) -> no + // - matchOne(z/c, c) -> no + // - matchOne(c, c) yes, hit + var fr = fi + , pr = pi + 1 + if (pr === pl) { + this.debug('** at the end') + // a ** at the end will just swallow the rest. + // We have found a match. + // however, it will not swallow /.x, unless + // options.dot is set. + // . and .. are *never* matched by **, for explosively + // exponential reasons. + for ( ; fi < fl; fi ++) { + if (file[fi] === "." || file[fi] === ".." || + (!options.dot && file[fi].charAt(0) === ".")) return false + } + return true + } + + // ok, let's see if we can swallow whatever we can. + WHILE: while (fr < fl) { + var swallowee = file[fr] + + this.debug('\nglobstar while', + file, fr, pattern, pr, swallowee) + + // XXX remove this slice. Just pass the start index. + if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) { + this.debug('globstar found match!', fr, fl, swallowee) + // found a match. + return true + } else { + // can't swallow "." or ".." ever. + // can only swallow ".foo" when explicitly asked. + if (swallowee === "." || swallowee === ".." || + (!options.dot && swallowee.charAt(0) === ".")) { + this.debug("dot detected!", file, fr, pattern, pr) + break WHILE + } + + // ** swallows a segment, and continue. + this.debug('globstar swallow a segment, and continue') + fr ++ + } + } + // no match was found. + // However, in partial mode, we can't say this is necessarily over. + // If there's more *pattern* left, then + if (partial) { + // ran out of file + this.debug("\n>>> no match, partial?", file, fr, pattern, pr) + if (fr === fl) return true + } + return false + } + + // something other than ** + // non-magic patterns just have to match exactly + // patterns with magic have been turned into regexps. + var hit + if (typeof p === "string") { + if (options.nocase) { + hit = f.toLowerCase() === p.toLowerCase() + } else { + hit = f === p + } + this.debug("string match", p, f, hit) + } else { + hit = f.match(p) + this.debug("pattern match", p, f, hit) + } + + if (!hit) return false + } + + // Note: ending in / means that we'll get a final "" + // at the end of the pattern. This can only match a + // corresponding "" at the end of the file. + // If the file ends in /, then it can only match a + // a pattern that ends in /, unless the pattern just + // doesn't have any more for it. But, a/b/ should *not* + // match "a/b/*", even though "" matches against the + // [^/]*? pattern, except in partial mode, where it might + // simply not be reached yet. + // However, a/b/ should still satisfy a/* + + // now either we fell off the end of the pattern, or we're done. + if (fi === fl && pi === pl) { + // ran out of pattern and filename at the same time. + // an exact hit! + return true + } else if (fi === fl) { + // ran out of file, but still had pattern left. + // this is ok if we're doing the match as part of + // a glob fs traversal. + return partial + } else if (pi === pl) { + // ran out of pattern, still have file left. + // this is only acceptable if we're on the very last + // empty segment of a file with a trailing slash. + // a/* should match a/b/ + var emptyFileEnd = (fi === fl - 1) && (file[fi] === "") + return emptyFileEnd + } + + // should be unreachable. + throw new Error("wtf?") +} + + +// replace stuff like \* with * +function globUnescape (s) { + return s.replace(/\\(.)/g, "$1") +} + + +function regExpEscape (s) { + return s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&") +} + +}).call(this,require('_process')) +},{"_process":112,"brace-expansion":130}],130:[function(require,module,exports){ +var concatMap = require('concat-map'); +var balanced = require('balanced-match'); + +module.exports = expandTop; + +var escSlash = '\0SLASH'+Math.random()+'\0'; +var escOpen = '\0OPEN'+Math.random()+'\0'; +var escClose = '\0CLOSE'+Math.random()+'\0'; +var escComma = '\0COMMA'+Math.random()+'\0'; +var escPeriod = '\0PERIOD'+Math.random()+'\0'; + +function numeric(str) { + return parseInt(str, 10) == str + ? parseInt(str, 10) + : str.charCodeAt(0); +} + +function escapeBraces(str) { + return str.split('\\\\').join(escSlash) + .split('\\{').join(escOpen) + .split('\\}').join(escClose) + .split('\\,').join(escComma) + .split('\\.').join(escPeriod); +} + +function unescapeBraces(str) { + return str.split(escSlash).join('\\') + .split(escOpen).join('{') + .split(escClose).join('}') + .split(escComma).join(',') + .split(escPeriod).join('.'); +} + + +// Basically just str.split(","), but handling cases +// where we have nested braced sections, which should be +// treated as individual members, like {a,{b,c},d} +function parseCommaParts(str) { + if (!str) + return ['']; + + var parts = []; + var m = balanced('{', '}', str); + + if (!m) + return str.split(','); + + var pre = m.pre; + var body = m.body; + var post = m.post; + var p = pre.split(','); + + p[p.length-1] += '{' + body + '}'; + var postParts = parseCommaParts(post); + if (post.length) { + p[p.length-1] += postParts.shift(); + p.push.apply(p, postParts); + } + + parts.push.apply(parts, p); + + return parts; +} + +function expandTop(str) { + if (!str) + return []; + + return expand(escapeBraces(str), true).map(unescapeBraces); +} + +function identity(e) { + return e; +} + +function embrace(str) { + return '{' + str + '}'; +} +function isPadded(el) { + return /^-?0\d/.test(el); +} + +function lte(i, y) { + return i <= y; +} +function gte(i, y) { + return i >= y; +} + +function expand(str, isTop) { + var expansions = []; + + var m = balanced('{', '}', str); + if (!m || /\$$/.test(m.pre)) return [str]; + + var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body); + var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body); + var isSequence = isNumericSequence || isAlphaSequence; + var isOptions = /^(.*,)+(.+)?$/.test(m.body); + if (!isSequence && !isOptions) { + // {a},b} + if (m.post.match(/,.*}/)) { + str = m.pre + '{' + m.body + escClose + m.post; + return expand(str); + } + return [str]; + } + + var n; + if (isSequence) { + n = m.body.split(/\.\./); + } else { + n = parseCommaParts(m.body); + if (n.length === 1) { + // x{{a,b}}y ==> x{a}y x{b}y + n = expand(n[0], false).map(embrace); + if (n.length === 1) { + var post = m.post.length + ? expand(m.post, false) + : ['']; + return post.map(function(p) { + return m.pre + n[0] + p; + }); + } + } + } + + // at this point, n is the parts, and we know it's not a comma set + // with a single entry. + + // no need to expand pre, since it is guaranteed to be free of brace-sets + var pre = m.pre; + var post = m.post.length + ? expand(m.post, false) + : ['']; + + var N; + + if (isSequence) { + var x = numeric(n[0]); + var y = numeric(n[1]); + var width = Math.max(n[0].length, n[1].length) + var incr = n.length == 3 + ? Math.abs(numeric(n[2])) + : 1; + var test = lte; + var reverse = y < x; + if (reverse) { + incr *= -1; + test = gte; + } + var pad = n.some(isPadded); + + N = []; + + for (var i = x; test(i, y); i += incr) { + var c; + if (isAlphaSequence) { + c = String.fromCharCode(i); + if (c === '\\') + c = ''; + } else { + c = String(i); + if (pad) { + var need = width - c.length; + if (need > 0) { + var z = new Array(need + 1).join('0'); + if (i < 0) + c = '-' + z + c.slice(1); + else + c = z + c; + } + } + } + N.push(c); + } + } else { + N = concatMap(n, function(el) { return expand(el, false) }); + } + + for (var j = 0; j < N.length; j++) { + for (var k = 0; k < post.length; k++) { + var expansion = pre + N[j] + post[k]; + if (!isTop || isSequence || expansion) + expansions.push(expansion); + } + } + + return expansions; +} + + +},{"balanced-match":131,"concat-map":132}],131:[function(require,module,exports){ +module.exports = balanced; +function balanced(a, b, str) { + var bal = 0; + var m = {}; + var ended = false; + + for (var i = 0; i < str.length; i++) { + if (a == str.substr(i, a.length)) { + if (!('start' in m)) m.start = i; + bal++; + } + else if (b == str.substr(i, b.length) && 'start' in m) { + ended = true; + bal--; + if (!bal) { + m.end = i; + m.pre = str.substr(0, m.start); + m.body = (m.end - m.start > 1) + ? str.substring(m.start + a.length, m.end) + : ''; + m.post = str.slice(m.end + b.length); + return m; + } + } + } + + // if we opened more than we closed, find the one we closed + if (bal && ended) { + var start = m.start + a.length; + m = balanced(a, b, str.substr(start)); + if (m) { + m.start += start; + m.end += start; + m.pre = str.slice(0, start) + m.pre; + } + return m; + } +} + +},{}],132:[function(require,module,exports){ +module.exports = function (xs, fn) { + var res = []; + for (var i = 0; i < xs.length; i++) { + var x = fn(xs[i], i); + if (isArray(x)) res.push.apply(res, x); + else res.push(x); + } + return res; +}; + +var isArray = Array.isArray || function (xs) { + return Object.prototype.toString.call(xs) === '[object Array]'; +}; + +},{}],133:[function(require,module,exports){ +(function (global){ +/*! https://mths.be/regenerate v1.0.1 by @mathias | MIT license */ +;(function(root) { + + // Detect free variables `exports`. + var freeExports = typeof exports == 'object' && exports; + + // Detect free variable `module`. + var freeModule = typeof module == 'object' && module && + module.exports == freeExports && module; + + // Detect free variable `global`, from Node.js or Browserified code, + // and use it as `root`. + var freeGlobal = typeof global == 'object' && global; + if (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal) { + root = freeGlobal; + } + + /*--------------------------------------------------------------------------*/ + + var ERRORS = { + 'rangeOrder': 'A range\u2019s `stop` value must be greater than or equal ' + + 'to the `start` value.', + 'codePointRange': 'Invalid code point value. Code points range from ' + + 'U+000000 to U+10FFFF.' + }; + + // https://mathiasbynens.be/notes/javascript-encoding#surrogate-pairs + var HIGH_SURROGATE_MIN = 0xD800; + var HIGH_SURROGATE_MAX = 0xDBFF; + var LOW_SURROGATE_MIN = 0xDC00; + var LOW_SURROGATE_MAX = 0xDFFF; + + // In Regenerate output, `\0` will never be preceded by `\` because we sort + // by code point value, so let’s keep this regular expression simple. + var regexNull = /\\x00([^0123456789]|$)/g; + + var object = {}; + var hasOwnProperty = object.hasOwnProperty; + var extend = function(destination, source) { + var key; + for (key in source) { + if (hasOwnProperty.call(source, key)) { + destination[key] = source[key]; + } + } + return destination; + }; + + var forEach = function(array, callback) { + var index = -1; + var length = array.length; + while (++index < length) { + callback(array[index], index); + } + }; + + var toString = object.toString; + var isArray = function(value) { + return toString.call(value) == '[object Array]'; + }; + var isNumber = function(value) { + return typeof value == 'number' || + toString.call(value) == '[object Number]'; + }; + + // This assumes that `number` is a positive integer that `toString()`s nicely + // (which is the case for all code point values). + var zeroes = '0000'; + var pad = function(number, totalCharacters) { + var string = String(number); + return string.length < totalCharacters + ? (zeroes + string).slice(-totalCharacters) + : string; + }; + + var hex = function(number) { + return Number(number).toString(16).toUpperCase(); + }; + + var slice = [].slice; + + /*--------------------------------------------------------------------------*/ + + var dataFromCodePoints = function(codePoints) { + var index = -1; + var length = codePoints.length; + var max = length - 1; + var result = []; + var isStart = true; + var tmp; + var previous = 0; + while (++index < length) { + tmp = codePoints[index]; + if (isStart) { + result.push(tmp); + previous = tmp; + isStart = false; + } else { + if (tmp == previous + 1) { + if (index != max) { + previous = tmp; + continue; + } else { + isStart = true; + result.push(tmp + 1); + } + } else { + // End the previous range and start a new one. + result.push(previous + 1, tmp); + previous = tmp; + } + } + } + if (!isStart) { + result.push(tmp + 1); + } + return result; + }; + + var dataRemove = function(data, codePoint) { + // Iterate over the data per `(start, end)` pair. + var index = 0; + var start; + var end; + var length = data.length; + while (index < length) { + start = data[index]; + end = data[index + 1]; + if (codePoint >= start && codePoint < end) { + // Modify this pair. + if (codePoint == start) { + if (end == start + 1) { + // Just remove `start` and `end`. + data.splice(index, 2); + return data; + } else { + // Just replace `start` with a new value. + data[index] = codePoint + 1; + return data; + } + } else if (codePoint == end - 1) { + // Just replace `end` with a new value. + data[index + 1] = codePoint; + return data; + } else { + // Replace `[start, end]` with `[startA, endA, startB, endB]`. + data.splice(index, 2, start, codePoint, codePoint + 1, end); + return data; + } + } + index += 2; + } + return data; + }; + + var dataRemoveRange = function(data, rangeStart, rangeEnd) { + if (rangeEnd < rangeStart) { + throw Error(ERRORS.rangeOrder); + } + // Iterate over the data per `(start, end)` pair. + var index = 0; + var start; + var end; + while (index < data.length) { + start = data[index]; + end = data[index + 1] - 1; // Note: the `- 1` makes `end` inclusive. + + // Exit as soon as no more matching pairs can be found. + if (start > rangeEnd) { + return data; + } + + // Check if this range pair is equal to, or forms a subset of, the range + // to be removed. + // E.g. we have `[0, 11, 40, 51]` and want to remove 0-10 → `[40, 51]`. + // E.g. we have `[40, 51]` and want to remove 0-100 → `[]`. + if (rangeStart <= start && rangeEnd >= end) { + // Remove this pair. + data.splice(index, 2); + continue; + } + + // Check if both `rangeStart` and `rangeEnd` are within the bounds of + // this pair. + // E.g. we have `[0, 11]` and want to remove 4-6 → `[0, 4, 7, 11]`. + if (rangeStart >= start && rangeEnd < end) { + if (rangeStart == start) { + // Replace `[start, end]` with `[startB, endB]`. + data[index] = rangeEnd + 1; + data[index + 1] = end + 1; + return data; + } + // Replace `[start, end]` with `[startA, endA, startB, endB]`. + data.splice(index, 2, start, rangeStart, rangeEnd + 1, end + 1); + return data; + } + + // Check if only `rangeStart` is within the bounds of this pair. + // E.g. we have `[0, 11]` and want to remove 4-20 → `[0, 4]`. + if (rangeStart >= start && rangeStart <= end) { + // Replace `end` with `rangeStart`. + data[index + 1] = rangeStart; + // Note: we cannot `return` just yet, in case any following pairs still + // contain matching code points. + // E.g. we have `[0, 11, 14, 31]` and want to remove 4-20 + // → `[0, 4, 21, 31]`. + } + + // Check if only `rangeEnd` is within the bounds of this pair. + // E.g. we have `[14, 31]` and want to remove 4-20 → `[21, 31]`. + else if (rangeEnd >= start && rangeEnd <= end) { + // Just replace `start`. + data[index] = rangeEnd + 1; + return data; + } + + index += 2; + } + return data; + }; + + var dataAdd = function(data, codePoint) { + // Iterate over the data per `(start, end)` pair. + var index = 0; + var start; + var end; + var lastIndex = null; + var length = data.length; + if (codePoint < 0x0 || codePoint > 0x10FFFF) { + throw RangeError(ERRORS.codePointRange); + } + while (index < length) { + start = data[index]; + end = data[index + 1]; + + // Check if the code point is already in the set. + if (codePoint >= start && codePoint < end) { + return data; + } + + if (codePoint == start - 1) { + // Just replace `start` with a new value. + data[index] = codePoint; + return data; + } + + // At this point, if `start` is `greater` than `codePoint`, insert a new + // `[start, end]` pair before the current pair, or after the current pair + // if there is a known `lastIndex`. + if (start > codePoint) { + data.splice( + lastIndex != null ? lastIndex + 2 : 0, + 0, + codePoint, + codePoint + 1 + ); + return data; + } + + if (codePoint == end) { + // Check if adding this code point causes two separate ranges to become + // a single range, e.g. `dataAdd([0, 4, 5, 10], 4)` → `[0, 10]`. + if (codePoint + 1 == data[index + 2]) { + data.splice(index, 4, start, data[index + 3]); + return data; + } + // Else, just replace `end` with a new value. + data[index + 1] = codePoint + 1; + return data; + } + lastIndex = index; + index += 2; + } + // The loop has finished; add the new pair to the end of the data set. + data.push(codePoint, codePoint + 1); + return data; + }; + + var dataAddData = function(dataA, dataB) { + // Iterate over the data per `(start, end)` pair. + var index = 0; + var start; + var end; + var data = dataA.slice(); + var length = dataB.length; + while (index < length) { + start = dataB[index]; + end = dataB[index + 1] - 1; + if (start == end) { + data = dataAdd(data, start); + } else { + data = dataAddRange(data, start, end); + } + index += 2; + } + return data; + }; + + var dataRemoveData = function(dataA, dataB) { + // Iterate over the data per `(start, end)` pair. + var index = 0; + var start; + var end; + var data = dataA.slice(); + var length = dataB.length; + while (index < length) { + start = dataB[index]; + end = dataB[index + 1] - 1; + if (start == end) { + data = dataRemove(data, start); + } else { + data = dataRemoveRange(data, start, end); + } + index += 2; + } + return data; + }; + + var dataAddRange = function(data, rangeStart, rangeEnd) { + if (rangeEnd < rangeStart) { + throw Error(ERRORS.rangeOrder); + } + if ( + rangeStart < 0x0 || rangeStart > 0x10FFFF || + rangeEnd < 0x0 || rangeEnd > 0x10FFFF + ) { + throw RangeError(ERRORS.codePointRange); + } + // Iterate over the data per `(start, end)` pair. + var index = 0; + var start; + var end; + var added = false; + var length = data.length; + while (index < length) { + start = data[index]; + end = data[index + 1]; + + if (added) { + // The range has already been added to the set; at this point, we just + // need to get rid of the following ranges in case they overlap. + + // Check if this range can be combined with the previous range. + if (start == rangeEnd + 1) { + data.splice(index - 1, 2); + return data; + } + + // Exit as soon as no more possibly overlapping pairs can be found. + if (start > rangeEnd) { + return data; + } + + // E.g. `[0, 11, 12, 16]` and we’ve added 5-15, so we now have + // `[0, 16, 12, 16]`. Remove the `12,16` part, as it lies within the + // `0,16` range that was previously added. + if (start >= rangeStart && start <= rangeEnd) { + // `start` lies within the range that was previously added. + + if (end > rangeStart && end - 1 <= rangeEnd) { + // `end` lies within the range that was previously added as well, + // so remove this pair. + data.splice(index, 2); + index -= 2; + // Note: we cannot `return` just yet, as there may still be other + // overlapping pairs. + } else { + // `start` lies within the range that was previously added, but + // `end` doesn’t. E.g. `[0, 11, 12, 31]` and we’ve added 5-15, so + // now we have `[0, 16, 12, 31]`. This must be written as `[0, 31]`. + // Remove the previously added `end` and the current `start`. + data.splice(index - 1, 2); + index -= 2; + } + + // Note: we cannot return yet. + } + + } + + else if (start == rangeEnd + 1) { + data[index] = rangeStart; + return data; + } + + // Check if a new pair must be inserted *before* the current one. + else if (start > rangeEnd) { + data.splice(index, 0, rangeStart, rangeEnd + 1); + return data; + } + + else if (rangeStart >= start && rangeStart < end && rangeEnd + 1 <= end) { + // The new range lies entirely within an existing range pair. No action + // needed. + return data; + } + + else if ( + // E.g. `[0, 11]` and you add 5-15 → `[0, 16]`. + (rangeStart >= start && rangeStart < end) || + // E.g. `[0, 3]` and you add 3-6 → `[0, 7]`. + end == rangeStart + ) { + // Replace `end` with the new value. + data[index + 1] = rangeEnd + 1; + // Make sure the next range pair doesn’t overlap, e.g. `[0, 11, 12, 14]` + // and you add 5-15 → `[0, 16]`, i.e. remove the `12,14` part. + added = true; + // Note: we cannot `return` just yet. + } + + else if (rangeStart <= start && rangeEnd + 1 >= end) { + // The new range is a superset of the old range. + data[index] = rangeStart; + data[index + 1] = rangeEnd + 1; + added = true; + } + + index += 2; + } + // The loop has finished without doing anything; add the new pair to the end + // of the data set. + if (!added) { + data.push(rangeStart, rangeEnd + 1); + } + return data; + }; + + var dataContains = function(data, codePoint) { + // Iterate over the data per `(start, end)` pair. + var index = 0; + var start; + var end; + var length = data.length; + while (index < length) { + start = data[index]; + end = data[index + 1]; + if (codePoint >= start && codePoint < end) { + return true; + } + index += 2; + } + return false; + }; + + var dataIntersection = function(data, codePoints) { + var index = 0; + var length = codePoints.length; + var codePoint; + var result = []; + while (index < length) { + codePoint = codePoints[index]; + if (dataContains(data, codePoint)) { + result.push(codePoint); + } + ++index; + } + return dataFromCodePoints(result); + }; + + var dataIsEmpty = function(data) { + return !data.length; + }; + + var dataIsSingleton = function(data) { + // Check if the set only represents a single code point. + return data.length == 2 && data[0] + 1 == data[1]; + }; + + var dataToArray = function(data) { + // Iterate over the data per `(start, end)` pair. + var index = 0; + var start; + var end; + var result = []; + var length = data.length; + while (index < length) { + start = data[index]; + end = data[index + 1]; + while (start < end) { + result.push(start); + ++start; + } + index += 2; + } + return result; + }; + + /*--------------------------------------------------------------------------*/ + + // https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae + var floor = Math.floor; + var highSurrogate = function(codePoint) { + return parseInt( + floor((codePoint - 0x10000) / 0x400) + HIGH_SURROGATE_MIN, + 10 + ); + }; + + var lowSurrogate = function(codePoint) { + return parseInt( + (codePoint - 0x10000) % 0x400 + LOW_SURROGATE_MIN, + 10 + ); + }; + + var stringFromCharCode = String.fromCharCode; + var codePointToString = function(codePoint) { + var string; + // https://mathiasbynens.be/notes/javascript-escapes#single + // Note: the `\b` escape sequence for U+0008 BACKSPACE in strings has a + // different meaning in regular expressions (word boundary), so it cannot + // be used here. + if (codePoint == 0x09) { + string = '\\t'; + } + // Note: IE < 9 treats `'\v'` as `'v'`, so avoid using it. + // else if (codePoint == 0x0B) { + // string = '\\v'; + // } + else if (codePoint == 0x0A) { + string = '\\n'; + } + else if (codePoint == 0x0C) { + string = '\\f'; + } + else if (codePoint == 0x0D) { + string = '\\r'; + } + else if (codePoint == 0x5C) { + string = '\\\\'; + } + else if ( + codePoint == 0x24 || + (codePoint >= 0x28 && codePoint <= 0x2B) || + codePoint == 0x2D || codePoint == 0x2E || codePoint == 0x3F || + (codePoint >= 0x5B && codePoint <= 0x5E) || + (codePoint >= 0x7B && codePoint <= 0x7D) + ) { + // The code point maps to an unsafe printable ASCII character; + // backslash-escape it. Here’s the list of those symbols: + // + // $()*+-.?[\]^{|} + // + // See #7 for more info. + string = '\\' + stringFromCharCode(codePoint); + } + else if (codePoint >= 0x20 && codePoint <= 0x7E) { + // The code point maps to one of these printable ASCII symbols + // (including the space character): + // + // !"#%&',/0123456789:;<=>@ABCDEFGHIJKLMNO + // PQRSTUVWXYZ_`abcdefghijklmnopqrstuvwxyz~ + // + // These can safely be used directly. + string = stringFromCharCode(codePoint); + } + else if (codePoint <= 0xFF) { + // https://mathiasbynens.be/notes/javascript-escapes#hexadecimal + string = '\\x' + pad(hex(codePoint), 2); + } + else { // `codePoint <= 0xFFFF` holds true. + // https://mathiasbynens.be/notes/javascript-escapes#unicode + string = '\\u' + pad(hex(codePoint), 4); + } + + // There’s no need to account for astral symbols / surrogate pairs here, + // since `codePointToString` is private and only used for BMP code points. + // But if that’s what you need, just add an `else` block with this code: + // + // string = '\\u' + pad(hex(highSurrogate(codePoint)), 4) + // + '\\u' + pad(hex(lowSurrogate(codePoint)), 4); + + return string; + }; + + var symbolToCodePoint = function(symbol) { + var length = symbol.length; + var first = symbol.charCodeAt(0); + var second; + if ( + first >= HIGH_SURROGATE_MIN && first <= HIGH_SURROGATE_MAX && + length > 1 // There is a next code unit. + ) { + // `first` is a high surrogate, and there is a next character. Assume + // it’s a low surrogate (else it’s invalid usage of Regenerate anyway). + second = symbol.charCodeAt(1); + // https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae + return (first - HIGH_SURROGATE_MIN) * 0x400 + + second - LOW_SURROGATE_MIN + 0x10000; + } + return first; + }; + + var createBMPCharacterClasses = function(data) { + // Iterate over the data per `(start, end)` pair. + var result = ''; + var index = 0; + var start; + var end; + var length = data.length; + if (dataIsSingleton(data)) { + return codePointToString(data[0]); + } + while (index < length) { + start = data[index]; + end = data[index + 1] - 1; // Note: the `- 1` makes `end` inclusive. + if (start == end) { + result += codePointToString(start); + } else if (start + 1 == end) { + result += codePointToString(start) + codePointToString(end); + } else { + result += codePointToString(start) + '-' + codePointToString(end); + } + index += 2; + } + return '[' + result + ']'; + }; + + var splitAtBMP = function(data) { + // Iterate over the data per `(start, end)` pair. + var loneHighSurrogates = []; + var bmp = []; + var astral = []; + var index = 0; + var start; + var end; + var length = data.length; + while (index < length) { + start = data[index]; + end = data[index + 1] - 1; // Note: the `- 1` makes `end` inclusive. + if (start <= 0xFFFF && end <= 0xFFFF) { + // Both `start` and `end` are within the BMP range. + if (start >= HIGH_SURROGATE_MIN && start <= HIGH_SURROGATE_MAX) { + // `start` lies in the high surrogates range. + if (end <= HIGH_SURROGATE_MAX) { + loneHighSurrogates.push(start, end + 1); + } else { + loneHighSurrogates.push(start, HIGH_SURROGATE_MAX + 1); + bmp.push(HIGH_SURROGATE_MAX + 1, end + 1); + } + } else if (end >= HIGH_SURROGATE_MIN && end <= HIGH_SURROGATE_MAX) { + bmp.push(start, HIGH_SURROGATE_MIN); + loneHighSurrogates.push(HIGH_SURROGATE_MIN, end + 1); + } else if (start < HIGH_SURROGATE_MIN && end > HIGH_SURROGATE_MAX) { + bmp.push(start, HIGH_SURROGATE_MIN, HIGH_SURROGATE_MAX + 1, end + 1); + loneHighSurrogates.push(HIGH_SURROGATE_MIN, HIGH_SURROGATE_MAX + 1); + } else { + bmp.push(start, end + 1); + } + } + else if (start <= 0xFFFF && end > 0xFFFF) { + // `start` is in the BMP range, but `end` lies within the astral range. + if (start >= HIGH_SURROGATE_MIN && start <= HIGH_SURROGATE_MAX) { + // `start` lies in the high surrogates range. Since `end` is astral, + // we can just add all high surrogates starting from `start` to + // `loneHighSurrogates`, any other BMP code points to `bmp`, and the + // remaining symbols to `astral`. + loneHighSurrogates.push(start, HIGH_SURROGATE_MAX + 1); + bmp.push(HIGH_SURROGATE_MAX + 1, 0xFFFF + 1); + } else if (start < HIGH_SURROGATE_MIN) { + bmp.push(start, HIGH_SURROGATE_MIN, HIGH_SURROGATE_MAX + 1, 0xFFFF + 1); + loneHighSurrogates.push(HIGH_SURROGATE_MIN, HIGH_SURROGATE_MAX + 1); + } else { // `start > HIGH_SURROGATE_MAX` holds true. + bmp.push(start, 0xFFFF + 1); + } + astral.push(0xFFFF + 1, end + 1); + } + else { + // Both `start` and `end` are in the astral range. + astral.push(start, end + 1); + } + index += 2; + } + return { + 'loneHighSurrogates': loneHighSurrogates, + 'bmp': bmp, + 'astral': astral + }; + }; + + var optimizeSurrogateMappings = function(surrogateMappings) { + var result = []; + var tmpLow = []; + var addLow = false; + var mapping; + var nextMapping; + var highSurrogates; + var lowSurrogates; + var nextHighSurrogates; + var nextLowSurrogates; + var index = -1; + var length = surrogateMappings.length; + while (++index < length) { + mapping = surrogateMappings[index]; + nextMapping = surrogateMappings[index + 1]; + if (!nextMapping) { + result.push(mapping); + continue; + } + highSurrogates = mapping[0]; + lowSurrogates = mapping[1]; + nextHighSurrogates = nextMapping[0]; + nextLowSurrogates = nextMapping[1]; + + // Check for identical high surrogate ranges. + tmpLow = lowSurrogates; + while ( + nextHighSurrogates && + highSurrogates[0] == nextHighSurrogates[0] && + highSurrogates[1] == nextHighSurrogates[1] + ) { + // Merge with the next item. + if (dataIsSingleton(nextLowSurrogates)) { + tmpLow = dataAdd(tmpLow, nextLowSurrogates[0]); + } else { + tmpLow = dataAddRange( + tmpLow, + nextLowSurrogates[0], + nextLowSurrogates[1] - 1 + ); + } + ++index; + mapping = surrogateMappings[index]; + highSurrogates = mapping[0]; + lowSurrogates = mapping[1]; + nextMapping = surrogateMappings[index + 1]; + nextHighSurrogates = nextMapping && nextMapping[0]; + nextLowSurrogates = nextMapping && nextMapping[1]; + addLow = true; + } + result.push([ + highSurrogates, + addLow ? tmpLow : lowSurrogates + ]); + addLow = false; + } + return optimizeByLowSurrogates(result); + }; + + var optimizeByLowSurrogates = function(surrogateMappings) { + if (surrogateMappings.length == 1) { + return surrogateMappings; + } + var index = -1; + var innerIndex = -1; + while (++index < surrogateMappings.length) { + var mapping = surrogateMappings[index]; + var lowSurrogates = mapping[1]; + var lowSurrogateStart = lowSurrogates[0]; + var lowSurrogateEnd = lowSurrogates[1]; + innerIndex = index; // Note: the loop starts at the next index. + while (++innerIndex < surrogateMappings.length) { + var otherMapping = surrogateMappings[innerIndex]; + var otherLowSurrogates = otherMapping[1]; + var otherLowSurrogateStart = otherLowSurrogates[0]; + var otherLowSurrogateEnd = otherLowSurrogates[1]; + if ( + lowSurrogateStart == otherLowSurrogateStart && + lowSurrogateEnd == otherLowSurrogateEnd + ) { + // Add the code points in the other item to this one. + if (dataIsSingleton(otherMapping[0])) { + mapping[0] = dataAdd(mapping[0], otherMapping[0][0]); + } else { + mapping[0] = dataAddRange( + mapping[0], + otherMapping[0][0], + otherMapping[0][1] - 1 + ); + } + // Remove the other, now redundant, item. + surrogateMappings.splice(innerIndex, 1); + --innerIndex; + } + } + } + return surrogateMappings; + }; + + var surrogateSet = function(data) { + // Exit early if `data` is an empty set. + if (!data.length) { + return []; + } + + // Iterate over the data per `(start, end)` pair. + var index = 0; + var start; + var end; + var startHigh; + var startLow; + var prevStartHigh = 0; + var prevEndHigh = 0; + var tmpLow = []; + var endHigh; + var endLow; + var surrogateMappings = []; + var length = data.length; + var dataHigh = []; + while (index < length) { + start = data[index]; + end = data[index + 1] - 1; + + startHigh = highSurrogate(start); + startLow = lowSurrogate(start); + endHigh = highSurrogate(end); + endLow = lowSurrogate(end); + + var startsWithLowestLowSurrogate = startLow == LOW_SURROGATE_MIN; + var endsWithHighestLowSurrogate = endLow == LOW_SURROGATE_MAX; + var complete = false; + + // Append the previous high-surrogate-to-low-surrogate mappings. + // Step 1: `(startHigh, startLow)` to `(startHigh, LOW_SURROGATE_MAX)`. + if ( + startHigh == endHigh || + startsWithLowestLowSurrogate && endsWithHighestLowSurrogate + ) { + surrogateMappings.push([ + [startHigh, endHigh + 1], + [startLow, endLow + 1] + ]); + complete = true; + } else { + surrogateMappings.push([ + [startHigh, startHigh + 1], + [startLow, LOW_SURROGATE_MAX + 1] + ]); + } + + // Step 2: `(startHigh + 1, LOW_SURROGATE_MIN)` to + // `(endHigh - 1, LOW_SURROGATE_MAX)`. + if (!complete && startHigh + 1 < endHigh) { + if (endsWithHighestLowSurrogate) { + // Combine step 2 and step 3. + surrogateMappings.push([ + [startHigh + 1, endHigh + 1], + [LOW_SURROGATE_MIN, endLow + 1] + ]); + complete = true; + } else { + surrogateMappings.push([ + [startHigh + 1, endHigh], + [LOW_SURROGATE_MIN, LOW_SURROGATE_MAX + 1] + ]); + } + } + + // Step 3. `(endHigh, LOW_SURROGATE_MIN)` to `(endHigh, endLow)`. + if (!complete) { + surrogateMappings.push([ + [endHigh, endHigh + 1], + [LOW_SURROGATE_MIN, endLow + 1] + ]); + } + + prevStartHigh = startHigh; + prevEndHigh = endHigh; + + index += 2; + } + + // The format of `surrogateMappings` is as follows: + // + // [ surrogateMapping1, surrogateMapping2 ] + // + // i.e.: + // + // [ + // [ highSurrogates1, lowSurrogates1 ], + // [ highSurrogates2, lowSurrogates2 ] + // ] + return optimizeSurrogateMappings(surrogateMappings); + }; + + var createSurrogateCharacterClasses = function(surrogateMappings) { + var result = []; + forEach(surrogateMappings, function(surrogateMapping) { + var highSurrogates = surrogateMapping[0]; + var lowSurrogates = surrogateMapping[1]; + result.push( + createBMPCharacterClasses(highSurrogates) + + createBMPCharacterClasses(lowSurrogates) + ); + }); + return result.join('|'); + }; + + var createCharacterClassesFromData = function(data) { + var result = []; + + var parts = splitAtBMP(data); + var loneHighSurrogates = parts.loneHighSurrogates; + var bmp = parts.bmp; + var astral = parts.astral; + var hasAstral = !dataIsEmpty(parts.astral); + var hasLoneSurrogates = !dataIsEmpty(loneHighSurrogates); + + var surrogateMappings = surrogateSet(astral); + + // If we’re not dealing with any astral symbols, there’s no need to move + // individual code points that are high surrogates to the end of the regex. + if (!hasAstral && hasLoneSurrogates) { + bmp = dataAddData(bmp, loneHighSurrogates); + } + + if (!dataIsEmpty(bmp)) { + // The data set contains BMP code points that are not high surrogates + // needed for astral code points in the set. + result.push(createBMPCharacterClasses(bmp)); + } + if (surrogateMappings.length) { + // The data set contains astral code points; append character classes + // based on their surrogate pairs. + result.push(createSurrogateCharacterClasses(surrogateMappings)); + } + if (hasAstral && hasLoneSurrogates) { + // The data set contains lone high surrogates; append these. Lone high + // surrogates must go at the end of the regex if astral symbols are to be + // matched as well. + result.push(createBMPCharacterClasses(loneHighSurrogates)); + } + return result.join('|'); + }; + + /*--------------------------------------------------------------------------*/ + + // `regenerate` can be used as a constructor (and new methods can be added to + // its prototype) but also as a regular function, the latter of which is the + // documented and most common usage. For that reason, it’s not capitalized. + var regenerate = function(value) { + if (arguments.length > 1) { + value = slice.call(arguments); + } + if (this instanceof regenerate) { + this.data = []; + return value ? this.add(value) : this; + } + return (new regenerate).add(value); + }; + + regenerate.version = '1.0.1'; + + var proto = regenerate.prototype; + extend(proto, { + 'add': function(value) { + var $this = this; + if (value == null) { + return $this; + } + if (value instanceof regenerate) { + // Allow passing other Regenerate instances. + $this.data = dataAddData($this.data, value.data); + return $this; + } + if (arguments.length > 1) { + value = slice.call(arguments); + } + if (isArray(value)) { + forEach(value, function(item) { + $this.add(item); + }); + return $this; + } + $this.data = dataAdd( + $this.data, + isNumber(value) ? value : symbolToCodePoint(value) + ); + return $this; + }, + 'remove': function(value) { + var $this = this; + if (value == null) { + return $this; + } + if (value instanceof regenerate) { + // Allow passing other Regenerate instances. + $this.data = dataRemoveData($this.data, value.data); + return $this; + } + if (arguments.length > 1) { + value = slice.call(arguments); + } + if (isArray(value)) { + forEach(value, function(item) { + $this.remove(item); + }); + return $this; + } + $this.data = dataRemove( + $this.data, + isNumber(value) ? value : symbolToCodePoint(value) + ); + return $this; + }, + 'addRange': function(start, end) { + var $this = this; + $this.data = dataAddRange($this.data, + isNumber(start) ? start : symbolToCodePoint(start), + isNumber(end) ? end : symbolToCodePoint(end) + ); + return $this; + }, + 'removeRange': function(start, end) { + var $this = this; + var startCodePoint = isNumber(start) ? start : symbolToCodePoint(start); + var endCodePoint = isNumber(end) ? end : symbolToCodePoint(end); + $this.data = dataRemoveRange( + $this.data, + startCodePoint, + endCodePoint + ); + return $this; + }, + 'intersection': function(argument) { + var $this = this; + // Allow passing other Regenerate instances. + // TODO: Optimize this by writing and using `dataIntersectionData()`. + var array = argument instanceof regenerate ? + dataToArray(argument.data) : + argument; + $this.data = dataIntersection($this.data, array); + return $this; + }, + 'contains': function(codePoint) { + return dataContains( + this.data, + isNumber(codePoint) ? codePoint : symbolToCodePoint(codePoint) + ); + }, + 'clone': function() { + var set = new regenerate; + set.data = this.data.slice(0); + return set; + }, + 'toString': function() { + var result = createCharacterClassesFromData(this.data); + // Use `\0` instead of `\x00` where possible. + return result.replace(regexNull, '\\0$1'); + }, + 'toRegExp': function(flags) { + return RegExp(this.toString(), flags || ''); + }, + 'valueOf': function() { // Note: `valueOf` is aliased as `toArray`. + return dataToArray(this.data); + } + }); + + proto.toArray = proto.valueOf; + + // Some AMD build optimizers, like r.js, check for specific condition patterns + // like the following: + if ( + typeof define == 'function' && + typeof define.amd == 'object' && + define.amd + ) { + define(function() { + return regenerate; + }); + } else if (freeExports && !freeExports.nodeType) { + if (freeModule) { // in Node.js or RingoJS v0.8.0+ + freeModule.exports = regenerate; + } else { // in Narwhal or RingoJS v0.7.0- + freeExports.regenerate = regenerate; + } + } else { // in Rhino or a web browser + root.regenerate = regenerate; + } + +}(this)); + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{}],134:[function(require,module,exports){ +module.exports=[97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,181,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,248,249,250,251,252,253,254,255,257,259,261,263,265,267,269,271,273,275,277,279,281,283,285,287,289,291,293,295,297,299,301,303,305,307,309,311,312,314,316,318,320,322,324,326,328,329,331,333,335,337,339,341,343,345,347,349,351,353,355,357,359,361,363,365,367,369,371,373,375,378,380,382,383,384,387,389,392,396,397,402,405,409,410,411,414,417,419,421,424,426,427,429,432,436,438,441,442,445,446,447,454,457,460,462,464,466,468,470,472,474,476,477,479,481,483,485,487,489,491,493,495,496,499,501,505,507,509,511,513,515,517,519,521,523,525,527,529,531,533,535,537,539,541,543,545,547,549,551,553,555,557,559,561,563,564,565,566,567,568,569,572,575,576,578,583,585,587,589,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,881,883,887,891,892,893,912,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,976,977,981,982,983,985,987,989,991,993,995,997,999,1001,1003,1005,1007,1008,1009,1010,1011,1013,1016,1019,1020,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1121,1123,1125,1127,1129,1131,1133,1135,1137,1139,1141,1143,1145,1147,1149,1151,1153,1163,1165,1167,1169,1171,1173,1175,1177,1179,1181,1183,1185,1187,1189,1191,1193,1195,1197,1199,1201,1203,1205,1207,1209,1211,1213,1215,1218,1220,1222,1224,1226,1228,1230,1231,1233,1235,1237,1239,1241,1243,1245,1247,1249,1251,1253,1255,1257,1259,1261,1263,1265,1267,1269,1271,1273,1275,1277,1279,1281,1283,1285,1287,1289,1291,1293,1295,1297,1299,1301,1303,1305,1307,1309,1311,1313,1315,1317,1319,1377,1378,1379,1380,1381,1382,1383,1384,1385,1386,1387,1388,1389,1390,1391,1392,1393,1394,1395,1396,1397,1398,1399,1400,1401,1402,1403,1404,1405,1406,1407,1408,1409,1410,1411,1412,1413,1414,1415,7424,7425,7426,7427,7428,7429,7430,7431,7432,7433,7434,7435,7436,7437,7438,7439,7440,7441,7442,7443,7444,7445,7446,7447,7448,7449,7450,7451,7452,7453,7454,7455,7456,7457,7458,7459,7460,7461,7462,7463,7464,7465,7466,7467,7531,7532,7533,7534,7535,7536,7537,7538,7539,7540,7541,7542,7543,7545,7546,7547,7548,7549,7550,7551,7552,7553,7554,7555,7556,7557,7558,7559,7560,7561,7562,7563,7564,7565,7566,7567,7568,7569,7570,7571,7572,7573,7574,7575,7576,7577,7578,7681,7683,7685,7687,7689,7691,7693,7695,7697,7699,7701,7703,7705,7707,7709,7711,7713,7715,7717,7719,7721,7723,7725,7727,7729,7731,7733,7735,7737,7739,7741,7743,7745,7747,7749,7751,7753,7755,7757,7759,7761,7763,7765,7767,7769,7771,7773,7775,7777,7779,7781,7783,7785,7787,7789,7791,7793,7795,7797,7799,7801,7803,7805,7807,7809,7811,7813,7815,7817,7819,7821,7823,7825,7827,7829,7830,7831,7832,7833,7834,7835,7836,7837,7839,7841,7843,7845,7847,7849,7851,7853,7855,7857,7859,7861,7863,7865,7867,7869,7871,7873,7875,7877,7879,7881,7883,7885,7887,7889,7891,7893,7895,7897,7899,7901,7903,7905,7907,7909,7911,7913,7915,7917,7919,7921,7923,7925,7927,7929,7931,7933,7935,7936,7937,7938,7939,7940,7941,7942,7943,7952,7953,7954,7955,7956,7957,7968,7969,7970,7971,7972,7973,7974,7975,7984,7985,7986,7987,7988,7989,7990,7991,8000,8001,8002,8003,8004,8005,8016,8017,8018,8019,8020,8021,8022,8023,8032,8033,8034,8035,8036,8037,8038,8039,8048,8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8064,8065,8066,8067,8068,8069,8070,8071,8080,8081,8082,8083,8084,8085,8086,8087,8096,8097,8098,8099,8100,8101,8102,8103,8112,8113,8114,8115,8116,8118,8119,8126,8130,8131,8132,8134,8135,8144,8145,8146,8147,8150,8151,8160,8161,8162,8163,8164,8165,8166,8167,8178,8179,8180,8182,8183,8458,8462,8463,8467,8495,8500,8505,8508,8509,8518,8519,8520,8521,8526,8580,11312,11313,11314,11315,11316,11317,11318,11319,11320,11321,11322,11323,11324,11325,11326,11327,11328,11329,11330,11331,11332,11333,11334,11335,11336,11337,11338,11339,11340,11341,11342,11343,11344,11345,11346,11347,11348,11349,11350,11351,11352,11353,11354,11355,11356,11357,11358,11361,11365,11366,11368,11370,11372,11377,11379,11380,11382,11383,11384,11385,11386,11387,11393,11395,11397,11399,11401,11403,11405,11407,11409,11411,11413,11415,11417,11419,11421,11423,11425,11427,11429,11431,11433,11435,11437,11439,11441,11443,11445,11447,11449,11451,11453,11455,11457,11459,11461,11463,11465,11467,11469,11471,11473,11475,11477,11479,11481,11483,11485,11487,11489,11491,11492,11500,11502,11507,11520,11521,11522,11523,11524,11525,11526,11527,11528,11529,11530,11531,11532,11533,11534,11535,11536,11537,11538,11539,11540,11541,11542,11543,11544,11545,11546,11547,11548,11549,11550,11551,11552,11553,11554,11555,11556,11557,11559,11565,42561,42563,42565,42567,42569,42571,42573,42575,42577,42579,42581,42583,42585,42587,42589,42591,42593,42595,42597,42599,42601,42603,42605,42625,42627,42629,42631,42633,42635,42637,42639,42641,42643,42645,42647,42787,42789,42791,42793,42795,42797,42799,42800,42801,42803,42805,42807,42809,42811,42813,42815,42817,42819,42821,42823,42825,42827,42829,42831,42833,42835,42837,42839,42841,42843,42845,42847,42849,42851,42853,42855,42857,42859,42861,42863,42865,42866,42867,42868,42869,42870,42871,42872,42874,42876,42879,42881,42883,42885,42887,42892,42894,42897,42899,42913,42915,42917,42919,42921,43002,64256,64257,64258,64259,64260,64261,64262,64275,64276,64277,64278,64279,65345,65346,65347,65348,65349,65350,65351,65352,65353,65354,65355,65356,65357,65358,65359,65360,65361,65362,65363,65364,65365,65366,65367,65368,65369,65370,66600,66601,66602,66603,66604,66605,66606,66607,66608,66609,66610,66611,66612,66613,66614,66615,66616,66617,66618,66619,66620,66621,66622,66623,66624,66625,66626,66627,66628,66629,66630,66631,66632,66633,66634,66635,66636,66637,66638,66639,119834,119835,119836,119837,119838,119839,119840,119841,119842,119843,119844,119845,119846,119847,119848,119849,119850,119851,119852,119853,119854,119855,119856,119857,119858,119859,119886,119887,119888,119889,119890,119891,119892,119894,119895,119896,119897,119898,119899,119900,119901,119902,119903,119904,119905,119906,119907,119908,119909,119910,119911,119938,119939,119940,119941,119942,119943,119944,119945,119946,119947,119948,119949,119950,119951,119952,119953,119954,119955,119956,119957,119958,119959,119960,119961,119962,119963,119990,119991,119992,119993,119995,119997,119998,119999,120000,120001,120002,120003,120005,120006,120007,120008,120009,120010,120011,120012,120013,120014,120015,120042,120043,120044,120045,120046,120047,120048,120049,120050,120051,120052,120053,120054,120055,120056,120057,120058,120059,120060,120061,120062,120063,120064,120065,120066,120067,120094,120095,120096,120097,120098,120099,120100,120101,120102,120103,120104,120105,120106,120107,120108,120109,120110,120111,120112,120113,120114,120115,120116,120117,120118,120119,120146,120147,120148,120149,120150,120151,120152,120153,120154,120155,120156,120157,120158,120159,120160,120161,120162,120163,120164,120165,120166,120167,120168,120169,120170,120171,120198,120199,120200,120201,120202,120203,120204,120205,120206,120207,120208,120209,120210,120211,120212,120213,120214,120215,120216,120217,120218,120219,120220,120221,120222,120223,120250,120251,120252,120253,120254,120255,120256,120257,120258,120259,120260,120261,120262,120263,120264,120265,120266,120267,120268,120269,120270,120271,120272,120273,120274,120275,120302,120303,120304,120305,120306,120307,120308,120309,120310,120311,120312,120313,120314,120315,120316,120317,120318,120319,120320,120321,120322,120323,120324,120325,120326,120327,120354,120355,120356,120357,120358,120359,120360,120361,120362,120363,120364,120365,120366,120367,120368,120369,120370,120371,120372,120373,120374,120375,120376,120377,120378,120379,120406,120407,120408,120409,120410,120411,120412,120413,120414,120415,120416,120417,120418,120419,120420,120421,120422,120423,120424,120425,120426,120427,120428,120429,120430,120431,120458,120459,120460,120461,120462,120463,120464,120465,120466,120467,120468,120469,120470,120471,120472,120473,120474,120475,120476,120477,120478,120479,120480,120481,120482,120483,120484,120485,120514,120515,120516,120517,120518,120519,120520,120521,120522,120523,120524,120525,120526,120527,120528,120529,120530,120531,120532,120533,120534,120535,120536,120537,120538,120540,120541,120542,120543,120544,120545,120572,120573,120574,120575,120576,120577,120578,120579,120580,120581,120582,120583,120584,120585,120586,120587,120588,120589,120590,120591,120592,120593,120594,120595,120596,120598,120599,120600,120601,120602,120603,120630,120631,120632,120633,120634,120635,120636,120637,120638,120639,120640,120641,120642,120643,120644,120645,120646,120647,120648,120649,120650,120651,120652,120653,120654,120656,120657,120658,120659,120660,120661,120688,120689,120690,120691,120692,120693,120694,120695,120696,120697,120698,120699,120700,120701,120702,120703,120704,120705,120706,120707,120708,120709,120710,120711,120712,120714,120715,120716,120717,120718,120719,120746,120747,120748,120749,120750,120751,120752,120753,120754,120755,120756,120757,120758,120759,120760,120761,120762,120763,120764,120765,120766,120767,120768,120769,120770,120772,120773,120774,120775,120776,120777,120779] +},{}],135:[function(require,module,exports){ +module.exports=[688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,710,711,712,713,714,715,716,717,718,719,720,721,736,737,738,739,740,748,750,884,890,1369,1600,1765,1766,2036,2037,2042,2074,2084,2088,2417,3654,3782,4348,6103,6211,6823,7288,7289,7290,7291,7292,7293,7468,7469,7470,7471,7472,7473,7474,7475,7476,7477,7478,7479,7480,7481,7482,7483,7484,7485,7486,7487,7488,7489,7490,7491,7492,7493,7494,7495,7496,7497,7498,7499,7500,7501,7502,7503,7504,7505,7506,7507,7508,7509,7510,7511,7512,7513,7514,7515,7516,7517,7518,7519,7520,7521,7522,7523,7524,7525,7526,7527,7528,7529,7530,7544,7579,7580,7581,7582,7583,7584,7585,7586,7587,7588,7589,7590,7591,7592,7593,7594,7595,7596,7597,7598,7599,7600,7601,7602,7603,7604,7605,7606,7607,7608,7609,7610,7611,7612,7613,7614,7615,8305,8319,8336,8337,8338,8339,8340,8341,8342,8343,8344,8345,8346,8347,8348,11388,11389,11631,11823,12293,12337,12338,12339,12340,12341,12347,12445,12446,12540,12541,12542,40981,42232,42233,42234,42235,42236,42237,42508,42623,42775,42776,42777,42778,42779,42780,42781,42782,42783,42864,42888,43000,43001,43471,43632,43741,43763,43764,65392,65438,65439,94099,94100,94101,94102,94103,94104,94105,94106,94107,94108,94109,94110,94111] +},{}],136:[function(require,module,exports){ +module.exports=[170,186,443,448,449,450,451,660,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,1520,1521,1522,1568,1569,1570,1571,1572,1573,1574,1575,1576,1577,1578,1579,1580,1581,1582,1583,1584,1585,1586,1587,1588,1589,1590,1591,1592,1593,1594,1595,1596,1597,1598,1599,1601,1602,1603,1604,1605,1606,1607,1608,1609,1610,1646,1647,1649,1650,1651,1652,1653,1654,1655,1656,1657,1658,1659,1660,1661,1662,1663,1664,1665,1666,1667,1668,1669,1670,1671,1672,1673,1674,1675,1676,1677,1678,1679,1680,1681,1682,1683,1684,1685,1686,1687,1688,1689,1690,1691,1692,1693,1694,1695,1696,1697,1698,1699,1700,1701,1702,1703,1704,1705,1706,1707,1708,1709,1710,1711,1712,1713,1714,1715,1716,1717,1718,1719,1720,1721,1722,1723,1724,1725,1726,1727,1728,1729,1730,1731,1732,1733,1734,1735,1736,1737,1738,1739,1740,1741,1742,1743,1744,1745,1746,1747,1749,1774,1775,1786,1787,1788,1791,1808,1810,1811,1812,1813,1814,1815,1816,1817,1818,1819,1820,1821,1822,1823,1824,1825,1826,1827,1828,1829,1830,1831,1832,1833,1834,1835,1836,1837,1838,1839,1869,1870,1871,1872,1873,1874,1875,1876,1877,1878,1879,1880,1881,1882,1883,1884,1885,1886,1887,1888,1889,1890,1891,1892,1893,1894,1895,1896,1897,1898,1899,1900,1901,1902,1903,1904,1905,1906,1907,1908,1909,1910,1911,1912,1913,1914,1915,1916,1917,1918,1919,1920,1921,1922,1923,1924,1925,1926,1927,1928,1929,1930,1931,1932,1933,1934,1935,1936,1937,1938,1939,1940,1941,1942,1943,1944,1945,1946,1947,1948,1949,1950,1951,1952,1953,1954,1955,1956,1957,1969,1994,1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,2015,2016,2017,2018,2019,2020,2021,2022,2023,2024,2025,2026,2048,2049,2050,2051,2052,2053,2054,2055,2056,2057,2058,2059,2060,2061,2062,2063,2064,2065,2066,2067,2068,2069,2112,2113,2114,2115,2116,2117,2118,2119,2120,2121,2122,2123,2124,2125,2126,2127,2128,2129,2130,2131,2132,2133,2134,2135,2136,2208,2210,2211,2212,2213,2214,2215,2216,2217,2218,2219,2220,2308,2309,2310,2311,2312,2313,2314,2315,2316,2317,2318,2319,2320,2321,2322,2323,2324,2325,2326,2327,2328,2329,2330,2331,2332,2333,2334,2335,2336,2337,2338,2339,2340,2341,2342,2343,2344,2345,2346,2347,2348,2349,2350,2351,2352,2353,2354,2355,2356,2357,2358,2359,2360,2361,2365,2384,2392,2393,2394,2395,2396,2397,2398,2399,2400,2401,2418,2419,2420,2421,2422,2423,2425,2426,2427,2428,2429,2430,2431,2437,2438,2439,2440,2441,2442,2443,2444,2447,2448,2451,2452,2453,2454,2455,2456,2457,2458,2459,2460,2461,2462,2463,2464,2465,2466,2467,2468,2469,2470,2471,2472,2474,2475,2476,2477,2478,2479,2480,2482,2486,2487,2488,2489,2493,2510,2524,2525,2527,2528,2529,2544,2545,2565,2566,2567,2568,2569,2570,2575,2576,2579,2580,2581,2582,2583,2584,2585,2586,2587,2588,2589,2590,2591,2592,2593,2594,2595,2596,2597,2598,2599,2600,2602,2603,2604,2605,2606,2607,2608,2610,2611,2613,2614,2616,2617,2649,2650,2651,2652,2654,2674,2675,2676,2693,2694,2695,2696,2697,2698,2699,2700,2701,2703,2704,2705,2707,2708,2709,2710,2711,2712,2713,2714,2715,2716,2717,2718,2719,2720,2721,2722,2723,2724,2725,2726,2727,2728,2730,2731,2732,2733,2734,2735,2736,2738,2739,2741,2742,2743,2744,2745,2749,2768,2784,2785,2821,2822,2823,2824,2825,2826,2827,2828,2831,2832,2835,2836,2837,2838,2839,2840,2841,2842,2843,2844,2845,2846,2847,2848,2849,2850,2851,2852,2853,2854,2855,2856,2858,2859,2860,2861,2862,2863,2864,2866,2867,2869,2870,2871,2872,2873,2877,2908,2909,2911,2912,2913,2929,2947,2949,2950,2951,2952,2953,2954,2958,2959,2960,2962,2963,2964,2965,2969,2970,2972,2974,2975,2979,2980,2984,2985,2986,2990,2991,2992,2993,2994,2995,2996,2997,2998,2999,3000,3001,3024,3077,3078,3079,3080,3081,3082,3083,3084,3086,3087,3088,3090,3091,3092,3093,3094,3095,3096,3097,3098,3099,3100,3101,3102,3103,3104,3105,3106,3107,3108,3109,3110,3111,3112,3114,3115,3116,3117,3118,3119,3120,3121,3122,3123,3125,3126,3127,3128,3129,3133,3160,3161,3168,3169,3205,3206,3207,3208,3209,3210,3211,3212,3214,3215,3216,3218,3219,3220,3221,3222,3223,3224,3225,3226,3227,3228,3229,3230,3231,3232,3233,3234,3235,3236,3237,3238,3239,3240,3242,3243,3244,3245,3246,3247,3248,3249,3250,3251,3253,3254,3255,3256,3257,3261,3294,3296,3297,3313,3314,3333,3334,3335,3336,3337,3338,3339,3340,3342,3343,3344,3346,3347,3348,3349,3350,3351,3352,3353,3354,3355,3356,3357,3358,3359,3360,3361,3362,3363,3364,3365,3366,3367,3368,3369,3370,3371,3372,3373,3374,3375,3376,3377,3378,3379,3380,3381,3382,3383,3384,3385,3386,3389,3406,3424,3425,3450,3451,3452,3453,3454,3455,3461,3462,3463,3464,3465,3466,3467,3468,3469,3470,3471,3472,3473,3474,3475,3476,3477,3478,3482,3483,3484,3485,3486,3487,3488,3489,3490,3491,3492,3493,3494,3495,3496,3497,3498,3499,3500,3501,3502,3503,3504,3505,3507,3508,3509,3510,3511,3512,3513,3514,3515,3517,3520,3521,3522,3523,3524,3525,3526,3585,3586,3587,3588,3589,3590,3591,3592,3593,3594,3595,3596,3597,3598,3599,3600,3601,3602,3603,3604,3605,3606,3607,3608,3609,3610,3611,3612,3613,3614,3615,3616,3617,3618,3619,3620,3621,3622,3623,3624,3625,3626,3627,3628,3629,3630,3631,3632,3634,3635,3648,3649,3650,3651,3652,3653,3713,3714,3716,3719,3720,3722,3725,3732,3733,3734,3735,3737,3738,3739,3740,3741,3742,3743,3745,3746,3747,3749,3751,3754,3755,3757,3758,3759,3760,3762,3763,3773,3776,3777,3778,3779,3780,3804,3805,3806,3807,3840,3904,3905,3906,3907,3908,3909,3910,3911,3913,3914,3915,3916,3917,3918,3919,3920,3921,3922,3923,3924,3925,3926,3927,3928,3929,3930,3931,3932,3933,3934,3935,3936,3937,3938,3939,3940,3941,3942,3943,3944,3945,3946,3947,3948,3976,3977,3978,3979,3980,4096,4097,4098,4099,4100,4101,4102,4103,4104,4105,4106,4107,4108,4109,4110,4111,4112,4113,4114,4115,4116,4117,4118,4119,4120,4121,4122,4123,4124,4125,4126,4127,4128,4129,4130,4131,4132,4133,4134,4135,4136,4137,4138,4159,4176,4177,4178,4179,4180,4181,4186,4187,4188,4189,4193,4197,4198,4206,4207,4208,4213,4214,4215,4216,4217,4218,4219,4220,4221,4222,4223,4224,4225,4238,4304,4305,4306,4307,4308,4309,4310,4311,4312,4313,4314,4315,4316,4317,4318,4319,4320,4321,4322,4323,4324,4325,4326,4327,4328,4329,4330,4331,4332,4333,4334,4335,4336,4337,4338,4339,4340,4341,4342,4343,4344,4345,4346,4349,4350,4351,4352,4353,4354,4355,4356,4357,4358,4359,4360,4361,4362,4363,4364,4365,4366,4367,4368,4369,4370,4371,4372,4373,4374,4375,4376,4377,4378,4379,4380,4381,4382,4383,4384,4385,4386,4387,4388,4389,4390,4391,4392,4393,4394,4395,4396,4397,4398,4399,4400,4401,4402,4403,4404,4405,4406,4407,4408,4409,4410,4411,4412,4413,4414,4415,4416,4417,4418,4419,4420,4421,4422,4423,4424,4425,4426,4427,4428,4429,4430,4431,4432,4433,4434,4435,4436,4437,4438,4439,4440,4441,4442,4443,4444,4445,4446,4447,4448,4449,4450,4451,4452,4453,4454,4455,4456,4457,4458,4459,4460,4461,4462,4463,4464,4465,4466,4467,4468,4469,4470,4471,4472,4473,4474,4475,4476,4477,4478,4479,4480,4481,4482,4483,4484,4485,4486,4487,4488,4489,4490,4491,4492,4493,4494,4495,4496,4497,4498,4499,4500,4501,4502,4503,4504,4505,4506,4507,4508,4509,4510,4511,4512,4513,4514,4515,4516,4517,4518,4519,4520,4521,4522,4523,4524,4525,4526,4527,4528,4529,4530,4531,4532,4533,4534,4535,4536,4537,4538,4539,4540,4541,4542,4543,4544,4545,4546,4547,4548,4549,4550,4551,4552,4553,4554,4555,4556,4557,4558,4559,4560,4561,4562,4563,4564,4565,4566,4567,4568,4569,4570,4571,4572,4573,4574,4575,4576,4577,4578,4579,4580,4581,4582,4583,4584,4585,4586,4587,4588,4589,4590,4591,4592,4593,4594,4595,4596,4597,4598,4599,4600,4601,4602,4603,4604,4605,4606,4607,4608,4609,4610,4611,4612,4613,4614,4615,4616,4617,4618,4619,4620,4621,4622,4623,4624,4625,4626,4627,4628,4629,4630,4631,4632,4633,4634,4635,4636,4637,4638,4639,4640,4641,4642,4643,4644,4645,4646,4647,4648,4649,4650,4651,4652,4653,4654,4655,4656,4657,4658,4659,4660,4661,4662,4663,4664,4665,4666,4667,4668,4669,4670,4671,4672,4673,4674,4675,4676,4677,4678,4679,4680,4682,4683,4684,4685,4688,4689,4690,4691,4692,4693,4694,4696,4698,4699,4700,4701,4704,4705,4706,4707,4708,4709,4710,4711,4712,4713,4714,4715,4716,4717,4718,4719,4720,4721,4722,4723,4724,4725,4726,4727,4728,4729,4730,4731,4732,4733,4734,4735,4736,4737,4738,4739,4740,4741,4742,4743,4744,4746,4747,4748,4749,4752,4753,4754,4755,4756,4757,4758,4759,4760,4761,4762,4763,4764,4765,4766,4767,4768,4769,4770,4771,4772,4773,4774,4775,4776,4777,4778,4779,4780,4781,4782,4783,4784,4786,4787,4788,4789,4792,4793,4794,4795,4796,4797,4798,4800,4802,4803,4804,4805,4808,4809,4810,4811,4812,4813,4814,4815,4816,4817,4818,4819,4820,4821,4822,4824,4825,4826,4827,4828,4829,4830,4831,4832,4833,4834,4835,4836,4837,4838,4839,4840,4841,4842,4843,4844,4845,4846,4847,4848,4849,4850,4851,4852,4853,4854,4855,4856,4857,4858,4859,4860,4861,4862,4863,4864,4865,4866,4867,4868,4869,4870,4871,4872,4873,4874,4875,4876,4877,4878,4879,4880,4882,4883,4884,4885,4888,4889,4890,4891,4892,4893,4894,4895,4896,4897,4898,4899,4900,4901,4902,4903,4904,4905,4906,4907,4908,4909,4910,4911,4912,4913,4914,4915,4916,4917,4918,4919,4920,4921,4922,4923,4924,4925,4926,4927,4928,4929,4930,4931,4932,4933,4934,4935,4936,4937,4938,4939,4940,4941,4942,4943,4944,4945,4946,4947,4948,4949,4950,4951,4952,4953,4954,4992,4993,4994,4995,4996,4997,4998,4999,5000,5001,5002,5003,5004,5005,5006,5007,5024,5025,5026,5027,5028,5029,5030,5031,5032,5033,5034,5035,5036,5037,5038,5039,5040,5041,5042,5043,5044,5045,5046,5047,5048,5049,5050,5051,5052,5053,5054,5055,5056,5057,5058,5059,5060,5061,5062,5063,5064,5065,5066,5067,5068,5069,5070,5071,5072,5073,5074,5075,5076,5077,5078,5079,5080,5081,5082,5083,5084,5085,5086,5087,5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102,5103,5104,5105,5106,5107,5108,5121,5122,5123,5124,5125,5126,5127,5128,5129,5130,5131,5132,5133,5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148,5149,5150,5151,5152,5153,5154,5155,5156,5157,5158,5159,5160,5161,5162,5163,5164,5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,5176,5177,5178,5179,5180,5181,5182,5183,5184,5185,5186,5187,5188,5189,5190,5191,5192,5193,5194,5195,5196,5197,5198,5199,5200,5201,5202,5203,5204,5205,5206,5207,5208,5209,5210,5211,5212,5213,5214,5215,5216,5217,5218,5219,5220,5221,5222,5223,5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234,5235,5236,5237,5238,5239,5240,5241,5242,5243,5244,5245,5246,5247,5248,5249,5250,5251,5252,5253,5254,5255,5256,5257,5258,5259,5260,5261,5262,5263,5264,5265,5266,5267,5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278,5279,5280,5281,5282,5283,5284,5285,5286,5287,5288,5289,5290,5291,5292,5293,5294,5295,5296,5297,5298,5299,5300,5301,5302,5303,5304,5305,5306,5307,5308,5309,5310,5311,5312,5313,5314,5315,5316,5317,5318,5319,5320,5321,5322,5323,5324,5325,5326,5327,5328,5329,5330,5331,5332,5333,5334,5335,5336,5337,5338,5339,5340,5341,5342,5343,5344,5345,5346,5347,5348,5349,5350,5351,5352,5353,5354,5355,5356,5357,5358,5359,5360,5361,5362,5363,5364,5365,5366,5367,5368,5369,5370,5371,5372,5373,5374,5375,5376,5377,5378,5379,5380,5381,5382,5383,5384,5385,5386,5387,5388,5389,5390,5391,5392,5393,5394,5395,5396,5397,5398,5399,5400,5401,5402,5403,5404,5405,5406,5407,5408,5409,5410,5411,5412,5413,5414,5415,5416,5417,5418,5419,5420,5421,5422,5423,5424,5425,5426,5427,5428,5429,5430,5431,5432,5433,5434,5435,5436,5437,5438,5439,5440,5441,5442,5443,5444,5445,5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456,5457,5458,5459,5460,5461,5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472,5473,5474,5475,5476,5477,5478,5479,5480,5481,5482,5483,5484,5485,5486,5487,5488,5489,5490,5491,5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504,5505,5506,5507,5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520,5521,5522,5523,5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536,5537,5538,5539,5540,5541,5542,5543,5544,5545,5546,5547,5548,5549,5550,5551,5552,5553,5554,5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568,5569,5570,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584,5585,5586,5587,5588,5589,5590,5591,5592,5593,5594,5595,5596,5597,5598,5599,5600,5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,5615,5616,5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,5632,5633,5634,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,5647,5648,5649,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,5661,5662,5663,5664,5665,5666,5667,5668,5669,5670,5671,5672,5673,5674,5675,5676,5677,5678,5679,5680,5681,5682,5683,5684,5685,5686,5687,5688,5689,5690,5691,5692,5693,5694,5695,5696,5697,5698,5699,5700,5701,5702,5703,5704,5705,5706,5707,5708,5709,5710,5711,5712,5713,5714,5715,5716,5717,5718,5719,5720,5721,5722,5723,5724,5725,5726,5727,5728,5729,5730,5731,5732,5733,5734,5735,5736,5737,5738,5739,5740,5743,5744,5745,5746,5747,5748,5749,5750,5751,5752,5753,5754,5755,5756,5757,5758,5759,5761,5762,5763,5764,5765,5766,5767,5768,5769,5770,5771,5772,5773,5774,5775,5776,5777,5778,5779,5780,5781,5782,5783,5784,5785,5786,5792,5793,5794,5795,5796,5797,5798,5799,5800,5801,5802,5803,5804,5805,5806,5807,5808,5809,5810,5811,5812,5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824,5825,5826,5827,5828,5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840,5841,5842,5843,5844,5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856,5857,5858,5859,5860,5861,5862,5863,5864,5865,5866,5888,5889,5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5902,5903,5904,5905,5920,5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936,5937,5952,5953,5954,5955,5956,5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968,5969,5984,5985,5986,5987,5988,5989,5990,5991,5992,5993,5994,5995,5996,5998,5999,6000,6016,6017,6018,6019,6020,6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032,6033,6034,6035,6036,6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048,6049,6050,6051,6052,6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064,6065,6066,6067,6108,6176,6177,6178,6179,6180,6181,6182,6183,6184,6185,6186,6187,6188,6189,6190,6191,6192,6193,6194,6195,6196,6197,6198,6199,6200,6201,6202,6203,6204,6205,6206,6207,6208,6209,6210,6212,6213,6214,6215,6216,6217,6218,6219,6220,6221,6222,6223,6224,6225,6226,6227,6228,6229,6230,6231,6232,6233,6234,6235,6236,6237,6238,6239,6240,6241,6242,6243,6244,6245,6246,6247,6248,6249,6250,6251,6252,6253,6254,6255,6256,6257,6258,6259,6260,6261,6262,6263,6272,6273,6274,6275,6276,6277,6278,6279,6280,6281,6282,6283,6284,6285,6286,6287,6288,6289,6290,6291,6292,6293,6294,6295,6296,6297,6298,6299,6300,6301,6302,6303,6304,6305,6306,6307,6308,6309,6310,6311,6312,6314,6320,6321,6322,6323,6324,6325,6326,6327,6328,6329,6330,6331,6332,6333,6334,6335,6336,6337,6338,6339,6340,6341,6342,6343,6344,6345,6346,6347,6348,6349,6350,6351,6352,6353,6354,6355,6356,6357,6358,6359,6360,6361,6362,6363,6364,6365,6366,6367,6368,6369,6370,6371,6372,6373,6374,6375,6376,6377,6378,6379,6380,6381,6382,6383,6384,6385,6386,6387,6388,6389,6400,6401,6402,6403,6404,6405,6406,6407,6408,6409,6410,6411,6412,6413,6414,6415,6416,6417,6418,6419,6420,6421,6422,6423,6424,6425,6426,6427,6428,6480,6481,6482,6483,6484,6485,6486,6487,6488,6489,6490,6491,6492,6493,6494,6495,6496,6497,6498,6499,6500,6501,6502,6503,6504,6505,6506,6507,6508,6509,6512,6513,6514,6515,6516,6528,6529,6530,6531,6532,6533,6534,6535,6536,6537,6538,6539,6540,6541,6542,6543,6544,6545,6546,6547,6548,6549,6550,6551,6552,6553,6554,6555,6556,6557,6558,6559,6560,6561,6562,6563,6564,6565,6566,6567,6568,6569,6570,6571,6593,6594,6595,6596,6597,6598,6599,6656,6657,6658,6659,6660,6661,6662,6663,6664,6665,6666,6667,6668,6669,6670,6671,6672,6673,6674,6675,6676,6677,6678,6688,6689,6690,6691,6692,6693,6694,6695,6696,6697,6698,6699,6700,6701,6702,6703,6704,6705,6706,6707,6708,6709,6710,6711,6712,6713,6714,6715,6716,6717,6718,6719,6720,6721,6722,6723,6724,6725,6726,6727,6728,6729,6730,6731,6732,6733,6734,6735,6736,6737,6738,6739,6740,6917,6918,6919,6920,6921,6922,6923,6924,6925,6926,6927,6928,6929,6930,6931,6932,6933,6934,6935,6936,6937,6938,6939,6940,6941,6942,6943,6944,6945,6946,6947,6948,6949,6950,6951,6952,6953,6954,6955,6956,6957,6958,6959,6960,6961,6962,6963,6981,6982,6983,6984,6985,6986,6987,7043,7044,7045,7046,7047,7048,7049,7050,7051,7052,7053,7054,7055,7056,7057,7058,7059,7060,7061,7062,7063,7064,7065,7066,7067,7068,7069,7070,7071,7072,7086,7087,7098,7099,7100,7101,7102,7103,7104,7105,7106,7107,7108,7109,7110,7111,7112,7113,7114,7115,7116,7117,7118,7119,7120,7121,7122,7123,7124,7125,7126,7127,7128,7129,7130,7131,7132,7133,7134,7135,7136,7137,7138,7139,7140,7141,7168,7169,7170,7171,7172,7173,7174,7175,7176,7177,7178,7179,7180,7181,7182,7183,7184,7185,7186,7187,7188,7189,7190,7191,7192,7193,7194,7195,7196,7197,7198,7199,7200,7201,7202,7203,7245,7246,7247,7258,7259,7260,7261,7262,7263,7264,7265,7266,7267,7268,7269,7270,7271,7272,7273,7274,7275,7276,7277,7278,7279,7280,7281,7282,7283,7284,7285,7286,7287,7401,7402,7403,7404,7406,7407,7408,7409,7413,7414,8501,8502,8503,8504,11568,11569,11570,11571,11572,11573,11574,11575,11576,11577,11578,11579,11580,11581,11582,11583,11584,11585,11586,11587,11588,11589,11590,11591,11592,11593,11594,11595,11596,11597,11598,11599,11600,11601,11602,11603,11604,11605,11606,11607,11608,11609,11610,11611,11612,11613,11614,11615,11616,11617,11618,11619,11620,11621,11622,11623,11648,11649,11650,11651,11652,11653,11654,11655,11656,11657,11658,11659,11660,11661,11662,11663,11664,11665,11666,11667,11668,11669,11670,11680,11681,11682,11683,11684,11685,11686,11688,11689,11690,11691,11692,11693,11694,11696,11697,11698,11699,11700,11701,11702,11704,11705,11706,11707,11708,11709,11710,11712,11713,11714,11715,11716,11717,11718,11720,11721,11722,11723,11724,11725,11726,11728,11729,11730,11731,11732,11733,11734,11736,11737,11738,11739,11740,11741,11742,12294,12348,12353,12354,12355,12356,12357,12358,12359,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369,12370,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384,12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400,12401,12402,12403,12404,12405,12406,12407,12408,12409,12410,12411,12412,12413,12414,12415,12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431,12432,12433,12434,12435,12436,12437,12438,12447,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462,12463,12464,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477,12478,12479,12480,12481,12482,12483,12484,12485,12486,12487,12488,12489,12490,12491,12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507,12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523,12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,12535,12536,12537,12538,12543,12549,12550,12551,12552,12553,12554,12555,12556,12557,12558,12559,12560,12561,12562,12563,12564,12565,12566,12567,12568,12569,12570,12571,12572,12573,12574,12575,12576,12577,12578,12579,12580,12581,12582,12583,12584,12585,12586,12587,12588,12589,12593,12594,12595,12596,12597,12598,12599,12600,12601,12602,12603,12604,12605,12606,12607,12608,12609,12610,12611,12612,12613,12614,12615,12616,12617,12618,12619,12620,12621,12622,12623,12624,12625,12626,12627,12628,12629,12630,12631,12632,12633,12634,12635,12636,12637,12638,12639,12640,12641,12642,12643,12644,12645,12646,12647,12648,12649,12650,12651,12652,12653,12654,12655,12656,12657,12658,12659,12660,12661,12662,12663,12664,12665,12666,12667,12668,12669,12670,12671,12672,12673,12674,12675,12676,12677,12678,12679,12680,12681,12682,12683,12684,12685,12686,12704,12705,12706,12707,12708,12709,12710,12711,12712,12713,12714,12715,12716,12717,12718,12719,12720,12721,12722,12723,12724,12725,12726,12727,12728,12729,12730,12784,12785,12786,12787,12788,12789,12790,12791,12792,12793,12794,12795,12796,12797,12798,12799,13312,13313,13314,13315,13316,13317,13318,13319,13320,13321,13322,13323,13324,13325,13326,13327,13328,13329,13330,13331,13332,13333,13334,13335,13336,13337,13338,13339,13340,13341,13342,13343,13344,13345,13346,13347,13348,13349,13350,13351,13352,13353,13354,13355,13356,13357,13358,13359,13360,13361,13362,13363,13364,13365,13366,13367,13368,13369,13370,13371,13372,13373,13374,13375,13376,13377,13378,13379,13380,13381,13382,13383,13384,13385,13386,13387,13388,13389,13390,13391,13392,13393,13394,13395,13396,13397,13398,13399,13400,13401,13402,13403,13404,13405,13406,13407,13408,13409,13410,13411,13412,13413,13414,13415,13416,13417,13418,13419,13420,13421,13422,13423,13424,13425,13426,13427,13428,13429,13430,13431,13432,13433,13434,13435,13436,13437,13438,13439,13440,13441,13442,13443,13444,13445,13446,13447,13448,13449,13450,13451,13452,13453,13454,13455,13456,13457,13458,13459,13460,13461,13462,13463,13464,13465,13466,13467,13468,13469,13470,13471,13472,13473,13474,13475,13476,13477,13478,13479,13480,13481,13482,13483,13484,13485,13486,13487,13488,13489,13490,13491,13492,13493,13494,13495,13496,13497,13498,13499,13500,13501,13502,13503,13504,13505,13506,13507,13508,13509,13510,13511,13512,13513,13514,13515,13516,13517,13518,13519,13520,13521,13522,13523,13524,13525,13526,13527,13528,13529,13530,13531,13532,13533,13534,13535,13536,13537,13538,13539,13540,13541,13542,13543,13544,13545,13546,13547,13548,13549,13550,13551,13552,13553,13554,13555,13556,13557,13558,13559,13560,13561,13562,13563,13564,13565,13566,13567,13568,13569,13570,13571,13572,13573,13574,13575,13576,13577,13578,13579,13580,13581,13582,13583,13584,13585,13586,13587,13588,13589,13590,13591,13592,13593,13594,13595,13596,13597,13598,13599,13600,13601,13602,13603,13604,13605,13606,13607,13608,13609,13610,13611,13612,13613,13614,13615,13616,13617,13618,13619,13620,13621,13622,13623,13624,13625,13626,13627,13628,13629,13630,13631,13632,13633,13634,13635,13636,13637,13638,13639,13640,13641,13642,13643,13644,13645,13646,13647,13648,13649,13650,13651,13652,13653,13654,13655,13656,13657,13658,13659,13660,13661,13662,13663,13664,13665,13666,13667,13668,13669,13670,13671,13672,13673,13674,13675,13676,13677,13678,13679,13680,13681,13682,13683,13684,13685,13686,13687,13688,13689,13690,13691,13692,13693,13694,13695,13696,13697,13698,13699,13700,13701,13702,13703,13704,13705,13706,13707,13708,13709,13710,13711,13712,13713,13714,13715,13716,13717,13718,13719,13720,13721,13722,13723,13724,13725,13726,13727,13728,13729,13730,13731,13732,13733,13734,13735,13736,13737,13738,13739,13740,13741,13742,13743,13744,13745,13746,13747,13748,13749,13750,13751,13752,13753,13754,13755,13756,13757,13758,13759,13760,13761,13762,13763,13764,13765,13766,13767,13768,13769,13770,13771,13772,13773,13774,13775,13776,13777,13778,13779,13780,13781,13782,13783,13784,13785,13786,13787,13788,13789,13790,13791,13792,13793,13794,13795,13796,13797,13798,13799,13800,13801,13802,13803,13804,13805,13806,13807,13808,13809,13810,13811,13812,13813,13814,13815,13816,13817,13818,13819,13820,13821,13822,13823,13824,13825,13826,13827,13828,13829,13830,13831,13832,13833,13834,13835,13836,13837,13838,13839,13840,13841,13842,13843,13844,13845,13846,13847,13848,13849,13850,13851,13852,13853,13854,13855,13856,13857,13858,13859,13860,13861,13862,13863,13864,13865,13866,13867,13868,13869,13870,13871,13872,13873,13874,13875,13876,13877,13878,13879,13880,13881,13882,13883,13884,13885,13886,13887,13888,13889,13890,13891,13892,13893,13894,13895,13896,13897,13898,13899,13900,13901,13902,13903,13904,13905,13906,13907,13908,13909,13910,13911,13912,13913,13914,13915,13916,13917,13918,13919,13920,13921,13922,13923,13924,13925,13926,13927,13928,13929,13930,13931,13932,13933,13934,13935,13936,13937,13938,13939,13940,13941,13942,13943,13944,13945,13946,13947,13948,13949,13950,13951,13952,13953,13954,13955,13956,13957,13958,13959,13960,13961,13962,13963,13964,13965,13966,13967,13968,13969,13970,13971,13972,13973,13974,13975,13976,13977,13978,13979,13980,13981,13982,13983,13984,13985,13986,13987,13988,13989,13990,13991,13992,13993,13994,13995,13996,13997,13998,13999,14000,14001,14002,14003,14004,14005,14006,14007,14008,14009,14010,14011,14012,14013,14014,14015,14016,14017,14018,14019,14020,14021,14022,14023,14024,14025,14026,14027,14028,14029,14030,14031,14032,14033,14034,14035,14036,14037,14038,14039,14040,14041,14042,14043,14044,14045,14046,14047,14048,14049,14050,14051,14052,14053,14054,14055,14056,14057,14058,14059,14060,14061,14062,14063,14064,14065,14066,14067,14068,14069,14070,14071,14072,14073,14074,14075,14076,14077,14078,14079,14080,14081,14082,14083,14084,14085,14086,14087,14088,14089,14090,14091,14092,14093,14094,14095,14096,14097,14098,14099,14100,14101,14102,14103,14104,14105,14106,14107,14108,14109,14110,14111,14112,14113,14114,14115,14116,14117,14118,14119,14120,14121,14122,14123,14124,14125,14126,14127,14128,14129,14130,14131,14132,14133,14134,14135,14136,14137,14138,14139,14140,14141,14142,14143,14144,14145,14146,14147,14148,14149,14150,14151,14152,14153,14154,14155,14156,14157,14158,14159,14160,14161,14162,14163,14164,14165,14166,14167,14168,14169,14170,14171,14172,14173,14174,14175,14176,14177,14178,14179,14180,14181,14182,14183,14184,14185,14186,14187,14188,14189,14190,14191,14192,14193,14194,14195,14196,14197,14198,14199,14200,14201,14202,14203,14204,14205,14206,14207,14208,14209,14210,14211,14212,14213,14214,14215,14216,14217,14218,14219,14220,14221,14222,14223,14224,14225,14226,14227,14228,14229,14230,14231,14232,14233,14234,14235,14236,14237,14238,14239,14240,14241,14242,14243,14244,14245,14246,14247,14248,14249,14250,14251,14252,14253,14254,14255,14256,14257,14258,14259,14260,14261,14262,14263,14264,14265,14266,14267,14268,14269,14270,14271,14272,14273,14274,14275,14276,14277,14278,14279,14280,14281,14282,14283,14284,14285,14286,14287,14288,14289,14290,14291,14292,14293,14294,14295,14296,14297,14298,14299,14300,14301,14302,14303,14304,14305,14306,14307,14308,14309,14310,14311,14312,14313,14314,14315,14316,14317,14318,14319,14320,14321,14322,14323,14324,14325,14326,14327,14328,14329,14330,14331,14332,14333,14334,14335,14336,14337,14338,14339,14340,14341,14342,14343,14344,14345,14346,14347,14348,14349,14350,14351,14352,14353,14354,14355,14356,14357,14358,14359,14360,14361,14362,14363,14364,14365,14366,14367,14368,14369,14370,14371,14372,14373,14374,14375,14376,14377,14378,14379,14380,14381,14382,14383,14384,14385,14386,14387,14388,14389,14390,14391,14392,14393,14394,14395,14396,14397,14398,14399,14400,14401,14402,14403,14404,14405,14406,14407,14408,14409,14410,14411,14412,14413,14414,14415,14416,14417,14418,14419,14420,14421,14422,14423,14424,14425,14426,14427,14428,14429,14430,14431,14432,14433,14434,14435,14436,14437,14438,14439,14440,14441,14442,14443,14444,14445,14446,14447,14448,14449,14450,14451,14452,14453,14454,14455,14456,14457,14458,14459,14460,14461,14462,14463,14464,14465,14466,14467,14468,14469,14470,14471,14472,14473,14474,14475,14476,14477,14478,14479,14480,14481,14482,14483,14484,14485,14486,14487,14488,14489,14490,14491,14492,14493,14494,14495,14496,14497,14498,14499,14500,14501,14502,14503,14504,14505,14506,14507,14508,14509,14510,14511,14512,14513,14514,14515,14516,14517,14518,14519,14520,14521,14522,14523,14524,14525,14526,14527,14528,14529,14530,14531,14532,14533,14534,14535,14536,14537,14538,14539,14540,14541,14542,14543,14544,14545,14546,14547,14548,14549,14550,14551,14552,14553,14554,14555,14556,14557,14558,14559,14560,14561,14562,14563,14564,14565,14566,14567,14568,14569,14570,14571,14572,14573,14574,14575,14576,14577,14578,14579,14580,14581,14582,14583,14584,14585,14586,14587,14588,14589,14590,14591,14592,14593,14594,14595,14596,14597,14598,14599,14600,14601,14602,14603,14604,14605,14606,14607,14608,14609,14610,14611,14612,14613,14614,14615,14616,14617,14618,14619,14620,14621,14622,14623,14624,14625,14626,14627,14628,14629,14630,14631,14632,14633,14634,14635,14636,14637,14638,14639,14640,14641,14642,14643,14644,14645,14646,14647,14648,14649,14650,14651,14652,14653,14654,14655,14656,14657,14658,14659,14660,14661,14662,14663,14664,14665,14666,14667,14668,14669,14670,14671,14672,14673,14674,14675,14676,14677,14678,14679,14680,14681,14682,14683,14684,14685,14686,14687,14688,14689,14690,14691,14692,14693,14694,14695,14696,14697,14698,14699,14700,14701,14702,14703,14704,14705,14706,14707,14708,14709,14710,14711,14712,14713,14714,14715,14716,14717,14718,14719,14720,14721,14722,14723,14724,14725,14726,14727,14728,14729,14730,14731,14732,14733,14734,14735,14736,14737,14738,14739,14740,14741,14742,14743,14744,14745,14746,14747,14748,14749,14750,14751,14752,14753,14754,14755,14756,14757,14758,14759,14760,14761,14762,14763,14764,14765,14766,14767,14768,14769,14770,14771,14772,14773,14774,14775,14776,14777,14778,14779,14780,14781,14782,14783,14784,14785,14786,14787,14788,14789,14790,14791,14792,14793,14794,14795,14796,14797,14798,14799,14800,14801,14802,14803,14804,14805,14806,14807,14808,14809,14810,14811,14812,14813,14814,14815,14816,14817,14818,14819,14820,14821,14822,14823,14824,14825,14826,14827,14828,14829,14830,14831,14832,14833,14834,14835,14836,14837,14838,14839,14840,14841,14842,14843,14844,14845,14846,14847,14848,14849,14850,14851,14852,14853,14854,14855,14856,14857,14858,14859,14860,14861,14862,14863,14864,14865,14866,14867,14868,14869,14870,14871,14872,14873,14874,14875,14876,14877,14878,14879,14880,14881,14882,14883,14884,14885,14886,14887,14888,14889,14890,14891,14892,14893,14894,14895,14896,14897,14898,14899,14900,14901,14902,14903,14904,14905,14906,14907,14908,14909,14910,14911,14912,14913,14914,14915,14916,14917,14918,14919,14920,14921,14922,14923,14924,14925,14926,14927,14928,14929,14930,14931,14932,14933,14934,14935,14936,14937,14938,14939,14940,14941,14942,14943,14944,14945,14946,14947,14948,14949,14950,14951,14952,14953,14954,14955,14956,14957,14958,14959,14960,14961,14962,14963,14964,14965,14966,14967,14968,14969,14970,14971,14972,14973,14974,14975,14976,14977,14978,14979,14980,14981,14982,14983,14984,14985,14986,14987,14988,14989,14990,14991,14992,14993,14994,14995,14996,14997,14998,14999,15000,15001,15002,15003,15004,15005,15006,15007,15008,15009,15010,15011,15012,15013,15014,15015,15016,15017,15018,15019,15020,15021,15022,15023,15024,15025,15026,15027,15028,15029,15030,15031,15032,15033,15034,15035,15036,15037,15038,15039,15040,15041,15042,15043,15044,15045,15046,15047,15048,15049,15050,15051,15052,15053,15054,15055,15056,15057,15058,15059,15060,15061,15062,15063,15064,15065,15066,15067,15068,15069,15070,15071,15072,15073,15074,15075,15076,15077,15078,15079,15080,15081,15082,15083,15084,15085,15086,15087,15088,15089,15090,15091,15092,15093,15094,15095,15096,15097,15098,15099,15100,15101,15102,15103,15104,15105,15106,15107,15108,15109,15110,15111,15112,15113,15114,15115,15116,15117,15118,15119,15120,15121,15122,15123,15124,15125,15126,15127,15128,15129,15130,15131,15132,15133,15134,15135,15136,15137,15138,15139,15140,15141,15142,15143,15144,15145,15146,15147,15148,15149,15150,15151,15152,15153,15154,15155,15156,15157,15158,15159,15160,15161,15162,15163,15164,15165,15166,15167,15168,15169,15170,15171,15172,15173,15174,15175,15176,15177,15178,15179,15180,15181,15182,15183,15184,15185,15186,15187,15188,15189,15190,15191,15192,15193,15194,15195,15196,15197,15198,15199,15200,15201,15202,15203,15204,15205,15206,15207,15208,15209,15210,15211,15212,15213,15214,15215,15216,15217,15218,15219,15220,15221,15222,15223,15224,15225,15226,15227,15228,15229,15230,15231,15232,15233,15234,15235,15236,15237,15238,15239,15240,15241,15242,15243,15244,15245,15246,15247,15248,15249,15250,15251,15252,15253,15254,15255,15256,15257,15258,15259,15260,15261,15262,15263,15264,15265,15266,15267,15268,15269,15270,15271,15272,15273,15274,15275,15276,15277,15278,15279,15280,15281,15282,15283,15284,15285,15286,15287,15288,15289,15290,15291,15292,15293,15294,15295,15296,15297,15298,15299,15300,15301,15302,15303,15304,15305,15306,15307,15308,15309,15310,15311,15312,15313,15314,15315,15316,15317,15318,15319,15320,15321,15322,15323,15324,15325,15326,15327,15328,15329,15330,15331,15332,15333,15334,15335,15336,15337,15338,15339,15340,15341,15342,15343,15344,15345,15346,15347,15348,15349,15350,15351,15352,15353,15354,15355,15356,15357,15358,15359,15360,15361,15362,15363,15364,15365,15366,15367,15368,15369,15370,15371,15372,15373,15374,15375,15376,15377,15378,15379,15380,15381,15382,15383,15384,15385,15386,15387,15388,15389,15390,15391,15392,15393,15394,15395,15396,15397,15398,15399,15400,15401,15402,15403,15404,15405,15406,15407,15408,15409,15410,15411,15412,15413,15414,15415,15416,15417,15418,15419,15420,15421,15422,15423,15424,15425,15426,15427,15428,15429,15430,15431,15432,15433,15434,15435,15436,15437,15438,15439,15440,15441,15442,15443,15444,15445,15446,15447,15448,15449,15450,15451,15452,15453,15454,15455,15456,15457,15458,15459,15460,15461,15462,15463,15464,15465,15466,15467,15468,15469,15470,15471,15472,15473,15474,15475,15476,15477,15478,15479,15480,15481,15482,15483,15484,15485,15486,15487,15488,15489,15490,15491,15492,15493,15494,15495,15496,15497,15498,15499,15500,15501,15502,15503,15504,15505,15506,15507,15508,15509,15510,15511,15512,15513,15514,15515,15516,15517,15518,15519,15520,15521,15522,15523,15524,15525,15526,15527,15528,15529,15530,15531,15532,15533,15534,15535,15536,15537,15538,15539,15540,15541,15542,15543,15544,15545,15546,15547,15548,15549,15550,15551,15552,15553,15554,15555,15556,15557,15558,15559,15560,15561,15562,15563,15564,15565,15566,15567,15568,15569,15570,15571,15572,15573,15574,15575,15576,15577,15578,15579,15580,15581,15582,15583,15584,15585,15586,15587,15588,15589,15590,15591,15592,15593,15594,15595,15596,15597,15598,15599,15600,15601,15602,15603,15604,15605,15606,15607,15608,15609,15610,15611,15612,15613,15614,15615,15616,15617,15618,15619,15620,15621,15622,15623,15624,15625,15626,15627,15628,15629,15630,15631,15632,15633,15634,15635,15636,15637,15638,15639,15640,15641,15642,15643,15644,15645,15646,15647,15648,15649,15650,15651,15652,15653,15654,15655,15656,15657,15658,15659,15660,15661,15662,15663,15664,15665,15666,15667,15668,15669,15670,15671,15672,15673,15674,15675,15676,15677,15678,15679,15680,15681,15682,15683,15684,15685,15686,15687,15688,15689,15690,15691,15692,15693,15694,15695,15696,15697,15698,15699,15700,15701,15702,15703,15704,15705,15706,15707,15708,15709,15710,15711,15712,15713,15714,15715,15716,15717,15718,15719,15720,15721,15722,15723,15724,15725,15726,15727,15728,15729,15730,15731,15732,15733,15734,15735,15736,15737,15738,15739,15740,15741,15742,15743,15744,15745,15746,15747,15748,15749,15750,15751,15752,15753,15754,15755,15756,15757,15758,15759,15760,15761,15762,15763,15764,15765,15766,15767,15768,15769,15770,15771,15772,15773,15774,15775,15776,15777,15778,15779,15780,15781,15782,15783,15784,15785,15786,15787,15788,15789,15790,15791,15792,15793,15794,15795,15796,15797,15798,15799,15800,15801,15802,15803,15804,15805,15806,15807,15808,15809,15810,15811,15812,15813,15814,15815,15816,15817,15818,15819,15820,15821,15822,15823,15824,15825,15826,15827,15828,15829,15830,15831,15832,15833,15834,15835,15836,15837,15838,15839,15840,15841,15842,15843,15844,15845,15846,15847,15848,15849,15850,15851,15852,15853,15854,15855,15856,15857,15858,15859,15860,15861,15862,15863,15864,15865,15866,15867,15868,15869,15870,15871,15872,15873,15874,15875,15876,15877,15878,15879,15880,15881,15882,15883,15884,15885,15886,15887,15888,15889,15890,15891,15892,15893,15894,15895,15896,15897,15898,15899,15900,15901,15902,15903,15904,15905,15906,15907,15908,15909,15910,15911,15912,15913,15914,15915,15916,15917,15918,15919,15920,15921,15922,15923,15924,15925,15926,15927,15928,15929,15930,15931,15932,15933,15934,15935,15936,15937,15938,15939,15940,15941,15942,15943,15944,15945,15946,15947,15948,15949,15950,15951,15952,15953,15954,15955,15956,15957,15958,15959,15960,15961,15962,15963,15964,15965,15966,15967,15968,15969,15970,15971,15972,15973,15974,15975,15976,15977,15978,15979,15980,15981,15982,15983,15984,15985,15986,15987,15988,15989,15990,15991,15992,15993,15994,15995,15996,15997,15998,15999,16000,16001,16002,16003,16004,16005,16006,16007,16008,16009,16010,16011,16012,16013,16014,16015,16016,16017,16018,16019,16020,16021,16022,16023,16024,16025,16026,16027,16028,16029,16030,16031,16032,16033,16034,16035,16036,16037,16038,16039,16040,16041,16042,16043,16044,16045,16046,16047,16048,16049,16050,16051,16052,16053,16054,16055,16056,16057,16058,16059,16060,16061,16062,16063,16064,16065,16066,16067,16068,16069,16070,16071,16072,16073,16074,16075,16076,16077,16078,16079,16080,16081,16082,16083,16084,16085,16086,16087,16088,16089,16090,16091,16092,16093,16094,16095,16096,16097,16098,16099,16100,16101,16102,16103,16104,16105,16106,16107,16108,16109,16110,16111,16112,16113,16114,16115,16116,16117,16118,16119,16120,16121,16122,16123,16124,16125,16126,16127,16128,16129,16130,16131,16132,16133,16134,16135,16136,16137,16138,16139,16140,16141,16142,16143,16144,16145,16146,16147,16148,16149,16150,16151,16152,16153,16154,16155,16156,16157,16158,16159,16160,16161,16162,16163,16164,16165,16166,16167,16168,16169,16170,16171,16172,16173,16174,16175,16176,16177,16178,16179,16180,16181,16182,16183,16184,16185,16186,16187,16188,16189,16190,16191,16192,16193,16194,16195,16196,16197,16198,16199,16200,16201,16202,16203,16204,16205,16206,16207,16208,16209,16210,16211,16212,16213,16214,16215,16216,16217,16218,16219,16220,16221,16222,16223,16224,16225,16226,16227,16228,16229,16230,16231,16232,16233,16234,16235,16236,16237,16238,16239,16240,16241,16242,16243,16244,16245,16246,16247,16248,16249,16250,16251,16252,16253,16254,16255,16256,16257,16258,16259,16260,16261,16262,16263,16264,16265,16266,16267,16268,16269,16270,16271,16272,16273,16274,16275,16276,16277,16278,16279,16280,16281,16282,16283,16284,16285,16286,16287,16288,16289,16290,16291,16292,16293,16294,16295,16296,16297,16298,16299,16300,16301,16302,16303,16304,16305,16306,16307,16308,16309,16310,16311,16312,16313,16314,16315,16316,16317,16318,16319,16320,16321,16322,16323,16324,16325,16326,16327,16328,16329,16330,16331,16332,16333,16334,16335,16336,16337,16338,16339,16340,16341,16342,16343,16344,16345,16346,16347,16348,16349,16350,16351,16352,16353,16354,16355,16356,16357,16358,16359,16360,16361,16362,16363,16364,16365,16366,16367,16368,16369,16370,16371,16372,16373,16374,16375,16376,16377,16378,16379,16380,16381,16382,16383,16384,16385,16386,16387,16388,16389,16390,16391,16392,16393,16394,16395,16396,16397,16398,16399,16400,16401,16402,16403,16404,16405,16406,16407,16408,16409,16410,16411,16412,16413,16414,16415,16416,16417,16418,16419,16420,16421,16422,16423,16424,16425,16426,16427,16428,16429,16430,16431,16432,16433,16434,16435,16436,16437,16438,16439,16440,16441,16442,16443,16444,16445,16446,16447,16448,16449,16450,16451,16452,16453,16454,16455,16456,16457,16458,16459,16460,16461,16462,16463,16464,16465,16466,16467,16468,16469,16470,16471,16472,16473,16474,16475,16476,16477,16478,16479,16480,16481,16482,16483,16484,16485,16486,16487,16488,16489,16490,16491,16492,16493,16494,16495,16496,16497,16498,16499,16500,16501,16502,16503,16504,16505,16506,16507,16508,16509,16510,16511,16512,16513,16514,16515,16516,16517,16518,16519,16520,16521,16522,16523,16524,16525,16526,16527,16528,16529,16530,16531,16532,16533,16534,16535,16536,16537,16538,16539,16540,16541,16542,16543,16544,16545,16546,16547,16548,16549,16550,16551,16552,16553,16554,16555,16556,16557,16558,16559,16560,16561,16562,16563,16564,16565,16566,16567,16568,16569,16570,16571,16572,16573,16574,16575,16576,16577,16578,16579,16580,16581,16582,16583,16584,16585,16586,16587,16588,16589,16590,16591,16592,16593,16594,16595,16596,16597,16598,16599,16600,16601,16602,16603,16604,16605,16606,16607,16608,16609,16610,16611,16612,16613,16614,16615,16616,16617,16618,16619,16620,16621,16622,16623,16624,16625,16626,16627,16628,16629,16630,16631,16632,16633,16634,16635,16636,16637,16638,16639,16640,16641,16642,16643,16644,16645,16646,16647,16648,16649,16650,16651,16652,16653,16654,16655,16656,16657,16658,16659,16660,16661,16662,16663,16664,16665,16666,16667,16668,16669,16670,16671,16672,16673,16674,16675,16676,16677,16678,16679,16680,16681,16682,16683,16684,16685,16686,16687,16688,16689,16690,16691,16692,16693,16694,16695,16696,16697,16698,16699,16700,16701,16702,16703,16704,16705,16706,16707,16708,16709,16710,16711,16712,16713,16714,16715,16716,16717,16718,16719,16720,16721,16722,16723,16724,16725,16726,16727,16728,16729,16730,16731,16732,16733,16734,16735,16736,16737,16738,16739,16740,16741,16742,16743,16744,16745,16746,16747,16748,16749,16750,16751,16752,16753,16754,16755,16756,16757,16758,16759,16760,16761,16762,16763,16764,16765,16766,16767,16768,16769,16770,16771,16772,16773,16774,16775,16776,16777,16778,16779,16780,16781,16782,16783,16784,16785,16786,16787,16788,16789,16790,16791,16792,16793,16794,16795,16796,16797,16798,16799,16800,16801,16802,16803,16804,16805,16806,16807,16808,16809,16810,16811,16812,16813,16814,16815,16816,16817,16818,16819,16820,16821,16822,16823,16824,16825,16826,16827,16828,16829,16830,16831,16832,16833,16834,16835,16836,16837,16838,16839,16840,16841,16842,16843,16844,16845,16846,16847,16848,16849,16850,16851,16852,16853,16854,16855,16856,16857,16858,16859,16860,16861,16862,16863,16864,16865,16866,16867,16868,16869,16870,16871,16872,16873,16874,16875,16876,16877,16878,16879,16880,16881,16882,16883,16884,16885,16886,16887,16888,16889,16890,16891,16892,16893,16894,16895,16896,16897,16898,16899,16900,16901,16902,16903,16904,16905,16906,16907,16908,16909,16910,16911,16912,16913,16914,16915,16916,16917,16918,16919,16920,16921,16922,16923,16924,16925,16926,16927,16928,16929,16930,16931,16932,16933,16934,16935,16936,16937,16938,16939,16940,16941,16942,16943,16944,16945,16946,16947,16948,16949,16950,16951,16952,16953,16954,16955,16956,16957,16958,16959,16960,16961,16962,16963,16964,16965,16966,16967,16968,16969,16970,16971,16972,16973,16974,16975,16976,16977,16978,16979,16980,16981,16982,16983,16984,16985,16986,16987,16988,16989,16990,16991,16992,16993,16994,16995,16996,16997,16998,16999,17000,17001,17002,17003,17004,17005,17006,17007,17008,17009,17010,17011,17012,17013,17014,17015,17016,17017,17018,17019,17020,17021,17022,17023,17024,17025,17026,17027,17028,17029,17030,17031,17032,17033,17034,17035,17036,17037,17038,17039,17040,17041,17042,17043,17044,17045,17046,17047,17048,17049,17050,17051,17052,17053,17054,17055,17056,17057,17058,17059,17060,17061,17062,17063,17064,17065,17066,17067,17068,17069,17070,17071,17072,17073,17074,17075,17076,17077,17078,17079,17080,17081,17082,17083,17084,17085,17086,17087,17088,17089,17090,17091,17092,17093,17094,17095,17096,17097,17098,17099,17100,17101,17102,17103,17104,17105,17106,17107,17108,17109,17110,17111,17112,17113,17114,17115,17116,17117,17118,17119,17120,17121,17122,17123,17124,17125,17126,17127,17128,17129,17130,17131,17132,17133,17134,17135,17136,17137,17138,17139,17140,17141,17142,17143,17144,17145,17146,17147,17148,17149,17150,17151,17152,17153,17154,17155,17156,17157,17158,17159,17160,17161,17162,17163,17164,17165,17166,17167,17168,17169,17170,17171,17172,17173,17174,17175,17176,17177,17178,17179,17180,17181,17182,17183,17184,17185,17186,17187,17188,17189,17190,17191,17192,17193,17194,17195,17196,17197,17198,17199,17200,17201,17202,17203,17204,17205,17206,17207,17208,17209,17210,17211,17212,17213,17214,17215,17216,17217,17218,17219,17220,17221,17222,17223,17224,17225,17226,17227,17228,17229,17230,17231,17232,17233,17234,17235,17236,17237,17238,17239,17240,17241,17242,17243,17244,17245,17246,17247,17248,17249,17250,17251,17252,17253,17254,17255,17256,17257,17258,17259,17260,17261,17262,17263,17264,17265,17266,17267,17268,17269,17270,17271,17272,17273,17274,17275,17276,17277,17278,17279,17280,17281,17282,17283,17284,17285,17286,17287,17288,17289,17290,17291,17292,17293,17294,17295,17296,17297,17298,17299,17300,17301,17302,17303,17304,17305,17306,17307,17308,17309,17310,17311,17312,17313,17314,17315,17316,17317,17318,17319,17320,17321,17322,17323,17324,17325,17326,17327,17328,17329,17330,17331,17332,17333,17334,17335,17336,17337,17338,17339,17340,17341,17342,17343,17344,17345,17346,17347,17348,17349,17350,17351,17352,17353,17354,17355,17356,17357,17358,17359,17360,17361,17362,17363,17364,17365,17366,17367,17368,17369,17370,17371,17372,17373,17374,17375,17376,17377,17378,17379,17380,17381,17382,17383,17384,17385,17386,17387,17388,17389,17390,17391,17392,17393,17394,17395,17396,17397,17398,17399,17400,17401,17402,17403,17404,17405,17406,17407,17408,17409,17410,17411,17412,17413,17414,17415,17416,17417,17418,17419,17420,17421,17422,17423,17424,17425,17426,17427,17428,17429,17430,17431,17432,17433,17434,17435,17436,17437,17438,17439,17440,17441,17442,17443,17444,17445,17446,17447,17448,17449,17450,17451,17452,17453,17454,17455,17456,17457,17458,17459,17460,17461,17462,17463,17464,17465,17466,17467,17468,17469,17470,17471,17472,17473,17474,17475,17476,17477,17478,17479,17480,17481,17482,17483,17484,17485,17486,17487,17488,17489,17490,17491,17492,17493,17494,17495,17496,17497,17498,17499,17500,17501,17502,17503,17504,17505,17506,17507,17508,17509,17510,17511,17512,17513,17514,17515,17516,17517,17518,17519,17520,17521,17522,17523,17524,17525,17526,17527,17528,17529,17530,17531,17532,17533,17534,17535,17536,17537,17538,17539,17540,17541,17542,17543,17544,17545,17546,17547,17548,17549,17550,17551,17552,17553,17554,17555,17556,17557,17558,17559,17560,17561,17562,17563,17564,17565,17566,17567,17568,17569,17570,17571,17572,17573,17574,17575,17576,17577,17578,17579,17580,17581,17582,17583,17584,17585,17586,17587,17588,17589,17590,17591,17592,17593,17594,17595,17596,17597,17598,17599,17600,17601,17602,17603,17604,17605,17606,17607,17608,17609,17610,17611,17612,17613,17614,17615,17616,17617,17618,17619,17620,17621,17622,17623,17624,17625,17626,17627,17628,17629,17630,17631,17632,17633,17634,17635,17636,17637,17638,17639,17640,17641,17642,17643,17644,17645,17646,17647,17648,17649,17650,17651,17652,17653,17654,17655,17656,17657,17658,17659,17660,17661,17662,17663,17664,17665,17666,17667,17668,17669,17670,17671,17672,17673,17674,17675,17676,17677,17678,17679,17680,17681,17682,17683,17684,17685,17686,17687,17688,17689,17690,17691,17692,17693,17694,17695,17696,17697,17698,17699,17700,17701,17702,17703,17704,17705,17706,17707,17708,17709,17710,17711,17712,17713,17714,17715,17716,17717,17718,17719,17720,17721,17722,17723,17724,17725,17726,17727,17728,17729,17730,17731,17732,17733,17734,17735,17736,17737,17738,17739,17740,17741,17742,17743,17744,17745,17746,17747,17748,17749,17750,17751,17752,17753,17754,17755,17756,17757,17758,17759,17760,17761,17762,17763,17764,17765,17766,17767,17768,17769,17770,17771,17772,17773,17774,17775,17776,17777,17778,17779,17780,17781,17782,17783,17784,17785,17786,17787,17788,17789,17790,17791,17792,17793,17794,17795,17796,17797,17798,17799,17800,17801,17802,17803,17804,17805,17806,17807,17808,17809,17810,17811,17812,17813,17814,17815,17816,17817,17818,17819,17820,17821,17822,17823,17824,17825,17826,17827,17828,17829,17830,17831,17832,17833,17834,17835,17836,17837,17838,17839,17840,17841,17842,17843,17844,17845,17846,17847,17848,17849,17850,17851,17852,17853,17854,17855,17856,17857,17858,17859,17860,17861,17862,17863,17864,17865,17866,17867,17868,17869,17870,17871,17872,17873,17874,17875,17876,17877,17878,17879,17880,17881,17882,17883,17884,17885,17886,17887,17888,17889,17890,17891,17892,17893,17894,17895,17896,17897,17898,17899,17900,17901,17902,17903,17904,17905,17906,17907,17908,17909,17910,17911,17912,17913,17914,17915,17916,17917,17918,17919,17920,17921,17922,17923,17924,17925,17926,17927,17928,17929,17930,17931,17932,17933,17934,17935,17936,17937,17938,17939,17940,17941,17942,17943,17944,17945,17946,17947,17948,17949,17950,17951,17952,17953,17954,17955,17956,17957,17958,17959,17960,17961,17962,17963,17964,17965,17966,17967,17968,17969,17970,17971,17972,17973,17974,17975,17976,17977,17978,17979,17980,17981,17982,17983,17984,17985,17986,17987,17988,17989,17990,17991,17992,17993,17994,17995,17996,17997,17998,17999,18000,18001,18002,18003,18004,18005,18006,18007,18008,18009,18010,18011,18012,18013,18014,18015,18016,18017,18018,18019,18020,18021,18022,18023,18024,18025,18026,18027,18028,18029,18030,18031,18032,18033,18034,18035,18036,18037,18038,18039,18040,18041,18042,18043,18044,18045,18046,18047,18048,18049,18050,18051,18052,18053,18054,18055,18056,18057,18058,18059,18060,18061,18062,18063,18064,18065,18066,18067,18068,18069,18070,18071,18072,18073,18074,18075,18076,18077,18078,18079,18080,18081,18082,18083,18084,18085,18086,18087,18088,18089,18090,18091,18092,18093,18094,18095,18096,18097,18098,18099,18100,18101,18102,18103,18104,18105,18106,18107,18108,18109,18110,18111,18112,18113,18114,18115,18116,18117,18118,18119,18120,18121,18122,18123,18124,18125,18126,18127,18128,18129,18130,18131,18132,18133,18134,18135,18136,18137,18138,18139,18140,18141,18142,18143,18144,18145,18146,18147,18148,18149,18150,18151,18152,18153,18154,18155,18156,18157,18158,18159,18160,18161,18162,18163,18164,18165,18166,18167,18168,18169,18170,18171,18172,18173,18174,18175,18176,18177,18178,18179,18180,18181,18182,18183,18184,18185,18186,18187,18188,18189,18190,18191,18192,18193,18194,18195,18196,18197,18198,18199,18200,18201,18202,18203,18204,18205,18206,18207,18208,18209,18210,18211,18212,18213,18214,18215,18216,18217,18218,18219,18220,18221,18222,18223,18224,18225,18226,18227,18228,18229,18230,18231,18232,18233,18234,18235,18236,18237,18238,18239,18240,18241,18242,18243,18244,18245,18246,18247,18248,18249,18250,18251,18252,18253,18254,18255,18256,18257,18258,18259,18260,18261,18262,18263,18264,18265,18266,18267,18268,18269,18270,18271,18272,18273,18274,18275,18276,18277,18278,18279,18280,18281,18282,18283,18284,18285,18286,18287,18288,18289,18290,18291,18292,18293,18294,18295,18296,18297,18298,18299,18300,18301,18302,18303,18304,18305,18306,18307,18308,18309,18310,18311,18312,18313,18314,18315,18316,18317,18318,18319,18320,18321,18322,18323,18324,18325,18326,18327,18328,18329,18330,18331,18332,18333,18334,18335,18336,18337,18338,18339,18340,18341,18342,18343,18344,18345,18346,18347,18348,18349,18350,18351,18352,18353,18354,18355,18356,18357,18358,18359,18360,18361,18362,18363,18364,18365,18366,18367,18368,18369,18370,18371,18372,18373,18374,18375,18376,18377,18378,18379,18380,18381,18382,18383,18384,18385,18386,18387,18388,18389,18390,18391,18392,18393,18394,18395,18396,18397,18398,18399,18400,18401,18402,18403,18404,18405,18406,18407,18408,18409,18410,18411,18412,18413,18414,18415,18416,18417,18418,18419,18420,18421,18422,18423,18424,18425,18426,18427,18428,18429,18430,18431,18432,18433,18434,18435,18436,18437,18438,18439,18440,18441,18442,18443,18444,18445,18446,18447,18448,18449,18450,18451,18452,18453,18454,18455,18456,18457,18458,18459,18460,18461,18462,18463,18464,18465,18466,18467,18468,18469,18470,18471,18472,18473,18474,18475,18476,18477,18478,18479,18480,18481,18482,18483,18484,18485,18486,18487,18488,18489,18490,18491,18492,18493,18494,18495,18496,18497,18498,18499,18500,18501,18502,18503,18504,18505,18506,18507,18508,18509,18510,18511,18512,18513,18514,18515,18516,18517,18518,18519,18520,18521,18522,18523,18524,18525,18526,18527,18528,18529,18530,18531,18532,18533,18534,18535,18536,18537,18538,18539,18540,18541,18542,18543,18544,18545,18546,18547,18548,18549,18550,18551,18552,18553,18554,18555,18556,18557,18558,18559,18560,18561,18562,18563,18564,18565,18566,18567,18568,18569,18570,18571,18572,18573,18574,18575,18576,18577,18578,18579,18580,18581,18582,18583,18584,18585,18586,18587,18588,18589,18590,18591,18592,18593,18594,18595,18596,18597,18598,18599,18600,18601,18602,18603,18604,18605,18606,18607,18608,18609,18610,18611,18612,18613,18614,18615,18616,18617,18618,18619,18620,18621,18622,18623,18624,18625,18626,18627,18628,18629,18630,18631,18632,18633,18634,18635,18636,18637,18638,18639,18640,18641,18642,18643,18644,18645,18646,18647,18648,18649,18650,18651,18652,18653,18654,18655,18656,18657,18658,18659,18660,18661,18662,18663,18664,18665,18666,18667,18668,18669,18670,18671,18672,18673,18674,18675,18676,18677,18678,18679,18680,18681,18682,18683,18684,18685,18686,18687,18688,18689,18690,18691,18692,18693,18694,18695,18696,18697,18698,18699,18700,18701,18702,18703,18704,18705,18706,18707,18708,18709,18710,18711,18712,18713,18714,18715,18716,18717,18718,18719,18720,18721,18722,18723,18724,18725,18726,18727,18728,18729,18730,18731,18732,18733,18734,18735,18736,18737,18738,18739,18740,18741,18742,18743,18744,18745,18746,18747,18748,18749,18750,18751,18752,18753,18754,18755,18756,18757,18758,18759,18760,18761,18762,18763,18764,18765,18766,18767,18768,18769,18770,18771,18772,18773,18774,18775,18776,18777,18778,18779,18780,18781,18782,18783,18784,18785,18786,18787,18788,18789,18790,18791,18792,18793,18794,18795,18796,18797,18798,18799,18800,18801,18802,18803,18804,18805,18806,18807,18808,18809,18810,18811,18812,18813,18814,18815,18816,18817,18818,18819,18820,18821,18822,18823,18824,18825,18826,18827,18828,18829,18830,18831,18832,18833,18834,18835,18836,18837,18838,18839,18840,18841,18842,18843,18844,18845,18846,18847,18848,18849,18850,18851,18852,18853,18854,18855,18856,18857,18858,18859,18860,18861,18862,18863,18864,18865,18866,18867,18868,18869,18870,18871,18872,18873,18874,18875,18876,18877,18878,18879,18880,18881,18882,18883,18884,18885,18886,18887,18888,18889,18890,18891,18892,18893,18894,18895,18896,18897,18898,18899,18900,18901,18902,18903,18904,18905,18906,18907,18908,18909,18910,18911,18912,18913,18914,18915,18916,18917,18918,18919,18920,18921,18922,18923,18924,18925,18926,18927,18928,18929,18930,18931,18932,18933,18934,18935,18936,18937,18938,18939,18940,18941,18942,18943,18944,18945,18946,18947,18948,18949,18950,18951,18952,18953,18954,18955,18956,18957,18958,18959,18960,18961,18962,18963,18964,18965,18966,18967,18968,18969,18970,18971,18972,18973,18974,18975,18976,18977,18978,18979,18980,18981,18982,18983,18984,18985,18986,18987,18988,18989,18990,18991,18992,18993,18994,18995,18996,18997,18998,18999,19000,19001,19002,19003,19004,19005,19006,19007,19008,19009,19010,19011,19012,19013,19014,19015,19016,19017,19018,19019,19020,19021,19022,19023,19024,19025,19026,19027,19028,19029,19030,19031,19032,19033,19034,19035,19036,19037,19038,19039,19040,19041,19042,19043,19044,19045,19046,19047,19048,19049,19050,19051,19052,19053,19054,19055,19056,19057,19058,19059,19060,19061,19062,19063,19064,19065,19066,19067,19068,19069,19070,19071,19072,19073,19074,19075,19076,19077,19078,19079,19080,19081,19082,19083,19084,19085,19086,19087,19088,19089,19090,19091,19092,19093,19094,19095,19096,19097,19098,19099,19100,19101,19102,19103,19104,19105,19106,19107,19108,19109,19110,19111,19112,19113,19114,19115,19116,19117,19118,19119,19120,19121,19122,19123,19124,19125,19126,19127,19128,19129,19130,19131,19132,19133,19134,19135,19136,19137,19138,19139,19140,19141,19142,19143,19144,19145,19146,19147,19148,19149,19150,19151,19152,19153,19154,19155,19156,19157,19158,19159,19160,19161,19162,19163,19164,19165,19166,19167,19168,19169,19170,19171,19172,19173,19174,19175,19176,19177,19178,19179,19180,19181,19182,19183,19184,19185,19186,19187,19188,19189,19190,19191,19192,19193,19194,19195,19196,19197,19198,19199,19200,19201,19202,19203,19204,19205,19206,19207,19208,19209,19210,19211,19212,19213,19214,19215,19216,19217,19218,19219,19220,19221,19222,19223,19224,19225,19226,19227,19228,19229,19230,19231,19232,19233,19234,19235,19236,19237,19238,19239,19240,19241,19242,19243,19244,19245,19246,19247,19248,19249,19250,19251,19252,19253,19254,19255,19256,19257,19258,19259,19260,19261,19262,19263,19264,19265,19266,19267,19268,19269,19270,19271,19272,19273,19274,19275,19276,19277,19278,19279,19280,19281,19282,19283,19284,19285,19286,19287,19288,19289,19290,19291,19292,19293,19294,19295,19296,19297,19298,19299,19300,19301,19302,19303,19304,19305,19306,19307,19308,19309,19310,19311,19312,19313,19314,19315,19316,19317,19318,19319,19320,19321,19322,19323,19324,19325,19326,19327,19328,19329,19330,19331,19332,19333,19334,19335,19336,19337,19338,19339,19340,19341,19342,19343,19344,19345,19346,19347,19348,19349,19350,19351,19352,19353,19354,19355,19356,19357,19358,19359,19360,19361,19362,19363,19364,19365,19366,19367,19368,19369,19370,19371,19372,19373,19374,19375,19376,19377,19378,19379,19380,19381,19382,19383,19384,19385,19386,19387,19388,19389,19390,19391,19392,19393,19394,19395,19396,19397,19398,19399,19400,19401,19402,19403,19404,19405,19406,19407,19408,19409,19410,19411,19412,19413,19414,19415,19416,19417,19418,19419,19420,19421,19422,19423,19424,19425,19426,19427,19428,19429,19430,19431,19432,19433,19434,19435,19436,19437,19438,19439,19440,19441,19442,19443,19444,19445,19446,19447,19448,19449,19450,19451,19452,19453,19454,19455,19456,19457,19458,19459,19460,19461,19462,19463,19464,19465,19466,19467,19468,19469,19470,19471,19472,19473,19474,19475,19476,19477,19478,19479,19480,19481,19482,19483,19484,19485,19486,19487,19488,19489,19490,19491,19492,19493,19494,19495,19496,19497,19498,19499,19500,19501,19502,19503,19504,19505,19506,19507,19508,19509,19510,19511,19512,19513,19514,19515,19516,19517,19518,19519,19520,19521,19522,19523,19524,19525,19526,19527,19528,19529,19530,19531,19532,19533,19534,19535,19536,19537,19538,19539,19540,19541,19542,19543,19544,19545,19546,19547,19548,19549,19550,19551,19552,19553,19554,19555,19556,19557,19558,19559,19560,19561,19562,19563,19564,19565,19566,19567,19568,19569,19570,19571,19572,19573,19574,19575,19576,19577,19578,19579,19580,19581,19582,19583,19584,19585,19586,19587,19588,19589,19590,19591,19592,19593,19594,19595,19596,19597,19598,19599,19600,19601,19602,19603,19604,19605,19606,19607,19608,19609,19610,19611,19612,19613,19614,19615,19616,19617,19618,19619,19620,19621,19622,19623,19624,19625,19626,19627,19628,19629,19630,19631,19632,19633,19634,19635,19636,19637,19638,19639,19640,19641,19642,19643,19644,19645,19646,19647,19648,19649,19650,19651,19652,19653,19654,19655,19656,19657,19658,19659,19660,19661,19662,19663,19664,19665,19666,19667,19668,19669,19670,19671,19672,19673,19674,19675,19676,19677,19678,19679,19680,19681,19682,19683,19684,19685,19686,19687,19688,19689,19690,19691,19692,19693,19694,19695,19696,19697,19698,19699,19700,19701,19702,19703,19704,19705,19706,19707,19708,19709,19710,19711,19712,19713,19714,19715,19716,19717,19718,19719,19720,19721,19722,19723,19724,19725,19726,19727,19728,19729,19730,19731,19732,19733,19734,19735,19736,19737,19738,19739,19740,19741,19742,19743,19744,19745,19746,19747,19748,19749,19750,19751,19752,19753,19754,19755,19756,19757,19758,19759,19760,19761,19762,19763,19764,19765,19766,19767,19768,19769,19770,19771,19772,19773,19774,19775,19776,19777,19778,19779,19780,19781,19782,19783,19784,19785,19786,19787,19788,19789,19790,19791,19792,19793,19794,19795,19796,19797,19798,19799,19800,19801,19802,19803,19804,19805,19806,19807,19808,19809,19810,19811,19812,19813,19814,19815,19816,19817,19818,19819,19820,19821,19822,19823,19824,19825,19826,19827,19828,19829,19830,19831,19832,19833,19834,19835,19836,19837,19838,19839,19840,19841,19842,19843,19844,19845,19846,19847,19848,19849,19850,19851,19852,19853,19854,19855,19856,19857,19858,19859,19860,19861,19862,19863,19864,19865,19866,19867,19868,19869,19870,19871,19872,19873,19874,19875,19876,19877,19878,19879,19880,19881,19882,19883,19884,19885,19886,19887,19888,19889,19890,19891,19892,19893,19968,19969,19970,19971,19972,19973,19974,19975,19976,19977,19978,19979,19980,19981,19982,19983,19984,19985,19986,19987,19988,19989,19990,19991,19992,19993,19994,19995,19996,19997,19998,19999,20000,20001,20002,20003,20004,20005,20006,20007,20008,20009,20010,20011,20012,20013,20014,20015,20016,20017,20018,20019,20020,20021,20022,20023,20024,20025,20026,20027,20028,20029,20030,20031,20032,20033,20034,20035,20036,20037,20038,20039,20040,20041,20042,20043,20044,20045,20046,20047,20048,20049,20050,20051,20052,20053,20054,20055,20056,20057,20058,20059,20060,20061,20062,20063,20064,20065,20066,20067,20068,20069,20070,20071,20072,20073,20074,20075,20076,20077,20078,20079,20080,20081,20082,20083,20084,20085,20086,20087,20088,20089,20090,20091,20092,20093,20094,20095,20096,20097,20098,20099,20100,20101,20102,20103,20104,20105,20106,20107,20108,20109,20110,20111,20112,20113,20114,20115,20116,20117,20118,20119,20120,20121,20122,20123,20124,20125,20126,20127,20128,20129,20130,20131,20132,20133,20134,20135,20136,20137,20138,20139,20140,20141,20142,20143,20144,20145,20146,20147,20148,20149,20150,20151,20152,20153,20154,20155,20156,20157,20158,20159,20160,20161,20162,20163,20164,20165,20166,20167,20168,20169,20170,20171,20172,20173,20174,20175,20176,20177,20178,20179,20180,20181,20182,20183,20184,20185,20186,20187,20188,20189,20190,20191,20192,20193,20194,20195,20196,20197,20198,20199,20200,20201,20202,20203,20204,20205,20206,20207,20208,20209,20210,20211,20212,20213,20214,20215,20216,20217,20218,20219,20220,20221,20222,20223,20224,20225,20226,20227,20228,20229,20230,20231,20232,20233,20234,20235,20236,20237,20238,20239,20240,20241,20242,20243,20244,20245,20246,20247,20248,20249,20250,20251,20252,20253,20254,20255,20256,20257,20258,20259,20260,20261,20262,20263,20264,20265,20266,20267,20268,20269,20270,20271,20272,20273,20274,20275,20276,20277,20278,20279,20280,20281,20282,20283,20284,20285,20286,20287,20288,20289,20290,20291,20292,20293,20294,20295,20296,20297,20298,20299,20300,20301,20302,20303,20304,20305,20306,20307,20308,20309,20310,20311,20312,20313,20314,20315,20316,20317,20318,20319,20320,20321,20322,20323,20324,20325,20326,20327,20328,20329,20330,20331,20332,20333,20334,20335,20336,20337,20338,20339,20340,20341,20342,20343,20344,20345,20346,20347,20348,20349,20350,20351,20352,20353,20354,20355,20356,20357,20358,20359,20360,20361,20362,20363,20364,20365,20366,20367,20368,20369,20370,20371,20372,20373,20374,20375,20376,20377,20378,20379,20380,20381,20382,20383,20384,20385,20386,20387,20388,20389,20390,20391,20392,20393,20394,20395,20396,20397,20398,20399,20400,20401,20402,20403,20404,20405,20406,20407,20408,20409,20410,20411,20412,20413,20414,20415,20416,20417,20418,20419,20420,20421,20422,20423,20424,20425,20426,20427,20428,20429,20430,20431,20432,20433,20434,20435,20436,20437,20438,20439,20440,20441,20442,20443,20444,20445,20446,20447,20448,20449,20450,20451,20452,20453,20454,20455,20456,20457,20458,20459,20460,20461,20462,20463,20464,20465,20466,20467,20468,20469,20470,20471,20472,20473,20474,20475,20476,20477,20478,20479,20480,20481,20482,20483,20484,20485,20486,20487,20488,20489,20490,20491,20492,20493,20494,20495,20496,20497,20498,20499,20500,20501,20502,20503,20504,20505,20506,20507,20508,20509,20510,20511,20512,20513,20514,20515,20516,20517,20518,20519,20520,20521,20522,20523,20524,20525,20526,20527,20528,20529,20530,20531,20532,20533,20534,20535,20536,20537,20538,20539,20540,20541,20542,20543,20544,20545,20546,20547,20548,20549,20550,20551,20552,20553,20554,20555,20556,20557,20558,20559,20560,20561,20562,20563,20564,20565,20566,20567,20568,20569,20570,20571,20572,20573,20574,20575,20576,20577,20578,20579,20580,20581,20582,20583,20584,20585,20586,20587,20588,20589,20590,20591,20592,20593,20594,20595,20596,20597,20598,20599,20600,20601,20602,20603,20604,20605,20606,20607,20608,20609,20610,20611,20612,20613,20614,20615,20616,20617,20618,20619,20620,20621,20622,20623,20624,20625,20626,20627,20628,20629,20630,20631,20632,20633,20634,20635,20636,20637,20638,20639,20640,20641,20642,20643,20644,20645,20646,20647,20648,20649,20650,20651,20652,20653,20654,20655,20656,20657,20658,20659,20660,20661,20662,20663,20664,20665,20666,20667,20668,20669,20670,20671,20672,20673,20674,20675,20676,20677,20678,20679,20680,20681,20682,20683,20684,20685,20686,20687,20688,20689,20690,20691,20692,20693,20694,20695,20696,20697,20698,20699,20700,20701,20702,20703,20704,20705,20706,20707,20708,20709,20710,20711,20712,20713,20714,20715,20716,20717,20718,20719,20720,20721,20722,20723,20724,20725,20726,20727,20728,20729,20730,20731,20732,20733,20734,20735,20736,20737,20738,20739,20740,20741,20742,20743,20744,20745,20746,20747,20748,20749,20750,20751,20752,20753,20754,20755,20756,20757,20758,20759,20760,20761,20762,20763,20764,20765,20766,20767,20768,20769,20770,20771,20772,20773,20774,20775,20776,20777,20778,20779,20780,20781,20782,20783,20784,20785,20786,20787,20788,20789,20790,20791,20792,20793,20794,20795,20796,20797,20798,20799,20800,20801,20802,20803,20804,20805,20806,20807,20808,20809,20810,20811,20812,20813,20814,20815,20816,20817,20818,20819,20820,20821,20822,20823,20824,20825,20826,20827,20828,20829,20830,20831,20832,20833,20834,20835,20836,20837,20838,20839,20840,20841,20842,20843,20844,20845,20846,20847,20848,20849,20850,20851,20852,20853,20854,20855,20856,20857,20858,20859,20860,20861,20862,20863,20864,20865,20866,20867,20868,20869,20870,20871,20872,20873,20874,20875,20876,20877,20878,20879,20880,20881,20882,20883,20884,20885,20886,20887,20888,20889,20890,20891,20892,20893,20894,20895,20896,20897,20898,20899,20900,20901,20902,20903,20904,20905,20906,20907,20908,20909,20910,20911,20912,20913,20914,20915,20916,20917,20918,20919,20920,20921,20922,20923,20924,20925,20926,20927,20928,20929,20930,20931,20932,20933,20934,20935,20936,20937,20938,20939,20940,20941,20942,20943,20944,20945,20946,20947,20948,20949,20950,20951,20952,20953,20954,20955,20956,20957,20958,20959,20960,20961,20962,20963,20964,20965,20966,20967,20968,20969,20970,20971,20972,20973,20974,20975,20976,20977,20978,20979,20980,20981,20982,20983,20984,20985,20986,20987,20988,20989,20990,20991,20992,20993,20994,20995,20996,20997,20998,20999,21000,21001,21002,21003,21004,21005,21006,21007,21008,21009,21010,21011,21012,21013,21014,21015,21016,21017,21018,21019,21020,21021,21022,21023,21024,21025,21026,21027,21028,21029,21030,21031,21032,21033,21034,21035,21036,21037,21038,21039,21040,21041,21042,21043,21044,21045,21046,21047,21048,21049,21050,21051,21052,21053,21054,21055,21056,21057,21058,21059,21060,21061,21062,21063,21064,21065,21066,21067,21068,21069,21070,21071,21072,21073,21074,21075,21076,21077,21078,21079,21080,21081,21082,21083,21084,21085,21086,21087,21088,21089,21090,21091,21092,21093,21094,21095,21096,21097,21098,21099,21100,21101,21102,21103,21104,21105,21106,21107,21108,21109,21110,21111,21112,21113,21114,21115,21116,21117,21118,21119,21120,21121,21122,21123,21124,21125,21126,21127,21128,21129,21130,21131,21132,21133,21134,21135,21136,21137,21138,21139,21140,21141,21142,21143,21144,21145,21146,21147,21148,21149,21150,21151,21152,21153,21154,21155,21156,21157,21158,21159,21160,21161,21162,21163,21164,21165,21166,21167,21168,21169,21170,21171,21172,21173,21174,21175,21176,21177,21178,21179,21180,21181,21182,21183,21184,21185,21186,21187,21188,21189,21190,21191,21192,21193,21194,21195,21196,21197,21198,21199,21200,21201,21202,21203,21204,21205,21206,21207,21208,21209,21210,21211,21212,21213,21214,21215,21216,21217,21218,21219,21220,21221,21222,21223,21224,21225,21226,21227,21228,21229,21230,21231,21232,21233,21234,21235,21236,21237,21238,21239,21240,21241,21242,21243,21244,21245,21246,21247,21248,21249,21250,21251,21252,21253,21254,21255,21256,21257,21258,21259,21260,21261,21262,21263,21264,21265,21266,21267,21268,21269,21270,21271,21272,21273,21274,21275,21276,21277,21278,21279,21280,21281,21282,21283,21284,21285,21286,21287,21288,21289,21290,21291,21292,21293,21294,21295,21296,21297,21298,21299,21300,21301,21302,21303,21304,21305,21306,21307,21308,21309,21310,21311,21312,21313,21314,21315,21316,21317,21318,21319,21320,21321,21322,21323,21324,21325,21326,21327,21328,21329,21330,21331,21332,21333,21334,21335,21336,21337,21338,21339,21340,21341,21342,21343,21344,21345,21346,21347,21348,21349,21350,21351,21352,21353,21354,21355,21356,21357,21358,21359,21360,21361,21362,21363,21364,21365,21366,21367,21368,21369,21370,21371,21372,21373,21374,21375,21376,21377,21378,21379,21380,21381,21382,21383,21384,21385,21386,21387,21388,21389,21390,21391,21392,21393,21394,21395,21396,21397,21398,21399,21400,21401,21402,21403,21404,21405,21406,21407,21408,21409,21410,21411,21412,21413,21414,21415,21416,21417,21418,21419,21420,21421,21422,21423,21424,21425,21426,21427,21428,21429,21430,21431,21432,21433,21434,21435,21436,21437,21438,21439,21440,21441,21442,21443,21444,21445,21446,21447,21448,21449,21450,21451,21452,21453,21454,21455,21456,21457,21458,21459,21460,21461,21462,21463,21464,21465,21466,21467,21468,21469,21470,21471,21472,21473,21474,21475,21476,21477,21478,21479,21480,21481,21482,21483,21484,21485,21486,21487,21488,21489,21490,21491,21492,21493,21494,21495,21496,21497,21498,21499,21500,21501,21502,21503,21504,21505,21506,21507,21508,21509,21510,21511,21512,21513,21514,21515,21516,21517,21518,21519,21520,21521,21522,21523,21524,21525,21526,21527,21528,21529,21530,21531,21532,21533,21534,21535,21536,21537,21538,21539,21540,21541,21542,21543,21544,21545,21546,21547,21548,21549,21550,21551,21552,21553,21554,21555,21556,21557,21558,21559,21560,21561,21562,21563,21564,21565,21566,21567,21568,21569,21570,21571,21572,21573,21574,21575,21576,21577,21578,21579,21580,21581,21582,21583,21584,21585,21586,21587,21588,21589,21590,21591,21592,21593,21594,21595,21596,21597,21598,21599,21600,21601,21602,21603,21604,21605,21606,21607,21608,21609,21610,21611,21612,21613,21614,21615,21616,21617,21618,21619,21620,21621,21622,21623,21624,21625,21626,21627,21628,21629,21630,21631,21632,21633,21634,21635,21636,21637,21638,21639,21640,21641,21642,21643,21644,21645,21646,21647,21648,21649,21650,21651,21652,21653,21654,21655,21656,21657,21658,21659,21660,21661,21662,21663,21664,21665,21666,21667,21668,21669,21670,21671,21672,21673,21674,21675,21676,21677,21678,21679,21680,21681,21682,21683,21684,21685,21686,21687,21688,21689,21690,21691,21692,21693,21694,21695,21696,21697,21698,21699,21700,21701,21702,21703,21704,21705,21706,21707,21708,21709,21710,21711,21712,21713,21714,21715,21716,21717,21718,21719,21720,21721,21722,21723,21724,21725,21726,21727,21728,21729,21730,21731,21732,21733,21734,21735,21736,21737,21738,21739,21740,21741,21742,21743,21744,21745,21746,21747,21748,21749,21750,21751,21752,21753,21754,21755,21756,21757,21758,21759,21760,21761,21762,21763,21764,21765,21766,21767,21768,21769,21770,21771,21772,21773,21774,21775,21776,21777,21778,21779,21780,21781,21782,21783,21784,21785,21786,21787,21788,21789,21790,21791,21792,21793,21794,21795,21796,21797,21798,21799,21800,21801,21802,21803,21804,21805,21806,21807,21808,21809,21810,21811,21812,21813,21814,21815,21816,21817,21818,21819,21820,21821,21822,21823,21824,21825,21826,21827,21828,21829,21830,21831,21832,21833,21834,21835,21836,21837,21838,21839,21840,21841,21842,21843,21844,21845,21846,21847,21848,21849,21850,21851,21852,21853,21854,21855,21856,21857,21858,21859,21860,21861,21862,21863,21864,21865,21866,21867,21868,21869,21870,21871,21872,21873,21874,21875,21876,21877,21878,21879,21880,21881,21882,21883,21884,21885,21886,21887,21888,21889,21890,21891,21892,21893,21894,21895,21896,21897,21898,21899,21900,21901,21902,21903,21904,21905,21906,21907,21908,21909,21910,21911,21912,21913,21914,21915,21916,21917,21918,21919,21920,21921,21922,21923,21924,21925,21926,21927,21928,21929,21930,21931,21932,21933,21934,21935,21936,21937,21938,21939,21940,21941,21942,21943,21944,21945,21946,21947,21948,21949,21950,21951,21952,21953,21954,21955,21956,21957,21958,21959,21960,21961,21962,21963,21964,21965,21966,21967,21968,21969,21970,21971,21972,21973,21974,21975,21976,21977,21978,21979,21980,21981,21982,21983,21984,21985,21986,21987,21988,21989,21990,21991,21992,21993,21994,21995,21996,21997,21998,21999,22000,22001,22002,22003,22004,22005,22006,22007,22008,22009,22010,22011,22012,22013,22014,22015,22016,22017,22018,22019,22020,22021,22022,22023,22024,22025,22026,22027,22028,22029,22030,22031,22032,22033,22034,22035,22036,22037,22038,22039,22040,22041,22042,22043,22044,22045,22046,22047,22048,22049,22050,22051,22052,22053,22054,22055,22056,22057,22058,22059,22060,22061,22062,22063,22064,22065,22066,22067,22068,22069,22070,22071,22072,22073,22074,22075,22076,22077,22078,22079,22080,22081,22082,22083,22084,22085,22086,22087,22088,22089,22090,22091,22092,22093,22094,22095,22096,22097,22098,22099,22100,22101,22102,22103,22104,22105,22106,22107,22108,22109,22110,22111,22112,22113,22114,22115,22116,22117,22118,22119,22120,22121,22122,22123,22124,22125,22126,22127,22128,22129,22130,22131,22132,22133,22134,22135,22136,22137,22138,22139,22140,22141,22142,22143,22144,22145,22146,22147,22148,22149,22150,22151,22152,22153,22154,22155,22156,22157,22158,22159,22160,22161,22162,22163,22164,22165,22166,22167,22168,22169,22170,22171,22172,22173,22174,22175,22176,22177,22178,22179,22180,22181,22182,22183,22184,22185,22186,22187,22188,22189,22190,22191,22192,22193,22194,22195,22196,22197,22198,22199,22200,22201,22202,22203,22204,22205,22206,22207,22208,22209,22210,22211,22212,22213,22214,22215,22216,22217,22218,22219,22220,22221,22222,22223,22224,22225,22226,22227,22228,22229,22230,22231,22232,22233,22234,22235,22236,22237,22238,22239,22240,22241,22242,22243,22244,22245,22246,22247,22248,22249,22250,22251,22252,22253,22254,22255,22256,22257,22258,22259,22260,22261,22262,22263,22264,22265,22266,22267,22268,22269,22270,22271,22272,22273,22274,22275,22276,22277,22278,22279,22280,22281,22282,22283,22284,22285,22286,22287,22288,22289,22290,22291,22292,22293,22294,22295,22296,22297,22298,22299,22300,22301,22302,22303,22304,22305,22306,22307,22308,22309,22310,22311,22312,22313,22314,22315,22316,22317,22318,22319,22320,22321,22322,22323,22324,22325,22326,22327,22328,22329,22330,22331,22332,22333,22334,22335,22336,22337,22338,22339,22340,22341,22342,22343,22344,22345,22346,22347,22348,22349,22350,22351,22352,22353,22354,22355,22356,22357,22358,22359,22360,22361,22362,22363,22364,22365,22366,22367,22368,22369,22370,22371,22372,22373,22374,22375,22376,22377,22378,22379,22380,22381,22382,22383,22384,22385,22386,22387,22388,22389,22390,22391,22392,22393,22394,22395,22396,22397,22398,22399,22400,22401,22402,22403,22404,22405,22406,22407,22408,22409,22410,22411,22412,22413,22414,22415,22416,22417,22418,22419,22420,22421,22422,22423,22424,22425,22426,22427,22428,22429,22430,22431,22432,22433,22434,22435,22436,22437,22438,22439,22440,22441,22442,22443,22444,22445,22446,22447,22448,22449,22450,22451,22452,22453,22454,22455,22456,22457,22458,22459,22460,22461,22462,22463,22464,22465,22466,22467,22468,22469,22470,22471,22472,22473,22474,22475,22476,22477,22478,22479,22480,22481,22482,22483,22484,22485,22486,22487,22488,22489,22490,22491,22492,22493,22494,22495,22496,22497,22498,22499,22500,22501,22502,22503,22504,22505,22506,22507,22508,22509,22510,22511,22512,22513,22514,22515,22516,22517,22518,22519,22520,22521,22522,22523,22524,22525,22526,22527,22528,22529,22530,22531,22532,22533,22534,22535,22536,22537,22538,22539,22540,22541,22542,22543,22544,22545,22546,22547,22548,22549,22550,22551,22552,22553,22554,22555,22556,22557,22558,22559,22560,22561,22562,22563,22564,22565,22566,22567,22568,22569,22570,22571,22572,22573,22574,22575,22576,22577,22578,22579,22580,22581,22582,22583,22584,22585,22586,22587,22588,22589,22590,22591,22592,22593,22594,22595,22596,22597,22598,22599,22600,22601,22602,22603,22604,22605,22606,22607,22608,22609,22610,22611,22612,22613,22614,22615,22616,22617,22618,22619,22620,22621,22622,22623,22624,22625,22626,22627,22628,22629,22630,22631,22632,22633,22634,22635,22636,22637,22638,22639,22640,22641,22642,22643,22644,22645,22646,22647,22648,22649,22650,22651,22652,22653,22654,22655,22656,22657,22658,22659,22660,22661,22662,22663,22664,22665,22666,22667,22668,22669,22670,22671,22672,22673,22674,22675,22676,22677,22678,22679,22680,22681,22682,22683,22684,22685,22686,22687,22688,22689,22690,22691,22692,22693,22694,22695,22696,22697,22698,22699,22700,22701,22702,22703,22704,22705,22706,22707,22708,22709,22710,22711,22712,22713,22714,22715,22716,22717,22718,22719,22720,22721,22722,22723,22724,22725,22726,22727,22728,22729,22730,22731,22732,22733,22734,22735,22736,22737,22738,22739,22740,22741,22742,22743,22744,22745,22746,22747,22748,22749,22750,22751,22752,22753,22754,22755,22756,22757,22758,22759,22760,22761,22762,22763,22764,22765,22766,22767,22768,22769,22770,22771,22772,22773,22774,22775,22776,22777,22778,22779,22780,22781,22782,22783,22784,22785,22786,22787,22788,22789,22790,22791,22792,22793,22794,22795,22796,22797,22798,22799,22800,22801,22802,22803,22804,22805,22806,22807,22808,22809,22810,22811,22812,22813,22814,22815,22816,22817,22818,22819,22820,22821,22822,22823,22824,22825,22826,22827,22828,22829,22830,22831,22832,22833,22834,22835,22836,22837,22838,22839,22840,22841,22842,22843,22844,22845,22846,22847,22848,22849,22850,22851,22852,22853,22854,22855,22856,22857,22858,22859,22860,22861,22862,22863,22864,22865,22866,22867,22868,22869,22870,22871,22872,22873,22874,22875,22876,22877,22878,22879,22880,22881,22882,22883,22884,22885,22886,22887,22888,22889,22890,22891,22892,22893,22894,22895,22896,22897,22898,22899,22900,22901,22902,22903,22904,22905,22906,22907,22908,22909,22910,22911,22912,22913,22914,22915,22916,22917,22918,22919,22920,22921,22922,22923,22924,22925,22926,22927,22928,22929,22930,22931,22932,22933,22934,22935,22936,22937,22938,22939,22940,22941,22942,22943,22944,22945,22946,22947,22948,22949,22950,22951,22952,22953,22954,22955,22956,22957,22958,22959,22960,22961,22962,22963,22964,22965,22966,22967,22968,22969,22970,22971,22972,22973,22974,22975,22976,22977,22978,22979,22980,22981,22982,22983,22984,22985,22986,22987,22988,22989,22990,22991,22992,22993,22994,22995,22996,22997,22998,22999,23000,23001,23002,23003,23004,23005,23006,23007,23008,23009,23010,23011,23012,23013,23014,23015,23016,23017,23018,23019,23020,23021,23022,23023,23024,23025,23026,23027,23028,23029,23030,23031,23032,23033,23034,23035,23036,23037,23038,23039,23040,23041,23042,23043,23044,23045,23046,23047,23048,23049,23050,23051,23052,23053,23054,23055,23056,23057,23058,23059,23060,23061,23062,23063,23064,23065,23066,23067,23068,23069,23070,23071,23072,23073,23074,23075,23076,23077,23078,23079,23080,23081,23082,23083,23084,23085,23086,23087,23088,23089,23090,23091,23092,23093,23094,23095,23096,23097,23098,23099,23100,23101,23102,23103,23104,23105,23106,23107,23108,23109,23110,23111,23112,23113,23114,23115,23116,23117,23118,23119,23120,23121,23122,23123,23124,23125,23126,23127,23128,23129,23130,23131,23132,23133,23134,23135,23136,23137,23138,23139,23140,23141,23142,23143,23144,23145,23146,23147,23148,23149,23150,23151,23152,23153,23154,23155,23156,23157,23158,23159,23160,23161,23162,23163,23164,23165,23166,23167,23168,23169,23170,23171,23172,23173,23174,23175,23176,23177,23178,23179,23180,23181,23182,23183,23184,23185,23186,23187,23188,23189,23190,23191,23192,23193,23194,23195,23196,23197,23198,23199,23200,23201,23202,23203,23204,23205,23206,23207,23208,23209,23210,23211,23212,23213,23214,23215,23216,23217,23218,23219,23220,23221,23222,23223,23224,23225,23226,23227,23228,23229,23230,23231,23232,23233,23234,23235,23236,23237,23238,23239,23240,23241,23242,23243,23244,23245,23246,23247,23248,23249,23250,23251,23252,23253,23254,23255,23256,23257,23258,23259,23260,23261,23262,23263,23264,23265,23266,23267,23268,23269,23270,23271,23272,23273,23274,23275,23276,23277,23278,23279,23280,23281,23282,23283,23284,23285,23286,23287,23288,23289,23290,23291,23292,23293,23294,23295,23296,23297,23298,23299,23300,23301,23302,23303,23304,23305,23306,23307,23308,23309,23310,23311,23312,23313,23314,23315,23316,23317,23318,23319,23320,23321,23322,23323,23324,23325,23326,23327,23328,23329,23330,23331,23332,23333,23334,23335,23336,23337,23338,23339,23340,23341,23342,23343,23344,23345,23346,23347,23348,23349,23350,23351,23352,23353,23354,23355,23356,23357,23358,23359,23360,23361,23362,23363,23364,23365,23366,23367,23368,23369,23370,23371,23372,23373,23374,23375,23376,23377,23378,23379,23380,23381,23382,23383,23384,23385,23386,23387,23388,23389,23390,23391,23392,23393,23394,23395,23396,23397,23398,23399,23400,23401,23402,23403,23404,23405,23406,23407,23408,23409,23410,23411,23412,23413,23414,23415,23416,23417,23418,23419,23420,23421,23422,23423,23424,23425,23426,23427,23428,23429,23430,23431,23432,23433,23434,23435,23436,23437,23438,23439,23440,23441,23442,23443,23444,23445,23446,23447,23448,23449,23450,23451,23452,23453,23454,23455,23456,23457,23458,23459,23460,23461,23462,23463,23464,23465,23466,23467,23468,23469,23470,23471,23472,23473,23474,23475,23476,23477,23478,23479,23480,23481,23482,23483,23484,23485,23486,23487,23488,23489,23490,23491,23492,23493,23494,23495,23496,23497,23498,23499,23500,23501,23502,23503,23504,23505,23506,23507,23508,23509,23510,23511,23512,23513,23514,23515,23516,23517,23518,23519,23520,23521,23522,23523,23524,23525,23526,23527,23528,23529,23530,23531,23532,23533,23534,23535,23536,23537,23538,23539,23540,23541,23542,23543,23544,23545,23546,23547,23548,23549,23550,23551,23552,23553,23554,23555,23556,23557,23558,23559,23560,23561,23562,23563,23564,23565,23566,23567,23568,23569,23570,23571,23572,23573,23574,23575,23576,23577,23578,23579,23580,23581,23582,23583,23584,23585,23586,23587,23588,23589,23590,23591,23592,23593,23594,23595,23596,23597,23598,23599,23600,23601,23602,23603,23604,23605,23606,23607,23608,23609,23610,23611,23612,23613,23614,23615,23616,23617,23618,23619,23620,23621,23622,23623,23624,23625,23626,23627,23628,23629,23630,23631,23632,23633,23634,23635,23636,23637,23638,23639,23640,23641,23642,23643,23644,23645,23646,23647,23648,23649,23650,23651,23652,23653,23654,23655,23656,23657,23658,23659,23660,23661,23662,23663,23664,23665,23666,23667,23668,23669,23670,23671,23672,23673,23674,23675,23676,23677,23678,23679,23680,23681,23682,23683,23684,23685,23686,23687,23688,23689,23690,23691,23692,23693,23694,23695,23696,23697,23698,23699,23700,23701,23702,23703,23704,23705,23706,23707,23708,23709,23710,23711,23712,23713,23714,23715,23716,23717,23718,23719,23720,23721,23722,23723,23724,23725,23726,23727,23728,23729,23730,23731,23732,23733,23734,23735,23736,23737,23738,23739,23740,23741,23742,23743,23744,23745,23746,23747,23748,23749,23750,23751,23752,23753,23754,23755,23756,23757,23758,23759,23760,23761,23762,23763,23764,23765,23766,23767,23768,23769,23770,23771,23772,23773,23774,23775,23776,23777,23778,23779,23780,23781,23782,23783,23784,23785,23786,23787,23788,23789,23790,23791,23792,23793,23794,23795,23796,23797,23798,23799,23800,23801,23802,23803,23804,23805,23806,23807,23808,23809,23810,23811,23812,23813,23814,23815,23816,23817,23818,23819,23820,23821,23822,23823,23824,23825,23826,23827,23828,23829,23830,23831,23832,23833,23834,23835,23836,23837,23838,23839,23840,23841,23842,23843,23844,23845,23846,23847,23848,23849,23850,23851,23852,23853,23854,23855,23856,23857,23858,23859,23860,23861,23862,23863,23864,23865,23866,23867,23868,23869,23870,23871,23872,23873,23874,23875,23876,23877,23878,23879,23880,23881,23882,23883,23884,23885,23886,23887,23888,23889,23890,23891,23892,23893,23894,23895,23896,23897,23898,23899,23900,23901,23902,23903,23904,23905,23906,23907,23908,23909,23910,23911,23912,23913,23914,23915,23916,23917,23918,23919,23920,23921,23922,23923,23924,23925,23926,23927,23928,23929,23930,23931,23932,23933,23934,23935,23936,23937,23938,23939,23940,23941,23942,23943,23944,23945,23946,23947,23948,23949,23950,23951,23952,23953,23954,23955,23956,23957,23958,23959,23960,23961,23962,23963,23964,23965,23966,23967,23968,23969,23970,23971,23972,23973,23974,23975,23976,23977,23978,23979,23980,23981,23982,23983,23984,23985,23986,23987,23988,23989,23990,23991,23992,23993,23994,23995,23996,23997,23998,23999,24000,24001,24002,24003,24004,24005,24006,24007,24008,24009,24010,24011,24012,24013,24014,24015,24016,24017,24018,24019,24020,24021,24022,24023,24024,24025,24026,24027,24028,24029,24030,24031,24032,24033,24034,24035,24036,24037,24038,24039,24040,24041,24042,24043,24044,24045,24046,24047,24048,24049,24050,24051,24052,24053,24054,24055,24056,24057,24058,24059,24060,24061,24062,24063,24064,24065,24066,24067,24068,24069,24070,24071,24072,24073,24074,24075,24076,24077,24078,24079,24080,24081,24082,24083,24084,24085,24086,24087,24088,24089,24090,24091,24092,24093,24094,24095,24096,24097,24098,24099,24100,24101,24102,24103,24104,24105,24106,24107,24108,24109,24110,24111,24112,24113,24114,24115,24116,24117,24118,24119,24120,24121,24122,24123,24124,24125,24126,24127,24128,24129,24130,24131,24132,24133,24134,24135,24136,24137,24138,24139,24140,24141,24142,24143,24144,24145,24146,24147,24148,24149,24150,24151,24152,24153,24154,24155,24156,24157,24158,24159,24160,24161,24162,24163,24164,24165,24166,24167,24168,24169,24170,24171,24172,24173,24174,24175,24176,24177,24178,24179,24180,24181,24182,24183,24184,24185,24186,24187,24188,24189,24190,24191,24192,24193,24194,24195,24196,24197,24198,24199,24200,24201,24202,24203,24204,24205,24206,24207,24208,24209,24210,24211,24212,24213,24214,24215,24216,24217,24218,24219,24220,24221,24222,24223,24224,24225,24226,24227,24228,24229,24230,24231,24232,24233,24234,24235,24236,24237,24238,24239,24240,24241,24242,24243,24244,24245,24246,24247,24248,24249,24250,24251,24252,24253,24254,24255,24256,24257,24258,24259,24260,24261,24262,24263,24264,24265,24266,24267,24268,24269,24270,24271,24272,24273,24274,24275,24276,24277,24278,24279,24280,24281,24282,24283,24284,24285,24286,24287,24288,24289,24290,24291,24292,24293,24294,24295,24296,24297,24298,24299,24300,24301,24302,24303,24304,24305,24306,24307,24308,24309,24310,24311,24312,24313,24314,24315,24316,24317,24318,24319,24320,24321,24322,24323,24324,24325,24326,24327,24328,24329,24330,24331,24332,24333,24334,24335,24336,24337,24338,24339,24340,24341,24342,24343,24344,24345,24346,24347,24348,24349,24350,24351,24352,24353,24354,24355,24356,24357,24358,24359,24360,24361,24362,24363,24364,24365,24366,24367,24368,24369,24370,24371,24372,24373,24374,24375,24376,24377,24378,24379,24380,24381,24382,24383,24384,24385,24386,24387,24388,24389,24390,24391,24392,24393,24394,24395,24396,24397,24398,24399,24400,24401,24402,24403,24404,24405,24406,24407,24408,24409,24410,24411,24412,24413,24414,24415,24416,24417,24418,24419,24420,24421,24422,24423,24424,24425,24426,24427,24428,24429,24430,24431,24432,24433,24434,24435,24436,24437,24438,24439,24440,24441,24442,24443,24444,24445,24446,24447,24448,24449,24450,24451,24452,24453,24454,24455,24456,24457,24458,24459,24460,24461,24462,24463,24464,24465,24466,24467,24468,24469,24470,24471,24472,24473,24474,24475,24476,24477,24478,24479,24480,24481,24482,24483,24484,24485,24486,24487,24488,24489,24490,24491,24492,24493,24494,24495,24496,24497,24498,24499,24500,24501,24502,24503,24504,24505,24506,24507,24508,24509,24510,24511,24512,24513,24514,24515,24516,24517,24518,24519,24520,24521,24522,24523,24524,24525,24526,24527,24528,24529,24530,24531,24532,24533,24534,24535,24536,24537,24538,24539,24540,24541,24542,24543,24544,24545,24546,24547,24548,24549,24550,24551,24552,24553,24554,24555,24556,24557,24558,24559,24560,24561,24562,24563,24564,24565,24566,24567,24568,24569,24570,24571,24572,24573,24574,24575,24576,24577,24578,24579,24580,24581,24582,24583,24584,24585,24586,24587,24588,24589,24590,24591,24592,24593,24594,24595,24596,24597,24598,24599,24600,24601,24602,24603,24604,24605,24606,24607,24608,24609,24610,24611,24612,24613,24614,24615,24616,24617,24618,24619,24620,24621,24622,24623,24624,24625,24626,24627,24628,24629,24630,24631,24632,24633,24634,24635,24636,24637,24638,24639,24640,24641,24642,24643,24644,24645,24646,24647,24648,24649,24650,24651,24652,24653,24654,24655,24656,24657,24658,24659,24660,24661,24662,24663,24664,24665,24666,24667,24668,24669,24670,24671,24672,24673,24674,24675,24676,24677,24678,24679,24680,24681,24682,24683,24684,24685,24686,24687,24688,24689,24690,24691,24692,24693,24694,24695,24696,24697,24698,24699,24700,24701,24702,24703,24704,24705,24706,24707,24708,24709,24710,24711,24712,24713,24714,24715,24716,24717,24718,24719,24720,24721,24722,24723,24724,24725,24726,24727,24728,24729,24730,24731,24732,24733,24734,24735,24736,24737,24738,24739,24740,24741,24742,24743,24744,24745,24746,24747,24748,24749,24750,24751,24752,24753,24754,24755,24756,24757,24758,24759,24760,24761,24762,24763,24764,24765,24766,24767,24768,24769,24770,24771,24772,24773,24774,24775,24776,24777,24778,24779,24780,24781,24782,24783,24784,24785,24786,24787,24788,24789,24790,24791,24792,24793,24794,24795,24796,24797,24798,24799,24800,24801,24802,24803,24804,24805,24806,24807,24808,24809,24810,24811,24812,24813,24814,24815,24816,24817,24818,24819,24820,24821,24822,24823,24824,24825,24826,24827,24828,24829,24830,24831,24832,24833,24834,24835,24836,24837,24838,24839,24840,24841,24842,24843,24844,24845,24846,24847,24848,24849,24850,24851,24852,24853,24854,24855,24856,24857,24858,24859,24860,24861,24862,24863,24864,24865,24866,24867,24868,24869,24870,24871,24872,24873,24874,24875,24876,24877,24878,24879,24880,24881,24882,24883,24884,24885,24886,24887,24888,24889,24890,24891,24892,24893,24894,24895,24896,24897,24898,24899,24900,24901,24902,24903,24904,24905,24906,24907,24908,24909,24910,24911,24912,24913,24914,24915,24916,24917,24918,24919,24920,24921,24922,24923,24924,24925,24926,24927,24928,24929,24930,24931,24932,24933,24934,24935,24936,24937,24938,24939,24940,24941,24942,24943,24944,24945,24946,24947,24948,24949,24950,24951,24952,24953,24954,24955,24956,24957,24958,24959,24960,24961,24962,24963,24964,24965,24966,24967,24968,24969,24970,24971,24972,24973,24974,24975,24976,24977,24978,24979,24980,24981,24982,24983,24984,24985,24986,24987,24988,24989,24990,24991,24992,24993,24994,24995,24996,24997,24998,24999,25000,25001,25002,25003,25004,25005,25006,25007,25008,25009,25010,25011,25012,25013,25014,25015,25016,25017,25018,25019,25020,25021,25022,25023,25024,25025,25026,25027,25028,25029,25030,25031,25032,25033,25034,25035,25036,25037,25038,25039,25040,25041,25042,25043,25044,25045,25046,25047,25048,25049,25050,25051,25052,25053,25054,25055,25056,25057,25058,25059,25060,25061,25062,25063,25064,25065,25066,25067,25068,25069,25070,25071,25072,25073,25074,25075,25076,25077,25078,25079,25080,25081,25082,25083,25084,25085,25086,25087,25088,25089,25090,25091,25092,25093,25094,25095,25096,25097,25098,25099,25100,25101,25102,25103,25104,25105,25106,25107,25108,25109,25110,25111,25112,25113,25114,25115,25116,25117,25118,25119,25120,25121,25122,25123,25124,25125,25126,25127,25128,25129,25130,25131,25132,25133,25134,25135,25136,25137,25138,25139,25140,25141,25142,25143,25144,25145,25146,25147,25148,25149,25150,25151,25152,25153,25154,25155,25156,25157,25158,25159,25160,25161,25162,25163,25164,25165,25166,25167,25168,25169,25170,25171,25172,25173,25174,25175,25176,25177,25178,25179,25180,25181,25182,25183,25184,25185,25186,25187,25188,25189,25190,25191,25192,25193,25194,25195,25196,25197,25198,25199,25200,25201,25202,25203,25204,25205,25206,25207,25208,25209,25210,25211,25212,25213,25214,25215,25216,25217,25218,25219,25220,25221,25222,25223,25224,25225,25226,25227,25228,25229,25230,25231,25232,25233,25234,25235,25236,25237,25238,25239,25240,25241,25242,25243,25244,25245,25246,25247,25248,25249,25250,25251,25252,25253,25254,25255,25256,25257,25258,25259,25260,25261,25262,25263,25264,25265,25266,25267,25268,25269,25270,25271,25272,25273,25274,25275,25276,25277,25278,25279,25280,25281,25282,25283,25284,25285,25286,25287,25288,25289,25290,25291,25292,25293,25294,25295,25296,25297,25298,25299,25300,25301,25302,25303,25304,25305,25306,25307,25308,25309,25310,25311,25312,25313,25314,25315,25316,25317,25318,25319,25320,25321,25322,25323,25324,25325,25326,25327,25328,25329,25330,25331,25332,25333,25334,25335,25336,25337,25338,25339,25340,25341,25342,25343,25344,25345,25346,25347,25348,25349,25350,25351,25352,25353,25354,25355,25356,25357,25358,25359,25360,25361,25362,25363,25364,25365,25366,25367,25368,25369,25370,25371,25372,25373,25374,25375,25376,25377,25378,25379,25380,25381,25382,25383,25384,25385,25386,25387,25388,25389,25390,25391,25392,25393,25394,25395,25396,25397,25398,25399,25400,25401,25402,25403,25404,25405,25406,25407,25408,25409,25410,25411,25412,25413,25414,25415,25416,25417,25418,25419,25420,25421,25422,25423,25424,25425,25426,25427,25428,25429,25430,25431,25432,25433,25434,25435,25436,25437,25438,25439,25440,25441,25442,25443,25444,25445,25446,25447,25448,25449,25450,25451,25452,25453,25454,25455,25456,25457,25458,25459,25460,25461,25462,25463,25464,25465,25466,25467,25468,25469,25470,25471,25472,25473,25474,25475,25476,25477,25478,25479,25480,25481,25482,25483,25484,25485,25486,25487,25488,25489,25490,25491,25492,25493,25494,25495,25496,25497,25498,25499,25500,25501,25502,25503,25504,25505,25506,25507,25508,25509,25510,25511,25512,25513,25514,25515,25516,25517,25518,25519,25520,25521,25522,25523,25524,25525,25526,25527,25528,25529,25530,25531,25532,25533,25534,25535,25536,25537,25538,25539,25540,25541,25542,25543,25544,25545,25546,25547,25548,25549,25550,25551,25552,25553,25554,25555,25556,25557,25558,25559,25560,25561,25562,25563,25564,25565,25566,25567,25568,25569,25570,25571,25572,25573,25574,25575,25576,25577,25578,25579,25580,25581,25582,25583,25584,25585,25586,25587,25588,25589,25590,25591,25592,25593,25594,25595,25596,25597,25598,25599,25600,25601,25602,25603,25604,25605,25606,25607,25608,25609,25610,25611,25612,25613,25614,25615,25616,25617,25618,25619,25620,25621,25622,25623,25624,25625,25626,25627,25628,25629,25630,25631,25632,25633,25634,25635,25636,25637,25638,25639,25640,25641,25642,25643,25644,25645,25646,25647,25648,25649,25650,25651,25652,25653,25654,25655,25656,25657,25658,25659,25660,25661,25662,25663,25664,25665,25666,25667,25668,25669,25670,25671,25672,25673,25674,25675,25676,25677,25678,25679,25680,25681,25682,25683,25684,25685,25686,25687,25688,25689,25690,25691,25692,25693,25694,25695,25696,25697,25698,25699,25700,25701,25702,25703,25704,25705,25706,25707,25708,25709,25710,25711,25712,25713,25714,25715,25716,25717,25718,25719,25720,25721,25722,25723,25724,25725,25726,25727,25728,25729,25730,25731,25732,25733,25734,25735,25736,25737,25738,25739,25740,25741,25742,25743,25744,25745,25746,25747,25748,25749,25750,25751,25752,25753,25754,25755,25756,25757,25758,25759,25760,25761,25762,25763,25764,25765,25766,25767,25768,25769,25770,25771,25772,25773,25774,25775,25776,25777,25778,25779,25780,25781,25782,25783,25784,25785,25786,25787,25788,25789,25790,25791,25792,25793,25794,25795,25796,25797,25798,25799,25800,25801,25802,25803,25804,25805,25806,25807,25808,25809,25810,25811,25812,25813,25814,25815,25816,25817,25818,25819,25820,25821,25822,25823,25824,25825,25826,25827,25828,25829,25830,25831,25832,25833,25834,25835,25836,25837,25838,25839,25840,25841,25842,25843,25844,25845,25846,25847,25848,25849,25850,25851,25852,25853,25854,25855,25856,25857,25858,25859,25860,25861,25862,25863,25864,25865,25866,25867,25868,25869,25870,25871,25872,25873,25874,25875,25876,25877,25878,25879,25880,25881,25882,25883,25884,25885,25886,25887,25888,25889,25890,25891,25892,25893,25894,25895,25896,25897,25898,25899,25900,25901,25902,25903,25904,25905,25906,25907,25908,25909,25910,25911,25912,25913,25914,25915,25916,25917,25918,25919,25920,25921,25922,25923,25924,25925,25926,25927,25928,25929,25930,25931,25932,25933,25934,25935,25936,25937,25938,25939,25940,25941,25942,25943,25944,25945,25946,25947,25948,25949,25950,25951,25952,25953,25954,25955,25956,25957,25958,25959,25960,25961,25962,25963,25964,25965,25966,25967,25968,25969,25970,25971,25972,25973,25974,25975,25976,25977,25978,25979,25980,25981,25982,25983,25984,25985,25986,25987,25988,25989,25990,25991,25992,25993,25994,25995,25996,25997,25998,25999,26000,26001,26002,26003,26004,26005,26006,26007,26008,26009,26010,26011,26012,26013,26014,26015,26016,26017,26018,26019,26020,26021,26022,26023,26024,26025,26026,26027,26028,26029,26030,26031,26032,26033,26034,26035,26036,26037,26038,26039,26040,26041,26042,26043,26044,26045,26046,26047,26048,26049,26050,26051,26052,26053,26054,26055,26056,26057,26058,26059,26060,26061,26062,26063,26064,26065,26066,26067,26068,26069,26070,26071,26072,26073,26074,26075,26076,26077,26078,26079,26080,26081,26082,26083,26084,26085,26086,26087,26088,26089,26090,26091,26092,26093,26094,26095,26096,26097,26098,26099,26100,26101,26102,26103,26104,26105,26106,26107,26108,26109,26110,26111,26112,26113,26114,26115,26116,26117,26118,26119,26120,26121,26122,26123,26124,26125,26126,26127,26128,26129,26130,26131,26132,26133,26134,26135,26136,26137,26138,26139,26140,26141,26142,26143,26144,26145,26146,26147,26148,26149,26150,26151,26152,26153,26154,26155,26156,26157,26158,26159,26160,26161,26162,26163,26164,26165,26166,26167,26168,26169,26170,26171,26172,26173,26174,26175,26176,26177,26178,26179,26180,26181,26182,26183,26184,26185,26186,26187,26188,26189,26190,26191,26192,26193,26194,26195,26196,26197,26198,26199,26200,26201,26202,26203,26204,26205,26206,26207,26208,26209,26210,26211,26212,26213,26214,26215,26216,26217,26218,26219,26220,26221,26222,26223,26224,26225,26226,26227,26228,26229,26230,26231,26232,26233,26234,26235,26236,26237,26238,26239,26240,26241,26242,26243,26244,26245,26246,26247,26248,26249,26250,26251,26252,26253,26254,26255,26256,26257,26258,26259,26260,26261,26262,26263,26264,26265,26266,26267,26268,26269,26270,26271,26272,26273,26274,26275,26276,26277,26278,26279,26280,26281,26282,26283,26284,26285,26286,26287,26288,26289,26290,26291,26292,26293,26294,26295,26296,26297,26298,26299,26300,26301,26302,26303,26304,26305,26306,26307,26308,26309,26310,26311,26312,26313,26314,26315,26316,26317,26318,26319,26320,26321,26322,26323,26324,26325,26326,26327,26328,26329,26330,26331,26332,26333,26334,26335,26336,26337,26338,26339,26340,26341,26342,26343,26344,26345,26346,26347,26348,26349,26350,26351,26352,26353,26354,26355,26356,26357,26358,26359,26360,26361,26362,26363,26364,26365,26366,26367,26368,26369,26370,26371,26372,26373,26374,26375,26376,26377,26378,26379,26380,26381,26382,26383,26384,26385,26386,26387,26388,26389,26390,26391,26392,26393,26394,26395,26396,26397,26398,26399,26400,26401,26402,26403,26404,26405,26406,26407,26408,26409,26410,26411,26412,26413,26414,26415,26416,26417,26418,26419,26420,26421,26422,26423,26424,26425,26426,26427,26428,26429,26430,26431,26432,26433,26434,26435,26436,26437,26438,26439,26440,26441,26442,26443,26444,26445,26446,26447,26448,26449,26450,26451,26452,26453,26454,26455,26456,26457,26458,26459,26460,26461,26462,26463,26464,26465,26466,26467,26468,26469,26470,26471,26472,26473,26474,26475,26476,26477,26478,26479,26480,26481,26482,26483,26484,26485,26486,26487,26488,26489,26490,26491,26492,26493,26494,26495,26496,26497,26498,26499,26500,26501,26502,26503,26504,26505,26506,26507,26508,26509,26510,26511,26512,26513,26514,26515,26516,26517,26518,26519,26520,26521,26522,26523,26524,26525,26526,26527,26528,26529,26530,26531,26532,26533,26534,26535,26536,26537,26538,26539,26540,26541,26542,26543,26544,26545,26546,26547,26548,26549,26550,26551,26552,26553,26554,26555,26556,26557,26558,26559,26560,26561,26562,26563,26564,26565,26566,26567,26568,26569,26570,26571,26572,26573,26574,26575,26576,26577,26578,26579,26580,26581,26582,26583,26584,26585,26586,26587,26588,26589,26590,26591,26592,26593,26594,26595,26596,26597,26598,26599,26600,26601,26602,26603,26604,26605,26606,26607,26608,26609,26610,26611,26612,26613,26614,26615,26616,26617,26618,26619,26620,26621,26622,26623,26624,26625,26626,26627,26628,26629,26630,26631,26632,26633,26634,26635,26636,26637,26638,26639,26640,26641,26642,26643,26644,26645,26646,26647,26648,26649,26650,26651,26652,26653,26654,26655,26656,26657,26658,26659,26660,26661,26662,26663,26664,26665,26666,26667,26668,26669,26670,26671,26672,26673,26674,26675,26676,26677,26678,26679,26680,26681,26682,26683,26684,26685,26686,26687,26688,26689,26690,26691,26692,26693,26694,26695,26696,26697,26698,26699,26700,26701,26702,26703,26704,26705,26706,26707,26708,26709,26710,26711,26712,26713,26714,26715,26716,26717,26718,26719,26720,26721,26722,26723,26724,26725,26726,26727,26728,26729,26730,26731,26732,26733,26734,26735,26736,26737,26738,26739,26740,26741,26742,26743,26744,26745,26746,26747,26748,26749,26750,26751,26752,26753,26754,26755,26756,26757,26758,26759,26760,26761,26762,26763,26764,26765,26766,26767,26768,26769,26770,26771,26772,26773,26774,26775,26776,26777,26778,26779,26780,26781,26782,26783,26784,26785,26786,26787,26788,26789,26790,26791,26792,26793,26794,26795,26796,26797,26798,26799,26800,26801,26802,26803,26804,26805,26806,26807,26808,26809,26810,26811,26812,26813,26814,26815,26816,26817,26818,26819,26820,26821,26822,26823,26824,26825,26826,26827,26828,26829,26830,26831,26832,26833,26834,26835,26836,26837,26838,26839,26840,26841,26842,26843,26844,26845,26846,26847,26848,26849,26850,26851,26852,26853,26854,26855,26856,26857,26858,26859,26860,26861,26862,26863,26864,26865,26866,26867,26868,26869,26870,26871,26872,26873,26874,26875,26876,26877,26878,26879,26880,26881,26882,26883,26884,26885,26886,26887,26888,26889,26890,26891,26892,26893,26894,26895,26896,26897,26898,26899,26900,26901,26902,26903,26904,26905,26906,26907,26908,26909,26910,26911,26912,26913,26914,26915,26916,26917,26918,26919,26920,26921,26922,26923,26924,26925,26926,26927,26928,26929,26930,26931,26932,26933,26934,26935,26936,26937,26938,26939,26940,26941,26942,26943,26944,26945,26946,26947,26948,26949,26950,26951,26952,26953,26954,26955,26956,26957,26958,26959,26960,26961,26962,26963,26964,26965,26966,26967,26968,26969,26970,26971,26972,26973,26974,26975,26976,26977,26978,26979,26980,26981,26982,26983,26984,26985,26986,26987,26988,26989,26990,26991,26992,26993,26994,26995,26996,26997,26998,26999,27000,27001,27002,27003,27004,27005,27006,27007,27008,27009,27010,27011,27012,27013,27014,27015,27016,27017,27018,27019,27020,27021,27022,27023,27024,27025,27026,27027,27028,27029,27030,27031,27032,27033,27034,27035,27036,27037,27038,27039,27040,27041,27042,27043,27044,27045,27046,27047,27048,27049,27050,27051,27052,27053,27054,27055,27056,27057,27058,27059,27060,27061,27062,27063,27064,27065,27066,27067,27068,27069,27070,27071,27072,27073,27074,27075,27076,27077,27078,27079,27080,27081,27082,27083,27084,27085,27086,27087,27088,27089,27090,27091,27092,27093,27094,27095,27096,27097,27098,27099,27100,27101,27102,27103,27104,27105,27106,27107,27108,27109,27110,27111,27112,27113,27114,27115,27116,27117,27118,27119,27120,27121,27122,27123,27124,27125,27126,27127,27128,27129,27130,27131,27132,27133,27134,27135,27136,27137,27138,27139,27140,27141,27142,27143,27144,27145,27146,27147,27148,27149,27150,27151,27152,27153,27154,27155,27156,27157,27158,27159,27160,27161,27162,27163,27164,27165,27166,27167,27168,27169,27170,27171,27172,27173,27174,27175,27176,27177,27178,27179,27180,27181,27182,27183,27184,27185,27186,27187,27188,27189,27190,27191,27192,27193,27194,27195,27196,27197,27198,27199,27200,27201,27202,27203,27204,27205,27206,27207,27208,27209,27210,27211,27212,27213,27214,27215,27216,27217,27218,27219,27220,27221,27222,27223,27224,27225,27226,27227,27228,27229,27230,27231,27232,27233,27234,27235,27236,27237,27238,27239,27240,27241,27242,27243,27244,27245,27246,27247,27248,27249,27250,27251,27252,27253,27254,27255,27256,27257,27258,27259,27260,27261,27262,27263,27264,27265,27266,27267,27268,27269,27270,27271,27272,27273,27274,27275,27276,27277,27278,27279,27280,27281,27282,27283,27284,27285,27286,27287,27288,27289,27290,27291,27292,27293,27294,27295,27296,27297,27298,27299,27300,27301,27302,27303,27304,27305,27306,27307,27308,27309,27310,27311,27312,27313,27314,27315,27316,27317,27318,27319,27320,27321,27322,27323,27324,27325,27326,27327,27328,27329,27330,27331,27332,27333,27334,27335,27336,27337,27338,27339,27340,27341,27342,27343,27344,27345,27346,27347,27348,27349,27350,27351,27352,27353,27354,27355,27356,27357,27358,27359,27360,27361,27362,27363,27364,27365,27366,27367,27368,27369,27370,27371,27372,27373,27374,27375,27376,27377,27378,27379,27380,27381,27382,27383,27384,27385,27386,27387,27388,27389,27390,27391,27392,27393,27394,27395,27396,27397,27398,27399,27400,27401,27402,27403,27404,27405,27406,27407,27408,27409,27410,27411,27412,27413,27414,27415,27416,27417,27418,27419,27420,27421,27422,27423,27424,27425,27426,27427,27428,27429,27430,27431,27432,27433,27434,27435,27436,27437,27438,27439,27440,27441,27442,27443,27444,27445,27446,27447,27448,27449,27450,27451,27452,27453,27454,27455,27456,27457,27458,27459,27460,27461,27462,27463,27464,27465,27466,27467,27468,27469,27470,27471,27472,27473,27474,27475,27476,27477,27478,27479,27480,27481,27482,27483,27484,27485,27486,27487,27488,27489,27490,27491,27492,27493,27494,27495,27496,27497,27498,27499,27500,27501,27502,27503,27504,27505,27506,27507,27508,27509,27510,27511,27512,27513,27514,27515,27516,27517,27518,27519,27520,27521,27522,27523,27524,27525,27526,27527,27528,27529,27530,27531,27532,27533,27534,27535,27536,27537,27538,27539,27540,27541,27542,27543,27544,27545,27546,27547,27548,27549,27550,27551,27552,27553,27554,27555,27556,27557,27558,27559,27560,27561,27562,27563,27564,27565,27566,27567,27568,27569,27570,27571,27572,27573,27574,27575,27576,27577,27578,27579,27580,27581,27582,27583,27584,27585,27586,27587,27588,27589,27590,27591,27592,27593,27594,27595,27596,27597,27598,27599,27600,27601,27602,27603,27604,27605,27606,27607,27608,27609,27610,27611,27612,27613,27614,27615,27616,27617,27618,27619,27620,27621,27622,27623,27624,27625,27626,27627,27628,27629,27630,27631,27632,27633,27634,27635,27636,27637,27638,27639,27640,27641,27642,27643,27644,27645,27646,27647,27648,27649,27650,27651,27652,27653,27654,27655,27656,27657,27658,27659,27660,27661,27662,27663,27664,27665,27666,27667,27668,27669,27670,27671,27672,27673,27674,27675,27676,27677,27678,27679,27680,27681,27682,27683,27684,27685,27686,27687,27688,27689,27690,27691,27692,27693,27694,27695,27696,27697,27698,27699,27700,27701,27702,27703,27704,27705,27706,27707,27708,27709,27710,27711,27712,27713,27714,27715,27716,27717,27718,27719,27720,27721,27722,27723,27724,27725,27726,27727,27728,27729,27730,27731,27732,27733,27734,27735,27736,27737,27738,27739,27740,27741,27742,27743,27744,27745,27746,27747,27748,27749,27750,27751,27752,27753,27754,27755,27756,27757,27758,27759,27760,27761,27762,27763,27764,27765,27766,27767,27768,27769,27770,27771,27772,27773,27774,27775,27776,27777,27778,27779,27780,27781,27782,27783,27784,27785,27786,27787,27788,27789,27790,27791,27792,27793,27794,27795,27796,27797,27798,27799,27800,27801,27802,27803,27804,27805,27806,27807,27808,27809,27810,27811,27812,27813,27814,27815,27816,27817,27818,27819,27820,27821,27822,27823,27824,27825,27826,27827,27828,27829,27830,27831,27832,27833,27834,27835,27836,27837,27838,27839,27840,27841,27842,27843,27844,27845,27846,27847,27848,27849,27850,27851,27852,27853,27854,27855,27856,27857,27858,27859,27860,27861,27862,27863,27864,27865,27866,27867,27868,27869,27870,27871,27872,27873,27874,27875,27876,27877,27878,27879,27880,27881,27882,27883,27884,27885,27886,27887,27888,27889,27890,27891,27892,27893,27894,27895,27896,27897,27898,27899,27900,27901,27902,27903,27904,27905,27906,27907,27908,27909,27910,27911,27912,27913,27914,27915,27916,27917,27918,27919,27920,27921,27922,27923,27924,27925,27926,27927,27928,27929,27930,27931,27932,27933,27934,27935,27936,27937,27938,27939,27940,27941,27942,27943,27944,27945,27946,27947,27948,27949,27950,27951,27952,27953,27954,27955,27956,27957,27958,27959,27960,27961,27962,27963,27964,27965,27966,27967,27968,27969,27970,27971,27972,27973,27974,27975,27976,27977,27978,27979,27980,27981,27982,27983,27984,27985,27986,27987,27988,27989,27990,27991,27992,27993,27994,27995,27996,27997,27998,27999,28000,28001,28002,28003,28004,28005,28006,28007,28008,28009,28010,28011,28012,28013,28014,28015,28016,28017,28018,28019,28020,28021,28022,28023,28024,28025,28026,28027,28028,28029,28030,28031,28032,28033,28034,28035,28036,28037,28038,28039,28040,28041,28042,28043,28044,28045,28046,28047,28048,28049,28050,28051,28052,28053,28054,28055,28056,28057,28058,28059,28060,28061,28062,28063,28064,28065,28066,28067,28068,28069,28070,28071,28072,28073,28074,28075,28076,28077,28078,28079,28080,28081,28082,28083,28084,28085,28086,28087,28088,28089,28090,28091,28092,28093,28094,28095,28096,28097,28098,28099,28100,28101,28102,28103,28104,28105,28106,28107,28108,28109,28110,28111,28112,28113,28114,28115,28116,28117,28118,28119,28120,28121,28122,28123,28124,28125,28126,28127,28128,28129,28130,28131,28132,28133,28134,28135,28136,28137,28138,28139,28140,28141,28142,28143,28144,28145,28146,28147,28148,28149,28150,28151,28152,28153,28154,28155,28156,28157,28158,28159,28160,28161,28162,28163,28164,28165,28166,28167,28168,28169,28170,28171,28172,28173,28174,28175,28176,28177,28178,28179,28180,28181,28182,28183,28184,28185,28186,28187,28188,28189,28190,28191,28192,28193,28194,28195,28196,28197,28198,28199,28200,28201,28202,28203,28204,28205,28206,28207,28208,28209,28210,28211,28212,28213,28214,28215,28216,28217,28218,28219,28220,28221,28222,28223,28224,28225,28226,28227,28228,28229,28230,28231,28232,28233,28234,28235,28236,28237,28238,28239,28240,28241,28242,28243,28244,28245,28246,28247,28248,28249,28250,28251,28252,28253,28254,28255,28256,28257,28258,28259,28260,28261,28262,28263,28264,28265,28266,28267,28268,28269,28270,28271,28272,28273,28274,28275,28276,28277,28278,28279,28280,28281,28282,28283,28284,28285,28286,28287,28288,28289,28290,28291,28292,28293,28294,28295,28296,28297,28298,28299,28300,28301,28302,28303,28304,28305,28306,28307,28308,28309,28310,28311,28312,28313,28314,28315,28316,28317,28318,28319,28320,28321,28322,28323,28324,28325,28326,28327,28328,28329,28330,28331,28332,28333,28334,28335,28336,28337,28338,28339,28340,28341,28342,28343,28344,28345,28346,28347,28348,28349,28350,28351,28352,28353,28354,28355,28356,28357,28358,28359,28360,28361,28362,28363,28364,28365,28366,28367,28368,28369,28370,28371,28372,28373,28374,28375,28376,28377,28378,28379,28380,28381,28382,28383,28384,28385,28386,28387,28388,28389,28390,28391,28392,28393,28394,28395,28396,28397,28398,28399,28400,28401,28402,28403,28404,28405,28406,28407,28408,28409,28410,28411,28412,28413,28414,28415,28416,28417,28418,28419,28420,28421,28422,28423,28424,28425,28426,28427,28428,28429,28430,28431,28432,28433,28434,28435,28436,28437,28438,28439,28440,28441,28442,28443,28444,28445,28446,28447,28448,28449,28450,28451,28452,28453,28454,28455,28456,28457,28458,28459,28460,28461,28462,28463,28464,28465,28466,28467,28468,28469,28470,28471,28472,28473,28474,28475,28476,28477,28478,28479,28480,28481,28482,28483,28484,28485,28486,28487,28488,28489,28490,28491,28492,28493,28494,28495,28496,28497,28498,28499,28500,28501,28502,28503,28504,28505,28506,28507,28508,28509,28510,28511,28512,28513,28514,28515,28516,28517,28518,28519,28520,28521,28522,28523,28524,28525,28526,28527,28528,28529,28530,28531,28532,28533,28534,28535,28536,28537,28538,28539,28540,28541,28542,28543,28544,28545,28546,28547,28548,28549,28550,28551,28552,28553,28554,28555,28556,28557,28558,28559,28560,28561,28562,28563,28564,28565,28566,28567,28568,28569,28570,28571,28572,28573,28574,28575,28576,28577,28578,28579,28580,28581,28582,28583,28584,28585,28586,28587,28588,28589,28590,28591,28592,28593,28594,28595,28596,28597,28598,28599,28600,28601,28602,28603,28604,28605,28606,28607,28608,28609,28610,28611,28612,28613,28614,28615,28616,28617,28618,28619,28620,28621,28622,28623,28624,28625,28626,28627,28628,28629,28630,28631,28632,28633,28634,28635,28636,28637,28638,28639,28640,28641,28642,28643,28644,28645,28646,28647,28648,28649,28650,28651,28652,28653,28654,28655,28656,28657,28658,28659,28660,28661,28662,28663,28664,28665,28666,28667,28668,28669,28670,28671,28672,28673,28674,28675,28676,28677,28678,28679,28680,28681,28682,28683,28684,28685,28686,28687,28688,28689,28690,28691,28692,28693,28694,28695,28696,28697,28698,28699,28700,28701,28702,28703,28704,28705,28706,28707,28708,28709,28710,28711,28712,28713,28714,28715,28716,28717,28718,28719,28720,28721,28722,28723,28724,28725,28726,28727,28728,28729,28730,28731,28732,28733,28734,28735,28736,28737,28738,28739,28740,28741,28742,28743,28744,28745,28746,28747,28748,28749,28750,28751,28752,28753,28754,28755,28756,28757,28758,28759,28760,28761,28762,28763,28764,28765,28766,28767,28768,28769,28770,28771,28772,28773,28774,28775,28776,28777,28778,28779,28780,28781,28782,28783,28784,28785,28786,28787,28788,28789,28790,28791,28792,28793,28794,28795,28796,28797,28798,28799,28800,28801,28802,28803,28804,28805,28806,28807,28808,28809,28810,28811,28812,28813,28814,28815,28816,28817,28818,28819,28820,28821,28822,28823,28824,28825,28826,28827,28828,28829,28830,28831,28832,28833,28834,28835,28836,28837,28838,28839,28840,28841,28842,28843,28844,28845,28846,28847,28848,28849,28850,28851,28852,28853,28854,28855,28856,28857,28858,28859,28860,28861,28862,28863,28864,28865,28866,28867,28868,28869,28870,28871,28872,28873,28874,28875,28876,28877,28878,28879,28880,28881,28882,28883,28884,28885,28886,28887,28888,28889,28890,28891,28892,28893,28894,28895,28896,28897,28898,28899,28900,28901,28902,28903,28904,28905,28906,28907,28908,28909,28910,28911,28912,28913,28914,28915,28916,28917,28918,28919,28920,28921,28922,28923,28924,28925,28926,28927,28928,28929,28930,28931,28932,28933,28934,28935,28936,28937,28938,28939,28940,28941,28942,28943,28944,28945,28946,28947,28948,28949,28950,28951,28952,28953,28954,28955,28956,28957,28958,28959,28960,28961,28962,28963,28964,28965,28966,28967,28968,28969,28970,28971,28972,28973,28974,28975,28976,28977,28978,28979,28980,28981,28982,28983,28984,28985,28986,28987,28988,28989,28990,28991,28992,28993,28994,28995,28996,28997,28998,28999,29000,29001,29002,29003,29004,29005,29006,29007,29008,29009,29010,29011,29012,29013,29014,29015,29016,29017,29018,29019,29020,29021,29022,29023,29024,29025,29026,29027,29028,29029,29030,29031,29032,29033,29034,29035,29036,29037,29038,29039,29040,29041,29042,29043,29044,29045,29046,29047,29048,29049,29050,29051,29052,29053,29054,29055,29056,29057,29058,29059,29060,29061,29062,29063,29064,29065,29066,29067,29068,29069,29070,29071,29072,29073,29074,29075,29076,29077,29078,29079,29080,29081,29082,29083,29084,29085,29086,29087,29088,29089,29090,29091,29092,29093,29094,29095,29096,29097,29098,29099,29100,29101,29102,29103,29104,29105,29106,29107,29108,29109,29110,29111,29112,29113,29114,29115,29116,29117,29118,29119,29120,29121,29122,29123,29124,29125,29126,29127,29128,29129,29130,29131,29132,29133,29134,29135,29136,29137,29138,29139,29140,29141,29142,29143,29144,29145,29146,29147,29148,29149,29150,29151,29152,29153,29154,29155,29156,29157,29158,29159,29160,29161,29162,29163,29164,29165,29166,29167,29168,29169,29170,29171,29172,29173,29174,29175,29176,29177,29178,29179,29180,29181,29182,29183,29184,29185,29186,29187,29188,29189,29190,29191,29192,29193,29194,29195,29196,29197,29198,29199,29200,29201,29202,29203,29204,29205,29206,29207,29208,29209,29210,29211,29212,29213,29214,29215,29216,29217,29218,29219,29220,29221,29222,29223,29224,29225,29226,29227,29228,29229,29230,29231,29232,29233,29234,29235,29236,29237,29238,29239,29240,29241,29242,29243,29244,29245,29246,29247,29248,29249,29250,29251,29252,29253,29254,29255,29256,29257,29258,29259,29260,29261,29262,29263,29264,29265,29266,29267,29268,29269,29270,29271,29272,29273,29274,29275,29276,29277,29278,29279,29280,29281,29282,29283,29284,29285,29286,29287,29288,29289,29290,29291,29292,29293,29294,29295,29296,29297,29298,29299,29300,29301,29302,29303,29304,29305,29306,29307,29308,29309,29310,29311,29312,29313,29314,29315,29316,29317,29318,29319,29320,29321,29322,29323,29324,29325,29326,29327,29328,29329,29330,29331,29332,29333,29334,29335,29336,29337,29338,29339,29340,29341,29342,29343,29344,29345,29346,29347,29348,29349,29350,29351,29352,29353,29354,29355,29356,29357,29358,29359,29360,29361,29362,29363,29364,29365,29366,29367,29368,29369,29370,29371,29372,29373,29374,29375,29376,29377,29378,29379,29380,29381,29382,29383,29384,29385,29386,29387,29388,29389,29390,29391,29392,29393,29394,29395,29396,29397,29398,29399,29400,29401,29402,29403,29404,29405,29406,29407,29408,29409,29410,29411,29412,29413,29414,29415,29416,29417,29418,29419,29420,29421,29422,29423,29424,29425,29426,29427,29428,29429,29430,29431,29432,29433,29434,29435,29436,29437,29438,29439,29440,29441,29442,29443,29444,29445,29446,29447,29448,29449,29450,29451,29452,29453,29454,29455,29456,29457,29458,29459,29460,29461,29462,29463,29464,29465,29466,29467,29468,29469,29470,29471,29472,29473,29474,29475,29476,29477,29478,29479,29480,29481,29482,29483,29484,29485,29486,29487,29488,29489,29490,29491,29492,29493,29494,29495,29496,29497,29498,29499,29500,29501,29502,29503,29504,29505,29506,29507,29508,29509,29510,29511,29512,29513,29514,29515,29516,29517,29518,29519,29520,29521,29522,29523,29524,29525,29526,29527,29528,29529,29530,29531,29532,29533,29534,29535,29536,29537,29538,29539,29540,29541,29542,29543,29544,29545,29546,29547,29548,29549,29550,29551,29552,29553,29554,29555,29556,29557,29558,29559,29560,29561,29562,29563,29564,29565,29566,29567,29568,29569,29570,29571,29572,29573,29574,29575,29576,29577,29578,29579,29580,29581,29582,29583,29584,29585,29586,29587,29588,29589,29590,29591,29592,29593,29594,29595,29596,29597,29598,29599,29600,29601,29602,29603,29604,29605,29606,29607,29608,29609,29610,29611,29612,29613,29614,29615,29616,29617,29618,29619,29620,29621,29622,29623,29624,29625,29626,29627,29628,29629,29630,29631,29632,29633,29634,29635,29636,29637,29638,29639,29640,29641,29642,29643,29644,29645,29646,29647,29648,29649,29650,29651,29652,29653,29654,29655,29656,29657,29658,29659,29660,29661,29662,29663,29664,29665,29666,29667,29668,29669,29670,29671,29672,29673,29674,29675,29676,29677,29678,29679,29680,29681,29682,29683,29684,29685,29686,29687,29688,29689,29690,29691,29692,29693,29694,29695,29696,29697,29698,29699,29700,29701,29702,29703,29704,29705,29706,29707,29708,29709,29710,29711,29712,29713,29714,29715,29716,29717,29718,29719,29720,29721,29722,29723,29724,29725,29726,29727,29728,29729,29730,29731,29732,29733,29734,29735,29736,29737,29738,29739,29740,29741,29742,29743,29744,29745,29746,29747,29748,29749,29750,29751,29752,29753,29754,29755,29756,29757,29758,29759,29760,29761,29762,29763,29764,29765,29766,29767,29768,29769,29770,29771,29772,29773,29774,29775,29776,29777,29778,29779,29780,29781,29782,29783,29784,29785,29786,29787,29788,29789,29790,29791,29792,29793,29794,29795,29796,29797,29798,29799,29800,29801,29802,29803,29804,29805,29806,29807,29808,29809,29810,29811,29812,29813,29814,29815,29816,29817,29818,29819,29820,29821,29822,29823,29824,29825,29826,29827,29828,29829,29830,29831,29832,29833,29834,29835,29836,29837,29838,29839,29840,29841,29842,29843,29844,29845,29846,29847,29848,29849,29850,29851,29852,29853,29854,29855,29856,29857,29858,29859,29860,29861,29862,29863,29864,29865,29866,29867,29868,29869,29870,29871,29872,29873,29874,29875,29876,29877,29878,29879,29880,29881,29882,29883,29884,29885,29886,29887,29888,29889,29890,29891,29892,29893,29894,29895,29896,29897,29898,29899,29900,29901,29902,29903,29904,29905,29906,29907,29908,29909,29910,29911,29912,29913,29914,29915,29916,29917,29918,29919,29920,29921,29922,29923,29924,29925,29926,29927,29928,29929,29930,29931,29932,29933,29934,29935,29936,29937,29938,29939,29940,29941,29942,29943,29944,29945,29946,29947,29948,29949,29950,29951,29952,29953,29954,29955,29956,29957,29958,29959,29960,29961,29962,29963,29964,29965,29966,29967,29968,29969,29970,29971,29972,29973,29974,29975,29976,29977,29978,29979,29980,29981,29982,29983,29984,29985,29986,29987,29988,29989,29990,29991,29992,29993,29994,29995,29996,29997,29998,29999,30000,30001,30002,30003,30004,30005,30006,30007,30008,30009,30010,30011,30012,30013,30014,30015,30016,30017,30018,30019,30020,30021,30022,30023,30024,30025,30026,30027,30028,30029,30030,30031,30032,30033,30034,30035,30036,30037,30038,30039,30040,30041,30042,30043,30044,30045,30046,30047,30048,30049,30050,30051,30052,30053,30054,30055,30056,30057,30058,30059,30060,30061,30062,30063,30064,30065,30066,30067,30068,30069,30070,30071,30072,30073,30074,30075,30076,30077,30078,30079,30080,30081,30082,30083,30084,30085,30086,30087,30088,30089,30090,30091,30092,30093,30094,30095,30096,30097,30098,30099,30100,30101,30102,30103,30104,30105,30106,30107,30108,30109,30110,30111,30112,30113,30114,30115,30116,30117,30118,30119,30120,30121,30122,30123,30124,30125,30126,30127,30128,30129,30130,30131,30132,30133,30134,30135,30136,30137,30138,30139,30140,30141,30142,30143,30144,30145,30146,30147,30148,30149,30150,30151,30152,30153,30154,30155,30156,30157,30158,30159,30160,30161,30162,30163,30164,30165,30166,30167,30168,30169,30170,30171,30172,30173,30174,30175,30176,30177,30178,30179,30180,30181,30182,30183,30184,30185,30186,30187,30188,30189,30190,30191,30192,30193,30194,30195,30196,30197,30198,30199,30200,30201,30202,30203,30204,30205,30206,30207,30208,30209,30210,30211,30212,30213,30214,30215,30216,30217,30218,30219,30220,30221,30222,30223,30224,30225,30226,30227,30228,30229,30230,30231,30232,30233,30234,30235,30236,30237,30238,30239,30240,30241,30242,30243,30244,30245,30246,30247,30248,30249,30250,30251,30252,30253,30254,30255,30256,30257,30258,30259,30260,30261,30262,30263,30264,30265,30266,30267,30268,30269,30270,30271,30272,30273,30274,30275,30276,30277,30278,30279,30280,30281,30282,30283,30284,30285,30286,30287,30288,30289,30290,30291,30292,30293,30294,30295,30296,30297,30298,30299,30300,30301,30302,30303,30304,30305,30306,30307,30308,30309,30310,30311,30312,30313,30314,30315,30316,30317,30318,30319,30320,30321,30322,30323,30324,30325,30326,30327,30328,30329,30330,30331,30332,30333,30334,30335,30336,30337,30338,30339,30340,30341,30342,30343,30344,30345,30346,30347,30348,30349,30350,30351,30352,30353,30354,30355,30356,30357,30358,30359,30360,30361,30362,30363,30364,30365,30366,30367,30368,30369,30370,30371,30372,30373,30374,30375,30376,30377,30378,30379,30380,30381,30382,30383,30384,30385,30386,30387,30388,30389,30390,30391,30392,30393,30394,30395,30396,30397,30398,30399,30400,30401,30402,30403,30404,30405,30406,30407,30408,30409,30410,30411,30412,30413,30414,30415,30416,30417,30418,30419,30420,30421,30422,30423,30424,30425,30426,30427,30428,30429,30430,30431,30432,30433,30434,30435,30436,30437,30438,30439,30440,30441,30442,30443,30444,30445,30446,30447,30448,30449,30450,30451,30452,30453,30454,30455,30456,30457,30458,30459,30460,30461,30462,30463,30464,30465,30466,30467,30468,30469,30470,30471,30472,30473,30474,30475,30476,30477,30478,30479,30480,30481,30482,30483,30484,30485,30486,30487,30488,30489,30490,30491,30492,30493,30494,30495,30496,30497,30498,30499,30500,30501,30502,30503,30504,30505,30506,30507,30508,30509,30510,30511,30512,30513,30514,30515,30516,30517,30518,30519,30520,30521,30522,30523,30524,30525,30526,30527,30528,30529,30530,30531,30532,30533,30534,30535,30536,30537,30538,30539,30540,30541,30542,30543,30544,30545,30546,30547,30548,30549,30550,30551,30552,30553,30554,30555,30556,30557,30558,30559,30560,30561,30562,30563,30564,30565,30566,30567,30568,30569,30570,30571,30572,30573,30574,30575,30576,30577,30578,30579,30580,30581,30582,30583,30584,30585,30586,30587,30588,30589,30590,30591,30592,30593,30594,30595,30596,30597,30598,30599,30600,30601,30602,30603,30604,30605,30606,30607,30608,30609,30610,30611,30612,30613,30614,30615,30616,30617,30618,30619,30620,30621,30622,30623,30624,30625,30626,30627,30628,30629,30630,30631,30632,30633,30634,30635,30636,30637,30638,30639,30640,30641,30642,30643,30644,30645,30646,30647,30648,30649,30650,30651,30652,30653,30654,30655,30656,30657,30658,30659,30660,30661,30662,30663,30664,30665,30666,30667,30668,30669,30670,30671,30672,30673,30674,30675,30676,30677,30678,30679,30680,30681,30682,30683,30684,30685,30686,30687,30688,30689,30690,30691,30692,30693,30694,30695,30696,30697,30698,30699,30700,30701,30702,30703,30704,30705,30706,30707,30708,30709,30710,30711,30712,30713,30714,30715,30716,30717,30718,30719,30720,30721,30722,30723,30724,30725,30726,30727,30728,30729,30730,30731,30732,30733,30734,30735,30736,30737,30738,30739,30740,30741,30742,30743,30744,30745,30746,30747,30748,30749,30750,30751,30752,30753,30754,30755,30756,30757,30758,30759,30760,30761,30762,30763,30764,30765,30766,30767,30768,30769,30770,30771,30772,30773,30774,30775,30776,30777,30778,30779,30780,30781,30782,30783,30784,30785,30786,30787,30788,30789,30790,30791,30792,30793,30794,30795,30796,30797,30798,30799,30800,30801,30802,30803,30804,30805,30806,30807,30808,30809,30810,30811,30812,30813,30814,30815,30816,30817,30818,30819,30820,30821,30822,30823,30824,30825,30826,30827,30828,30829,30830,30831,30832,30833,30834,30835,30836,30837,30838,30839,30840,30841,30842,30843,30844,30845,30846,30847,30848,30849,30850,30851,30852,30853,30854,30855,30856,30857,30858,30859,30860,30861,30862,30863,30864,30865,30866,30867,30868,30869,30870,30871,30872,30873,30874,30875,30876,30877,30878,30879,30880,30881,30882,30883,30884,30885,30886,30887,30888,30889,30890,30891,30892,30893,30894,30895,30896,30897,30898,30899,30900,30901,30902,30903,30904,30905,30906,30907,30908,30909,30910,30911,30912,30913,30914,30915,30916,30917,30918,30919,30920,30921,30922,30923,30924,30925,30926,30927,30928,30929,30930,30931,30932,30933,30934,30935,30936,30937,30938,30939,30940,30941,30942,30943,30944,30945,30946,30947,30948,30949,30950,30951,30952,30953,30954,30955,30956,30957,30958,30959,30960,30961,30962,30963,30964,30965,30966,30967,30968,30969,30970,30971,30972,30973,30974,30975,30976,30977,30978,30979,30980,30981,30982,30983,30984,30985,30986,30987,30988,30989,30990,30991,30992,30993,30994,30995,30996,30997,30998,30999,31000,31001,31002,31003,31004,31005,31006,31007,31008,31009,31010,31011,31012,31013,31014,31015,31016,31017,31018,31019,31020,31021,31022,31023,31024,31025,31026,31027,31028,31029,31030,31031,31032,31033,31034,31035,31036,31037,31038,31039,31040,31041,31042,31043,31044,31045,31046,31047,31048,31049,31050,31051,31052,31053,31054,31055,31056,31057,31058,31059,31060,31061,31062,31063,31064,31065,31066,31067,31068,31069,31070,31071,31072,31073,31074,31075,31076,31077,31078,31079,31080,31081,31082,31083,31084,31085,31086,31087,31088,31089,31090,31091,31092,31093,31094,31095,31096,31097,31098,31099,31100,31101,31102,31103,31104,31105,31106,31107,31108,31109,31110,31111,31112,31113,31114,31115,31116,31117,31118,31119,31120,31121,31122,31123,31124,31125,31126,31127,31128,31129,31130,31131,31132,31133,31134,31135,31136,31137,31138,31139,31140,31141,31142,31143,31144,31145,31146,31147,31148,31149,31150,31151,31152,31153,31154,31155,31156,31157,31158,31159,31160,31161,31162,31163,31164,31165,31166,31167,31168,31169,31170,31171,31172,31173,31174,31175,31176,31177,31178,31179,31180,31181,31182,31183,31184,31185,31186,31187,31188,31189,31190,31191,31192,31193,31194,31195,31196,31197,31198,31199,31200,31201,31202,31203,31204,31205,31206,31207,31208,31209,31210,31211,31212,31213,31214,31215,31216,31217,31218,31219,31220,31221,31222,31223,31224,31225,31226,31227,31228,31229,31230,31231,31232,31233,31234,31235,31236,31237,31238,31239,31240,31241,31242,31243,31244,31245,31246,31247,31248,31249,31250,31251,31252,31253,31254,31255,31256,31257,31258,31259,31260,31261,31262,31263,31264,31265,31266,31267,31268,31269,31270,31271,31272,31273,31274,31275,31276,31277,31278,31279,31280,31281,31282,31283,31284,31285,31286,31287,31288,31289,31290,31291,31292,31293,31294,31295,31296,31297,31298,31299,31300,31301,31302,31303,31304,31305,31306,31307,31308,31309,31310,31311,31312,31313,31314,31315,31316,31317,31318,31319,31320,31321,31322,31323,31324,31325,31326,31327,31328,31329,31330,31331,31332,31333,31334,31335,31336,31337,31338,31339,31340,31341,31342,31343,31344,31345,31346,31347,31348,31349,31350,31351,31352,31353,31354,31355,31356,31357,31358,31359,31360,31361,31362,31363,31364,31365,31366,31367,31368,31369,31370,31371,31372,31373,31374,31375,31376,31377,31378,31379,31380,31381,31382,31383,31384,31385,31386,31387,31388,31389,31390,31391,31392,31393,31394,31395,31396,31397,31398,31399,31400,31401,31402,31403,31404,31405,31406,31407,31408,31409,31410,31411,31412,31413,31414,31415,31416,31417,31418,31419,31420,31421,31422,31423,31424,31425,31426,31427,31428,31429,31430,31431,31432,31433,31434,31435,31436,31437,31438,31439,31440,31441,31442,31443,31444,31445,31446,31447,31448,31449,31450,31451,31452,31453,31454,31455,31456,31457,31458,31459,31460,31461,31462,31463,31464,31465,31466,31467,31468,31469,31470,31471,31472,31473,31474,31475,31476,31477,31478,31479,31480,31481,31482,31483,31484,31485,31486,31487,31488,31489,31490,31491,31492,31493,31494,31495,31496,31497,31498,31499,31500,31501,31502,31503,31504,31505,31506,31507,31508,31509,31510,31511,31512,31513,31514,31515,31516,31517,31518,31519,31520,31521,31522,31523,31524,31525,31526,31527,31528,31529,31530,31531,31532,31533,31534,31535,31536,31537,31538,31539,31540,31541,31542,31543,31544,31545,31546,31547,31548,31549,31550,31551,31552,31553,31554,31555,31556,31557,31558,31559,31560,31561,31562,31563,31564,31565,31566,31567,31568,31569,31570,31571,31572,31573,31574,31575,31576,31577,31578,31579,31580,31581,31582,31583,31584,31585,31586,31587,31588,31589,31590,31591,31592,31593,31594,31595,31596,31597,31598,31599,31600,31601,31602,31603,31604,31605,31606,31607,31608,31609,31610,31611,31612,31613,31614,31615,31616,31617,31618,31619,31620,31621,31622,31623,31624,31625,31626,31627,31628,31629,31630,31631,31632,31633,31634,31635,31636,31637,31638,31639,31640,31641,31642,31643,31644,31645,31646,31647,31648,31649,31650,31651,31652,31653,31654,31655,31656,31657,31658,31659,31660,31661,31662,31663,31664,31665,31666,31667,31668,31669,31670,31671,31672,31673,31674,31675,31676,31677,31678,31679,31680,31681,31682,31683,31684,31685,31686,31687,31688,31689,31690,31691,31692,31693,31694,31695,31696,31697,31698,31699,31700,31701,31702,31703,31704,31705,31706,31707,31708,31709,31710,31711,31712,31713,31714,31715,31716,31717,31718,31719,31720,31721,31722,31723,31724,31725,31726,31727,31728,31729,31730,31731,31732,31733,31734,31735,31736,31737,31738,31739,31740,31741,31742,31743,31744,31745,31746,31747,31748,31749,31750,31751,31752,31753,31754,31755,31756,31757,31758,31759,31760,31761,31762,31763,31764,31765,31766,31767,31768,31769,31770,31771,31772,31773,31774,31775,31776,31777,31778,31779,31780,31781,31782,31783,31784,31785,31786,31787,31788,31789,31790,31791,31792,31793,31794,31795,31796,31797,31798,31799,31800,31801,31802,31803,31804,31805,31806,31807,31808,31809,31810,31811,31812,31813,31814,31815,31816,31817,31818,31819,31820,31821,31822,31823,31824,31825,31826,31827,31828,31829,31830,31831,31832,31833,31834,31835,31836,31837,31838,31839,31840,31841,31842,31843,31844,31845,31846,31847,31848,31849,31850,31851,31852,31853,31854,31855,31856,31857,31858,31859,31860,31861,31862,31863,31864,31865,31866,31867,31868,31869,31870,31871,31872,31873,31874,31875,31876,31877,31878,31879,31880,31881,31882,31883,31884,31885,31886,31887,31888,31889,31890,31891,31892,31893,31894,31895,31896,31897,31898,31899,31900,31901,31902,31903,31904,31905,31906,31907,31908,31909,31910,31911,31912,31913,31914,31915,31916,31917,31918,31919,31920,31921,31922,31923,31924,31925,31926,31927,31928,31929,31930,31931,31932,31933,31934,31935,31936,31937,31938,31939,31940,31941,31942,31943,31944,31945,31946,31947,31948,31949,31950,31951,31952,31953,31954,31955,31956,31957,31958,31959,31960,31961,31962,31963,31964,31965,31966,31967,31968,31969,31970,31971,31972,31973,31974,31975,31976,31977,31978,31979,31980,31981,31982,31983,31984,31985,31986,31987,31988,31989,31990,31991,31992,31993,31994,31995,31996,31997,31998,31999,32000,32001,32002,32003,32004,32005,32006,32007,32008,32009,32010,32011,32012,32013,32014,32015,32016,32017,32018,32019,32020,32021,32022,32023,32024,32025,32026,32027,32028,32029,32030,32031,32032,32033,32034,32035,32036,32037,32038,32039,32040,32041,32042,32043,32044,32045,32046,32047,32048,32049,32050,32051,32052,32053,32054,32055,32056,32057,32058,32059,32060,32061,32062,32063,32064,32065,32066,32067,32068,32069,32070,32071,32072,32073,32074,32075,32076,32077,32078,32079,32080,32081,32082,32083,32084,32085,32086,32087,32088,32089,32090,32091,32092,32093,32094,32095,32096,32097,32098,32099,32100,32101,32102,32103,32104,32105,32106,32107,32108,32109,32110,32111,32112,32113,32114,32115,32116,32117,32118,32119,32120,32121,32122,32123,32124,32125,32126,32127,32128,32129,32130,32131,32132,32133,32134,32135,32136,32137,32138,32139,32140,32141,32142,32143,32144,32145,32146,32147,32148,32149,32150,32151,32152,32153,32154,32155,32156,32157,32158,32159,32160,32161,32162,32163,32164,32165,32166,32167,32168,32169,32170,32171,32172,32173,32174,32175,32176,32177,32178,32179,32180,32181,32182,32183,32184,32185,32186,32187,32188,32189,32190,32191,32192,32193,32194,32195,32196,32197,32198,32199,32200,32201,32202,32203,32204,32205,32206,32207,32208,32209,32210,32211,32212,32213,32214,32215,32216,32217,32218,32219,32220,32221,32222,32223,32224,32225,32226,32227,32228,32229,32230,32231,32232,32233,32234,32235,32236,32237,32238,32239,32240,32241,32242,32243,32244,32245,32246,32247,32248,32249,32250,32251,32252,32253,32254,32255,32256,32257,32258,32259,32260,32261,32262,32263,32264,32265,32266,32267,32268,32269,32270,32271,32272,32273,32274,32275,32276,32277,32278,32279,32280,32281,32282,32283,32284,32285,32286,32287,32288,32289,32290,32291,32292,32293,32294,32295,32296,32297,32298,32299,32300,32301,32302,32303,32304,32305,32306,32307,32308,32309,32310,32311,32312,32313,32314,32315,32316,32317,32318,32319,32320,32321,32322,32323,32324,32325,32326,32327,32328,32329,32330,32331,32332,32333,32334,32335,32336,32337,32338,32339,32340,32341,32342,32343,32344,32345,32346,32347,32348,32349,32350,32351,32352,32353,32354,32355,32356,32357,32358,32359,32360,32361,32362,32363,32364,32365,32366,32367,32368,32369,32370,32371,32372,32373,32374,32375,32376,32377,32378,32379,32380,32381,32382,32383,32384,32385,32386,32387,32388,32389,32390,32391,32392,32393,32394,32395,32396,32397,32398,32399,32400,32401,32402,32403,32404,32405,32406,32407,32408,32409,32410,32411,32412,32413,32414,32415,32416,32417,32418,32419,32420,32421,32422,32423,32424,32425,32426,32427,32428,32429,32430,32431,32432,32433,32434,32435,32436,32437,32438,32439,32440,32441,32442,32443,32444,32445,32446,32447,32448,32449,32450,32451,32452,32453,32454,32455,32456,32457,32458,32459,32460,32461,32462,32463,32464,32465,32466,32467,32468,32469,32470,32471,32472,32473,32474,32475,32476,32477,32478,32479,32480,32481,32482,32483,32484,32485,32486,32487,32488,32489,32490,32491,32492,32493,32494,32495,32496,32497,32498,32499,32500,32501,32502,32503,32504,32505,32506,32507,32508,32509,32510,32511,32512,32513,32514,32515,32516,32517,32518,32519,32520,32521,32522,32523,32524,32525,32526,32527,32528,32529,32530,32531,32532,32533,32534,32535,32536,32537,32538,32539,32540,32541,32542,32543,32544,32545,32546,32547,32548,32549,32550,32551,32552,32553,32554,32555,32556,32557,32558,32559,32560,32561,32562,32563,32564,32565,32566,32567,32568,32569,32570,32571,32572,32573,32574,32575,32576,32577,32578,32579,32580,32581,32582,32583,32584,32585,32586,32587,32588,32589,32590,32591,32592,32593,32594,32595,32596,32597,32598,32599,32600,32601,32602,32603,32604,32605,32606,32607,32608,32609,32610,32611,32612,32613,32614,32615,32616,32617,32618,32619,32620,32621,32622,32623,32624,32625,32626,32627,32628,32629,32630,32631,32632,32633,32634,32635,32636,32637,32638,32639,32640,32641,32642,32643,32644,32645,32646,32647,32648,32649,32650,32651,32652,32653,32654,32655,32656,32657,32658,32659,32660,32661,32662,32663,32664,32665,32666,32667,32668,32669,32670,32671,32672,32673,32674,32675,32676,32677,32678,32679,32680,32681,32682,32683,32684,32685,32686,32687,32688,32689,32690,32691,32692,32693,32694,32695,32696,32697,32698,32699,32700,32701,32702,32703,32704,32705,32706,32707,32708,32709,32710,32711,32712,32713,32714,32715,32716,32717,32718,32719,32720,32721,32722,32723,32724,32725,32726,32727,32728,32729,32730,32731,32732,32733,32734,32735,32736,32737,32738,32739,32740,32741,32742,32743,32744,32745,32746,32747,32748,32749,32750,32751,32752,32753,32754,32755,32756,32757,32758,32759,32760,32761,32762,32763,32764,32765,32766,32767,32768,32769,32770,32771,32772,32773,32774,32775,32776,32777,32778,32779,32780,32781,32782,32783,32784,32785,32786,32787,32788,32789,32790,32791,32792,32793,32794,32795,32796,32797,32798,32799,32800,32801,32802,32803,32804,32805,32806,32807,32808,32809,32810,32811,32812,32813,32814,32815,32816,32817,32818,32819,32820,32821,32822,32823,32824,32825,32826,32827,32828,32829,32830,32831,32832,32833,32834,32835,32836,32837,32838,32839,32840,32841,32842,32843,32844,32845,32846,32847,32848,32849,32850,32851,32852,32853,32854,32855,32856,32857,32858,32859,32860,32861,32862,32863,32864,32865,32866,32867,32868,32869,32870,32871,32872,32873,32874,32875,32876,32877,32878,32879,32880,32881,32882,32883,32884,32885,32886,32887,32888,32889,32890,32891,32892,32893,32894,32895,32896,32897,32898,32899,32900,32901,32902,32903,32904,32905,32906,32907,32908,32909,32910,32911,32912,32913,32914,32915,32916,32917,32918,32919,32920,32921,32922,32923,32924,32925,32926,32927,32928,32929,32930,32931,32932,32933,32934,32935,32936,32937,32938,32939,32940,32941,32942,32943,32944,32945,32946,32947,32948,32949,32950,32951,32952,32953,32954,32955,32956,32957,32958,32959,32960,32961,32962,32963,32964,32965,32966,32967,32968,32969,32970,32971,32972,32973,32974,32975,32976,32977,32978,32979,32980,32981,32982,32983,32984,32985,32986,32987,32988,32989,32990,32991,32992,32993,32994,32995,32996,32997,32998,32999,33000,33001,33002,33003,33004,33005,33006,33007,33008,33009,33010,33011,33012,33013,33014,33015,33016,33017,33018,33019,33020,33021,33022,33023,33024,33025,33026,33027,33028,33029,33030,33031,33032,33033,33034,33035,33036,33037,33038,33039,33040,33041,33042,33043,33044,33045,33046,33047,33048,33049,33050,33051,33052,33053,33054,33055,33056,33057,33058,33059,33060,33061,33062,33063,33064,33065,33066,33067,33068,33069,33070,33071,33072,33073,33074,33075,33076,33077,33078,33079,33080,33081,33082,33083,33084,33085,33086,33087,33088,33089,33090,33091,33092,33093,33094,33095,33096,33097,33098,33099,33100,33101,33102,33103,33104,33105,33106,33107,33108,33109,33110,33111,33112,33113,33114,33115,33116,33117,33118,33119,33120,33121,33122,33123,33124,33125,33126,33127,33128,33129,33130,33131,33132,33133,33134,33135,33136,33137,33138,33139,33140,33141,33142,33143,33144,33145,33146,33147,33148,33149,33150,33151,33152,33153,33154,33155,33156,33157,33158,33159,33160,33161,33162,33163,33164,33165,33166,33167,33168,33169,33170,33171,33172,33173,33174,33175,33176,33177,33178,33179,33180,33181,33182,33183,33184,33185,33186,33187,33188,33189,33190,33191,33192,33193,33194,33195,33196,33197,33198,33199,33200,33201,33202,33203,33204,33205,33206,33207,33208,33209,33210,33211,33212,33213,33214,33215,33216,33217,33218,33219,33220,33221,33222,33223,33224,33225,33226,33227,33228,33229,33230,33231,33232,33233,33234,33235,33236,33237,33238,33239,33240,33241,33242,33243,33244,33245,33246,33247,33248,33249,33250,33251,33252,33253,33254,33255,33256,33257,33258,33259,33260,33261,33262,33263,33264,33265,33266,33267,33268,33269,33270,33271,33272,33273,33274,33275,33276,33277,33278,33279,33280,33281,33282,33283,33284,33285,33286,33287,33288,33289,33290,33291,33292,33293,33294,33295,33296,33297,33298,33299,33300,33301,33302,33303,33304,33305,33306,33307,33308,33309,33310,33311,33312,33313,33314,33315,33316,33317,33318,33319,33320,33321,33322,33323,33324,33325,33326,33327,33328,33329,33330,33331,33332,33333,33334,33335,33336,33337,33338,33339,33340,33341,33342,33343,33344,33345,33346,33347,33348,33349,33350,33351,33352,33353,33354,33355,33356,33357,33358,33359,33360,33361,33362,33363,33364,33365,33366,33367,33368,33369,33370,33371,33372,33373,33374,33375,33376,33377,33378,33379,33380,33381,33382,33383,33384,33385,33386,33387,33388,33389,33390,33391,33392,33393,33394,33395,33396,33397,33398,33399,33400,33401,33402,33403,33404,33405,33406,33407,33408,33409,33410,33411,33412,33413,33414,33415,33416,33417,33418,33419,33420,33421,33422,33423,33424,33425,33426,33427,33428,33429,33430,33431,33432,33433,33434,33435,33436,33437,33438,33439,33440,33441,33442,33443,33444,33445,33446,33447,33448,33449,33450,33451,33452,33453,33454,33455,33456,33457,33458,33459,33460,33461,33462,33463,33464,33465,33466,33467,33468,33469,33470,33471,33472,33473,33474,33475,33476,33477,33478,33479,33480,33481,33482,33483,33484,33485,33486,33487,33488,33489,33490,33491,33492,33493,33494,33495,33496,33497,33498,33499,33500,33501,33502,33503,33504,33505,33506,33507,33508,33509,33510,33511,33512,33513,33514,33515,33516,33517,33518,33519,33520,33521,33522,33523,33524,33525,33526,33527,33528,33529,33530,33531,33532,33533,33534,33535,33536,33537,33538,33539,33540,33541,33542,33543,33544,33545,33546,33547,33548,33549,33550,33551,33552,33553,33554,33555,33556,33557,33558,33559,33560,33561,33562,33563,33564,33565,33566,33567,33568,33569,33570,33571,33572,33573,33574,33575,33576,33577,33578,33579,33580,33581,33582,33583,33584,33585,33586,33587,33588,33589,33590,33591,33592,33593,33594,33595,33596,33597,33598,33599,33600,33601,33602,33603,33604,33605,33606,33607,33608,33609,33610,33611,33612,33613,33614,33615,33616,33617,33618,33619,33620,33621,33622,33623,33624,33625,33626,33627,33628,33629,33630,33631,33632,33633,33634,33635,33636,33637,33638,33639,33640,33641,33642,33643,33644,33645,33646,33647,33648,33649,33650,33651,33652,33653,33654,33655,33656,33657,33658,33659,33660,33661,33662,33663,33664,33665,33666,33667,33668,33669,33670,33671,33672,33673,33674,33675,33676,33677,33678,33679,33680,33681,33682,33683,33684,33685,33686,33687,33688,33689,33690,33691,33692,33693,33694,33695,33696,33697,33698,33699,33700,33701,33702,33703,33704,33705,33706,33707,33708,33709,33710,33711,33712,33713,33714,33715,33716,33717,33718,33719,33720,33721,33722,33723,33724,33725,33726,33727,33728,33729,33730,33731,33732,33733,33734,33735,33736,33737,33738,33739,33740,33741,33742,33743,33744,33745,33746,33747,33748,33749,33750,33751,33752,33753,33754,33755,33756,33757,33758,33759,33760,33761,33762,33763,33764,33765,33766,33767,33768,33769,33770,33771,33772,33773,33774,33775,33776,33777,33778,33779,33780,33781,33782,33783,33784,33785,33786,33787,33788,33789,33790,33791,33792,33793,33794,33795,33796,33797,33798,33799,33800,33801,33802,33803,33804,33805,33806,33807,33808,33809,33810,33811,33812,33813,33814,33815,33816,33817,33818,33819,33820,33821,33822,33823,33824,33825,33826,33827,33828,33829,33830,33831,33832,33833,33834,33835,33836,33837,33838,33839,33840,33841,33842,33843,33844,33845,33846,33847,33848,33849,33850,33851,33852,33853,33854,33855,33856,33857,33858,33859,33860,33861,33862,33863,33864,33865,33866,33867,33868,33869,33870,33871,33872,33873,33874,33875,33876,33877,33878,33879,33880,33881,33882,33883,33884,33885,33886,33887,33888,33889,33890,33891,33892,33893,33894,33895,33896,33897,33898,33899,33900,33901,33902,33903,33904,33905,33906,33907,33908,33909,33910,33911,33912,33913,33914,33915,33916,33917,33918,33919,33920,33921,33922,33923,33924,33925,33926,33927,33928,33929,33930,33931,33932,33933,33934,33935,33936,33937,33938,33939,33940,33941,33942,33943,33944,33945,33946,33947,33948,33949,33950,33951,33952,33953,33954,33955,33956,33957,33958,33959,33960,33961,33962,33963,33964,33965,33966,33967,33968,33969,33970,33971,33972,33973,33974,33975,33976,33977,33978,33979,33980,33981,33982,33983,33984,33985,33986,33987,33988,33989,33990,33991,33992,33993,33994,33995,33996,33997,33998,33999,34000,34001,34002,34003,34004,34005,34006,34007,34008,34009,34010,34011,34012,34013,34014,34015,34016,34017,34018,34019,34020,34021,34022,34023,34024,34025,34026,34027,34028,34029,34030,34031,34032,34033,34034,34035,34036,34037,34038,34039,34040,34041,34042,34043,34044,34045,34046,34047,34048,34049,34050,34051,34052,34053,34054,34055,34056,34057,34058,34059,34060,34061,34062,34063,34064,34065,34066,34067,34068,34069,34070,34071,34072,34073,34074,34075,34076,34077,34078,34079,34080,34081,34082,34083,34084,34085,34086,34087,34088,34089,34090,34091,34092,34093,34094,34095,34096,34097,34098,34099,34100,34101,34102,34103,34104,34105,34106,34107,34108,34109,34110,34111,34112,34113,34114,34115,34116,34117,34118,34119,34120,34121,34122,34123,34124,34125,34126,34127,34128,34129,34130,34131,34132,34133,34134,34135,34136,34137,34138,34139,34140,34141,34142,34143,34144,34145,34146,34147,34148,34149,34150,34151,34152,34153,34154,34155,34156,34157,34158,34159,34160,34161,34162,34163,34164,34165,34166,34167,34168,34169,34170,34171,34172,34173,34174,34175,34176,34177,34178,34179,34180,34181,34182,34183,34184,34185,34186,34187,34188,34189,34190,34191,34192,34193,34194,34195,34196,34197,34198,34199,34200,34201,34202,34203,34204,34205,34206,34207,34208,34209,34210,34211,34212,34213,34214,34215,34216,34217,34218,34219,34220,34221,34222,34223,34224,34225,34226,34227,34228,34229,34230,34231,34232,34233,34234,34235,34236,34237,34238,34239,34240,34241,34242,34243,34244,34245,34246,34247,34248,34249,34250,34251,34252,34253,34254,34255,34256,34257,34258,34259,34260,34261,34262,34263,34264,34265,34266,34267,34268,34269,34270,34271,34272,34273,34274,34275,34276,34277,34278,34279,34280,34281,34282,34283,34284,34285,34286,34287,34288,34289,34290,34291,34292,34293,34294,34295,34296,34297,34298,34299,34300,34301,34302,34303,34304,34305,34306,34307,34308,34309,34310,34311,34312,34313,34314,34315,34316,34317,34318,34319,34320,34321,34322,34323,34324,34325,34326,34327,34328,34329,34330,34331,34332,34333,34334,34335,34336,34337,34338,34339,34340,34341,34342,34343,34344,34345,34346,34347,34348,34349,34350,34351,34352,34353,34354,34355,34356,34357,34358,34359,34360,34361,34362,34363,34364,34365,34366,34367,34368,34369,34370,34371,34372,34373,34374,34375,34376,34377,34378,34379,34380,34381,34382,34383,34384,34385,34386,34387,34388,34389,34390,34391,34392,34393,34394,34395,34396,34397,34398,34399,34400,34401,34402,34403,34404,34405,34406,34407,34408,34409,34410,34411,34412,34413,34414,34415,34416,34417,34418,34419,34420,34421,34422,34423,34424,34425,34426,34427,34428,34429,34430,34431,34432,34433,34434,34435,34436,34437,34438,34439,34440,34441,34442,34443,34444,34445,34446,34447,34448,34449,34450,34451,34452,34453,34454,34455,34456,34457,34458,34459,34460,34461,34462,34463,34464,34465,34466,34467,34468,34469,34470,34471,34472,34473,34474,34475,34476,34477,34478,34479,34480,34481,34482,34483,34484,34485,34486,34487,34488,34489,34490,34491,34492,34493,34494,34495,34496,34497,34498,34499,34500,34501,34502,34503,34504,34505,34506,34507,34508,34509,34510,34511,34512,34513,34514,34515,34516,34517,34518,34519,34520,34521,34522,34523,34524,34525,34526,34527,34528,34529,34530,34531,34532,34533,34534,34535,34536,34537,34538,34539,34540,34541,34542,34543,34544,34545,34546,34547,34548,34549,34550,34551,34552,34553,34554,34555,34556,34557,34558,34559,34560,34561,34562,34563,34564,34565,34566,34567,34568,34569,34570,34571,34572,34573,34574,34575,34576,34577,34578,34579,34580,34581,34582,34583,34584,34585,34586,34587,34588,34589,34590,34591,34592,34593,34594,34595,34596,34597,34598,34599,34600,34601,34602,34603,34604,34605,34606,34607,34608,34609,34610,34611,34612,34613,34614,34615,34616,34617,34618,34619,34620,34621,34622,34623,34624,34625,34626,34627,34628,34629,34630,34631,34632,34633,34634,34635,34636,34637,34638,34639,34640,34641,34642,34643,34644,34645,34646,34647,34648,34649,34650,34651,34652,34653,34654,34655,34656,34657,34658,34659,34660,34661,34662,34663,34664,34665,34666,34667,34668,34669,34670,34671,34672,34673,34674,34675,34676,34677,34678,34679,34680,34681,34682,34683,34684,34685,34686,34687,34688,34689,34690,34691,34692,34693,34694,34695,34696,34697,34698,34699,34700,34701,34702,34703,34704,34705,34706,34707,34708,34709,34710,34711,34712,34713,34714,34715,34716,34717,34718,34719,34720,34721,34722,34723,34724,34725,34726,34727,34728,34729,34730,34731,34732,34733,34734,34735,34736,34737,34738,34739,34740,34741,34742,34743,34744,34745,34746,34747,34748,34749,34750,34751,34752,34753,34754,34755,34756,34757,34758,34759,34760,34761,34762,34763,34764,34765,34766,34767,34768,34769,34770,34771,34772,34773,34774,34775,34776,34777,34778,34779,34780,34781,34782,34783,34784,34785,34786,34787,34788,34789,34790,34791,34792,34793,34794,34795,34796,34797,34798,34799,34800,34801,34802,34803,34804,34805,34806,34807,34808,34809,34810,34811,34812,34813,34814,34815,34816,34817,34818,34819,34820,34821,34822,34823,34824,34825,34826,34827,34828,34829,34830,34831,34832,34833,34834,34835,34836,34837,34838,34839,34840,34841,34842,34843,34844,34845,34846,34847,34848,34849,34850,34851,34852,34853,34854,34855,34856,34857,34858,34859,34860,34861,34862,34863,34864,34865,34866,34867,34868,34869,34870,34871,34872,34873,34874,34875,34876,34877,34878,34879,34880,34881,34882,34883,34884,34885,34886,34887,34888,34889,34890,34891,34892,34893,34894,34895,34896,34897,34898,34899,34900,34901,34902,34903,34904,34905,34906,34907,34908,34909,34910,34911,34912,34913,34914,34915,34916,34917,34918,34919,34920,34921,34922,34923,34924,34925,34926,34927,34928,34929,34930,34931,34932,34933,34934,34935,34936,34937,34938,34939,34940,34941,34942,34943,34944,34945,34946,34947,34948,34949,34950,34951,34952,34953,34954,34955,34956,34957,34958,34959,34960,34961,34962,34963,34964,34965,34966,34967,34968,34969,34970,34971,34972,34973,34974,34975,34976,34977,34978,34979,34980,34981,34982,34983,34984,34985,34986,34987,34988,34989,34990,34991,34992,34993,34994,34995,34996,34997,34998,34999,35000,35001,35002,35003,35004,35005,35006,35007,35008,35009,35010,35011,35012,35013,35014,35015,35016,35017,35018,35019,35020,35021,35022,35023,35024,35025,35026,35027,35028,35029,35030,35031,35032,35033,35034,35035,35036,35037,35038,35039,35040,35041,35042,35043,35044,35045,35046,35047,35048,35049,35050,35051,35052,35053,35054,35055,35056,35057,35058,35059,35060,35061,35062,35063,35064,35065,35066,35067,35068,35069,35070,35071,35072,35073,35074,35075,35076,35077,35078,35079,35080,35081,35082,35083,35084,35085,35086,35087,35088,35089,35090,35091,35092,35093,35094,35095,35096,35097,35098,35099,35100,35101,35102,35103,35104,35105,35106,35107,35108,35109,35110,35111,35112,35113,35114,35115,35116,35117,35118,35119,35120,35121,35122,35123,35124,35125,35126,35127,35128,35129,35130,35131,35132,35133,35134,35135,35136,35137,35138,35139,35140,35141,35142,35143,35144,35145,35146,35147,35148,35149,35150,35151,35152,35153,35154,35155,35156,35157,35158,35159,35160,35161,35162,35163,35164,35165,35166,35167,35168,35169,35170,35171,35172,35173,35174,35175,35176,35177,35178,35179,35180,35181,35182,35183,35184,35185,35186,35187,35188,35189,35190,35191,35192,35193,35194,35195,35196,35197,35198,35199,35200,35201,35202,35203,35204,35205,35206,35207,35208,35209,35210,35211,35212,35213,35214,35215,35216,35217,35218,35219,35220,35221,35222,35223,35224,35225,35226,35227,35228,35229,35230,35231,35232,35233,35234,35235,35236,35237,35238,35239,35240,35241,35242,35243,35244,35245,35246,35247,35248,35249,35250,35251,35252,35253,35254,35255,35256,35257,35258,35259,35260,35261,35262,35263,35264,35265,35266,35267,35268,35269,35270,35271,35272,35273,35274,35275,35276,35277,35278,35279,35280,35281,35282,35283,35284,35285,35286,35287,35288,35289,35290,35291,35292,35293,35294,35295,35296,35297,35298,35299,35300,35301,35302,35303,35304,35305,35306,35307,35308,35309,35310,35311,35312,35313,35314,35315,35316,35317,35318,35319,35320,35321,35322,35323,35324,35325,35326,35327,35328,35329,35330,35331,35332,35333,35334,35335,35336,35337,35338,35339,35340,35341,35342,35343,35344,35345,35346,35347,35348,35349,35350,35351,35352,35353,35354,35355,35356,35357,35358,35359,35360,35361,35362,35363,35364,35365,35366,35367,35368,35369,35370,35371,35372,35373,35374,35375,35376,35377,35378,35379,35380,35381,35382,35383,35384,35385,35386,35387,35388,35389,35390,35391,35392,35393,35394,35395,35396,35397,35398,35399,35400,35401,35402,35403,35404,35405,35406,35407,35408,35409,35410,35411,35412,35413,35414,35415,35416,35417,35418,35419,35420,35421,35422,35423,35424,35425,35426,35427,35428,35429,35430,35431,35432,35433,35434,35435,35436,35437,35438,35439,35440,35441,35442,35443,35444,35445,35446,35447,35448,35449,35450,35451,35452,35453,35454,35455,35456,35457,35458,35459,35460,35461,35462,35463,35464,35465,35466,35467,35468,35469,35470,35471,35472,35473,35474,35475,35476,35477,35478,35479,35480,35481,35482,35483,35484,35485,35486,35487,35488,35489,35490,35491,35492,35493,35494,35495,35496,35497,35498,35499,35500,35501,35502,35503,35504,35505,35506,35507,35508,35509,35510,35511,35512,35513,35514,35515,35516,35517,35518,35519,35520,35521,35522,35523,35524,35525,35526,35527,35528,35529,35530,35531,35532,35533,35534,35535,35536,35537,35538,35539,35540,35541,35542,35543,35544,35545,35546,35547,35548,35549,35550,35551,35552,35553,35554,35555,35556,35557,35558,35559,35560,35561,35562,35563,35564,35565,35566,35567,35568,35569,35570,35571,35572,35573,35574,35575,35576,35577,35578,35579,35580,35581,35582,35583,35584,35585,35586,35587,35588,35589,35590,35591,35592,35593,35594,35595,35596,35597,35598,35599,35600,35601,35602,35603,35604,35605,35606,35607,35608,35609,35610,35611,35612,35613,35614,35615,35616,35617,35618,35619,35620,35621,35622,35623,35624,35625,35626,35627,35628,35629,35630,35631,35632,35633,35634,35635,35636,35637,35638,35639,35640,35641,35642,35643,35644,35645,35646,35647,35648,35649,35650,35651,35652,35653,35654,35655,35656,35657,35658,35659,35660,35661,35662,35663,35664,35665,35666,35667,35668,35669,35670,35671,35672,35673,35674,35675,35676,35677,35678,35679,35680,35681,35682,35683,35684,35685,35686,35687,35688,35689,35690,35691,35692,35693,35694,35695,35696,35697,35698,35699,35700,35701,35702,35703,35704,35705,35706,35707,35708,35709,35710,35711,35712,35713,35714,35715,35716,35717,35718,35719,35720,35721,35722,35723,35724,35725,35726,35727,35728,35729,35730,35731,35732,35733,35734,35735,35736,35737,35738,35739,35740,35741,35742,35743,35744,35745,35746,35747,35748,35749,35750,35751,35752,35753,35754,35755,35756,35757,35758,35759,35760,35761,35762,35763,35764,35765,35766,35767,35768,35769,35770,35771,35772,35773,35774,35775,35776,35777,35778,35779,35780,35781,35782,35783,35784,35785,35786,35787,35788,35789,35790,35791,35792,35793,35794,35795,35796,35797,35798,35799,35800,35801,35802,35803,35804,35805,35806,35807,35808,35809,35810,35811,35812,35813,35814,35815,35816,35817,35818,35819,35820,35821,35822,35823,35824,35825,35826,35827,35828,35829,35830,35831,35832,35833,35834,35835,35836,35837,35838,35839,35840,35841,35842,35843,35844,35845,35846,35847,35848,35849,35850,35851,35852,35853,35854,35855,35856,35857,35858,35859,35860,35861,35862,35863,35864,35865,35866,35867,35868,35869,35870,35871,35872,35873,35874,35875,35876,35877,35878,35879,35880,35881,35882,35883,35884,35885,35886,35887,35888,35889,35890,35891,35892,35893,35894,35895,35896,35897,35898,35899,35900,35901,35902,35903,35904,35905,35906,35907,35908,35909,35910,35911,35912,35913,35914,35915,35916,35917,35918,35919,35920,35921,35922,35923,35924,35925,35926,35927,35928,35929,35930,35931,35932,35933,35934,35935,35936,35937,35938,35939,35940,35941,35942,35943,35944,35945,35946,35947,35948,35949,35950,35951,35952,35953,35954,35955,35956,35957,35958,35959,35960,35961,35962,35963,35964,35965,35966,35967,35968,35969,35970,35971,35972,35973,35974,35975,35976,35977,35978,35979,35980,35981,35982,35983,35984,35985,35986,35987,35988,35989,35990,35991,35992,35993,35994,35995,35996,35997,35998,35999,36000,36001,36002,36003,36004,36005,36006,36007,36008,36009,36010,36011,36012,36013,36014,36015,36016,36017,36018,36019,36020,36021,36022,36023,36024,36025,36026,36027,36028,36029,36030,36031,36032,36033,36034,36035,36036,36037,36038,36039,36040,36041,36042,36043,36044,36045,36046,36047,36048,36049,36050,36051,36052,36053,36054,36055,36056,36057,36058,36059,36060,36061,36062,36063,36064,36065,36066,36067,36068,36069,36070,36071,36072,36073,36074,36075,36076,36077,36078,36079,36080,36081,36082,36083,36084,36085,36086,36087,36088,36089,36090,36091,36092,36093,36094,36095,36096,36097,36098,36099,36100,36101,36102,36103,36104,36105,36106,36107,36108,36109,36110,36111,36112,36113,36114,36115,36116,36117,36118,36119,36120,36121,36122,36123,36124,36125,36126,36127,36128,36129,36130,36131,36132,36133,36134,36135,36136,36137,36138,36139,36140,36141,36142,36143,36144,36145,36146,36147,36148,36149,36150,36151,36152,36153,36154,36155,36156,36157,36158,36159,36160,36161,36162,36163,36164,36165,36166,36167,36168,36169,36170,36171,36172,36173,36174,36175,36176,36177,36178,36179,36180,36181,36182,36183,36184,36185,36186,36187,36188,36189,36190,36191,36192,36193,36194,36195,36196,36197,36198,36199,36200,36201,36202,36203,36204,36205,36206,36207,36208,36209,36210,36211,36212,36213,36214,36215,36216,36217,36218,36219,36220,36221,36222,36223,36224,36225,36226,36227,36228,36229,36230,36231,36232,36233,36234,36235,36236,36237,36238,36239,36240,36241,36242,36243,36244,36245,36246,36247,36248,36249,36250,36251,36252,36253,36254,36255,36256,36257,36258,36259,36260,36261,36262,36263,36264,36265,36266,36267,36268,36269,36270,36271,36272,36273,36274,36275,36276,36277,36278,36279,36280,36281,36282,36283,36284,36285,36286,36287,36288,36289,36290,36291,36292,36293,36294,36295,36296,36297,36298,36299,36300,36301,36302,36303,36304,36305,36306,36307,36308,36309,36310,36311,36312,36313,36314,36315,36316,36317,36318,36319,36320,36321,36322,36323,36324,36325,36326,36327,36328,36329,36330,36331,36332,36333,36334,36335,36336,36337,36338,36339,36340,36341,36342,36343,36344,36345,36346,36347,36348,36349,36350,36351,36352,36353,36354,36355,36356,36357,36358,36359,36360,36361,36362,36363,36364,36365,36366,36367,36368,36369,36370,36371,36372,36373,36374,36375,36376,36377,36378,36379,36380,36381,36382,36383,36384,36385,36386,36387,36388,36389,36390,36391,36392,36393,36394,36395,36396,36397,36398,36399,36400,36401,36402,36403,36404,36405,36406,36407,36408,36409,36410,36411,36412,36413,36414,36415,36416,36417,36418,36419,36420,36421,36422,36423,36424,36425,36426,36427,36428,36429,36430,36431,36432,36433,36434,36435,36436,36437,36438,36439,36440,36441,36442,36443,36444,36445,36446,36447,36448,36449,36450,36451,36452,36453,36454,36455,36456,36457,36458,36459,36460,36461,36462,36463,36464,36465,36466,36467,36468,36469,36470,36471,36472,36473,36474,36475,36476,36477,36478,36479,36480,36481,36482,36483,36484,36485,36486,36487,36488,36489,36490,36491,36492,36493,36494,36495,36496,36497,36498,36499,36500,36501,36502,36503,36504,36505,36506,36507,36508,36509,36510,36511,36512,36513,36514,36515,36516,36517,36518,36519,36520,36521,36522,36523,36524,36525,36526,36527,36528,36529,36530,36531,36532,36533,36534,36535,36536,36537,36538,36539,36540,36541,36542,36543,36544,36545,36546,36547,36548,36549,36550,36551,36552,36553,36554,36555,36556,36557,36558,36559,36560,36561,36562,36563,36564,36565,36566,36567,36568,36569,36570,36571,36572,36573,36574,36575,36576,36577,36578,36579,36580,36581,36582,36583,36584,36585,36586,36587,36588,36589,36590,36591,36592,36593,36594,36595,36596,36597,36598,36599,36600,36601,36602,36603,36604,36605,36606,36607,36608,36609,36610,36611,36612,36613,36614,36615,36616,36617,36618,36619,36620,36621,36622,36623,36624,36625,36626,36627,36628,36629,36630,36631,36632,36633,36634,36635,36636,36637,36638,36639,36640,36641,36642,36643,36644,36645,36646,36647,36648,36649,36650,36651,36652,36653,36654,36655,36656,36657,36658,36659,36660,36661,36662,36663,36664,36665,36666,36667,36668,36669,36670,36671,36672,36673,36674,36675,36676,36677,36678,36679,36680,36681,36682,36683,36684,36685,36686,36687,36688,36689,36690,36691,36692,36693,36694,36695,36696,36697,36698,36699,36700,36701,36702,36703,36704,36705,36706,36707,36708,36709,36710,36711,36712,36713,36714,36715,36716,36717,36718,36719,36720,36721,36722,36723,36724,36725,36726,36727,36728,36729,36730,36731,36732,36733,36734,36735,36736,36737,36738,36739,36740,36741,36742,36743,36744,36745,36746,36747,36748,36749,36750,36751,36752,36753,36754,36755,36756,36757,36758,36759,36760,36761,36762,36763,36764,36765,36766,36767,36768,36769,36770,36771,36772,36773,36774,36775,36776,36777,36778,36779,36780,36781,36782,36783,36784,36785,36786,36787,36788,36789,36790,36791,36792,36793,36794,36795,36796,36797,36798,36799,36800,36801,36802,36803,36804,36805,36806,36807,36808,36809,36810,36811,36812,36813,36814,36815,36816,36817,36818,36819,36820,36821,36822,36823,36824,36825,36826,36827,36828,36829,36830,36831,36832,36833,36834,36835,36836,36837,36838,36839,36840,36841,36842,36843,36844,36845,36846,36847,36848,36849,36850,36851,36852,36853,36854,36855,36856,36857,36858,36859,36860,36861,36862,36863,36864,36865,36866,36867,36868,36869,36870,36871,36872,36873,36874,36875,36876,36877,36878,36879,36880,36881,36882,36883,36884,36885,36886,36887,36888,36889,36890,36891,36892,36893,36894,36895,36896,36897,36898,36899,36900,36901,36902,36903,36904,36905,36906,36907,36908,36909,36910,36911,36912,36913,36914,36915,36916,36917,36918,36919,36920,36921,36922,36923,36924,36925,36926,36927,36928,36929,36930,36931,36932,36933,36934,36935,36936,36937,36938,36939,36940,36941,36942,36943,36944,36945,36946,36947,36948,36949,36950,36951,36952,36953,36954,36955,36956,36957,36958,36959,36960,36961,36962,36963,36964,36965,36966,36967,36968,36969,36970,36971,36972,36973,36974,36975,36976,36977,36978,36979,36980,36981,36982,36983,36984,36985,36986,36987,36988,36989,36990,36991,36992,36993,36994,36995,36996,36997,36998,36999,37000,37001,37002,37003,37004,37005,37006,37007,37008,37009,37010,37011,37012,37013,37014,37015,37016,37017,37018,37019,37020,37021,37022,37023,37024,37025,37026,37027,37028,37029,37030,37031,37032,37033,37034,37035,37036,37037,37038,37039,37040,37041,37042,37043,37044,37045,37046,37047,37048,37049,37050,37051,37052,37053,37054,37055,37056,37057,37058,37059,37060,37061,37062,37063,37064,37065,37066,37067,37068,37069,37070,37071,37072,37073,37074,37075,37076,37077,37078,37079,37080,37081,37082,37083,37084,37085,37086,37087,37088,37089,37090,37091,37092,37093,37094,37095,37096,37097,37098,37099,37100,37101,37102,37103,37104,37105,37106,37107,37108,37109,37110,37111,37112,37113,37114,37115,37116,37117,37118,37119,37120,37121,37122,37123,37124,37125,37126,37127,37128,37129,37130,37131,37132,37133,37134,37135,37136,37137,37138,37139,37140,37141,37142,37143,37144,37145,37146,37147,37148,37149,37150,37151,37152,37153,37154,37155,37156,37157,37158,37159,37160,37161,37162,37163,37164,37165,37166,37167,37168,37169,37170,37171,37172,37173,37174,37175,37176,37177,37178,37179,37180,37181,37182,37183,37184,37185,37186,37187,37188,37189,37190,37191,37192,37193,37194,37195,37196,37197,37198,37199,37200,37201,37202,37203,37204,37205,37206,37207,37208,37209,37210,37211,37212,37213,37214,37215,37216,37217,37218,37219,37220,37221,37222,37223,37224,37225,37226,37227,37228,37229,37230,37231,37232,37233,37234,37235,37236,37237,37238,37239,37240,37241,37242,37243,37244,37245,37246,37247,37248,37249,37250,37251,37252,37253,37254,37255,37256,37257,37258,37259,37260,37261,37262,37263,37264,37265,37266,37267,37268,37269,37270,37271,37272,37273,37274,37275,37276,37277,37278,37279,37280,37281,37282,37283,37284,37285,37286,37287,37288,37289,37290,37291,37292,37293,37294,37295,37296,37297,37298,37299,37300,37301,37302,37303,37304,37305,37306,37307,37308,37309,37310,37311,37312,37313,37314,37315,37316,37317,37318,37319,37320,37321,37322,37323,37324,37325,37326,37327,37328,37329,37330,37331,37332,37333,37334,37335,37336,37337,37338,37339,37340,37341,37342,37343,37344,37345,37346,37347,37348,37349,37350,37351,37352,37353,37354,37355,37356,37357,37358,37359,37360,37361,37362,37363,37364,37365,37366,37367,37368,37369,37370,37371,37372,37373,37374,37375,37376,37377,37378,37379,37380,37381,37382,37383,37384,37385,37386,37387,37388,37389,37390,37391,37392,37393,37394,37395,37396,37397,37398,37399,37400,37401,37402,37403,37404,37405,37406,37407,37408,37409,37410,37411,37412,37413,37414,37415,37416,37417,37418,37419,37420,37421,37422,37423,37424,37425,37426,37427,37428,37429,37430,37431,37432,37433,37434,37435,37436,37437,37438,37439,37440,37441,37442,37443,37444,37445,37446,37447,37448,37449,37450,37451,37452,37453,37454,37455,37456,37457,37458,37459,37460,37461,37462,37463,37464,37465,37466,37467,37468,37469,37470,37471,37472,37473,37474,37475,37476,37477,37478,37479,37480,37481,37482,37483,37484,37485,37486,37487,37488,37489,37490,37491,37492,37493,37494,37495,37496,37497,37498,37499,37500,37501,37502,37503,37504,37505,37506,37507,37508,37509,37510,37511,37512,37513,37514,37515,37516,37517,37518,37519,37520,37521,37522,37523,37524,37525,37526,37527,37528,37529,37530,37531,37532,37533,37534,37535,37536,37537,37538,37539,37540,37541,37542,37543,37544,37545,37546,37547,37548,37549,37550,37551,37552,37553,37554,37555,37556,37557,37558,37559,37560,37561,37562,37563,37564,37565,37566,37567,37568,37569,37570,37571,37572,37573,37574,37575,37576,37577,37578,37579,37580,37581,37582,37583,37584,37585,37586,37587,37588,37589,37590,37591,37592,37593,37594,37595,37596,37597,37598,37599,37600,37601,37602,37603,37604,37605,37606,37607,37608,37609,37610,37611,37612,37613,37614,37615,37616,37617,37618,37619,37620,37621,37622,37623,37624,37625,37626,37627,37628,37629,37630,37631,37632,37633,37634,37635,37636,37637,37638,37639,37640,37641,37642,37643,37644,37645,37646,37647,37648,37649,37650,37651,37652,37653,37654,37655,37656,37657,37658,37659,37660,37661,37662,37663,37664,37665,37666,37667,37668,37669,37670,37671,37672,37673,37674,37675,37676,37677,37678,37679,37680,37681,37682,37683,37684,37685,37686,37687,37688,37689,37690,37691,37692,37693,37694,37695,37696,37697,37698,37699,37700,37701,37702,37703,37704,37705,37706,37707,37708,37709,37710,37711,37712,37713,37714,37715,37716,37717,37718,37719,37720,37721,37722,37723,37724,37725,37726,37727,37728,37729,37730,37731,37732,37733,37734,37735,37736,37737,37738,37739,37740,37741,37742,37743,37744,37745,37746,37747,37748,37749,37750,37751,37752,37753,37754,37755,37756,37757,37758,37759,37760,37761,37762,37763,37764,37765,37766,37767,37768,37769,37770,37771,37772,37773,37774,37775,37776,37777,37778,37779,37780,37781,37782,37783,37784,37785,37786,37787,37788,37789,37790,37791,37792,37793,37794,37795,37796,37797,37798,37799,37800,37801,37802,37803,37804,37805,37806,37807,37808,37809,37810,37811,37812,37813,37814,37815,37816,37817,37818,37819,37820,37821,37822,37823,37824,37825,37826,37827,37828,37829,37830,37831,37832,37833,37834,37835,37836,37837,37838,37839,37840,37841,37842,37843,37844,37845,37846,37847,37848,37849,37850,37851,37852,37853,37854,37855,37856,37857,37858,37859,37860,37861,37862,37863,37864,37865,37866,37867,37868,37869,37870,37871,37872,37873,37874,37875,37876,37877,37878,37879,37880,37881,37882,37883,37884,37885,37886,37887,37888,37889,37890,37891,37892,37893,37894,37895,37896,37897,37898,37899,37900,37901,37902,37903,37904,37905,37906,37907,37908,37909,37910,37911,37912,37913,37914,37915,37916,37917,37918,37919,37920,37921,37922,37923,37924,37925,37926,37927,37928,37929,37930,37931,37932,37933,37934,37935,37936,37937,37938,37939,37940,37941,37942,37943,37944,37945,37946,37947,37948,37949,37950,37951,37952,37953,37954,37955,37956,37957,37958,37959,37960,37961,37962,37963,37964,37965,37966,37967,37968,37969,37970,37971,37972,37973,37974,37975,37976,37977,37978,37979,37980,37981,37982,37983,37984,37985,37986,37987,37988,37989,37990,37991,37992,37993,37994,37995,37996,37997,37998,37999,38000,38001,38002,38003,38004,38005,38006,38007,38008,38009,38010,38011,38012,38013,38014,38015,38016,38017,38018,38019,38020,38021,38022,38023,38024,38025,38026,38027,38028,38029,38030,38031,38032,38033,38034,38035,38036,38037,38038,38039,38040,38041,38042,38043,38044,38045,38046,38047,38048,38049,38050,38051,38052,38053,38054,38055,38056,38057,38058,38059,38060,38061,38062,38063,38064,38065,38066,38067,38068,38069,38070,38071,38072,38073,38074,38075,38076,38077,38078,38079,38080,38081,38082,38083,38084,38085,38086,38087,38088,38089,38090,38091,38092,38093,38094,38095,38096,38097,38098,38099,38100,38101,38102,38103,38104,38105,38106,38107,38108,38109,38110,38111,38112,38113,38114,38115,38116,38117,38118,38119,38120,38121,38122,38123,38124,38125,38126,38127,38128,38129,38130,38131,38132,38133,38134,38135,38136,38137,38138,38139,38140,38141,38142,38143,38144,38145,38146,38147,38148,38149,38150,38151,38152,38153,38154,38155,38156,38157,38158,38159,38160,38161,38162,38163,38164,38165,38166,38167,38168,38169,38170,38171,38172,38173,38174,38175,38176,38177,38178,38179,38180,38181,38182,38183,38184,38185,38186,38187,38188,38189,38190,38191,38192,38193,38194,38195,38196,38197,38198,38199,38200,38201,38202,38203,38204,38205,38206,38207,38208,38209,38210,38211,38212,38213,38214,38215,38216,38217,38218,38219,38220,38221,38222,38223,38224,38225,38226,38227,38228,38229,38230,38231,38232,38233,38234,38235,38236,38237,38238,38239,38240,38241,38242,38243,38244,38245,38246,38247,38248,38249,38250,38251,38252,38253,38254,38255,38256,38257,38258,38259,38260,38261,38262,38263,38264,38265,38266,38267,38268,38269,38270,38271,38272,38273,38274,38275,38276,38277,38278,38279,38280,38281,38282,38283,38284,38285,38286,38287,38288,38289,38290,38291,38292,38293,38294,38295,38296,38297,38298,38299,38300,38301,38302,38303,38304,38305,38306,38307,38308,38309,38310,38311,38312,38313,38314,38315,38316,38317,38318,38319,38320,38321,38322,38323,38324,38325,38326,38327,38328,38329,38330,38331,38332,38333,38334,38335,38336,38337,38338,38339,38340,38341,38342,38343,38344,38345,38346,38347,38348,38349,38350,38351,38352,38353,38354,38355,38356,38357,38358,38359,38360,38361,38362,38363,38364,38365,38366,38367,38368,38369,38370,38371,38372,38373,38374,38375,38376,38377,38378,38379,38380,38381,38382,38383,38384,38385,38386,38387,38388,38389,38390,38391,38392,38393,38394,38395,38396,38397,38398,38399,38400,38401,38402,38403,38404,38405,38406,38407,38408,38409,38410,38411,38412,38413,38414,38415,38416,38417,38418,38419,38420,38421,38422,38423,38424,38425,38426,38427,38428,38429,38430,38431,38432,38433,38434,38435,38436,38437,38438,38439,38440,38441,38442,38443,38444,38445,38446,38447,38448,38449,38450,38451,38452,38453,38454,38455,38456,38457,38458,38459,38460,38461,38462,38463,38464,38465,38466,38467,38468,38469,38470,38471,38472,38473,38474,38475,38476,38477,38478,38479,38480,38481,38482,38483,38484,38485,38486,38487,38488,38489,38490,38491,38492,38493,38494,38495,38496,38497,38498,38499,38500,38501,38502,38503,38504,38505,38506,38507,38508,38509,38510,38511,38512,38513,38514,38515,38516,38517,38518,38519,38520,38521,38522,38523,38524,38525,38526,38527,38528,38529,38530,38531,38532,38533,38534,38535,38536,38537,38538,38539,38540,38541,38542,38543,38544,38545,38546,38547,38548,38549,38550,38551,38552,38553,38554,38555,38556,38557,38558,38559,38560,38561,38562,38563,38564,38565,38566,38567,38568,38569,38570,38571,38572,38573,38574,38575,38576,38577,38578,38579,38580,38581,38582,38583,38584,38585,38586,38587,38588,38589,38590,38591,38592,38593,38594,38595,38596,38597,38598,38599,38600,38601,38602,38603,38604,38605,38606,38607,38608,38609,38610,38611,38612,38613,38614,38615,38616,38617,38618,38619,38620,38621,38622,38623,38624,38625,38626,38627,38628,38629,38630,38631,38632,38633,38634,38635,38636,38637,38638,38639,38640,38641,38642,38643,38644,38645,38646,38647,38648,38649,38650,38651,38652,38653,38654,38655,38656,38657,38658,38659,38660,38661,38662,38663,38664,38665,38666,38667,38668,38669,38670,38671,38672,38673,38674,38675,38676,38677,38678,38679,38680,38681,38682,38683,38684,38685,38686,38687,38688,38689,38690,38691,38692,38693,38694,38695,38696,38697,38698,38699,38700,38701,38702,38703,38704,38705,38706,38707,38708,38709,38710,38711,38712,38713,38714,38715,38716,38717,38718,38719,38720,38721,38722,38723,38724,38725,38726,38727,38728,38729,38730,38731,38732,38733,38734,38735,38736,38737,38738,38739,38740,38741,38742,38743,38744,38745,38746,38747,38748,38749,38750,38751,38752,38753,38754,38755,38756,38757,38758,38759,38760,38761,38762,38763,38764,38765,38766,38767,38768,38769,38770,38771,38772,38773,38774,38775,38776,38777,38778,38779,38780,38781,38782,38783,38784,38785,38786,38787,38788,38789,38790,38791,38792,38793,38794,38795,38796,38797,38798,38799,38800,38801,38802,38803,38804,38805,38806,38807,38808,38809,38810,38811,38812,38813,38814,38815,38816,38817,38818,38819,38820,38821,38822,38823,38824,38825,38826,38827,38828,38829,38830,38831,38832,38833,38834,38835,38836,38837,38838,38839,38840,38841,38842,38843,38844,38845,38846,38847,38848,38849,38850,38851,38852,38853,38854,38855,38856,38857,38858,38859,38860,38861,38862,38863,38864,38865,38866,38867,38868,38869,38870,38871,38872,38873,38874,38875,38876,38877,38878,38879,38880,38881,38882,38883,38884,38885,38886,38887,38888,38889,38890,38891,38892,38893,38894,38895,38896,38897,38898,38899,38900,38901,38902,38903,38904,38905,38906,38907,38908,38909,38910,38911,38912,38913,38914,38915,38916,38917,38918,38919,38920,38921,38922,38923,38924,38925,38926,38927,38928,38929,38930,38931,38932,38933,38934,38935,38936,38937,38938,38939,38940,38941,38942,38943,38944,38945,38946,38947,38948,38949,38950,38951,38952,38953,38954,38955,38956,38957,38958,38959,38960,38961,38962,38963,38964,38965,38966,38967,38968,38969,38970,38971,38972,38973,38974,38975,38976,38977,38978,38979,38980,38981,38982,38983,38984,38985,38986,38987,38988,38989,38990,38991,38992,38993,38994,38995,38996,38997,38998,38999,39000,39001,39002,39003,39004,39005,39006,39007,39008,39009,39010,39011,39012,39013,39014,39015,39016,39017,39018,39019,39020,39021,39022,39023,39024,39025,39026,39027,39028,39029,39030,39031,39032,39033,39034,39035,39036,39037,39038,39039,39040,39041,39042,39043,39044,39045,39046,39047,39048,39049,39050,39051,39052,39053,39054,39055,39056,39057,39058,39059,39060,39061,39062,39063,39064,39065,39066,39067,39068,39069,39070,39071,39072,39073,39074,39075,39076,39077,39078,39079,39080,39081,39082,39083,39084,39085,39086,39087,39088,39089,39090,39091,39092,39093,39094,39095,39096,39097,39098,39099,39100,39101,39102,39103,39104,39105,39106,39107,39108,39109,39110,39111,39112,39113,39114,39115,39116,39117,39118,39119,39120,39121,39122,39123,39124,39125,39126,39127,39128,39129,39130,39131,39132,39133,39134,39135,39136,39137,39138,39139,39140,39141,39142,39143,39144,39145,39146,39147,39148,39149,39150,39151,39152,39153,39154,39155,39156,39157,39158,39159,39160,39161,39162,39163,39164,39165,39166,39167,39168,39169,39170,39171,39172,39173,39174,39175,39176,39177,39178,39179,39180,39181,39182,39183,39184,39185,39186,39187,39188,39189,39190,39191,39192,39193,39194,39195,39196,39197,39198,39199,39200,39201,39202,39203,39204,39205,39206,39207,39208,39209,39210,39211,39212,39213,39214,39215,39216,39217,39218,39219,39220,39221,39222,39223,39224,39225,39226,39227,39228,39229,39230,39231,39232,39233,39234,39235,39236,39237,39238,39239,39240,39241,39242,39243,39244,39245,39246,39247,39248,39249,39250,39251,39252,39253,39254,39255,39256,39257,39258,39259,39260,39261,39262,39263,39264,39265,39266,39267,39268,39269,39270,39271,39272,39273,39274,39275,39276,39277,39278,39279,39280,39281,39282,39283,39284,39285,39286,39287,39288,39289,39290,39291,39292,39293,39294,39295,39296,39297,39298,39299,39300,39301,39302,39303,39304,39305,39306,39307,39308,39309,39310,39311,39312,39313,39314,39315,39316,39317,39318,39319,39320,39321,39322,39323,39324,39325,39326,39327,39328,39329,39330,39331,39332,39333,39334,39335,39336,39337,39338,39339,39340,39341,39342,39343,39344,39345,39346,39347,39348,39349,39350,39351,39352,39353,39354,39355,39356,39357,39358,39359,39360,39361,39362,39363,39364,39365,39366,39367,39368,39369,39370,39371,39372,39373,39374,39375,39376,39377,39378,39379,39380,39381,39382,39383,39384,39385,39386,39387,39388,39389,39390,39391,39392,39393,39394,39395,39396,39397,39398,39399,39400,39401,39402,39403,39404,39405,39406,39407,39408,39409,39410,39411,39412,39413,39414,39415,39416,39417,39418,39419,39420,39421,39422,39423,39424,39425,39426,39427,39428,39429,39430,39431,39432,39433,39434,39435,39436,39437,39438,39439,39440,39441,39442,39443,39444,39445,39446,39447,39448,39449,39450,39451,39452,39453,39454,39455,39456,39457,39458,39459,39460,39461,39462,39463,39464,39465,39466,39467,39468,39469,39470,39471,39472,39473,39474,39475,39476,39477,39478,39479,39480,39481,39482,39483,39484,39485,39486,39487,39488,39489,39490,39491,39492,39493,39494,39495,39496,39497,39498,39499,39500,39501,39502,39503,39504,39505,39506,39507,39508,39509,39510,39511,39512,39513,39514,39515,39516,39517,39518,39519,39520,39521,39522,39523,39524,39525,39526,39527,39528,39529,39530,39531,39532,39533,39534,39535,39536,39537,39538,39539,39540,39541,39542,39543,39544,39545,39546,39547,39548,39549,39550,39551,39552,39553,39554,39555,39556,39557,39558,39559,39560,39561,39562,39563,39564,39565,39566,39567,39568,39569,39570,39571,39572,39573,39574,39575,39576,39577,39578,39579,39580,39581,39582,39583,39584,39585,39586,39587,39588,39589,39590,39591,39592,39593,39594,39595,39596,39597,39598,39599,39600,39601,39602,39603,39604,39605,39606,39607,39608,39609,39610,39611,39612,39613,39614,39615,39616,39617,39618,39619,39620,39621,39622,39623,39624,39625,39626,39627,39628,39629,39630,39631,39632,39633,39634,39635,39636,39637,39638,39639,39640,39641,39642,39643,39644,39645,39646,39647,39648,39649,39650,39651,39652,39653,39654,39655,39656,39657,39658,39659,39660,39661,39662,39663,39664,39665,39666,39667,39668,39669,39670,39671,39672,39673,39674,39675,39676,39677,39678,39679,39680,39681,39682,39683,39684,39685,39686,39687,39688,39689,39690,39691,39692,39693,39694,39695,39696,39697,39698,39699,39700,39701,39702,39703,39704,39705,39706,39707,39708,39709,39710,39711,39712,39713,39714,39715,39716,39717,39718,39719,39720,39721,39722,39723,39724,39725,39726,39727,39728,39729,39730,39731,39732,39733,39734,39735,39736,39737,39738,39739,39740,39741,39742,39743,39744,39745,39746,39747,39748,39749,39750,39751,39752,39753,39754,39755,39756,39757,39758,39759,39760,39761,39762,39763,39764,39765,39766,39767,39768,39769,39770,39771,39772,39773,39774,39775,39776,39777,39778,39779,39780,39781,39782,39783,39784,39785,39786,39787,39788,39789,39790,39791,39792,39793,39794,39795,39796,39797,39798,39799,39800,39801,39802,39803,39804,39805,39806,39807,39808,39809,39810,39811,39812,39813,39814,39815,39816,39817,39818,39819,39820,39821,39822,39823,39824,39825,39826,39827,39828,39829,39830,39831,39832,39833,39834,39835,39836,39837,39838,39839,39840,39841,39842,39843,39844,39845,39846,39847,39848,39849,39850,39851,39852,39853,39854,39855,39856,39857,39858,39859,39860,39861,39862,39863,39864,39865,39866,39867,39868,39869,39870,39871,39872,39873,39874,39875,39876,39877,39878,39879,39880,39881,39882,39883,39884,39885,39886,39887,39888,39889,39890,39891,39892,39893,39894,39895,39896,39897,39898,39899,39900,39901,39902,39903,39904,39905,39906,39907,39908,39909,39910,39911,39912,39913,39914,39915,39916,39917,39918,39919,39920,39921,39922,39923,39924,39925,39926,39927,39928,39929,39930,39931,39932,39933,39934,39935,39936,39937,39938,39939,39940,39941,39942,39943,39944,39945,39946,39947,39948,39949,39950,39951,39952,39953,39954,39955,39956,39957,39958,39959,39960,39961,39962,39963,39964,39965,39966,39967,39968,39969,39970,39971,39972,39973,39974,39975,39976,39977,39978,39979,39980,39981,39982,39983,39984,39985,39986,39987,39988,39989,39990,39991,39992,39993,39994,39995,39996,39997,39998,39999,40000,40001,40002,40003,40004,40005,40006,40007,40008,40009,40010,40011,40012,40013,40014,40015,40016,40017,40018,40019,40020,40021,40022,40023,40024,40025,40026,40027,40028,40029,40030,40031,40032,40033,40034,40035,40036,40037,40038,40039,40040,40041,40042,40043,40044,40045,40046,40047,40048,40049,40050,40051,40052,40053,40054,40055,40056,40057,40058,40059,40060,40061,40062,40063,40064,40065,40066,40067,40068,40069,40070,40071,40072,40073,40074,40075,40076,40077,40078,40079,40080,40081,40082,40083,40084,40085,40086,40087,40088,40089,40090,40091,40092,40093,40094,40095,40096,40097,40098,40099,40100,40101,40102,40103,40104,40105,40106,40107,40108,40109,40110,40111,40112,40113,40114,40115,40116,40117,40118,40119,40120,40121,40122,40123,40124,40125,40126,40127,40128,40129,40130,40131,40132,40133,40134,40135,40136,40137,40138,40139,40140,40141,40142,40143,40144,40145,40146,40147,40148,40149,40150,40151,40152,40153,40154,40155,40156,40157,40158,40159,40160,40161,40162,40163,40164,40165,40166,40167,40168,40169,40170,40171,40172,40173,40174,40175,40176,40177,40178,40179,40180,40181,40182,40183,40184,40185,40186,40187,40188,40189,40190,40191,40192,40193,40194,40195,40196,40197,40198,40199,40200,40201,40202,40203,40204,40205,40206,40207,40208,40209,40210,40211,40212,40213,40214,40215,40216,40217,40218,40219,40220,40221,40222,40223,40224,40225,40226,40227,40228,40229,40230,40231,40232,40233,40234,40235,40236,40237,40238,40239,40240,40241,40242,40243,40244,40245,40246,40247,40248,40249,40250,40251,40252,40253,40254,40255,40256,40257,40258,40259,40260,40261,40262,40263,40264,40265,40266,40267,40268,40269,40270,40271,40272,40273,40274,40275,40276,40277,40278,40279,40280,40281,40282,40283,40284,40285,40286,40287,40288,40289,40290,40291,40292,40293,40294,40295,40296,40297,40298,40299,40300,40301,40302,40303,40304,40305,40306,40307,40308,40309,40310,40311,40312,40313,40314,40315,40316,40317,40318,40319,40320,40321,40322,40323,40324,40325,40326,40327,40328,40329,40330,40331,40332,40333,40334,40335,40336,40337,40338,40339,40340,40341,40342,40343,40344,40345,40346,40347,40348,40349,40350,40351,40352,40353,40354,40355,40356,40357,40358,40359,40360,40361,40362,40363,40364,40365,40366,40367,40368,40369,40370,40371,40372,40373,40374,40375,40376,40377,40378,40379,40380,40381,40382,40383,40384,40385,40386,40387,40388,40389,40390,40391,40392,40393,40394,40395,40396,40397,40398,40399,40400,40401,40402,40403,40404,40405,40406,40407,40408,40409,40410,40411,40412,40413,40414,40415,40416,40417,40418,40419,40420,40421,40422,40423,40424,40425,40426,40427,40428,40429,40430,40431,40432,40433,40434,40435,40436,40437,40438,40439,40440,40441,40442,40443,40444,40445,40446,40447,40448,40449,40450,40451,40452,40453,40454,40455,40456,40457,40458,40459,40460,40461,40462,40463,40464,40465,40466,40467,40468,40469,40470,40471,40472,40473,40474,40475,40476,40477,40478,40479,40480,40481,40482,40483,40484,40485,40486,40487,40488,40489,40490,40491,40492,40493,40494,40495,40496,40497,40498,40499,40500,40501,40502,40503,40504,40505,40506,40507,40508,40509,40510,40511,40512,40513,40514,40515,40516,40517,40518,40519,40520,40521,40522,40523,40524,40525,40526,40527,40528,40529,40530,40531,40532,40533,40534,40535,40536,40537,40538,40539,40540,40541,40542,40543,40544,40545,40546,40547,40548,40549,40550,40551,40552,40553,40554,40555,40556,40557,40558,40559,40560,40561,40562,40563,40564,40565,40566,40567,40568,40569,40570,40571,40572,40573,40574,40575,40576,40577,40578,40579,40580,40581,40582,40583,40584,40585,40586,40587,40588,40589,40590,40591,40592,40593,40594,40595,40596,40597,40598,40599,40600,40601,40602,40603,40604,40605,40606,40607,40608,40609,40610,40611,40612,40613,40614,40615,40616,40617,40618,40619,40620,40621,40622,40623,40624,40625,40626,40627,40628,40629,40630,40631,40632,40633,40634,40635,40636,40637,40638,40639,40640,40641,40642,40643,40644,40645,40646,40647,40648,40649,40650,40651,40652,40653,40654,40655,40656,40657,40658,40659,40660,40661,40662,40663,40664,40665,40666,40667,40668,40669,40670,40671,40672,40673,40674,40675,40676,40677,40678,40679,40680,40681,40682,40683,40684,40685,40686,40687,40688,40689,40690,40691,40692,40693,40694,40695,40696,40697,40698,40699,40700,40701,40702,40703,40704,40705,40706,40707,40708,40709,40710,40711,40712,40713,40714,40715,40716,40717,40718,40719,40720,40721,40722,40723,40724,40725,40726,40727,40728,40729,40730,40731,40732,40733,40734,40735,40736,40737,40738,40739,40740,40741,40742,40743,40744,40745,40746,40747,40748,40749,40750,40751,40752,40753,40754,40755,40756,40757,40758,40759,40760,40761,40762,40763,40764,40765,40766,40767,40768,40769,40770,40771,40772,40773,40774,40775,40776,40777,40778,40779,40780,40781,40782,40783,40784,40785,40786,40787,40788,40789,40790,40791,40792,40793,40794,40795,40796,40797,40798,40799,40800,40801,40802,40803,40804,40805,40806,40807,40808,40809,40810,40811,40812,40813,40814,40815,40816,40817,40818,40819,40820,40821,40822,40823,40824,40825,40826,40827,40828,40829,40830,40831,40832,40833,40834,40835,40836,40837,40838,40839,40840,40841,40842,40843,40844,40845,40846,40847,40848,40849,40850,40851,40852,40853,40854,40855,40856,40857,40858,40859,40860,40861,40862,40863,40864,40865,40866,40867,40868,40869,40870,40871,40872,40873,40874,40875,40876,40877,40878,40879,40880,40881,40882,40883,40884,40885,40886,40887,40888,40889,40890,40891,40892,40893,40894,40895,40896,40897,40898,40899,40900,40901,40902,40903,40904,40905,40906,40907,40908,40960,40961,40962,40963,40964,40965,40966,40967,40968,40969,40970,40971,40972,40973,40974,40975,40976,40977,40978,40979,40980,40982,40983,40984,40985,40986,40987,40988,40989,40990,40991,40992,40993,40994,40995,40996,40997,40998,40999,41000,41001,41002,41003,41004,41005,41006,41007,41008,41009,41010,41011,41012,41013,41014,41015,41016,41017,41018,41019,41020,41021,41022,41023,41024,41025,41026,41027,41028,41029,41030,41031,41032,41033,41034,41035,41036,41037,41038,41039,41040,41041,41042,41043,41044,41045,41046,41047,41048,41049,41050,41051,41052,41053,41054,41055,41056,41057,41058,41059,41060,41061,41062,41063,41064,41065,41066,41067,41068,41069,41070,41071,41072,41073,41074,41075,41076,41077,41078,41079,41080,41081,41082,41083,41084,41085,41086,41087,41088,41089,41090,41091,41092,41093,41094,41095,41096,41097,41098,41099,41100,41101,41102,41103,41104,41105,41106,41107,41108,41109,41110,41111,41112,41113,41114,41115,41116,41117,41118,41119,41120,41121,41122,41123,41124,41125,41126,41127,41128,41129,41130,41131,41132,41133,41134,41135,41136,41137,41138,41139,41140,41141,41142,41143,41144,41145,41146,41147,41148,41149,41150,41151,41152,41153,41154,41155,41156,41157,41158,41159,41160,41161,41162,41163,41164,41165,41166,41167,41168,41169,41170,41171,41172,41173,41174,41175,41176,41177,41178,41179,41180,41181,41182,41183,41184,41185,41186,41187,41188,41189,41190,41191,41192,41193,41194,41195,41196,41197,41198,41199,41200,41201,41202,41203,41204,41205,41206,41207,41208,41209,41210,41211,41212,41213,41214,41215,41216,41217,41218,41219,41220,41221,41222,41223,41224,41225,41226,41227,41228,41229,41230,41231,41232,41233,41234,41235,41236,41237,41238,41239,41240,41241,41242,41243,41244,41245,41246,41247,41248,41249,41250,41251,41252,41253,41254,41255,41256,41257,41258,41259,41260,41261,41262,41263,41264,41265,41266,41267,41268,41269,41270,41271,41272,41273,41274,41275,41276,41277,41278,41279,41280,41281,41282,41283,41284,41285,41286,41287,41288,41289,41290,41291,41292,41293,41294,41295,41296,41297,41298,41299,41300,41301,41302,41303,41304,41305,41306,41307,41308,41309,41310,41311,41312,41313,41314,41315,41316,41317,41318,41319,41320,41321,41322,41323,41324,41325,41326,41327,41328,41329,41330,41331,41332,41333,41334,41335,41336,41337,41338,41339,41340,41341,41342,41343,41344,41345,41346,41347,41348,41349,41350,41351,41352,41353,41354,41355,41356,41357,41358,41359,41360,41361,41362,41363,41364,41365,41366,41367,41368,41369,41370,41371,41372,41373,41374,41375,41376,41377,41378,41379,41380,41381,41382,41383,41384,41385,41386,41387,41388,41389,41390,41391,41392,41393,41394,41395,41396,41397,41398,41399,41400,41401,41402,41403,41404,41405,41406,41407,41408,41409,41410,41411,41412,41413,41414,41415,41416,41417,41418,41419,41420,41421,41422,41423,41424,41425,41426,41427,41428,41429,41430,41431,41432,41433,41434,41435,41436,41437,41438,41439,41440,41441,41442,41443,41444,41445,41446,41447,41448,41449,41450,41451,41452,41453,41454,41455,41456,41457,41458,41459,41460,41461,41462,41463,41464,41465,41466,41467,41468,41469,41470,41471,41472,41473,41474,41475,41476,41477,41478,41479,41480,41481,41482,41483,41484,41485,41486,41487,41488,41489,41490,41491,41492,41493,41494,41495,41496,41497,41498,41499,41500,41501,41502,41503,41504,41505,41506,41507,41508,41509,41510,41511,41512,41513,41514,41515,41516,41517,41518,41519,41520,41521,41522,41523,41524,41525,41526,41527,41528,41529,41530,41531,41532,41533,41534,41535,41536,41537,41538,41539,41540,41541,41542,41543,41544,41545,41546,41547,41548,41549,41550,41551,41552,41553,41554,41555,41556,41557,41558,41559,41560,41561,41562,41563,41564,41565,41566,41567,41568,41569,41570,41571,41572,41573,41574,41575,41576,41577,41578,41579,41580,41581,41582,41583,41584,41585,41586,41587,41588,41589,41590,41591,41592,41593,41594,41595,41596,41597,41598,41599,41600,41601,41602,41603,41604,41605,41606,41607,41608,41609,41610,41611,41612,41613,41614,41615,41616,41617,41618,41619,41620,41621,41622,41623,41624,41625,41626,41627,41628,41629,41630,41631,41632,41633,41634,41635,41636,41637,41638,41639,41640,41641,41642,41643,41644,41645,41646,41647,41648,41649,41650,41651,41652,41653,41654,41655,41656,41657,41658,41659,41660,41661,41662,41663,41664,41665,41666,41667,41668,41669,41670,41671,41672,41673,41674,41675,41676,41677,41678,41679,41680,41681,41682,41683,41684,41685,41686,41687,41688,41689,41690,41691,41692,41693,41694,41695,41696,41697,41698,41699,41700,41701,41702,41703,41704,41705,41706,41707,41708,41709,41710,41711,41712,41713,41714,41715,41716,41717,41718,41719,41720,41721,41722,41723,41724,41725,41726,41727,41728,41729,41730,41731,41732,41733,41734,41735,41736,41737,41738,41739,41740,41741,41742,41743,41744,41745,41746,41747,41748,41749,41750,41751,41752,41753,41754,41755,41756,41757,41758,41759,41760,41761,41762,41763,41764,41765,41766,41767,41768,41769,41770,41771,41772,41773,41774,41775,41776,41777,41778,41779,41780,41781,41782,41783,41784,41785,41786,41787,41788,41789,41790,41791,41792,41793,41794,41795,41796,41797,41798,41799,41800,41801,41802,41803,41804,41805,41806,41807,41808,41809,41810,41811,41812,41813,41814,41815,41816,41817,41818,41819,41820,41821,41822,41823,41824,41825,41826,41827,41828,41829,41830,41831,41832,41833,41834,41835,41836,41837,41838,41839,41840,41841,41842,41843,41844,41845,41846,41847,41848,41849,41850,41851,41852,41853,41854,41855,41856,41857,41858,41859,41860,41861,41862,41863,41864,41865,41866,41867,41868,41869,41870,41871,41872,41873,41874,41875,41876,41877,41878,41879,41880,41881,41882,41883,41884,41885,41886,41887,41888,41889,41890,41891,41892,41893,41894,41895,41896,41897,41898,41899,41900,41901,41902,41903,41904,41905,41906,41907,41908,41909,41910,41911,41912,41913,41914,41915,41916,41917,41918,41919,41920,41921,41922,41923,41924,41925,41926,41927,41928,41929,41930,41931,41932,41933,41934,41935,41936,41937,41938,41939,41940,41941,41942,41943,41944,41945,41946,41947,41948,41949,41950,41951,41952,41953,41954,41955,41956,41957,41958,41959,41960,41961,41962,41963,41964,41965,41966,41967,41968,41969,41970,41971,41972,41973,41974,41975,41976,41977,41978,41979,41980,41981,41982,41983,41984,41985,41986,41987,41988,41989,41990,41991,41992,41993,41994,41995,41996,41997,41998,41999,42000,42001,42002,42003,42004,42005,42006,42007,42008,42009,42010,42011,42012,42013,42014,42015,42016,42017,42018,42019,42020,42021,42022,42023,42024,42025,42026,42027,42028,42029,42030,42031,42032,42033,42034,42035,42036,42037,42038,42039,42040,42041,42042,42043,42044,42045,42046,42047,42048,42049,42050,42051,42052,42053,42054,42055,42056,42057,42058,42059,42060,42061,42062,42063,42064,42065,42066,42067,42068,42069,42070,42071,42072,42073,42074,42075,42076,42077,42078,42079,42080,42081,42082,42083,42084,42085,42086,42087,42088,42089,42090,42091,42092,42093,42094,42095,42096,42097,42098,42099,42100,42101,42102,42103,42104,42105,42106,42107,42108,42109,42110,42111,42112,42113,42114,42115,42116,42117,42118,42119,42120,42121,42122,42123,42124,42192,42193,42194,42195,42196,42197,42198,42199,42200,42201,42202,42203,42204,42205,42206,42207,42208,42209,42210,42211,42212,42213,42214,42215,42216,42217,42218,42219,42220,42221,42222,42223,42224,42225,42226,42227,42228,42229,42230,42231,42240,42241,42242,42243,42244,42245,42246,42247,42248,42249,42250,42251,42252,42253,42254,42255,42256,42257,42258,42259,42260,42261,42262,42263,42264,42265,42266,42267,42268,42269,42270,42271,42272,42273,42274,42275,42276,42277,42278,42279,42280,42281,42282,42283,42284,42285,42286,42287,42288,42289,42290,42291,42292,42293,42294,42295,42296,42297,42298,42299,42300,42301,42302,42303,42304,42305,42306,42307,42308,42309,42310,42311,42312,42313,42314,42315,42316,42317,42318,42319,42320,42321,42322,42323,42324,42325,42326,42327,42328,42329,42330,42331,42332,42333,42334,42335,42336,42337,42338,42339,42340,42341,42342,42343,42344,42345,42346,42347,42348,42349,42350,42351,42352,42353,42354,42355,42356,42357,42358,42359,42360,42361,42362,42363,42364,42365,42366,42367,42368,42369,42370,42371,42372,42373,42374,42375,42376,42377,42378,42379,42380,42381,42382,42383,42384,42385,42386,42387,42388,42389,42390,42391,42392,42393,42394,42395,42396,42397,42398,42399,42400,42401,42402,42403,42404,42405,42406,42407,42408,42409,42410,42411,42412,42413,42414,42415,42416,42417,42418,42419,42420,42421,42422,42423,42424,42425,42426,42427,42428,42429,42430,42431,42432,42433,42434,42435,42436,42437,42438,42439,42440,42441,42442,42443,42444,42445,42446,42447,42448,42449,42450,42451,42452,42453,42454,42455,42456,42457,42458,42459,42460,42461,42462,42463,42464,42465,42466,42467,42468,42469,42470,42471,42472,42473,42474,42475,42476,42477,42478,42479,42480,42481,42482,42483,42484,42485,42486,42487,42488,42489,42490,42491,42492,42493,42494,42495,42496,42497,42498,42499,42500,42501,42502,42503,42504,42505,42506,42507,42512,42513,42514,42515,42516,42517,42518,42519,42520,42521,42522,42523,42524,42525,42526,42527,42538,42539,42606,42656,42657,42658,42659,42660,42661,42662,42663,42664,42665,42666,42667,42668,42669,42670,42671,42672,42673,42674,42675,42676,42677,42678,42679,42680,42681,42682,42683,42684,42685,42686,42687,42688,42689,42690,42691,42692,42693,42694,42695,42696,42697,42698,42699,42700,42701,42702,42703,42704,42705,42706,42707,42708,42709,42710,42711,42712,42713,42714,42715,42716,42717,42718,42719,42720,42721,42722,42723,42724,42725,43003,43004,43005,43006,43007,43008,43009,43011,43012,43013,43015,43016,43017,43018,43020,43021,43022,43023,43024,43025,43026,43027,43028,43029,43030,43031,43032,43033,43034,43035,43036,43037,43038,43039,43040,43041,43042,43072,43073,43074,43075,43076,43077,43078,43079,43080,43081,43082,43083,43084,43085,43086,43087,43088,43089,43090,43091,43092,43093,43094,43095,43096,43097,43098,43099,43100,43101,43102,43103,43104,43105,43106,43107,43108,43109,43110,43111,43112,43113,43114,43115,43116,43117,43118,43119,43120,43121,43122,43123,43138,43139,43140,43141,43142,43143,43144,43145,43146,43147,43148,43149,43150,43151,43152,43153,43154,43155,43156,43157,43158,43159,43160,43161,43162,43163,43164,43165,43166,43167,43168,43169,43170,43171,43172,43173,43174,43175,43176,43177,43178,43179,43180,43181,43182,43183,43184,43185,43186,43187,43250,43251,43252,43253,43254,43255,43259,43274,43275,43276,43277,43278,43279,43280,43281,43282,43283,43284,43285,43286,43287,43288,43289,43290,43291,43292,43293,43294,43295,43296,43297,43298,43299,43300,43301,43312,43313,43314,43315,43316,43317,43318,43319,43320,43321,43322,43323,43324,43325,43326,43327,43328,43329,43330,43331,43332,43333,43334,43360,43361,43362,43363,43364,43365,43366,43367,43368,43369,43370,43371,43372,43373,43374,43375,43376,43377,43378,43379,43380,43381,43382,43383,43384,43385,43386,43387,43388,43396,43397,43398,43399,43400,43401,43402,43403,43404,43405,43406,43407,43408,43409,43410,43411,43412,43413,43414,43415,43416,43417,43418,43419,43420,43421,43422,43423,43424,43425,43426,43427,43428,43429,43430,43431,43432,43433,43434,43435,43436,43437,43438,43439,43440,43441,43442,43520,43521,43522,43523,43524,43525,43526,43527,43528,43529,43530,43531,43532,43533,43534,43535,43536,43537,43538,43539,43540,43541,43542,43543,43544,43545,43546,43547,43548,43549,43550,43551,43552,43553,43554,43555,43556,43557,43558,43559,43560,43584,43585,43586,43588,43589,43590,43591,43592,43593,43594,43595,43616,43617,43618,43619,43620,43621,43622,43623,43624,43625,43626,43627,43628,43629,43630,43631,43633,43634,43635,43636,43637,43638,43642,43648,43649,43650,43651,43652,43653,43654,43655,43656,43657,43658,43659,43660,43661,43662,43663,43664,43665,43666,43667,43668,43669,43670,43671,43672,43673,43674,43675,43676,43677,43678,43679,43680,43681,43682,43683,43684,43685,43686,43687,43688,43689,43690,43691,43692,43693,43694,43695,43697,43701,43702,43705,43706,43707,43708,43709,43712,43714,43739,43740,43744,43745,43746,43747,43748,43749,43750,43751,43752,43753,43754,43762,43777,43778,43779,43780,43781,43782,43785,43786,43787,43788,43789,43790,43793,43794,43795,43796,43797,43798,43808,43809,43810,43811,43812,43813,43814,43816,43817,43818,43819,43820,43821,43822,43968,43969,43970,43971,43972,43973,43974,43975,43976,43977,43978,43979,43980,43981,43982,43983,43984,43985,43986,43987,43988,43989,43990,43991,43992,43993,43994,43995,43996,43997,43998,43999,44000,44001,44002,44032,44033,44034,44035,44036,44037,44038,44039,44040,44041,44042,44043,44044,44045,44046,44047,44048,44049,44050,44051,44052,44053,44054,44055,44056,44057,44058,44059,44060,44061,44062,44063,44064,44065,44066,44067,44068,44069,44070,44071,44072,44073,44074,44075,44076,44077,44078,44079,44080,44081,44082,44083,44084,44085,44086,44087,44088,44089,44090,44091,44092,44093,44094,44095,44096,44097,44098,44099,44100,44101,44102,44103,44104,44105,44106,44107,44108,44109,44110,44111,44112,44113,44114,44115,44116,44117,44118,44119,44120,44121,44122,44123,44124,44125,44126,44127,44128,44129,44130,44131,44132,44133,44134,44135,44136,44137,44138,44139,44140,44141,44142,44143,44144,44145,44146,44147,44148,44149,44150,44151,44152,44153,44154,44155,44156,44157,44158,44159,44160,44161,44162,44163,44164,44165,44166,44167,44168,44169,44170,44171,44172,44173,44174,44175,44176,44177,44178,44179,44180,44181,44182,44183,44184,44185,44186,44187,44188,44189,44190,44191,44192,44193,44194,44195,44196,44197,44198,44199,44200,44201,44202,44203,44204,44205,44206,44207,44208,44209,44210,44211,44212,44213,44214,44215,44216,44217,44218,44219,44220,44221,44222,44223,44224,44225,44226,44227,44228,44229,44230,44231,44232,44233,44234,44235,44236,44237,44238,44239,44240,44241,44242,44243,44244,44245,44246,44247,44248,44249,44250,44251,44252,44253,44254,44255,44256,44257,44258,44259,44260,44261,44262,44263,44264,44265,44266,44267,44268,44269,44270,44271,44272,44273,44274,44275,44276,44277,44278,44279,44280,44281,44282,44283,44284,44285,44286,44287,44288,44289,44290,44291,44292,44293,44294,44295,44296,44297,44298,44299,44300,44301,44302,44303,44304,44305,44306,44307,44308,44309,44310,44311,44312,44313,44314,44315,44316,44317,44318,44319,44320,44321,44322,44323,44324,44325,44326,44327,44328,44329,44330,44331,44332,44333,44334,44335,44336,44337,44338,44339,44340,44341,44342,44343,44344,44345,44346,44347,44348,44349,44350,44351,44352,44353,44354,44355,44356,44357,44358,44359,44360,44361,44362,44363,44364,44365,44366,44367,44368,44369,44370,44371,44372,44373,44374,44375,44376,44377,44378,44379,44380,44381,44382,44383,44384,44385,44386,44387,44388,44389,44390,44391,44392,44393,44394,44395,44396,44397,44398,44399,44400,44401,44402,44403,44404,44405,44406,44407,44408,44409,44410,44411,44412,44413,44414,44415,44416,44417,44418,44419,44420,44421,44422,44423,44424,44425,44426,44427,44428,44429,44430,44431,44432,44433,44434,44435,44436,44437,44438,44439,44440,44441,44442,44443,44444,44445,44446,44447,44448,44449,44450,44451,44452,44453,44454,44455,44456,44457,44458,44459,44460,44461,44462,44463,44464,44465,44466,44467,44468,44469,44470,44471,44472,44473,44474,44475,44476,44477,44478,44479,44480,44481,44482,44483,44484,44485,44486,44487,44488,44489,44490,44491,44492,44493,44494,44495,44496,44497,44498,44499,44500,44501,44502,44503,44504,44505,44506,44507,44508,44509,44510,44511,44512,44513,44514,44515,44516,44517,44518,44519,44520,44521,44522,44523,44524,44525,44526,44527,44528,44529,44530,44531,44532,44533,44534,44535,44536,44537,44538,44539,44540,44541,44542,44543,44544,44545,44546,44547,44548,44549,44550,44551,44552,44553,44554,44555,44556,44557,44558,44559,44560,44561,44562,44563,44564,44565,44566,44567,44568,44569,44570,44571,44572,44573,44574,44575,44576,44577,44578,44579,44580,44581,44582,44583,44584,44585,44586,44587,44588,44589,44590,44591,44592,44593,44594,44595,44596,44597,44598,44599,44600,44601,44602,44603,44604,44605,44606,44607,44608,44609,44610,44611,44612,44613,44614,44615,44616,44617,44618,44619,44620,44621,44622,44623,44624,44625,44626,44627,44628,44629,44630,44631,44632,44633,44634,44635,44636,44637,44638,44639,44640,44641,44642,44643,44644,44645,44646,44647,44648,44649,44650,44651,44652,44653,44654,44655,44656,44657,44658,44659,44660,44661,44662,44663,44664,44665,44666,44667,44668,44669,44670,44671,44672,44673,44674,44675,44676,44677,44678,44679,44680,44681,44682,44683,44684,44685,44686,44687,44688,44689,44690,44691,44692,44693,44694,44695,44696,44697,44698,44699,44700,44701,44702,44703,44704,44705,44706,44707,44708,44709,44710,44711,44712,44713,44714,44715,44716,44717,44718,44719,44720,44721,44722,44723,44724,44725,44726,44727,44728,44729,44730,44731,44732,44733,44734,44735,44736,44737,44738,44739,44740,44741,44742,44743,44744,44745,44746,44747,44748,44749,44750,44751,44752,44753,44754,44755,44756,44757,44758,44759,44760,44761,44762,44763,44764,44765,44766,44767,44768,44769,44770,44771,44772,44773,44774,44775,44776,44777,44778,44779,44780,44781,44782,44783,44784,44785,44786,44787,44788,44789,44790,44791,44792,44793,44794,44795,44796,44797,44798,44799,44800,44801,44802,44803,44804,44805,44806,44807,44808,44809,44810,44811,44812,44813,44814,44815,44816,44817,44818,44819,44820,44821,44822,44823,44824,44825,44826,44827,44828,44829,44830,44831,44832,44833,44834,44835,44836,44837,44838,44839,44840,44841,44842,44843,44844,44845,44846,44847,44848,44849,44850,44851,44852,44853,44854,44855,44856,44857,44858,44859,44860,44861,44862,44863,44864,44865,44866,44867,44868,44869,44870,44871,44872,44873,44874,44875,44876,44877,44878,44879,44880,44881,44882,44883,44884,44885,44886,44887,44888,44889,44890,44891,44892,44893,44894,44895,44896,44897,44898,44899,44900,44901,44902,44903,44904,44905,44906,44907,44908,44909,44910,44911,44912,44913,44914,44915,44916,44917,44918,44919,44920,44921,44922,44923,44924,44925,44926,44927,44928,44929,44930,44931,44932,44933,44934,44935,44936,44937,44938,44939,44940,44941,44942,44943,44944,44945,44946,44947,44948,44949,44950,44951,44952,44953,44954,44955,44956,44957,44958,44959,44960,44961,44962,44963,44964,44965,44966,44967,44968,44969,44970,44971,44972,44973,44974,44975,44976,44977,44978,44979,44980,44981,44982,44983,44984,44985,44986,44987,44988,44989,44990,44991,44992,44993,44994,44995,44996,44997,44998,44999,45000,45001,45002,45003,45004,45005,45006,45007,45008,45009,45010,45011,45012,45013,45014,45015,45016,45017,45018,45019,45020,45021,45022,45023,45024,45025,45026,45027,45028,45029,45030,45031,45032,45033,45034,45035,45036,45037,45038,45039,45040,45041,45042,45043,45044,45045,45046,45047,45048,45049,45050,45051,45052,45053,45054,45055,45056,45057,45058,45059,45060,45061,45062,45063,45064,45065,45066,45067,45068,45069,45070,45071,45072,45073,45074,45075,45076,45077,45078,45079,45080,45081,45082,45083,45084,45085,45086,45087,45088,45089,45090,45091,45092,45093,45094,45095,45096,45097,45098,45099,45100,45101,45102,45103,45104,45105,45106,45107,45108,45109,45110,45111,45112,45113,45114,45115,45116,45117,45118,45119,45120,45121,45122,45123,45124,45125,45126,45127,45128,45129,45130,45131,45132,45133,45134,45135,45136,45137,45138,45139,45140,45141,45142,45143,45144,45145,45146,45147,45148,45149,45150,45151,45152,45153,45154,45155,45156,45157,45158,45159,45160,45161,45162,45163,45164,45165,45166,45167,45168,45169,45170,45171,45172,45173,45174,45175,45176,45177,45178,45179,45180,45181,45182,45183,45184,45185,45186,45187,45188,45189,45190,45191,45192,45193,45194,45195,45196,45197,45198,45199,45200,45201,45202,45203,45204,45205,45206,45207,45208,45209,45210,45211,45212,45213,45214,45215,45216,45217,45218,45219,45220,45221,45222,45223,45224,45225,45226,45227,45228,45229,45230,45231,45232,45233,45234,45235,45236,45237,45238,45239,45240,45241,45242,45243,45244,45245,45246,45247,45248,45249,45250,45251,45252,45253,45254,45255,45256,45257,45258,45259,45260,45261,45262,45263,45264,45265,45266,45267,45268,45269,45270,45271,45272,45273,45274,45275,45276,45277,45278,45279,45280,45281,45282,45283,45284,45285,45286,45287,45288,45289,45290,45291,45292,45293,45294,45295,45296,45297,45298,45299,45300,45301,45302,45303,45304,45305,45306,45307,45308,45309,45310,45311,45312,45313,45314,45315,45316,45317,45318,45319,45320,45321,45322,45323,45324,45325,45326,45327,45328,45329,45330,45331,45332,45333,45334,45335,45336,45337,45338,45339,45340,45341,45342,45343,45344,45345,45346,45347,45348,45349,45350,45351,45352,45353,45354,45355,45356,45357,45358,45359,45360,45361,45362,45363,45364,45365,45366,45367,45368,45369,45370,45371,45372,45373,45374,45375,45376,45377,45378,45379,45380,45381,45382,45383,45384,45385,45386,45387,45388,45389,45390,45391,45392,45393,45394,45395,45396,45397,45398,45399,45400,45401,45402,45403,45404,45405,45406,45407,45408,45409,45410,45411,45412,45413,45414,45415,45416,45417,45418,45419,45420,45421,45422,45423,45424,45425,45426,45427,45428,45429,45430,45431,45432,45433,45434,45435,45436,45437,45438,45439,45440,45441,45442,45443,45444,45445,45446,45447,45448,45449,45450,45451,45452,45453,45454,45455,45456,45457,45458,45459,45460,45461,45462,45463,45464,45465,45466,45467,45468,45469,45470,45471,45472,45473,45474,45475,45476,45477,45478,45479,45480,45481,45482,45483,45484,45485,45486,45487,45488,45489,45490,45491,45492,45493,45494,45495,45496,45497,45498,45499,45500,45501,45502,45503,45504,45505,45506,45507,45508,45509,45510,45511,45512,45513,45514,45515,45516,45517,45518,45519,45520,45521,45522,45523,45524,45525,45526,45527,45528,45529,45530,45531,45532,45533,45534,45535,45536,45537,45538,45539,45540,45541,45542,45543,45544,45545,45546,45547,45548,45549,45550,45551,45552,45553,45554,45555,45556,45557,45558,45559,45560,45561,45562,45563,45564,45565,45566,45567,45568,45569,45570,45571,45572,45573,45574,45575,45576,45577,45578,45579,45580,45581,45582,45583,45584,45585,45586,45587,45588,45589,45590,45591,45592,45593,45594,45595,45596,45597,45598,45599,45600,45601,45602,45603,45604,45605,45606,45607,45608,45609,45610,45611,45612,45613,45614,45615,45616,45617,45618,45619,45620,45621,45622,45623,45624,45625,45626,45627,45628,45629,45630,45631,45632,45633,45634,45635,45636,45637,45638,45639,45640,45641,45642,45643,45644,45645,45646,45647,45648,45649,45650,45651,45652,45653,45654,45655,45656,45657,45658,45659,45660,45661,45662,45663,45664,45665,45666,45667,45668,45669,45670,45671,45672,45673,45674,45675,45676,45677,45678,45679,45680,45681,45682,45683,45684,45685,45686,45687,45688,45689,45690,45691,45692,45693,45694,45695,45696,45697,45698,45699,45700,45701,45702,45703,45704,45705,45706,45707,45708,45709,45710,45711,45712,45713,45714,45715,45716,45717,45718,45719,45720,45721,45722,45723,45724,45725,45726,45727,45728,45729,45730,45731,45732,45733,45734,45735,45736,45737,45738,45739,45740,45741,45742,45743,45744,45745,45746,45747,45748,45749,45750,45751,45752,45753,45754,45755,45756,45757,45758,45759,45760,45761,45762,45763,45764,45765,45766,45767,45768,45769,45770,45771,45772,45773,45774,45775,45776,45777,45778,45779,45780,45781,45782,45783,45784,45785,45786,45787,45788,45789,45790,45791,45792,45793,45794,45795,45796,45797,45798,45799,45800,45801,45802,45803,45804,45805,45806,45807,45808,45809,45810,45811,45812,45813,45814,45815,45816,45817,45818,45819,45820,45821,45822,45823,45824,45825,45826,45827,45828,45829,45830,45831,45832,45833,45834,45835,45836,45837,45838,45839,45840,45841,45842,45843,45844,45845,45846,45847,45848,45849,45850,45851,45852,45853,45854,45855,45856,45857,45858,45859,45860,45861,45862,45863,45864,45865,45866,45867,45868,45869,45870,45871,45872,45873,45874,45875,45876,45877,45878,45879,45880,45881,45882,45883,45884,45885,45886,45887,45888,45889,45890,45891,45892,45893,45894,45895,45896,45897,45898,45899,45900,45901,45902,45903,45904,45905,45906,45907,45908,45909,45910,45911,45912,45913,45914,45915,45916,45917,45918,45919,45920,45921,45922,45923,45924,45925,45926,45927,45928,45929,45930,45931,45932,45933,45934,45935,45936,45937,45938,45939,45940,45941,45942,45943,45944,45945,45946,45947,45948,45949,45950,45951,45952,45953,45954,45955,45956,45957,45958,45959,45960,45961,45962,45963,45964,45965,45966,45967,45968,45969,45970,45971,45972,45973,45974,45975,45976,45977,45978,45979,45980,45981,45982,45983,45984,45985,45986,45987,45988,45989,45990,45991,45992,45993,45994,45995,45996,45997,45998,45999,46000,46001,46002,46003,46004,46005,46006,46007,46008,46009,46010,46011,46012,46013,46014,46015,46016,46017,46018,46019,46020,46021,46022,46023,46024,46025,46026,46027,46028,46029,46030,46031,46032,46033,46034,46035,46036,46037,46038,46039,46040,46041,46042,46043,46044,46045,46046,46047,46048,46049,46050,46051,46052,46053,46054,46055,46056,46057,46058,46059,46060,46061,46062,46063,46064,46065,46066,46067,46068,46069,46070,46071,46072,46073,46074,46075,46076,46077,46078,46079,46080,46081,46082,46083,46084,46085,46086,46087,46088,46089,46090,46091,46092,46093,46094,46095,46096,46097,46098,46099,46100,46101,46102,46103,46104,46105,46106,46107,46108,46109,46110,46111,46112,46113,46114,46115,46116,46117,46118,46119,46120,46121,46122,46123,46124,46125,46126,46127,46128,46129,46130,46131,46132,46133,46134,46135,46136,46137,46138,46139,46140,46141,46142,46143,46144,46145,46146,46147,46148,46149,46150,46151,46152,46153,46154,46155,46156,46157,46158,46159,46160,46161,46162,46163,46164,46165,46166,46167,46168,46169,46170,46171,46172,46173,46174,46175,46176,46177,46178,46179,46180,46181,46182,46183,46184,46185,46186,46187,46188,46189,46190,46191,46192,46193,46194,46195,46196,46197,46198,46199,46200,46201,46202,46203,46204,46205,46206,46207,46208,46209,46210,46211,46212,46213,46214,46215,46216,46217,46218,46219,46220,46221,46222,46223,46224,46225,46226,46227,46228,46229,46230,46231,46232,46233,46234,46235,46236,46237,46238,46239,46240,46241,46242,46243,46244,46245,46246,46247,46248,46249,46250,46251,46252,46253,46254,46255,46256,46257,46258,46259,46260,46261,46262,46263,46264,46265,46266,46267,46268,46269,46270,46271,46272,46273,46274,46275,46276,46277,46278,46279,46280,46281,46282,46283,46284,46285,46286,46287,46288,46289,46290,46291,46292,46293,46294,46295,46296,46297,46298,46299,46300,46301,46302,46303,46304,46305,46306,46307,46308,46309,46310,46311,46312,46313,46314,46315,46316,46317,46318,46319,46320,46321,46322,46323,46324,46325,46326,46327,46328,46329,46330,46331,46332,46333,46334,46335,46336,46337,46338,46339,46340,46341,46342,46343,46344,46345,46346,46347,46348,46349,46350,46351,46352,46353,46354,46355,46356,46357,46358,46359,46360,46361,46362,46363,46364,46365,46366,46367,46368,46369,46370,46371,46372,46373,46374,46375,46376,46377,46378,46379,46380,46381,46382,46383,46384,46385,46386,46387,46388,46389,46390,46391,46392,46393,46394,46395,46396,46397,46398,46399,46400,46401,46402,46403,46404,46405,46406,46407,46408,46409,46410,46411,46412,46413,46414,46415,46416,46417,46418,46419,46420,46421,46422,46423,46424,46425,46426,46427,46428,46429,46430,46431,46432,46433,46434,46435,46436,46437,46438,46439,46440,46441,46442,46443,46444,46445,46446,46447,46448,46449,46450,46451,46452,46453,46454,46455,46456,46457,46458,46459,46460,46461,46462,46463,46464,46465,46466,46467,46468,46469,46470,46471,46472,46473,46474,46475,46476,46477,46478,46479,46480,46481,46482,46483,46484,46485,46486,46487,46488,46489,46490,46491,46492,46493,46494,46495,46496,46497,46498,46499,46500,46501,46502,46503,46504,46505,46506,46507,46508,46509,46510,46511,46512,46513,46514,46515,46516,46517,46518,46519,46520,46521,46522,46523,46524,46525,46526,46527,46528,46529,46530,46531,46532,46533,46534,46535,46536,46537,46538,46539,46540,46541,46542,46543,46544,46545,46546,46547,46548,46549,46550,46551,46552,46553,46554,46555,46556,46557,46558,46559,46560,46561,46562,46563,46564,46565,46566,46567,46568,46569,46570,46571,46572,46573,46574,46575,46576,46577,46578,46579,46580,46581,46582,46583,46584,46585,46586,46587,46588,46589,46590,46591,46592,46593,46594,46595,46596,46597,46598,46599,46600,46601,46602,46603,46604,46605,46606,46607,46608,46609,46610,46611,46612,46613,46614,46615,46616,46617,46618,46619,46620,46621,46622,46623,46624,46625,46626,46627,46628,46629,46630,46631,46632,46633,46634,46635,46636,46637,46638,46639,46640,46641,46642,46643,46644,46645,46646,46647,46648,46649,46650,46651,46652,46653,46654,46655,46656,46657,46658,46659,46660,46661,46662,46663,46664,46665,46666,46667,46668,46669,46670,46671,46672,46673,46674,46675,46676,46677,46678,46679,46680,46681,46682,46683,46684,46685,46686,46687,46688,46689,46690,46691,46692,46693,46694,46695,46696,46697,46698,46699,46700,46701,46702,46703,46704,46705,46706,46707,46708,46709,46710,46711,46712,46713,46714,46715,46716,46717,46718,46719,46720,46721,46722,46723,46724,46725,46726,46727,46728,46729,46730,46731,46732,46733,46734,46735,46736,46737,46738,46739,46740,46741,46742,46743,46744,46745,46746,46747,46748,46749,46750,46751,46752,46753,46754,46755,46756,46757,46758,46759,46760,46761,46762,46763,46764,46765,46766,46767,46768,46769,46770,46771,46772,46773,46774,46775,46776,46777,46778,46779,46780,46781,46782,46783,46784,46785,46786,46787,46788,46789,46790,46791,46792,46793,46794,46795,46796,46797,46798,46799,46800,46801,46802,46803,46804,46805,46806,46807,46808,46809,46810,46811,46812,46813,46814,46815,46816,46817,46818,46819,46820,46821,46822,46823,46824,46825,46826,46827,46828,46829,46830,46831,46832,46833,46834,46835,46836,46837,46838,46839,46840,46841,46842,46843,46844,46845,46846,46847,46848,46849,46850,46851,46852,46853,46854,46855,46856,46857,46858,46859,46860,46861,46862,46863,46864,46865,46866,46867,46868,46869,46870,46871,46872,46873,46874,46875,46876,46877,46878,46879,46880,46881,46882,46883,46884,46885,46886,46887,46888,46889,46890,46891,46892,46893,46894,46895,46896,46897,46898,46899,46900,46901,46902,46903,46904,46905,46906,46907,46908,46909,46910,46911,46912,46913,46914,46915,46916,46917,46918,46919,46920,46921,46922,46923,46924,46925,46926,46927,46928,46929,46930,46931,46932,46933,46934,46935,46936,46937,46938,46939,46940,46941,46942,46943,46944,46945,46946,46947,46948,46949,46950,46951,46952,46953,46954,46955,46956,46957,46958,46959,46960,46961,46962,46963,46964,46965,46966,46967,46968,46969,46970,46971,46972,46973,46974,46975,46976,46977,46978,46979,46980,46981,46982,46983,46984,46985,46986,46987,46988,46989,46990,46991,46992,46993,46994,46995,46996,46997,46998,46999,47000,47001,47002,47003,47004,47005,47006,47007,47008,47009,47010,47011,47012,47013,47014,47015,47016,47017,47018,47019,47020,47021,47022,47023,47024,47025,47026,47027,47028,47029,47030,47031,47032,47033,47034,47035,47036,47037,47038,47039,47040,47041,47042,47043,47044,47045,47046,47047,47048,47049,47050,47051,47052,47053,47054,47055,47056,47057,47058,47059,47060,47061,47062,47063,47064,47065,47066,47067,47068,47069,47070,47071,47072,47073,47074,47075,47076,47077,47078,47079,47080,47081,47082,47083,47084,47085,47086,47087,47088,47089,47090,47091,47092,47093,47094,47095,47096,47097,47098,47099,47100,47101,47102,47103,47104,47105,47106,47107,47108,47109,47110,47111,47112,47113,47114,47115,47116,47117,47118,47119,47120,47121,47122,47123,47124,47125,47126,47127,47128,47129,47130,47131,47132,47133,47134,47135,47136,47137,47138,47139,47140,47141,47142,47143,47144,47145,47146,47147,47148,47149,47150,47151,47152,47153,47154,47155,47156,47157,47158,47159,47160,47161,47162,47163,47164,47165,47166,47167,47168,47169,47170,47171,47172,47173,47174,47175,47176,47177,47178,47179,47180,47181,47182,47183,47184,47185,47186,47187,47188,47189,47190,47191,47192,47193,47194,47195,47196,47197,47198,47199,47200,47201,47202,47203,47204,47205,47206,47207,47208,47209,47210,47211,47212,47213,47214,47215,47216,47217,47218,47219,47220,47221,47222,47223,47224,47225,47226,47227,47228,47229,47230,47231,47232,47233,47234,47235,47236,47237,47238,47239,47240,47241,47242,47243,47244,47245,47246,47247,47248,47249,47250,47251,47252,47253,47254,47255,47256,47257,47258,47259,47260,47261,47262,47263,47264,47265,47266,47267,47268,47269,47270,47271,47272,47273,47274,47275,47276,47277,47278,47279,47280,47281,47282,47283,47284,47285,47286,47287,47288,47289,47290,47291,47292,47293,47294,47295,47296,47297,47298,47299,47300,47301,47302,47303,47304,47305,47306,47307,47308,47309,47310,47311,47312,47313,47314,47315,47316,47317,47318,47319,47320,47321,47322,47323,47324,47325,47326,47327,47328,47329,47330,47331,47332,47333,47334,47335,47336,47337,47338,47339,47340,47341,47342,47343,47344,47345,47346,47347,47348,47349,47350,47351,47352,47353,47354,47355,47356,47357,47358,47359,47360,47361,47362,47363,47364,47365,47366,47367,47368,47369,47370,47371,47372,47373,47374,47375,47376,47377,47378,47379,47380,47381,47382,47383,47384,47385,47386,47387,47388,47389,47390,47391,47392,47393,47394,47395,47396,47397,47398,47399,47400,47401,47402,47403,47404,47405,47406,47407,47408,47409,47410,47411,47412,47413,47414,47415,47416,47417,47418,47419,47420,47421,47422,47423,47424,47425,47426,47427,47428,47429,47430,47431,47432,47433,47434,47435,47436,47437,47438,47439,47440,47441,47442,47443,47444,47445,47446,47447,47448,47449,47450,47451,47452,47453,47454,47455,47456,47457,47458,47459,47460,47461,47462,47463,47464,47465,47466,47467,47468,47469,47470,47471,47472,47473,47474,47475,47476,47477,47478,47479,47480,47481,47482,47483,47484,47485,47486,47487,47488,47489,47490,47491,47492,47493,47494,47495,47496,47497,47498,47499,47500,47501,47502,47503,47504,47505,47506,47507,47508,47509,47510,47511,47512,47513,47514,47515,47516,47517,47518,47519,47520,47521,47522,47523,47524,47525,47526,47527,47528,47529,47530,47531,47532,47533,47534,47535,47536,47537,47538,47539,47540,47541,47542,47543,47544,47545,47546,47547,47548,47549,47550,47551,47552,47553,47554,47555,47556,47557,47558,47559,47560,47561,47562,47563,47564,47565,47566,47567,47568,47569,47570,47571,47572,47573,47574,47575,47576,47577,47578,47579,47580,47581,47582,47583,47584,47585,47586,47587,47588,47589,47590,47591,47592,47593,47594,47595,47596,47597,47598,47599,47600,47601,47602,47603,47604,47605,47606,47607,47608,47609,47610,47611,47612,47613,47614,47615,47616,47617,47618,47619,47620,47621,47622,47623,47624,47625,47626,47627,47628,47629,47630,47631,47632,47633,47634,47635,47636,47637,47638,47639,47640,47641,47642,47643,47644,47645,47646,47647,47648,47649,47650,47651,47652,47653,47654,47655,47656,47657,47658,47659,47660,47661,47662,47663,47664,47665,47666,47667,47668,47669,47670,47671,47672,47673,47674,47675,47676,47677,47678,47679,47680,47681,47682,47683,47684,47685,47686,47687,47688,47689,47690,47691,47692,47693,47694,47695,47696,47697,47698,47699,47700,47701,47702,47703,47704,47705,47706,47707,47708,47709,47710,47711,47712,47713,47714,47715,47716,47717,47718,47719,47720,47721,47722,47723,47724,47725,47726,47727,47728,47729,47730,47731,47732,47733,47734,47735,47736,47737,47738,47739,47740,47741,47742,47743,47744,47745,47746,47747,47748,47749,47750,47751,47752,47753,47754,47755,47756,47757,47758,47759,47760,47761,47762,47763,47764,47765,47766,47767,47768,47769,47770,47771,47772,47773,47774,47775,47776,47777,47778,47779,47780,47781,47782,47783,47784,47785,47786,47787,47788,47789,47790,47791,47792,47793,47794,47795,47796,47797,47798,47799,47800,47801,47802,47803,47804,47805,47806,47807,47808,47809,47810,47811,47812,47813,47814,47815,47816,47817,47818,47819,47820,47821,47822,47823,47824,47825,47826,47827,47828,47829,47830,47831,47832,47833,47834,47835,47836,47837,47838,47839,47840,47841,47842,47843,47844,47845,47846,47847,47848,47849,47850,47851,47852,47853,47854,47855,47856,47857,47858,47859,47860,47861,47862,47863,47864,47865,47866,47867,47868,47869,47870,47871,47872,47873,47874,47875,47876,47877,47878,47879,47880,47881,47882,47883,47884,47885,47886,47887,47888,47889,47890,47891,47892,47893,47894,47895,47896,47897,47898,47899,47900,47901,47902,47903,47904,47905,47906,47907,47908,47909,47910,47911,47912,47913,47914,47915,47916,47917,47918,47919,47920,47921,47922,47923,47924,47925,47926,47927,47928,47929,47930,47931,47932,47933,47934,47935,47936,47937,47938,47939,47940,47941,47942,47943,47944,47945,47946,47947,47948,47949,47950,47951,47952,47953,47954,47955,47956,47957,47958,47959,47960,47961,47962,47963,47964,47965,47966,47967,47968,47969,47970,47971,47972,47973,47974,47975,47976,47977,47978,47979,47980,47981,47982,47983,47984,47985,47986,47987,47988,47989,47990,47991,47992,47993,47994,47995,47996,47997,47998,47999,48000,48001,48002,48003,48004,48005,48006,48007,48008,48009,48010,48011,48012,48013,48014,48015,48016,48017,48018,48019,48020,48021,48022,48023,48024,48025,48026,48027,48028,48029,48030,48031,48032,48033,48034,48035,48036,48037,48038,48039,48040,48041,48042,48043,48044,48045,48046,48047,48048,48049,48050,48051,48052,48053,48054,48055,48056,48057,48058,48059,48060,48061,48062,48063,48064,48065,48066,48067,48068,48069,48070,48071,48072,48073,48074,48075,48076,48077,48078,48079,48080,48081,48082,48083,48084,48085,48086,48087,48088,48089,48090,48091,48092,48093,48094,48095,48096,48097,48098,48099,48100,48101,48102,48103,48104,48105,48106,48107,48108,48109,48110,48111,48112,48113,48114,48115,48116,48117,48118,48119,48120,48121,48122,48123,48124,48125,48126,48127,48128,48129,48130,48131,48132,48133,48134,48135,48136,48137,48138,48139,48140,48141,48142,48143,48144,48145,48146,48147,48148,48149,48150,48151,48152,48153,48154,48155,48156,48157,48158,48159,48160,48161,48162,48163,48164,48165,48166,48167,48168,48169,48170,48171,48172,48173,48174,48175,48176,48177,48178,48179,48180,48181,48182,48183,48184,48185,48186,48187,48188,48189,48190,48191,48192,48193,48194,48195,48196,48197,48198,48199,48200,48201,48202,48203,48204,48205,48206,48207,48208,48209,48210,48211,48212,48213,48214,48215,48216,48217,48218,48219,48220,48221,48222,48223,48224,48225,48226,48227,48228,48229,48230,48231,48232,48233,48234,48235,48236,48237,48238,48239,48240,48241,48242,48243,48244,48245,48246,48247,48248,48249,48250,48251,48252,48253,48254,48255,48256,48257,48258,48259,48260,48261,48262,48263,48264,48265,48266,48267,48268,48269,48270,48271,48272,48273,48274,48275,48276,48277,48278,48279,48280,48281,48282,48283,48284,48285,48286,48287,48288,48289,48290,48291,48292,48293,48294,48295,48296,48297,48298,48299,48300,48301,48302,48303,48304,48305,48306,48307,48308,48309,48310,48311,48312,48313,48314,48315,48316,48317,48318,48319,48320,48321,48322,48323,48324,48325,48326,48327,48328,48329,48330,48331,48332,48333,48334,48335,48336,48337,48338,48339,48340,48341,48342,48343,48344,48345,48346,48347,48348,48349,48350,48351,48352,48353,48354,48355,48356,48357,48358,48359,48360,48361,48362,48363,48364,48365,48366,48367,48368,48369,48370,48371,48372,48373,48374,48375,48376,48377,48378,48379,48380,48381,48382,48383,48384,48385,48386,48387,48388,48389,48390,48391,48392,48393,48394,48395,48396,48397,48398,48399,48400,48401,48402,48403,48404,48405,48406,48407,48408,48409,48410,48411,48412,48413,48414,48415,48416,48417,48418,48419,48420,48421,48422,48423,48424,48425,48426,48427,48428,48429,48430,48431,48432,48433,48434,48435,48436,48437,48438,48439,48440,48441,48442,48443,48444,48445,48446,48447,48448,48449,48450,48451,48452,48453,48454,48455,48456,48457,48458,48459,48460,48461,48462,48463,48464,48465,48466,48467,48468,48469,48470,48471,48472,48473,48474,48475,48476,48477,48478,48479,48480,48481,48482,48483,48484,48485,48486,48487,48488,48489,48490,48491,48492,48493,48494,48495,48496,48497,48498,48499,48500,48501,48502,48503,48504,48505,48506,48507,48508,48509,48510,48511,48512,48513,48514,48515,48516,48517,48518,48519,48520,48521,48522,48523,48524,48525,48526,48527,48528,48529,48530,48531,48532,48533,48534,48535,48536,48537,48538,48539,48540,48541,48542,48543,48544,48545,48546,48547,48548,48549,48550,48551,48552,48553,48554,48555,48556,48557,48558,48559,48560,48561,48562,48563,48564,48565,48566,48567,48568,48569,48570,48571,48572,48573,48574,48575,48576,48577,48578,48579,48580,48581,48582,48583,48584,48585,48586,48587,48588,48589,48590,48591,48592,48593,48594,48595,48596,48597,48598,48599,48600,48601,48602,48603,48604,48605,48606,48607,48608,48609,48610,48611,48612,48613,48614,48615,48616,48617,48618,48619,48620,48621,48622,48623,48624,48625,48626,48627,48628,48629,48630,48631,48632,48633,48634,48635,48636,48637,48638,48639,48640,48641,48642,48643,48644,48645,48646,48647,48648,48649,48650,48651,48652,48653,48654,48655,48656,48657,48658,48659,48660,48661,48662,48663,48664,48665,48666,48667,48668,48669,48670,48671,48672,48673,48674,48675,48676,48677,48678,48679,48680,48681,48682,48683,48684,48685,48686,48687,48688,48689,48690,48691,48692,48693,48694,48695,48696,48697,48698,48699,48700,48701,48702,48703,48704,48705,48706,48707,48708,48709,48710,48711,48712,48713,48714,48715,48716,48717,48718,48719,48720,48721,48722,48723,48724,48725,48726,48727,48728,48729,48730,48731,48732,48733,48734,48735,48736,48737,48738,48739,48740,48741,48742,48743,48744,48745,48746,48747,48748,48749,48750,48751,48752,48753,48754,48755,48756,48757,48758,48759,48760,48761,48762,48763,48764,48765,48766,48767,48768,48769,48770,48771,48772,48773,48774,48775,48776,48777,48778,48779,48780,48781,48782,48783,48784,48785,48786,48787,48788,48789,48790,48791,48792,48793,48794,48795,48796,48797,48798,48799,48800,48801,48802,48803,48804,48805,48806,48807,48808,48809,48810,48811,48812,48813,48814,48815,48816,48817,48818,48819,48820,48821,48822,48823,48824,48825,48826,48827,48828,48829,48830,48831,48832,48833,48834,48835,48836,48837,48838,48839,48840,48841,48842,48843,48844,48845,48846,48847,48848,48849,48850,48851,48852,48853,48854,48855,48856,48857,48858,48859,48860,48861,48862,48863,48864,48865,48866,48867,48868,48869,48870,48871,48872,48873,48874,48875,48876,48877,48878,48879,48880,48881,48882,48883,48884,48885,48886,48887,48888,48889,48890,48891,48892,48893,48894,48895,48896,48897,48898,48899,48900,48901,48902,48903,48904,48905,48906,48907,48908,48909,48910,48911,48912,48913,48914,48915,48916,48917,48918,48919,48920,48921,48922,48923,48924,48925,48926,48927,48928,48929,48930,48931,48932,48933,48934,48935,48936,48937,48938,48939,48940,48941,48942,48943,48944,48945,48946,48947,48948,48949,48950,48951,48952,48953,48954,48955,48956,48957,48958,48959,48960,48961,48962,48963,48964,48965,48966,48967,48968,48969,48970,48971,48972,48973,48974,48975,48976,48977,48978,48979,48980,48981,48982,48983,48984,48985,48986,48987,48988,48989,48990,48991,48992,48993,48994,48995,48996,48997,48998,48999,49000,49001,49002,49003,49004,49005,49006,49007,49008,49009,49010,49011,49012,49013,49014,49015,49016,49017,49018,49019,49020,49021,49022,49023,49024,49025,49026,49027,49028,49029,49030,49031,49032,49033,49034,49035,49036,49037,49038,49039,49040,49041,49042,49043,49044,49045,49046,49047,49048,49049,49050,49051,49052,49053,49054,49055,49056,49057,49058,49059,49060,49061,49062,49063,49064,49065,49066,49067,49068,49069,49070,49071,49072,49073,49074,49075,49076,49077,49078,49079,49080,49081,49082,49083,49084,49085,49086,49087,49088,49089,49090,49091,49092,49093,49094,49095,49096,49097,49098,49099,49100,49101,49102,49103,49104,49105,49106,49107,49108,49109,49110,49111,49112,49113,49114,49115,49116,49117,49118,49119,49120,49121,49122,49123,49124,49125,49126,49127,49128,49129,49130,49131,49132,49133,49134,49135,49136,49137,49138,49139,49140,49141,49142,49143,49144,49145,49146,49147,49148,49149,49150,49151,49152,49153,49154,49155,49156,49157,49158,49159,49160,49161,49162,49163,49164,49165,49166,49167,49168,49169,49170,49171,49172,49173,49174,49175,49176,49177,49178,49179,49180,49181,49182,49183,49184,49185,49186,49187,49188,49189,49190,49191,49192,49193,49194,49195,49196,49197,49198,49199,49200,49201,49202,49203,49204,49205,49206,49207,49208,49209,49210,49211,49212,49213,49214,49215,49216,49217,49218,49219,49220,49221,49222,49223,49224,49225,49226,49227,49228,49229,49230,49231,49232,49233,49234,49235,49236,49237,49238,49239,49240,49241,49242,49243,49244,49245,49246,49247,49248,49249,49250,49251,49252,49253,49254,49255,49256,49257,49258,49259,49260,49261,49262,49263,49264,49265,49266,49267,49268,49269,49270,49271,49272,49273,49274,49275,49276,49277,49278,49279,49280,49281,49282,49283,49284,49285,49286,49287,49288,49289,49290,49291,49292,49293,49294,49295,49296,49297,49298,49299,49300,49301,49302,49303,49304,49305,49306,49307,49308,49309,49310,49311,49312,49313,49314,49315,49316,49317,49318,49319,49320,49321,49322,49323,49324,49325,49326,49327,49328,49329,49330,49331,49332,49333,49334,49335,49336,49337,49338,49339,49340,49341,49342,49343,49344,49345,49346,49347,49348,49349,49350,49351,49352,49353,49354,49355,49356,49357,49358,49359,49360,49361,49362,49363,49364,49365,49366,49367,49368,49369,49370,49371,49372,49373,49374,49375,49376,49377,49378,49379,49380,49381,49382,49383,49384,49385,49386,49387,49388,49389,49390,49391,49392,49393,49394,49395,49396,49397,49398,49399,49400,49401,49402,49403,49404,49405,49406,49407,49408,49409,49410,49411,49412,49413,49414,49415,49416,49417,49418,49419,49420,49421,49422,49423,49424,49425,49426,49427,49428,49429,49430,49431,49432,49433,49434,49435,49436,49437,49438,49439,49440,49441,49442,49443,49444,49445,49446,49447,49448,49449,49450,49451,49452,49453,49454,49455,49456,49457,49458,49459,49460,49461,49462,49463,49464,49465,49466,49467,49468,49469,49470,49471,49472,49473,49474,49475,49476,49477,49478,49479,49480,49481,49482,49483,49484,49485,49486,49487,49488,49489,49490,49491,49492,49493,49494,49495,49496,49497,49498,49499,49500,49501,49502,49503,49504,49505,49506,49507,49508,49509,49510,49511,49512,49513,49514,49515,49516,49517,49518,49519,49520,49521,49522,49523,49524,49525,49526,49527,49528,49529,49530,49531,49532,49533,49534,49535,49536,49537,49538,49539,49540,49541,49542,49543,49544,49545,49546,49547,49548,49549,49550,49551,49552,49553,49554,49555,49556,49557,49558,49559,49560,49561,49562,49563,49564,49565,49566,49567,49568,49569,49570,49571,49572,49573,49574,49575,49576,49577,49578,49579,49580,49581,49582,49583,49584,49585,49586,49587,49588,49589,49590,49591,49592,49593,49594,49595,49596,49597,49598,49599,49600,49601,49602,49603,49604,49605,49606,49607,49608,49609,49610,49611,49612,49613,49614,49615,49616,49617,49618,49619,49620,49621,49622,49623,49624,49625,49626,49627,49628,49629,49630,49631,49632,49633,49634,49635,49636,49637,49638,49639,49640,49641,49642,49643,49644,49645,49646,49647,49648,49649,49650,49651,49652,49653,49654,49655,49656,49657,49658,49659,49660,49661,49662,49663,49664,49665,49666,49667,49668,49669,49670,49671,49672,49673,49674,49675,49676,49677,49678,49679,49680,49681,49682,49683,49684,49685,49686,49687,49688,49689,49690,49691,49692,49693,49694,49695,49696,49697,49698,49699,49700,49701,49702,49703,49704,49705,49706,49707,49708,49709,49710,49711,49712,49713,49714,49715,49716,49717,49718,49719,49720,49721,49722,49723,49724,49725,49726,49727,49728,49729,49730,49731,49732,49733,49734,49735,49736,49737,49738,49739,49740,49741,49742,49743,49744,49745,49746,49747,49748,49749,49750,49751,49752,49753,49754,49755,49756,49757,49758,49759,49760,49761,49762,49763,49764,49765,49766,49767,49768,49769,49770,49771,49772,49773,49774,49775,49776,49777,49778,49779,49780,49781,49782,49783,49784,49785,49786,49787,49788,49789,49790,49791,49792,49793,49794,49795,49796,49797,49798,49799,49800,49801,49802,49803,49804,49805,49806,49807,49808,49809,49810,49811,49812,49813,49814,49815,49816,49817,49818,49819,49820,49821,49822,49823,49824,49825,49826,49827,49828,49829,49830,49831,49832,49833,49834,49835,49836,49837,49838,49839,49840,49841,49842,49843,49844,49845,49846,49847,49848,49849,49850,49851,49852,49853,49854,49855,49856,49857,49858,49859,49860,49861,49862,49863,49864,49865,49866,49867,49868,49869,49870,49871,49872,49873,49874,49875,49876,49877,49878,49879,49880,49881,49882,49883,49884,49885,49886,49887,49888,49889,49890,49891,49892,49893,49894,49895,49896,49897,49898,49899,49900,49901,49902,49903,49904,49905,49906,49907,49908,49909,49910,49911,49912,49913,49914,49915,49916,49917,49918,49919,49920,49921,49922,49923,49924,49925,49926,49927,49928,49929,49930,49931,49932,49933,49934,49935,49936,49937,49938,49939,49940,49941,49942,49943,49944,49945,49946,49947,49948,49949,49950,49951,49952,49953,49954,49955,49956,49957,49958,49959,49960,49961,49962,49963,49964,49965,49966,49967,49968,49969,49970,49971,49972,49973,49974,49975,49976,49977,49978,49979,49980,49981,49982,49983,49984,49985,49986,49987,49988,49989,49990,49991,49992,49993,49994,49995,49996,49997,49998,49999,50000,50001,50002,50003,50004,50005,50006,50007,50008,50009,50010,50011,50012,50013,50014,50015,50016,50017,50018,50019,50020,50021,50022,50023,50024,50025,50026,50027,50028,50029,50030,50031,50032,50033,50034,50035,50036,50037,50038,50039,50040,50041,50042,50043,50044,50045,50046,50047,50048,50049,50050,50051,50052,50053,50054,50055,50056,50057,50058,50059,50060,50061,50062,50063,50064,50065,50066,50067,50068,50069,50070,50071,50072,50073,50074,50075,50076,50077,50078,50079,50080,50081,50082,50083,50084,50085,50086,50087,50088,50089,50090,50091,50092,50093,50094,50095,50096,50097,50098,50099,50100,50101,50102,50103,50104,50105,50106,50107,50108,50109,50110,50111,50112,50113,50114,50115,50116,50117,50118,50119,50120,50121,50122,50123,50124,50125,50126,50127,50128,50129,50130,50131,50132,50133,50134,50135,50136,50137,50138,50139,50140,50141,50142,50143,50144,50145,50146,50147,50148,50149,50150,50151,50152,50153,50154,50155,50156,50157,50158,50159,50160,50161,50162,50163,50164,50165,50166,50167,50168,50169,50170,50171,50172,50173,50174,50175,50176,50177,50178,50179,50180,50181,50182,50183,50184,50185,50186,50187,50188,50189,50190,50191,50192,50193,50194,50195,50196,50197,50198,50199,50200,50201,50202,50203,50204,50205,50206,50207,50208,50209,50210,50211,50212,50213,50214,50215,50216,50217,50218,50219,50220,50221,50222,50223,50224,50225,50226,50227,50228,50229,50230,50231,50232,50233,50234,50235,50236,50237,50238,50239,50240,50241,50242,50243,50244,50245,50246,50247,50248,50249,50250,50251,50252,50253,50254,50255,50256,50257,50258,50259,50260,50261,50262,50263,50264,50265,50266,50267,50268,50269,50270,50271,50272,50273,50274,50275,50276,50277,50278,50279,50280,50281,50282,50283,50284,50285,50286,50287,50288,50289,50290,50291,50292,50293,50294,50295,50296,50297,50298,50299,50300,50301,50302,50303,50304,50305,50306,50307,50308,50309,50310,50311,50312,50313,50314,50315,50316,50317,50318,50319,50320,50321,50322,50323,50324,50325,50326,50327,50328,50329,50330,50331,50332,50333,50334,50335,50336,50337,50338,50339,50340,50341,50342,50343,50344,50345,50346,50347,50348,50349,50350,50351,50352,50353,50354,50355,50356,50357,50358,50359,50360,50361,50362,50363,50364,50365,50366,50367,50368,50369,50370,50371,50372,50373,50374,50375,50376,50377,50378,50379,50380,50381,50382,50383,50384,50385,50386,50387,50388,50389,50390,50391,50392,50393,50394,50395,50396,50397,50398,50399,50400,50401,50402,50403,50404,50405,50406,50407,50408,50409,50410,50411,50412,50413,50414,50415,50416,50417,50418,50419,50420,50421,50422,50423,50424,50425,50426,50427,50428,50429,50430,50431,50432,50433,50434,50435,50436,50437,50438,50439,50440,50441,50442,50443,50444,50445,50446,50447,50448,50449,50450,50451,50452,50453,50454,50455,50456,50457,50458,50459,50460,50461,50462,50463,50464,50465,50466,50467,50468,50469,50470,50471,50472,50473,50474,50475,50476,50477,50478,50479,50480,50481,50482,50483,50484,50485,50486,50487,50488,50489,50490,50491,50492,50493,50494,50495,50496,50497,50498,50499,50500,50501,50502,50503,50504,50505,50506,50507,50508,50509,50510,50511,50512,50513,50514,50515,50516,50517,50518,50519,50520,50521,50522,50523,50524,50525,50526,50527,50528,50529,50530,50531,50532,50533,50534,50535,50536,50537,50538,50539,50540,50541,50542,50543,50544,50545,50546,50547,50548,50549,50550,50551,50552,50553,50554,50555,50556,50557,50558,50559,50560,50561,50562,50563,50564,50565,50566,50567,50568,50569,50570,50571,50572,50573,50574,50575,50576,50577,50578,50579,50580,50581,50582,50583,50584,50585,50586,50587,50588,50589,50590,50591,50592,50593,50594,50595,50596,50597,50598,50599,50600,50601,50602,50603,50604,50605,50606,50607,50608,50609,50610,50611,50612,50613,50614,50615,50616,50617,50618,50619,50620,50621,50622,50623,50624,50625,50626,50627,50628,50629,50630,50631,50632,50633,50634,50635,50636,50637,50638,50639,50640,50641,50642,50643,50644,50645,50646,50647,50648,50649,50650,50651,50652,50653,50654,50655,50656,50657,50658,50659,50660,50661,50662,50663,50664,50665,50666,50667,50668,50669,50670,50671,50672,50673,50674,50675,50676,50677,50678,50679,50680,50681,50682,50683,50684,50685,50686,50687,50688,50689,50690,50691,50692,50693,50694,50695,50696,50697,50698,50699,50700,50701,50702,50703,50704,50705,50706,50707,50708,50709,50710,50711,50712,50713,50714,50715,50716,50717,50718,50719,50720,50721,50722,50723,50724,50725,50726,50727,50728,50729,50730,50731,50732,50733,50734,50735,50736,50737,50738,50739,50740,50741,50742,50743,50744,50745,50746,50747,50748,50749,50750,50751,50752,50753,50754,50755,50756,50757,50758,50759,50760,50761,50762,50763,50764,50765,50766,50767,50768,50769,50770,50771,50772,50773,50774,50775,50776,50777,50778,50779,50780,50781,50782,50783,50784,50785,50786,50787,50788,50789,50790,50791,50792,50793,50794,50795,50796,50797,50798,50799,50800,50801,50802,50803,50804,50805,50806,50807,50808,50809,50810,50811,50812,50813,50814,50815,50816,50817,50818,50819,50820,50821,50822,50823,50824,50825,50826,50827,50828,50829,50830,50831,50832,50833,50834,50835,50836,50837,50838,50839,50840,50841,50842,50843,50844,50845,50846,50847,50848,50849,50850,50851,50852,50853,50854,50855,50856,50857,50858,50859,50860,50861,50862,50863,50864,50865,50866,50867,50868,50869,50870,50871,50872,50873,50874,50875,50876,50877,50878,50879,50880,50881,50882,50883,50884,50885,50886,50887,50888,50889,50890,50891,50892,50893,50894,50895,50896,50897,50898,50899,50900,50901,50902,50903,50904,50905,50906,50907,50908,50909,50910,50911,50912,50913,50914,50915,50916,50917,50918,50919,50920,50921,50922,50923,50924,50925,50926,50927,50928,50929,50930,50931,50932,50933,50934,50935,50936,50937,50938,50939,50940,50941,50942,50943,50944,50945,50946,50947,50948,50949,50950,50951,50952,50953,50954,50955,50956,50957,50958,50959,50960,50961,50962,50963,50964,50965,50966,50967,50968,50969,50970,50971,50972,50973,50974,50975,50976,50977,50978,50979,50980,50981,50982,50983,50984,50985,50986,50987,50988,50989,50990,50991,50992,50993,50994,50995,50996,50997,50998,50999,51000,51001,51002,51003,51004,51005,51006,51007,51008,51009,51010,51011,51012,51013,51014,51015,51016,51017,51018,51019,51020,51021,51022,51023,51024,51025,51026,51027,51028,51029,51030,51031,51032,51033,51034,51035,51036,51037,51038,51039,51040,51041,51042,51043,51044,51045,51046,51047,51048,51049,51050,51051,51052,51053,51054,51055,51056,51057,51058,51059,51060,51061,51062,51063,51064,51065,51066,51067,51068,51069,51070,51071,51072,51073,51074,51075,51076,51077,51078,51079,51080,51081,51082,51083,51084,51085,51086,51087,51088,51089,51090,51091,51092,51093,51094,51095,51096,51097,51098,51099,51100,51101,51102,51103,51104,51105,51106,51107,51108,51109,51110,51111,51112,51113,51114,51115,51116,51117,51118,51119,51120,51121,51122,51123,51124,51125,51126,51127,51128,51129,51130,51131,51132,51133,51134,51135,51136,51137,51138,51139,51140,51141,51142,51143,51144,51145,51146,51147,51148,51149,51150,51151,51152,51153,51154,51155,51156,51157,51158,51159,51160,51161,51162,51163,51164,51165,51166,51167,51168,51169,51170,51171,51172,51173,51174,51175,51176,51177,51178,51179,51180,51181,51182,51183,51184,51185,51186,51187,51188,51189,51190,51191,51192,51193,51194,51195,51196,51197,51198,51199,51200,51201,51202,51203,51204,51205,51206,51207,51208,51209,51210,51211,51212,51213,51214,51215,51216,51217,51218,51219,51220,51221,51222,51223,51224,51225,51226,51227,51228,51229,51230,51231,51232,51233,51234,51235,51236,51237,51238,51239,51240,51241,51242,51243,51244,51245,51246,51247,51248,51249,51250,51251,51252,51253,51254,51255,51256,51257,51258,51259,51260,51261,51262,51263,51264,51265,51266,51267,51268,51269,51270,51271,51272,51273,51274,51275,51276,51277,51278,51279,51280,51281,51282,51283,51284,51285,51286,51287,51288,51289,51290,51291,51292,51293,51294,51295,51296,51297,51298,51299,51300,51301,51302,51303,51304,51305,51306,51307,51308,51309,51310,51311,51312,51313,51314,51315,51316,51317,51318,51319,51320,51321,51322,51323,51324,51325,51326,51327,51328,51329,51330,51331,51332,51333,51334,51335,51336,51337,51338,51339,51340,51341,51342,51343,51344,51345,51346,51347,51348,51349,51350,51351,51352,51353,51354,51355,51356,51357,51358,51359,51360,51361,51362,51363,51364,51365,51366,51367,51368,51369,51370,51371,51372,51373,51374,51375,51376,51377,51378,51379,51380,51381,51382,51383,51384,51385,51386,51387,51388,51389,51390,51391,51392,51393,51394,51395,51396,51397,51398,51399,51400,51401,51402,51403,51404,51405,51406,51407,51408,51409,51410,51411,51412,51413,51414,51415,51416,51417,51418,51419,51420,51421,51422,51423,51424,51425,51426,51427,51428,51429,51430,51431,51432,51433,51434,51435,51436,51437,51438,51439,51440,51441,51442,51443,51444,51445,51446,51447,51448,51449,51450,51451,51452,51453,51454,51455,51456,51457,51458,51459,51460,51461,51462,51463,51464,51465,51466,51467,51468,51469,51470,51471,51472,51473,51474,51475,51476,51477,51478,51479,51480,51481,51482,51483,51484,51485,51486,51487,51488,51489,51490,51491,51492,51493,51494,51495,51496,51497,51498,51499,51500,51501,51502,51503,51504,51505,51506,51507,51508,51509,51510,51511,51512,51513,51514,51515,51516,51517,51518,51519,51520,51521,51522,51523,51524,51525,51526,51527,51528,51529,51530,51531,51532,51533,51534,51535,51536,51537,51538,51539,51540,51541,51542,51543,51544,51545,51546,51547,51548,51549,51550,51551,51552,51553,51554,51555,51556,51557,51558,51559,51560,51561,51562,51563,51564,51565,51566,51567,51568,51569,51570,51571,51572,51573,51574,51575,51576,51577,51578,51579,51580,51581,51582,51583,51584,51585,51586,51587,51588,51589,51590,51591,51592,51593,51594,51595,51596,51597,51598,51599,51600,51601,51602,51603,51604,51605,51606,51607,51608,51609,51610,51611,51612,51613,51614,51615,51616,51617,51618,51619,51620,51621,51622,51623,51624,51625,51626,51627,51628,51629,51630,51631,51632,51633,51634,51635,51636,51637,51638,51639,51640,51641,51642,51643,51644,51645,51646,51647,51648,51649,51650,51651,51652,51653,51654,51655,51656,51657,51658,51659,51660,51661,51662,51663,51664,51665,51666,51667,51668,51669,51670,51671,51672,51673,51674,51675,51676,51677,51678,51679,51680,51681,51682,51683,51684,51685,51686,51687,51688,51689,51690,51691,51692,51693,51694,51695,51696,51697,51698,51699,51700,51701,51702,51703,51704,51705,51706,51707,51708,51709,51710,51711,51712,51713,51714,51715,51716,51717,51718,51719,51720,51721,51722,51723,51724,51725,51726,51727,51728,51729,51730,51731,51732,51733,51734,51735,51736,51737,51738,51739,51740,51741,51742,51743,51744,51745,51746,51747,51748,51749,51750,51751,51752,51753,51754,51755,51756,51757,51758,51759,51760,51761,51762,51763,51764,51765,51766,51767,51768,51769,51770,51771,51772,51773,51774,51775,51776,51777,51778,51779,51780,51781,51782,51783,51784,51785,51786,51787,51788,51789,51790,51791,51792,51793,51794,51795,51796,51797,51798,51799,51800,51801,51802,51803,51804,51805,51806,51807,51808,51809,51810,51811,51812,51813,51814,51815,51816,51817,51818,51819,51820,51821,51822,51823,51824,51825,51826,51827,51828,51829,51830,51831,51832,51833,51834,51835,51836,51837,51838,51839,51840,51841,51842,51843,51844,51845,51846,51847,51848,51849,51850,51851,51852,51853,51854,51855,51856,51857,51858,51859,51860,51861,51862,51863,51864,51865,51866,51867,51868,51869,51870,51871,51872,51873,51874,51875,51876,51877,51878,51879,51880,51881,51882,51883,51884,51885,51886,51887,51888,51889,51890,51891,51892,51893,51894,51895,51896,51897,51898,51899,51900,51901,51902,51903,51904,51905,51906,51907,51908,51909,51910,51911,51912,51913,51914,51915,51916,51917,51918,51919,51920,51921,51922,51923,51924,51925,51926,51927,51928,51929,51930,51931,51932,51933,51934,51935,51936,51937,51938,51939,51940,51941,51942,51943,51944,51945,51946,51947,51948,51949,51950,51951,51952,51953,51954,51955,51956,51957,51958,51959,51960,51961,51962,51963,51964,51965,51966,51967,51968,51969,51970,51971,51972,51973,51974,51975,51976,51977,51978,51979,51980,51981,51982,51983,51984,51985,51986,51987,51988,51989,51990,51991,51992,51993,51994,51995,51996,51997,51998,51999,52000,52001,52002,52003,52004,52005,52006,52007,52008,52009,52010,52011,52012,52013,52014,52015,52016,52017,52018,52019,52020,52021,52022,52023,52024,52025,52026,52027,52028,52029,52030,52031,52032,52033,52034,52035,52036,52037,52038,52039,52040,52041,52042,52043,52044,52045,52046,52047,52048,52049,52050,52051,52052,52053,52054,52055,52056,52057,52058,52059,52060,52061,52062,52063,52064,52065,52066,52067,52068,52069,52070,52071,52072,52073,52074,52075,52076,52077,52078,52079,52080,52081,52082,52083,52084,52085,52086,52087,52088,52089,52090,52091,52092,52093,52094,52095,52096,52097,52098,52099,52100,52101,52102,52103,52104,52105,52106,52107,52108,52109,52110,52111,52112,52113,52114,52115,52116,52117,52118,52119,52120,52121,52122,52123,52124,52125,52126,52127,52128,52129,52130,52131,52132,52133,52134,52135,52136,52137,52138,52139,52140,52141,52142,52143,52144,52145,52146,52147,52148,52149,52150,52151,52152,52153,52154,52155,52156,52157,52158,52159,52160,52161,52162,52163,52164,52165,52166,52167,52168,52169,52170,52171,52172,52173,52174,52175,52176,52177,52178,52179,52180,52181,52182,52183,52184,52185,52186,52187,52188,52189,52190,52191,52192,52193,52194,52195,52196,52197,52198,52199,52200,52201,52202,52203,52204,52205,52206,52207,52208,52209,52210,52211,52212,52213,52214,52215,52216,52217,52218,52219,52220,52221,52222,52223,52224,52225,52226,52227,52228,52229,52230,52231,52232,52233,52234,52235,52236,52237,52238,52239,52240,52241,52242,52243,52244,52245,52246,52247,52248,52249,52250,52251,52252,52253,52254,52255,52256,52257,52258,52259,52260,52261,52262,52263,52264,52265,52266,52267,52268,52269,52270,52271,52272,52273,52274,52275,52276,52277,52278,52279,52280,52281,52282,52283,52284,52285,52286,52287,52288,52289,52290,52291,52292,52293,52294,52295,52296,52297,52298,52299,52300,52301,52302,52303,52304,52305,52306,52307,52308,52309,52310,52311,52312,52313,52314,52315,52316,52317,52318,52319,52320,52321,52322,52323,52324,52325,52326,52327,52328,52329,52330,52331,52332,52333,52334,52335,52336,52337,52338,52339,52340,52341,52342,52343,52344,52345,52346,52347,52348,52349,52350,52351,52352,52353,52354,52355,52356,52357,52358,52359,52360,52361,52362,52363,52364,52365,52366,52367,52368,52369,52370,52371,52372,52373,52374,52375,52376,52377,52378,52379,52380,52381,52382,52383,52384,52385,52386,52387,52388,52389,52390,52391,52392,52393,52394,52395,52396,52397,52398,52399,52400,52401,52402,52403,52404,52405,52406,52407,52408,52409,52410,52411,52412,52413,52414,52415,52416,52417,52418,52419,52420,52421,52422,52423,52424,52425,52426,52427,52428,52429,52430,52431,52432,52433,52434,52435,52436,52437,52438,52439,52440,52441,52442,52443,52444,52445,52446,52447,52448,52449,52450,52451,52452,52453,52454,52455,52456,52457,52458,52459,52460,52461,52462,52463,52464,52465,52466,52467,52468,52469,52470,52471,52472,52473,52474,52475,52476,52477,52478,52479,52480,52481,52482,52483,52484,52485,52486,52487,52488,52489,52490,52491,52492,52493,52494,52495,52496,52497,52498,52499,52500,52501,52502,52503,52504,52505,52506,52507,52508,52509,52510,52511,52512,52513,52514,52515,52516,52517,52518,52519,52520,52521,52522,52523,52524,52525,52526,52527,52528,52529,52530,52531,52532,52533,52534,52535,52536,52537,52538,52539,52540,52541,52542,52543,52544,52545,52546,52547,52548,52549,52550,52551,52552,52553,52554,52555,52556,52557,52558,52559,52560,52561,52562,52563,52564,52565,52566,52567,52568,52569,52570,52571,52572,52573,52574,52575,52576,52577,52578,52579,52580,52581,52582,52583,52584,52585,52586,52587,52588,52589,52590,52591,52592,52593,52594,52595,52596,52597,52598,52599,52600,52601,52602,52603,52604,52605,52606,52607,52608,52609,52610,52611,52612,52613,52614,52615,52616,52617,52618,52619,52620,52621,52622,52623,52624,52625,52626,52627,52628,52629,52630,52631,52632,52633,52634,52635,52636,52637,52638,52639,52640,52641,52642,52643,52644,52645,52646,52647,52648,52649,52650,52651,52652,52653,52654,52655,52656,52657,52658,52659,52660,52661,52662,52663,52664,52665,52666,52667,52668,52669,52670,52671,52672,52673,52674,52675,52676,52677,52678,52679,52680,52681,52682,52683,52684,52685,52686,52687,52688,52689,52690,52691,52692,52693,52694,52695,52696,52697,52698,52699,52700,52701,52702,52703,52704,52705,52706,52707,52708,52709,52710,52711,52712,52713,52714,52715,52716,52717,52718,52719,52720,52721,52722,52723,52724,52725,52726,52727,52728,52729,52730,52731,52732,52733,52734,52735,52736,52737,52738,52739,52740,52741,52742,52743,52744,52745,52746,52747,52748,52749,52750,52751,52752,52753,52754,52755,52756,52757,52758,52759,52760,52761,52762,52763,52764,52765,52766,52767,52768,52769,52770,52771,52772,52773,52774,52775,52776,52777,52778,52779,52780,52781,52782,52783,52784,52785,52786,52787,52788,52789,52790,52791,52792,52793,52794,52795,52796,52797,52798,52799,52800,52801,52802,52803,52804,52805,52806,52807,52808,52809,52810,52811,52812,52813,52814,52815,52816,52817,52818,52819,52820,52821,52822,52823,52824,52825,52826,52827,52828,52829,52830,52831,52832,52833,52834,52835,52836,52837,52838,52839,52840,52841,52842,52843,52844,52845,52846,52847,52848,52849,52850,52851,52852,52853,52854,52855,52856,52857,52858,52859,52860,52861,52862,52863,52864,52865,52866,52867,52868,52869,52870,52871,52872,52873,52874,52875,52876,52877,52878,52879,52880,52881,52882,52883,52884,52885,52886,52887,52888,52889,52890,52891,52892,52893,52894,52895,52896,52897,52898,52899,52900,52901,52902,52903,52904,52905,52906,52907,52908,52909,52910,52911,52912,52913,52914,52915,52916,52917,52918,52919,52920,52921,52922,52923,52924,52925,52926,52927,52928,52929,52930,52931,52932,52933,52934,52935,52936,52937,52938,52939,52940,52941,52942,52943,52944,52945,52946,52947,52948,52949,52950,52951,52952,52953,52954,52955,52956,52957,52958,52959,52960,52961,52962,52963,52964,52965,52966,52967,52968,52969,52970,52971,52972,52973,52974,52975,52976,52977,52978,52979,52980,52981,52982,52983,52984,52985,52986,52987,52988,52989,52990,52991,52992,52993,52994,52995,52996,52997,52998,52999,53000,53001,53002,53003,53004,53005,53006,53007,53008,53009,53010,53011,53012,53013,53014,53015,53016,53017,53018,53019,53020,53021,53022,53023,53024,53025,53026,53027,53028,53029,53030,53031,53032,53033,53034,53035,53036,53037,53038,53039,53040,53041,53042,53043,53044,53045,53046,53047,53048,53049,53050,53051,53052,53053,53054,53055,53056,53057,53058,53059,53060,53061,53062,53063,53064,53065,53066,53067,53068,53069,53070,53071,53072,53073,53074,53075,53076,53077,53078,53079,53080,53081,53082,53083,53084,53085,53086,53087,53088,53089,53090,53091,53092,53093,53094,53095,53096,53097,53098,53099,53100,53101,53102,53103,53104,53105,53106,53107,53108,53109,53110,53111,53112,53113,53114,53115,53116,53117,53118,53119,53120,53121,53122,53123,53124,53125,53126,53127,53128,53129,53130,53131,53132,53133,53134,53135,53136,53137,53138,53139,53140,53141,53142,53143,53144,53145,53146,53147,53148,53149,53150,53151,53152,53153,53154,53155,53156,53157,53158,53159,53160,53161,53162,53163,53164,53165,53166,53167,53168,53169,53170,53171,53172,53173,53174,53175,53176,53177,53178,53179,53180,53181,53182,53183,53184,53185,53186,53187,53188,53189,53190,53191,53192,53193,53194,53195,53196,53197,53198,53199,53200,53201,53202,53203,53204,53205,53206,53207,53208,53209,53210,53211,53212,53213,53214,53215,53216,53217,53218,53219,53220,53221,53222,53223,53224,53225,53226,53227,53228,53229,53230,53231,53232,53233,53234,53235,53236,53237,53238,53239,53240,53241,53242,53243,53244,53245,53246,53247,53248,53249,53250,53251,53252,53253,53254,53255,53256,53257,53258,53259,53260,53261,53262,53263,53264,53265,53266,53267,53268,53269,53270,53271,53272,53273,53274,53275,53276,53277,53278,53279,53280,53281,53282,53283,53284,53285,53286,53287,53288,53289,53290,53291,53292,53293,53294,53295,53296,53297,53298,53299,53300,53301,53302,53303,53304,53305,53306,53307,53308,53309,53310,53311,53312,53313,53314,53315,53316,53317,53318,53319,53320,53321,53322,53323,53324,53325,53326,53327,53328,53329,53330,53331,53332,53333,53334,53335,53336,53337,53338,53339,53340,53341,53342,53343,53344,53345,53346,53347,53348,53349,53350,53351,53352,53353,53354,53355,53356,53357,53358,53359,53360,53361,53362,53363,53364,53365,53366,53367,53368,53369,53370,53371,53372,53373,53374,53375,53376,53377,53378,53379,53380,53381,53382,53383,53384,53385,53386,53387,53388,53389,53390,53391,53392,53393,53394,53395,53396,53397,53398,53399,53400,53401,53402,53403,53404,53405,53406,53407,53408,53409,53410,53411,53412,53413,53414,53415,53416,53417,53418,53419,53420,53421,53422,53423,53424,53425,53426,53427,53428,53429,53430,53431,53432,53433,53434,53435,53436,53437,53438,53439,53440,53441,53442,53443,53444,53445,53446,53447,53448,53449,53450,53451,53452,53453,53454,53455,53456,53457,53458,53459,53460,53461,53462,53463,53464,53465,53466,53467,53468,53469,53470,53471,53472,53473,53474,53475,53476,53477,53478,53479,53480,53481,53482,53483,53484,53485,53486,53487,53488,53489,53490,53491,53492,53493,53494,53495,53496,53497,53498,53499,53500,53501,53502,53503,53504,53505,53506,53507,53508,53509,53510,53511,53512,53513,53514,53515,53516,53517,53518,53519,53520,53521,53522,53523,53524,53525,53526,53527,53528,53529,53530,53531,53532,53533,53534,53535,53536,53537,53538,53539,53540,53541,53542,53543,53544,53545,53546,53547,53548,53549,53550,53551,53552,53553,53554,53555,53556,53557,53558,53559,53560,53561,53562,53563,53564,53565,53566,53567,53568,53569,53570,53571,53572,53573,53574,53575,53576,53577,53578,53579,53580,53581,53582,53583,53584,53585,53586,53587,53588,53589,53590,53591,53592,53593,53594,53595,53596,53597,53598,53599,53600,53601,53602,53603,53604,53605,53606,53607,53608,53609,53610,53611,53612,53613,53614,53615,53616,53617,53618,53619,53620,53621,53622,53623,53624,53625,53626,53627,53628,53629,53630,53631,53632,53633,53634,53635,53636,53637,53638,53639,53640,53641,53642,53643,53644,53645,53646,53647,53648,53649,53650,53651,53652,53653,53654,53655,53656,53657,53658,53659,53660,53661,53662,53663,53664,53665,53666,53667,53668,53669,53670,53671,53672,53673,53674,53675,53676,53677,53678,53679,53680,53681,53682,53683,53684,53685,53686,53687,53688,53689,53690,53691,53692,53693,53694,53695,53696,53697,53698,53699,53700,53701,53702,53703,53704,53705,53706,53707,53708,53709,53710,53711,53712,53713,53714,53715,53716,53717,53718,53719,53720,53721,53722,53723,53724,53725,53726,53727,53728,53729,53730,53731,53732,53733,53734,53735,53736,53737,53738,53739,53740,53741,53742,53743,53744,53745,53746,53747,53748,53749,53750,53751,53752,53753,53754,53755,53756,53757,53758,53759,53760,53761,53762,53763,53764,53765,53766,53767,53768,53769,53770,53771,53772,53773,53774,53775,53776,53777,53778,53779,53780,53781,53782,53783,53784,53785,53786,53787,53788,53789,53790,53791,53792,53793,53794,53795,53796,53797,53798,53799,53800,53801,53802,53803,53804,53805,53806,53807,53808,53809,53810,53811,53812,53813,53814,53815,53816,53817,53818,53819,53820,53821,53822,53823,53824,53825,53826,53827,53828,53829,53830,53831,53832,53833,53834,53835,53836,53837,53838,53839,53840,53841,53842,53843,53844,53845,53846,53847,53848,53849,53850,53851,53852,53853,53854,53855,53856,53857,53858,53859,53860,53861,53862,53863,53864,53865,53866,53867,53868,53869,53870,53871,53872,53873,53874,53875,53876,53877,53878,53879,53880,53881,53882,53883,53884,53885,53886,53887,53888,53889,53890,53891,53892,53893,53894,53895,53896,53897,53898,53899,53900,53901,53902,53903,53904,53905,53906,53907,53908,53909,53910,53911,53912,53913,53914,53915,53916,53917,53918,53919,53920,53921,53922,53923,53924,53925,53926,53927,53928,53929,53930,53931,53932,53933,53934,53935,53936,53937,53938,53939,53940,53941,53942,53943,53944,53945,53946,53947,53948,53949,53950,53951,53952,53953,53954,53955,53956,53957,53958,53959,53960,53961,53962,53963,53964,53965,53966,53967,53968,53969,53970,53971,53972,53973,53974,53975,53976,53977,53978,53979,53980,53981,53982,53983,53984,53985,53986,53987,53988,53989,53990,53991,53992,53993,53994,53995,53996,53997,53998,53999,54000,54001,54002,54003,54004,54005,54006,54007,54008,54009,54010,54011,54012,54013,54014,54015,54016,54017,54018,54019,54020,54021,54022,54023,54024,54025,54026,54027,54028,54029,54030,54031,54032,54033,54034,54035,54036,54037,54038,54039,54040,54041,54042,54043,54044,54045,54046,54047,54048,54049,54050,54051,54052,54053,54054,54055,54056,54057,54058,54059,54060,54061,54062,54063,54064,54065,54066,54067,54068,54069,54070,54071,54072,54073,54074,54075,54076,54077,54078,54079,54080,54081,54082,54083,54084,54085,54086,54087,54088,54089,54090,54091,54092,54093,54094,54095,54096,54097,54098,54099,54100,54101,54102,54103,54104,54105,54106,54107,54108,54109,54110,54111,54112,54113,54114,54115,54116,54117,54118,54119,54120,54121,54122,54123,54124,54125,54126,54127,54128,54129,54130,54131,54132,54133,54134,54135,54136,54137,54138,54139,54140,54141,54142,54143,54144,54145,54146,54147,54148,54149,54150,54151,54152,54153,54154,54155,54156,54157,54158,54159,54160,54161,54162,54163,54164,54165,54166,54167,54168,54169,54170,54171,54172,54173,54174,54175,54176,54177,54178,54179,54180,54181,54182,54183,54184,54185,54186,54187,54188,54189,54190,54191,54192,54193,54194,54195,54196,54197,54198,54199,54200,54201,54202,54203,54204,54205,54206,54207,54208,54209,54210,54211,54212,54213,54214,54215,54216,54217,54218,54219,54220,54221,54222,54223,54224,54225,54226,54227,54228,54229,54230,54231,54232,54233,54234,54235,54236,54237,54238,54239,54240,54241,54242,54243,54244,54245,54246,54247,54248,54249,54250,54251,54252,54253,54254,54255,54256,54257,54258,54259,54260,54261,54262,54263,54264,54265,54266,54267,54268,54269,54270,54271,54272,54273,54274,54275,54276,54277,54278,54279,54280,54281,54282,54283,54284,54285,54286,54287,54288,54289,54290,54291,54292,54293,54294,54295,54296,54297,54298,54299,54300,54301,54302,54303,54304,54305,54306,54307,54308,54309,54310,54311,54312,54313,54314,54315,54316,54317,54318,54319,54320,54321,54322,54323,54324,54325,54326,54327,54328,54329,54330,54331,54332,54333,54334,54335,54336,54337,54338,54339,54340,54341,54342,54343,54344,54345,54346,54347,54348,54349,54350,54351,54352,54353,54354,54355,54356,54357,54358,54359,54360,54361,54362,54363,54364,54365,54366,54367,54368,54369,54370,54371,54372,54373,54374,54375,54376,54377,54378,54379,54380,54381,54382,54383,54384,54385,54386,54387,54388,54389,54390,54391,54392,54393,54394,54395,54396,54397,54398,54399,54400,54401,54402,54403,54404,54405,54406,54407,54408,54409,54410,54411,54412,54413,54414,54415,54416,54417,54418,54419,54420,54421,54422,54423,54424,54425,54426,54427,54428,54429,54430,54431,54432,54433,54434,54435,54436,54437,54438,54439,54440,54441,54442,54443,54444,54445,54446,54447,54448,54449,54450,54451,54452,54453,54454,54455,54456,54457,54458,54459,54460,54461,54462,54463,54464,54465,54466,54467,54468,54469,54470,54471,54472,54473,54474,54475,54476,54477,54478,54479,54480,54481,54482,54483,54484,54485,54486,54487,54488,54489,54490,54491,54492,54493,54494,54495,54496,54497,54498,54499,54500,54501,54502,54503,54504,54505,54506,54507,54508,54509,54510,54511,54512,54513,54514,54515,54516,54517,54518,54519,54520,54521,54522,54523,54524,54525,54526,54527,54528,54529,54530,54531,54532,54533,54534,54535,54536,54537,54538,54539,54540,54541,54542,54543,54544,54545,54546,54547,54548,54549,54550,54551,54552,54553,54554,54555,54556,54557,54558,54559,54560,54561,54562,54563,54564,54565,54566,54567,54568,54569,54570,54571,54572,54573,54574,54575,54576,54577,54578,54579,54580,54581,54582,54583,54584,54585,54586,54587,54588,54589,54590,54591,54592,54593,54594,54595,54596,54597,54598,54599,54600,54601,54602,54603,54604,54605,54606,54607,54608,54609,54610,54611,54612,54613,54614,54615,54616,54617,54618,54619,54620,54621,54622,54623,54624,54625,54626,54627,54628,54629,54630,54631,54632,54633,54634,54635,54636,54637,54638,54639,54640,54641,54642,54643,54644,54645,54646,54647,54648,54649,54650,54651,54652,54653,54654,54655,54656,54657,54658,54659,54660,54661,54662,54663,54664,54665,54666,54667,54668,54669,54670,54671,54672,54673,54674,54675,54676,54677,54678,54679,54680,54681,54682,54683,54684,54685,54686,54687,54688,54689,54690,54691,54692,54693,54694,54695,54696,54697,54698,54699,54700,54701,54702,54703,54704,54705,54706,54707,54708,54709,54710,54711,54712,54713,54714,54715,54716,54717,54718,54719,54720,54721,54722,54723,54724,54725,54726,54727,54728,54729,54730,54731,54732,54733,54734,54735,54736,54737,54738,54739,54740,54741,54742,54743,54744,54745,54746,54747,54748,54749,54750,54751,54752,54753,54754,54755,54756,54757,54758,54759,54760,54761,54762,54763,54764,54765,54766,54767,54768,54769,54770,54771,54772,54773,54774,54775,54776,54777,54778,54779,54780,54781,54782,54783,54784,54785,54786,54787,54788,54789,54790,54791,54792,54793,54794,54795,54796,54797,54798,54799,54800,54801,54802,54803,54804,54805,54806,54807,54808,54809,54810,54811,54812,54813,54814,54815,54816,54817,54818,54819,54820,54821,54822,54823,54824,54825,54826,54827,54828,54829,54830,54831,54832,54833,54834,54835,54836,54837,54838,54839,54840,54841,54842,54843,54844,54845,54846,54847,54848,54849,54850,54851,54852,54853,54854,54855,54856,54857,54858,54859,54860,54861,54862,54863,54864,54865,54866,54867,54868,54869,54870,54871,54872,54873,54874,54875,54876,54877,54878,54879,54880,54881,54882,54883,54884,54885,54886,54887,54888,54889,54890,54891,54892,54893,54894,54895,54896,54897,54898,54899,54900,54901,54902,54903,54904,54905,54906,54907,54908,54909,54910,54911,54912,54913,54914,54915,54916,54917,54918,54919,54920,54921,54922,54923,54924,54925,54926,54927,54928,54929,54930,54931,54932,54933,54934,54935,54936,54937,54938,54939,54940,54941,54942,54943,54944,54945,54946,54947,54948,54949,54950,54951,54952,54953,54954,54955,54956,54957,54958,54959,54960,54961,54962,54963,54964,54965,54966,54967,54968,54969,54970,54971,54972,54973,54974,54975,54976,54977,54978,54979,54980,54981,54982,54983,54984,54985,54986,54987,54988,54989,54990,54991,54992,54993,54994,54995,54996,54997,54998,54999,55000,55001,55002,55003,55004,55005,55006,55007,55008,55009,55010,55011,55012,55013,55014,55015,55016,55017,55018,55019,55020,55021,55022,55023,55024,55025,55026,55027,55028,55029,55030,55031,55032,55033,55034,55035,55036,55037,55038,55039,55040,55041,55042,55043,55044,55045,55046,55047,55048,55049,55050,55051,55052,55053,55054,55055,55056,55057,55058,55059,55060,55061,55062,55063,55064,55065,55066,55067,55068,55069,55070,55071,55072,55073,55074,55075,55076,55077,55078,55079,55080,55081,55082,55083,55084,55085,55086,55087,55088,55089,55090,55091,55092,55093,55094,55095,55096,55097,55098,55099,55100,55101,55102,55103,55104,55105,55106,55107,55108,55109,55110,55111,55112,55113,55114,55115,55116,55117,55118,55119,55120,55121,55122,55123,55124,55125,55126,55127,55128,55129,55130,55131,55132,55133,55134,55135,55136,55137,55138,55139,55140,55141,55142,55143,55144,55145,55146,55147,55148,55149,55150,55151,55152,55153,55154,55155,55156,55157,55158,55159,55160,55161,55162,55163,55164,55165,55166,55167,55168,55169,55170,55171,55172,55173,55174,55175,55176,55177,55178,55179,55180,55181,55182,55183,55184,55185,55186,55187,55188,55189,55190,55191,55192,55193,55194,55195,55196,55197,55198,55199,55200,55201,55202,55203,55216,55217,55218,55219,55220,55221,55222,55223,55224,55225,55226,55227,55228,55229,55230,55231,55232,55233,55234,55235,55236,55237,55238,55243,55244,55245,55246,55247,55248,55249,55250,55251,55252,55253,55254,55255,55256,55257,55258,55259,55260,55261,55262,55263,55264,55265,55266,55267,55268,55269,55270,55271,55272,55273,55274,55275,55276,55277,55278,55279,55280,55281,55282,55283,55284,55285,55286,55287,55288,55289,55290,55291,63744,63745,63746,63747,63748,63749,63750,63751,63752,63753,63754,63755,63756,63757,63758,63759,63760,63761,63762,63763,63764,63765,63766,63767,63768,63769,63770,63771,63772,63773,63774,63775,63776,63777,63778,63779,63780,63781,63782,63783,63784,63785,63786,63787,63788,63789,63790,63791,63792,63793,63794,63795,63796,63797,63798,63799,63800,63801,63802,63803,63804,63805,63806,63807,63808,63809,63810,63811,63812,63813,63814,63815,63816,63817,63818,63819,63820,63821,63822,63823,63824,63825,63826,63827,63828,63829,63830,63831,63832,63833,63834,63835,63836,63837,63838,63839,63840,63841,63842,63843,63844,63845,63846,63847,63848,63849,63850,63851,63852,63853,63854,63855,63856,63857,63858,63859,63860,63861,63862,63863,63864,63865,63866,63867,63868,63869,63870,63871,63872,63873,63874,63875,63876,63877,63878,63879,63880,63881,63882,63883,63884,63885,63886,63887,63888,63889,63890,63891,63892,63893,63894,63895,63896,63897,63898,63899,63900,63901,63902,63903,63904,63905,63906,63907,63908,63909,63910,63911,63912,63913,63914,63915,63916,63917,63918,63919,63920,63921,63922,63923,63924,63925,63926,63927,63928,63929,63930,63931,63932,63933,63934,63935,63936,63937,63938,63939,63940,63941,63942,63943,63944,63945,63946,63947,63948,63949,63950,63951,63952,63953,63954,63955,63956,63957,63958,63959,63960,63961,63962,63963,63964,63965,63966,63967,63968,63969,63970,63971,63972,63973,63974,63975,63976,63977,63978,63979,63980,63981,63982,63983,63984,63985,63986,63987,63988,63989,63990,63991,63992,63993,63994,63995,63996,63997,63998,63999,64000,64001,64002,64003,64004,64005,64006,64007,64008,64009,64010,64011,64012,64013,64014,64015,64016,64017,64018,64019,64020,64021,64022,64023,64024,64025,64026,64027,64028,64029,64030,64031,64032,64033,64034,64035,64036,64037,64038,64039,64040,64041,64042,64043,64044,64045,64046,64047,64048,64049,64050,64051,64052,64053,64054,64055,64056,64057,64058,64059,64060,64061,64062,64063,64064,64065,64066,64067,64068,64069,64070,64071,64072,64073,64074,64075,64076,64077,64078,64079,64080,64081,64082,64083,64084,64085,64086,64087,64088,64089,64090,64091,64092,64093,64094,64095,64096,64097,64098,64099,64100,64101,64102,64103,64104,64105,64106,64107,64108,64109,64112,64113,64114,64115,64116,64117,64118,64119,64120,64121,64122,64123,64124,64125,64126,64127,64128,64129,64130,64131,64132,64133,64134,64135,64136,64137,64138,64139,64140,64141,64142,64143,64144,64145,64146,64147,64148,64149,64150,64151,64152,64153,64154,64155,64156,64157,64158,64159,64160,64161,64162,64163,64164,64165,64166,64167,64168,64169,64170,64171,64172,64173,64174,64175,64176,64177,64178,64179,64180,64181,64182,64183,64184,64185,64186,64187,64188,64189,64190,64191,64192,64193,64194,64195,64196,64197,64198,64199,64200,64201,64202,64203,64204,64205,64206,64207,64208,64209,64210,64211,64212,64213,64214,64215,64216,64217,64285,64287,64288,64289,64290,64291,64292,64293,64294,64295,64296,64298,64299,64300,64301,64302,64303,64304,64305,64306,64307,64308,64309,64310,64312,64313,64314,64315,64316,64318,64320,64321,64323,64324,64326,64327,64328,64329,64330,64331,64332,64333,64334,64335,64336,64337,64338,64339,64340,64341,64342,64343,64344,64345,64346,64347,64348,64349,64350,64351,64352,64353,64354,64355,64356,64357,64358,64359,64360,64361,64362,64363,64364,64365,64366,64367,64368,64369,64370,64371,64372,64373,64374,64375,64376,64377,64378,64379,64380,64381,64382,64383,64384,64385,64386,64387,64388,64389,64390,64391,64392,64393,64394,64395,64396,64397,64398,64399,64400,64401,64402,64403,64404,64405,64406,64407,64408,64409,64410,64411,64412,64413,64414,64415,64416,64417,64418,64419,64420,64421,64422,64423,64424,64425,64426,64427,64428,64429,64430,64431,64432,64433,64467,64468,64469,64470,64471,64472,64473,64474,64475,64476,64477,64478,64479,64480,64481,64482,64483,64484,64485,64486,64487,64488,64489,64490,64491,64492,64493,64494,64495,64496,64497,64498,64499,64500,64501,64502,64503,64504,64505,64506,64507,64508,64509,64510,64511,64512,64513,64514,64515,64516,64517,64518,64519,64520,64521,64522,64523,64524,64525,64526,64527,64528,64529,64530,64531,64532,64533,64534,64535,64536,64537,64538,64539,64540,64541,64542,64543,64544,64545,64546,64547,64548,64549,64550,64551,64552,64553,64554,64555,64556,64557,64558,64559,64560,64561,64562,64563,64564,64565,64566,64567,64568,64569,64570,64571,64572,64573,64574,64575,64576,64577,64578,64579,64580,64581,64582,64583,64584,64585,64586,64587,64588,64589,64590,64591,64592,64593,64594,64595,64596,64597,64598,64599,64600,64601,64602,64603,64604,64605,64606,64607,64608,64609,64610,64611,64612,64613,64614,64615,64616,64617,64618,64619,64620,64621,64622,64623,64624,64625,64626,64627,64628,64629,64630,64631,64632,64633,64634,64635,64636,64637,64638,64639,64640,64641,64642,64643,64644,64645,64646,64647,64648,64649,64650,64651,64652,64653,64654,64655,64656,64657,64658,64659,64660,64661,64662,64663,64664,64665,64666,64667,64668,64669,64670,64671,64672,64673,64674,64675,64676,64677,64678,64679,64680,64681,64682,64683,64684,64685,64686,64687,64688,64689,64690,64691,64692,64693,64694,64695,64696,64697,64698,64699,64700,64701,64702,64703,64704,64705,64706,64707,64708,64709,64710,64711,64712,64713,64714,64715,64716,64717,64718,64719,64720,64721,64722,64723,64724,64725,64726,64727,64728,64729,64730,64731,64732,64733,64734,64735,64736,64737,64738,64739,64740,64741,64742,64743,64744,64745,64746,64747,64748,64749,64750,64751,64752,64753,64754,64755,64756,64757,64758,64759,64760,64761,64762,64763,64764,64765,64766,64767,64768,64769,64770,64771,64772,64773,64774,64775,64776,64777,64778,64779,64780,64781,64782,64783,64784,64785,64786,64787,64788,64789,64790,64791,64792,64793,64794,64795,64796,64797,64798,64799,64800,64801,64802,64803,64804,64805,64806,64807,64808,64809,64810,64811,64812,64813,64814,64815,64816,64817,64818,64819,64820,64821,64822,64823,64824,64825,64826,64827,64828,64829,64848,64849,64850,64851,64852,64853,64854,64855,64856,64857,64858,64859,64860,64861,64862,64863,64864,64865,64866,64867,64868,64869,64870,64871,64872,64873,64874,64875,64876,64877,64878,64879,64880,64881,64882,64883,64884,64885,64886,64887,64888,64889,64890,64891,64892,64893,64894,64895,64896,64897,64898,64899,64900,64901,64902,64903,64904,64905,64906,64907,64908,64909,64910,64911,64914,64915,64916,64917,64918,64919,64920,64921,64922,64923,64924,64925,64926,64927,64928,64929,64930,64931,64932,64933,64934,64935,64936,64937,64938,64939,64940,64941,64942,64943,64944,64945,64946,64947,64948,64949,64950,64951,64952,64953,64954,64955,64956,64957,64958,64959,64960,64961,64962,64963,64964,64965,64966,64967,65008,65009,65010,65011,65012,65013,65014,65015,65016,65017,65018,65019,65136,65137,65138,65139,65140,65142,65143,65144,65145,65146,65147,65148,65149,65150,65151,65152,65153,65154,65155,65156,65157,65158,65159,65160,65161,65162,65163,65164,65165,65166,65167,65168,65169,65170,65171,65172,65173,65174,65175,65176,65177,65178,65179,65180,65181,65182,65183,65184,65185,65186,65187,65188,65189,65190,65191,65192,65193,65194,65195,65196,65197,65198,65199,65200,65201,65202,65203,65204,65205,65206,65207,65208,65209,65210,65211,65212,65213,65214,65215,65216,65217,65218,65219,65220,65221,65222,65223,65224,65225,65226,65227,65228,65229,65230,65231,65232,65233,65234,65235,65236,65237,65238,65239,65240,65241,65242,65243,65244,65245,65246,65247,65248,65249,65250,65251,65252,65253,65254,65255,65256,65257,65258,65259,65260,65261,65262,65263,65264,65265,65266,65267,65268,65269,65270,65271,65272,65273,65274,65275,65276,65382,65383,65384,65385,65386,65387,65388,65389,65390,65391,65393,65394,65395,65396,65397,65398,65399,65400,65401,65402,65403,65404,65405,65406,65407,65408,65409,65410,65411,65412,65413,65414,65415,65416,65417,65418,65419,65420,65421,65422,65423,65424,65425,65426,65427,65428,65429,65430,65431,65432,65433,65434,65435,65436,65437,65440,65441,65442,65443,65444,65445,65446,65447,65448,65449,65450,65451,65452,65453,65454,65455,65456,65457,65458,65459,65460,65461,65462,65463,65464,65465,65466,65467,65468,65469,65470,65474,65475,65476,65477,65478,65479,65482,65483,65484,65485,65486,65487,65490,65491,65492,65493,65494,65495,65498,65499,65500,65536,65537,65538,65539,65540,65541,65542,65543,65544,65545,65546,65547,65549,65550,65551,65552,65553,65554,65555,65556,65557,65558,65559,65560,65561,65562,65563,65564,65565,65566,65567,65568,65569,65570,65571,65572,65573,65574,65576,65577,65578,65579,65580,65581,65582,65583,65584,65585,65586,65587,65588,65589,65590,65591,65592,65593,65594,65596,65597,65599,65600,65601,65602,65603,65604,65605,65606,65607,65608,65609,65610,65611,65612,65613,65616,65617,65618,65619,65620,65621,65622,65623,65624,65625,65626,65627,65628,65629,65664,65665,65666,65667,65668,65669,65670,65671,65672,65673,65674,65675,65676,65677,65678,65679,65680,65681,65682,65683,65684,65685,65686,65687,65688,65689,65690,65691,65692,65693,65694,65695,65696,65697,65698,65699,65700,65701,65702,65703,65704,65705,65706,65707,65708,65709,65710,65711,65712,65713,65714,65715,65716,65717,65718,65719,65720,65721,65722,65723,65724,65725,65726,65727,65728,65729,65730,65731,65732,65733,65734,65735,65736,65737,65738,65739,65740,65741,65742,65743,65744,65745,65746,65747,65748,65749,65750,65751,65752,65753,65754,65755,65756,65757,65758,65759,65760,65761,65762,65763,65764,65765,65766,65767,65768,65769,65770,65771,65772,65773,65774,65775,65776,65777,65778,65779,65780,65781,65782,65783,65784,65785,65786,66176,66177,66178,66179,66180,66181,66182,66183,66184,66185,66186,66187,66188,66189,66190,66191,66192,66193,66194,66195,66196,66197,66198,66199,66200,66201,66202,66203,66204,66208,66209,66210,66211,66212,66213,66214,66215,66216,66217,66218,66219,66220,66221,66222,66223,66224,66225,66226,66227,66228,66229,66230,66231,66232,66233,66234,66235,66236,66237,66238,66239,66240,66241,66242,66243,66244,66245,66246,66247,66248,66249,66250,66251,66252,66253,66254,66255,66256,66304,66305,66306,66307,66308,66309,66310,66311,66312,66313,66314,66315,66316,66317,66318,66319,66320,66321,66322,66323,66324,66325,66326,66327,66328,66329,66330,66331,66332,66333,66334,66352,66353,66354,66355,66356,66357,66358,66359,66360,66361,66362,66363,66364,66365,66366,66367,66368,66370,66371,66372,66373,66374,66375,66376,66377,66432,66433,66434,66435,66436,66437,66438,66439,66440,66441,66442,66443,66444,66445,66446,66447,66448,66449,66450,66451,66452,66453,66454,66455,66456,66457,66458,66459,66460,66461,66464,66465,66466,66467,66468,66469,66470,66471,66472,66473,66474,66475,66476,66477,66478,66479,66480,66481,66482,66483,66484,66485,66486,66487,66488,66489,66490,66491,66492,66493,66494,66495,66496,66497,66498,66499,66504,66505,66506,66507,66508,66509,66510,66511,66640,66641,66642,66643,66644,66645,66646,66647,66648,66649,66650,66651,66652,66653,66654,66655,66656,66657,66658,66659,66660,66661,66662,66663,66664,66665,66666,66667,66668,66669,66670,66671,66672,66673,66674,66675,66676,66677,66678,66679,66680,66681,66682,66683,66684,66685,66686,66687,66688,66689,66690,66691,66692,66693,66694,66695,66696,66697,66698,66699,66700,66701,66702,66703,66704,66705,66706,66707,66708,66709,66710,66711,66712,66713,66714,66715,66716,66717,67584,67585,67586,67587,67588,67589,67592,67594,67595,67596,67597,67598,67599,67600,67601,67602,67603,67604,67605,67606,67607,67608,67609,67610,67611,67612,67613,67614,67615,67616,67617,67618,67619,67620,67621,67622,67623,67624,67625,67626,67627,67628,67629,67630,67631,67632,67633,67634,67635,67636,67637,67639,67640,67644,67647,67648,67649,67650,67651,67652,67653,67654,67655,67656,67657,67658,67659,67660,67661,67662,67663,67664,67665,67666,67667,67668,67669,67840,67841,67842,67843,67844,67845,67846,67847,67848,67849,67850,67851,67852,67853,67854,67855,67856,67857,67858,67859,67860,67861,67872,67873,67874,67875,67876,67877,67878,67879,67880,67881,67882,67883,67884,67885,67886,67887,67888,67889,67890,67891,67892,67893,67894,67895,67896,67897,67968,67969,67970,67971,67972,67973,67974,67975,67976,67977,67978,67979,67980,67981,67982,67983,67984,67985,67986,67987,67988,67989,67990,67991,67992,67993,67994,67995,67996,67997,67998,67999,68000,68001,68002,68003,68004,68005,68006,68007,68008,68009,68010,68011,68012,68013,68014,68015,68016,68017,68018,68019,68020,68021,68022,68023,68030,68031,68096,68112,68113,68114,68115,68117,68118,68119,68121,68122,68123,68124,68125,68126,68127,68128,68129,68130,68131,68132,68133,68134,68135,68136,68137,68138,68139,68140,68141,68142,68143,68144,68145,68146,68147,68192,68193,68194,68195,68196,68197,68198,68199,68200,68201,68202,68203,68204,68205,68206,68207,68208,68209,68210,68211,68212,68213,68214,68215,68216,68217,68218,68219,68220,68352,68353,68354,68355,68356,68357,68358,68359,68360,68361,68362,68363,68364,68365,68366,68367,68368,68369,68370,68371,68372,68373,68374,68375,68376,68377,68378,68379,68380,68381,68382,68383,68384,68385,68386,68387,68388,68389,68390,68391,68392,68393,68394,68395,68396,68397,68398,68399,68400,68401,68402,68403,68404,68405,68416,68417,68418,68419,68420,68421,68422,68423,68424,68425,68426,68427,68428,68429,68430,68431,68432,68433,68434,68435,68436,68437,68448,68449,68450,68451,68452,68453,68454,68455,68456,68457,68458,68459,68460,68461,68462,68463,68464,68465,68466,68608,68609,68610,68611,68612,68613,68614,68615,68616,68617,68618,68619,68620,68621,68622,68623,68624,68625,68626,68627,68628,68629,68630,68631,68632,68633,68634,68635,68636,68637,68638,68639,68640,68641,68642,68643,68644,68645,68646,68647,68648,68649,68650,68651,68652,68653,68654,68655,68656,68657,68658,68659,68660,68661,68662,68663,68664,68665,68666,68667,68668,68669,68670,68671,68672,68673,68674,68675,68676,68677,68678,68679,68680,69635,69636,69637,69638,69639,69640,69641,69642,69643,69644,69645,69646,69647,69648,69649,69650,69651,69652,69653,69654,69655,69656,69657,69658,69659,69660,69661,69662,69663,69664,69665,69666,69667,69668,69669,69670,69671,69672,69673,69674,69675,69676,69677,69678,69679,69680,69681,69682,69683,69684,69685,69686,69687,69763,69764,69765,69766,69767,69768,69769,69770,69771,69772,69773,69774,69775,69776,69777,69778,69779,69780,69781,69782,69783,69784,69785,69786,69787,69788,69789,69790,69791,69792,69793,69794,69795,69796,69797,69798,69799,69800,69801,69802,69803,69804,69805,69806,69807,69840,69841,69842,69843,69844,69845,69846,69847,69848,69849,69850,69851,69852,69853,69854,69855,69856,69857,69858,69859,69860,69861,69862,69863,69864,69891,69892,69893,69894,69895,69896,69897,69898,69899,69900,69901,69902,69903,69904,69905,69906,69907,69908,69909,69910,69911,69912,69913,69914,69915,69916,69917,69918,69919,69920,69921,69922,69923,69924,69925,69926,70019,70020,70021,70022,70023,70024,70025,70026,70027,70028,70029,70030,70031,70032,70033,70034,70035,70036,70037,70038,70039,70040,70041,70042,70043,70044,70045,70046,70047,70048,70049,70050,70051,70052,70053,70054,70055,70056,70057,70058,70059,70060,70061,70062,70063,70064,70065,70066,70081,70082,70083,70084,71296,71297,71298,71299,71300,71301,71302,71303,71304,71305,71306,71307,71308,71309,71310,71311,71312,71313,71314,71315,71316,71317,71318,71319,71320,71321,71322,71323,71324,71325,71326,71327,71328,71329,71330,71331,71332,71333,71334,71335,71336,71337,71338,73728,73729,73730,73731,73732,73733,73734,73735,73736,73737,73738,73739,73740,73741,73742,73743,73744,73745,73746,73747,73748,73749,73750,73751,73752,73753,73754,73755,73756,73757,73758,73759,73760,73761,73762,73763,73764,73765,73766,73767,73768,73769,73770,73771,73772,73773,73774,73775,73776,73777,73778,73779,73780,73781,73782,73783,73784,73785,73786,73787,73788,73789,73790,73791,73792,73793,73794,73795,73796,73797,73798,73799,73800,73801,73802,73803,73804,73805,73806,73807,73808,73809,73810,73811,73812,73813,73814,73815,73816,73817,73818,73819,73820,73821,73822,73823,73824,73825,73826,73827,73828,73829,73830,73831,73832,73833,73834,73835,73836,73837,73838,73839,73840,73841,73842,73843,73844,73845,73846,73847,73848,73849,73850,73851,73852,73853,73854,73855,73856,73857,73858,73859,73860,73861,73862,73863,73864,73865,73866,73867,73868,73869,73870,73871,73872,73873,73874,73875,73876,73877,73878,73879,73880,73881,73882,73883,73884,73885,73886,73887,73888,73889,73890,73891,73892,73893,73894,73895,73896,73897,73898,73899,73900,73901,73902,73903,73904,73905,73906,73907,73908,73909,73910,73911,73912,73913,73914,73915,73916,73917,73918,73919,73920,73921,73922,73923,73924,73925,73926,73927,73928,73929,73930,73931,73932,73933,73934,73935,73936,73937,73938,73939,73940,73941,73942,73943,73944,73945,73946,73947,73948,73949,73950,73951,73952,73953,73954,73955,73956,73957,73958,73959,73960,73961,73962,73963,73964,73965,73966,73967,73968,73969,73970,73971,73972,73973,73974,73975,73976,73977,73978,73979,73980,73981,73982,73983,73984,73985,73986,73987,73988,73989,73990,73991,73992,73993,73994,73995,73996,73997,73998,73999,74000,74001,74002,74003,74004,74005,74006,74007,74008,74009,74010,74011,74012,74013,74014,74015,74016,74017,74018,74019,74020,74021,74022,74023,74024,74025,74026,74027,74028,74029,74030,74031,74032,74033,74034,74035,74036,74037,74038,74039,74040,74041,74042,74043,74044,74045,74046,74047,74048,74049,74050,74051,74052,74053,74054,74055,74056,74057,74058,74059,74060,74061,74062,74063,74064,74065,74066,74067,74068,74069,74070,74071,74072,74073,74074,74075,74076,74077,74078,74079,74080,74081,74082,74083,74084,74085,74086,74087,74088,74089,74090,74091,74092,74093,74094,74095,74096,74097,74098,74099,74100,74101,74102,74103,74104,74105,74106,74107,74108,74109,74110,74111,74112,74113,74114,74115,74116,74117,74118,74119,74120,74121,74122,74123,74124,74125,74126,74127,74128,74129,74130,74131,74132,74133,74134,74135,74136,74137,74138,74139,74140,74141,74142,74143,74144,74145,74146,74147,74148,74149,74150,74151,74152,74153,74154,74155,74156,74157,74158,74159,74160,74161,74162,74163,74164,74165,74166,74167,74168,74169,74170,74171,74172,74173,74174,74175,74176,74177,74178,74179,74180,74181,74182,74183,74184,74185,74186,74187,74188,74189,74190,74191,74192,74193,74194,74195,74196,74197,74198,74199,74200,74201,74202,74203,74204,74205,74206,74207,74208,74209,74210,74211,74212,74213,74214,74215,74216,74217,74218,74219,74220,74221,74222,74223,74224,74225,74226,74227,74228,74229,74230,74231,74232,74233,74234,74235,74236,74237,74238,74239,74240,74241,74242,74243,74244,74245,74246,74247,74248,74249,74250,74251,74252,74253,74254,74255,74256,74257,74258,74259,74260,74261,74262,74263,74264,74265,74266,74267,74268,74269,74270,74271,74272,74273,74274,74275,74276,74277,74278,74279,74280,74281,74282,74283,74284,74285,74286,74287,74288,74289,74290,74291,74292,74293,74294,74295,74296,74297,74298,74299,74300,74301,74302,74303,74304,74305,74306,74307,74308,74309,74310,74311,74312,74313,74314,74315,74316,74317,74318,74319,74320,74321,74322,74323,74324,74325,74326,74327,74328,74329,74330,74331,74332,74333,74334,74335,74336,74337,74338,74339,74340,74341,74342,74343,74344,74345,74346,74347,74348,74349,74350,74351,74352,74353,74354,74355,74356,74357,74358,74359,74360,74361,74362,74363,74364,74365,74366,74367,74368,74369,74370,74371,74372,74373,74374,74375,74376,74377,74378,74379,74380,74381,74382,74383,74384,74385,74386,74387,74388,74389,74390,74391,74392,74393,74394,74395,74396,74397,74398,74399,74400,74401,74402,74403,74404,74405,74406,74407,74408,74409,74410,74411,74412,74413,74414,74415,74416,74417,74418,74419,74420,74421,74422,74423,74424,74425,74426,74427,74428,74429,74430,74431,74432,74433,74434,74435,74436,74437,74438,74439,74440,74441,74442,74443,74444,74445,74446,74447,74448,74449,74450,74451,74452,74453,74454,74455,74456,74457,74458,74459,74460,74461,74462,74463,74464,74465,74466,74467,74468,74469,74470,74471,74472,74473,74474,74475,74476,74477,74478,74479,74480,74481,74482,74483,74484,74485,74486,74487,74488,74489,74490,74491,74492,74493,74494,74495,74496,74497,74498,74499,74500,74501,74502,74503,74504,74505,74506,74507,74508,74509,74510,74511,74512,74513,74514,74515,74516,74517,74518,74519,74520,74521,74522,74523,74524,74525,74526,74527,74528,74529,74530,74531,74532,74533,74534,74535,74536,74537,74538,74539,74540,74541,74542,74543,74544,74545,74546,74547,74548,74549,74550,74551,74552,74553,74554,74555,74556,74557,74558,74559,74560,74561,74562,74563,74564,74565,74566,74567,74568,74569,74570,74571,74572,74573,74574,74575,74576,74577,74578,74579,74580,74581,74582,74583,74584,74585,74586,74587,74588,74589,74590,74591,74592,74593,74594,74595,74596,74597,74598,74599,74600,74601,74602,74603,74604,74605,74606,77824,77825,77826,77827,77828,77829,77830,77831,77832,77833,77834,77835,77836,77837,77838,77839,77840,77841,77842,77843,77844,77845,77846,77847,77848,77849,77850,77851,77852,77853,77854,77855,77856,77857,77858,77859,77860,77861,77862,77863,77864,77865,77866,77867,77868,77869,77870,77871,77872,77873,77874,77875,77876,77877,77878,77879,77880,77881,77882,77883,77884,77885,77886,77887,77888,77889,77890,77891,77892,77893,77894,77895,77896,77897,77898,77899,77900,77901,77902,77903,77904,77905,77906,77907,77908,77909,77910,77911,77912,77913,77914,77915,77916,77917,77918,77919,77920,77921,77922,77923,77924,77925,77926,77927,77928,77929,77930,77931,77932,77933,77934,77935,77936,77937,77938,77939,77940,77941,77942,77943,77944,77945,77946,77947,77948,77949,77950,77951,77952,77953,77954,77955,77956,77957,77958,77959,77960,77961,77962,77963,77964,77965,77966,77967,77968,77969,77970,77971,77972,77973,77974,77975,77976,77977,77978,77979,77980,77981,77982,77983,77984,77985,77986,77987,77988,77989,77990,77991,77992,77993,77994,77995,77996,77997,77998,77999,78000,78001,78002,78003,78004,78005,78006,78007,78008,78009,78010,78011,78012,78013,78014,78015,78016,78017,78018,78019,78020,78021,78022,78023,78024,78025,78026,78027,78028,78029,78030,78031,78032,78033,78034,78035,78036,78037,78038,78039,78040,78041,78042,78043,78044,78045,78046,78047,78048,78049,78050,78051,78052,78053,78054,78055,78056,78057,78058,78059,78060,78061,78062,78063,78064,78065,78066,78067,78068,78069,78070,78071,78072,78073,78074,78075,78076,78077,78078,78079,78080,78081,78082,78083,78084,78085,78086,78087,78088,78089,78090,78091,78092,78093,78094,78095,78096,78097,78098,78099,78100,78101,78102,78103,78104,78105,78106,78107,78108,78109,78110,78111,78112,78113,78114,78115,78116,78117,78118,78119,78120,78121,78122,78123,78124,78125,78126,78127,78128,78129,78130,78131,78132,78133,78134,78135,78136,78137,78138,78139,78140,78141,78142,78143,78144,78145,78146,78147,78148,78149,78150,78151,78152,78153,78154,78155,78156,78157,78158,78159,78160,78161,78162,78163,78164,78165,78166,78167,78168,78169,78170,78171,78172,78173,78174,78175,78176,78177,78178,78179,78180,78181,78182,78183,78184,78185,78186,78187,78188,78189,78190,78191,78192,78193,78194,78195,78196,78197,78198,78199,78200,78201,78202,78203,78204,78205,78206,78207,78208,78209,78210,78211,78212,78213,78214,78215,78216,78217,78218,78219,78220,78221,78222,78223,78224,78225,78226,78227,78228,78229,78230,78231,78232,78233,78234,78235,78236,78237,78238,78239,78240,78241,78242,78243,78244,78245,78246,78247,78248,78249,78250,78251,78252,78253,78254,78255,78256,78257,78258,78259,78260,78261,78262,78263,78264,78265,78266,78267,78268,78269,78270,78271,78272,78273,78274,78275,78276,78277,78278,78279,78280,78281,78282,78283,78284,78285,78286,78287,78288,78289,78290,78291,78292,78293,78294,78295,78296,78297,78298,78299,78300,78301,78302,78303,78304,78305,78306,78307,78308,78309,78310,78311,78312,78313,78314,78315,78316,78317,78318,78319,78320,78321,78322,78323,78324,78325,78326,78327,78328,78329,78330,78331,78332,78333,78334,78335,78336,78337,78338,78339,78340,78341,78342,78343,78344,78345,78346,78347,78348,78349,78350,78351,78352,78353,78354,78355,78356,78357,78358,78359,78360,78361,78362,78363,78364,78365,78366,78367,78368,78369,78370,78371,78372,78373,78374,78375,78376,78377,78378,78379,78380,78381,78382,78383,78384,78385,78386,78387,78388,78389,78390,78391,78392,78393,78394,78395,78396,78397,78398,78399,78400,78401,78402,78403,78404,78405,78406,78407,78408,78409,78410,78411,78412,78413,78414,78415,78416,78417,78418,78419,78420,78421,78422,78423,78424,78425,78426,78427,78428,78429,78430,78431,78432,78433,78434,78435,78436,78437,78438,78439,78440,78441,78442,78443,78444,78445,78446,78447,78448,78449,78450,78451,78452,78453,78454,78455,78456,78457,78458,78459,78460,78461,78462,78463,78464,78465,78466,78467,78468,78469,78470,78471,78472,78473,78474,78475,78476,78477,78478,78479,78480,78481,78482,78483,78484,78485,78486,78487,78488,78489,78490,78491,78492,78493,78494,78495,78496,78497,78498,78499,78500,78501,78502,78503,78504,78505,78506,78507,78508,78509,78510,78511,78512,78513,78514,78515,78516,78517,78518,78519,78520,78521,78522,78523,78524,78525,78526,78527,78528,78529,78530,78531,78532,78533,78534,78535,78536,78537,78538,78539,78540,78541,78542,78543,78544,78545,78546,78547,78548,78549,78550,78551,78552,78553,78554,78555,78556,78557,78558,78559,78560,78561,78562,78563,78564,78565,78566,78567,78568,78569,78570,78571,78572,78573,78574,78575,78576,78577,78578,78579,78580,78581,78582,78583,78584,78585,78586,78587,78588,78589,78590,78591,78592,78593,78594,78595,78596,78597,78598,78599,78600,78601,78602,78603,78604,78605,78606,78607,78608,78609,78610,78611,78612,78613,78614,78615,78616,78617,78618,78619,78620,78621,78622,78623,78624,78625,78626,78627,78628,78629,78630,78631,78632,78633,78634,78635,78636,78637,78638,78639,78640,78641,78642,78643,78644,78645,78646,78647,78648,78649,78650,78651,78652,78653,78654,78655,78656,78657,78658,78659,78660,78661,78662,78663,78664,78665,78666,78667,78668,78669,78670,78671,78672,78673,78674,78675,78676,78677,78678,78679,78680,78681,78682,78683,78684,78685,78686,78687,78688,78689,78690,78691,78692,78693,78694,78695,78696,78697,78698,78699,78700,78701,78702,78703,78704,78705,78706,78707,78708,78709,78710,78711,78712,78713,78714,78715,78716,78717,78718,78719,78720,78721,78722,78723,78724,78725,78726,78727,78728,78729,78730,78731,78732,78733,78734,78735,78736,78737,78738,78739,78740,78741,78742,78743,78744,78745,78746,78747,78748,78749,78750,78751,78752,78753,78754,78755,78756,78757,78758,78759,78760,78761,78762,78763,78764,78765,78766,78767,78768,78769,78770,78771,78772,78773,78774,78775,78776,78777,78778,78779,78780,78781,78782,78783,78784,78785,78786,78787,78788,78789,78790,78791,78792,78793,78794,78795,78796,78797,78798,78799,78800,78801,78802,78803,78804,78805,78806,78807,78808,78809,78810,78811,78812,78813,78814,78815,78816,78817,78818,78819,78820,78821,78822,78823,78824,78825,78826,78827,78828,78829,78830,78831,78832,78833,78834,78835,78836,78837,78838,78839,78840,78841,78842,78843,78844,78845,78846,78847,78848,78849,78850,78851,78852,78853,78854,78855,78856,78857,78858,78859,78860,78861,78862,78863,78864,78865,78866,78867,78868,78869,78870,78871,78872,78873,78874,78875,78876,78877,78878,78879,78880,78881,78882,78883,78884,78885,78886,78887,78888,78889,78890,78891,78892,78893,78894,92160,92161,92162,92163,92164,92165,92166,92167,92168,92169,92170,92171,92172,92173,92174,92175,92176,92177,92178,92179,92180,92181,92182,92183,92184,92185,92186,92187,92188,92189,92190,92191,92192,92193,92194,92195,92196,92197,92198,92199,92200,92201,92202,92203,92204,92205,92206,92207,92208,92209,92210,92211,92212,92213,92214,92215,92216,92217,92218,92219,92220,92221,92222,92223,92224,92225,92226,92227,92228,92229,92230,92231,92232,92233,92234,92235,92236,92237,92238,92239,92240,92241,92242,92243,92244,92245,92246,92247,92248,92249,92250,92251,92252,92253,92254,92255,92256,92257,92258,92259,92260,92261,92262,92263,92264,92265,92266,92267,92268,92269,92270,92271,92272,92273,92274,92275,92276,92277,92278,92279,92280,92281,92282,92283,92284,92285,92286,92287,92288,92289,92290,92291,92292,92293,92294,92295,92296,92297,92298,92299,92300,92301,92302,92303,92304,92305,92306,92307,92308,92309,92310,92311,92312,92313,92314,92315,92316,92317,92318,92319,92320,92321,92322,92323,92324,92325,92326,92327,92328,92329,92330,92331,92332,92333,92334,92335,92336,92337,92338,92339,92340,92341,92342,92343,92344,92345,92346,92347,92348,92349,92350,92351,92352,92353,92354,92355,92356,92357,92358,92359,92360,92361,92362,92363,92364,92365,92366,92367,92368,92369,92370,92371,92372,92373,92374,92375,92376,92377,92378,92379,92380,92381,92382,92383,92384,92385,92386,92387,92388,92389,92390,92391,92392,92393,92394,92395,92396,92397,92398,92399,92400,92401,92402,92403,92404,92405,92406,92407,92408,92409,92410,92411,92412,92413,92414,92415,92416,92417,92418,92419,92420,92421,92422,92423,92424,92425,92426,92427,92428,92429,92430,92431,92432,92433,92434,92435,92436,92437,92438,92439,92440,92441,92442,92443,92444,92445,92446,92447,92448,92449,92450,92451,92452,92453,92454,92455,92456,92457,92458,92459,92460,92461,92462,92463,92464,92465,92466,92467,92468,92469,92470,92471,92472,92473,92474,92475,92476,92477,92478,92479,92480,92481,92482,92483,92484,92485,92486,92487,92488,92489,92490,92491,92492,92493,92494,92495,92496,92497,92498,92499,92500,92501,92502,92503,92504,92505,92506,92507,92508,92509,92510,92511,92512,92513,92514,92515,92516,92517,92518,92519,92520,92521,92522,92523,92524,92525,92526,92527,92528,92529,92530,92531,92532,92533,92534,92535,92536,92537,92538,92539,92540,92541,92542,92543,92544,92545,92546,92547,92548,92549,92550,92551,92552,92553,92554,92555,92556,92557,92558,92559,92560,92561,92562,92563,92564,92565,92566,92567,92568,92569,92570,92571,92572,92573,92574,92575,92576,92577,92578,92579,92580,92581,92582,92583,92584,92585,92586,92587,92588,92589,92590,92591,92592,92593,92594,92595,92596,92597,92598,92599,92600,92601,92602,92603,92604,92605,92606,92607,92608,92609,92610,92611,92612,92613,92614,92615,92616,92617,92618,92619,92620,92621,92622,92623,92624,92625,92626,92627,92628,92629,92630,92631,92632,92633,92634,92635,92636,92637,92638,92639,92640,92641,92642,92643,92644,92645,92646,92647,92648,92649,92650,92651,92652,92653,92654,92655,92656,92657,92658,92659,92660,92661,92662,92663,92664,92665,92666,92667,92668,92669,92670,92671,92672,92673,92674,92675,92676,92677,92678,92679,92680,92681,92682,92683,92684,92685,92686,92687,92688,92689,92690,92691,92692,92693,92694,92695,92696,92697,92698,92699,92700,92701,92702,92703,92704,92705,92706,92707,92708,92709,92710,92711,92712,92713,92714,92715,92716,92717,92718,92719,92720,92721,92722,92723,92724,92725,92726,92727,92728,93952,93953,93954,93955,93956,93957,93958,93959,93960,93961,93962,93963,93964,93965,93966,93967,93968,93969,93970,93971,93972,93973,93974,93975,93976,93977,93978,93979,93980,93981,93982,93983,93984,93985,93986,93987,93988,93989,93990,93991,93992,93993,93994,93995,93996,93997,93998,93999,94000,94001,94002,94003,94004,94005,94006,94007,94008,94009,94010,94011,94012,94013,94014,94015,94016,94017,94018,94019,94020,94032,110592,110593,126464,126465,126466,126467,126469,126470,126471,126472,126473,126474,126475,126476,126477,126478,126479,126480,126481,126482,126483,126484,126485,126486,126487,126488,126489,126490,126491,126492,126493,126494,126495,126497,126498,126500,126503,126505,126506,126507,126508,126509,126510,126511,126512,126513,126514,126516,126517,126518,126519,126521,126523,126530,126535,126537,126539,126541,126542,126543,126545,126546,126548,126551,126553,126555,126557,126559,126561,126562,126564,126567,126568,126569,126570,126572,126573,126574,126575,126576,126577,126578,126580,126581,126582,126583,126585,126586,126587,126588,126590,126592,126593,126594,126595,126596,126597,126598,126599,126600,126601,126603,126604,126605,126606,126607,126608,126609,126610,126611,126612,126613,126614,126615,126616,126617,126618,126619,126625,126626,126627,126629,126630,126631,126632,126633,126635,126636,126637,126638,126639,126640,126641,126642,126643,126644,126645,126646,126647,126648,126649,126650,126651,131072,131073,131074,131075,131076,131077,131078,131079,131080,131081,131082,131083,131084,131085,131086,131087,131088,131089,131090,131091,131092,131093,131094,131095,131096,131097,131098,131099,131100,131101,131102,131103,131104,131105,131106,131107,131108,131109,131110,131111,131112,131113,131114,131115,131116,131117,131118,131119,131120,131121,131122,131123,131124,131125,131126,131127,131128,131129,131130,131131,131132,131133,131134,131135,131136,131137,131138,131139,131140,131141,131142,131143,131144,131145,131146,131147,131148,131149,131150,131151,131152,131153,131154,131155,131156,131157,131158,131159,131160,131161,131162,131163,131164,131165,131166,131167,131168,131169,131170,131171,131172,131173,131174,131175,131176,131177,131178,131179,131180,131181,131182,131183,131184,131185,131186,131187,131188,131189,131190,131191,131192,131193,131194,131195,131196,131197,131198,131199,131200,131201,131202,131203,131204,131205,131206,131207,131208,131209,131210,131211,131212,131213,131214,131215,131216,131217,131218,131219,131220,131221,131222,131223,131224,131225,131226,131227,131228,131229,131230,131231,131232,131233,131234,131235,131236,131237,131238,131239,131240,131241,131242,131243,131244,131245,131246,131247,131248,131249,131250,131251,131252,131253,131254,131255,131256,131257,131258,131259,131260,131261,131262,131263,131264,131265,131266,131267,131268,131269,131270,131271,131272,131273,131274,131275,131276,131277,131278,131279,131280,131281,131282,131283,131284,131285,131286,131287,131288,131289,131290,131291,131292,131293,131294,131295,131296,131297,131298,131299,131300,131301,131302,131303,131304,131305,131306,131307,131308,131309,131310,131311,131312,131313,131314,131315,131316,131317,131318,131319,131320,131321,131322,131323,131324,131325,131326,131327,131328,131329,131330,131331,131332,131333,131334,131335,131336,131337,131338,131339,131340,131341,131342,131343,131344,131345,131346,131347,131348,131349,131350,131351,131352,131353,131354,131355,131356,131357,131358,131359,131360,131361,131362,131363,131364,131365,131366,131367,131368,131369,131370,131371,131372,131373,131374,131375,131376,131377,131378,131379,131380,131381,131382,131383,131384,131385,131386,131387,131388,131389,131390,131391,131392,131393,131394,131395,131396,131397,131398,131399,131400,131401,131402,131403,131404,131405,131406,131407,131408,131409,131410,131411,131412,131413,131414,131415,131416,131417,131418,131419,131420,131421,131422,131423,131424,131425,131426,131427,131428,131429,131430,131431,131432,131433,131434,131435,131436,131437,131438,131439,131440,131441,131442,131443,131444,131445,131446,131447,131448,131449,131450,131451,131452,131453,131454,131455,131456,131457,131458,131459,131460,131461,131462,131463,131464,131465,131466,131467,131468,131469,131470,131471,131472,131473,131474,131475,131476,131477,131478,131479,131480,131481,131482,131483,131484,131485,131486,131487,131488,131489,131490,131491,131492,131493,131494,131495,131496,131497,131498,131499,131500,131501,131502,131503,131504,131505,131506,131507,131508,131509,131510,131511,131512,131513,131514,131515,131516,131517,131518,131519,131520,131521,131522,131523,131524,131525,131526,131527,131528,131529,131530,131531,131532,131533,131534,131535,131536,131537,131538,131539,131540,131541,131542,131543,131544,131545,131546,131547,131548,131549,131550,131551,131552,131553,131554,131555,131556,131557,131558,131559,131560,131561,131562,131563,131564,131565,131566,131567,131568,131569,131570,131571,131572,131573,131574,131575,131576,131577,131578,131579,131580,131581,131582,131583,131584,131585,131586,131587,131588,131589,131590,131591,131592,131593,131594,131595,131596,131597,131598,131599,131600,131601,131602,131603,131604,131605,131606,131607,131608,131609,131610,131611,131612,131613,131614,131615,131616,131617,131618,131619,131620,131621,131622,131623,131624,131625,131626,131627,131628,131629,131630,131631,131632,131633,131634,131635,131636,131637,131638,131639,131640,131641,131642,131643,131644,131645,131646,131647,131648,131649,131650,131651,131652,131653,131654,131655,131656,131657,131658,131659,131660,131661,131662,131663,131664,131665,131666,131667,131668,131669,131670,131671,131672,131673,131674,131675,131676,131677,131678,131679,131680,131681,131682,131683,131684,131685,131686,131687,131688,131689,131690,131691,131692,131693,131694,131695,131696,131697,131698,131699,131700,131701,131702,131703,131704,131705,131706,131707,131708,131709,131710,131711,131712,131713,131714,131715,131716,131717,131718,131719,131720,131721,131722,131723,131724,131725,131726,131727,131728,131729,131730,131731,131732,131733,131734,131735,131736,131737,131738,131739,131740,131741,131742,131743,131744,131745,131746,131747,131748,131749,131750,131751,131752,131753,131754,131755,131756,131757,131758,131759,131760,131761,131762,131763,131764,131765,131766,131767,131768,131769,131770,131771,131772,131773,131774,131775,131776,131777,131778,131779,131780,131781,131782,131783,131784,131785,131786,131787,131788,131789,131790,131791,131792,131793,131794,131795,131796,131797,131798,131799,131800,131801,131802,131803,131804,131805,131806,131807,131808,131809,131810,131811,131812,131813,131814,131815,131816,131817,131818,131819,131820,131821,131822,131823,131824,131825,131826,131827,131828,131829,131830,131831,131832,131833,131834,131835,131836,131837,131838,131839,131840,131841,131842,131843,131844,131845,131846,131847,131848,131849,131850,131851,131852,131853,131854,131855,131856,131857,131858,131859,131860,131861,131862,131863,131864,131865,131866,131867,131868,131869,131870,131871,131872,131873,131874,131875,131876,131877,131878,131879,131880,131881,131882,131883,131884,131885,131886,131887,131888,131889,131890,131891,131892,131893,131894,131895,131896,131897,131898,131899,131900,131901,131902,131903,131904,131905,131906,131907,131908,131909,131910,131911,131912,131913,131914,131915,131916,131917,131918,131919,131920,131921,131922,131923,131924,131925,131926,131927,131928,131929,131930,131931,131932,131933,131934,131935,131936,131937,131938,131939,131940,131941,131942,131943,131944,131945,131946,131947,131948,131949,131950,131951,131952,131953,131954,131955,131956,131957,131958,131959,131960,131961,131962,131963,131964,131965,131966,131967,131968,131969,131970,131971,131972,131973,131974,131975,131976,131977,131978,131979,131980,131981,131982,131983,131984,131985,131986,131987,131988,131989,131990,131991,131992,131993,131994,131995,131996,131997,131998,131999,132000,132001,132002,132003,132004,132005,132006,132007,132008,132009,132010,132011,132012,132013,132014,132015,132016,132017,132018,132019,132020,132021,132022,132023,132024,132025,132026,132027,132028,132029,132030,132031,132032,132033,132034,132035,132036,132037,132038,132039,132040,132041,132042,132043,132044,132045,132046,132047,132048,132049,132050,132051,132052,132053,132054,132055,132056,132057,132058,132059,132060,132061,132062,132063,132064,132065,132066,132067,132068,132069,132070,132071,132072,132073,132074,132075,132076,132077,132078,132079,132080,132081,132082,132083,132084,132085,132086,132087,132088,132089,132090,132091,132092,132093,132094,132095,132096,132097,132098,132099,132100,132101,132102,132103,132104,132105,132106,132107,132108,132109,132110,132111,132112,132113,132114,132115,132116,132117,132118,132119,132120,132121,132122,132123,132124,132125,132126,132127,132128,132129,132130,132131,132132,132133,132134,132135,132136,132137,132138,132139,132140,132141,132142,132143,132144,132145,132146,132147,132148,132149,132150,132151,132152,132153,132154,132155,132156,132157,132158,132159,132160,132161,132162,132163,132164,132165,132166,132167,132168,132169,132170,132171,132172,132173,132174,132175,132176,132177,132178,132179,132180,132181,132182,132183,132184,132185,132186,132187,132188,132189,132190,132191,132192,132193,132194,132195,132196,132197,132198,132199,132200,132201,132202,132203,132204,132205,132206,132207,132208,132209,132210,132211,132212,132213,132214,132215,132216,132217,132218,132219,132220,132221,132222,132223,132224,132225,132226,132227,132228,132229,132230,132231,132232,132233,132234,132235,132236,132237,132238,132239,132240,132241,132242,132243,132244,132245,132246,132247,132248,132249,132250,132251,132252,132253,132254,132255,132256,132257,132258,132259,132260,132261,132262,132263,132264,132265,132266,132267,132268,132269,132270,132271,132272,132273,132274,132275,132276,132277,132278,132279,132280,132281,132282,132283,132284,132285,132286,132287,132288,132289,132290,132291,132292,132293,132294,132295,132296,132297,132298,132299,132300,132301,132302,132303,132304,132305,132306,132307,132308,132309,132310,132311,132312,132313,132314,132315,132316,132317,132318,132319,132320,132321,132322,132323,132324,132325,132326,132327,132328,132329,132330,132331,132332,132333,132334,132335,132336,132337,132338,132339,132340,132341,132342,132343,132344,132345,132346,132347,132348,132349,132350,132351,132352,132353,132354,132355,132356,132357,132358,132359,132360,132361,132362,132363,132364,132365,132366,132367,132368,132369,132370,132371,132372,132373,132374,132375,132376,132377,132378,132379,132380,132381,132382,132383,132384,132385,132386,132387,132388,132389,132390,132391,132392,132393,132394,132395,132396,132397,132398,132399,132400,132401,132402,132403,132404,132405,132406,132407,132408,132409,132410,132411,132412,132413,132414,132415,132416,132417,132418,132419,132420,132421,132422,132423,132424,132425,132426,132427,132428,132429,132430,132431,132432,132433,132434,132435,132436,132437,132438,132439,132440,132441,132442,132443,132444,132445,132446,132447,132448,132449,132450,132451,132452,132453,132454,132455,132456,132457,132458,132459,132460,132461,132462,132463,132464,132465,132466,132467,132468,132469,132470,132471,132472,132473,132474,132475,132476,132477,132478,132479,132480,132481,132482,132483,132484,132485,132486,132487,132488,132489,132490,132491,132492,132493,132494,132495,132496,132497,132498,132499,132500,132501,132502,132503,132504,132505,132506,132507,132508,132509,132510,132511,132512,132513,132514,132515,132516,132517,132518,132519,132520,132521,132522,132523,132524,132525,132526,132527,132528,132529,132530,132531,132532,132533,132534,132535,132536,132537,132538,132539,132540,132541,132542,132543,132544,132545,132546,132547,132548,132549,132550,132551,132552,132553,132554,132555,132556,132557,132558,132559,132560,132561,132562,132563,132564,132565,132566,132567,132568,132569,132570,132571,132572,132573,132574,132575,132576,132577,132578,132579,132580,132581,132582,132583,132584,132585,132586,132587,132588,132589,132590,132591,132592,132593,132594,132595,132596,132597,132598,132599,132600,132601,132602,132603,132604,132605,132606,132607,132608,132609,132610,132611,132612,132613,132614,132615,132616,132617,132618,132619,132620,132621,132622,132623,132624,132625,132626,132627,132628,132629,132630,132631,132632,132633,132634,132635,132636,132637,132638,132639,132640,132641,132642,132643,132644,132645,132646,132647,132648,132649,132650,132651,132652,132653,132654,132655,132656,132657,132658,132659,132660,132661,132662,132663,132664,132665,132666,132667,132668,132669,132670,132671,132672,132673,132674,132675,132676,132677,132678,132679,132680,132681,132682,132683,132684,132685,132686,132687,132688,132689,132690,132691,132692,132693,132694,132695,132696,132697,132698,132699,132700,132701,132702,132703,132704,132705,132706,132707,132708,132709,132710,132711,132712,132713,132714,132715,132716,132717,132718,132719,132720,132721,132722,132723,132724,132725,132726,132727,132728,132729,132730,132731,132732,132733,132734,132735,132736,132737,132738,132739,132740,132741,132742,132743,132744,132745,132746,132747,132748,132749,132750,132751,132752,132753,132754,132755,132756,132757,132758,132759,132760,132761,132762,132763,132764,132765,132766,132767,132768,132769,132770,132771,132772,132773,132774,132775,132776,132777,132778,132779,132780,132781,132782,132783,132784,132785,132786,132787,132788,132789,132790,132791,132792,132793,132794,132795,132796,132797,132798,132799,132800,132801,132802,132803,132804,132805,132806,132807,132808,132809,132810,132811,132812,132813,132814,132815,132816,132817,132818,132819,132820,132821,132822,132823,132824,132825,132826,132827,132828,132829,132830,132831,132832,132833,132834,132835,132836,132837,132838,132839,132840,132841,132842,132843,132844,132845,132846,132847,132848,132849,132850,132851,132852,132853,132854,132855,132856,132857,132858,132859,132860,132861,132862,132863,132864,132865,132866,132867,132868,132869,132870,132871,132872,132873,132874,132875,132876,132877,132878,132879,132880,132881,132882,132883,132884,132885,132886,132887,132888,132889,132890,132891,132892,132893,132894,132895,132896,132897,132898,132899,132900,132901,132902,132903,132904,132905,132906,132907,132908,132909,132910,132911,132912,132913,132914,132915,132916,132917,132918,132919,132920,132921,132922,132923,132924,132925,132926,132927,132928,132929,132930,132931,132932,132933,132934,132935,132936,132937,132938,132939,132940,132941,132942,132943,132944,132945,132946,132947,132948,132949,132950,132951,132952,132953,132954,132955,132956,132957,132958,132959,132960,132961,132962,132963,132964,132965,132966,132967,132968,132969,132970,132971,132972,132973,132974,132975,132976,132977,132978,132979,132980,132981,132982,132983,132984,132985,132986,132987,132988,132989,132990,132991,132992,132993,132994,132995,132996,132997,132998,132999,133000,133001,133002,133003,133004,133005,133006,133007,133008,133009,133010,133011,133012,133013,133014,133015,133016,133017,133018,133019,133020,133021,133022,133023,133024,133025,133026,133027,133028,133029,133030,133031,133032,133033,133034,133035,133036,133037,133038,133039,133040,133041,133042,133043,133044,133045,133046,133047,133048,133049,133050,133051,133052,133053,133054,133055,133056,133057,133058,133059,133060,133061,133062,133063,133064,133065,133066,133067,133068,133069,133070,133071,133072,133073,133074,133075,133076,133077,133078,133079,133080,133081,133082,133083,133084,133085,133086,133087,133088,133089,133090,133091,133092,133093,133094,133095,133096,133097,133098,133099,133100,133101,133102,133103,133104,133105,133106,133107,133108,133109,133110,133111,133112,133113,133114,133115,133116,133117,133118,133119,133120,133121,133122,133123,133124,133125,133126,133127,133128,133129,133130,133131,133132,133133,133134,133135,133136,133137,133138,133139,133140,133141,133142,133143,133144,133145,133146,133147,133148,133149,133150,133151,133152,133153,133154,133155,133156,133157,133158,133159,133160,133161,133162,133163,133164,133165,133166,133167,133168,133169,133170,133171,133172,133173,133174,133175,133176,133177,133178,133179,133180,133181,133182,133183,133184,133185,133186,133187,133188,133189,133190,133191,133192,133193,133194,133195,133196,133197,133198,133199,133200,133201,133202,133203,133204,133205,133206,133207,133208,133209,133210,133211,133212,133213,133214,133215,133216,133217,133218,133219,133220,133221,133222,133223,133224,133225,133226,133227,133228,133229,133230,133231,133232,133233,133234,133235,133236,133237,133238,133239,133240,133241,133242,133243,133244,133245,133246,133247,133248,133249,133250,133251,133252,133253,133254,133255,133256,133257,133258,133259,133260,133261,133262,133263,133264,133265,133266,133267,133268,133269,133270,133271,133272,133273,133274,133275,133276,133277,133278,133279,133280,133281,133282,133283,133284,133285,133286,133287,133288,133289,133290,133291,133292,133293,133294,133295,133296,133297,133298,133299,133300,133301,133302,133303,133304,133305,133306,133307,133308,133309,133310,133311,133312,133313,133314,133315,133316,133317,133318,133319,133320,133321,133322,133323,133324,133325,133326,133327,133328,133329,133330,133331,133332,133333,133334,133335,133336,133337,133338,133339,133340,133341,133342,133343,133344,133345,133346,133347,133348,133349,133350,133351,133352,133353,133354,133355,133356,133357,133358,133359,133360,133361,133362,133363,133364,133365,133366,133367,133368,133369,133370,133371,133372,133373,133374,133375,133376,133377,133378,133379,133380,133381,133382,133383,133384,133385,133386,133387,133388,133389,133390,133391,133392,133393,133394,133395,133396,133397,133398,133399,133400,133401,133402,133403,133404,133405,133406,133407,133408,133409,133410,133411,133412,133413,133414,133415,133416,133417,133418,133419,133420,133421,133422,133423,133424,133425,133426,133427,133428,133429,133430,133431,133432,133433,133434,133435,133436,133437,133438,133439,133440,133441,133442,133443,133444,133445,133446,133447,133448,133449,133450,133451,133452,133453,133454,133455,133456,133457,133458,133459,133460,133461,133462,133463,133464,133465,133466,133467,133468,133469,133470,133471,133472,133473,133474,133475,133476,133477,133478,133479,133480,133481,133482,133483,133484,133485,133486,133487,133488,133489,133490,133491,133492,133493,133494,133495,133496,133497,133498,133499,133500,133501,133502,133503,133504,133505,133506,133507,133508,133509,133510,133511,133512,133513,133514,133515,133516,133517,133518,133519,133520,133521,133522,133523,133524,133525,133526,133527,133528,133529,133530,133531,133532,133533,133534,133535,133536,133537,133538,133539,133540,133541,133542,133543,133544,133545,133546,133547,133548,133549,133550,133551,133552,133553,133554,133555,133556,133557,133558,133559,133560,133561,133562,133563,133564,133565,133566,133567,133568,133569,133570,133571,133572,133573,133574,133575,133576,133577,133578,133579,133580,133581,133582,133583,133584,133585,133586,133587,133588,133589,133590,133591,133592,133593,133594,133595,133596,133597,133598,133599,133600,133601,133602,133603,133604,133605,133606,133607,133608,133609,133610,133611,133612,133613,133614,133615,133616,133617,133618,133619,133620,133621,133622,133623,133624,133625,133626,133627,133628,133629,133630,133631,133632,133633,133634,133635,133636,133637,133638,133639,133640,133641,133642,133643,133644,133645,133646,133647,133648,133649,133650,133651,133652,133653,133654,133655,133656,133657,133658,133659,133660,133661,133662,133663,133664,133665,133666,133667,133668,133669,133670,133671,133672,133673,133674,133675,133676,133677,133678,133679,133680,133681,133682,133683,133684,133685,133686,133687,133688,133689,133690,133691,133692,133693,133694,133695,133696,133697,133698,133699,133700,133701,133702,133703,133704,133705,133706,133707,133708,133709,133710,133711,133712,133713,133714,133715,133716,133717,133718,133719,133720,133721,133722,133723,133724,133725,133726,133727,133728,133729,133730,133731,133732,133733,133734,133735,133736,133737,133738,133739,133740,133741,133742,133743,133744,133745,133746,133747,133748,133749,133750,133751,133752,133753,133754,133755,133756,133757,133758,133759,133760,133761,133762,133763,133764,133765,133766,133767,133768,133769,133770,133771,133772,133773,133774,133775,133776,133777,133778,133779,133780,133781,133782,133783,133784,133785,133786,133787,133788,133789,133790,133791,133792,133793,133794,133795,133796,133797,133798,133799,133800,133801,133802,133803,133804,133805,133806,133807,133808,133809,133810,133811,133812,133813,133814,133815,133816,133817,133818,133819,133820,133821,133822,133823,133824,133825,133826,133827,133828,133829,133830,133831,133832,133833,133834,133835,133836,133837,133838,133839,133840,133841,133842,133843,133844,133845,133846,133847,133848,133849,133850,133851,133852,133853,133854,133855,133856,133857,133858,133859,133860,133861,133862,133863,133864,133865,133866,133867,133868,133869,133870,133871,133872,133873,133874,133875,133876,133877,133878,133879,133880,133881,133882,133883,133884,133885,133886,133887,133888,133889,133890,133891,133892,133893,133894,133895,133896,133897,133898,133899,133900,133901,133902,133903,133904,133905,133906,133907,133908,133909,133910,133911,133912,133913,133914,133915,133916,133917,133918,133919,133920,133921,133922,133923,133924,133925,133926,133927,133928,133929,133930,133931,133932,133933,133934,133935,133936,133937,133938,133939,133940,133941,133942,133943,133944,133945,133946,133947,133948,133949,133950,133951,133952,133953,133954,133955,133956,133957,133958,133959,133960,133961,133962,133963,133964,133965,133966,133967,133968,133969,133970,133971,133972,133973,133974,133975,133976,133977,133978,133979,133980,133981,133982,133983,133984,133985,133986,133987,133988,133989,133990,133991,133992,133993,133994,133995,133996,133997,133998,133999,134000,134001,134002,134003,134004,134005,134006,134007,134008,134009,134010,134011,134012,134013,134014,134015,134016,134017,134018,134019,134020,134021,134022,134023,134024,134025,134026,134027,134028,134029,134030,134031,134032,134033,134034,134035,134036,134037,134038,134039,134040,134041,134042,134043,134044,134045,134046,134047,134048,134049,134050,134051,134052,134053,134054,134055,134056,134057,134058,134059,134060,134061,134062,134063,134064,134065,134066,134067,134068,134069,134070,134071,134072,134073,134074,134075,134076,134077,134078,134079,134080,134081,134082,134083,134084,134085,134086,134087,134088,134089,134090,134091,134092,134093,134094,134095,134096,134097,134098,134099,134100,134101,134102,134103,134104,134105,134106,134107,134108,134109,134110,134111,134112,134113,134114,134115,134116,134117,134118,134119,134120,134121,134122,134123,134124,134125,134126,134127,134128,134129,134130,134131,134132,134133,134134,134135,134136,134137,134138,134139,134140,134141,134142,134143,134144,134145,134146,134147,134148,134149,134150,134151,134152,134153,134154,134155,134156,134157,134158,134159,134160,134161,134162,134163,134164,134165,134166,134167,134168,134169,134170,134171,134172,134173,134174,134175,134176,134177,134178,134179,134180,134181,134182,134183,134184,134185,134186,134187,134188,134189,134190,134191,134192,134193,134194,134195,134196,134197,134198,134199,134200,134201,134202,134203,134204,134205,134206,134207,134208,134209,134210,134211,134212,134213,134214,134215,134216,134217,134218,134219,134220,134221,134222,134223,134224,134225,134226,134227,134228,134229,134230,134231,134232,134233,134234,134235,134236,134237,134238,134239,134240,134241,134242,134243,134244,134245,134246,134247,134248,134249,134250,134251,134252,134253,134254,134255,134256,134257,134258,134259,134260,134261,134262,134263,134264,134265,134266,134267,134268,134269,134270,134271,134272,134273,134274,134275,134276,134277,134278,134279,134280,134281,134282,134283,134284,134285,134286,134287,134288,134289,134290,134291,134292,134293,134294,134295,134296,134297,134298,134299,134300,134301,134302,134303,134304,134305,134306,134307,134308,134309,134310,134311,134312,134313,134314,134315,134316,134317,134318,134319,134320,134321,134322,134323,134324,134325,134326,134327,134328,134329,134330,134331,134332,134333,134334,134335,134336,134337,134338,134339,134340,134341,134342,134343,134344,134345,134346,134347,134348,134349,134350,134351,134352,134353,134354,134355,134356,134357,134358,134359,134360,134361,134362,134363,134364,134365,134366,134367,134368,134369,134370,134371,134372,134373,134374,134375,134376,134377,134378,134379,134380,134381,134382,134383,134384,134385,134386,134387,134388,134389,134390,134391,134392,134393,134394,134395,134396,134397,134398,134399,134400,134401,134402,134403,134404,134405,134406,134407,134408,134409,134410,134411,134412,134413,134414,134415,134416,134417,134418,134419,134420,134421,134422,134423,134424,134425,134426,134427,134428,134429,134430,134431,134432,134433,134434,134435,134436,134437,134438,134439,134440,134441,134442,134443,134444,134445,134446,134447,134448,134449,134450,134451,134452,134453,134454,134455,134456,134457,134458,134459,134460,134461,134462,134463,134464,134465,134466,134467,134468,134469,134470,134471,134472,134473,134474,134475,134476,134477,134478,134479,134480,134481,134482,134483,134484,134485,134486,134487,134488,134489,134490,134491,134492,134493,134494,134495,134496,134497,134498,134499,134500,134501,134502,134503,134504,134505,134506,134507,134508,134509,134510,134511,134512,134513,134514,134515,134516,134517,134518,134519,134520,134521,134522,134523,134524,134525,134526,134527,134528,134529,134530,134531,134532,134533,134534,134535,134536,134537,134538,134539,134540,134541,134542,134543,134544,134545,134546,134547,134548,134549,134550,134551,134552,134553,134554,134555,134556,134557,134558,134559,134560,134561,134562,134563,134564,134565,134566,134567,134568,134569,134570,134571,134572,134573,134574,134575,134576,134577,134578,134579,134580,134581,134582,134583,134584,134585,134586,134587,134588,134589,134590,134591,134592,134593,134594,134595,134596,134597,134598,134599,134600,134601,134602,134603,134604,134605,134606,134607,134608,134609,134610,134611,134612,134613,134614,134615,134616,134617,134618,134619,134620,134621,134622,134623,134624,134625,134626,134627,134628,134629,134630,134631,134632,134633,134634,134635,134636,134637,134638,134639,134640,134641,134642,134643,134644,134645,134646,134647,134648,134649,134650,134651,134652,134653,134654,134655,134656,134657,134658,134659,134660,134661,134662,134663,134664,134665,134666,134667,134668,134669,134670,134671,134672,134673,134674,134675,134676,134677,134678,134679,134680,134681,134682,134683,134684,134685,134686,134687,134688,134689,134690,134691,134692,134693,134694,134695,134696,134697,134698,134699,134700,134701,134702,134703,134704,134705,134706,134707,134708,134709,134710,134711,134712,134713,134714,134715,134716,134717,134718,134719,134720,134721,134722,134723,134724,134725,134726,134727,134728,134729,134730,134731,134732,134733,134734,134735,134736,134737,134738,134739,134740,134741,134742,134743,134744,134745,134746,134747,134748,134749,134750,134751,134752,134753,134754,134755,134756,134757,134758,134759,134760,134761,134762,134763,134764,134765,134766,134767,134768,134769,134770,134771,134772,134773,134774,134775,134776,134777,134778,134779,134780,134781,134782,134783,134784,134785,134786,134787,134788,134789,134790,134791,134792,134793,134794,134795,134796,134797,134798,134799,134800,134801,134802,134803,134804,134805,134806,134807,134808,134809,134810,134811,134812,134813,134814,134815,134816,134817,134818,134819,134820,134821,134822,134823,134824,134825,134826,134827,134828,134829,134830,134831,134832,134833,134834,134835,134836,134837,134838,134839,134840,134841,134842,134843,134844,134845,134846,134847,134848,134849,134850,134851,134852,134853,134854,134855,134856,134857,134858,134859,134860,134861,134862,134863,134864,134865,134866,134867,134868,134869,134870,134871,134872,134873,134874,134875,134876,134877,134878,134879,134880,134881,134882,134883,134884,134885,134886,134887,134888,134889,134890,134891,134892,134893,134894,134895,134896,134897,134898,134899,134900,134901,134902,134903,134904,134905,134906,134907,134908,134909,134910,134911,134912,134913,134914,134915,134916,134917,134918,134919,134920,134921,134922,134923,134924,134925,134926,134927,134928,134929,134930,134931,134932,134933,134934,134935,134936,134937,134938,134939,134940,134941,134942,134943,134944,134945,134946,134947,134948,134949,134950,134951,134952,134953,134954,134955,134956,134957,134958,134959,134960,134961,134962,134963,134964,134965,134966,134967,134968,134969,134970,134971,134972,134973,134974,134975,134976,134977,134978,134979,134980,134981,134982,134983,134984,134985,134986,134987,134988,134989,134990,134991,134992,134993,134994,134995,134996,134997,134998,134999,135000,135001,135002,135003,135004,135005,135006,135007,135008,135009,135010,135011,135012,135013,135014,135015,135016,135017,135018,135019,135020,135021,135022,135023,135024,135025,135026,135027,135028,135029,135030,135031,135032,135033,135034,135035,135036,135037,135038,135039,135040,135041,135042,135043,135044,135045,135046,135047,135048,135049,135050,135051,135052,135053,135054,135055,135056,135057,135058,135059,135060,135061,135062,135063,135064,135065,135066,135067,135068,135069,135070,135071,135072,135073,135074,135075,135076,135077,135078,135079,135080,135081,135082,135083,135084,135085,135086,135087,135088,135089,135090,135091,135092,135093,135094,135095,135096,135097,135098,135099,135100,135101,135102,135103,135104,135105,135106,135107,135108,135109,135110,135111,135112,135113,135114,135115,135116,135117,135118,135119,135120,135121,135122,135123,135124,135125,135126,135127,135128,135129,135130,135131,135132,135133,135134,135135,135136,135137,135138,135139,135140,135141,135142,135143,135144,135145,135146,135147,135148,135149,135150,135151,135152,135153,135154,135155,135156,135157,135158,135159,135160,135161,135162,135163,135164,135165,135166,135167,135168,135169,135170,135171,135172,135173,135174,135175,135176,135177,135178,135179,135180,135181,135182,135183,135184,135185,135186,135187,135188,135189,135190,135191,135192,135193,135194,135195,135196,135197,135198,135199,135200,135201,135202,135203,135204,135205,135206,135207,135208,135209,135210,135211,135212,135213,135214,135215,135216,135217,135218,135219,135220,135221,135222,135223,135224,135225,135226,135227,135228,135229,135230,135231,135232,135233,135234,135235,135236,135237,135238,135239,135240,135241,135242,135243,135244,135245,135246,135247,135248,135249,135250,135251,135252,135253,135254,135255,135256,135257,135258,135259,135260,135261,135262,135263,135264,135265,135266,135267,135268,135269,135270,135271,135272,135273,135274,135275,135276,135277,135278,135279,135280,135281,135282,135283,135284,135285,135286,135287,135288,135289,135290,135291,135292,135293,135294,135295,135296,135297,135298,135299,135300,135301,135302,135303,135304,135305,135306,135307,135308,135309,135310,135311,135312,135313,135314,135315,135316,135317,135318,135319,135320,135321,135322,135323,135324,135325,135326,135327,135328,135329,135330,135331,135332,135333,135334,135335,135336,135337,135338,135339,135340,135341,135342,135343,135344,135345,135346,135347,135348,135349,135350,135351,135352,135353,135354,135355,135356,135357,135358,135359,135360,135361,135362,135363,135364,135365,135366,135367,135368,135369,135370,135371,135372,135373,135374,135375,135376,135377,135378,135379,135380,135381,135382,135383,135384,135385,135386,135387,135388,135389,135390,135391,135392,135393,135394,135395,135396,135397,135398,135399,135400,135401,135402,135403,135404,135405,135406,135407,135408,135409,135410,135411,135412,135413,135414,135415,135416,135417,135418,135419,135420,135421,135422,135423,135424,135425,135426,135427,135428,135429,135430,135431,135432,135433,135434,135435,135436,135437,135438,135439,135440,135441,135442,135443,135444,135445,135446,135447,135448,135449,135450,135451,135452,135453,135454,135455,135456,135457,135458,135459,135460,135461,135462,135463,135464,135465,135466,135467,135468,135469,135470,135471,135472,135473,135474,135475,135476,135477,135478,135479,135480,135481,135482,135483,135484,135485,135486,135487,135488,135489,135490,135491,135492,135493,135494,135495,135496,135497,135498,135499,135500,135501,135502,135503,135504,135505,135506,135507,135508,135509,135510,135511,135512,135513,135514,135515,135516,135517,135518,135519,135520,135521,135522,135523,135524,135525,135526,135527,135528,135529,135530,135531,135532,135533,135534,135535,135536,135537,135538,135539,135540,135541,135542,135543,135544,135545,135546,135547,135548,135549,135550,135551,135552,135553,135554,135555,135556,135557,135558,135559,135560,135561,135562,135563,135564,135565,135566,135567,135568,135569,135570,135571,135572,135573,135574,135575,135576,135577,135578,135579,135580,135581,135582,135583,135584,135585,135586,135587,135588,135589,135590,135591,135592,135593,135594,135595,135596,135597,135598,135599,135600,135601,135602,135603,135604,135605,135606,135607,135608,135609,135610,135611,135612,135613,135614,135615,135616,135617,135618,135619,135620,135621,135622,135623,135624,135625,135626,135627,135628,135629,135630,135631,135632,135633,135634,135635,135636,135637,135638,135639,135640,135641,135642,135643,135644,135645,135646,135647,135648,135649,135650,135651,135652,135653,135654,135655,135656,135657,135658,135659,135660,135661,135662,135663,135664,135665,135666,135667,135668,135669,135670,135671,135672,135673,135674,135675,135676,135677,135678,135679,135680,135681,135682,135683,135684,135685,135686,135687,135688,135689,135690,135691,135692,135693,135694,135695,135696,135697,135698,135699,135700,135701,135702,135703,135704,135705,135706,135707,135708,135709,135710,135711,135712,135713,135714,135715,135716,135717,135718,135719,135720,135721,135722,135723,135724,135725,135726,135727,135728,135729,135730,135731,135732,135733,135734,135735,135736,135737,135738,135739,135740,135741,135742,135743,135744,135745,135746,135747,135748,135749,135750,135751,135752,135753,135754,135755,135756,135757,135758,135759,135760,135761,135762,135763,135764,135765,135766,135767,135768,135769,135770,135771,135772,135773,135774,135775,135776,135777,135778,135779,135780,135781,135782,135783,135784,135785,135786,135787,135788,135789,135790,135791,135792,135793,135794,135795,135796,135797,135798,135799,135800,135801,135802,135803,135804,135805,135806,135807,135808,135809,135810,135811,135812,135813,135814,135815,135816,135817,135818,135819,135820,135821,135822,135823,135824,135825,135826,135827,135828,135829,135830,135831,135832,135833,135834,135835,135836,135837,135838,135839,135840,135841,135842,135843,135844,135845,135846,135847,135848,135849,135850,135851,135852,135853,135854,135855,135856,135857,135858,135859,135860,135861,135862,135863,135864,135865,135866,135867,135868,135869,135870,135871,135872,135873,135874,135875,135876,135877,135878,135879,135880,135881,135882,135883,135884,135885,135886,135887,135888,135889,135890,135891,135892,135893,135894,135895,135896,135897,135898,135899,135900,135901,135902,135903,135904,135905,135906,135907,135908,135909,135910,135911,135912,135913,135914,135915,135916,135917,135918,135919,135920,135921,135922,135923,135924,135925,135926,135927,135928,135929,135930,135931,135932,135933,135934,135935,135936,135937,135938,135939,135940,135941,135942,135943,135944,135945,135946,135947,135948,135949,135950,135951,135952,135953,135954,135955,135956,135957,135958,135959,135960,135961,135962,135963,135964,135965,135966,135967,135968,135969,135970,135971,135972,135973,135974,135975,135976,135977,135978,135979,135980,135981,135982,135983,135984,135985,135986,135987,135988,135989,135990,135991,135992,135993,135994,135995,135996,135997,135998,135999,136000,136001,136002,136003,136004,136005,136006,136007,136008,136009,136010,136011,136012,136013,136014,136015,136016,136017,136018,136019,136020,136021,136022,136023,136024,136025,136026,136027,136028,136029,136030,136031,136032,136033,136034,136035,136036,136037,136038,136039,136040,136041,136042,136043,136044,136045,136046,136047,136048,136049,136050,136051,136052,136053,136054,136055,136056,136057,136058,136059,136060,136061,136062,136063,136064,136065,136066,136067,136068,136069,136070,136071,136072,136073,136074,136075,136076,136077,136078,136079,136080,136081,136082,136083,136084,136085,136086,136087,136088,136089,136090,136091,136092,136093,136094,136095,136096,136097,136098,136099,136100,136101,136102,136103,136104,136105,136106,136107,136108,136109,136110,136111,136112,136113,136114,136115,136116,136117,136118,136119,136120,136121,136122,136123,136124,136125,136126,136127,136128,136129,136130,136131,136132,136133,136134,136135,136136,136137,136138,136139,136140,136141,136142,136143,136144,136145,136146,136147,136148,136149,136150,136151,136152,136153,136154,136155,136156,136157,136158,136159,136160,136161,136162,136163,136164,136165,136166,136167,136168,136169,136170,136171,136172,136173,136174,136175,136176,136177,136178,136179,136180,136181,136182,136183,136184,136185,136186,136187,136188,136189,136190,136191,136192,136193,136194,136195,136196,136197,136198,136199,136200,136201,136202,136203,136204,136205,136206,136207,136208,136209,136210,136211,136212,136213,136214,136215,136216,136217,136218,136219,136220,136221,136222,136223,136224,136225,136226,136227,136228,136229,136230,136231,136232,136233,136234,136235,136236,136237,136238,136239,136240,136241,136242,136243,136244,136245,136246,136247,136248,136249,136250,136251,136252,136253,136254,136255,136256,136257,136258,136259,136260,136261,136262,136263,136264,136265,136266,136267,136268,136269,136270,136271,136272,136273,136274,136275,136276,136277,136278,136279,136280,136281,136282,136283,136284,136285,136286,136287,136288,136289,136290,136291,136292,136293,136294,136295,136296,136297,136298,136299,136300,136301,136302,136303,136304,136305,136306,136307,136308,136309,136310,136311,136312,136313,136314,136315,136316,136317,136318,136319,136320,136321,136322,136323,136324,136325,136326,136327,136328,136329,136330,136331,136332,136333,136334,136335,136336,136337,136338,136339,136340,136341,136342,136343,136344,136345,136346,136347,136348,136349,136350,136351,136352,136353,136354,136355,136356,136357,136358,136359,136360,136361,136362,136363,136364,136365,136366,136367,136368,136369,136370,136371,136372,136373,136374,136375,136376,136377,136378,136379,136380,136381,136382,136383,136384,136385,136386,136387,136388,136389,136390,136391,136392,136393,136394,136395,136396,136397,136398,136399,136400,136401,136402,136403,136404,136405,136406,136407,136408,136409,136410,136411,136412,136413,136414,136415,136416,136417,136418,136419,136420,136421,136422,136423,136424,136425,136426,136427,136428,136429,136430,136431,136432,136433,136434,136435,136436,136437,136438,136439,136440,136441,136442,136443,136444,136445,136446,136447,136448,136449,136450,136451,136452,136453,136454,136455,136456,136457,136458,136459,136460,136461,136462,136463,136464,136465,136466,136467,136468,136469,136470,136471,136472,136473,136474,136475,136476,136477,136478,136479,136480,136481,136482,136483,136484,136485,136486,136487,136488,136489,136490,136491,136492,136493,136494,136495,136496,136497,136498,136499,136500,136501,136502,136503,136504,136505,136506,136507,136508,136509,136510,136511,136512,136513,136514,136515,136516,136517,136518,136519,136520,136521,136522,136523,136524,136525,136526,136527,136528,136529,136530,136531,136532,136533,136534,136535,136536,136537,136538,136539,136540,136541,136542,136543,136544,136545,136546,136547,136548,136549,136550,136551,136552,136553,136554,136555,136556,136557,136558,136559,136560,136561,136562,136563,136564,136565,136566,136567,136568,136569,136570,136571,136572,136573,136574,136575,136576,136577,136578,136579,136580,136581,136582,136583,136584,136585,136586,136587,136588,136589,136590,136591,136592,136593,136594,136595,136596,136597,136598,136599,136600,136601,136602,136603,136604,136605,136606,136607,136608,136609,136610,136611,136612,136613,136614,136615,136616,136617,136618,136619,136620,136621,136622,136623,136624,136625,136626,136627,136628,136629,136630,136631,136632,136633,136634,136635,136636,136637,136638,136639,136640,136641,136642,136643,136644,136645,136646,136647,136648,136649,136650,136651,136652,136653,136654,136655,136656,136657,136658,136659,136660,136661,136662,136663,136664,136665,136666,136667,136668,136669,136670,136671,136672,136673,136674,136675,136676,136677,136678,136679,136680,136681,136682,136683,136684,136685,136686,136687,136688,136689,136690,136691,136692,136693,136694,136695,136696,136697,136698,136699,136700,136701,136702,136703,136704,136705,136706,136707,136708,136709,136710,136711,136712,136713,136714,136715,136716,136717,136718,136719,136720,136721,136722,136723,136724,136725,136726,136727,136728,136729,136730,136731,136732,136733,136734,136735,136736,136737,136738,136739,136740,136741,136742,136743,136744,136745,136746,136747,136748,136749,136750,136751,136752,136753,136754,136755,136756,136757,136758,136759,136760,136761,136762,136763,136764,136765,136766,136767,136768,136769,136770,136771,136772,136773,136774,136775,136776,136777,136778,136779,136780,136781,136782,136783,136784,136785,136786,136787,136788,136789,136790,136791,136792,136793,136794,136795,136796,136797,136798,136799,136800,136801,136802,136803,136804,136805,136806,136807,136808,136809,136810,136811,136812,136813,136814,136815,136816,136817,136818,136819,136820,136821,136822,136823,136824,136825,136826,136827,136828,136829,136830,136831,136832,136833,136834,136835,136836,136837,136838,136839,136840,136841,136842,136843,136844,136845,136846,136847,136848,136849,136850,136851,136852,136853,136854,136855,136856,136857,136858,136859,136860,136861,136862,136863,136864,136865,136866,136867,136868,136869,136870,136871,136872,136873,136874,136875,136876,136877,136878,136879,136880,136881,136882,136883,136884,136885,136886,136887,136888,136889,136890,136891,136892,136893,136894,136895,136896,136897,136898,136899,136900,136901,136902,136903,136904,136905,136906,136907,136908,136909,136910,136911,136912,136913,136914,136915,136916,136917,136918,136919,136920,136921,136922,136923,136924,136925,136926,136927,136928,136929,136930,136931,136932,136933,136934,136935,136936,136937,136938,136939,136940,136941,136942,136943,136944,136945,136946,136947,136948,136949,136950,136951,136952,136953,136954,136955,136956,136957,136958,136959,136960,136961,136962,136963,136964,136965,136966,136967,136968,136969,136970,136971,136972,136973,136974,136975,136976,136977,136978,136979,136980,136981,136982,136983,136984,136985,136986,136987,136988,136989,136990,136991,136992,136993,136994,136995,136996,136997,136998,136999,137000,137001,137002,137003,137004,137005,137006,137007,137008,137009,137010,137011,137012,137013,137014,137015,137016,137017,137018,137019,137020,137021,137022,137023,137024,137025,137026,137027,137028,137029,137030,137031,137032,137033,137034,137035,137036,137037,137038,137039,137040,137041,137042,137043,137044,137045,137046,137047,137048,137049,137050,137051,137052,137053,137054,137055,137056,137057,137058,137059,137060,137061,137062,137063,137064,137065,137066,137067,137068,137069,137070,137071,137072,137073,137074,137075,137076,137077,137078,137079,137080,137081,137082,137083,137084,137085,137086,137087,137088,137089,137090,137091,137092,137093,137094,137095,137096,137097,137098,137099,137100,137101,137102,137103,137104,137105,137106,137107,137108,137109,137110,137111,137112,137113,137114,137115,137116,137117,137118,137119,137120,137121,137122,137123,137124,137125,137126,137127,137128,137129,137130,137131,137132,137133,137134,137135,137136,137137,137138,137139,137140,137141,137142,137143,137144,137145,137146,137147,137148,137149,137150,137151,137152,137153,137154,137155,137156,137157,137158,137159,137160,137161,137162,137163,137164,137165,137166,137167,137168,137169,137170,137171,137172,137173,137174,137175,137176,137177,137178,137179,137180,137181,137182,137183,137184,137185,137186,137187,137188,137189,137190,137191,137192,137193,137194,137195,137196,137197,137198,137199,137200,137201,137202,137203,137204,137205,137206,137207,137208,137209,137210,137211,137212,137213,137214,137215,137216,137217,137218,137219,137220,137221,137222,137223,137224,137225,137226,137227,137228,137229,137230,137231,137232,137233,137234,137235,137236,137237,137238,137239,137240,137241,137242,137243,137244,137245,137246,137247,137248,137249,137250,137251,137252,137253,137254,137255,137256,137257,137258,137259,137260,137261,137262,137263,137264,137265,137266,137267,137268,137269,137270,137271,137272,137273,137274,137275,137276,137277,137278,137279,137280,137281,137282,137283,137284,137285,137286,137287,137288,137289,137290,137291,137292,137293,137294,137295,137296,137297,137298,137299,137300,137301,137302,137303,137304,137305,137306,137307,137308,137309,137310,137311,137312,137313,137314,137315,137316,137317,137318,137319,137320,137321,137322,137323,137324,137325,137326,137327,137328,137329,137330,137331,137332,137333,137334,137335,137336,137337,137338,137339,137340,137341,137342,137343,137344,137345,137346,137347,137348,137349,137350,137351,137352,137353,137354,137355,137356,137357,137358,137359,137360,137361,137362,137363,137364,137365,137366,137367,137368,137369,137370,137371,137372,137373,137374,137375,137376,137377,137378,137379,137380,137381,137382,137383,137384,137385,137386,137387,137388,137389,137390,137391,137392,137393,137394,137395,137396,137397,137398,137399,137400,137401,137402,137403,137404,137405,137406,137407,137408,137409,137410,137411,137412,137413,137414,137415,137416,137417,137418,137419,137420,137421,137422,137423,137424,137425,137426,137427,137428,137429,137430,137431,137432,137433,137434,137435,137436,137437,137438,137439,137440,137441,137442,137443,137444,137445,137446,137447,137448,137449,137450,137451,137452,137453,137454,137455,137456,137457,137458,137459,137460,137461,137462,137463,137464,137465,137466,137467,137468,137469,137470,137471,137472,137473,137474,137475,137476,137477,137478,137479,137480,137481,137482,137483,137484,137485,137486,137487,137488,137489,137490,137491,137492,137493,137494,137495,137496,137497,137498,137499,137500,137501,137502,137503,137504,137505,137506,137507,137508,137509,137510,137511,137512,137513,137514,137515,137516,137517,137518,137519,137520,137521,137522,137523,137524,137525,137526,137527,137528,137529,137530,137531,137532,137533,137534,137535,137536,137537,137538,137539,137540,137541,137542,137543,137544,137545,137546,137547,137548,137549,137550,137551,137552,137553,137554,137555,137556,137557,137558,137559,137560,137561,137562,137563,137564,137565,137566,137567,137568,137569,137570,137571,137572,137573,137574,137575,137576,137577,137578,137579,137580,137581,137582,137583,137584,137585,137586,137587,137588,137589,137590,137591,137592,137593,137594,137595,137596,137597,137598,137599,137600,137601,137602,137603,137604,137605,137606,137607,137608,137609,137610,137611,137612,137613,137614,137615,137616,137617,137618,137619,137620,137621,137622,137623,137624,137625,137626,137627,137628,137629,137630,137631,137632,137633,137634,137635,137636,137637,137638,137639,137640,137641,137642,137643,137644,137645,137646,137647,137648,137649,137650,137651,137652,137653,137654,137655,137656,137657,137658,137659,137660,137661,137662,137663,137664,137665,137666,137667,137668,137669,137670,137671,137672,137673,137674,137675,137676,137677,137678,137679,137680,137681,137682,137683,137684,137685,137686,137687,137688,137689,137690,137691,137692,137693,137694,137695,137696,137697,137698,137699,137700,137701,137702,137703,137704,137705,137706,137707,137708,137709,137710,137711,137712,137713,137714,137715,137716,137717,137718,137719,137720,137721,137722,137723,137724,137725,137726,137727,137728,137729,137730,137731,137732,137733,137734,137735,137736,137737,137738,137739,137740,137741,137742,137743,137744,137745,137746,137747,137748,137749,137750,137751,137752,137753,137754,137755,137756,137757,137758,137759,137760,137761,137762,137763,137764,137765,137766,137767,137768,137769,137770,137771,137772,137773,137774,137775,137776,137777,137778,137779,137780,137781,137782,137783,137784,137785,137786,137787,137788,137789,137790,137791,137792,137793,137794,137795,137796,137797,137798,137799,137800,137801,137802,137803,137804,137805,137806,137807,137808,137809,137810,137811,137812,137813,137814,137815,137816,137817,137818,137819,137820,137821,137822,137823,137824,137825,137826,137827,137828,137829,137830,137831,137832,137833,137834,137835,137836,137837,137838,137839,137840,137841,137842,137843,137844,137845,137846,137847,137848,137849,137850,137851,137852,137853,137854,137855,137856,137857,137858,137859,137860,137861,137862,137863,137864,137865,137866,137867,137868,137869,137870,137871,137872,137873,137874,137875,137876,137877,137878,137879,137880,137881,137882,137883,137884,137885,137886,137887,137888,137889,137890,137891,137892,137893,137894,137895,137896,137897,137898,137899,137900,137901,137902,137903,137904,137905,137906,137907,137908,137909,137910,137911,137912,137913,137914,137915,137916,137917,137918,137919,137920,137921,137922,137923,137924,137925,137926,137927,137928,137929,137930,137931,137932,137933,137934,137935,137936,137937,137938,137939,137940,137941,137942,137943,137944,137945,137946,137947,137948,137949,137950,137951,137952,137953,137954,137955,137956,137957,137958,137959,137960,137961,137962,137963,137964,137965,137966,137967,137968,137969,137970,137971,137972,137973,137974,137975,137976,137977,137978,137979,137980,137981,137982,137983,137984,137985,137986,137987,137988,137989,137990,137991,137992,137993,137994,137995,137996,137997,137998,137999,138000,138001,138002,138003,138004,138005,138006,138007,138008,138009,138010,138011,138012,138013,138014,138015,138016,138017,138018,138019,138020,138021,138022,138023,138024,138025,138026,138027,138028,138029,138030,138031,138032,138033,138034,138035,138036,138037,138038,138039,138040,138041,138042,138043,138044,138045,138046,138047,138048,138049,138050,138051,138052,138053,138054,138055,138056,138057,138058,138059,138060,138061,138062,138063,138064,138065,138066,138067,138068,138069,138070,138071,138072,138073,138074,138075,138076,138077,138078,138079,138080,138081,138082,138083,138084,138085,138086,138087,138088,138089,138090,138091,138092,138093,138094,138095,138096,138097,138098,138099,138100,138101,138102,138103,138104,138105,138106,138107,138108,138109,138110,138111,138112,138113,138114,138115,138116,138117,138118,138119,138120,138121,138122,138123,138124,138125,138126,138127,138128,138129,138130,138131,138132,138133,138134,138135,138136,138137,138138,138139,138140,138141,138142,138143,138144,138145,138146,138147,138148,138149,138150,138151,138152,138153,138154,138155,138156,138157,138158,138159,138160,138161,138162,138163,138164,138165,138166,138167,138168,138169,138170,138171,138172,138173,138174,138175,138176,138177,138178,138179,138180,138181,138182,138183,138184,138185,138186,138187,138188,138189,138190,138191,138192,138193,138194,138195,138196,138197,138198,138199,138200,138201,138202,138203,138204,138205,138206,138207,138208,138209,138210,138211,138212,138213,138214,138215,138216,138217,138218,138219,138220,138221,138222,138223,138224,138225,138226,138227,138228,138229,138230,138231,138232,138233,138234,138235,138236,138237,138238,138239,138240,138241,138242,138243,138244,138245,138246,138247,138248,138249,138250,138251,138252,138253,138254,138255,138256,138257,138258,138259,138260,138261,138262,138263,138264,138265,138266,138267,138268,138269,138270,138271,138272,138273,138274,138275,138276,138277,138278,138279,138280,138281,138282,138283,138284,138285,138286,138287,138288,138289,138290,138291,138292,138293,138294,138295,138296,138297,138298,138299,138300,138301,138302,138303,138304,138305,138306,138307,138308,138309,138310,138311,138312,138313,138314,138315,138316,138317,138318,138319,138320,138321,138322,138323,138324,138325,138326,138327,138328,138329,138330,138331,138332,138333,138334,138335,138336,138337,138338,138339,138340,138341,138342,138343,138344,138345,138346,138347,138348,138349,138350,138351,138352,138353,138354,138355,138356,138357,138358,138359,138360,138361,138362,138363,138364,138365,138366,138367,138368,138369,138370,138371,138372,138373,138374,138375,138376,138377,138378,138379,138380,138381,138382,138383,138384,138385,138386,138387,138388,138389,138390,138391,138392,138393,138394,138395,138396,138397,138398,138399,138400,138401,138402,138403,138404,138405,138406,138407,138408,138409,138410,138411,138412,138413,138414,138415,138416,138417,138418,138419,138420,138421,138422,138423,138424,138425,138426,138427,138428,138429,138430,138431,138432,138433,138434,138435,138436,138437,138438,138439,138440,138441,138442,138443,138444,138445,138446,138447,138448,138449,138450,138451,138452,138453,138454,138455,138456,138457,138458,138459,138460,138461,138462,138463,138464,138465,138466,138467,138468,138469,138470,138471,138472,138473,138474,138475,138476,138477,138478,138479,138480,138481,138482,138483,138484,138485,138486,138487,138488,138489,138490,138491,138492,138493,138494,138495,138496,138497,138498,138499,138500,138501,138502,138503,138504,138505,138506,138507,138508,138509,138510,138511,138512,138513,138514,138515,138516,138517,138518,138519,138520,138521,138522,138523,138524,138525,138526,138527,138528,138529,138530,138531,138532,138533,138534,138535,138536,138537,138538,138539,138540,138541,138542,138543,138544,138545,138546,138547,138548,138549,138550,138551,138552,138553,138554,138555,138556,138557,138558,138559,138560,138561,138562,138563,138564,138565,138566,138567,138568,138569,138570,138571,138572,138573,138574,138575,138576,138577,138578,138579,138580,138581,138582,138583,138584,138585,138586,138587,138588,138589,138590,138591,138592,138593,138594,138595,138596,138597,138598,138599,138600,138601,138602,138603,138604,138605,138606,138607,138608,138609,138610,138611,138612,138613,138614,138615,138616,138617,138618,138619,138620,138621,138622,138623,138624,138625,138626,138627,138628,138629,138630,138631,138632,138633,138634,138635,138636,138637,138638,138639,138640,138641,138642,138643,138644,138645,138646,138647,138648,138649,138650,138651,138652,138653,138654,138655,138656,138657,138658,138659,138660,138661,138662,138663,138664,138665,138666,138667,138668,138669,138670,138671,138672,138673,138674,138675,138676,138677,138678,138679,138680,138681,138682,138683,138684,138685,138686,138687,138688,138689,138690,138691,138692,138693,138694,138695,138696,138697,138698,138699,138700,138701,138702,138703,138704,138705,138706,138707,138708,138709,138710,138711,138712,138713,138714,138715,138716,138717,138718,138719,138720,138721,138722,138723,138724,138725,138726,138727,138728,138729,138730,138731,138732,138733,138734,138735,138736,138737,138738,138739,138740,138741,138742,138743,138744,138745,138746,138747,138748,138749,138750,138751,138752,138753,138754,138755,138756,138757,138758,138759,138760,138761,138762,138763,138764,138765,138766,138767,138768,138769,138770,138771,138772,138773,138774,138775,138776,138777,138778,138779,138780,138781,138782,138783,138784,138785,138786,138787,138788,138789,138790,138791,138792,138793,138794,138795,138796,138797,138798,138799,138800,138801,138802,138803,138804,138805,138806,138807,138808,138809,138810,138811,138812,138813,138814,138815,138816,138817,138818,138819,138820,138821,138822,138823,138824,138825,138826,138827,138828,138829,138830,138831,138832,138833,138834,138835,138836,138837,138838,138839,138840,138841,138842,138843,138844,138845,138846,138847,138848,138849,138850,138851,138852,138853,138854,138855,138856,138857,138858,138859,138860,138861,138862,138863,138864,138865,138866,138867,138868,138869,138870,138871,138872,138873,138874,138875,138876,138877,138878,138879,138880,138881,138882,138883,138884,138885,138886,138887,138888,138889,138890,138891,138892,138893,138894,138895,138896,138897,138898,138899,138900,138901,138902,138903,138904,138905,138906,138907,138908,138909,138910,138911,138912,138913,138914,138915,138916,138917,138918,138919,138920,138921,138922,138923,138924,138925,138926,138927,138928,138929,138930,138931,138932,138933,138934,138935,138936,138937,138938,138939,138940,138941,138942,138943,138944,138945,138946,138947,138948,138949,138950,138951,138952,138953,138954,138955,138956,138957,138958,138959,138960,138961,138962,138963,138964,138965,138966,138967,138968,138969,138970,138971,138972,138973,138974,138975,138976,138977,138978,138979,138980,138981,138982,138983,138984,138985,138986,138987,138988,138989,138990,138991,138992,138993,138994,138995,138996,138997,138998,138999,139000,139001,139002,139003,139004,139005,139006,139007,139008,139009,139010,139011,139012,139013,139014,139015,139016,139017,139018,139019,139020,139021,139022,139023,139024,139025,139026,139027,139028,139029,139030,139031,139032,139033,139034,139035,139036,139037,139038,139039,139040,139041,139042,139043,139044,139045,139046,139047,139048,139049,139050,139051,139052,139053,139054,139055,139056,139057,139058,139059,139060,139061,139062,139063,139064,139065,139066,139067,139068,139069,139070,139071,139072,139073,139074,139075,139076,139077,139078,139079,139080,139081,139082,139083,139084,139085,139086,139087,139088,139089,139090,139091,139092,139093,139094,139095,139096,139097,139098,139099,139100,139101,139102,139103,139104,139105,139106,139107,139108,139109,139110,139111,139112,139113,139114,139115,139116,139117,139118,139119,139120,139121,139122,139123,139124,139125,139126,139127,139128,139129,139130,139131,139132,139133,139134,139135,139136,139137,139138,139139,139140,139141,139142,139143,139144,139145,139146,139147,139148,139149,139150,139151,139152,139153,139154,139155,139156,139157,139158,139159,139160,139161,139162,139163,139164,139165,139166,139167,139168,139169,139170,139171,139172,139173,139174,139175,139176,139177,139178,139179,139180,139181,139182,139183,139184,139185,139186,139187,139188,139189,139190,139191,139192,139193,139194,139195,139196,139197,139198,139199,139200,139201,139202,139203,139204,139205,139206,139207,139208,139209,139210,139211,139212,139213,139214,139215,139216,139217,139218,139219,139220,139221,139222,139223,139224,139225,139226,139227,139228,139229,139230,139231,139232,139233,139234,139235,139236,139237,139238,139239,139240,139241,139242,139243,139244,139245,139246,139247,139248,139249,139250,139251,139252,139253,139254,139255,139256,139257,139258,139259,139260,139261,139262,139263,139264,139265,139266,139267,139268,139269,139270,139271,139272,139273,139274,139275,139276,139277,139278,139279,139280,139281,139282,139283,139284,139285,139286,139287,139288,139289,139290,139291,139292,139293,139294,139295,139296,139297,139298,139299,139300,139301,139302,139303,139304,139305,139306,139307,139308,139309,139310,139311,139312,139313,139314,139315,139316,139317,139318,139319,139320,139321,139322,139323,139324,139325,139326,139327,139328,139329,139330,139331,139332,139333,139334,139335,139336,139337,139338,139339,139340,139341,139342,139343,139344,139345,139346,139347,139348,139349,139350,139351,139352,139353,139354,139355,139356,139357,139358,139359,139360,139361,139362,139363,139364,139365,139366,139367,139368,139369,139370,139371,139372,139373,139374,139375,139376,139377,139378,139379,139380,139381,139382,139383,139384,139385,139386,139387,139388,139389,139390,139391,139392,139393,139394,139395,139396,139397,139398,139399,139400,139401,139402,139403,139404,139405,139406,139407,139408,139409,139410,139411,139412,139413,139414,139415,139416,139417,139418,139419,139420,139421,139422,139423,139424,139425,139426,139427,139428,139429,139430,139431,139432,139433,139434,139435,139436,139437,139438,139439,139440,139441,139442,139443,139444,139445,139446,139447,139448,139449,139450,139451,139452,139453,139454,139455,139456,139457,139458,139459,139460,139461,139462,139463,139464,139465,139466,139467,139468,139469,139470,139471,139472,139473,139474,139475,139476,139477,139478,139479,139480,139481,139482,139483,139484,139485,139486,139487,139488,139489,139490,139491,139492,139493,139494,139495,139496,139497,139498,139499,139500,139501,139502,139503,139504,139505,139506,139507,139508,139509,139510,139511,139512,139513,139514,139515,139516,139517,139518,139519,139520,139521,139522,139523,139524,139525,139526,139527,139528,139529,139530,139531,139532,139533,139534,139535,139536,139537,139538,139539,139540,139541,139542,139543,139544,139545,139546,139547,139548,139549,139550,139551,139552,139553,139554,139555,139556,139557,139558,139559,139560,139561,139562,139563,139564,139565,139566,139567,139568,139569,139570,139571,139572,139573,139574,139575,139576,139577,139578,139579,139580,139581,139582,139583,139584,139585,139586,139587,139588,139589,139590,139591,139592,139593,139594,139595,139596,139597,139598,139599,139600,139601,139602,139603,139604,139605,139606,139607,139608,139609,139610,139611,139612,139613,139614,139615,139616,139617,139618,139619,139620,139621,139622,139623,139624,139625,139626,139627,139628,139629,139630,139631,139632,139633,139634,139635,139636,139637,139638,139639,139640,139641,139642,139643,139644,139645,139646,139647,139648,139649,139650,139651,139652,139653,139654,139655,139656,139657,139658,139659,139660,139661,139662,139663,139664,139665,139666,139667,139668,139669,139670,139671,139672,139673,139674,139675,139676,139677,139678,139679,139680,139681,139682,139683,139684,139685,139686,139687,139688,139689,139690,139691,139692,139693,139694,139695,139696,139697,139698,139699,139700,139701,139702,139703,139704,139705,139706,139707,139708,139709,139710,139711,139712,139713,139714,139715,139716,139717,139718,139719,139720,139721,139722,139723,139724,139725,139726,139727,139728,139729,139730,139731,139732,139733,139734,139735,139736,139737,139738,139739,139740,139741,139742,139743,139744,139745,139746,139747,139748,139749,139750,139751,139752,139753,139754,139755,139756,139757,139758,139759,139760,139761,139762,139763,139764,139765,139766,139767,139768,139769,139770,139771,139772,139773,139774,139775,139776,139777,139778,139779,139780,139781,139782,139783,139784,139785,139786,139787,139788,139789,139790,139791,139792,139793,139794,139795,139796,139797,139798,139799,139800,139801,139802,139803,139804,139805,139806,139807,139808,139809,139810,139811,139812,139813,139814,139815,139816,139817,139818,139819,139820,139821,139822,139823,139824,139825,139826,139827,139828,139829,139830,139831,139832,139833,139834,139835,139836,139837,139838,139839,139840,139841,139842,139843,139844,139845,139846,139847,139848,139849,139850,139851,139852,139853,139854,139855,139856,139857,139858,139859,139860,139861,139862,139863,139864,139865,139866,139867,139868,139869,139870,139871,139872,139873,139874,139875,139876,139877,139878,139879,139880,139881,139882,139883,139884,139885,139886,139887,139888,139889,139890,139891,139892,139893,139894,139895,139896,139897,139898,139899,139900,139901,139902,139903,139904,139905,139906,139907,139908,139909,139910,139911,139912,139913,139914,139915,139916,139917,139918,139919,139920,139921,139922,139923,139924,139925,139926,139927,139928,139929,139930,139931,139932,139933,139934,139935,139936,139937,139938,139939,139940,139941,139942,139943,139944,139945,139946,139947,139948,139949,139950,139951,139952,139953,139954,139955,139956,139957,139958,139959,139960,139961,139962,139963,139964,139965,139966,139967,139968,139969,139970,139971,139972,139973,139974,139975,139976,139977,139978,139979,139980,139981,139982,139983,139984,139985,139986,139987,139988,139989,139990,139991,139992,139993,139994,139995,139996,139997,139998,139999,140000,140001,140002,140003,140004,140005,140006,140007,140008,140009,140010,140011,140012,140013,140014,140015,140016,140017,140018,140019,140020,140021,140022,140023,140024,140025,140026,140027,140028,140029,140030,140031,140032,140033,140034,140035,140036,140037,140038,140039,140040,140041,140042,140043,140044,140045,140046,140047,140048,140049,140050,140051,140052,140053,140054,140055,140056,140057,140058,140059,140060,140061,140062,140063,140064,140065,140066,140067,140068,140069,140070,140071,140072,140073,140074,140075,140076,140077,140078,140079,140080,140081,140082,140083,140084,140085,140086,140087,140088,140089,140090,140091,140092,140093,140094,140095,140096,140097,140098,140099,140100,140101,140102,140103,140104,140105,140106,140107,140108,140109,140110,140111,140112,140113,140114,140115,140116,140117,140118,140119,140120,140121,140122,140123,140124,140125,140126,140127,140128,140129,140130,140131,140132,140133,140134,140135,140136,140137,140138,140139,140140,140141,140142,140143,140144,140145,140146,140147,140148,140149,140150,140151,140152,140153,140154,140155,140156,140157,140158,140159,140160,140161,140162,140163,140164,140165,140166,140167,140168,140169,140170,140171,140172,140173,140174,140175,140176,140177,140178,140179,140180,140181,140182,140183,140184,140185,140186,140187,140188,140189,140190,140191,140192,140193,140194,140195,140196,140197,140198,140199,140200,140201,140202,140203,140204,140205,140206,140207,140208,140209,140210,140211,140212,140213,140214,140215,140216,140217,140218,140219,140220,140221,140222,140223,140224,140225,140226,140227,140228,140229,140230,140231,140232,140233,140234,140235,140236,140237,140238,140239,140240,140241,140242,140243,140244,140245,140246,140247,140248,140249,140250,140251,140252,140253,140254,140255,140256,140257,140258,140259,140260,140261,140262,140263,140264,140265,140266,140267,140268,140269,140270,140271,140272,140273,140274,140275,140276,140277,140278,140279,140280,140281,140282,140283,140284,140285,140286,140287,140288,140289,140290,140291,140292,140293,140294,140295,140296,140297,140298,140299,140300,140301,140302,140303,140304,140305,140306,140307,140308,140309,140310,140311,140312,140313,140314,140315,140316,140317,140318,140319,140320,140321,140322,140323,140324,140325,140326,140327,140328,140329,140330,140331,140332,140333,140334,140335,140336,140337,140338,140339,140340,140341,140342,140343,140344,140345,140346,140347,140348,140349,140350,140351,140352,140353,140354,140355,140356,140357,140358,140359,140360,140361,140362,140363,140364,140365,140366,140367,140368,140369,140370,140371,140372,140373,140374,140375,140376,140377,140378,140379,140380,140381,140382,140383,140384,140385,140386,140387,140388,140389,140390,140391,140392,140393,140394,140395,140396,140397,140398,140399,140400,140401,140402,140403,140404,140405,140406,140407,140408,140409,140410,140411,140412,140413,140414,140415,140416,140417,140418,140419,140420,140421,140422,140423,140424,140425,140426,140427,140428,140429,140430,140431,140432,140433,140434,140435,140436,140437,140438,140439,140440,140441,140442,140443,140444,140445,140446,140447,140448,140449,140450,140451,140452,140453,140454,140455,140456,140457,140458,140459,140460,140461,140462,140463,140464,140465,140466,140467,140468,140469,140470,140471,140472,140473,140474,140475,140476,140477,140478,140479,140480,140481,140482,140483,140484,140485,140486,140487,140488,140489,140490,140491,140492,140493,140494,140495,140496,140497,140498,140499,140500,140501,140502,140503,140504,140505,140506,140507,140508,140509,140510,140511,140512,140513,140514,140515,140516,140517,140518,140519,140520,140521,140522,140523,140524,140525,140526,140527,140528,140529,140530,140531,140532,140533,140534,140535,140536,140537,140538,140539,140540,140541,140542,140543,140544,140545,140546,140547,140548,140549,140550,140551,140552,140553,140554,140555,140556,140557,140558,140559,140560,140561,140562,140563,140564,140565,140566,140567,140568,140569,140570,140571,140572,140573,140574,140575,140576,140577,140578,140579,140580,140581,140582,140583,140584,140585,140586,140587,140588,140589,140590,140591,140592,140593,140594,140595,140596,140597,140598,140599,140600,140601,140602,140603,140604,140605,140606,140607,140608,140609,140610,140611,140612,140613,140614,140615,140616,140617,140618,140619,140620,140621,140622,140623,140624,140625,140626,140627,140628,140629,140630,140631,140632,140633,140634,140635,140636,140637,140638,140639,140640,140641,140642,140643,140644,140645,140646,140647,140648,140649,140650,140651,140652,140653,140654,140655,140656,140657,140658,140659,140660,140661,140662,140663,140664,140665,140666,140667,140668,140669,140670,140671,140672,140673,140674,140675,140676,140677,140678,140679,140680,140681,140682,140683,140684,140685,140686,140687,140688,140689,140690,140691,140692,140693,140694,140695,140696,140697,140698,140699,140700,140701,140702,140703,140704,140705,140706,140707,140708,140709,140710,140711,140712,140713,140714,140715,140716,140717,140718,140719,140720,140721,140722,140723,140724,140725,140726,140727,140728,140729,140730,140731,140732,140733,140734,140735,140736,140737,140738,140739,140740,140741,140742,140743,140744,140745,140746,140747,140748,140749,140750,140751,140752,140753,140754,140755,140756,140757,140758,140759,140760,140761,140762,140763,140764,140765,140766,140767,140768,140769,140770,140771,140772,140773,140774,140775,140776,140777,140778,140779,140780,140781,140782,140783,140784,140785,140786,140787,140788,140789,140790,140791,140792,140793,140794,140795,140796,140797,140798,140799,140800,140801,140802,140803,140804,140805,140806,140807,140808,140809,140810,140811,140812,140813,140814,140815,140816,140817,140818,140819,140820,140821,140822,140823,140824,140825,140826,140827,140828,140829,140830,140831,140832,140833,140834,140835,140836,140837,140838,140839,140840,140841,140842,140843,140844,140845,140846,140847,140848,140849,140850,140851,140852,140853,140854,140855,140856,140857,140858,140859,140860,140861,140862,140863,140864,140865,140866,140867,140868,140869,140870,140871,140872,140873,140874,140875,140876,140877,140878,140879,140880,140881,140882,140883,140884,140885,140886,140887,140888,140889,140890,140891,140892,140893,140894,140895,140896,140897,140898,140899,140900,140901,140902,140903,140904,140905,140906,140907,140908,140909,140910,140911,140912,140913,140914,140915,140916,140917,140918,140919,140920,140921,140922,140923,140924,140925,140926,140927,140928,140929,140930,140931,140932,140933,140934,140935,140936,140937,140938,140939,140940,140941,140942,140943,140944,140945,140946,140947,140948,140949,140950,140951,140952,140953,140954,140955,140956,140957,140958,140959,140960,140961,140962,140963,140964,140965,140966,140967,140968,140969,140970,140971,140972,140973,140974,140975,140976,140977,140978,140979,140980,140981,140982,140983,140984,140985,140986,140987,140988,140989,140990,140991,140992,140993,140994,140995,140996,140997,140998,140999,141000,141001,141002,141003,141004,141005,141006,141007,141008,141009,141010,141011,141012,141013,141014,141015,141016,141017,141018,141019,141020,141021,141022,141023,141024,141025,141026,141027,141028,141029,141030,141031,141032,141033,141034,141035,141036,141037,141038,141039,141040,141041,141042,141043,141044,141045,141046,141047,141048,141049,141050,141051,141052,141053,141054,141055,141056,141057,141058,141059,141060,141061,141062,141063,141064,141065,141066,141067,141068,141069,141070,141071,141072,141073,141074,141075,141076,141077,141078,141079,141080,141081,141082,141083,141084,141085,141086,141087,141088,141089,141090,141091,141092,141093,141094,141095,141096,141097,141098,141099,141100,141101,141102,141103,141104,141105,141106,141107,141108,141109,141110,141111,141112,141113,141114,141115,141116,141117,141118,141119,141120,141121,141122,141123,141124,141125,141126,141127,141128,141129,141130,141131,141132,141133,141134,141135,141136,141137,141138,141139,141140,141141,141142,141143,141144,141145,141146,141147,141148,141149,141150,141151,141152,141153,141154,141155,141156,141157,141158,141159,141160,141161,141162,141163,141164,141165,141166,141167,141168,141169,141170,141171,141172,141173,141174,141175,141176,141177,141178,141179,141180,141181,141182,141183,141184,141185,141186,141187,141188,141189,141190,141191,141192,141193,141194,141195,141196,141197,141198,141199,141200,141201,141202,141203,141204,141205,141206,141207,141208,141209,141210,141211,141212,141213,141214,141215,141216,141217,141218,141219,141220,141221,141222,141223,141224,141225,141226,141227,141228,141229,141230,141231,141232,141233,141234,141235,141236,141237,141238,141239,141240,141241,141242,141243,141244,141245,141246,141247,141248,141249,141250,141251,141252,141253,141254,141255,141256,141257,141258,141259,141260,141261,141262,141263,141264,141265,141266,141267,141268,141269,141270,141271,141272,141273,141274,141275,141276,141277,141278,141279,141280,141281,141282,141283,141284,141285,141286,141287,141288,141289,141290,141291,141292,141293,141294,141295,141296,141297,141298,141299,141300,141301,141302,141303,141304,141305,141306,141307,141308,141309,141310,141311,141312,141313,141314,141315,141316,141317,141318,141319,141320,141321,141322,141323,141324,141325,141326,141327,141328,141329,141330,141331,141332,141333,141334,141335,141336,141337,141338,141339,141340,141341,141342,141343,141344,141345,141346,141347,141348,141349,141350,141351,141352,141353,141354,141355,141356,141357,141358,141359,141360,141361,141362,141363,141364,141365,141366,141367,141368,141369,141370,141371,141372,141373,141374,141375,141376,141377,141378,141379,141380,141381,141382,141383,141384,141385,141386,141387,141388,141389,141390,141391,141392,141393,141394,141395,141396,141397,141398,141399,141400,141401,141402,141403,141404,141405,141406,141407,141408,141409,141410,141411,141412,141413,141414,141415,141416,141417,141418,141419,141420,141421,141422,141423,141424,141425,141426,141427,141428,141429,141430,141431,141432,141433,141434,141435,141436,141437,141438,141439,141440,141441,141442,141443,141444,141445,141446,141447,141448,141449,141450,141451,141452,141453,141454,141455,141456,141457,141458,141459,141460,141461,141462,141463,141464,141465,141466,141467,141468,141469,141470,141471,141472,141473,141474,141475,141476,141477,141478,141479,141480,141481,141482,141483,141484,141485,141486,141487,141488,141489,141490,141491,141492,141493,141494,141495,141496,141497,141498,141499,141500,141501,141502,141503,141504,141505,141506,141507,141508,141509,141510,141511,141512,141513,141514,141515,141516,141517,141518,141519,141520,141521,141522,141523,141524,141525,141526,141527,141528,141529,141530,141531,141532,141533,141534,141535,141536,141537,141538,141539,141540,141541,141542,141543,141544,141545,141546,141547,141548,141549,141550,141551,141552,141553,141554,141555,141556,141557,141558,141559,141560,141561,141562,141563,141564,141565,141566,141567,141568,141569,141570,141571,141572,141573,141574,141575,141576,141577,141578,141579,141580,141581,141582,141583,141584,141585,141586,141587,141588,141589,141590,141591,141592,141593,141594,141595,141596,141597,141598,141599,141600,141601,141602,141603,141604,141605,141606,141607,141608,141609,141610,141611,141612,141613,141614,141615,141616,141617,141618,141619,141620,141621,141622,141623,141624,141625,141626,141627,141628,141629,141630,141631,141632,141633,141634,141635,141636,141637,141638,141639,141640,141641,141642,141643,141644,141645,141646,141647,141648,141649,141650,141651,141652,141653,141654,141655,141656,141657,141658,141659,141660,141661,141662,141663,141664,141665,141666,141667,141668,141669,141670,141671,141672,141673,141674,141675,141676,141677,141678,141679,141680,141681,141682,141683,141684,141685,141686,141687,141688,141689,141690,141691,141692,141693,141694,141695,141696,141697,141698,141699,141700,141701,141702,141703,141704,141705,141706,141707,141708,141709,141710,141711,141712,141713,141714,141715,141716,141717,141718,141719,141720,141721,141722,141723,141724,141725,141726,141727,141728,141729,141730,141731,141732,141733,141734,141735,141736,141737,141738,141739,141740,141741,141742,141743,141744,141745,141746,141747,141748,141749,141750,141751,141752,141753,141754,141755,141756,141757,141758,141759,141760,141761,141762,141763,141764,141765,141766,141767,141768,141769,141770,141771,141772,141773,141774,141775,141776,141777,141778,141779,141780,141781,141782,141783,141784,141785,141786,141787,141788,141789,141790,141791,141792,141793,141794,141795,141796,141797,141798,141799,141800,141801,141802,141803,141804,141805,141806,141807,141808,141809,141810,141811,141812,141813,141814,141815,141816,141817,141818,141819,141820,141821,141822,141823,141824,141825,141826,141827,141828,141829,141830,141831,141832,141833,141834,141835,141836,141837,141838,141839,141840,141841,141842,141843,141844,141845,141846,141847,141848,141849,141850,141851,141852,141853,141854,141855,141856,141857,141858,141859,141860,141861,141862,141863,141864,141865,141866,141867,141868,141869,141870,141871,141872,141873,141874,141875,141876,141877,141878,141879,141880,141881,141882,141883,141884,141885,141886,141887,141888,141889,141890,141891,141892,141893,141894,141895,141896,141897,141898,141899,141900,141901,141902,141903,141904,141905,141906,141907,141908,141909,141910,141911,141912,141913,141914,141915,141916,141917,141918,141919,141920,141921,141922,141923,141924,141925,141926,141927,141928,141929,141930,141931,141932,141933,141934,141935,141936,141937,141938,141939,141940,141941,141942,141943,141944,141945,141946,141947,141948,141949,141950,141951,141952,141953,141954,141955,141956,141957,141958,141959,141960,141961,141962,141963,141964,141965,141966,141967,141968,141969,141970,141971,141972,141973,141974,141975,141976,141977,141978,141979,141980,141981,141982,141983,141984,141985,141986,141987,141988,141989,141990,141991,141992,141993,141994,141995,141996,141997,141998,141999,142000,142001,142002,142003,142004,142005,142006,142007,142008,142009,142010,142011,142012,142013,142014,142015,142016,142017,142018,142019,142020,142021,142022,142023,142024,142025,142026,142027,142028,142029,142030,142031,142032,142033,142034,142035,142036,142037,142038,142039,142040,142041,142042,142043,142044,142045,142046,142047,142048,142049,142050,142051,142052,142053,142054,142055,142056,142057,142058,142059,142060,142061,142062,142063,142064,142065,142066,142067,142068,142069,142070,142071,142072,142073,142074,142075,142076,142077,142078,142079,142080,142081,142082,142083,142084,142085,142086,142087,142088,142089,142090,142091,142092,142093,142094,142095,142096,142097,142098,142099,142100,142101,142102,142103,142104,142105,142106,142107,142108,142109,142110,142111,142112,142113,142114,142115,142116,142117,142118,142119,142120,142121,142122,142123,142124,142125,142126,142127,142128,142129,142130,142131,142132,142133,142134,142135,142136,142137,142138,142139,142140,142141,142142,142143,142144,142145,142146,142147,142148,142149,142150,142151,142152,142153,142154,142155,142156,142157,142158,142159,142160,142161,142162,142163,142164,142165,142166,142167,142168,142169,142170,142171,142172,142173,142174,142175,142176,142177,142178,142179,142180,142181,142182,142183,142184,142185,142186,142187,142188,142189,142190,142191,142192,142193,142194,142195,142196,142197,142198,142199,142200,142201,142202,142203,142204,142205,142206,142207,142208,142209,142210,142211,142212,142213,142214,142215,142216,142217,142218,142219,142220,142221,142222,142223,142224,142225,142226,142227,142228,142229,142230,142231,142232,142233,142234,142235,142236,142237,142238,142239,142240,142241,142242,142243,142244,142245,142246,142247,142248,142249,142250,142251,142252,142253,142254,142255,142256,142257,142258,142259,142260,142261,142262,142263,142264,142265,142266,142267,142268,142269,142270,142271,142272,142273,142274,142275,142276,142277,142278,142279,142280,142281,142282,142283,142284,142285,142286,142287,142288,142289,142290,142291,142292,142293,142294,142295,142296,142297,142298,142299,142300,142301,142302,142303,142304,142305,142306,142307,142308,142309,142310,142311,142312,142313,142314,142315,142316,142317,142318,142319,142320,142321,142322,142323,142324,142325,142326,142327,142328,142329,142330,142331,142332,142333,142334,142335,142336,142337,142338,142339,142340,142341,142342,142343,142344,142345,142346,142347,142348,142349,142350,142351,142352,142353,142354,142355,142356,142357,142358,142359,142360,142361,142362,142363,142364,142365,142366,142367,142368,142369,142370,142371,142372,142373,142374,142375,142376,142377,142378,142379,142380,142381,142382,142383,142384,142385,142386,142387,142388,142389,142390,142391,142392,142393,142394,142395,142396,142397,142398,142399,142400,142401,142402,142403,142404,142405,142406,142407,142408,142409,142410,142411,142412,142413,142414,142415,142416,142417,142418,142419,142420,142421,142422,142423,142424,142425,142426,142427,142428,142429,142430,142431,142432,142433,142434,142435,142436,142437,142438,142439,142440,142441,142442,142443,142444,142445,142446,142447,142448,142449,142450,142451,142452,142453,142454,142455,142456,142457,142458,142459,142460,142461,142462,142463,142464,142465,142466,142467,142468,142469,142470,142471,142472,142473,142474,142475,142476,142477,142478,142479,142480,142481,142482,142483,142484,142485,142486,142487,142488,142489,142490,142491,142492,142493,142494,142495,142496,142497,142498,142499,142500,142501,142502,142503,142504,142505,142506,142507,142508,142509,142510,142511,142512,142513,142514,142515,142516,142517,142518,142519,142520,142521,142522,142523,142524,142525,142526,142527,142528,142529,142530,142531,142532,142533,142534,142535,142536,142537,142538,142539,142540,142541,142542,142543,142544,142545,142546,142547,142548,142549,142550,142551,142552,142553,142554,142555,142556,142557,142558,142559,142560,142561,142562,142563,142564,142565,142566,142567,142568,142569,142570,142571,142572,142573,142574,142575,142576,142577,142578,142579,142580,142581,142582,142583,142584,142585,142586,142587,142588,142589,142590,142591,142592,142593,142594,142595,142596,142597,142598,142599,142600,142601,142602,142603,142604,142605,142606,142607,142608,142609,142610,142611,142612,142613,142614,142615,142616,142617,142618,142619,142620,142621,142622,142623,142624,142625,142626,142627,142628,142629,142630,142631,142632,142633,142634,142635,142636,142637,142638,142639,142640,142641,142642,142643,142644,142645,142646,142647,142648,142649,142650,142651,142652,142653,142654,142655,142656,142657,142658,142659,142660,142661,142662,142663,142664,142665,142666,142667,142668,142669,142670,142671,142672,142673,142674,142675,142676,142677,142678,142679,142680,142681,142682,142683,142684,142685,142686,142687,142688,142689,142690,142691,142692,142693,142694,142695,142696,142697,142698,142699,142700,142701,142702,142703,142704,142705,142706,142707,142708,142709,142710,142711,142712,142713,142714,142715,142716,142717,142718,142719,142720,142721,142722,142723,142724,142725,142726,142727,142728,142729,142730,142731,142732,142733,142734,142735,142736,142737,142738,142739,142740,142741,142742,142743,142744,142745,142746,142747,142748,142749,142750,142751,142752,142753,142754,142755,142756,142757,142758,142759,142760,142761,142762,142763,142764,142765,142766,142767,142768,142769,142770,142771,142772,142773,142774,142775,142776,142777,142778,142779,142780,142781,142782,142783,142784,142785,142786,142787,142788,142789,142790,142791,142792,142793,142794,142795,142796,142797,142798,142799,142800,142801,142802,142803,142804,142805,142806,142807,142808,142809,142810,142811,142812,142813,142814,142815,142816,142817,142818,142819,142820,142821,142822,142823,142824,142825,142826,142827,142828,142829,142830,142831,142832,142833,142834,142835,142836,142837,142838,142839,142840,142841,142842,142843,142844,142845,142846,142847,142848,142849,142850,142851,142852,142853,142854,142855,142856,142857,142858,142859,142860,142861,142862,142863,142864,142865,142866,142867,142868,142869,142870,142871,142872,142873,142874,142875,142876,142877,142878,142879,142880,142881,142882,142883,142884,142885,142886,142887,142888,142889,142890,142891,142892,142893,142894,142895,142896,142897,142898,142899,142900,142901,142902,142903,142904,142905,142906,142907,142908,142909,142910,142911,142912,142913,142914,142915,142916,142917,142918,142919,142920,142921,142922,142923,142924,142925,142926,142927,142928,142929,142930,142931,142932,142933,142934,142935,142936,142937,142938,142939,142940,142941,142942,142943,142944,142945,142946,142947,142948,142949,142950,142951,142952,142953,142954,142955,142956,142957,142958,142959,142960,142961,142962,142963,142964,142965,142966,142967,142968,142969,142970,142971,142972,142973,142974,142975,142976,142977,142978,142979,142980,142981,142982,142983,142984,142985,142986,142987,142988,142989,142990,142991,142992,142993,142994,142995,142996,142997,142998,142999,143000,143001,143002,143003,143004,143005,143006,143007,143008,143009,143010,143011,143012,143013,143014,143015,143016,143017,143018,143019,143020,143021,143022,143023,143024,143025,143026,143027,143028,143029,143030,143031,143032,143033,143034,143035,143036,143037,143038,143039,143040,143041,143042,143043,143044,143045,143046,143047,143048,143049,143050,143051,143052,143053,143054,143055,143056,143057,143058,143059,143060,143061,143062,143063,143064,143065,143066,143067,143068,143069,143070,143071,143072,143073,143074,143075,143076,143077,143078,143079,143080,143081,143082,143083,143084,143085,143086,143087,143088,143089,143090,143091,143092,143093,143094,143095,143096,143097,143098,143099,143100,143101,143102,143103,143104,143105,143106,143107,143108,143109,143110,143111,143112,143113,143114,143115,143116,143117,143118,143119,143120,143121,143122,143123,143124,143125,143126,143127,143128,143129,143130,143131,143132,143133,143134,143135,143136,143137,143138,143139,143140,143141,143142,143143,143144,143145,143146,143147,143148,143149,143150,143151,143152,143153,143154,143155,143156,143157,143158,143159,143160,143161,143162,143163,143164,143165,143166,143167,143168,143169,143170,143171,143172,143173,143174,143175,143176,143177,143178,143179,143180,143181,143182,143183,143184,143185,143186,143187,143188,143189,143190,143191,143192,143193,143194,143195,143196,143197,143198,143199,143200,143201,143202,143203,143204,143205,143206,143207,143208,143209,143210,143211,143212,143213,143214,143215,143216,143217,143218,143219,143220,143221,143222,143223,143224,143225,143226,143227,143228,143229,143230,143231,143232,143233,143234,143235,143236,143237,143238,143239,143240,143241,143242,143243,143244,143245,143246,143247,143248,143249,143250,143251,143252,143253,143254,143255,143256,143257,143258,143259,143260,143261,143262,143263,143264,143265,143266,143267,143268,143269,143270,143271,143272,143273,143274,143275,143276,143277,143278,143279,143280,143281,143282,143283,143284,143285,143286,143287,143288,143289,143290,143291,143292,143293,143294,143295,143296,143297,143298,143299,143300,143301,143302,143303,143304,143305,143306,143307,143308,143309,143310,143311,143312,143313,143314,143315,143316,143317,143318,143319,143320,143321,143322,143323,143324,143325,143326,143327,143328,143329,143330,143331,143332,143333,143334,143335,143336,143337,143338,143339,143340,143341,143342,143343,143344,143345,143346,143347,143348,143349,143350,143351,143352,143353,143354,143355,143356,143357,143358,143359,143360,143361,143362,143363,143364,143365,143366,143367,143368,143369,143370,143371,143372,143373,143374,143375,143376,143377,143378,143379,143380,143381,143382,143383,143384,143385,143386,143387,143388,143389,143390,143391,143392,143393,143394,143395,143396,143397,143398,143399,143400,143401,143402,143403,143404,143405,143406,143407,143408,143409,143410,143411,143412,143413,143414,143415,143416,143417,143418,143419,143420,143421,143422,143423,143424,143425,143426,143427,143428,143429,143430,143431,143432,143433,143434,143435,143436,143437,143438,143439,143440,143441,143442,143443,143444,143445,143446,143447,143448,143449,143450,143451,143452,143453,143454,143455,143456,143457,143458,143459,143460,143461,143462,143463,143464,143465,143466,143467,143468,143469,143470,143471,143472,143473,143474,143475,143476,143477,143478,143479,143480,143481,143482,143483,143484,143485,143486,143487,143488,143489,143490,143491,143492,143493,143494,143495,143496,143497,143498,143499,143500,143501,143502,143503,143504,143505,143506,143507,143508,143509,143510,143511,143512,143513,143514,143515,143516,143517,143518,143519,143520,143521,143522,143523,143524,143525,143526,143527,143528,143529,143530,143531,143532,143533,143534,143535,143536,143537,143538,143539,143540,143541,143542,143543,143544,143545,143546,143547,143548,143549,143550,143551,143552,143553,143554,143555,143556,143557,143558,143559,143560,143561,143562,143563,143564,143565,143566,143567,143568,143569,143570,143571,143572,143573,143574,143575,143576,143577,143578,143579,143580,143581,143582,143583,143584,143585,143586,143587,143588,143589,143590,143591,143592,143593,143594,143595,143596,143597,143598,143599,143600,143601,143602,143603,143604,143605,143606,143607,143608,143609,143610,143611,143612,143613,143614,143615,143616,143617,143618,143619,143620,143621,143622,143623,143624,143625,143626,143627,143628,143629,143630,143631,143632,143633,143634,143635,143636,143637,143638,143639,143640,143641,143642,143643,143644,143645,143646,143647,143648,143649,143650,143651,143652,143653,143654,143655,143656,143657,143658,143659,143660,143661,143662,143663,143664,143665,143666,143667,143668,143669,143670,143671,143672,143673,143674,143675,143676,143677,143678,143679,143680,143681,143682,143683,143684,143685,143686,143687,143688,143689,143690,143691,143692,143693,143694,143695,143696,143697,143698,143699,143700,143701,143702,143703,143704,143705,143706,143707,143708,143709,143710,143711,143712,143713,143714,143715,143716,143717,143718,143719,143720,143721,143722,143723,143724,143725,143726,143727,143728,143729,143730,143731,143732,143733,143734,143735,143736,143737,143738,143739,143740,143741,143742,143743,143744,143745,143746,143747,143748,143749,143750,143751,143752,143753,143754,143755,143756,143757,143758,143759,143760,143761,143762,143763,143764,143765,143766,143767,143768,143769,143770,143771,143772,143773,143774,143775,143776,143777,143778,143779,143780,143781,143782,143783,143784,143785,143786,143787,143788,143789,143790,143791,143792,143793,143794,143795,143796,143797,143798,143799,143800,143801,143802,143803,143804,143805,143806,143807,143808,143809,143810,143811,143812,143813,143814,143815,143816,143817,143818,143819,143820,143821,143822,143823,143824,143825,143826,143827,143828,143829,143830,143831,143832,143833,143834,143835,143836,143837,143838,143839,143840,143841,143842,143843,143844,143845,143846,143847,143848,143849,143850,143851,143852,143853,143854,143855,143856,143857,143858,143859,143860,143861,143862,143863,143864,143865,143866,143867,143868,143869,143870,143871,143872,143873,143874,143875,143876,143877,143878,143879,143880,143881,143882,143883,143884,143885,143886,143887,143888,143889,143890,143891,143892,143893,143894,143895,143896,143897,143898,143899,143900,143901,143902,143903,143904,143905,143906,143907,143908,143909,143910,143911,143912,143913,143914,143915,143916,143917,143918,143919,143920,143921,143922,143923,143924,143925,143926,143927,143928,143929,143930,143931,143932,143933,143934,143935,143936,143937,143938,143939,143940,143941,143942,143943,143944,143945,143946,143947,143948,143949,143950,143951,143952,143953,143954,143955,143956,143957,143958,143959,143960,143961,143962,143963,143964,143965,143966,143967,143968,143969,143970,143971,143972,143973,143974,143975,143976,143977,143978,143979,143980,143981,143982,143983,143984,143985,143986,143987,143988,143989,143990,143991,143992,143993,143994,143995,143996,143997,143998,143999,144000,144001,144002,144003,144004,144005,144006,144007,144008,144009,144010,144011,144012,144013,144014,144015,144016,144017,144018,144019,144020,144021,144022,144023,144024,144025,144026,144027,144028,144029,144030,144031,144032,144033,144034,144035,144036,144037,144038,144039,144040,144041,144042,144043,144044,144045,144046,144047,144048,144049,144050,144051,144052,144053,144054,144055,144056,144057,144058,144059,144060,144061,144062,144063,144064,144065,144066,144067,144068,144069,144070,144071,144072,144073,144074,144075,144076,144077,144078,144079,144080,144081,144082,144083,144084,144085,144086,144087,144088,144089,144090,144091,144092,144093,144094,144095,144096,144097,144098,144099,144100,144101,144102,144103,144104,144105,144106,144107,144108,144109,144110,144111,144112,144113,144114,144115,144116,144117,144118,144119,144120,144121,144122,144123,144124,144125,144126,144127,144128,144129,144130,144131,144132,144133,144134,144135,144136,144137,144138,144139,144140,144141,144142,144143,144144,144145,144146,144147,144148,144149,144150,144151,144152,144153,144154,144155,144156,144157,144158,144159,144160,144161,144162,144163,144164,144165,144166,144167,144168,144169,144170,144171,144172,144173,144174,144175,144176,144177,144178,144179,144180,144181,144182,144183,144184,144185,144186,144187,144188,144189,144190,144191,144192,144193,144194,144195,144196,144197,144198,144199,144200,144201,144202,144203,144204,144205,144206,144207,144208,144209,144210,144211,144212,144213,144214,144215,144216,144217,144218,144219,144220,144221,144222,144223,144224,144225,144226,144227,144228,144229,144230,144231,144232,144233,144234,144235,144236,144237,144238,144239,144240,144241,144242,144243,144244,144245,144246,144247,144248,144249,144250,144251,144252,144253,144254,144255,144256,144257,144258,144259,144260,144261,144262,144263,144264,144265,144266,144267,144268,144269,144270,144271,144272,144273,144274,144275,144276,144277,144278,144279,144280,144281,144282,144283,144284,144285,144286,144287,144288,144289,144290,144291,144292,144293,144294,144295,144296,144297,144298,144299,144300,144301,144302,144303,144304,144305,144306,144307,144308,144309,144310,144311,144312,144313,144314,144315,144316,144317,144318,144319,144320,144321,144322,144323,144324,144325,144326,144327,144328,144329,144330,144331,144332,144333,144334,144335,144336,144337,144338,144339,144340,144341,144342,144343,144344,144345,144346,144347,144348,144349,144350,144351,144352,144353,144354,144355,144356,144357,144358,144359,144360,144361,144362,144363,144364,144365,144366,144367,144368,144369,144370,144371,144372,144373,144374,144375,144376,144377,144378,144379,144380,144381,144382,144383,144384,144385,144386,144387,144388,144389,144390,144391,144392,144393,144394,144395,144396,144397,144398,144399,144400,144401,144402,144403,144404,144405,144406,144407,144408,144409,144410,144411,144412,144413,144414,144415,144416,144417,144418,144419,144420,144421,144422,144423,144424,144425,144426,144427,144428,144429,144430,144431,144432,144433,144434,144435,144436,144437,144438,144439,144440,144441,144442,144443,144444,144445,144446,144447,144448,144449,144450,144451,144452,144453,144454,144455,144456,144457,144458,144459,144460,144461,144462,144463,144464,144465,144466,144467,144468,144469,144470,144471,144472,144473,144474,144475,144476,144477,144478,144479,144480,144481,144482,144483,144484,144485,144486,144487,144488,144489,144490,144491,144492,144493,144494,144495,144496,144497,144498,144499,144500,144501,144502,144503,144504,144505,144506,144507,144508,144509,144510,144511,144512,144513,144514,144515,144516,144517,144518,144519,144520,144521,144522,144523,144524,144525,144526,144527,144528,144529,144530,144531,144532,144533,144534,144535,144536,144537,144538,144539,144540,144541,144542,144543,144544,144545,144546,144547,144548,144549,144550,144551,144552,144553,144554,144555,144556,144557,144558,144559,144560,144561,144562,144563,144564,144565,144566,144567,144568,144569,144570,144571,144572,144573,144574,144575,144576,144577,144578,144579,144580,144581,144582,144583,144584,144585,144586,144587,144588,144589,144590,144591,144592,144593,144594,144595,144596,144597,144598,144599,144600,144601,144602,144603,144604,144605,144606,144607,144608,144609,144610,144611,144612,144613,144614,144615,144616,144617,144618,144619,144620,144621,144622,144623,144624,144625,144626,144627,144628,144629,144630,144631,144632,144633,144634,144635,144636,144637,144638,144639,144640,144641,144642,144643,144644,144645,144646,144647,144648,144649,144650,144651,144652,144653,144654,144655,144656,144657,144658,144659,144660,144661,144662,144663,144664,144665,144666,144667,144668,144669,144670,144671,144672,144673,144674,144675,144676,144677,144678,144679,144680,144681,144682,144683,144684,144685,144686,144687,144688,144689,144690,144691,144692,144693,144694,144695,144696,144697,144698,144699,144700,144701,144702,144703,144704,144705,144706,144707,144708,144709,144710,144711,144712,144713,144714,144715,144716,144717,144718,144719,144720,144721,144722,144723,144724,144725,144726,144727,144728,144729,144730,144731,144732,144733,144734,144735,144736,144737,144738,144739,144740,144741,144742,144743,144744,144745,144746,144747,144748,144749,144750,144751,144752,144753,144754,144755,144756,144757,144758,144759,144760,144761,144762,144763,144764,144765,144766,144767,144768,144769,144770,144771,144772,144773,144774,144775,144776,144777,144778,144779,144780,144781,144782,144783,144784,144785,144786,144787,144788,144789,144790,144791,144792,144793,144794,144795,144796,144797,144798,144799,144800,144801,144802,144803,144804,144805,144806,144807,144808,144809,144810,144811,144812,144813,144814,144815,144816,144817,144818,144819,144820,144821,144822,144823,144824,144825,144826,144827,144828,144829,144830,144831,144832,144833,144834,144835,144836,144837,144838,144839,144840,144841,144842,144843,144844,144845,144846,144847,144848,144849,144850,144851,144852,144853,144854,144855,144856,144857,144858,144859,144860,144861,144862,144863,144864,144865,144866,144867,144868,144869,144870,144871,144872,144873,144874,144875,144876,144877,144878,144879,144880,144881,144882,144883,144884,144885,144886,144887,144888,144889,144890,144891,144892,144893,144894,144895,144896,144897,144898,144899,144900,144901,144902,144903,144904,144905,144906,144907,144908,144909,144910,144911,144912,144913,144914,144915,144916,144917,144918,144919,144920,144921,144922,144923,144924,144925,144926,144927,144928,144929,144930,144931,144932,144933,144934,144935,144936,144937,144938,144939,144940,144941,144942,144943,144944,144945,144946,144947,144948,144949,144950,144951,144952,144953,144954,144955,144956,144957,144958,144959,144960,144961,144962,144963,144964,144965,144966,144967,144968,144969,144970,144971,144972,144973,144974,144975,144976,144977,144978,144979,144980,144981,144982,144983,144984,144985,144986,144987,144988,144989,144990,144991,144992,144993,144994,144995,144996,144997,144998,144999,145000,145001,145002,145003,145004,145005,145006,145007,145008,145009,145010,145011,145012,145013,145014,145015,145016,145017,145018,145019,145020,145021,145022,145023,145024,145025,145026,145027,145028,145029,145030,145031,145032,145033,145034,145035,145036,145037,145038,145039,145040,145041,145042,145043,145044,145045,145046,145047,145048,145049,145050,145051,145052,145053,145054,145055,145056,145057,145058,145059,145060,145061,145062,145063,145064,145065,145066,145067,145068,145069,145070,145071,145072,145073,145074,145075,145076,145077,145078,145079,145080,145081,145082,145083,145084,145085,145086,145087,145088,145089,145090,145091,145092,145093,145094,145095,145096,145097,145098,145099,145100,145101,145102,145103,145104,145105,145106,145107,145108,145109,145110,145111,145112,145113,145114,145115,145116,145117,145118,145119,145120,145121,145122,145123,145124,145125,145126,145127,145128,145129,145130,145131,145132,145133,145134,145135,145136,145137,145138,145139,145140,145141,145142,145143,145144,145145,145146,145147,145148,145149,145150,145151,145152,145153,145154,145155,145156,145157,145158,145159,145160,145161,145162,145163,145164,145165,145166,145167,145168,145169,145170,145171,145172,145173,145174,145175,145176,145177,145178,145179,145180,145181,145182,145183,145184,145185,145186,145187,145188,145189,145190,145191,145192,145193,145194,145195,145196,145197,145198,145199,145200,145201,145202,145203,145204,145205,145206,145207,145208,145209,145210,145211,145212,145213,145214,145215,145216,145217,145218,145219,145220,145221,145222,145223,145224,145225,145226,145227,145228,145229,145230,145231,145232,145233,145234,145235,145236,145237,145238,145239,145240,145241,145242,145243,145244,145245,145246,145247,145248,145249,145250,145251,145252,145253,145254,145255,145256,145257,145258,145259,145260,145261,145262,145263,145264,145265,145266,145267,145268,145269,145270,145271,145272,145273,145274,145275,145276,145277,145278,145279,145280,145281,145282,145283,145284,145285,145286,145287,145288,145289,145290,145291,145292,145293,145294,145295,145296,145297,145298,145299,145300,145301,145302,145303,145304,145305,145306,145307,145308,145309,145310,145311,145312,145313,145314,145315,145316,145317,145318,145319,145320,145321,145322,145323,145324,145325,145326,145327,145328,145329,145330,145331,145332,145333,145334,145335,145336,145337,145338,145339,145340,145341,145342,145343,145344,145345,145346,145347,145348,145349,145350,145351,145352,145353,145354,145355,145356,145357,145358,145359,145360,145361,145362,145363,145364,145365,145366,145367,145368,145369,145370,145371,145372,145373,145374,145375,145376,145377,145378,145379,145380,145381,145382,145383,145384,145385,145386,145387,145388,145389,145390,145391,145392,145393,145394,145395,145396,145397,145398,145399,145400,145401,145402,145403,145404,145405,145406,145407,145408,145409,145410,145411,145412,145413,145414,145415,145416,145417,145418,145419,145420,145421,145422,145423,145424,145425,145426,145427,145428,145429,145430,145431,145432,145433,145434,145435,145436,145437,145438,145439,145440,145441,145442,145443,145444,145445,145446,145447,145448,145449,145450,145451,145452,145453,145454,145455,145456,145457,145458,145459,145460,145461,145462,145463,145464,145465,145466,145467,145468,145469,145470,145471,145472,145473,145474,145475,145476,145477,145478,145479,145480,145481,145482,145483,145484,145485,145486,145487,145488,145489,145490,145491,145492,145493,145494,145495,145496,145497,145498,145499,145500,145501,145502,145503,145504,145505,145506,145507,145508,145509,145510,145511,145512,145513,145514,145515,145516,145517,145518,145519,145520,145521,145522,145523,145524,145525,145526,145527,145528,145529,145530,145531,145532,145533,145534,145535,145536,145537,145538,145539,145540,145541,145542,145543,145544,145545,145546,145547,145548,145549,145550,145551,145552,145553,145554,145555,145556,145557,145558,145559,145560,145561,145562,145563,145564,145565,145566,145567,145568,145569,145570,145571,145572,145573,145574,145575,145576,145577,145578,145579,145580,145581,145582,145583,145584,145585,145586,145587,145588,145589,145590,145591,145592,145593,145594,145595,145596,145597,145598,145599,145600,145601,145602,145603,145604,145605,145606,145607,145608,145609,145610,145611,145612,145613,145614,145615,145616,145617,145618,145619,145620,145621,145622,145623,145624,145625,145626,145627,145628,145629,145630,145631,145632,145633,145634,145635,145636,145637,145638,145639,145640,145641,145642,145643,145644,145645,145646,145647,145648,145649,145650,145651,145652,145653,145654,145655,145656,145657,145658,145659,145660,145661,145662,145663,145664,145665,145666,145667,145668,145669,145670,145671,145672,145673,145674,145675,145676,145677,145678,145679,145680,145681,145682,145683,145684,145685,145686,145687,145688,145689,145690,145691,145692,145693,145694,145695,145696,145697,145698,145699,145700,145701,145702,145703,145704,145705,145706,145707,145708,145709,145710,145711,145712,145713,145714,145715,145716,145717,145718,145719,145720,145721,145722,145723,145724,145725,145726,145727,145728,145729,145730,145731,145732,145733,145734,145735,145736,145737,145738,145739,145740,145741,145742,145743,145744,145745,145746,145747,145748,145749,145750,145751,145752,145753,145754,145755,145756,145757,145758,145759,145760,145761,145762,145763,145764,145765,145766,145767,145768,145769,145770,145771,145772,145773,145774,145775,145776,145777,145778,145779,145780,145781,145782,145783,145784,145785,145786,145787,145788,145789,145790,145791,145792,145793,145794,145795,145796,145797,145798,145799,145800,145801,145802,145803,145804,145805,145806,145807,145808,145809,145810,145811,145812,145813,145814,145815,145816,145817,145818,145819,145820,145821,145822,145823,145824,145825,145826,145827,145828,145829,145830,145831,145832,145833,145834,145835,145836,145837,145838,145839,145840,145841,145842,145843,145844,145845,145846,145847,145848,145849,145850,145851,145852,145853,145854,145855,145856,145857,145858,145859,145860,145861,145862,145863,145864,145865,145866,145867,145868,145869,145870,145871,145872,145873,145874,145875,145876,145877,145878,145879,145880,145881,145882,145883,145884,145885,145886,145887,145888,145889,145890,145891,145892,145893,145894,145895,145896,145897,145898,145899,145900,145901,145902,145903,145904,145905,145906,145907,145908,145909,145910,145911,145912,145913,145914,145915,145916,145917,145918,145919,145920,145921,145922,145923,145924,145925,145926,145927,145928,145929,145930,145931,145932,145933,145934,145935,145936,145937,145938,145939,145940,145941,145942,145943,145944,145945,145946,145947,145948,145949,145950,145951,145952,145953,145954,145955,145956,145957,145958,145959,145960,145961,145962,145963,145964,145965,145966,145967,145968,145969,145970,145971,145972,145973,145974,145975,145976,145977,145978,145979,145980,145981,145982,145983,145984,145985,145986,145987,145988,145989,145990,145991,145992,145993,145994,145995,145996,145997,145998,145999,146000,146001,146002,146003,146004,146005,146006,146007,146008,146009,146010,146011,146012,146013,146014,146015,146016,146017,146018,146019,146020,146021,146022,146023,146024,146025,146026,146027,146028,146029,146030,146031,146032,146033,146034,146035,146036,146037,146038,146039,146040,146041,146042,146043,146044,146045,146046,146047,146048,146049,146050,146051,146052,146053,146054,146055,146056,146057,146058,146059,146060,146061,146062,146063,146064,146065,146066,146067,146068,146069,146070,146071,146072,146073,146074,146075,146076,146077,146078,146079,146080,146081,146082,146083,146084,146085,146086,146087,146088,146089,146090,146091,146092,146093,146094,146095,146096,146097,146098,146099,146100,146101,146102,146103,146104,146105,146106,146107,146108,146109,146110,146111,146112,146113,146114,146115,146116,146117,146118,146119,146120,146121,146122,146123,146124,146125,146126,146127,146128,146129,146130,146131,146132,146133,146134,146135,146136,146137,146138,146139,146140,146141,146142,146143,146144,146145,146146,146147,146148,146149,146150,146151,146152,146153,146154,146155,146156,146157,146158,146159,146160,146161,146162,146163,146164,146165,146166,146167,146168,146169,146170,146171,146172,146173,146174,146175,146176,146177,146178,146179,146180,146181,146182,146183,146184,146185,146186,146187,146188,146189,146190,146191,146192,146193,146194,146195,146196,146197,146198,146199,146200,146201,146202,146203,146204,146205,146206,146207,146208,146209,146210,146211,146212,146213,146214,146215,146216,146217,146218,146219,146220,146221,146222,146223,146224,146225,146226,146227,146228,146229,146230,146231,146232,146233,146234,146235,146236,146237,146238,146239,146240,146241,146242,146243,146244,146245,146246,146247,146248,146249,146250,146251,146252,146253,146254,146255,146256,146257,146258,146259,146260,146261,146262,146263,146264,146265,146266,146267,146268,146269,146270,146271,146272,146273,146274,146275,146276,146277,146278,146279,146280,146281,146282,146283,146284,146285,146286,146287,146288,146289,146290,146291,146292,146293,146294,146295,146296,146297,146298,146299,146300,146301,146302,146303,146304,146305,146306,146307,146308,146309,146310,146311,146312,146313,146314,146315,146316,146317,146318,146319,146320,146321,146322,146323,146324,146325,146326,146327,146328,146329,146330,146331,146332,146333,146334,146335,146336,146337,146338,146339,146340,146341,146342,146343,146344,146345,146346,146347,146348,146349,146350,146351,146352,146353,146354,146355,146356,146357,146358,146359,146360,146361,146362,146363,146364,146365,146366,146367,146368,146369,146370,146371,146372,146373,146374,146375,146376,146377,146378,146379,146380,146381,146382,146383,146384,146385,146386,146387,146388,146389,146390,146391,146392,146393,146394,146395,146396,146397,146398,146399,146400,146401,146402,146403,146404,146405,146406,146407,146408,146409,146410,146411,146412,146413,146414,146415,146416,146417,146418,146419,146420,146421,146422,146423,146424,146425,146426,146427,146428,146429,146430,146431,146432,146433,146434,146435,146436,146437,146438,146439,146440,146441,146442,146443,146444,146445,146446,146447,146448,146449,146450,146451,146452,146453,146454,146455,146456,146457,146458,146459,146460,146461,146462,146463,146464,146465,146466,146467,146468,146469,146470,146471,146472,146473,146474,146475,146476,146477,146478,146479,146480,146481,146482,146483,146484,146485,146486,146487,146488,146489,146490,146491,146492,146493,146494,146495,146496,146497,146498,146499,146500,146501,146502,146503,146504,146505,146506,146507,146508,146509,146510,146511,146512,146513,146514,146515,146516,146517,146518,146519,146520,146521,146522,146523,146524,146525,146526,146527,146528,146529,146530,146531,146532,146533,146534,146535,146536,146537,146538,146539,146540,146541,146542,146543,146544,146545,146546,146547,146548,146549,146550,146551,146552,146553,146554,146555,146556,146557,146558,146559,146560,146561,146562,146563,146564,146565,146566,146567,146568,146569,146570,146571,146572,146573,146574,146575,146576,146577,146578,146579,146580,146581,146582,146583,146584,146585,146586,146587,146588,146589,146590,146591,146592,146593,146594,146595,146596,146597,146598,146599,146600,146601,146602,146603,146604,146605,146606,146607,146608,146609,146610,146611,146612,146613,146614,146615,146616,146617,146618,146619,146620,146621,146622,146623,146624,146625,146626,146627,146628,146629,146630,146631,146632,146633,146634,146635,146636,146637,146638,146639,146640,146641,146642,146643,146644,146645,146646,146647,146648,146649,146650,146651,146652,146653,146654,146655,146656,146657,146658,146659,146660,146661,146662,146663,146664,146665,146666,146667,146668,146669,146670,146671,146672,146673,146674,146675,146676,146677,146678,146679,146680,146681,146682,146683,146684,146685,146686,146687,146688,146689,146690,146691,146692,146693,146694,146695,146696,146697,146698,146699,146700,146701,146702,146703,146704,146705,146706,146707,146708,146709,146710,146711,146712,146713,146714,146715,146716,146717,146718,146719,146720,146721,146722,146723,146724,146725,146726,146727,146728,146729,146730,146731,146732,146733,146734,146735,146736,146737,146738,146739,146740,146741,146742,146743,146744,146745,146746,146747,146748,146749,146750,146751,146752,146753,146754,146755,146756,146757,146758,146759,146760,146761,146762,146763,146764,146765,146766,146767,146768,146769,146770,146771,146772,146773,146774,146775,146776,146777,146778,146779,146780,146781,146782,146783,146784,146785,146786,146787,146788,146789,146790,146791,146792,146793,146794,146795,146796,146797,146798,146799,146800,146801,146802,146803,146804,146805,146806,146807,146808,146809,146810,146811,146812,146813,146814,146815,146816,146817,146818,146819,146820,146821,146822,146823,146824,146825,146826,146827,146828,146829,146830,146831,146832,146833,146834,146835,146836,146837,146838,146839,146840,146841,146842,146843,146844,146845,146846,146847,146848,146849,146850,146851,146852,146853,146854,146855,146856,146857,146858,146859,146860,146861,146862,146863,146864,146865,146866,146867,146868,146869,146870,146871,146872,146873,146874,146875,146876,146877,146878,146879,146880,146881,146882,146883,146884,146885,146886,146887,146888,146889,146890,146891,146892,146893,146894,146895,146896,146897,146898,146899,146900,146901,146902,146903,146904,146905,146906,146907,146908,146909,146910,146911,146912,146913,146914,146915,146916,146917,146918,146919,146920,146921,146922,146923,146924,146925,146926,146927,146928,146929,146930,146931,146932,146933,146934,146935,146936,146937,146938,146939,146940,146941,146942,146943,146944,146945,146946,146947,146948,146949,146950,146951,146952,146953,146954,146955,146956,146957,146958,146959,146960,146961,146962,146963,146964,146965,146966,146967,146968,146969,146970,146971,146972,146973,146974,146975,146976,146977,146978,146979,146980,146981,146982,146983,146984,146985,146986,146987,146988,146989,146990,146991,146992,146993,146994,146995,146996,146997,146998,146999,147000,147001,147002,147003,147004,147005,147006,147007,147008,147009,147010,147011,147012,147013,147014,147015,147016,147017,147018,147019,147020,147021,147022,147023,147024,147025,147026,147027,147028,147029,147030,147031,147032,147033,147034,147035,147036,147037,147038,147039,147040,147041,147042,147043,147044,147045,147046,147047,147048,147049,147050,147051,147052,147053,147054,147055,147056,147057,147058,147059,147060,147061,147062,147063,147064,147065,147066,147067,147068,147069,147070,147071,147072,147073,147074,147075,147076,147077,147078,147079,147080,147081,147082,147083,147084,147085,147086,147087,147088,147089,147090,147091,147092,147093,147094,147095,147096,147097,147098,147099,147100,147101,147102,147103,147104,147105,147106,147107,147108,147109,147110,147111,147112,147113,147114,147115,147116,147117,147118,147119,147120,147121,147122,147123,147124,147125,147126,147127,147128,147129,147130,147131,147132,147133,147134,147135,147136,147137,147138,147139,147140,147141,147142,147143,147144,147145,147146,147147,147148,147149,147150,147151,147152,147153,147154,147155,147156,147157,147158,147159,147160,147161,147162,147163,147164,147165,147166,147167,147168,147169,147170,147171,147172,147173,147174,147175,147176,147177,147178,147179,147180,147181,147182,147183,147184,147185,147186,147187,147188,147189,147190,147191,147192,147193,147194,147195,147196,147197,147198,147199,147200,147201,147202,147203,147204,147205,147206,147207,147208,147209,147210,147211,147212,147213,147214,147215,147216,147217,147218,147219,147220,147221,147222,147223,147224,147225,147226,147227,147228,147229,147230,147231,147232,147233,147234,147235,147236,147237,147238,147239,147240,147241,147242,147243,147244,147245,147246,147247,147248,147249,147250,147251,147252,147253,147254,147255,147256,147257,147258,147259,147260,147261,147262,147263,147264,147265,147266,147267,147268,147269,147270,147271,147272,147273,147274,147275,147276,147277,147278,147279,147280,147281,147282,147283,147284,147285,147286,147287,147288,147289,147290,147291,147292,147293,147294,147295,147296,147297,147298,147299,147300,147301,147302,147303,147304,147305,147306,147307,147308,147309,147310,147311,147312,147313,147314,147315,147316,147317,147318,147319,147320,147321,147322,147323,147324,147325,147326,147327,147328,147329,147330,147331,147332,147333,147334,147335,147336,147337,147338,147339,147340,147341,147342,147343,147344,147345,147346,147347,147348,147349,147350,147351,147352,147353,147354,147355,147356,147357,147358,147359,147360,147361,147362,147363,147364,147365,147366,147367,147368,147369,147370,147371,147372,147373,147374,147375,147376,147377,147378,147379,147380,147381,147382,147383,147384,147385,147386,147387,147388,147389,147390,147391,147392,147393,147394,147395,147396,147397,147398,147399,147400,147401,147402,147403,147404,147405,147406,147407,147408,147409,147410,147411,147412,147413,147414,147415,147416,147417,147418,147419,147420,147421,147422,147423,147424,147425,147426,147427,147428,147429,147430,147431,147432,147433,147434,147435,147436,147437,147438,147439,147440,147441,147442,147443,147444,147445,147446,147447,147448,147449,147450,147451,147452,147453,147454,147455,147456,147457,147458,147459,147460,147461,147462,147463,147464,147465,147466,147467,147468,147469,147470,147471,147472,147473,147474,147475,147476,147477,147478,147479,147480,147481,147482,147483,147484,147485,147486,147487,147488,147489,147490,147491,147492,147493,147494,147495,147496,147497,147498,147499,147500,147501,147502,147503,147504,147505,147506,147507,147508,147509,147510,147511,147512,147513,147514,147515,147516,147517,147518,147519,147520,147521,147522,147523,147524,147525,147526,147527,147528,147529,147530,147531,147532,147533,147534,147535,147536,147537,147538,147539,147540,147541,147542,147543,147544,147545,147546,147547,147548,147549,147550,147551,147552,147553,147554,147555,147556,147557,147558,147559,147560,147561,147562,147563,147564,147565,147566,147567,147568,147569,147570,147571,147572,147573,147574,147575,147576,147577,147578,147579,147580,147581,147582,147583,147584,147585,147586,147587,147588,147589,147590,147591,147592,147593,147594,147595,147596,147597,147598,147599,147600,147601,147602,147603,147604,147605,147606,147607,147608,147609,147610,147611,147612,147613,147614,147615,147616,147617,147618,147619,147620,147621,147622,147623,147624,147625,147626,147627,147628,147629,147630,147631,147632,147633,147634,147635,147636,147637,147638,147639,147640,147641,147642,147643,147644,147645,147646,147647,147648,147649,147650,147651,147652,147653,147654,147655,147656,147657,147658,147659,147660,147661,147662,147663,147664,147665,147666,147667,147668,147669,147670,147671,147672,147673,147674,147675,147676,147677,147678,147679,147680,147681,147682,147683,147684,147685,147686,147687,147688,147689,147690,147691,147692,147693,147694,147695,147696,147697,147698,147699,147700,147701,147702,147703,147704,147705,147706,147707,147708,147709,147710,147711,147712,147713,147714,147715,147716,147717,147718,147719,147720,147721,147722,147723,147724,147725,147726,147727,147728,147729,147730,147731,147732,147733,147734,147735,147736,147737,147738,147739,147740,147741,147742,147743,147744,147745,147746,147747,147748,147749,147750,147751,147752,147753,147754,147755,147756,147757,147758,147759,147760,147761,147762,147763,147764,147765,147766,147767,147768,147769,147770,147771,147772,147773,147774,147775,147776,147777,147778,147779,147780,147781,147782,147783,147784,147785,147786,147787,147788,147789,147790,147791,147792,147793,147794,147795,147796,147797,147798,147799,147800,147801,147802,147803,147804,147805,147806,147807,147808,147809,147810,147811,147812,147813,147814,147815,147816,147817,147818,147819,147820,147821,147822,147823,147824,147825,147826,147827,147828,147829,147830,147831,147832,147833,147834,147835,147836,147837,147838,147839,147840,147841,147842,147843,147844,147845,147846,147847,147848,147849,147850,147851,147852,147853,147854,147855,147856,147857,147858,147859,147860,147861,147862,147863,147864,147865,147866,147867,147868,147869,147870,147871,147872,147873,147874,147875,147876,147877,147878,147879,147880,147881,147882,147883,147884,147885,147886,147887,147888,147889,147890,147891,147892,147893,147894,147895,147896,147897,147898,147899,147900,147901,147902,147903,147904,147905,147906,147907,147908,147909,147910,147911,147912,147913,147914,147915,147916,147917,147918,147919,147920,147921,147922,147923,147924,147925,147926,147927,147928,147929,147930,147931,147932,147933,147934,147935,147936,147937,147938,147939,147940,147941,147942,147943,147944,147945,147946,147947,147948,147949,147950,147951,147952,147953,147954,147955,147956,147957,147958,147959,147960,147961,147962,147963,147964,147965,147966,147967,147968,147969,147970,147971,147972,147973,147974,147975,147976,147977,147978,147979,147980,147981,147982,147983,147984,147985,147986,147987,147988,147989,147990,147991,147992,147993,147994,147995,147996,147997,147998,147999,148000,148001,148002,148003,148004,148005,148006,148007,148008,148009,148010,148011,148012,148013,148014,148015,148016,148017,148018,148019,148020,148021,148022,148023,148024,148025,148026,148027,148028,148029,148030,148031,148032,148033,148034,148035,148036,148037,148038,148039,148040,148041,148042,148043,148044,148045,148046,148047,148048,148049,148050,148051,148052,148053,148054,148055,148056,148057,148058,148059,148060,148061,148062,148063,148064,148065,148066,148067,148068,148069,148070,148071,148072,148073,148074,148075,148076,148077,148078,148079,148080,148081,148082,148083,148084,148085,148086,148087,148088,148089,148090,148091,148092,148093,148094,148095,148096,148097,148098,148099,148100,148101,148102,148103,148104,148105,148106,148107,148108,148109,148110,148111,148112,148113,148114,148115,148116,148117,148118,148119,148120,148121,148122,148123,148124,148125,148126,148127,148128,148129,148130,148131,148132,148133,148134,148135,148136,148137,148138,148139,148140,148141,148142,148143,148144,148145,148146,148147,148148,148149,148150,148151,148152,148153,148154,148155,148156,148157,148158,148159,148160,148161,148162,148163,148164,148165,148166,148167,148168,148169,148170,148171,148172,148173,148174,148175,148176,148177,148178,148179,148180,148181,148182,148183,148184,148185,148186,148187,148188,148189,148190,148191,148192,148193,148194,148195,148196,148197,148198,148199,148200,148201,148202,148203,148204,148205,148206,148207,148208,148209,148210,148211,148212,148213,148214,148215,148216,148217,148218,148219,148220,148221,148222,148223,148224,148225,148226,148227,148228,148229,148230,148231,148232,148233,148234,148235,148236,148237,148238,148239,148240,148241,148242,148243,148244,148245,148246,148247,148248,148249,148250,148251,148252,148253,148254,148255,148256,148257,148258,148259,148260,148261,148262,148263,148264,148265,148266,148267,148268,148269,148270,148271,148272,148273,148274,148275,148276,148277,148278,148279,148280,148281,148282,148283,148284,148285,148286,148287,148288,148289,148290,148291,148292,148293,148294,148295,148296,148297,148298,148299,148300,148301,148302,148303,148304,148305,148306,148307,148308,148309,148310,148311,148312,148313,148314,148315,148316,148317,148318,148319,148320,148321,148322,148323,148324,148325,148326,148327,148328,148329,148330,148331,148332,148333,148334,148335,148336,148337,148338,148339,148340,148341,148342,148343,148344,148345,148346,148347,148348,148349,148350,148351,148352,148353,148354,148355,148356,148357,148358,148359,148360,148361,148362,148363,148364,148365,148366,148367,148368,148369,148370,148371,148372,148373,148374,148375,148376,148377,148378,148379,148380,148381,148382,148383,148384,148385,148386,148387,148388,148389,148390,148391,148392,148393,148394,148395,148396,148397,148398,148399,148400,148401,148402,148403,148404,148405,148406,148407,148408,148409,148410,148411,148412,148413,148414,148415,148416,148417,148418,148419,148420,148421,148422,148423,148424,148425,148426,148427,148428,148429,148430,148431,148432,148433,148434,148435,148436,148437,148438,148439,148440,148441,148442,148443,148444,148445,148446,148447,148448,148449,148450,148451,148452,148453,148454,148455,148456,148457,148458,148459,148460,148461,148462,148463,148464,148465,148466,148467,148468,148469,148470,148471,148472,148473,148474,148475,148476,148477,148478,148479,148480,148481,148482,148483,148484,148485,148486,148487,148488,148489,148490,148491,148492,148493,148494,148495,148496,148497,148498,148499,148500,148501,148502,148503,148504,148505,148506,148507,148508,148509,148510,148511,148512,148513,148514,148515,148516,148517,148518,148519,148520,148521,148522,148523,148524,148525,148526,148527,148528,148529,148530,148531,148532,148533,148534,148535,148536,148537,148538,148539,148540,148541,148542,148543,148544,148545,148546,148547,148548,148549,148550,148551,148552,148553,148554,148555,148556,148557,148558,148559,148560,148561,148562,148563,148564,148565,148566,148567,148568,148569,148570,148571,148572,148573,148574,148575,148576,148577,148578,148579,148580,148581,148582,148583,148584,148585,148586,148587,148588,148589,148590,148591,148592,148593,148594,148595,148596,148597,148598,148599,148600,148601,148602,148603,148604,148605,148606,148607,148608,148609,148610,148611,148612,148613,148614,148615,148616,148617,148618,148619,148620,148621,148622,148623,148624,148625,148626,148627,148628,148629,148630,148631,148632,148633,148634,148635,148636,148637,148638,148639,148640,148641,148642,148643,148644,148645,148646,148647,148648,148649,148650,148651,148652,148653,148654,148655,148656,148657,148658,148659,148660,148661,148662,148663,148664,148665,148666,148667,148668,148669,148670,148671,148672,148673,148674,148675,148676,148677,148678,148679,148680,148681,148682,148683,148684,148685,148686,148687,148688,148689,148690,148691,148692,148693,148694,148695,148696,148697,148698,148699,148700,148701,148702,148703,148704,148705,148706,148707,148708,148709,148710,148711,148712,148713,148714,148715,148716,148717,148718,148719,148720,148721,148722,148723,148724,148725,148726,148727,148728,148729,148730,148731,148732,148733,148734,148735,148736,148737,148738,148739,148740,148741,148742,148743,148744,148745,148746,148747,148748,148749,148750,148751,148752,148753,148754,148755,148756,148757,148758,148759,148760,148761,148762,148763,148764,148765,148766,148767,148768,148769,148770,148771,148772,148773,148774,148775,148776,148777,148778,148779,148780,148781,148782,148783,148784,148785,148786,148787,148788,148789,148790,148791,148792,148793,148794,148795,148796,148797,148798,148799,148800,148801,148802,148803,148804,148805,148806,148807,148808,148809,148810,148811,148812,148813,148814,148815,148816,148817,148818,148819,148820,148821,148822,148823,148824,148825,148826,148827,148828,148829,148830,148831,148832,148833,148834,148835,148836,148837,148838,148839,148840,148841,148842,148843,148844,148845,148846,148847,148848,148849,148850,148851,148852,148853,148854,148855,148856,148857,148858,148859,148860,148861,148862,148863,148864,148865,148866,148867,148868,148869,148870,148871,148872,148873,148874,148875,148876,148877,148878,148879,148880,148881,148882,148883,148884,148885,148886,148887,148888,148889,148890,148891,148892,148893,148894,148895,148896,148897,148898,148899,148900,148901,148902,148903,148904,148905,148906,148907,148908,148909,148910,148911,148912,148913,148914,148915,148916,148917,148918,148919,148920,148921,148922,148923,148924,148925,148926,148927,148928,148929,148930,148931,148932,148933,148934,148935,148936,148937,148938,148939,148940,148941,148942,148943,148944,148945,148946,148947,148948,148949,148950,148951,148952,148953,148954,148955,148956,148957,148958,148959,148960,148961,148962,148963,148964,148965,148966,148967,148968,148969,148970,148971,148972,148973,148974,148975,148976,148977,148978,148979,148980,148981,148982,148983,148984,148985,148986,148987,148988,148989,148990,148991,148992,148993,148994,148995,148996,148997,148998,148999,149000,149001,149002,149003,149004,149005,149006,149007,149008,149009,149010,149011,149012,149013,149014,149015,149016,149017,149018,149019,149020,149021,149022,149023,149024,149025,149026,149027,149028,149029,149030,149031,149032,149033,149034,149035,149036,149037,149038,149039,149040,149041,149042,149043,149044,149045,149046,149047,149048,149049,149050,149051,149052,149053,149054,149055,149056,149057,149058,149059,149060,149061,149062,149063,149064,149065,149066,149067,149068,149069,149070,149071,149072,149073,149074,149075,149076,149077,149078,149079,149080,149081,149082,149083,149084,149085,149086,149087,149088,149089,149090,149091,149092,149093,149094,149095,149096,149097,149098,149099,149100,149101,149102,149103,149104,149105,149106,149107,149108,149109,149110,149111,149112,149113,149114,149115,149116,149117,149118,149119,149120,149121,149122,149123,149124,149125,149126,149127,149128,149129,149130,149131,149132,149133,149134,149135,149136,149137,149138,149139,149140,149141,149142,149143,149144,149145,149146,149147,149148,149149,149150,149151,149152,149153,149154,149155,149156,149157,149158,149159,149160,149161,149162,149163,149164,149165,149166,149167,149168,149169,149170,149171,149172,149173,149174,149175,149176,149177,149178,149179,149180,149181,149182,149183,149184,149185,149186,149187,149188,149189,149190,149191,149192,149193,149194,149195,149196,149197,149198,149199,149200,149201,149202,149203,149204,149205,149206,149207,149208,149209,149210,149211,149212,149213,149214,149215,149216,149217,149218,149219,149220,149221,149222,149223,149224,149225,149226,149227,149228,149229,149230,149231,149232,149233,149234,149235,149236,149237,149238,149239,149240,149241,149242,149243,149244,149245,149246,149247,149248,149249,149250,149251,149252,149253,149254,149255,149256,149257,149258,149259,149260,149261,149262,149263,149264,149265,149266,149267,149268,149269,149270,149271,149272,149273,149274,149275,149276,149277,149278,149279,149280,149281,149282,149283,149284,149285,149286,149287,149288,149289,149290,149291,149292,149293,149294,149295,149296,149297,149298,149299,149300,149301,149302,149303,149304,149305,149306,149307,149308,149309,149310,149311,149312,149313,149314,149315,149316,149317,149318,149319,149320,149321,149322,149323,149324,149325,149326,149327,149328,149329,149330,149331,149332,149333,149334,149335,149336,149337,149338,149339,149340,149341,149342,149343,149344,149345,149346,149347,149348,149349,149350,149351,149352,149353,149354,149355,149356,149357,149358,149359,149360,149361,149362,149363,149364,149365,149366,149367,149368,149369,149370,149371,149372,149373,149374,149375,149376,149377,149378,149379,149380,149381,149382,149383,149384,149385,149386,149387,149388,149389,149390,149391,149392,149393,149394,149395,149396,149397,149398,149399,149400,149401,149402,149403,149404,149405,149406,149407,149408,149409,149410,149411,149412,149413,149414,149415,149416,149417,149418,149419,149420,149421,149422,149423,149424,149425,149426,149427,149428,149429,149430,149431,149432,149433,149434,149435,149436,149437,149438,149439,149440,149441,149442,149443,149444,149445,149446,149447,149448,149449,149450,149451,149452,149453,149454,149455,149456,149457,149458,149459,149460,149461,149462,149463,149464,149465,149466,149467,149468,149469,149470,149471,149472,149473,149474,149475,149476,149477,149478,149479,149480,149481,149482,149483,149484,149485,149486,149487,149488,149489,149490,149491,149492,149493,149494,149495,149496,149497,149498,149499,149500,149501,149502,149503,149504,149505,149506,149507,149508,149509,149510,149511,149512,149513,149514,149515,149516,149517,149518,149519,149520,149521,149522,149523,149524,149525,149526,149527,149528,149529,149530,149531,149532,149533,149534,149535,149536,149537,149538,149539,149540,149541,149542,149543,149544,149545,149546,149547,149548,149549,149550,149551,149552,149553,149554,149555,149556,149557,149558,149559,149560,149561,149562,149563,149564,149565,149566,149567,149568,149569,149570,149571,149572,149573,149574,149575,149576,149577,149578,149579,149580,149581,149582,149583,149584,149585,149586,149587,149588,149589,149590,149591,149592,149593,149594,149595,149596,149597,149598,149599,149600,149601,149602,149603,149604,149605,149606,149607,149608,149609,149610,149611,149612,149613,149614,149615,149616,149617,149618,149619,149620,149621,149622,149623,149624,149625,149626,149627,149628,149629,149630,149631,149632,149633,149634,149635,149636,149637,149638,149639,149640,149641,149642,149643,149644,149645,149646,149647,149648,149649,149650,149651,149652,149653,149654,149655,149656,149657,149658,149659,149660,149661,149662,149663,149664,149665,149666,149667,149668,149669,149670,149671,149672,149673,149674,149675,149676,149677,149678,149679,149680,149681,149682,149683,149684,149685,149686,149687,149688,149689,149690,149691,149692,149693,149694,149695,149696,149697,149698,149699,149700,149701,149702,149703,149704,149705,149706,149707,149708,149709,149710,149711,149712,149713,149714,149715,149716,149717,149718,149719,149720,149721,149722,149723,149724,149725,149726,149727,149728,149729,149730,149731,149732,149733,149734,149735,149736,149737,149738,149739,149740,149741,149742,149743,149744,149745,149746,149747,149748,149749,149750,149751,149752,149753,149754,149755,149756,149757,149758,149759,149760,149761,149762,149763,149764,149765,149766,149767,149768,149769,149770,149771,149772,149773,149774,149775,149776,149777,149778,149779,149780,149781,149782,149783,149784,149785,149786,149787,149788,149789,149790,149791,149792,149793,149794,149795,149796,149797,149798,149799,149800,149801,149802,149803,149804,149805,149806,149807,149808,149809,149810,149811,149812,149813,149814,149815,149816,149817,149818,149819,149820,149821,149822,149823,149824,149825,149826,149827,149828,149829,149830,149831,149832,149833,149834,149835,149836,149837,149838,149839,149840,149841,149842,149843,149844,149845,149846,149847,149848,149849,149850,149851,149852,149853,149854,149855,149856,149857,149858,149859,149860,149861,149862,149863,149864,149865,149866,149867,149868,149869,149870,149871,149872,149873,149874,149875,149876,149877,149878,149879,149880,149881,149882,149883,149884,149885,149886,149887,149888,149889,149890,149891,149892,149893,149894,149895,149896,149897,149898,149899,149900,149901,149902,149903,149904,149905,149906,149907,149908,149909,149910,149911,149912,149913,149914,149915,149916,149917,149918,149919,149920,149921,149922,149923,149924,149925,149926,149927,149928,149929,149930,149931,149932,149933,149934,149935,149936,149937,149938,149939,149940,149941,149942,149943,149944,149945,149946,149947,149948,149949,149950,149951,149952,149953,149954,149955,149956,149957,149958,149959,149960,149961,149962,149963,149964,149965,149966,149967,149968,149969,149970,149971,149972,149973,149974,149975,149976,149977,149978,149979,149980,149981,149982,149983,149984,149985,149986,149987,149988,149989,149990,149991,149992,149993,149994,149995,149996,149997,149998,149999,150000,150001,150002,150003,150004,150005,150006,150007,150008,150009,150010,150011,150012,150013,150014,150015,150016,150017,150018,150019,150020,150021,150022,150023,150024,150025,150026,150027,150028,150029,150030,150031,150032,150033,150034,150035,150036,150037,150038,150039,150040,150041,150042,150043,150044,150045,150046,150047,150048,150049,150050,150051,150052,150053,150054,150055,150056,150057,150058,150059,150060,150061,150062,150063,150064,150065,150066,150067,150068,150069,150070,150071,150072,150073,150074,150075,150076,150077,150078,150079,150080,150081,150082,150083,150084,150085,150086,150087,150088,150089,150090,150091,150092,150093,150094,150095,150096,150097,150098,150099,150100,150101,150102,150103,150104,150105,150106,150107,150108,150109,150110,150111,150112,150113,150114,150115,150116,150117,150118,150119,150120,150121,150122,150123,150124,150125,150126,150127,150128,150129,150130,150131,150132,150133,150134,150135,150136,150137,150138,150139,150140,150141,150142,150143,150144,150145,150146,150147,150148,150149,150150,150151,150152,150153,150154,150155,150156,150157,150158,150159,150160,150161,150162,150163,150164,150165,150166,150167,150168,150169,150170,150171,150172,150173,150174,150175,150176,150177,150178,150179,150180,150181,150182,150183,150184,150185,150186,150187,150188,150189,150190,150191,150192,150193,150194,150195,150196,150197,150198,150199,150200,150201,150202,150203,150204,150205,150206,150207,150208,150209,150210,150211,150212,150213,150214,150215,150216,150217,150218,150219,150220,150221,150222,150223,150224,150225,150226,150227,150228,150229,150230,150231,150232,150233,150234,150235,150236,150237,150238,150239,150240,150241,150242,150243,150244,150245,150246,150247,150248,150249,150250,150251,150252,150253,150254,150255,150256,150257,150258,150259,150260,150261,150262,150263,150264,150265,150266,150267,150268,150269,150270,150271,150272,150273,150274,150275,150276,150277,150278,150279,150280,150281,150282,150283,150284,150285,150286,150287,150288,150289,150290,150291,150292,150293,150294,150295,150296,150297,150298,150299,150300,150301,150302,150303,150304,150305,150306,150307,150308,150309,150310,150311,150312,150313,150314,150315,150316,150317,150318,150319,150320,150321,150322,150323,150324,150325,150326,150327,150328,150329,150330,150331,150332,150333,150334,150335,150336,150337,150338,150339,150340,150341,150342,150343,150344,150345,150346,150347,150348,150349,150350,150351,150352,150353,150354,150355,150356,150357,150358,150359,150360,150361,150362,150363,150364,150365,150366,150367,150368,150369,150370,150371,150372,150373,150374,150375,150376,150377,150378,150379,150380,150381,150382,150383,150384,150385,150386,150387,150388,150389,150390,150391,150392,150393,150394,150395,150396,150397,150398,150399,150400,150401,150402,150403,150404,150405,150406,150407,150408,150409,150410,150411,150412,150413,150414,150415,150416,150417,150418,150419,150420,150421,150422,150423,150424,150425,150426,150427,150428,150429,150430,150431,150432,150433,150434,150435,150436,150437,150438,150439,150440,150441,150442,150443,150444,150445,150446,150447,150448,150449,150450,150451,150452,150453,150454,150455,150456,150457,150458,150459,150460,150461,150462,150463,150464,150465,150466,150467,150468,150469,150470,150471,150472,150473,150474,150475,150476,150477,150478,150479,150480,150481,150482,150483,150484,150485,150486,150487,150488,150489,150490,150491,150492,150493,150494,150495,150496,150497,150498,150499,150500,150501,150502,150503,150504,150505,150506,150507,150508,150509,150510,150511,150512,150513,150514,150515,150516,150517,150518,150519,150520,150521,150522,150523,150524,150525,150526,150527,150528,150529,150530,150531,150532,150533,150534,150535,150536,150537,150538,150539,150540,150541,150542,150543,150544,150545,150546,150547,150548,150549,150550,150551,150552,150553,150554,150555,150556,150557,150558,150559,150560,150561,150562,150563,150564,150565,150566,150567,150568,150569,150570,150571,150572,150573,150574,150575,150576,150577,150578,150579,150580,150581,150582,150583,150584,150585,150586,150587,150588,150589,150590,150591,150592,150593,150594,150595,150596,150597,150598,150599,150600,150601,150602,150603,150604,150605,150606,150607,150608,150609,150610,150611,150612,150613,150614,150615,150616,150617,150618,150619,150620,150621,150622,150623,150624,150625,150626,150627,150628,150629,150630,150631,150632,150633,150634,150635,150636,150637,150638,150639,150640,150641,150642,150643,150644,150645,150646,150647,150648,150649,150650,150651,150652,150653,150654,150655,150656,150657,150658,150659,150660,150661,150662,150663,150664,150665,150666,150667,150668,150669,150670,150671,150672,150673,150674,150675,150676,150677,150678,150679,150680,150681,150682,150683,150684,150685,150686,150687,150688,150689,150690,150691,150692,150693,150694,150695,150696,150697,150698,150699,150700,150701,150702,150703,150704,150705,150706,150707,150708,150709,150710,150711,150712,150713,150714,150715,150716,150717,150718,150719,150720,150721,150722,150723,150724,150725,150726,150727,150728,150729,150730,150731,150732,150733,150734,150735,150736,150737,150738,150739,150740,150741,150742,150743,150744,150745,150746,150747,150748,150749,150750,150751,150752,150753,150754,150755,150756,150757,150758,150759,150760,150761,150762,150763,150764,150765,150766,150767,150768,150769,150770,150771,150772,150773,150774,150775,150776,150777,150778,150779,150780,150781,150782,150783,150784,150785,150786,150787,150788,150789,150790,150791,150792,150793,150794,150795,150796,150797,150798,150799,150800,150801,150802,150803,150804,150805,150806,150807,150808,150809,150810,150811,150812,150813,150814,150815,150816,150817,150818,150819,150820,150821,150822,150823,150824,150825,150826,150827,150828,150829,150830,150831,150832,150833,150834,150835,150836,150837,150838,150839,150840,150841,150842,150843,150844,150845,150846,150847,150848,150849,150850,150851,150852,150853,150854,150855,150856,150857,150858,150859,150860,150861,150862,150863,150864,150865,150866,150867,150868,150869,150870,150871,150872,150873,150874,150875,150876,150877,150878,150879,150880,150881,150882,150883,150884,150885,150886,150887,150888,150889,150890,150891,150892,150893,150894,150895,150896,150897,150898,150899,150900,150901,150902,150903,150904,150905,150906,150907,150908,150909,150910,150911,150912,150913,150914,150915,150916,150917,150918,150919,150920,150921,150922,150923,150924,150925,150926,150927,150928,150929,150930,150931,150932,150933,150934,150935,150936,150937,150938,150939,150940,150941,150942,150943,150944,150945,150946,150947,150948,150949,150950,150951,150952,150953,150954,150955,150956,150957,150958,150959,150960,150961,150962,150963,150964,150965,150966,150967,150968,150969,150970,150971,150972,150973,150974,150975,150976,150977,150978,150979,150980,150981,150982,150983,150984,150985,150986,150987,150988,150989,150990,150991,150992,150993,150994,150995,150996,150997,150998,150999,151000,151001,151002,151003,151004,151005,151006,151007,151008,151009,151010,151011,151012,151013,151014,151015,151016,151017,151018,151019,151020,151021,151022,151023,151024,151025,151026,151027,151028,151029,151030,151031,151032,151033,151034,151035,151036,151037,151038,151039,151040,151041,151042,151043,151044,151045,151046,151047,151048,151049,151050,151051,151052,151053,151054,151055,151056,151057,151058,151059,151060,151061,151062,151063,151064,151065,151066,151067,151068,151069,151070,151071,151072,151073,151074,151075,151076,151077,151078,151079,151080,151081,151082,151083,151084,151085,151086,151087,151088,151089,151090,151091,151092,151093,151094,151095,151096,151097,151098,151099,151100,151101,151102,151103,151104,151105,151106,151107,151108,151109,151110,151111,151112,151113,151114,151115,151116,151117,151118,151119,151120,151121,151122,151123,151124,151125,151126,151127,151128,151129,151130,151131,151132,151133,151134,151135,151136,151137,151138,151139,151140,151141,151142,151143,151144,151145,151146,151147,151148,151149,151150,151151,151152,151153,151154,151155,151156,151157,151158,151159,151160,151161,151162,151163,151164,151165,151166,151167,151168,151169,151170,151171,151172,151173,151174,151175,151176,151177,151178,151179,151180,151181,151182,151183,151184,151185,151186,151187,151188,151189,151190,151191,151192,151193,151194,151195,151196,151197,151198,151199,151200,151201,151202,151203,151204,151205,151206,151207,151208,151209,151210,151211,151212,151213,151214,151215,151216,151217,151218,151219,151220,151221,151222,151223,151224,151225,151226,151227,151228,151229,151230,151231,151232,151233,151234,151235,151236,151237,151238,151239,151240,151241,151242,151243,151244,151245,151246,151247,151248,151249,151250,151251,151252,151253,151254,151255,151256,151257,151258,151259,151260,151261,151262,151263,151264,151265,151266,151267,151268,151269,151270,151271,151272,151273,151274,151275,151276,151277,151278,151279,151280,151281,151282,151283,151284,151285,151286,151287,151288,151289,151290,151291,151292,151293,151294,151295,151296,151297,151298,151299,151300,151301,151302,151303,151304,151305,151306,151307,151308,151309,151310,151311,151312,151313,151314,151315,151316,151317,151318,151319,151320,151321,151322,151323,151324,151325,151326,151327,151328,151329,151330,151331,151332,151333,151334,151335,151336,151337,151338,151339,151340,151341,151342,151343,151344,151345,151346,151347,151348,151349,151350,151351,151352,151353,151354,151355,151356,151357,151358,151359,151360,151361,151362,151363,151364,151365,151366,151367,151368,151369,151370,151371,151372,151373,151374,151375,151376,151377,151378,151379,151380,151381,151382,151383,151384,151385,151386,151387,151388,151389,151390,151391,151392,151393,151394,151395,151396,151397,151398,151399,151400,151401,151402,151403,151404,151405,151406,151407,151408,151409,151410,151411,151412,151413,151414,151415,151416,151417,151418,151419,151420,151421,151422,151423,151424,151425,151426,151427,151428,151429,151430,151431,151432,151433,151434,151435,151436,151437,151438,151439,151440,151441,151442,151443,151444,151445,151446,151447,151448,151449,151450,151451,151452,151453,151454,151455,151456,151457,151458,151459,151460,151461,151462,151463,151464,151465,151466,151467,151468,151469,151470,151471,151472,151473,151474,151475,151476,151477,151478,151479,151480,151481,151482,151483,151484,151485,151486,151487,151488,151489,151490,151491,151492,151493,151494,151495,151496,151497,151498,151499,151500,151501,151502,151503,151504,151505,151506,151507,151508,151509,151510,151511,151512,151513,151514,151515,151516,151517,151518,151519,151520,151521,151522,151523,151524,151525,151526,151527,151528,151529,151530,151531,151532,151533,151534,151535,151536,151537,151538,151539,151540,151541,151542,151543,151544,151545,151546,151547,151548,151549,151550,151551,151552,151553,151554,151555,151556,151557,151558,151559,151560,151561,151562,151563,151564,151565,151566,151567,151568,151569,151570,151571,151572,151573,151574,151575,151576,151577,151578,151579,151580,151581,151582,151583,151584,151585,151586,151587,151588,151589,151590,151591,151592,151593,151594,151595,151596,151597,151598,151599,151600,151601,151602,151603,151604,151605,151606,151607,151608,151609,151610,151611,151612,151613,151614,151615,151616,151617,151618,151619,151620,151621,151622,151623,151624,151625,151626,151627,151628,151629,151630,151631,151632,151633,151634,151635,151636,151637,151638,151639,151640,151641,151642,151643,151644,151645,151646,151647,151648,151649,151650,151651,151652,151653,151654,151655,151656,151657,151658,151659,151660,151661,151662,151663,151664,151665,151666,151667,151668,151669,151670,151671,151672,151673,151674,151675,151676,151677,151678,151679,151680,151681,151682,151683,151684,151685,151686,151687,151688,151689,151690,151691,151692,151693,151694,151695,151696,151697,151698,151699,151700,151701,151702,151703,151704,151705,151706,151707,151708,151709,151710,151711,151712,151713,151714,151715,151716,151717,151718,151719,151720,151721,151722,151723,151724,151725,151726,151727,151728,151729,151730,151731,151732,151733,151734,151735,151736,151737,151738,151739,151740,151741,151742,151743,151744,151745,151746,151747,151748,151749,151750,151751,151752,151753,151754,151755,151756,151757,151758,151759,151760,151761,151762,151763,151764,151765,151766,151767,151768,151769,151770,151771,151772,151773,151774,151775,151776,151777,151778,151779,151780,151781,151782,151783,151784,151785,151786,151787,151788,151789,151790,151791,151792,151793,151794,151795,151796,151797,151798,151799,151800,151801,151802,151803,151804,151805,151806,151807,151808,151809,151810,151811,151812,151813,151814,151815,151816,151817,151818,151819,151820,151821,151822,151823,151824,151825,151826,151827,151828,151829,151830,151831,151832,151833,151834,151835,151836,151837,151838,151839,151840,151841,151842,151843,151844,151845,151846,151847,151848,151849,151850,151851,151852,151853,151854,151855,151856,151857,151858,151859,151860,151861,151862,151863,151864,151865,151866,151867,151868,151869,151870,151871,151872,151873,151874,151875,151876,151877,151878,151879,151880,151881,151882,151883,151884,151885,151886,151887,151888,151889,151890,151891,151892,151893,151894,151895,151896,151897,151898,151899,151900,151901,151902,151903,151904,151905,151906,151907,151908,151909,151910,151911,151912,151913,151914,151915,151916,151917,151918,151919,151920,151921,151922,151923,151924,151925,151926,151927,151928,151929,151930,151931,151932,151933,151934,151935,151936,151937,151938,151939,151940,151941,151942,151943,151944,151945,151946,151947,151948,151949,151950,151951,151952,151953,151954,151955,151956,151957,151958,151959,151960,151961,151962,151963,151964,151965,151966,151967,151968,151969,151970,151971,151972,151973,151974,151975,151976,151977,151978,151979,151980,151981,151982,151983,151984,151985,151986,151987,151988,151989,151990,151991,151992,151993,151994,151995,151996,151997,151998,151999,152000,152001,152002,152003,152004,152005,152006,152007,152008,152009,152010,152011,152012,152013,152014,152015,152016,152017,152018,152019,152020,152021,152022,152023,152024,152025,152026,152027,152028,152029,152030,152031,152032,152033,152034,152035,152036,152037,152038,152039,152040,152041,152042,152043,152044,152045,152046,152047,152048,152049,152050,152051,152052,152053,152054,152055,152056,152057,152058,152059,152060,152061,152062,152063,152064,152065,152066,152067,152068,152069,152070,152071,152072,152073,152074,152075,152076,152077,152078,152079,152080,152081,152082,152083,152084,152085,152086,152087,152088,152089,152090,152091,152092,152093,152094,152095,152096,152097,152098,152099,152100,152101,152102,152103,152104,152105,152106,152107,152108,152109,152110,152111,152112,152113,152114,152115,152116,152117,152118,152119,152120,152121,152122,152123,152124,152125,152126,152127,152128,152129,152130,152131,152132,152133,152134,152135,152136,152137,152138,152139,152140,152141,152142,152143,152144,152145,152146,152147,152148,152149,152150,152151,152152,152153,152154,152155,152156,152157,152158,152159,152160,152161,152162,152163,152164,152165,152166,152167,152168,152169,152170,152171,152172,152173,152174,152175,152176,152177,152178,152179,152180,152181,152182,152183,152184,152185,152186,152187,152188,152189,152190,152191,152192,152193,152194,152195,152196,152197,152198,152199,152200,152201,152202,152203,152204,152205,152206,152207,152208,152209,152210,152211,152212,152213,152214,152215,152216,152217,152218,152219,152220,152221,152222,152223,152224,152225,152226,152227,152228,152229,152230,152231,152232,152233,152234,152235,152236,152237,152238,152239,152240,152241,152242,152243,152244,152245,152246,152247,152248,152249,152250,152251,152252,152253,152254,152255,152256,152257,152258,152259,152260,152261,152262,152263,152264,152265,152266,152267,152268,152269,152270,152271,152272,152273,152274,152275,152276,152277,152278,152279,152280,152281,152282,152283,152284,152285,152286,152287,152288,152289,152290,152291,152292,152293,152294,152295,152296,152297,152298,152299,152300,152301,152302,152303,152304,152305,152306,152307,152308,152309,152310,152311,152312,152313,152314,152315,152316,152317,152318,152319,152320,152321,152322,152323,152324,152325,152326,152327,152328,152329,152330,152331,152332,152333,152334,152335,152336,152337,152338,152339,152340,152341,152342,152343,152344,152345,152346,152347,152348,152349,152350,152351,152352,152353,152354,152355,152356,152357,152358,152359,152360,152361,152362,152363,152364,152365,152366,152367,152368,152369,152370,152371,152372,152373,152374,152375,152376,152377,152378,152379,152380,152381,152382,152383,152384,152385,152386,152387,152388,152389,152390,152391,152392,152393,152394,152395,152396,152397,152398,152399,152400,152401,152402,152403,152404,152405,152406,152407,152408,152409,152410,152411,152412,152413,152414,152415,152416,152417,152418,152419,152420,152421,152422,152423,152424,152425,152426,152427,152428,152429,152430,152431,152432,152433,152434,152435,152436,152437,152438,152439,152440,152441,152442,152443,152444,152445,152446,152447,152448,152449,152450,152451,152452,152453,152454,152455,152456,152457,152458,152459,152460,152461,152462,152463,152464,152465,152466,152467,152468,152469,152470,152471,152472,152473,152474,152475,152476,152477,152478,152479,152480,152481,152482,152483,152484,152485,152486,152487,152488,152489,152490,152491,152492,152493,152494,152495,152496,152497,152498,152499,152500,152501,152502,152503,152504,152505,152506,152507,152508,152509,152510,152511,152512,152513,152514,152515,152516,152517,152518,152519,152520,152521,152522,152523,152524,152525,152526,152527,152528,152529,152530,152531,152532,152533,152534,152535,152536,152537,152538,152539,152540,152541,152542,152543,152544,152545,152546,152547,152548,152549,152550,152551,152552,152553,152554,152555,152556,152557,152558,152559,152560,152561,152562,152563,152564,152565,152566,152567,152568,152569,152570,152571,152572,152573,152574,152575,152576,152577,152578,152579,152580,152581,152582,152583,152584,152585,152586,152587,152588,152589,152590,152591,152592,152593,152594,152595,152596,152597,152598,152599,152600,152601,152602,152603,152604,152605,152606,152607,152608,152609,152610,152611,152612,152613,152614,152615,152616,152617,152618,152619,152620,152621,152622,152623,152624,152625,152626,152627,152628,152629,152630,152631,152632,152633,152634,152635,152636,152637,152638,152639,152640,152641,152642,152643,152644,152645,152646,152647,152648,152649,152650,152651,152652,152653,152654,152655,152656,152657,152658,152659,152660,152661,152662,152663,152664,152665,152666,152667,152668,152669,152670,152671,152672,152673,152674,152675,152676,152677,152678,152679,152680,152681,152682,152683,152684,152685,152686,152687,152688,152689,152690,152691,152692,152693,152694,152695,152696,152697,152698,152699,152700,152701,152702,152703,152704,152705,152706,152707,152708,152709,152710,152711,152712,152713,152714,152715,152716,152717,152718,152719,152720,152721,152722,152723,152724,152725,152726,152727,152728,152729,152730,152731,152732,152733,152734,152735,152736,152737,152738,152739,152740,152741,152742,152743,152744,152745,152746,152747,152748,152749,152750,152751,152752,152753,152754,152755,152756,152757,152758,152759,152760,152761,152762,152763,152764,152765,152766,152767,152768,152769,152770,152771,152772,152773,152774,152775,152776,152777,152778,152779,152780,152781,152782,152783,152784,152785,152786,152787,152788,152789,152790,152791,152792,152793,152794,152795,152796,152797,152798,152799,152800,152801,152802,152803,152804,152805,152806,152807,152808,152809,152810,152811,152812,152813,152814,152815,152816,152817,152818,152819,152820,152821,152822,152823,152824,152825,152826,152827,152828,152829,152830,152831,152832,152833,152834,152835,152836,152837,152838,152839,152840,152841,152842,152843,152844,152845,152846,152847,152848,152849,152850,152851,152852,152853,152854,152855,152856,152857,152858,152859,152860,152861,152862,152863,152864,152865,152866,152867,152868,152869,152870,152871,152872,152873,152874,152875,152876,152877,152878,152879,152880,152881,152882,152883,152884,152885,152886,152887,152888,152889,152890,152891,152892,152893,152894,152895,152896,152897,152898,152899,152900,152901,152902,152903,152904,152905,152906,152907,152908,152909,152910,152911,152912,152913,152914,152915,152916,152917,152918,152919,152920,152921,152922,152923,152924,152925,152926,152927,152928,152929,152930,152931,152932,152933,152934,152935,152936,152937,152938,152939,152940,152941,152942,152943,152944,152945,152946,152947,152948,152949,152950,152951,152952,152953,152954,152955,152956,152957,152958,152959,152960,152961,152962,152963,152964,152965,152966,152967,152968,152969,152970,152971,152972,152973,152974,152975,152976,152977,152978,152979,152980,152981,152982,152983,152984,152985,152986,152987,152988,152989,152990,152991,152992,152993,152994,152995,152996,152997,152998,152999,153000,153001,153002,153003,153004,153005,153006,153007,153008,153009,153010,153011,153012,153013,153014,153015,153016,153017,153018,153019,153020,153021,153022,153023,153024,153025,153026,153027,153028,153029,153030,153031,153032,153033,153034,153035,153036,153037,153038,153039,153040,153041,153042,153043,153044,153045,153046,153047,153048,153049,153050,153051,153052,153053,153054,153055,153056,153057,153058,153059,153060,153061,153062,153063,153064,153065,153066,153067,153068,153069,153070,153071,153072,153073,153074,153075,153076,153077,153078,153079,153080,153081,153082,153083,153084,153085,153086,153087,153088,153089,153090,153091,153092,153093,153094,153095,153096,153097,153098,153099,153100,153101,153102,153103,153104,153105,153106,153107,153108,153109,153110,153111,153112,153113,153114,153115,153116,153117,153118,153119,153120,153121,153122,153123,153124,153125,153126,153127,153128,153129,153130,153131,153132,153133,153134,153135,153136,153137,153138,153139,153140,153141,153142,153143,153144,153145,153146,153147,153148,153149,153150,153151,153152,153153,153154,153155,153156,153157,153158,153159,153160,153161,153162,153163,153164,153165,153166,153167,153168,153169,153170,153171,153172,153173,153174,153175,153176,153177,153178,153179,153180,153181,153182,153183,153184,153185,153186,153187,153188,153189,153190,153191,153192,153193,153194,153195,153196,153197,153198,153199,153200,153201,153202,153203,153204,153205,153206,153207,153208,153209,153210,153211,153212,153213,153214,153215,153216,153217,153218,153219,153220,153221,153222,153223,153224,153225,153226,153227,153228,153229,153230,153231,153232,153233,153234,153235,153236,153237,153238,153239,153240,153241,153242,153243,153244,153245,153246,153247,153248,153249,153250,153251,153252,153253,153254,153255,153256,153257,153258,153259,153260,153261,153262,153263,153264,153265,153266,153267,153268,153269,153270,153271,153272,153273,153274,153275,153276,153277,153278,153279,153280,153281,153282,153283,153284,153285,153286,153287,153288,153289,153290,153291,153292,153293,153294,153295,153296,153297,153298,153299,153300,153301,153302,153303,153304,153305,153306,153307,153308,153309,153310,153311,153312,153313,153314,153315,153316,153317,153318,153319,153320,153321,153322,153323,153324,153325,153326,153327,153328,153329,153330,153331,153332,153333,153334,153335,153336,153337,153338,153339,153340,153341,153342,153343,153344,153345,153346,153347,153348,153349,153350,153351,153352,153353,153354,153355,153356,153357,153358,153359,153360,153361,153362,153363,153364,153365,153366,153367,153368,153369,153370,153371,153372,153373,153374,153375,153376,153377,153378,153379,153380,153381,153382,153383,153384,153385,153386,153387,153388,153389,153390,153391,153392,153393,153394,153395,153396,153397,153398,153399,153400,153401,153402,153403,153404,153405,153406,153407,153408,153409,153410,153411,153412,153413,153414,153415,153416,153417,153418,153419,153420,153421,153422,153423,153424,153425,153426,153427,153428,153429,153430,153431,153432,153433,153434,153435,153436,153437,153438,153439,153440,153441,153442,153443,153444,153445,153446,153447,153448,153449,153450,153451,153452,153453,153454,153455,153456,153457,153458,153459,153460,153461,153462,153463,153464,153465,153466,153467,153468,153469,153470,153471,153472,153473,153474,153475,153476,153477,153478,153479,153480,153481,153482,153483,153484,153485,153486,153487,153488,153489,153490,153491,153492,153493,153494,153495,153496,153497,153498,153499,153500,153501,153502,153503,153504,153505,153506,153507,153508,153509,153510,153511,153512,153513,153514,153515,153516,153517,153518,153519,153520,153521,153522,153523,153524,153525,153526,153527,153528,153529,153530,153531,153532,153533,153534,153535,153536,153537,153538,153539,153540,153541,153542,153543,153544,153545,153546,153547,153548,153549,153550,153551,153552,153553,153554,153555,153556,153557,153558,153559,153560,153561,153562,153563,153564,153565,153566,153567,153568,153569,153570,153571,153572,153573,153574,153575,153576,153577,153578,153579,153580,153581,153582,153583,153584,153585,153586,153587,153588,153589,153590,153591,153592,153593,153594,153595,153596,153597,153598,153599,153600,153601,153602,153603,153604,153605,153606,153607,153608,153609,153610,153611,153612,153613,153614,153615,153616,153617,153618,153619,153620,153621,153622,153623,153624,153625,153626,153627,153628,153629,153630,153631,153632,153633,153634,153635,153636,153637,153638,153639,153640,153641,153642,153643,153644,153645,153646,153647,153648,153649,153650,153651,153652,153653,153654,153655,153656,153657,153658,153659,153660,153661,153662,153663,153664,153665,153666,153667,153668,153669,153670,153671,153672,153673,153674,153675,153676,153677,153678,153679,153680,153681,153682,153683,153684,153685,153686,153687,153688,153689,153690,153691,153692,153693,153694,153695,153696,153697,153698,153699,153700,153701,153702,153703,153704,153705,153706,153707,153708,153709,153710,153711,153712,153713,153714,153715,153716,153717,153718,153719,153720,153721,153722,153723,153724,153725,153726,153727,153728,153729,153730,153731,153732,153733,153734,153735,153736,153737,153738,153739,153740,153741,153742,153743,153744,153745,153746,153747,153748,153749,153750,153751,153752,153753,153754,153755,153756,153757,153758,153759,153760,153761,153762,153763,153764,153765,153766,153767,153768,153769,153770,153771,153772,153773,153774,153775,153776,153777,153778,153779,153780,153781,153782,153783,153784,153785,153786,153787,153788,153789,153790,153791,153792,153793,153794,153795,153796,153797,153798,153799,153800,153801,153802,153803,153804,153805,153806,153807,153808,153809,153810,153811,153812,153813,153814,153815,153816,153817,153818,153819,153820,153821,153822,153823,153824,153825,153826,153827,153828,153829,153830,153831,153832,153833,153834,153835,153836,153837,153838,153839,153840,153841,153842,153843,153844,153845,153846,153847,153848,153849,153850,153851,153852,153853,153854,153855,153856,153857,153858,153859,153860,153861,153862,153863,153864,153865,153866,153867,153868,153869,153870,153871,153872,153873,153874,153875,153876,153877,153878,153879,153880,153881,153882,153883,153884,153885,153886,153887,153888,153889,153890,153891,153892,153893,153894,153895,153896,153897,153898,153899,153900,153901,153902,153903,153904,153905,153906,153907,153908,153909,153910,153911,153912,153913,153914,153915,153916,153917,153918,153919,153920,153921,153922,153923,153924,153925,153926,153927,153928,153929,153930,153931,153932,153933,153934,153935,153936,153937,153938,153939,153940,153941,153942,153943,153944,153945,153946,153947,153948,153949,153950,153951,153952,153953,153954,153955,153956,153957,153958,153959,153960,153961,153962,153963,153964,153965,153966,153967,153968,153969,153970,153971,153972,153973,153974,153975,153976,153977,153978,153979,153980,153981,153982,153983,153984,153985,153986,153987,153988,153989,153990,153991,153992,153993,153994,153995,153996,153997,153998,153999,154000,154001,154002,154003,154004,154005,154006,154007,154008,154009,154010,154011,154012,154013,154014,154015,154016,154017,154018,154019,154020,154021,154022,154023,154024,154025,154026,154027,154028,154029,154030,154031,154032,154033,154034,154035,154036,154037,154038,154039,154040,154041,154042,154043,154044,154045,154046,154047,154048,154049,154050,154051,154052,154053,154054,154055,154056,154057,154058,154059,154060,154061,154062,154063,154064,154065,154066,154067,154068,154069,154070,154071,154072,154073,154074,154075,154076,154077,154078,154079,154080,154081,154082,154083,154084,154085,154086,154087,154088,154089,154090,154091,154092,154093,154094,154095,154096,154097,154098,154099,154100,154101,154102,154103,154104,154105,154106,154107,154108,154109,154110,154111,154112,154113,154114,154115,154116,154117,154118,154119,154120,154121,154122,154123,154124,154125,154126,154127,154128,154129,154130,154131,154132,154133,154134,154135,154136,154137,154138,154139,154140,154141,154142,154143,154144,154145,154146,154147,154148,154149,154150,154151,154152,154153,154154,154155,154156,154157,154158,154159,154160,154161,154162,154163,154164,154165,154166,154167,154168,154169,154170,154171,154172,154173,154174,154175,154176,154177,154178,154179,154180,154181,154182,154183,154184,154185,154186,154187,154188,154189,154190,154191,154192,154193,154194,154195,154196,154197,154198,154199,154200,154201,154202,154203,154204,154205,154206,154207,154208,154209,154210,154211,154212,154213,154214,154215,154216,154217,154218,154219,154220,154221,154222,154223,154224,154225,154226,154227,154228,154229,154230,154231,154232,154233,154234,154235,154236,154237,154238,154239,154240,154241,154242,154243,154244,154245,154246,154247,154248,154249,154250,154251,154252,154253,154254,154255,154256,154257,154258,154259,154260,154261,154262,154263,154264,154265,154266,154267,154268,154269,154270,154271,154272,154273,154274,154275,154276,154277,154278,154279,154280,154281,154282,154283,154284,154285,154286,154287,154288,154289,154290,154291,154292,154293,154294,154295,154296,154297,154298,154299,154300,154301,154302,154303,154304,154305,154306,154307,154308,154309,154310,154311,154312,154313,154314,154315,154316,154317,154318,154319,154320,154321,154322,154323,154324,154325,154326,154327,154328,154329,154330,154331,154332,154333,154334,154335,154336,154337,154338,154339,154340,154341,154342,154343,154344,154345,154346,154347,154348,154349,154350,154351,154352,154353,154354,154355,154356,154357,154358,154359,154360,154361,154362,154363,154364,154365,154366,154367,154368,154369,154370,154371,154372,154373,154374,154375,154376,154377,154378,154379,154380,154381,154382,154383,154384,154385,154386,154387,154388,154389,154390,154391,154392,154393,154394,154395,154396,154397,154398,154399,154400,154401,154402,154403,154404,154405,154406,154407,154408,154409,154410,154411,154412,154413,154414,154415,154416,154417,154418,154419,154420,154421,154422,154423,154424,154425,154426,154427,154428,154429,154430,154431,154432,154433,154434,154435,154436,154437,154438,154439,154440,154441,154442,154443,154444,154445,154446,154447,154448,154449,154450,154451,154452,154453,154454,154455,154456,154457,154458,154459,154460,154461,154462,154463,154464,154465,154466,154467,154468,154469,154470,154471,154472,154473,154474,154475,154476,154477,154478,154479,154480,154481,154482,154483,154484,154485,154486,154487,154488,154489,154490,154491,154492,154493,154494,154495,154496,154497,154498,154499,154500,154501,154502,154503,154504,154505,154506,154507,154508,154509,154510,154511,154512,154513,154514,154515,154516,154517,154518,154519,154520,154521,154522,154523,154524,154525,154526,154527,154528,154529,154530,154531,154532,154533,154534,154535,154536,154537,154538,154539,154540,154541,154542,154543,154544,154545,154546,154547,154548,154549,154550,154551,154552,154553,154554,154555,154556,154557,154558,154559,154560,154561,154562,154563,154564,154565,154566,154567,154568,154569,154570,154571,154572,154573,154574,154575,154576,154577,154578,154579,154580,154581,154582,154583,154584,154585,154586,154587,154588,154589,154590,154591,154592,154593,154594,154595,154596,154597,154598,154599,154600,154601,154602,154603,154604,154605,154606,154607,154608,154609,154610,154611,154612,154613,154614,154615,154616,154617,154618,154619,154620,154621,154622,154623,154624,154625,154626,154627,154628,154629,154630,154631,154632,154633,154634,154635,154636,154637,154638,154639,154640,154641,154642,154643,154644,154645,154646,154647,154648,154649,154650,154651,154652,154653,154654,154655,154656,154657,154658,154659,154660,154661,154662,154663,154664,154665,154666,154667,154668,154669,154670,154671,154672,154673,154674,154675,154676,154677,154678,154679,154680,154681,154682,154683,154684,154685,154686,154687,154688,154689,154690,154691,154692,154693,154694,154695,154696,154697,154698,154699,154700,154701,154702,154703,154704,154705,154706,154707,154708,154709,154710,154711,154712,154713,154714,154715,154716,154717,154718,154719,154720,154721,154722,154723,154724,154725,154726,154727,154728,154729,154730,154731,154732,154733,154734,154735,154736,154737,154738,154739,154740,154741,154742,154743,154744,154745,154746,154747,154748,154749,154750,154751,154752,154753,154754,154755,154756,154757,154758,154759,154760,154761,154762,154763,154764,154765,154766,154767,154768,154769,154770,154771,154772,154773,154774,154775,154776,154777,154778,154779,154780,154781,154782,154783,154784,154785,154786,154787,154788,154789,154790,154791,154792,154793,154794,154795,154796,154797,154798,154799,154800,154801,154802,154803,154804,154805,154806,154807,154808,154809,154810,154811,154812,154813,154814,154815,154816,154817,154818,154819,154820,154821,154822,154823,154824,154825,154826,154827,154828,154829,154830,154831,154832,154833,154834,154835,154836,154837,154838,154839,154840,154841,154842,154843,154844,154845,154846,154847,154848,154849,154850,154851,154852,154853,154854,154855,154856,154857,154858,154859,154860,154861,154862,154863,154864,154865,154866,154867,154868,154869,154870,154871,154872,154873,154874,154875,154876,154877,154878,154879,154880,154881,154882,154883,154884,154885,154886,154887,154888,154889,154890,154891,154892,154893,154894,154895,154896,154897,154898,154899,154900,154901,154902,154903,154904,154905,154906,154907,154908,154909,154910,154911,154912,154913,154914,154915,154916,154917,154918,154919,154920,154921,154922,154923,154924,154925,154926,154927,154928,154929,154930,154931,154932,154933,154934,154935,154936,154937,154938,154939,154940,154941,154942,154943,154944,154945,154946,154947,154948,154949,154950,154951,154952,154953,154954,154955,154956,154957,154958,154959,154960,154961,154962,154963,154964,154965,154966,154967,154968,154969,154970,154971,154972,154973,154974,154975,154976,154977,154978,154979,154980,154981,154982,154983,154984,154985,154986,154987,154988,154989,154990,154991,154992,154993,154994,154995,154996,154997,154998,154999,155000,155001,155002,155003,155004,155005,155006,155007,155008,155009,155010,155011,155012,155013,155014,155015,155016,155017,155018,155019,155020,155021,155022,155023,155024,155025,155026,155027,155028,155029,155030,155031,155032,155033,155034,155035,155036,155037,155038,155039,155040,155041,155042,155043,155044,155045,155046,155047,155048,155049,155050,155051,155052,155053,155054,155055,155056,155057,155058,155059,155060,155061,155062,155063,155064,155065,155066,155067,155068,155069,155070,155071,155072,155073,155074,155075,155076,155077,155078,155079,155080,155081,155082,155083,155084,155085,155086,155087,155088,155089,155090,155091,155092,155093,155094,155095,155096,155097,155098,155099,155100,155101,155102,155103,155104,155105,155106,155107,155108,155109,155110,155111,155112,155113,155114,155115,155116,155117,155118,155119,155120,155121,155122,155123,155124,155125,155126,155127,155128,155129,155130,155131,155132,155133,155134,155135,155136,155137,155138,155139,155140,155141,155142,155143,155144,155145,155146,155147,155148,155149,155150,155151,155152,155153,155154,155155,155156,155157,155158,155159,155160,155161,155162,155163,155164,155165,155166,155167,155168,155169,155170,155171,155172,155173,155174,155175,155176,155177,155178,155179,155180,155181,155182,155183,155184,155185,155186,155187,155188,155189,155190,155191,155192,155193,155194,155195,155196,155197,155198,155199,155200,155201,155202,155203,155204,155205,155206,155207,155208,155209,155210,155211,155212,155213,155214,155215,155216,155217,155218,155219,155220,155221,155222,155223,155224,155225,155226,155227,155228,155229,155230,155231,155232,155233,155234,155235,155236,155237,155238,155239,155240,155241,155242,155243,155244,155245,155246,155247,155248,155249,155250,155251,155252,155253,155254,155255,155256,155257,155258,155259,155260,155261,155262,155263,155264,155265,155266,155267,155268,155269,155270,155271,155272,155273,155274,155275,155276,155277,155278,155279,155280,155281,155282,155283,155284,155285,155286,155287,155288,155289,155290,155291,155292,155293,155294,155295,155296,155297,155298,155299,155300,155301,155302,155303,155304,155305,155306,155307,155308,155309,155310,155311,155312,155313,155314,155315,155316,155317,155318,155319,155320,155321,155322,155323,155324,155325,155326,155327,155328,155329,155330,155331,155332,155333,155334,155335,155336,155337,155338,155339,155340,155341,155342,155343,155344,155345,155346,155347,155348,155349,155350,155351,155352,155353,155354,155355,155356,155357,155358,155359,155360,155361,155362,155363,155364,155365,155366,155367,155368,155369,155370,155371,155372,155373,155374,155375,155376,155377,155378,155379,155380,155381,155382,155383,155384,155385,155386,155387,155388,155389,155390,155391,155392,155393,155394,155395,155396,155397,155398,155399,155400,155401,155402,155403,155404,155405,155406,155407,155408,155409,155410,155411,155412,155413,155414,155415,155416,155417,155418,155419,155420,155421,155422,155423,155424,155425,155426,155427,155428,155429,155430,155431,155432,155433,155434,155435,155436,155437,155438,155439,155440,155441,155442,155443,155444,155445,155446,155447,155448,155449,155450,155451,155452,155453,155454,155455,155456,155457,155458,155459,155460,155461,155462,155463,155464,155465,155466,155467,155468,155469,155470,155471,155472,155473,155474,155475,155476,155477,155478,155479,155480,155481,155482,155483,155484,155485,155486,155487,155488,155489,155490,155491,155492,155493,155494,155495,155496,155497,155498,155499,155500,155501,155502,155503,155504,155505,155506,155507,155508,155509,155510,155511,155512,155513,155514,155515,155516,155517,155518,155519,155520,155521,155522,155523,155524,155525,155526,155527,155528,155529,155530,155531,155532,155533,155534,155535,155536,155537,155538,155539,155540,155541,155542,155543,155544,155545,155546,155547,155548,155549,155550,155551,155552,155553,155554,155555,155556,155557,155558,155559,155560,155561,155562,155563,155564,155565,155566,155567,155568,155569,155570,155571,155572,155573,155574,155575,155576,155577,155578,155579,155580,155581,155582,155583,155584,155585,155586,155587,155588,155589,155590,155591,155592,155593,155594,155595,155596,155597,155598,155599,155600,155601,155602,155603,155604,155605,155606,155607,155608,155609,155610,155611,155612,155613,155614,155615,155616,155617,155618,155619,155620,155621,155622,155623,155624,155625,155626,155627,155628,155629,155630,155631,155632,155633,155634,155635,155636,155637,155638,155639,155640,155641,155642,155643,155644,155645,155646,155647,155648,155649,155650,155651,155652,155653,155654,155655,155656,155657,155658,155659,155660,155661,155662,155663,155664,155665,155666,155667,155668,155669,155670,155671,155672,155673,155674,155675,155676,155677,155678,155679,155680,155681,155682,155683,155684,155685,155686,155687,155688,155689,155690,155691,155692,155693,155694,155695,155696,155697,155698,155699,155700,155701,155702,155703,155704,155705,155706,155707,155708,155709,155710,155711,155712,155713,155714,155715,155716,155717,155718,155719,155720,155721,155722,155723,155724,155725,155726,155727,155728,155729,155730,155731,155732,155733,155734,155735,155736,155737,155738,155739,155740,155741,155742,155743,155744,155745,155746,155747,155748,155749,155750,155751,155752,155753,155754,155755,155756,155757,155758,155759,155760,155761,155762,155763,155764,155765,155766,155767,155768,155769,155770,155771,155772,155773,155774,155775,155776,155777,155778,155779,155780,155781,155782,155783,155784,155785,155786,155787,155788,155789,155790,155791,155792,155793,155794,155795,155796,155797,155798,155799,155800,155801,155802,155803,155804,155805,155806,155807,155808,155809,155810,155811,155812,155813,155814,155815,155816,155817,155818,155819,155820,155821,155822,155823,155824,155825,155826,155827,155828,155829,155830,155831,155832,155833,155834,155835,155836,155837,155838,155839,155840,155841,155842,155843,155844,155845,155846,155847,155848,155849,155850,155851,155852,155853,155854,155855,155856,155857,155858,155859,155860,155861,155862,155863,155864,155865,155866,155867,155868,155869,155870,155871,155872,155873,155874,155875,155876,155877,155878,155879,155880,155881,155882,155883,155884,155885,155886,155887,155888,155889,155890,155891,155892,155893,155894,155895,155896,155897,155898,155899,155900,155901,155902,155903,155904,155905,155906,155907,155908,155909,155910,155911,155912,155913,155914,155915,155916,155917,155918,155919,155920,155921,155922,155923,155924,155925,155926,155927,155928,155929,155930,155931,155932,155933,155934,155935,155936,155937,155938,155939,155940,155941,155942,155943,155944,155945,155946,155947,155948,155949,155950,155951,155952,155953,155954,155955,155956,155957,155958,155959,155960,155961,155962,155963,155964,155965,155966,155967,155968,155969,155970,155971,155972,155973,155974,155975,155976,155977,155978,155979,155980,155981,155982,155983,155984,155985,155986,155987,155988,155989,155990,155991,155992,155993,155994,155995,155996,155997,155998,155999,156000,156001,156002,156003,156004,156005,156006,156007,156008,156009,156010,156011,156012,156013,156014,156015,156016,156017,156018,156019,156020,156021,156022,156023,156024,156025,156026,156027,156028,156029,156030,156031,156032,156033,156034,156035,156036,156037,156038,156039,156040,156041,156042,156043,156044,156045,156046,156047,156048,156049,156050,156051,156052,156053,156054,156055,156056,156057,156058,156059,156060,156061,156062,156063,156064,156065,156066,156067,156068,156069,156070,156071,156072,156073,156074,156075,156076,156077,156078,156079,156080,156081,156082,156083,156084,156085,156086,156087,156088,156089,156090,156091,156092,156093,156094,156095,156096,156097,156098,156099,156100,156101,156102,156103,156104,156105,156106,156107,156108,156109,156110,156111,156112,156113,156114,156115,156116,156117,156118,156119,156120,156121,156122,156123,156124,156125,156126,156127,156128,156129,156130,156131,156132,156133,156134,156135,156136,156137,156138,156139,156140,156141,156142,156143,156144,156145,156146,156147,156148,156149,156150,156151,156152,156153,156154,156155,156156,156157,156158,156159,156160,156161,156162,156163,156164,156165,156166,156167,156168,156169,156170,156171,156172,156173,156174,156175,156176,156177,156178,156179,156180,156181,156182,156183,156184,156185,156186,156187,156188,156189,156190,156191,156192,156193,156194,156195,156196,156197,156198,156199,156200,156201,156202,156203,156204,156205,156206,156207,156208,156209,156210,156211,156212,156213,156214,156215,156216,156217,156218,156219,156220,156221,156222,156223,156224,156225,156226,156227,156228,156229,156230,156231,156232,156233,156234,156235,156236,156237,156238,156239,156240,156241,156242,156243,156244,156245,156246,156247,156248,156249,156250,156251,156252,156253,156254,156255,156256,156257,156258,156259,156260,156261,156262,156263,156264,156265,156266,156267,156268,156269,156270,156271,156272,156273,156274,156275,156276,156277,156278,156279,156280,156281,156282,156283,156284,156285,156286,156287,156288,156289,156290,156291,156292,156293,156294,156295,156296,156297,156298,156299,156300,156301,156302,156303,156304,156305,156306,156307,156308,156309,156310,156311,156312,156313,156314,156315,156316,156317,156318,156319,156320,156321,156322,156323,156324,156325,156326,156327,156328,156329,156330,156331,156332,156333,156334,156335,156336,156337,156338,156339,156340,156341,156342,156343,156344,156345,156346,156347,156348,156349,156350,156351,156352,156353,156354,156355,156356,156357,156358,156359,156360,156361,156362,156363,156364,156365,156366,156367,156368,156369,156370,156371,156372,156373,156374,156375,156376,156377,156378,156379,156380,156381,156382,156383,156384,156385,156386,156387,156388,156389,156390,156391,156392,156393,156394,156395,156396,156397,156398,156399,156400,156401,156402,156403,156404,156405,156406,156407,156408,156409,156410,156411,156412,156413,156414,156415,156416,156417,156418,156419,156420,156421,156422,156423,156424,156425,156426,156427,156428,156429,156430,156431,156432,156433,156434,156435,156436,156437,156438,156439,156440,156441,156442,156443,156444,156445,156446,156447,156448,156449,156450,156451,156452,156453,156454,156455,156456,156457,156458,156459,156460,156461,156462,156463,156464,156465,156466,156467,156468,156469,156470,156471,156472,156473,156474,156475,156476,156477,156478,156479,156480,156481,156482,156483,156484,156485,156486,156487,156488,156489,156490,156491,156492,156493,156494,156495,156496,156497,156498,156499,156500,156501,156502,156503,156504,156505,156506,156507,156508,156509,156510,156511,156512,156513,156514,156515,156516,156517,156518,156519,156520,156521,156522,156523,156524,156525,156526,156527,156528,156529,156530,156531,156532,156533,156534,156535,156536,156537,156538,156539,156540,156541,156542,156543,156544,156545,156546,156547,156548,156549,156550,156551,156552,156553,156554,156555,156556,156557,156558,156559,156560,156561,156562,156563,156564,156565,156566,156567,156568,156569,156570,156571,156572,156573,156574,156575,156576,156577,156578,156579,156580,156581,156582,156583,156584,156585,156586,156587,156588,156589,156590,156591,156592,156593,156594,156595,156596,156597,156598,156599,156600,156601,156602,156603,156604,156605,156606,156607,156608,156609,156610,156611,156612,156613,156614,156615,156616,156617,156618,156619,156620,156621,156622,156623,156624,156625,156626,156627,156628,156629,156630,156631,156632,156633,156634,156635,156636,156637,156638,156639,156640,156641,156642,156643,156644,156645,156646,156647,156648,156649,156650,156651,156652,156653,156654,156655,156656,156657,156658,156659,156660,156661,156662,156663,156664,156665,156666,156667,156668,156669,156670,156671,156672,156673,156674,156675,156676,156677,156678,156679,156680,156681,156682,156683,156684,156685,156686,156687,156688,156689,156690,156691,156692,156693,156694,156695,156696,156697,156698,156699,156700,156701,156702,156703,156704,156705,156706,156707,156708,156709,156710,156711,156712,156713,156714,156715,156716,156717,156718,156719,156720,156721,156722,156723,156724,156725,156726,156727,156728,156729,156730,156731,156732,156733,156734,156735,156736,156737,156738,156739,156740,156741,156742,156743,156744,156745,156746,156747,156748,156749,156750,156751,156752,156753,156754,156755,156756,156757,156758,156759,156760,156761,156762,156763,156764,156765,156766,156767,156768,156769,156770,156771,156772,156773,156774,156775,156776,156777,156778,156779,156780,156781,156782,156783,156784,156785,156786,156787,156788,156789,156790,156791,156792,156793,156794,156795,156796,156797,156798,156799,156800,156801,156802,156803,156804,156805,156806,156807,156808,156809,156810,156811,156812,156813,156814,156815,156816,156817,156818,156819,156820,156821,156822,156823,156824,156825,156826,156827,156828,156829,156830,156831,156832,156833,156834,156835,156836,156837,156838,156839,156840,156841,156842,156843,156844,156845,156846,156847,156848,156849,156850,156851,156852,156853,156854,156855,156856,156857,156858,156859,156860,156861,156862,156863,156864,156865,156866,156867,156868,156869,156870,156871,156872,156873,156874,156875,156876,156877,156878,156879,156880,156881,156882,156883,156884,156885,156886,156887,156888,156889,156890,156891,156892,156893,156894,156895,156896,156897,156898,156899,156900,156901,156902,156903,156904,156905,156906,156907,156908,156909,156910,156911,156912,156913,156914,156915,156916,156917,156918,156919,156920,156921,156922,156923,156924,156925,156926,156927,156928,156929,156930,156931,156932,156933,156934,156935,156936,156937,156938,156939,156940,156941,156942,156943,156944,156945,156946,156947,156948,156949,156950,156951,156952,156953,156954,156955,156956,156957,156958,156959,156960,156961,156962,156963,156964,156965,156966,156967,156968,156969,156970,156971,156972,156973,156974,156975,156976,156977,156978,156979,156980,156981,156982,156983,156984,156985,156986,156987,156988,156989,156990,156991,156992,156993,156994,156995,156996,156997,156998,156999,157000,157001,157002,157003,157004,157005,157006,157007,157008,157009,157010,157011,157012,157013,157014,157015,157016,157017,157018,157019,157020,157021,157022,157023,157024,157025,157026,157027,157028,157029,157030,157031,157032,157033,157034,157035,157036,157037,157038,157039,157040,157041,157042,157043,157044,157045,157046,157047,157048,157049,157050,157051,157052,157053,157054,157055,157056,157057,157058,157059,157060,157061,157062,157063,157064,157065,157066,157067,157068,157069,157070,157071,157072,157073,157074,157075,157076,157077,157078,157079,157080,157081,157082,157083,157084,157085,157086,157087,157088,157089,157090,157091,157092,157093,157094,157095,157096,157097,157098,157099,157100,157101,157102,157103,157104,157105,157106,157107,157108,157109,157110,157111,157112,157113,157114,157115,157116,157117,157118,157119,157120,157121,157122,157123,157124,157125,157126,157127,157128,157129,157130,157131,157132,157133,157134,157135,157136,157137,157138,157139,157140,157141,157142,157143,157144,157145,157146,157147,157148,157149,157150,157151,157152,157153,157154,157155,157156,157157,157158,157159,157160,157161,157162,157163,157164,157165,157166,157167,157168,157169,157170,157171,157172,157173,157174,157175,157176,157177,157178,157179,157180,157181,157182,157183,157184,157185,157186,157187,157188,157189,157190,157191,157192,157193,157194,157195,157196,157197,157198,157199,157200,157201,157202,157203,157204,157205,157206,157207,157208,157209,157210,157211,157212,157213,157214,157215,157216,157217,157218,157219,157220,157221,157222,157223,157224,157225,157226,157227,157228,157229,157230,157231,157232,157233,157234,157235,157236,157237,157238,157239,157240,157241,157242,157243,157244,157245,157246,157247,157248,157249,157250,157251,157252,157253,157254,157255,157256,157257,157258,157259,157260,157261,157262,157263,157264,157265,157266,157267,157268,157269,157270,157271,157272,157273,157274,157275,157276,157277,157278,157279,157280,157281,157282,157283,157284,157285,157286,157287,157288,157289,157290,157291,157292,157293,157294,157295,157296,157297,157298,157299,157300,157301,157302,157303,157304,157305,157306,157307,157308,157309,157310,157311,157312,157313,157314,157315,157316,157317,157318,157319,157320,157321,157322,157323,157324,157325,157326,157327,157328,157329,157330,157331,157332,157333,157334,157335,157336,157337,157338,157339,157340,157341,157342,157343,157344,157345,157346,157347,157348,157349,157350,157351,157352,157353,157354,157355,157356,157357,157358,157359,157360,157361,157362,157363,157364,157365,157366,157367,157368,157369,157370,157371,157372,157373,157374,157375,157376,157377,157378,157379,157380,157381,157382,157383,157384,157385,157386,157387,157388,157389,157390,157391,157392,157393,157394,157395,157396,157397,157398,157399,157400,157401,157402,157403,157404,157405,157406,157407,157408,157409,157410,157411,157412,157413,157414,157415,157416,157417,157418,157419,157420,157421,157422,157423,157424,157425,157426,157427,157428,157429,157430,157431,157432,157433,157434,157435,157436,157437,157438,157439,157440,157441,157442,157443,157444,157445,157446,157447,157448,157449,157450,157451,157452,157453,157454,157455,157456,157457,157458,157459,157460,157461,157462,157463,157464,157465,157466,157467,157468,157469,157470,157471,157472,157473,157474,157475,157476,157477,157478,157479,157480,157481,157482,157483,157484,157485,157486,157487,157488,157489,157490,157491,157492,157493,157494,157495,157496,157497,157498,157499,157500,157501,157502,157503,157504,157505,157506,157507,157508,157509,157510,157511,157512,157513,157514,157515,157516,157517,157518,157519,157520,157521,157522,157523,157524,157525,157526,157527,157528,157529,157530,157531,157532,157533,157534,157535,157536,157537,157538,157539,157540,157541,157542,157543,157544,157545,157546,157547,157548,157549,157550,157551,157552,157553,157554,157555,157556,157557,157558,157559,157560,157561,157562,157563,157564,157565,157566,157567,157568,157569,157570,157571,157572,157573,157574,157575,157576,157577,157578,157579,157580,157581,157582,157583,157584,157585,157586,157587,157588,157589,157590,157591,157592,157593,157594,157595,157596,157597,157598,157599,157600,157601,157602,157603,157604,157605,157606,157607,157608,157609,157610,157611,157612,157613,157614,157615,157616,157617,157618,157619,157620,157621,157622,157623,157624,157625,157626,157627,157628,157629,157630,157631,157632,157633,157634,157635,157636,157637,157638,157639,157640,157641,157642,157643,157644,157645,157646,157647,157648,157649,157650,157651,157652,157653,157654,157655,157656,157657,157658,157659,157660,157661,157662,157663,157664,157665,157666,157667,157668,157669,157670,157671,157672,157673,157674,157675,157676,157677,157678,157679,157680,157681,157682,157683,157684,157685,157686,157687,157688,157689,157690,157691,157692,157693,157694,157695,157696,157697,157698,157699,157700,157701,157702,157703,157704,157705,157706,157707,157708,157709,157710,157711,157712,157713,157714,157715,157716,157717,157718,157719,157720,157721,157722,157723,157724,157725,157726,157727,157728,157729,157730,157731,157732,157733,157734,157735,157736,157737,157738,157739,157740,157741,157742,157743,157744,157745,157746,157747,157748,157749,157750,157751,157752,157753,157754,157755,157756,157757,157758,157759,157760,157761,157762,157763,157764,157765,157766,157767,157768,157769,157770,157771,157772,157773,157774,157775,157776,157777,157778,157779,157780,157781,157782,157783,157784,157785,157786,157787,157788,157789,157790,157791,157792,157793,157794,157795,157796,157797,157798,157799,157800,157801,157802,157803,157804,157805,157806,157807,157808,157809,157810,157811,157812,157813,157814,157815,157816,157817,157818,157819,157820,157821,157822,157823,157824,157825,157826,157827,157828,157829,157830,157831,157832,157833,157834,157835,157836,157837,157838,157839,157840,157841,157842,157843,157844,157845,157846,157847,157848,157849,157850,157851,157852,157853,157854,157855,157856,157857,157858,157859,157860,157861,157862,157863,157864,157865,157866,157867,157868,157869,157870,157871,157872,157873,157874,157875,157876,157877,157878,157879,157880,157881,157882,157883,157884,157885,157886,157887,157888,157889,157890,157891,157892,157893,157894,157895,157896,157897,157898,157899,157900,157901,157902,157903,157904,157905,157906,157907,157908,157909,157910,157911,157912,157913,157914,157915,157916,157917,157918,157919,157920,157921,157922,157923,157924,157925,157926,157927,157928,157929,157930,157931,157932,157933,157934,157935,157936,157937,157938,157939,157940,157941,157942,157943,157944,157945,157946,157947,157948,157949,157950,157951,157952,157953,157954,157955,157956,157957,157958,157959,157960,157961,157962,157963,157964,157965,157966,157967,157968,157969,157970,157971,157972,157973,157974,157975,157976,157977,157978,157979,157980,157981,157982,157983,157984,157985,157986,157987,157988,157989,157990,157991,157992,157993,157994,157995,157996,157997,157998,157999,158000,158001,158002,158003,158004,158005,158006,158007,158008,158009,158010,158011,158012,158013,158014,158015,158016,158017,158018,158019,158020,158021,158022,158023,158024,158025,158026,158027,158028,158029,158030,158031,158032,158033,158034,158035,158036,158037,158038,158039,158040,158041,158042,158043,158044,158045,158046,158047,158048,158049,158050,158051,158052,158053,158054,158055,158056,158057,158058,158059,158060,158061,158062,158063,158064,158065,158066,158067,158068,158069,158070,158071,158072,158073,158074,158075,158076,158077,158078,158079,158080,158081,158082,158083,158084,158085,158086,158087,158088,158089,158090,158091,158092,158093,158094,158095,158096,158097,158098,158099,158100,158101,158102,158103,158104,158105,158106,158107,158108,158109,158110,158111,158112,158113,158114,158115,158116,158117,158118,158119,158120,158121,158122,158123,158124,158125,158126,158127,158128,158129,158130,158131,158132,158133,158134,158135,158136,158137,158138,158139,158140,158141,158142,158143,158144,158145,158146,158147,158148,158149,158150,158151,158152,158153,158154,158155,158156,158157,158158,158159,158160,158161,158162,158163,158164,158165,158166,158167,158168,158169,158170,158171,158172,158173,158174,158175,158176,158177,158178,158179,158180,158181,158182,158183,158184,158185,158186,158187,158188,158189,158190,158191,158192,158193,158194,158195,158196,158197,158198,158199,158200,158201,158202,158203,158204,158205,158206,158207,158208,158209,158210,158211,158212,158213,158214,158215,158216,158217,158218,158219,158220,158221,158222,158223,158224,158225,158226,158227,158228,158229,158230,158231,158232,158233,158234,158235,158236,158237,158238,158239,158240,158241,158242,158243,158244,158245,158246,158247,158248,158249,158250,158251,158252,158253,158254,158255,158256,158257,158258,158259,158260,158261,158262,158263,158264,158265,158266,158267,158268,158269,158270,158271,158272,158273,158274,158275,158276,158277,158278,158279,158280,158281,158282,158283,158284,158285,158286,158287,158288,158289,158290,158291,158292,158293,158294,158295,158296,158297,158298,158299,158300,158301,158302,158303,158304,158305,158306,158307,158308,158309,158310,158311,158312,158313,158314,158315,158316,158317,158318,158319,158320,158321,158322,158323,158324,158325,158326,158327,158328,158329,158330,158331,158332,158333,158334,158335,158336,158337,158338,158339,158340,158341,158342,158343,158344,158345,158346,158347,158348,158349,158350,158351,158352,158353,158354,158355,158356,158357,158358,158359,158360,158361,158362,158363,158364,158365,158366,158367,158368,158369,158370,158371,158372,158373,158374,158375,158376,158377,158378,158379,158380,158381,158382,158383,158384,158385,158386,158387,158388,158389,158390,158391,158392,158393,158394,158395,158396,158397,158398,158399,158400,158401,158402,158403,158404,158405,158406,158407,158408,158409,158410,158411,158412,158413,158414,158415,158416,158417,158418,158419,158420,158421,158422,158423,158424,158425,158426,158427,158428,158429,158430,158431,158432,158433,158434,158435,158436,158437,158438,158439,158440,158441,158442,158443,158444,158445,158446,158447,158448,158449,158450,158451,158452,158453,158454,158455,158456,158457,158458,158459,158460,158461,158462,158463,158464,158465,158466,158467,158468,158469,158470,158471,158472,158473,158474,158475,158476,158477,158478,158479,158480,158481,158482,158483,158484,158485,158486,158487,158488,158489,158490,158491,158492,158493,158494,158495,158496,158497,158498,158499,158500,158501,158502,158503,158504,158505,158506,158507,158508,158509,158510,158511,158512,158513,158514,158515,158516,158517,158518,158519,158520,158521,158522,158523,158524,158525,158526,158527,158528,158529,158530,158531,158532,158533,158534,158535,158536,158537,158538,158539,158540,158541,158542,158543,158544,158545,158546,158547,158548,158549,158550,158551,158552,158553,158554,158555,158556,158557,158558,158559,158560,158561,158562,158563,158564,158565,158566,158567,158568,158569,158570,158571,158572,158573,158574,158575,158576,158577,158578,158579,158580,158581,158582,158583,158584,158585,158586,158587,158588,158589,158590,158591,158592,158593,158594,158595,158596,158597,158598,158599,158600,158601,158602,158603,158604,158605,158606,158607,158608,158609,158610,158611,158612,158613,158614,158615,158616,158617,158618,158619,158620,158621,158622,158623,158624,158625,158626,158627,158628,158629,158630,158631,158632,158633,158634,158635,158636,158637,158638,158639,158640,158641,158642,158643,158644,158645,158646,158647,158648,158649,158650,158651,158652,158653,158654,158655,158656,158657,158658,158659,158660,158661,158662,158663,158664,158665,158666,158667,158668,158669,158670,158671,158672,158673,158674,158675,158676,158677,158678,158679,158680,158681,158682,158683,158684,158685,158686,158687,158688,158689,158690,158691,158692,158693,158694,158695,158696,158697,158698,158699,158700,158701,158702,158703,158704,158705,158706,158707,158708,158709,158710,158711,158712,158713,158714,158715,158716,158717,158718,158719,158720,158721,158722,158723,158724,158725,158726,158727,158728,158729,158730,158731,158732,158733,158734,158735,158736,158737,158738,158739,158740,158741,158742,158743,158744,158745,158746,158747,158748,158749,158750,158751,158752,158753,158754,158755,158756,158757,158758,158759,158760,158761,158762,158763,158764,158765,158766,158767,158768,158769,158770,158771,158772,158773,158774,158775,158776,158777,158778,158779,158780,158781,158782,158783,158784,158785,158786,158787,158788,158789,158790,158791,158792,158793,158794,158795,158796,158797,158798,158799,158800,158801,158802,158803,158804,158805,158806,158807,158808,158809,158810,158811,158812,158813,158814,158815,158816,158817,158818,158819,158820,158821,158822,158823,158824,158825,158826,158827,158828,158829,158830,158831,158832,158833,158834,158835,158836,158837,158838,158839,158840,158841,158842,158843,158844,158845,158846,158847,158848,158849,158850,158851,158852,158853,158854,158855,158856,158857,158858,158859,158860,158861,158862,158863,158864,158865,158866,158867,158868,158869,158870,158871,158872,158873,158874,158875,158876,158877,158878,158879,158880,158881,158882,158883,158884,158885,158886,158887,158888,158889,158890,158891,158892,158893,158894,158895,158896,158897,158898,158899,158900,158901,158902,158903,158904,158905,158906,158907,158908,158909,158910,158911,158912,158913,158914,158915,158916,158917,158918,158919,158920,158921,158922,158923,158924,158925,158926,158927,158928,158929,158930,158931,158932,158933,158934,158935,158936,158937,158938,158939,158940,158941,158942,158943,158944,158945,158946,158947,158948,158949,158950,158951,158952,158953,158954,158955,158956,158957,158958,158959,158960,158961,158962,158963,158964,158965,158966,158967,158968,158969,158970,158971,158972,158973,158974,158975,158976,158977,158978,158979,158980,158981,158982,158983,158984,158985,158986,158987,158988,158989,158990,158991,158992,158993,158994,158995,158996,158997,158998,158999,159000,159001,159002,159003,159004,159005,159006,159007,159008,159009,159010,159011,159012,159013,159014,159015,159016,159017,159018,159019,159020,159021,159022,159023,159024,159025,159026,159027,159028,159029,159030,159031,159032,159033,159034,159035,159036,159037,159038,159039,159040,159041,159042,159043,159044,159045,159046,159047,159048,159049,159050,159051,159052,159053,159054,159055,159056,159057,159058,159059,159060,159061,159062,159063,159064,159065,159066,159067,159068,159069,159070,159071,159072,159073,159074,159075,159076,159077,159078,159079,159080,159081,159082,159083,159084,159085,159086,159087,159088,159089,159090,159091,159092,159093,159094,159095,159096,159097,159098,159099,159100,159101,159102,159103,159104,159105,159106,159107,159108,159109,159110,159111,159112,159113,159114,159115,159116,159117,159118,159119,159120,159121,159122,159123,159124,159125,159126,159127,159128,159129,159130,159131,159132,159133,159134,159135,159136,159137,159138,159139,159140,159141,159142,159143,159144,159145,159146,159147,159148,159149,159150,159151,159152,159153,159154,159155,159156,159157,159158,159159,159160,159161,159162,159163,159164,159165,159166,159167,159168,159169,159170,159171,159172,159173,159174,159175,159176,159177,159178,159179,159180,159181,159182,159183,159184,159185,159186,159187,159188,159189,159190,159191,159192,159193,159194,159195,159196,159197,159198,159199,159200,159201,159202,159203,159204,159205,159206,159207,159208,159209,159210,159211,159212,159213,159214,159215,159216,159217,159218,159219,159220,159221,159222,159223,159224,159225,159226,159227,159228,159229,159230,159231,159232,159233,159234,159235,159236,159237,159238,159239,159240,159241,159242,159243,159244,159245,159246,159247,159248,159249,159250,159251,159252,159253,159254,159255,159256,159257,159258,159259,159260,159261,159262,159263,159264,159265,159266,159267,159268,159269,159270,159271,159272,159273,159274,159275,159276,159277,159278,159279,159280,159281,159282,159283,159284,159285,159286,159287,159288,159289,159290,159291,159292,159293,159294,159295,159296,159297,159298,159299,159300,159301,159302,159303,159304,159305,159306,159307,159308,159309,159310,159311,159312,159313,159314,159315,159316,159317,159318,159319,159320,159321,159322,159323,159324,159325,159326,159327,159328,159329,159330,159331,159332,159333,159334,159335,159336,159337,159338,159339,159340,159341,159342,159343,159344,159345,159346,159347,159348,159349,159350,159351,159352,159353,159354,159355,159356,159357,159358,159359,159360,159361,159362,159363,159364,159365,159366,159367,159368,159369,159370,159371,159372,159373,159374,159375,159376,159377,159378,159379,159380,159381,159382,159383,159384,159385,159386,159387,159388,159389,159390,159391,159392,159393,159394,159395,159396,159397,159398,159399,159400,159401,159402,159403,159404,159405,159406,159407,159408,159409,159410,159411,159412,159413,159414,159415,159416,159417,159418,159419,159420,159421,159422,159423,159424,159425,159426,159427,159428,159429,159430,159431,159432,159433,159434,159435,159436,159437,159438,159439,159440,159441,159442,159443,159444,159445,159446,159447,159448,159449,159450,159451,159452,159453,159454,159455,159456,159457,159458,159459,159460,159461,159462,159463,159464,159465,159466,159467,159468,159469,159470,159471,159472,159473,159474,159475,159476,159477,159478,159479,159480,159481,159482,159483,159484,159485,159486,159487,159488,159489,159490,159491,159492,159493,159494,159495,159496,159497,159498,159499,159500,159501,159502,159503,159504,159505,159506,159507,159508,159509,159510,159511,159512,159513,159514,159515,159516,159517,159518,159519,159520,159521,159522,159523,159524,159525,159526,159527,159528,159529,159530,159531,159532,159533,159534,159535,159536,159537,159538,159539,159540,159541,159542,159543,159544,159545,159546,159547,159548,159549,159550,159551,159552,159553,159554,159555,159556,159557,159558,159559,159560,159561,159562,159563,159564,159565,159566,159567,159568,159569,159570,159571,159572,159573,159574,159575,159576,159577,159578,159579,159580,159581,159582,159583,159584,159585,159586,159587,159588,159589,159590,159591,159592,159593,159594,159595,159596,159597,159598,159599,159600,159601,159602,159603,159604,159605,159606,159607,159608,159609,159610,159611,159612,159613,159614,159615,159616,159617,159618,159619,159620,159621,159622,159623,159624,159625,159626,159627,159628,159629,159630,159631,159632,159633,159634,159635,159636,159637,159638,159639,159640,159641,159642,159643,159644,159645,159646,159647,159648,159649,159650,159651,159652,159653,159654,159655,159656,159657,159658,159659,159660,159661,159662,159663,159664,159665,159666,159667,159668,159669,159670,159671,159672,159673,159674,159675,159676,159677,159678,159679,159680,159681,159682,159683,159684,159685,159686,159687,159688,159689,159690,159691,159692,159693,159694,159695,159696,159697,159698,159699,159700,159701,159702,159703,159704,159705,159706,159707,159708,159709,159710,159711,159712,159713,159714,159715,159716,159717,159718,159719,159720,159721,159722,159723,159724,159725,159726,159727,159728,159729,159730,159731,159732,159733,159734,159735,159736,159737,159738,159739,159740,159741,159742,159743,159744,159745,159746,159747,159748,159749,159750,159751,159752,159753,159754,159755,159756,159757,159758,159759,159760,159761,159762,159763,159764,159765,159766,159767,159768,159769,159770,159771,159772,159773,159774,159775,159776,159777,159778,159779,159780,159781,159782,159783,159784,159785,159786,159787,159788,159789,159790,159791,159792,159793,159794,159795,159796,159797,159798,159799,159800,159801,159802,159803,159804,159805,159806,159807,159808,159809,159810,159811,159812,159813,159814,159815,159816,159817,159818,159819,159820,159821,159822,159823,159824,159825,159826,159827,159828,159829,159830,159831,159832,159833,159834,159835,159836,159837,159838,159839,159840,159841,159842,159843,159844,159845,159846,159847,159848,159849,159850,159851,159852,159853,159854,159855,159856,159857,159858,159859,159860,159861,159862,159863,159864,159865,159866,159867,159868,159869,159870,159871,159872,159873,159874,159875,159876,159877,159878,159879,159880,159881,159882,159883,159884,159885,159886,159887,159888,159889,159890,159891,159892,159893,159894,159895,159896,159897,159898,159899,159900,159901,159902,159903,159904,159905,159906,159907,159908,159909,159910,159911,159912,159913,159914,159915,159916,159917,159918,159919,159920,159921,159922,159923,159924,159925,159926,159927,159928,159929,159930,159931,159932,159933,159934,159935,159936,159937,159938,159939,159940,159941,159942,159943,159944,159945,159946,159947,159948,159949,159950,159951,159952,159953,159954,159955,159956,159957,159958,159959,159960,159961,159962,159963,159964,159965,159966,159967,159968,159969,159970,159971,159972,159973,159974,159975,159976,159977,159978,159979,159980,159981,159982,159983,159984,159985,159986,159987,159988,159989,159990,159991,159992,159993,159994,159995,159996,159997,159998,159999,160000,160001,160002,160003,160004,160005,160006,160007,160008,160009,160010,160011,160012,160013,160014,160015,160016,160017,160018,160019,160020,160021,160022,160023,160024,160025,160026,160027,160028,160029,160030,160031,160032,160033,160034,160035,160036,160037,160038,160039,160040,160041,160042,160043,160044,160045,160046,160047,160048,160049,160050,160051,160052,160053,160054,160055,160056,160057,160058,160059,160060,160061,160062,160063,160064,160065,160066,160067,160068,160069,160070,160071,160072,160073,160074,160075,160076,160077,160078,160079,160080,160081,160082,160083,160084,160085,160086,160087,160088,160089,160090,160091,160092,160093,160094,160095,160096,160097,160098,160099,160100,160101,160102,160103,160104,160105,160106,160107,160108,160109,160110,160111,160112,160113,160114,160115,160116,160117,160118,160119,160120,160121,160122,160123,160124,160125,160126,160127,160128,160129,160130,160131,160132,160133,160134,160135,160136,160137,160138,160139,160140,160141,160142,160143,160144,160145,160146,160147,160148,160149,160150,160151,160152,160153,160154,160155,160156,160157,160158,160159,160160,160161,160162,160163,160164,160165,160166,160167,160168,160169,160170,160171,160172,160173,160174,160175,160176,160177,160178,160179,160180,160181,160182,160183,160184,160185,160186,160187,160188,160189,160190,160191,160192,160193,160194,160195,160196,160197,160198,160199,160200,160201,160202,160203,160204,160205,160206,160207,160208,160209,160210,160211,160212,160213,160214,160215,160216,160217,160218,160219,160220,160221,160222,160223,160224,160225,160226,160227,160228,160229,160230,160231,160232,160233,160234,160235,160236,160237,160238,160239,160240,160241,160242,160243,160244,160245,160246,160247,160248,160249,160250,160251,160252,160253,160254,160255,160256,160257,160258,160259,160260,160261,160262,160263,160264,160265,160266,160267,160268,160269,160270,160271,160272,160273,160274,160275,160276,160277,160278,160279,160280,160281,160282,160283,160284,160285,160286,160287,160288,160289,160290,160291,160292,160293,160294,160295,160296,160297,160298,160299,160300,160301,160302,160303,160304,160305,160306,160307,160308,160309,160310,160311,160312,160313,160314,160315,160316,160317,160318,160319,160320,160321,160322,160323,160324,160325,160326,160327,160328,160329,160330,160331,160332,160333,160334,160335,160336,160337,160338,160339,160340,160341,160342,160343,160344,160345,160346,160347,160348,160349,160350,160351,160352,160353,160354,160355,160356,160357,160358,160359,160360,160361,160362,160363,160364,160365,160366,160367,160368,160369,160370,160371,160372,160373,160374,160375,160376,160377,160378,160379,160380,160381,160382,160383,160384,160385,160386,160387,160388,160389,160390,160391,160392,160393,160394,160395,160396,160397,160398,160399,160400,160401,160402,160403,160404,160405,160406,160407,160408,160409,160410,160411,160412,160413,160414,160415,160416,160417,160418,160419,160420,160421,160422,160423,160424,160425,160426,160427,160428,160429,160430,160431,160432,160433,160434,160435,160436,160437,160438,160439,160440,160441,160442,160443,160444,160445,160446,160447,160448,160449,160450,160451,160452,160453,160454,160455,160456,160457,160458,160459,160460,160461,160462,160463,160464,160465,160466,160467,160468,160469,160470,160471,160472,160473,160474,160475,160476,160477,160478,160479,160480,160481,160482,160483,160484,160485,160486,160487,160488,160489,160490,160491,160492,160493,160494,160495,160496,160497,160498,160499,160500,160501,160502,160503,160504,160505,160506,160507,160508,160509,160510,160511,160512,160513,160514,160515,160516,160517,160518,160519,160520,160521,160522,160523,160524,160525,160526,160527,160528,160529,160530,160531,160532,160533,160534,160535,160536,160537,160538,160539,160540,160541,160542,160543,160544,160545,160546,160547,160548,160549,160550,160551,160552,160553,160554,160555,160556,160557,160558,160559,160560,160561,160562,160563,160564,160565,160566,160567,160568,160569,160570,160571,160572,160573,160574,160575,160576,160577,160578,160579,160580,160581,160582,160583,160584,160585,160586,160587,160588,160589,160590,160591,160592,160593,160594,160595,160596,160597,160598,160599,160600,160601,160602,160603,160604,160605,160606,160607,160608,160609,160610,160611,160612,160613,160614,160615,160616,160617,160618,160619,160620,160621,160622,160623,160624,160625,160626,160627,160628,160629,160630,160631,160632,160633,160634,160635,160636,160637,160638,160639,160640,160641,160642,160643,160644,160645,160646,160647,160648,160649,160650,160651,160652,160653,160654,160655,160656,160657,160658,160659,160660,160661,160662,160663,160664,160665,160666,160667,160668,160669,160670,160671,160672,160673,160674,160675,160676,160677,160678,160679,160680,160681,160682,160683,160684,160685,160686,160687,160688,160689,160690,160691,160692,160693,160694,160695,160696,160697,160698,160699,160700,160701,160702,160703,160704,160705,160706,160707,160708,160709,160710,160711,160712,160713,160714,160715,160716,160717,160718,160719,160720,160721,160722,160723,160724,160725,160726,160727,160728,160729,160730,160731,160732,160733,160734,160735,160736,160737,160738,160739,160740,160741,160742,160743,160744,160745,160746,160747,160748,160749,160750,160751,160752,160753,160754,160755,160756,160757,160758,160759,160760,160761,160762,160763,160764,160765,160766,160767,160768,160769,160770,160771,160772,160773,160774,160775,160776,160777,160778,160779,160780,160781,160782,160783,160784,160785,160786,160787,160788,160789,160790,160791,160792,160793,160794,160795,160796,160797,160798,160799,160800,160801,160802,160803,160804,160805,160806,160807,160808,160809,160810,160811,160812,160813,160814,160815,160816,160817,160818,160819,160820,160821,160822,160823,160824,160825,160826,160827,160828,160829,160830,160831,160832,160833,160834,160835,160836,160837,160838,160839,160840,160841,160842,160843,160844,160845,160846,160847,160848,160849,160850,160851,160852,160853,160854,160855,160856,160857,160858,160859,160860,160861,160862,160863,160864,160865,160866,160867,160868,160869,160870,160871,160872,160873,160874,160875,160876,160877,160878,160879,160880,160881,160882,160883,160884,160885,160886,160887,160888,160889,160890,160891,160892,160893,160894,160895,160896,160897,160898,160899,160900,160901,160902,160903,160904,160905,160906,160907,160908,160909,160910,160911,160912,160913,160914,160915,160916,160917,160918,160919,160920,160921,160922,160923,160924,160925,160926,160927,160928,160929,160930,160931,160932,160933,160934,160935,160936,160937,160938,160939,160940,160941,160942,160943,160944,160945,160946,160947,160948,160949,160950,160951,160952,160953,160954,160955,160956,160957,160958,160959,160960,160961,160962,160963,160964,160965,160966,160967,160968,160969,160970,160971,160972,160973,160974,160975,160976,160977,160978,160979,160980,160981,160982,160983,160984,160985,160986,160987,160988,160989,160990,160991,160992,160993,160994,160995,160996,160997,160998,160999,161000,161001,161002,161003,161004,161005,161006,161007,161008,161009,161010,161011,161012,161013,161014,161015,161016,161017,161018,161019,161020,161021,161022,161023,161024,161025,161026,161027,161028,161029,161030,161031,161032,161033,161034,161035,161036,161037,161038,161039,161040,161041,161042,161043,161044,161045,161046,161047,161048,161049,161050,161051,161052,161053,161054,161055,161056,161057,161058,161059,161060,161061,161062,161063,161064,161065,161066,161067,161068,161069,161070,161071,161072,161073,161074,161075,161076,161077,161078,161079,161080,161081,161082,161083,161084,161085,161086,161087,161088,161089,161090,161091,161092,161093,161094,161095,161096,161097,161098,161099,161100,161101,161102,161103,161104,161105,161106,161107,161108,161109,161110,161111,161112,161113,161114,161115,161116,161117,161118,161119,161120,161121,161122,161123,161124,161125,161126,161127,161128,161129,161130,161131,161132,161133,161134,161135,161136,161137,161138,161139,161140,161141,161142,161143,161144,161145,161146,161147,161148,161149,161150,161151,161152,161153,161154,161155,161156,161157,161158,161159,161160,161161,161162,161163,161164,161165,161166,161167,161168,161169,161170,161171,161172,161173,161174,161175,161176,161177,161178,161179,161180,161181,161182,161183,161184,161185,161186,161187,161188,161189,161190,161191,161192,161193,161194,161195,161196,161197,161198,161199,161200,161201,161202,161203,161204,161205,161206,161207,161208,161209,161210,161211,161212,161213,161214,161215,161216,161217,161218,161219,161220,161221,161222,161223,161224,161225,161226,161227,161228,161229,161230,161231,161232,161233,161234,161235,161236,161237,161238,161239,161240,161241,161242,161243,161244,161245,161246,161247,161248,161249,161250,161251,161252,161253,161254,161255,161256,161257,161258,161259,161260,161261,161262,161263,161264,161265,161266,161267,161268,161269,161270,161271,161272,161273,161274,161275,161276,161277,161278,161279,161280,161281,161282,161283,161284,161285,161286,161287,161288,161289,161290,161291,161292,161293,161294,161295,161296,161297,161298,161299,161300,161301,161302,161303,161304,161305,161306,161307,161308,161309,161310,161311,161312,161313,161314,161315,161316,161317,161318,161319,161320,161321,161322,161323,161324,161325,161326,161327,161328,161329,161330,161331,161332,161333,161334,161335,161336,161337,161338,161339,161340,161341,161342,161343,161344,161345,161346,161347,161348,161349,161350,161351,161352,161353,161354,161355,161356,161357,161358,161359,161360,161361,161362,161363,161364,161365,161366,161367,161368,161369,161370,161371,161372,161373,161374,161375,161376,161377,161378,161379,161380,161381,161382,161383,161384,161385,161386,161387,161388,161389,161390,161391,161392,161393,161394,161395,161396,161397,161398,161399,161400,161401,161402,161403,161404,161405,161406,161407,161408,161409,161410,161411,161412,161413,161414,161415,161416,161417,161418,161419,161420,161421,161422,161423,161424,161425,161426,161427,161428,161429,161430,161431,161432,161433,161434,161435,161436,161437,161438,161439,161440,161441,161442,161443,161444,161445,161446,161447,161448,161449,161450,161451,161452,161453,161454,161455,161456,161457,161458,161459,161460,161461,161462,161463,161464,161465,161466,161467,161468,161469,161470,161471,161472,161473,161474,161475,161476,161477,161478,161479,161480,161481,161482,161483,161484,161485,161486,161487,161488,161489,161490,161491,161492,161493,161494,161495,161496,161497,161498,161499,161500,161501,161502,161503,161504,161505,161506,161507,161508,161509,161510,161511,161512,161513,161514,161515,161516,161517,161518,161519,161520,161521,161522,161523,161524,161525,161526,161527,161528,161529,161530,161531,161532,161533,161534,161535,161536,161537,161538,161539,161540,161541,161542,161543,161544,161545,161546,161547,161548,161549,161550,161551,161552,161553,161554,161555,161556,161557,161558,161559,161560,161561,161562,161563,161564,161565,161566,161567,161568,161569,161570,161571,161572,161573,161574,161575,161576,161577,161578,161579,161580,161581,161582,161583,161584,161585,161586,161587,161588,161589,161590,161591,161592,161593,161594,161595,161596,161597,161598,161599,161600,161601,161602,161603,161604,161605,161606,161607,161608,161609,161610,161611,161612,161613,161614,161615,161616,161617,161618,161619,161620,161621,161622,161623,161624,161625,161626,161627,161628,161629,161630,161631,161632,161633,161634,161635,161636,161637,161638,161639,161640,161641,161642,161643,161644,161645,161646,161647,161648,161649,161650,161651,161652,161653,161654,161655,161656,161657,161658,161659,161660,161661,161662,161663,161664,161665,161666,161667,161668,161669,161670,161671,161672,161673,161674,161675,161676,161677,161678,161679,161680,161681,161682,161683,161684,161685,161686,161687,161688,161689,161690,161691,161692,161693,161694,161695,161696,161697,161698,161699,161700,161701,161702,161703,161704,161705,161706,161707,161708,161709,161710,161711,161712,161713,161714,161715,161716,161717,161718,161719,161720,161721,161722,161723,161724,161725,161726,161727,161728,161729,161730,161731,161732,161733,161734,161735,161736,161737,161738,161739,161740,161741,161742,161743,161744,161745,161746,161747,161748,161749,161750,161751,161752,161753,161754,161755,161756,161757,161758,161759,161760,161761,161762,161763,161764,161765,161766,161767,161768,161769,161770,161771,161772,161773,161774,161775,161776,161777,161778,161779,161780,161781,161782,161783,161784,161785,161786,161787,161788,161789,161790,161791,161792,161793,161794,161795,161796,161797,161798,161799,161800,161801,161802,161803,161804,161805,161806,161807,161808,161809,161810,161811,161812,161813,161814,161815,161816,161817,161818,161819,161820,161821,161822,161823,161824,161825,161826,161827,161828,161829,161830,161831,161832,161833,161834,161835,161836,161837,161838,161839,161840,161841,161842,161843,161844,161845,161846,161847,161848,161849,161850,161851,161852,161853,161854,161855,161856,161857,161858,161859,161860,161861,161862,161863,161864,161865,161866,161867,161868,161869,161870,161871,161872,161873,161874,161875,161876,161877,161878,161879,161880,161881,161882,161883,161884,161885,161886,161887,161888,161889,161890,161891,161892,161893,161894,161895,161896,161897,161898,161899,161900,161901,161902,161903,161904,161905,161906,161907,161908,161909,161910,161911,161912,161913,161914,161915,161916,161917,161918,161919,161920,161921,161922,161923,161924,161925,161926,161927,161928,161929,161930,161931,161932,161933,161934,161935,161936,161937,161938,161939,161940,161941,161942,161943,161944,161945,161946,161947,161948,161949,161950,161951,161952,161953,161954,161955,161956,161957,161958,161959,161960,161961,161962,161963,161964,161965,161966,161967,161968,161969,161970,161971,161972,161973,161974,161975,161976,161977,161978,161979,161980,161981,161982,161983,161984,161985,161986,161987,161988,161989,161990,161991,161992,161993,161994,161995,161996,161997,161998,161999,162000,162001,162002,162003,162004,162005,162006,162007,162008,162009,162010,162011,162012,162013,162014,162015,162016,162017,162018,162019,162020,162021,162022,162023,162024,162025,162026,162027,162028,162029,162030,162031,162032,162033,162034,162035,162036,162037,162038,162039,162040,162041,162042,162043,162044,162045,162046,162047,162048,162049,162050,162051,162052,162053,162054,162055,162056,162057,162058,162059,162060,162061,162062,162063,162064,162065,162066,162067,162068,162069,162070,162071,162072,162073,162074,162075,162076,162077,162078,162079,162080,162081,162082,162083,162084,162085,162086,162087,162088,162089,162090,162091,162092,162093,162094,162095,162096,162097,162098,162099,162100,162101,162102,162103,162104,162105,162106,162107,162108,162109,162110,162111,162112,162113,162114,162115,162116,162117,162118,162119,162120,162121,162122,162123,162124,162125,162126,162127,162128,162129,162130,162131,162132,162133,162134,162135,162136,162137,162138,162139,162140,162141,162142,162143,162144,162145,162146,162147,162148,162149,162150,162151,162152,162153,162154,162155,162156,162157,162158,162159,162160,162161,162162,162163,162164,162165,162166,162167,162168,162169,162170,162171,162172,162173,162174,162175,162176,162177,162178,162179,162180,162181,162182,162183,162184,162185,162186,162187,162188,162189,162190,162191,162192,162193,162194,162195,162196,162197,162198,162199,162200,162201,162202,162203,162204,162205,162206,162207,162208,162209,162210,162211,162212,162213,162214,162215,162216,162217,162218,162219,162220,162221,162222,162223,162224,162225,162226,162227,162228,162229,162230,162231,162232,162233,162234,162235,162236,162237,162238,162239,162240,162241,162242,162243,162244,162245,162246,162247,162248,162249,162250,162251,162252,162253,162254,162255,162256,162257,162258,162259,162260,162261,162262,162263,162264,162265,162266,162267,162268,162269,162270,162271,162272,162273,162274,162275,162276,162277,162278,162279,162280,162281,162282,162283,162284,162285,162286,162287,162288,162289,162290,162291,162292,162293,162294,162295,162296,162297,162298,162299,162300,162301,162302,162303,162304,162305,162306,162307,162308,162309,162310,162311,162312,162313,162314,162315,162316,162317,162318,162319,162320,162321,162322,162323,162324,162325,162326,162327,162328,162329,162330,162331,162332,162333,162334,162335,162336,162337,162338,162339,162340,162341,162342,162343,162344,162345,162346,162347,162348,162349,162350,162351,162352,162353,162354,162355,162356,162357,162358,162359,162360,162361,162362,162363,162364,162365,162366,162367,162368,162369,162370,162371,162372,162373,162374,162375,162376,162377,162378,162379,162380,162381,162382,162383,162384,162385,162386,162387,162388,162389,162390,162391,162392,162393,162394,162395,162396,162397,162398,162399,162400,162401,162402,162403,162404,162405,162406,162407,162408,162409,162410,162411,162412,162413,162414,162415,162416,162417,162418,162419,162420,162421,162422,162423,162424,162425,162426,162427,162428,162429,162430,162431,162432,162433,162434,162435,162436,162437,162438,162439,162440,162441,162442,162443,162444,162445,162446,162447,162448,162449,162450,162451,162452,162453,162454,162455,162456,162457,162458,162459,162460,162461,162462,162463,162464,162465,162466,162467,162468,162469,162470,162471,162472,162473,162474,162475,162476,162477,162478,162479,162480,162481,162482,162483,162484,162485,162486,162487,162488,162489,162490,162491,162492,162493,162494,162495,162496,162497,162498,162499,162500,162501,162502,162503,162504,162505,162506,162507,162508,162509,162510,162511,162512,162513,162514,162515,162516,162517,162518,162519,162520,162521,162522,162523,162524,162525,162526,162527,162528,162529,162530,162531,162532,162533,162534,162535,162536,162537,162538,162539,162540,162541,162542,162543,162544,162545,162546,162547,162548,162549,162550,162551,162552,162553,162554,162555,162556,162557,162558,162559,162560,162561,162562,162563,162564,162565,162566,162567,162568,162569,162570,162571,162572,162573,162574,162575,162576,162577,162578,162579,162580,162581,162582,162583,162584,162585,162586,162587,162588,162589,162590,162591,162592,162593,162594,162595,162596,162597,162598,162599,162600,162601,162602,162603,162604,162605,162606,162607,162608,162609,162610,162611,162612,162613,162614,162615,162616,162617,162618,162619,162620,162621,162622,162623,162624,162625,162626,162627,162628,162629,162630,162631,162632,162633,162634,162635,162636,162637,162638,162639,162640,162641,162642,162643,162644,162645,162646,162647,162648,162649,162650,162651,162652,162653,162654,162655,162656,162657,162658,162659,162660,162661,162662,162663,162664,162665,162666,162667,162668,162669,162670,162671,162672,162673,162674,162675,162676,162677,162678,162679,162680,162681,162682,162683,162684,162685,162686,162687,162688,162689,162690,162691,162692,162693,162694,162695,162696,162697,162698,162699,162700,162701,162702,162703,162704,162705,162706,162707,162708,162709,162710,162711,162712,162713,162714,162715,162716,162717,162718,162719,162720,162721,162722,162723,162724,162725,162726,162727,162728,162729,162730,162731,162732,162733,162734,162735,162736,162737,162738,162739,162740,162741,162742,162743,162744,162745,162746,162747,162748,162749,162750,162751,162752,162753,162754,162755,162756,162757,162758,162759,162760,162761,162762,162763,162764,162765,162766,162767,162768,162769,162770,162771,162772,162773,162774,162775,162776,162777,162778,162779,162780,162781,162782,162783,162784,162785,162786,162787,162788,162789,162790,162791,162792,162793,162794,162795,162796,162797,162798,162799,162800,162801,162802,162803,162804,162805,162806,162807,162808,162809,162810,162811,162812,162813,162814,162815,162816,162817,162818,162819,162820,162821,162822,162823,162824,162825,162826,162827,162828,162829,162830,162831,162832,162833,162834,162835,162836,162837,162838,162839,162840,162841,162842,162843,162844,162845,162846,162847,162848,162849,162850,162851,162852,162853,162854,162855,162856,162857,162858,162859,162860,162861,162862,162863,162864,162865,162866,162867,162868,162869,162870,162871,162872,162873,162874,162875,162876,162877,162878,162879,162880,162881,162882,162883,162884,162885,162886,162887,162888,162889,162890,162891,162892,162893,162894,162895,162896,162897,162898,162899,162900,162901,162902,162903,162904,162905,162906,162907,162908,162909,162910,162911,162912,162913,162914,162915,162916,162917,162918,162919,162920,162921,162922,162923,162924,162925,162926,162927,162928,162929,162930,162931,162932,162933,162934,162935,162936,162937,162938,162939,162940,162941,162942,162943,162944,162945,162946,162947,162948,162949,162950,162951,162952,162953,162954,162955,162956,162957,162958,162959,162960,162961,162962,162963,162964,162965,162966,162967,162968,162969,162970,162971,162972,162973,162974,162975,162976,162977,162978,162979,162980,162981,162982,162983,162984,162985,162986,162987,162988,162989,162990,162991,162992,162993,162994,162995,162996,162997,162998,162999,163000,163001,163002,163003,163004,163005,163006,163007,163008,163009,163010,163011,163012,163013,163014,163015,163016,163017,163018,163019,163020,163021,163022,163023,163024,163025,163026,163027,163028,163029,163030,163031,163032,163033,163034,163035,163036,163037,163038,163039,163040,163041,163042,163043,163044,163045,163046,163047,163048,163049,163050,163051,163052,163053,163054,163055,163056,163057,163058,163059,163060,163061,163062,163063,163064,163065,163066,163067,163068,163069,163070,163071,163072,163073,163074,163075,163076,163077,163078,163079,163080,163081,163082,163083,163084,163085,163086,163087,163088,163089,163090,163091,163092,163093,163094,163095,163096,163097,163098,163099,163100,163101,163102,163103,163104,163105,163106,163107,163108,163109,163110,163111,163112,163113,163114,163115,163116,163117,163118,163119,163120,163121,163122,163123,163124,163125,163126,163127,163128,163129,163130,163131,163132,163133,163134,163135,163136,163137,163138,163139,163140,163141,163142,163143,163144,163145,163146,163147,163148,163149,163150,163151,163152,163153,163154,163155,163156,163157,163158,163159,163160,163161,163162,163163,163164,163165,163166,163167,163168,163169,163170,163171,163172,163173,163174,163175,163176,163177,163178,163179,163180,163181,163182,163183,163184,163185,163186,163187,163188,163189,163190,163191,163192,163193,163194,163195,163196,163197,163198,163199,163200,163201,163202,163203,163204,163205,163206,163207,163208,163209,163210,163211,163212,163213,163214,163215,163216,163217,163218,163219,163220,163221,163222,163223,163224,163225,163226,163227,163228,163229,163230,163231,163232,163233,163234,163235,163236,163237,163238,163239,163240,163241,163242,163243,163244,163245,163246,163247,163248,163249,163250,163251,163252,163253,163254,163255,163256,163257,163258,163259,163260,163261,163262,163263,163264,163265,163266,163267,163268,163269,163270,163271,163272,163273,163274,163275,163276,163277,163278,163279,163280,163281,163282,163283,163284,163285,163286,163287,163288,163289,163290,163291,163292,163293,163294,163295,163296,163297,163298,163299,163300,163301,163302,163303,163304,163305,163306,163307,163308,163309,163310,163311,163312,163313,163314,163315,163316,163317,163318,163319,163320,163321,163322,163323,163324,163325,163326,163327,163328,163329,163330,163331,163332,163333,163334,163335,163336,163337,163338,163339,163340,163341,163342,163343,163344,163345,163346,163347,163348,163349,163350,163351,163352,163353,163354,163355,163356,163357,163358,163359,163360,163361,163362,163363,163364,163365,163366,163367,163368,163369,163370,163371,163372,163373,163374,163375,163376,163377,163378,163379,163380,163381,163382,163383,163384,163385,163386,163387,163388,163389,163390,163391,163392,163393,163394,163395,163396,163397,163398,163399,163400,163401,163402,163403,163404,163405,163406,163407,163408,163409,163410,163411,163412,163413,163414,163415,163416,163417,163418,163419,163420,163421,163422,163423,163424,163425,163426,163427,163428,163429,163430,163431,163432,163433,163434,163435,163436,163437,163438,163439,163440,163441,163442,163443,163444,163445,163446,163447,163448,163449,163450,163451,163452,163453,163454,163455,163456,163457,163458,163459,163460,163461,163462,163463,163464,163465,163466,163467,163468,163469,163470,163471,163472,163473,163474,163475,163476,163477,163478,163479,163480,163481,163482,163483,163484,163485,163486,163487,163488,163489,163490,163491,163492,163493,163494,163495,163496,163497,163498,163499,163500,163501,163502,163503,163504,163505,163506,163507,163508,163509,163510,163511,163512,163513,163514,163515,163516,163517,163518,163519,163520,163521,163522,163523,163524,163525,163526,163527,163528,163529,163530,163531,163532,163533,163534,163535,163536,163537,163538,163539,163540,163541,163542,163543,163544,163545,163546,163547,163548,163549,163550,163551,163552,163553,163554,163555,163556,163557,163558,163559,163560,163561,163562,163563,163564,163565,163566,163567,163568,163569,163570,163571,163572,163573,163574,163575,163576,163577,163578,163579,163580,163581,163582,163583,163584,163585,163586,163587,163588,163589,163590,163591,163592,163593,163594,163595,163596,163597,163598,163599,163600,163601,163602,163603,163604,163605,163606,163607,163608,163609,163610,163611,163612,163613,163614,163615,163616,163617,163618,163619,163620,163621,163622,163623,163624,163625,163626,163627,163628,163629,163630,163631,163632,163633,163634,163635,163636,163637,163638,163639,163640,163641,163642,163643,163644,163645,163646,163647,163648,163649,163650,163651,163652,163653,163654,163655,163656,163657,163658,163659,163660,163661,163662,163663,163664,163665,163666,163667,163668,163669,163670,163671,163672,163673,163674,163675,163676,163677,163678,163679,163680,163681,163682,163683,163684,163685,163686,163687,163688,163689,163690,163691,163692,163693,163694,163695,163696,163697,163698,163699,163700,163701,163702,163703,163704,163705,163706,163707,163708,163709,163710,163711,163712,163713,163714,163715,163716,163717,163718,163719,163720,163721,163722,163723,163724,163725,163726,163727,163728,163729,163730,163731,163732,163733,163734,163735,163736,163737,163738,163739,163740,163741,163742,163743,163744,163745,163746,163747,163748,163749,163750,163751,163752,163753,163754,163755,163756,163757,163758,163759,163760,163761,163762,163763,163764,163765,163766,163767,163768,163769,163770,163771,163772,163773,163774,163775,163776,163777,163778,163779,163780,163781,163782,163783,163784,163785,163786,163787,163788,163789,163790,163791,163792,163793,163794,163795,163796,163797,163798,163799,163800,163801,163802,163803,163804,163805,163806,163807,163808,163809,163810,163811,163812,163813,163814,163815,163816,163817,163818,163819,163820,163821,163822,163823,163824,163825,163826,163827,163828,163829,163830,163831,163832,163833,163834,163835,163836,163837,163838,163839,163840,163841,163842,163843,163844,163845,163846,163847,163848,163849,163850,163851,163852,163853,163854,163855,163856,163857,163858,163859,163860,163861,163862,163863,163864,163865,163866,163867,163868,163869,163870,163871,163872,163873,163874,163875,163876,163877,163878,163879,163880,163881,163882,163883,163884,163885,163886,163887,163888,163889,163890,163891,163892,163893,163894,163895,163896,163897,163898,163899,163900,163901,163902,163903,163904,163905,163906,163907,163908,163909,163910,163911,163912,163913,163914,163915,163916,163917,163918,163919,163920,163921,163922,163923,163924,163925,163926,163927,163928,163929,163930,163931,163932,163933,163934,163935,163936,163937,163938,163939,163940,163941,163942,163943,163944,163945,163946,163947,163948,163949,163950,163951,163952,163953,163954,163955,163956,163957,163958,163959,163960,163961,163962,163963,163964,163965,163966,163967,163968,163969,163970,163971,163972,163973,163974,163975,163976,163977,163978,163979,163980,163981,163982,163983,163984,163985,163986,163987,163988,163989,163990,163991,163992,163993,163994,163995,163996,163997,163998,163999,164000,164001,164002,164003,164004,164005,164006,164007,164008,164009,164010,164011,164012,164013,164014,164015,164016,164017,164018,164019,164020,164021,164022,164023,164024,164025,164026,164027,164028,164029,164030,164031,164032,164033,164034,164035,164036,164037,164038,164039,164040,164041,164042,164043,164044,164045,164046,164047,164048,164049,164050,164051,164052,164053,164054,164055,164056,164057,164058,164059,164060,164061,164062,164063,164064,164065,164066,164067,164068,164069,164070,164071,164072,164073,164074,164075,164076,164077,164078,164079,164080,164081,164082,164083,164084,164085,164086,164087,164088,164089,164090,164091,164092,164093,164094,164095,164096,164097,164098,164099,164100,164101,164102,164103,164104,164105,164106,164107,164108,164109,164110,164111,164112,164113,164114,164115,164116,164117,164118,164119,164120,164121,164122,164123,164124,164125,164126,164127,164128,164129,164130,164131,164132,164133,164134,164135,164136,164137,164138,164139,164140,164141,164142,164143,164144,164145,164146,164147,164148,164149,164150,164151,164152,164153,164154,164155,164156,164157,164158,164159,164160,164161,164162,164163,164164,164165,164166,164167,164168,164169,164170,164171,164172,164173,164174,164175,164176,164177,164178,164179,164180,164181,164182,164183,164184,164185,164186,164187,164188,164189,164190,164191,164192,164193,164194,164195,164196,164197,164198,164199,164200,164201,164202,164203,164204,164205,164206,164207,164208,164209,164210,164211,164212,164213,164214,164215,164216,164217,164218,164219,164220,164221,164222,164223,164224,164225,164226,164227,164228,164229,164230,164231,164232,164233,164234,164235,164236,164237,164238,164239,164240,164241,164242,164243,164244,164245,164246,164247,164248,164249,164250,164251,164252,164253,164254,164255,164256,164257,164258,164259,164260,164261,164262,164263,164264,164265,164266,164267,164268,164269,164270,164271,164272,164273,164274,164275,164276,164277,164278,164279,164280,164281,164282,164283,164284,164285,164286,164287,164288,164289,164290,164291,164292,164293,164294,164295,164296,164297,164298,164299,164300,164301,164302,164303,164304,164305,164306,164307,164308,164309,164310,164311,164312,164313,164314,164315,164316,164317,164318,164319,164320,164321,164322,164323,164324,164325,164326,164327,164328,164329,164330,164331,164332,164333,164334,164335,164336,164337,164338,164339,164340,164341,164342,164343,164344,164345,164346,164347,164348,164349,164350,164351,164352,164353,164354,164355,164356,164357,164358,164359,164360,164361,164362,164363,164364,164365,164366,164367,164368,164369,164370,164371,164372,164373,164374,164375,164376,164377,164378,164379,164380,164381,164382,164383,164384,164385,164386,164387,164388,164389,164390,164391,164392,164393,164394,164395,164396,164397,164398,164399,164400,164401,164402,164403,164404,164405,164406,164407,164408,164409,164410,164411,164412,164413,164414,164415,164416,164417,164418,164419,164420,164421,164422,164423,164424,164425,164426,164427,164428,164429,164430,164431,164432,164433,164434,164435,164436,164437,164438,164439,164440,164441,164442,164443,164444,164445,164446,164447,164448,164449,164450,164451,164452,164453,164454,164455,164456,164457,164458,164459,164460,164461,164462,164463,164464,164465,164466,164467,164468,164469,164470,164471,164472,164473,164474,164475,164476,164477,164478,164479,164480,164481,164482,164483,164484,164485,164486,164487,164488,164489,164490,164491,164492,164493,164494,164495,164496,164497,164498,164499,164500,164501,164502,164503,164504,164505,164506,164507,164508,164509,164510,164511,164512,164513,164514,164515,164516,164517,164518,164519,164520,164521,164522,164523,164524,164525,164526,164527,164528,164529,164530,164531,164532,164533,164534,164535,164536,164537,164538,164539,164540,164541,164542,164543,164544,164545,164546,164547,164548,164549,164550,164551,164552,164553,164554,164555,164556,164557,164558,164559,164560,164561,164562,164563,164564,164565,164566,164567,164568,164569,164570,164571,164572,164573,164574,164575,164576,164577,164578,164579,164580,164581,164582,164583,164584,164585,164586,164587,164588,164589,164590,164591,164592,164593,164594,164595,164596,164597,164598,164599,164600,164601,164602,164603,164604,164605,164606,164607,164608,164609,164610,164611,164612,164613,164614,164615,164616,164617,164618,164619,164620,164621,164622,164623,164624,164625,164626,164627,164628,164629,164630,164631,164632,164633,164634,164635,164636,164637,164638,164639,164640,164641,164642,164643,164644,164645,164646,164647,164648,164649,164650,164651,164652,164653,164654,164655,164656,164657,164658,164659,164660,164661,164662,164663,164664,164665,164666,164667,164668,164669,164670,164671,164672,164673,164674,164675,164676,164677,164678,164679,164680,164681,164682,164683,164684,164685,164686,164687,164688,164689,164690,164691,164692,164693,164694,164695,164696,164697,164698,164699,164700,164701,164702,164703,164704,164705,164706,164707,164708,164709,164710,164711,164712,164713,164714,164715,164716,164717,164718,164719,164720,164721,164722,164723,164724,164725,164726,164727,164728,164729,164730,164731,164732,164733,164734,164735,164736,164737,164738,164739,164740,164741,164742,164743,164744,164745,164746,164747,164748,164749,164750,164751,164752,164753,164754,164755,164756,164757,164758,164759,164760,164761,164762,164763,164764,164765,164766,164767,164768,164769,164770,164771,164772,164773,164774,164775,164776,164777,164778,164779,164780,164781,164782,164783,164784,164785,164786,164787,164788,164789,164790,164791,164792,164793,164794,164795,164796,164797,164798,164799,164800,164801,164802,164803,164804,164805,164806,164807,164808,164809,164810,164811,164812,164813,164814,164815,164816,164817,164818,164819,164820,164821,164822,164823,164824,164825,164826,164827,164828,164829,164830,164831,164832,164833,164834,164835,164836,164837,164838,164839,164840,164841,164842,164843,164844,164845,164846,164847,164848,164849,164850,164851,164852,164853,164854,164855,164856,164857,164858,164859,164860,164861,164862,164863,164864,164865,164866,164867,164868,164869,164870,164871,164872,164873,164874,164875,164876,164877,164878,164879,164880,164881,164882,164883,164884,164885,164886,164887,164888,164889,164890,164891,164892,164893,164894,164895,164896,164897,164898,164899,164900,164901,164902,164903,164904,164905,164906,164907,164908,164909,164910,164911,164912,164913,164914,164915,164916,164917,164918,164919,164920,164921,164922,164923,164924,164925,164926,164927,164928,164929,164930,164931,164932,164933,164934,164935,164936,164937,164938,164939,164940,164941,164942,164943,164944,164945,164946,164947,164948,164949,164950,164951,164952,164953,164954,164955,164956,164957,164958,164959,164960,164961,164962,164963,164964,164965,164966,164967,164968,164969,164970,164971,164972,164973,164974,164975,164976,164977,164978,164979,164980,164981,164982,164983,164984,164985,164986,164987,164988,164989,164990,164991,164992,164993,164994,164995,164996,164997,164998,164999,165000,165001,165002,165003,165004,165005,165006,165007,165008,165009,165010,165011,165012,165013,165014,165015,165016,165017,165018,165019,165020,165021,165022,165023,165024,165025,165026,165027,165028,165029,165030,165031,165032,165033,165034,165035,165036,165037,165038,165039,165040,165041,165042,165043,165044,165045,165046,165047,165048,165049,165050,165051,165052,165053,165054,165055,165056,165057,165058,165059,165060,165061,165062,165063,165064,165065,165066,165067,165068,165069,165070,165071,165072,165073,165074,165075,165076,165077,165078,165079,165080,165081,165082,165083,165084,165085,165086,165087,165088,165089,165090,165091,165092,165093,165094,165095,165096,165097,165098,165099,165100,165101,165102,165103,165104,165105,165106,165107,165108,165109,165110,165111,165112,165113,165114,165115,165116,165117,165118,165119,165120,165121,165122,165123,165124,165125,165126,165127,165128,165129,165130,165131,165132,165133,165134,165135,165136,165137,165138,165139,165140,165141,165142,165143,165144,165145,165146,165147,165148,165149,165150,165151,165152,165153,165154,165155,165156,165157,165158,165159,165160,165161,165162,165163,165164,165165,165166,165167,165168,165169,165170,165171,165172,165173,165174,165175,165176,165177,165178,165179,165180,165181,165182,165183,165184,165185,165186,165187,165188,165189,165190,165191,165192,165193,165194,165195,165196,165197,165198,165199,165200,165201,165202,165203,165204,165205,165206,165207,165208,165209,165210,165211,165212,165213,165214,165215,165216,165217,165218,165219,165220,165221,165222,165223,165224,165225,165226,165227,165228,165229,165230,165231,165232,165233,165234,165235,165236,165237,165238,165239,165240,165241,165242,165243,165244,165245,165246,165247,165248,165249,165250,165251,165252,165253,165254,165255,165256,165257,165258,165259,165260,165261,165262,165263,165264,165265,165266,165267,165268,165269,165270,165271,165272,165273,165274,165275,165276,165277,165278,165279,165280,165281,165282,165283,165284,165285,165286,165287,165288,165289,165290,165291,165292,165293,165294,165295,165296,165297,165298,165299,165300,165301,165302,165303,165304,165305,165306,165307,165308,165309,165310,165311,165312,165313,165314,165315,165316,165317,165318,165319,165320,165321,165322,165323,165324,165325,165326,165327,165328,165329,165330,165331,165332,165333,165334,165335,165336,165337,165338,165339,165340,165341,165342,165343,165344,165345,165346,165347,165348,165349,165350,165351,165352,165353,165354,165355,165356,165357,165358,165359,165360,165361,165362,165363,165364,165365,165366,165367,165368,165369,165370,165371,165372,165373,165374,165375,165376,165377,165378,165379,165380,165381,165382,165383,165384,165385,165386,165387,165388,165389,165390,165391,165392,165393,165394,165395,165396,165397,165398,165399,165400,165401,165402,165403,165404,165405,165406,165407,165408,165409,165410,165411,165412,165413,165414,165415,165416,165417,165418,165419,165420,165421,165422,165423,165424,165425,165426,165427,165428,165429,165430,165431,165432,165433,165434,165435,165436,165437,165438,165439,165440,165441,165442,165443,165444,165445,165446,165447,165448,165449,165450,165451,165452,165453,165454,165455,165456,165457,165458,165459,165460,165461,165462,165463,165464,165465,165466,165467,165468,165469,165470,165471,165472,165473,165474,165475,165476,165477,165478,165479,165480,165481,165482,165483,165484,165485,165486,165487,165488,165489,165490,165491,165492,165493,165494,165495,165496,165497,165498,165499,165500,165501,165502,165503,165504,165505,165506,165507,165508,165509,165510,165511,165512,165513,165514,165515,165516,165517,165518,165519,165520,165521,165522,165523,165524,165525,165526,165527,165528,165529,165530,165531,165532,165533,165534,165535,165536,165537,165538,165539,165540,165541,165542,165543,165544,165545,165546,165547,165548,165549,165550,165551,165552,165553,165554,165555,165556,165557,165558,165559,165560,165561,165562,165563,165564,165565,165566,165567,165568,165569,165570,165571,165572,165573,165574,165575,165576,165577,165578,165579,165580,165581,165582,165583,165584,165585,165586,165587,165588,165589,165590,165591,165592,165593,165594,165595,165596,165597,165598,165599,165600,165601,165602,165603,165604,165605,165606,165607,165608,165609,165610,165611,165612,165613,165614,165615,165616,165617,165618,165619,165620,165621,165622,165623,165624,165625,165626,165627,165628,165629,165630,165631,165632,165633,165634,165635,165636,165637,165638,165639,165640,165641,165642,165643,165644,165645,165646,165647,165648,165649,165650,165651,165652,165653,165654,165655,165656,165657,165658,165659,165660,165661,165662,165663,165664,165665,165666,165667,165668,165669,165670,165671,165672,165673,165674,165675,165676,165677,165678,165679,165680,165681,165682,165683,165684,165685,165686,165687,165688,165689,165690,165691,165692,165693,165694,165695,165696,165697,165698,165699,165700,165701,165702,165703,165704,165705,165706,165707,165708,165709,165710,165711,165712,165713,165714,165715,165716,165717,165718,165719,165720,165721,165722,165723,165724,165725,165726,165727,165728,165729,165730,165731,165732,165733,165734,165735,165736,165737,165738,165739,165740,165741,165742,165743,165744,165745,165746,165747,165748,165749,165750,165751,165752,165753,165754,165755,165756,165757,165758,165759,165760,165761,165762,165763,165764,165765,165766,165767,165768,165769,165770,165771,165772,165773,165774,165775,165776,165777,165778,165779,165780,165781,165782,165783,165784,165785,165786,165787,165788,165789,165790,165791,165792,165793,165794,165795,165796,165797,165798,165799,165800,165801,165802,165803,165804,165805,165806,165807,165808,165809,165810,165811,165812,165813,165814,165815,165816,165817,165818,165819,165820,165821,165822,165823,165824,165825,165826,165827,165828,165829,165830,165831,165832,165833,165834,165835,165836,165837,165838,165839,165840,165841,165842,165843,165844,165845,165846,165847,165848,165849,165850,165851,165852,165853,165854,165855,165856,165857,165858,165859,165860,165861,165862,165863,165864,165865,165866,165867,165868,165869,165870,165871,165872,165873,165874,165875,165876,165877,165878,165879,165880,165881,165882,165883,165884,165885,165886,165887,165888,165889,165890,165891,165892,165893,165894,165895,165896,165897,165898,165899,165900,165901,165902,165903,165904,165905,165906,165907,165908,165909,165910,165911,165912,165913,165914,165915,165916,165917,165918,165919,165920,165921,165922,165923,165924,165925,165926,165927,165928,165929,165930,165931,165932,165933,165934,165935,165936,165937,165938,165939,165940,165941,165942,165943,165944,165945,165946,165947,165948,165949,165950,165951,165952,165953,165954,165955,165956,165957,165958,165959,165960,165961,165962,165963,165964,165965,165966,165967,165968,165969,165970,165971,165972,165973,165974,165975,165976,165977,165978,165979,165980,165981,165982,165983,165984,165985,165986,165987,165988,165989,165990,165991,165992,165993,165994,165995,165996,165997,165998,165999,166000,166001,166002,166003,166004,166005,166006,166007,166008,166009,166010,166011,166012,166013,166014,166015,166016,166017,166018,166019,166020,166021,166022,166023,166024,166025,166026,166027,166028,166029,166030,166031,166032,166033,166034,166035,166036,166037,166038,166039,166040,166041,166042,166043,166044,166045,166046,166047,166048,166049,166050,166051,166052,166053,166054,166055,166056,166057,166058,166059,166060,166061,166062,166063,166064,166065,166066,166067,166068,166069,166070,166071,166072,166073,166074,166075,166076,166077,166078,166079,166080,166081,166082,166083,166084,166085,166086,166087,166088,166089,166090,166091,166092,166093,166094,166095,166096,166097,166098,166099,166100,166101,166102,166103,166104,166105,166106,166107,166108,166109,166110,166111,166112,166113,166114,166115,166116,166117,166118,166119,166120,166121,166122,166123,166124,166125,166126,166127,166128,166129,166130,166131,166132,166133,166134,166135,166136,166137,166138,166139,166140,166141,166142,166143,166144,166145,166146,166147,166148,166149,166150,166151,166152,166153,166154,166155,166156,166157,166158,166159,166160,166161,166162,166163,166164,166165,166166,166167,166168,166169,166170,166171,166172,166173,166174,166175,166176,166177,166178,166179,166180,166181,166182,166183,166184,166185,166186,166187,166188,166189,166190,166191,166192,166193,166194,166195,166196,166197,166198,166199,166200,166201,166202,166203,166204,166205,166206,166207,166208,166209,166210,166211,166212,166213,166214,166215,166216,166217,166218,166219,166220,166221,166222,166223,166224,166225,166226,166227,166228,166229,166230,166231,166232,166233,166234,166235,166236,166237,166238,166239,166240,166241,166242,166243,166244,166245,166246,166247,166248,166249,166250,166251,166252,166253,166254,166255,166256,166257,166258,166259,166260,166261,166262,166263,166264,166265,166266,166267,166268,166269,166270,166271,166272,166273,166274,166275,166276,166277,166278,166279,166280,166281,166282,166283,166284,166285,166286,166287,166288,166289,166290,166291,166292,166293,166294,166295,166296,166297,166298,166299,166300,166301,166302,166303,166304,166305,166306,166307,166308,166309,166310,166311,166312,166313,166314,166315,166316,166317,166318,166319,166320,166321,166322,166323,166324,166325,166326,166327,166328,166329,166330,166331,166332,166333,166334,166335,166336,166337,166338,166339,166340,166341,166342,166343,166344,166345,166346,166347,166348,166349,166350,166351,166352,166353,166354,166355,166356,166357,166358,166359,166360,166361,166362,166363,166364,166365,166366,166367,166368,166369,166370,166371,166372,166373,166374,166375,166376,166377,166378,166379,166380,166381,166382,166383,166384,166385,166386,166387,166388,166389,166390,166391,166392,166393,166394,166395,166396,166397,166398,166399,166400,166401,166402,166403,166404,166405,166406,166407,166408,166409,166410,166411,166412,166413,166414,166415,166416,166417,166418,166419,166420,166421,166422,166423,166424,166425,166426,166427,166428,166429,166430,166431,166432,166433,166434,166435,166436,166437,166438,166439,166440,166441,166442,166443,166444,166445,166446,166447,166448,166449,166450,166451,166452,166453,166454,166455,166456,166457,166458,166459,166460,166461,166462,166463,166464,166465,166466,166467,166468,166469,166470,166471,166472,166473,166474,166475,166476,166477,166478,166479,166480,166481,166482,166483,166484,166485,166486,166487,166488,166489,166490,166491,166492,166493,166494,166495,166496,166497,166498,166499,166500,166501,166502,166503,166504,166505,166506,166507,166508,166509,166510,166511,166512,166513,166514,166515,166516,166517,166518,166519,166520,166521,166522,166523,166524,166525,166526,166527,166528,166529,166530,166531,166532,166533,166534,166535,166536,166537,166538,166539,166540,166541,166542,166543,166544,166545,166546,166547,166548,166549,166550,166551,166552,166553,166554,166555,166556,166557,166558,166559,166560,166561,166562,166563,166564,166565,166566,166567,166568,166569,166570,166571,166572,166573,166574,166575,166576,166577,166578,166579,166580,166581,166582,166583,166584,166585,166586,166587,166588,166589,166590,166591,166592,166593,166594,166595,166596,166597,166598,166599,166600,166601,166602,166603,166604,166605,166606,166607,166608,166609,166610,166611,166612,166613,166614,166615,166616,166617,166618,166619,166620,166621,166622,166623,166624,166625,166626,166627,166628,166629,166630,166631,166632,166633,166634,166635,166636,166637,166638,166639,166640,166641,166642,166643,166644,166645,166646,166647,166648,166649,166650,166651,166652,166653,166654,166655,166656,166657,166658,166659,166660,166661,166662,166663,166664,166665,166666,166667,166668,166669,166670,166671,166672,166673,166674,166675,166676,166677,166678,166679,166680,166681,166682,166683,166684,166685,166686,166687,166688,166689,166690,166691,166692,166693,166694,166695,166696,166697,166698,166699,166700,166701,166702,166703,166704,166705,166706,166707,166708,166709,166710,166711,166712,166713,166714,166715,166716,166717,166718,166719,166720,166721,166722,166723,166724,166725,166726,166727,166728,166729,166730,166731,166732,166733,166734,166735,166736,166737,166738,166739,166740,166741,166742,166743,166744,166745,166746,166747,166748,166749,166750,166751,166752,166753,166754,166755,166756,166757,166758,166759,166760,166761,166762,166763,166764,166765,166766,166767,166768,166769,166770,166771,166772,166773,166774,166775,166776,166777,166778,166779,166780,166781,166782,166783,166784,166785,166786,166787,166788,166789,166790,166791,166792,166793,166794,166795,166796,166797,166798,166799,166800,166801,166802,166803,166804,166805,166806,166807,166808,166809,166810,166811,166812,166813,166814,166815,166816,166817,166818,166819,166820,166821,166822,166823,166824,166825,166826,166827,166828,166829,166830,166831,166832,166833,166834,166835,166836,166837,166838,166839,166840,166841,166842,166843,166844,166845,166846,166847,166848,166849,166850,166851,166852,166853,166854,166855,166856,166857,166858,166859,166860,166861,166862,166863,166864,166865,166866,166867,166868,166869,166870,166871,166872,166873,166874,166875,166876,166877,166878,166879,166880,166881,166882,166883,166884,166885,166886,166887,166888,166889,166890,166891,166892,166893,166894,166895,166896,166897,166898,166899,166900,166901,166902,166903,166904,166905,166906,166907,166908,166909,166910,166911,166912,166913,166914,166915,166916,166917,166918,166919,166920,166921,166922,166923,166924,166925,166926,166927,166928,166929,166930,166931,166932,166933,166934,166935,166936,166937,166938,166939,166940,166941,166942,166943,166944,166945,166946,166947,166948,166949,166950,166951,166952,166953,166954,166955,166956,166957,166958,166959,166960,166961,166962,166963,166964,166965,166966,166967,166968,166969,166970,166971,166972,166973,166974,166975,166976,166977,166978,166979,166980,166981,166982,166983,166984,166985,166986,166987,166988,166989,166990,166991,166992,166993,166994,166995,166996,166997,166998,166999,167000,167001,167002,167003,167004,167005,167006,167007,167008,167009,167010,167011,167012,167013,167014,167015,167016,167017,167018,167019,167020,167021,167022,167023,167024,167025,167026,167027,167028,167029,167030,167031,167032,167033,167034,167035,167036,167037,167038,167039,167040,167041,167042,167043,167044,167045,167046,167047,167048,167049,167050,167051,167052,167053,167054,167055,167056,167057,167058,167059,167060,167061,167062,167063,167064,167065,167066,167067,167068,167069,167070,167071,167072,167073,167074,167075,167076,167077,167078,167079,167080,167081,167082,167083,167084,167085,167086,167087,167088,167089,167090,167091,167092,167093,167094,167095,167096,167097,167098,167099,167100,167101,167102,167103,167104,167105,167106,167107,167108,167109,167110,167111,167112,167113,167114,167115,167116,167117,167118,167119,167120,167121,167122,167123,167124,167125,167126,167127,167128,167129,167130,167131,167132,167133,167134,167135,167136,167137,167138,167139,167140,167141,167142,167143,167144,167145,167146,167147,167148,167149,167150,167151,167152,167153,167154,167155,167156,167157,167158,167159,167160,167161,167162,167163,167164,167165,167166,167167,167168,167169,167170,167171,167172,167173,167174,167175,167176,167177,167178,167179,167180,167181,167182,167183,167184,167185,167186,167187,167188,167189,167190,167191,167192,167193,167194,167195,167196,167197,167198,167199,167200,167201,167202,167203,167204,167205,167206,167207,167208,167209,167210,167211,167212,167213,167214,167215,167216,167217,167218,167219,167220,167221,167222,167223,167224,167225,167226,167227,167228,167229,167230,167231,167232,167233,167234,167235,167236,167237,167238,167239,167240,167241,167242,167243,167244,167245,167246,167247,167248,167249,167250,167251,167252,167253,167254,167255,167256,167257,167258,167259,167260,167261,167262,167263,167264,167265,167266,167267,167268,167269,167270,167271,167272,167273,167274,167275,167276,167277,167278,167279,167280,167281,167282,167283,167284,167285,167286,167287,167288,167289,167290,167291,167292,167293,167294,167295,167296,167297,167298,167299,167300,167301,167302,167303,167304,167305,167306,167307,167308,167309,167310,167311,167312,167313,167314,167315,167316,167317,167318,167319,167320,167321,167322,167323,167324,167325,167326,167327,167328,167329,167330,167331,167332,167333,167334,167335,167336,167337,167338,167339,167340,167341,167342,167343,167344,167345,167346,167347,167348,167349,167350,167351,167352,167353,167354,167355,167356,167357,167358,167359,167360,167361,167362,167363,167364,167365,167366,167367,167368,167369,167370,167371,167372,167373,167374,167375,167376,167377,167378,167379,167380,167381,167382,167383,167384,167385,167386,167387,167388,167389,167390,167391,167392,167393,167394,167395,167396,167397,167398,167399,167400,167401,167402,167403,167404,167405,167406,167407,167408,167409,167410,167411,167412,167413,167414,167415,167416,167417,167418,167419,167420,167421,167422,167423,167424,167425,167426,167427,167428,167429,167430,167431,167432,167433,167434,167435,167436,167437,167438,167439,167440,167441,167442,167443,167444,167445,167446,167447,167448,167449,167450,167451,167452,167453,167454,167455,167456,167457,167458,167459,167460,167461,167462,167463,167464,167465,167466,167467,167468,167469,167470,167471,167472,167473,167474,167475,167476,167477,167478,167479,167480,167481,167482,167483,167484,167485,167486,167487,167488,167489,167490,167491,167492,167493,167494,167495,167496,167497,167498,167499,167500,167501,167502,167503,167504,167505,167506,167507,167508,167509,167510,167511,167512,167513,167514,167515,167516,167517,167518,167519,167520,167521,167522,167523,167524,167525,167526,167527,167528,167529,167530,167531,167532,167533,167534,167535,167536,167537,167538,167539,167540,167541,167542,167543,167544,167545,167546,167547,167548,167549,167550,167551,167552,167553,167554,167555,167556,167557,167558,167559,167560,167561,167562,167563,167564,167565,167566,167567,167568,167569,167570,167571,167572,167573,167574,167575,167576,167577,167578,167579,167580,167581,167582,167583,167584,167585,167586,167587,167588,167589,167590,167591,167592,167593,167594,167595,167596,167597,167598,167599,167600,167601,167602,167603,167604,167605,167606,167607,167608,167609,167610,167611,167612,167613,167614,167615,167616,167617,167618,167619,167620,167621,167622,167623,167624,167625,167626,167627,167628,167629,167630,167631,167632,167633,167634,167635,167636,167637,167638,167639,167640,167641,167642,167643,167644,167645,167646,167647,167648,167649,167650,167651,167652,167653,167654,167655,167656,167657,167658,167659,167660,167661,167662,167663,167664,167665,167666,167667,167668,167669,167670,167671,167672,167673,167674,167675,167676,167677,167678,167679,167680,167681,167682,167683,167684,167685,167686,167687,167688,167689,167690,167691,167692,167693,167694,167695,167696,167697,167698,167699,167700,167701,167702,167703,167704,167705,167706,167707,167708,167709,167710,167711,167712,167713,167714,167715,167716,167717,167718,167719,167720,167721,167722,167723,167724,167725,167726,167727,167728,167729,167730,167731,167732,167733,167734,167735,167736,167737,167738,167739,167740,167741,167742,167743,167744,167745,167746,167747,167748,167749,167750,167751,167752,167753,167754,167755,167756,167757,167758,167759,167760,167761,167762,167763,167764,167765,167766,167767,167768,167769,167770,167771,167772,167773,167774,167775,167776,167777,167778,167779,167780,167781,167782,167783,167784,167785,167786,167787,167788,167789,167790,167791,167792,167793,167794,167795,167796,167797,167798,167799,167800,167801,167802,167803,167804,167805,167806,167807,167808,167809,167810,167811,167812,167813,167814,167815,167816,167817,167818,167819,167820,167821,167822,167823,167824,167825,167826,167827,167828,167829,167830,167831,167832,167833,167834,167835,167836,167837,167838,167839,167840,167841,167842,167843,167844,167845,167846,167847,167848,167849,167850,167851,167852,167853,167854,167855,167856,167857,167858,167859,167860,167861,167862,167863,167864,167865,167866,167867,167868,167869,167870,167871,167872,167873,167874,167875,167876,167877,167878,167879,167880,167881,167882,167883,167884,167885,167886,167887,167888,167889,167890,167891,167892,167893,167894,167895,167896,167897,167898,167899,167900,167901,167902,167903,167904,167905,167906,167907,167908,167909,167910,167911,167912,167913,167914,167915,167916,167917,167918,167919,167920,167921,167922,167923,167924,167925,167926,167927,167928,167929,167930,167931,167932,167933,167934,167935,167936,167937,167938,167939,167940,167941,167942,167943,167944,167945,167946,167947,167948,167949,167950,167951,167952,167953,167954,167955,167956,167957,167958,167959,167960,167961,167962,167963,167964,167965,167966,167967,167968,167969,167970,167971,167972,167973,167974,167975,167976,167977,167978,167979,167980,167981,167982,167983,167984,167985,167986,167987,167988,167989,167990,167991,167992,167993,167994,167995,167996,167997,167998,167999,168000,168001,168002,168003,168004,168005,168006,168007,168008,168009,168010,168011,168012,168013,168014,168015,168016,168017,168018,168019,168020,168021,168022,168023,168024,168025,168026,168027,168028,168029,168030,168031,168032,168033,168034,168035,168036,168037,168038,168039,168040,168041,168042,168043,168044,168045,168046,168047,168048,168049,168050,168051,168052,168053,168054,168055,168056,168057,168058,168059,168060,168061,168062,168063,168064,168065,168066,168067,168068,168069,168070,168071,168072,168073,168074,168075,168076,168077,168078,168079,168080,168081,168082,168083,168084,168085,168086,168087,168088,168089,168090,168091,168092,168093,168094,168095,168096,168097,168098,168099,168100,168101,168102,168103,168104,168105,168106,168107,168108,168109,168110,168111,168112,168113,168114,168115,168116,168117,168118,168119,168120,168121,168122,168123,168124,168125,168126,168127,168128,168129,168130,168131,168132,168133,168134,168135,168136,168137,168138,168139,168140,168141,168142,168143,168144,168145,168146,168147,168148,168149,168150,168151,168152,168153,168154,168155,168156,168157,168158,168159,168160,168161,168162,168163,168164,168165,168166,168167,168168,168169,168170,168171,168172,168173,168174,168175,168176,168177,168178,168179,168180,168181,168182,168183,168184,168185,168186,168187,168188,168189,168190,168191,168192,168193,168194,168195,168196,168197,168198,168199,168200,168201,168202,168203,168204,168205,168206,168207,168208,168209,168210,168211,168212,168213,168214,168215,168216,168217,168218,168219,168220,168221,168222,168223,168224,168225,168226,168227,168228,168229,168230,168231,168232,168233,168234,168235,168236,168237,168238,168239,168240,168241,168242,168243,168244,168245,168246,168247,168248,168249,168250,168251,168252,168253,168254,168255,168256,168257,168258,168259,168260,168261,168262,168263,168264,168265,168266,168267,168268,168269,168270,168271,168272,168273,168274,168275,168276,168277,168278,168279,168280,168281,168282,168283,168284,168285,168286,168287,168288,168289,168290,168291,168292,168293,168294,168295,168296,168297,168298,168299,168300,168301,168302,168303,168304,168305,168306,168307,168308,168309,168310,168311,168312,168313,168314,168315,168316,168317,168318,168319,168320,168321,168322,168323,168324,168325,168326,168327,168328,168329,168330,168331,168332,168333,168334,168335,168336,168337,168338,168339,168340,168341,168342,168343,168344,168345,168346,168347,168348,168349,168350,168351,168352,168353,168354,168355,168356,168357,168358,168359,168360,168361,168362,168363,168364,168365,168366,168367,168368,168369,168370,168371,168372,168373,168374,168375,168376,168377,168378,168379,168380,168381,168382,168383,168384,168385,168386,168387,168388,168389,168390,168391,168392,168393,168394,168395,168396,168397,168398,168399,168400,168401,168402,168403,168404,168405,168406,168407,168408,168409,168410,168411,168412,168413,168414,168415,168416,168417,168418,168419,168420,168421,168422,168423,168424,168425,168426,168427,168428,168429,168430,168431,168432,168433,168434,168435,168436,168437,168438,168439,168440,168441,168442,168443,168444,168445,168446,168447,168448,168449,168450,168451,168452,168453,168454,168455,168456,168457,168458,168459,168460,168461,168462,168463,168464,168465,168466,168467,168468,168469,168470,168471,168472,168473,168474,168475,168476,168477,168478,168479,168480,168481,168482,168483,168484,168485,168486,168487,168488,168489,168490,168491,168492,168493,168494,168495,168496,168497,168498,168499,168500,168501,168502,168503,168504,168505,168506,168507,168508,168509,168510,168511,168512,168513,168514,168515,168516,168517,168518,168519,168520,168521,168522,168523,168524,168525,168526,168527,168528,168529,168530,168531,168532,168533,168534,168535,168536,168537,168538,168539,168540,168541,168542,168543,168544,168545,168546,168547,168548,168549,168550,168551,168552,168553,168554,168555,168556,168557,168558,168559,168560,168561,168562,168563,168564,168565,168566,168567,168568,168569,168570,168571,168572,168573,168574,168575,168576,168577,168578,168579,168580,168581,168582,168583,168584,168585,168586,168587,168588,168589,168590,168591,168592,168593,168594,168595,168596,168597,168598,168599,168600,168601,168602,168603,168604,168605,168606,168607,168608,168609,168610,168611,168612,168613,168614,168615,168616,168617,168618,168619,168620,168621,168622,168623,168624,168625,168626,168627,168628,168629,168630,168631,168632,168633,168634,168635,168636,168637,168638,168639,168640,168641,168642,168643,168644,168645,168646,168647,168648,168649,168650,168651,168652,168653,168654,168655,168656,168657,168658,168659,168660,168661,168662,168663,168664,168665,168666,168667,168668,168669,168670,168671,168672,168673,168674,168675,168676,168677,168678,168679,168680,168681,168682,168683,168684,168685,168686,168687,168688,168689,168690,168691,168692,168693,168694,168695,168696,168697,168698,168699,168700,168701,168702,168703,168704,168705,168706,168707,168708,168709,168710,168711,168712,168713,168714,168715,168716,168717,168718,168719,168720,168721,168722,168723,168724,168725,168726,168727,168728,168729,168730,168731,168732,168733,168734,168735,168736,168737,168738,168739,168740,168741,168742,168743,168744,168745,168746,168747,168748,168749,168750,168751,168752,168753,168754,168755,168756,168757,168758,168759,168760,168761,168762,168763,168764,168765,168766,168767,168768,168769,168770,168771,168772,168773,168774,168775,168776,168777,168778,168779,168780,168781,168782,168783,168784,168785,168786,168787,168788,168789,168790,168791,168792,168793,168794,168795,168796,168797,168798,168799,168800,168801,168802,168803,168804,168805,168806,168807,168808,168809,168810,168811,168812,168813,168814,168815,168816,168817,168818,168819,168820,168821,168822,168823,168824,168825,168826,168827,168828,168829,168830,168831,168832,168833,168834,168835,168836,168837,168838,168839,168840,168841,168842,168843,168844,168845,168846,168847,168848,168849,168850,168851,168852,168853,168854,168855,168856,168857,168858,168859,168860,168861,168862,168863,168864,168865,168866,168867,168868,168869,168870,168871,168872,168873,168874,168875,168876,168877,168878,168879,168880,168881,168882,168883,168884,168885,168886,168887,168888,168889,168890,168891,168892,168893,168894,168895,168896,168897,168898,168899,168900,168901,168902,168903,168904,168905,168906,168907,168908,168909,168910,168911,168912,168913,168914,168915,168916,168917,168918,168919,168920,168921,168922,168923,168924,168925,168926,168927,168928,168929,168930,168931,168932,168933,168934,168935,168936,168937,168938,168939,168940,168941,168942,168943,168944,168945,168946,168947,168948,168949,168950,168951,168952,168953,168954,168955,168956,168957,168958,168959,168960,168961,168962,168963,168964,168965,168966,168967,168968,168969,168970,168971,168972,168973,168974,168975,168976,168977,168978,168979,168980,168981,168982,168983,168984,168985,168986,168987,168988,168989,168990,168991,168992,168993,168994,168995,168996,168997,168998,168999,169000,169001,169002,169003,169004,169005,169006,169007,169008,169009,169010,169011,169012,169013,169014,169015,169016,169017,169018,169019,169020,169021,169022,169023,169024,169025,169026,169027,169028,169029,169030,169031,169032,169033,169034,169035,169036,169037,169038,169039,169040,169041,169042,169043,169044,169045,169046,169047,169048,169049,169050,169051,169052,169053,169054,169055,169056,169057,169058,169059,169060,169061,169062,169063,169064,169065,169066,169067,169068,169069,169070,169071,169072,169073,169074,169075,169076,169077,169078,169079,169080,169081,169082,169083,169084,169085,169086,169087,169088,169089,169090,169091,169092,169093,169094,169095,169096,169097,169098,169099,169100,169101,169102,169103,169104,169105,169106,169107,169108,169109,169110,169111,169112,169113,169114,169115,169116,169117,169118,169119,169120,169121,169122,169123,169124,169125,169126,169127,169128,169129,169130,169131,169132,169133,169134,169135,169136,169137,169138,169139,169140,169141,169142,169143,169144,169145,169146,169147,169148,169149,169150,169151,169152,169153,169154,169155,169156,169157,169158,169159,169160,169161,169162,169163,169164,169165,169166,169167,169168,169169,169170,169171,169172,169173,169174,169175,169176,169177,169178,169179,169180,169181,169182,169183,169184,169185,169186,169187,169188,169189,169190,169191,169192,169193,169194,169195,169196,169197,169198,169199,169200,169201,169202,169203,169204,169205,169206,169207,169208,169209,169210,169211,169212,169213,169214,169215,169216,169217,169218,169219,169220,169221,169222,169223,169224,169225,169226,169227,169228,169229,169230,169231,169232,169233,169234,169235,169236,169237,169238,169239,169240,169241,169242,169243,169244,169245,169246,169247,169248,169249,169250,169251,169252,169253,169254,169255,169256,169257,169258,169259,169260,169261,169262,169263,169264,169265,169266,169267,169268,169269,169270,169271,169272,169273,169274,169275,169276,169277,169278,169279,169280,169281,169282,169283,169284,169285,169286,169287,169288,169289,169290,169291,169292,169293,169294,169295,169296,169297,169298,169299,169300,169301,169302,169303,169304,169305,169306,169307,169308,169309,169310,169311,169312,169313,169314,169315,169316,169317,169318,169319,169320,169321,169322,169323,169324,169325,169326,169327,169328,169329,169330,169331,169332,169333,169334,169335,169336,169337,169338,169339,169340,169341,169342,169343,169344,169345,169346,169347,169348,169349,169350,169351,169352,169353,169354,169355,169356,169357,169358,169359,169360,169361,169362,169363,169364,169365,169366,169367,169368,169369,169370,169371,169372,169373,169374,169375,169376,169377,169378,169379,169380,169381,169382,169383,169384,169385,169386,169387,169388,169389,169390,169391,169392,169393,169394,169395,169396,169397,169398,169399,169400,169401,169402,169403,169404,169405,169406,169407,169408,169409,169410,169411,169412,169413,169414,169415,169416,169417,169418,169419,169420,169421,169422,169423,169424,169425,169426,169427,169428,169429,169430,169431,169432,169433,169434,169435,169436,169437,169438,169439,169440,169441,169442,169443,169444,169445,169446,169447,169448,169449,169450,169451,169452,169453,169454,169455,169456,169457,169458,169459,169460,169461,169462,169463,169464,169465,169466,169467,169468,169469,169470,169471,169472,169473,169474,169475,169476,169477,169478,169479,169480,169481,169482,169483,169484,169485,169486,169487,169488,169489,169490,169491,169492,169493,169494,169495,169496,169497,169498,169499,169500,169501,169502,169503,169504,169505,169506,169507,169508,169509,169510,169511,169512,169513,169514,169515,169516,169517,169518,169519,169520,169521,169522,169523,169524,169525,169526,169527,169528,169529,169530,169531,169532,169533,169534,169535,169536,169537,169538,169539,169540,169541,169542,169543,169544,169545,169546,169547,169548,169549,169550,169551,169552,169553,169554,169555,169556,169557,169558,169559,169560,169561,169562,169563,169564,169565,169566,169567,169568,169569,169570,169571,169572,169573,169574,169575,169576,169577,169578,169579,169580,169581,169582,169583,169584,169585,169586,169587,169588,169589,169590,169591,169592,169593,169594,169595,169596,169597,169598,169599,169600,169601,169602,169603,169604,169605,169606,169607,169608,169609,169610,169611,169612,169613,169614,169615,169616,169617,169618,169619,169620,169621,169622,169623,169624,169625,169626,169627,169628,169629,169630,169631,169632,169633,169634,169635,169636,169637,169638,169639,169640,169641,169642,169643,169644,169645,169646,169647,169648,169649,169650,169651,169652,169653,169654,169655,169656,169657,169658,169659,169660,169661,169662,169663,169664,169665,169666,169667,169668,169669,169670,169671,169672,169673,169674,169675,169676,169677,169678,169679,169680,169681,169682,169683,169684,169685,169686,169687,169688,169689,169690,169691,169692,169693,169694,169695,169696,169697,169698,169699,169700,169701,169702,169703,169704,169705,169706,169707,169708,169709,169710,169711,169712,169713,169714,169715,169716,169717,169718,169719,169720,169721,169722,169723,169724,169725,169726,169727,169728,169729,169730,169731,169732,169733,169734,169735,169736,169737,169738,169739,169740,169741,169742,169743,169744,169745,169746,169747,169748,169749,169750,169751,169752,169753,169754,169755,169756,169757,169758,169759,169760,169761,169762,169763,169764,169765,169766,169767,169768,169769,169770,169771,169772,169773,169774,169775,169776,169777,169778,169779,169780,169781,169782,169783,169784,169785,169786,169787,169788,169789,169790,169791,169792,169793,169794,169795,169796,169797,169798,169799,169800,169801,169802,169803,169804,169805,169806,169807,169808,169809,169810,169811,169812,169813,169814,169815,169816,169817,169818,169819,169820,169821,169822,169823,169824,169825,169826,169827,169828,169829,169830,169831,169832,169833,169834,169835,169836,169837,169838,169839,169840,169841,169842,169843,169844,169845,169846,169847,169848,169849,169850,169851,169852,169853,169854,169855,169856,169857,169858,169859,169860,169861,169862,169863,169864,169865,169866,169867,169868,169869,169870,169871,169872,169873,169874,169875,169876,169877,169878,169879,169880,169881,169882,169883,169884,169885,169886,169887,169888,169889,169890,169891,169892,169893,169894,169895,169896,169897,169898,169899,169900,169901,169902,169903,169904,169905,169906,169907,169908,169909,169910,169911,169912,169913,169914,169915,169916,169917,169918,169919,169920,169921,169922,169923,169924,169925,169926,169927,169928,169929,169930,169931,169932,169933,169934,169935,169936,169937,169938,169939,169940,169941,169942,169943,169944,169945,169946,169947,169948,169949,169950,169951,169952,169953,169954,169955,169956,169957,169958,169959,169960,169961,169962,169963,169964,169965,169966,169967,169968,169969,169970,169971,169972,169973,169974,169975,169976,169977,169978,169979,169980,169981,169982,169983,169984,169985,169986,169987,169988,169989,169990,169991,169992,169993,169994,169995,169996,169997,169998,169999,170000,170001,170002,170003,170004,170005,170006,170007,170008,170009,170010,170011,170012,170013,170014,170015,170016,170017,170018,170019,170020,170021,170022,170023,170024,170025,170026,170027,170028,170029,170030,170031,170032,170033,170034,170035,170036,170037,170038,170039,170040,170041,170042,170043,170044,170045,170046,170047,170048,170049,170050,170051,170052,170053,170054,170055,170056,170057,170058,170059,170060,170061,170062,170063,170064,170065,170066,170067,170068,170069,170070,170071,170072,170073,170074,170075,170076,170077,170078,170079,170080,170081,170082,170083,170084,170085,170086,170087,170088,170089,170090,170091,170092,170093,170094,170095,170096,170097,170098,170099,170100,170101,170102,170103,170104,170105,170106,170107,170108,170109,170110,170111,170112,170113,170114,170115,170116,170117,170118,170119,170120,170121,170122,170123,170124,170125,170126,170127,170128,170129,170130,170131,170132,170133,170134,170135,170136,170137,170138,170139,170140,170141,170142,170143,170144,170145,170146,170147,170148,170149,170150,170151,170152,170153,170154,170155,170156,170157,170158,170159,170160,170161,170162,170163,170164,170165,170166,170167,170168,170169,170170,170171,170172,170173,170174,170175,170176,170177,170178,170179,170180,170181,170182,170183,170184,170185,170186,170187,170188,170189,170190,170191,170192,170193,170194,170195,170196,170197,170198,170199,170200,170201,170202,170203,170204,170205,170206,170207,170208,170209,170210,170211,170212,170213,170214,170215,170216,170217,170218,170219,170220,170221,170222,170223,170224,170225,170226,170227,170228,170229,170230,170231,170232,170233,170234,170235,170236,170237,170238,170239,170240,170241,170242,170243,170244,170245,170246,170247,170248,170249,170250,170251,170252,170253,170254,170255,170256,170257,170258,170259,170260,170261,170262,170263,170264,170265,170266,170267,170268,170269,170270,170271,170272,170273,170274,170275,170276,170277,170278,170279,170280,170281,170282,170283,170284,170285,170286,170287,170288,170289,170290,170291,170292,170293,170294,170295,170296,170297,170298,170299,170300,170301,170302,170303,170304,170305,170306,170307,170308,170309,170310,170311,170312,170313,170314,170315,170316,170317,170318,170319,170320,170321,170322,170323,170324,170325,170326,170327,170328,170329,170330,170331,170332,170333,170334,170335,170336,170337,170338,170339,170340,170341,170342,170343,170344,170345,170346,170347,170348,170349,170350,170351,170352,170353,170354,170355,170356,170357,170358,170359,170360,170361,170362,170363,170364,170365,170366,170367,170368,170369,170370,170371,170372,170373,170374,170375,170376,170377,170378,170379,170380,170381,170382,170383,170384,170385,170386,170387,170388,170389,170390,170391,170392,170393,170394,170395,170396,170397,170398,170399,170400,170401,170402,170403,170404,170405,170406,170407,170408,170409,170410,170411,170412,170413,170414,170415,170416,170417,170418,170419,170420,170421,170422,170423,170424,170425,170426,170427,170428,170429,170430,170431,170432,170433,170434,170435,170436,170437,170438,170439,170440,170441,170442,170443,170444,170445,170446,170447,170448,170449,170450,170451,170452,170453,170454,170455,170456,170457,170458,170459,170460,170461,170462,170463,170464,170465,170466,170467,170468,170469,170470,170471,170472,170473,170474,170475,170476,170477,170478,170479,170480,170481,170482,170483,170484,170485,170486,170487,170488,170489,170490,170491,170492,170493,170494,170495,170496,170497,170498,170499,170500,170501,170502,170503,170504,170505,170506,170507,170508,170509,170510,170511,170512,170513,170514,170515,170516,170517,170518,170519,170520,170521,170522,170523,170524,170525,170526,170527,170528,170529,170530,170531,170532,170533,170534,170535,170536,170537,170538,170539,170540,170541,170542,170543,170544,170545,170546,170547,170548,170549,170550,170551,170552,170553,170554,170555,170556,170557,170558,170559,170560,170561,170562,170563,170564,170565,170566,170567,170568,170569,170570,170571,170572,170573,170574,170575,170576,170577,170578,170579,170580,170581,170582,170583,170584,170585,170586,170587,170588,170589,170590,170591,170592,170593,170594,170595,170596,170597,170598,170599,170600,170601,170602,170603,170604,170605,170606,170607,170608,170609,170610,170611,170612,170613,170614,170615,170616,170617,170618,170619,170620,170621,170622,170623,170624,170625,170626,170627,170628,170629,170630,170631,170632,170633,170634,170635,170636,170637,170638,170639,170640,170641,170642,170643,170644,170645,170646,170647,170648,170649,170650,170651,170652,170653,170654,170655,170656,170657,170658,170659,170660,170661,170662,170663,170664,170665,170666,170667,170668,170669,170670,170671,170672,170673,170674,170675,170676,170677,170678,170679,170680,170681,170682,170683,170684,170685,170686,170687,170688,170689,170690,170691,170692,170693,170694,170695,170696,170697,170698,170699,170700,170701,170702,170703,170704,170705,170706,170707,170708,170709,170710,170711,170712,170713,170714,170715,170716,170717,170718,170719,170720,170721,170722,170723,170724,170725,170726,170727,170728,170729,170730,170731,170732,170733,170734,170735,170736,170737,170738,170739,170740,170741,170742,170743,170744,170745,170746,170747,170748,170749,170750,170751,170752,170753,170754,170755,170756,170757,170758,170759,170760,170761,170762,170763,170764,170765,170766,170767,170768,170769,170770,170771,170772,170773,170774,170775,170776,170777,170778,170779,170780,170781,170782,170783,170784,170785,170786,170787,170788,170789,170790,170791,170792,170793,170794,170795,170796,170797,170798,170799,170800,170801,170802,170803,170804,170805,170806,170807,170808,170809,170810,170811,170812,170813,170814,170815,170816,170817,170818,170819,170820,170821,170822,170823,170824,170825,170826,170827,170828,170829,170830,170831,170832,170833,170834,170835,170836,170837,170838,170839,170840,170841,170842,170843,170844,170845,170846,170847,170848,170849,170850,170851,170852,170853,170854,170855,170856,170857,170858,170859,170860,170861,170862,170863,170864,170865,170866,170867,170868,170869,170870,170871,170872,170873,170874,170875,170876,170877,170878,170879,170880,170881,170882,170883,170884,170885,170886,170887,170888,170889,170890,170891,170892,170893,170894,170895,170896,170897,170898,170899,170900,170901,170902,170903,170904,170905,170906,170907,170908,170909,170910,170911,170912,170913,170914,170915,170916,170917,170918,170919,170920,170921,170922,170923,170924,170925,170926,170927,170928,170929,170930,170931,170932,170933,170934,170935,170936,170937,170938,170939,170940,170941,170942,170943,170944,170945,170946,170947,170948,170949,170950,170951,170952,170953,170954,170955,170956,170957,170958,170959,170960,170961,170962,170963,170964,170965,170966,170967,170968,170969,170970,170971,170972,170973,170974,170975,170976,170977,170978,170979,170980,170981,170982,170983,170984,170985,170986,170987,170988,170989,170990,170991,170992,170993,170994,170995,170996,170997,170998,170999,171000,171001,171002,171003,171004,171005,171006,171007,171008,171009,171010,171011,171012,171013,171014,171015,171016,171017,171018,171019,171020,171021,171022,171023,171024,171025,171026,171027,171028,171029,171030,171031,171032,171033,171034,171035,171036,171037,171038,171039,171040,171041,171042,171043,171044,171045,171046,171047,171048,171049,171050,171051,171052,171053,171054,171055,171056,171057,171058,171059,171060,171061,171062,171063,171064,171065,171066,171067,171068,171069,171070,171071,171072,171073,171074,171075,171076,171077,171078,171079,171080,171081,171082,171083,171084,171085,171086,171087,171088,171089,171090,171091,171092,171093,171094,171095,171096,171097,171098,171099,171100,171101,171102,171103,171104,171105,171106,171107,171108,171109,171110,171111,171112,171113,171114,171115,171116,171117,171118,171119,171120,171121,171122,171123,171124,171125,171126,171127,171128,171129,171130,171131,171132,171133,171134,171135,171136,171137,171138,171139,171140,171141,171142,171143,171144,171145,171146,171147,171148,171149,171150,171151,171152,171153,171154,171155,171156,171157,171158,171159,171160,171161,171162,171163,171164,171165,171166,171167,171168,171169,171170,171171,171172,171173,171174,171175,171176,171177,171178,171179,171180,171181,171182,171183,171184,171185,171186,171187,171188,171189,171190,171191,171192,171193,171194,171195,171196,171197,171198,171199,171200,171201,171202,171203,171204,171205,171206,171207,171208,171209,171210,171211,171212,171213,171214,171215,171216,171217,171218,171219,171220,171221,171222,171223,171224,171225,171226,171227,171228,171229,171230,171231,171232,171233,171234,171235,171236,171237,171238,171239,171240,171241,171242,171243,171244,171245,171246,171247,171248,171249,171250,171251,171252,171253,171254,171255,171256,171257,171258,171259,171260,171261,171262,171263,171264,171265,171266,171267,171268,171269,171270,171271,171272,171273,171274,171275,171276,171277,171278,171279,171280,171281,171282,171283,171284,171285,171286,171287,171288,171289,171290,171291,171292,171293,171294,171295,171296,171297,171298,171299,171300,171301,171302,171303,171304,171305,171306,171307,171308,171309,171310,171311,171312,171313,171314,171315,171316,171317,171318,171319,171320,171321,171322,171323,171324,171325,171326,171327,171328,171329,171330,171331,171332,171333,171334,171335,171336,171337,171338,171339,171340,171341,171342,171343,171344,171345,171346,171347,171348,171349,171350,171351,171352,171353,171354,171355,171356,171357,171358,171359,171360,171361,171362,171363,171364,171365,171366,171367,171368,171369,171370,171371,171372,171373,171374,171375,171376,171377,171378,171379,171380,171381,171382,171383,171384,171385,171386,171387,171388,171389,171390,171391,171392,171393,171394,171395,171396,171397,171398,171399,171400,171401,171402,171403,171404,171405,171406,171407,171408,171409,171410,171411,171412,171413,171414,171415,171416,171417,171418,171419,171420,171421,171422,171423,171424,171425,171426,171427,171428,171429,171430,171431,171432,171433,171434,171435,171436,171437,171438,171439,171440,171441,171442,171443,171444,171445,171446,171447,171448,171449,171450,171451,171452,171453,171454,171455,171456,171457,171458,171459,171460,171461,171462,171463,171464,171465,171466,171467,171468,171469,171470,171471,171472,171473,171474,171475,171476,171477,171478,171479,171480,171481,171482,171483,171484,171485,171486,171487,171488,171489,171490,171491,171492,171493,171494,171495,171496,171497,171498,171499,171500,171501,171502,171503,171504,171505,171506,171507,171508,171509,171510,171511,171512,171513,171514,171515,171516,171517,171518,171519,171520,171521,171522,171523,171524,171525,171526,171527,171528,171529,171530,171531,171532,171533,171534,171535,171536,171537,171538,171539,171540,171541,171542,171543,171544,171545,171546,171547,171548,171549,171550,171551,171552,171553,171554,171555,171556,171557,171558,171559,171560,171561,171562,171563,171564,171565,171566,171567,171568,171569,171570,171571,171572,171573,171574,171575,171576,171577,171578,171579,171580,171581,171582,171583,171584,171585,171586,171587,171588,171589,171590,171591,171592,171593,171594,171595,171596,171597,171598,171599,171600,171601,171602,171603,171604,171605,171606,171607,171608,171609,171610,171611,171612,171613,171614,171615,171616,171617,171618,171619,171620,171621,171622,171623,171624,171625,171626,171627,171628,171629,171630,171631,171632,171633,171634,171635,171636,171637,171638,171639,171640,171641,171642,171643,171644,171645,171646,171647,171648,171649,171650,171651,171652,171653,171654,171655,171656,171657,171658,171659,171660,171661,171662,171663,171664,171665,171666,171667,171668,171669,171670,171671,171672,171673,171674,171675,171676,171677,171678,171679,171680,171681,171682,171683,171684,171685,171686,171687,171688,171689,171690,171691,171692,171693,171694,171695,171696,171697,171698,171699,171700,171701,171702,171703,171704,171705,171706,171707,171708,171709,171710,171711,171712,171713,171714,171715,171716,171717,171718,171719,171720,171721,171722,171723,171724,171725,171726,171727,171728,171729,171730,171731,171732,171733,171734,171735,171736,171737,171738,171739,171740,171741,171742,171743,171744,171745,171746,171747,171748,171749,171750,171751,171752,171753,171754,171755,171756,171757,171758,171759,171760,171761,171762,171763,171764,171765,171766,171767,171768,171769,171770,171771,171772,171773,171774,171775,171776,171777,171778,171779,171780,171781,171782,171783,171784,171785,171786,171787,171788,171789,171790,171791,171792,171793,171794,171795,171796,171797,171798,171799,171800,171801,171802,171803,171804,171805,171806,171807,171808,171809,171810,171811,171812,171813,171814,171815,171816,171817,171818,171819,171820,171821,171822,171823,171824,171825,171826,171827,171828,171829,171830,171831,171832,171833,171834,171835,171836,171837,171838,171839,171840,171841,171842,171843,171844,171845,171846,171847,171848,171849,171850,171851,171852,171853,171854,171855,171856,171857,171858,171859,171860,171861,171862,171863,171864,171865,171866,171867,171868,171869,171870,171871,171872,171873,171874,171875,171876,171877,171878,171879,171880,171881,171882,171883,171884,171885,171886,171887,171888,171889,171890,171891,171892,171893,171894,171895,171896,171897,171898,171899,171900,171901,171902,171903,171904,171905,171906,171907,171908,171909,171910,171911,171912,171913,171914,171915,171916,171917,171918,171919,171920,171921,171922,171923,171924,171925,171926,171927,171928,171929,171930,171931,171932,171933,171934,171935,171936,171937,171938,171939,171940,171941,171942,171943,171944,171945,171946,171947,171948,171949,171950,171951,171952,171953,171954,171955,171956,171957,171958,171959,171960,171961,171962,171963,171964,171965,171966,171967,171968,171969,171970,171971,171972,171973,171974,171975,171976,171977,171978,171979,171980,171981,171982,171983,171984,171985,171986,171987,171988,171989,171990,171991,171992,171993,171994,171995,171996,171997,171998,171999,172000,172001,172002,172003,172004,172005,172006,172007,172008,172009,172010,172011,172012,172013,172014,172015,172016,172017,172018,172019,172020,172021,172022,172023,172024,172025,172026,172027,172028,172029,172030,172031,172032,172033,172034,172035,172036,172037,172038,172039,172040,172041,172042,172043,172044,172045,172046,172047,172048,172049,172050,172051,172052,172053,172054,172055,172056,172057,172058,172059,172060,172061,172062,172063,172064,172065,172066,172067,172068,172069,172070,172071,172072,172073,172074,172075,172076,172077,172078,172079,172080,172081,172082,172083,172084,172085,172086,172087,172088,172089,172090,172091,172092,172093,172094,172095,172096,172097,172098,172099,172100,172101,172102,172103,172104,172105,172106,172107,172108,172109,172110,172111,172112,172113,172114,172115,172116,172117,172118,172119,172120,172121,172122,172123,172124,172125,172126,172127,172128,172129,172130,172131,172132,172133,172134,172135,172136,172137,172138,172139,172140,172141,172142,172143,172144,172145,172146,172147,172148,172149,172150,172151,172152,172153,172154,172155,172156,172157,172158,172159,172160,172161,172162,172163,172164,172165,172166,172167,172168,172169,172170,172171,172172,172173,172174,172175,172176,172177,172178,172179,172180,172181,172182,172183,172184,172185,172186,172187,172188,172189,172190,172191,172192,172193,172194,172195,172196,172197,172198,172199,172200,172201,172202,172203,172204,172205,172206,172207,172208,172209,172210,172211,172212,172213,172214,172215,172216,172217,172218,172219,172220,172221,172222,172223,172224,172225,172226,172227,172228,172229,172230,172231,172232,172233,172234,172235,172236,172237,172238,172239,172240,172241,172242,172243,172244,172245,172246,172247,172248,172249,172250,172251,172252,172253,172254,172255,172256,172257,172258,172259,172260,172261,172262,172263,172264,172265,172266,172267,172268,172269,172270,172271,172272,172273,172274,172275,172276,172277,172278,172279,172280,172281,172282,172283,172284,172285,172286,172287,172288,172289,172290,172291,172292,172293,172294,172295,172296,172297,172298,172299,172300,172301,172302,172303,172304,172305,172306,172307,172308,172309,172310,172311,172312,172313,172314,172315,172316,172317,172318,172319,172320,172321,172322,172323,172324,172325,172326,172327,172328,172329,172330,172331,172332,172333,172334,172335,172336,172337,172338,172339,172340,172341,172342,172343,172344,172345,172346,172347,172348,172349,172350,172351,172352,172353,172354,172355,172356,172357,172358,172359,172360,172361,172362,172363,172364,172365,172366,172367,172368,172369,172370,172371,172372,172373,172374,172375,172376,172377,172378,172379,172380,172381,172382,172383,172384,172385,172386,172387,172388,172389,172390,172391,172392,172393,172394,172395,172396,172397,172398,172399,172400,172401,172402,172403,172404,172405,172406,172407,172408,172409,172410,172411,172412,172413,172414,172415,172416,172417,172418,172419,172420,172421,172422,172423,172424,172425,172426,172427,172428,172429,172430,172431,172432,172433,172434,172435,172436,172437,172438,172439,172440,172441,172442,172443,172444,172445,172446,172447,172448,172449,172450,172451,172452,172453,172454,172455,172456,172457,172458,172459,172460,172461,172462,172463,172464,172465,172466,172467,172468,172469,172470,172471,172472,172473,172474,172475,172476,172477,172478,172479,172480,172481,172482,172483,172484,172485,172486,172487,172488,172489,172490,172491,172492,172493,172494,172495,172496,172497,172498,172499,172500,172501,172502,172503,172504,172505,172506,172507,172508,172509,172510,172511,172512,172513,172514,172515,172516,172517,172518,172519,172520,172521,172522,172523,172524,172525,172526,172527,172528,172529,172530,172531,172532,172533,172534,172535,172536,172537,172538,172539,172540,172541,172542,172543,172544,172545,172546,172547,172548,172549,172550,172551,172552,172553,172554,172555,172556,172557,172558,172559,172560,172561,172562,172563,172564,172565,172566,172567,172568,172569,172570,172571,172572,172573,172574,172575,172576,172577,172578,172579,172580,172581,172582,172583,172584,172585,172586,172587,172588,172589,172590,172591,172592,172593,172594,172595,172596,172597,172598,172599,172600,172601,172602,172603,172604,172605,172606,172607,172608,172609,172610,172611,172612,172613,172614,172615,172616,172617,172618,172619,172620,172621,172622,172623,172624,172625,172626,172627,172628,172629,172630,172631,172632,172633,172634,172635,172636,172637,172638,172639,172640,172641,172642,172643,172644,172645,172646,172647,172648,172649,172650,172651,172652,172653,172654,172655,172656,172657,172658,172659,172660,172661,172662,172663,172664,172665,172666,172667,172668,172669,172670,172671,172672,172673,172674,172675,172676,172677,172678,172679,172680,172681,172682,172683,172684,172685,172686,172687,172688,172689,172690,172691,172692,172693,172694,172695,172696,172697,172698,172699,172700,172701,172702,172703,172704,172705,172706,172707,172708,172709,172710,172711,172712,172713,172714,172715,172716,172717,172718,172719,172720,172721,172722,172723,172724,172725,172726,172727,172728,172729,172730,172731,172732,172733,172734,172735,172736,172737,172738,172739,172740,172741,172742,172743,172744,172745,172746,172747,172748,172749,172750,172751,172752,172753,172754,172755,172756,172757,172758,172759,172760,172761,172762,172763,172764,172765,172766,172767,172768,172769,172770,172771,172772,172773,172774,172775,172776,172777,172778,172779,172780,172781,172782,172783,172784,172785,172786,172787,172788,172789,172790,172791,172792,172793,172794,172795,172796,172797,172798,172799,172800,172801,172802,172803,172804,172805,172806,172807,172808,172809,172810,172811,172812,172813,172814,172815,172816,172817,172818,172819,172820,172821,172822,172823,172824,172825,172826,172827,172828,172829,172830,172831,172832,172833,172834,172835,172836,172837,172838,172839,172840,172841,172842,172843,172844,172845,172846,172847,172848,172849,172850,172851,172852,172853,172854,172855,172856,172857,172858,172859,172860,172861,172862,172863,172864,172865,172866,172867,172868,172869,172870,172871,172872,172873,172874,172875,172876,172877,172878,172879,172880,172881,172882,172883,172884,172885,172886,172887,172888,172889,172890,172891,172892,172893,172894,172895,172896,172897,172898,172899,172900,172901,172902,172903,172904,172905,172906,172907,172908,172909,172910,172911,172912,172913,172914,172915,172916,172917,172918,172919,172920,172921,172922,172923,172924,172925,172926,172927,172928,172929,172930,172931,172932,172933,172934,172935,172936,172937,172938,172939,172940,172941,172942,172943,172944,172945,172946,172947,172948,172949,172950,172951,172952,172953,172954,172955,172956,172957,172958,172959,172960,172961,172962,172963,172964,172965,172966,172967,172968,172969,172970,172971,172972,172973,172974,172975,172976,172977,172978,172979,172980,172981,172982,172983,172984,172985,172986,172987,172988,172989,172990,172991,172992,172993,172994,172995,172996,172997,172998,172999,173000,173001,173002,173003,173004,173005,173006,173007,173008,173009,173010,173011,173012,173013,173014,173015,173016,173017,173018,173019,173020,173021,173022,173023,173024,173025,173026,173027,173028,173029,173030,173031,173032,173033,173034,173035,173036,173037,173038,173039,173040,173041,173042,173043,173044,173045,173046,173047,173048,173049,173050,173051,173052,173053,173054,173055,173056,173057,173058,173059,173060,173061,173062,173063,173064,173065,173066,173067,173068,173069,173070,173071,173072,173073,173074,173075,173076,173077,173078,173079,173080,173081,173082,173083,173084,173085,173086,173087,173088,173089,173090,173091,173092,173093,173094,173095,173096,173097,173098,173099,173100,173101,173102,173103,173104,173105,173106,173107,173108,173109,173110,173111,173112,173113,173114,173115,173116,173117,173118,173119,173120,173121,173122,173123,173124,173125,173126,173127,173128,173129,173130,173131,173132,173133,173134,173135,173136,173137,173138,173139,173140,173141,173142,173143,173144,173145,173146,173147,173148,173149,173150,173151,173152,173153,173154,173155,173156,173157,173158,173159,173160,173161,173162,173163,173164,173165,173166,173167,173168,173169,173170,173171,173172,173173,173174,173175,173176,173177,173178,173179,173180,173181,173182,173183,173184,173185,173186,173187,173188,173189,173190,173191,173192,173193,173194,173195,173196,173197,173198,173199,173200,173201,173202,173203,173204,173205,173206,173207,173208,173209,173210,173211,173212,173213,173214,173215,173216,173217,173218,173219,173220,173221,173222,173223,173224,173225,173226,173227,173228,173229,173230,173231,173232,173233,173234,173235,173236,173237,173238,173239,173240,173241,173242,173243,173244,173245,173246,173247,173248,173249,173250,173251,173252,173253,173254,173255,173256,173257,173258,173259,173260,173261,173262,173263,173264,173265,173266,173267,173268,173269,173270,173271,173272,173273,173274,173275,173276,173277,173278,173279,173280,173281,173282,173283,173284,173285,173286,173287,173288,173289,173290,173291,173292,173293,173294,173295,173296,173297,173298,173299,173300,173301,173302,173303,173304,173305,173306,173307,173308,173309,173310,173311,173312,173313,173314,173315,173316,173317,173318,173319,173320,173321,173322,173323,173324,173325,173326,173327,173328,173329,173330,173331,173332,173333,173334,173335,173336,173337,173338,173339,173340,173341,173342,173343,173344,173345,173346,173347,173348,173349,173350,173351,173352,173353,173354,173355,173356,173357,173358,173359,173360,173361,173362,173363,173364,173365,173366,173367,173368,173369,173370,173371,173372,173373,173374,173375,173376,173377,173378,173379,173380,173381,173382,173383,173384,173385,173386,173387,173388,173389,173390,173391,173392,173393,173394,173395,173396,173397,173398,173399,173400,173401,173402,173403,173404,173405,173406,173407,173408,173409,173410,173411,173412,173413,173414,173415,173416,173417,173418,173419,173420,173421,173422,173423,173424,173425,173426,173427,173428,173429,173430,173431,173432,173433,173434,173435,173436,173437,173438,173439,173440,173441,173442,173443,173444,173445,173446,173447,173448,173449,173450,173451,173452,173453,173454,173455,173456,173457,173458,173459,173460,173461,173462,173463,173464,173465,173466,173467,173468,173469,173470,173471,173472,173473,173474,173475,173476,173477,173478,173479,173480,173481,173482,173483,173484,173485,173486,173487,173488,173489,173490,173491,173492,173493,173494,173495,173496,173497,173498,173499,173500,173501,173502,173503,173504,173505,173506,173507,173508,173509,173510,173511,173512,173513,173514,173515,173516,173517,173518,173519,173520,173521,173522,173523,173524,173525,173526,173527,173528,173529,173530,173531,173532,173533,173534,173535,173536,173537,173538,173539,173540,173541,173542,173543,173544,173545,173546,173547,173548,173549,173550,173551,173552,173553,173554,173555,173556,173557,173558,173559,173560,173561,173562,173563,173564,173565,173566,173567,173568,173569,173570,173571,173572,173573,173574,173575,173576,173577,173578,173579,173580,173581,173582,173583,173584,173585,173586,173587,173588,173589,173590,173591,173592,173593,173594,173595,173596,173597,173598,173599,173600,173601,173602,173603,173604,173605,173606,173607,173608,173609,173610,173611,173612,173613,173614,173615,173616,173617,173618,173619,173620,173621,173622,173623,173624,173625,173626,173627,173628,173629,173630,173631,173632,173633,173634,173635,173636,173637,173638,173639,173640,173641,173642,173643,173644,173645,173646,173647,173648,173649,173650,173651,173652,173653,173654,173655,173656,173657,173658,173659,173660,173661,173662,173663,173664,173665,173666,173667,173668,173669,173670,173671,173672,173673,173674,173675,173676,173677,173678,173679,173680,173681,173682,173683,173684,173685,173686,173687,173688,173689,173690,173691,173692,173693,173694,173695,173696,173697,173698,173699,173700,173701,173702,173703,173704,173705,173706,173707,173708,173709,173710,173711,173712,173713,173714,173715,173716,173717,173718,173719,173720,173721,173722,173723,173724,173725,173726,173727,173728,173729,173730,173731,173732,173733,173734,173735,173736,173737,173738,173739,173740,173741,173742,173743,173744,173745,173746,173747,173748,173749,173750,173751,173752,173753,173754,173755,173756,173757,173758,173759,173760,173761,173762,173763,173764,173765,173766,173767,173768,173769,173770,173771,173772,173773,173774,173775,173776,173777,173778,173779,173780,173781,173782,173824,173825,173826,173827,173828,173829,173830,173831,173832,173833,173834,173835,173836,173837,173838,173839,173840,173841,173842,173843,173844,173845,173846,173847,173848,173849,173850,173851,173852,173853,173854,173855,173856,173857,173858,173859,173860,173861,173862,173863,173864,173865,173866,173867,173868,173869,173870,173871,173872,173873,173874,173875,173876,173877,173878,173879,173880,173881,173882,173883,173884,173885,173886,173887,173888,173889,173890,173891,173892,173893,173894,173895,173896,173897,173898,173899,173900,173901,173902,173903,173904,173905,173906,173907,173908,173909,173910,173911,173912,173913,173914,173915,173916,173917,173918,173919,173920,173921,173922,173923,173924,173925,173926,173927,173928,173929,173930,173931,173932,173933,173934,173935,173936,173937,173938,173939,173940,173941,173942,173943,173944,173945,173946,173947,173948,173949,173950,173951,173952,173953,173954,173955,173956,173957,173958,173959,173960,173961,173962,173963,173964,173965,173966,173967,173968,173969,173970,173971,173972,173973,173974,173975,173976,173977,173978,173979,173980,173981,173982,173983,173984,173985,173986,173987,173988,173989,173990,173991,173992,173993,173994,173995,173996,173997,173998,173999,174000,174001,174002,174003,174004,174005,174006,174007,174008,174009,174010,174011,174012,174013,174014,174015,174016,174017,174018,174019,174020,174021,174022,174023,174024,174025,174026,174027,174028,174029,174030,174031,174032,174033,174034,174035,174036,174037,174038,174039,174040,174041,174042,174043,174044,174045,174046,174047,174048,174049,174050,174051,174052,174053,174054,174055,174056,174057,174058,174059,174060,174061,174062,174063,174064,174065,174066,174067,174068,174069,174070,174071,174072,174073,174074,174075,174076,174077,174078,174079,174080,174081,174082,174083,174084,174085,174086,174087,174088,174089,174090,174091,174092,174093,174094,174095,174096,174097,174098,174099,174100,174101,174102,174103,174104,174105,174106,174107,174108,174109,174110,174111,174112,174113,174114,174115,174116,174117,174118,174119,174120,174121,174122,174123,174124,174125,174126,174127,174128,174129,174130,174131,174132,174133,174134,174135,174136,174137,174138,174139,174140,174141,174142,174143,174144,174145,174146,174147,174148,174149,174150,174151,174152,174153,174154,174155,174156,174157,174158,174159,174160,174161,174162,174163,174164,174165,174166,174167,174168,174169,174170,174171,174172,174173,174174,174175,174176,174177,174178,174179,174180,174181,174182,174183,174184,174185,174186,174187,174188,174189,174190,174191,174192,174193,174194,174195,174196,174197,174198,174199,174200,174201,174202,174203,174204,174205,174206,174207,174208,174209,174210,174211,174212,174213,174214,174215,174216,174217,174218,174219,174220,174221,174222,174223,174224,174225,174226,174227,174228,174229,174230,174231,174232,174233,174234,174235,174236,174237,174238,174239,174240,174241,174242,174243,174244,174245,174246,174247,174248,174249,174250,174251,174252,174253,174254,174255,174256,174257,174258,174259,174260,174261,174262,174263,174264,174265,174266,174267,174268,174269,174270,174271,174272,174273,174274,174275,174276,174277,174278,174279,174280,174281,174282,174283,174284,174285,174286,174287,174288,174289,174290,174291,174292,174293,174294,174295,174296,174297,174298,174299,174300,174301,174302,174303,174304,174305,174306,174307,174308,174309,174310,174311,174312,174313,174314,174315,174316,174317,174318,174319,174320,174321,174322,174323,174324,174325,174326,174327,174328,174329,174330,174331,174332,174333,174334,174335,174336,174337,174338,174339,174340,174341,174342,174343,174344,174345,174346,174347,174348,174349,174350,174351,174352,174353,174354,174355,174356,174357,174358,174359,174360,174361,174362,174363,174364,174365,174366,174367,174368,174369,174370,174371,174372,174373,174374,174375,174376,174377,174378,174379,174380,174381,174382,174383,174384,174385,174386,174387,174388,174389,174390,174391,174392,174393,174394,174395,174396,174397,174398,174399,174400,174401,174402,174403,174404,174405,174406,174407,174408,174409,174410,174411,174412,174413,174414,174415,174416,174417,174418,174419,174420,174421,174422,174423,174424,174425,174426,174427,174428,174429,174430,174431,174432,174433,174434,174435,174436,174437,174438,174439,174440,174441,174442,174443,174444,174445,174446,174447,174448,174449,174450,174451,174452,174453,174454,174455,174456,174457,174458,174459,174460,174461,174462,174463,174464,174465,174466,174467,174468,174469,174470,174471,174472,174473,174474,174475,174476,174477,174478,174479,174480,174481,174482,174483,174484,174485,174486,174487,174488,174489,174490,174491,174492,174493,174494,174495,174496,174497,174498,174499,174500,174501,174502,174503,174504,174505,174506,174507,174508,174509,174510,174511,174512,174513,174514,174515,174516,174517,174518,174519,174520,174521,174522,174523,174524,174525,174526,174527,174528,174529,174530,174531,174532,174533,174534,174535,174536,174537,174538,174539,174540,174541,174542,174543,174544,174545,174546,174547,174548,174549,174550,174551,174552,174553,174554,174555,174556,174557,174558,174559,174560,174561,174562,174563,174564,174565,174566,174567,174568,174569,174570,174571,174572,174573,174574,174575,174576,174577,174578,174579,174580,174581,174582,174583,174584,174585,174586,174587,174588,174589,174590,174591,174592,174593,174594,174595,174596,174597,174598,174599,174600,174601,174602,174603,174604,174605,174606,174607,174608,174609,174610,174611,174612,174613,174614,174615,174616,174617,174618,174619,174620,174621,174622,174623,174624,174625,174626,174627,174628,174629,174630,174631,174632,174633,174634,174635,174636,174637,174638,174639,174640,174641,174642,174643,174644,174645,174646,174647,174648,174649,174650,174651,174652,174653,174654,174655,174656,174657,174658,174659,174660,174661,174662,174663,174664,174665,174666,174667,174668,174669,174670,174671,174672,174673,174674,174675,174676,174677,174678,174679,174680,174681,174682,174683,174684,174685,174686,174687,174688,174689,174690,174691,174692,174693,174694,174695,174696,174697,174698,174699,174700,174701,174702,174703,174704,174705,174706,174707,174708,174709,174710,174711,174712,174713,174714,174715,174716,174717,174718,174719,174720,174721,174722,174723,174724,174725,174726,174727,174728,174729,174730,174731,174732,174733,174734,174735,174736,174737,174738,174739,174740,174741,174742,174743,174744,174745,174746,174747,174748,174749,174750,174751,174752,174753,174754,174755,174756,174757,174758,174759,174760,174761,174762,174763,174764,174765,174766,174767,174768,174769,174770,174771,174772,174773,174774,174775,174776,174777,174778,174779,174780,174781,174782,174783,174784,174785,174786,174787,174788,174789,174790,174791,174792,174793,174794,174795,174796,174797,174798,174799,174800,174801,174802,174803,174804,174805,174806,174807,174808,174809,174810,174811,174812,174813,174814,174815,174816,174817,174818,174819,174820,174821,174822,174823,174824,174825,174826,174827,174828,174829,174830,174831,174832,174833,174834,174835,174836,174837,174838,174839,174840,174841,174842,174843,174844,174845,174846,174847,174848,174849,174850,174851,174852,174853,174854,174855,174856,174857,174858,174859,174860,174861,174862,174863,174864,174865,174866,174867,174868,174869,174870,174871,174872,174873,174874,174875,174876,174877,174878,174879,174880,174881,174882,174883,174884,174885,174886,174887,174888,174889,174890,174891,174892,174893,174894,174895,174896,174897,174898,174899,174900,174901,174902,174903,174904,174905,174906,174907,174908,174909,174910,174911,174912,174913,174914,174915,174916,174917,174918,174919,174920,174921,174922,174923,174924,174925,174926,174927,174928,174929,174930,174931,174932,174933,174934,174935,174936,174937,174938,174939,174940,174941,174942,174943,174944,174945,174946,174947,174948,174949,174950,174951,174952,174953,174954,174955,174956,174957,174958,174959,174960,174961,174962,174963,174964,174965,174966,174967,174968,174969,174970,174971,174972,174973,174974,174975,174976,174977,174978,174979,174980,174981,174982,174983,174984,174985,174986,174987,174988,174989,174990,174991,174992,174993,174994,174995,174996,174997,174998,174999,175000,175001,175002,175003,175004,175005,175006,175007,175008,175009,175010,175011,175012,175013,175014,175015,175016,175017,175018,175019,175020,175021,175022,175023,175024,175025,175026,175027,175028,175029,175030,175031,175032,175033,175034,175035,175036,175037,175038,175039,175040,175041,175042,175043,175044,175045,175046,175047,175048,175049,175050,175051,175052,175053,175054,175055,175056,175057,175058,175059,175060,175061,175062,175063,175064,175065,175066,175067,175068,175069,175070,175071,175072,175073,175074,175075,175076,175077,175078,175079,175080,175081,175082,175083,175084,175085,175086,175087,175088,175089,175090,175091,175092,175093,175094,175095,175096,175097,175098,175099,175100,175101,175102,175103,175104,175105,175106,175107,175108,175109,175110,175111,175112,175113,175114,175115,175116,175117,175118,175119,175120,175121,175122,175123,175124,175125,175126,175127,175128,175129,175130,175131,175132,175133,175134,175135,175136,175137,175138,175139,175140,175141,175142,175143,175144,175145,175146,175147,175148,175149,175150,175151,175152,175153,175154,175155,175156,175157,175158,175159,175160,175161,175162,175163,175164,175165,175166,175167,175168,175169,175170,175171,175172,175173,175174,175175,175176,175177,175178,175179,175180,175181,175182,175183,175184,175185,175186,175187,175188,175189,175190,175191,175192,175193,175194,175195,175196,175197,175198,175199,175200,175201,175202,175203,175204,175205,175206,175207,175208,175209,175210,175211,175212,175213,175214,175215,175216,175217,175218,175219,175220,175221,175222,175223,175224,175225,175226,175227,175228,175229,175230,175231,175232,175233,175234,175235,175236,175237,175238,175239,175240,175241,175242,175243,175244,175245,175246,175247,175248,175249,175250,175251,175252,175253,175254,175255,175256,175257,175258,175259,175260,175261,175262,175263,175264,175265,175266,175267,175268,175269,175270,175271,175272,175273,175274,175275,175276,175277,175278,175279,175280,175281,175282,175283,175284,175285,175286,175287,175288,175289,175290,175291,175292,175293,175294,175295,175296,175297,175298,175299,175300,175301,175302,175303,175304,175305,175306,175307,175308,175309,175310,175311,175312,175313,175314,175315,175316,175317,175318,175319,175320,175321,175322,175323,175324,175325,175326,175327,175328,175329,175330,175331,175332,175333,175334,175335,175336,175337,175338,175339,175340,175341,175342,175343,175344,175345,175346,175347,175348,175349,175350,175351,175352,175353,175354,175355,175356,175357,175358,175359,175360,175361,175362,175363,175364,175365,175366,175367,175368,175369,175370,175371,175372,175373,175374,175375,175376,175377,175378,175379,175380,175381,175382,175383,175384,175385,175386,175387,175388,175389,175390,175391,175392,175393,175394,175395,175396,175397,175398,175399,175400,175401,175402,175403,175404,175405,175406,175407,175408,175409,175410,175411,175412,175413,175414,175415,175416,175417,175418,175419,175420,175421,175422,175423,175424,175425,175426,175427,175428,175429,175430,175431,175432,175433,175434,175435,175436,175437,175438,175439,175440,175441,175442,175443,175444,175445,175446,175447,175448,175449,175450,175451,175452,175453,175454,175455,175456,175457,175458,175459,175460,175461,175462,175463,175464,175465,175466,175467,175468,175469,175470,175471,175472,175473,175474,175475,175476,175477,175478,175479,175480,175481,175482,175483,175484,175485,175486,175487,175488,175489,175490,175491,175492,175493,175494,175495,175496,175497,175498,175499,175500,175501,175502,175503,175504,175505,175506,175507,175508,175509,175510,175511,175512,175513,175514,175515,175516,175517,175518,175519,175520,175521,175522,175523,175524,175525,175526,175527,175528,175529,175530,175531,175532,175533,175534,175535,175536,175537,175538,175539,175540,175541,175542,175543,175544,175545,175546,175547,175548,175549,175550,175551,175552,175553,175554,175555,175556,175557,175558,175559,175560,175561,175562,175563,175564,175565,175566,175567,175568,175569,175570,175571,175572,175573,175574,175575,175576,175577,175578,175579,175580,175581,175582,175583,175584,175585,175586,175587,175588,175589,175590,175591,175592,175593,175594,175595,175596,175597,175598,175599,175600,175601,175602,175603,175604,175605,175606,175607,175608,175609,175610,175611,175612,175613,175614,175615,175616,175617,175618,175619,175620,175621,175622,175623,175624,175625,175626,175627,175628,175629,175630,175631,175632,175633,175634,175635,175636,175637,175638,175639,175640,175641,175642,175643,175644,175645,175646,175647,175648,175649,175650,175651,175652,175653,175654,175655,175656,175657,175658,175659,175660,175661,175662,175663,175664,175665,175666,175667,175668,175669,175670,175671,175672,175673,175674,175675,175676,175677,175678,175679,175680,175681,175682,175683,175684,175685,175686,175687,175688,175689,175690,175691,175692,175693,175694,175695,175696,175697,175698,175699,175700,175701,175702,175703,175704,175705,175706,175707,175708,175709,175710,175711,175712,175713,175714,175715,175716,175717,175718,175719,175720,175721,175722,175723,175724,175725,175726,175727,175728,175729,175730,175731,175732,175733,175734,175735,175736,175737,175738,175739,175740,175741,175742,175743,175744,175745,175746,175747,175748,175749,175750,175751,175752,175753,175754,175755,175756,175757,175758,175759,175760,175761,175762,175763,175764,175765,175766,175767,175768,175769,175770,175771,175772,175773,175774,175775,175776,175777,175778,175779,175780,175781,175782,175783,175784,175785,175786,175787,175788,175789,175790,175791,175792,175793,175794,175795,175796,175797,175798,175799,175800,175801,175802,175803,175804,175805,175806,175807,175808,175809,175810,175811,175812,175813,175814,175815,175816,175817,175818,175819,175820,175821,175822,175823,175824,175825,175826,175827,175828,175829,175830,175831,175832,175833,175834,175835,175836,175837,175838,175839,175840,175841,175842,175843,175844,175845,175846,175847,175848,175849,175850,175851,175852,175853,175854,175855,175856,175857,175858,175859,175860,175861,175862,175863,175864,175865,175866,175867,175868,175869,175870,175871,175872,175873,175874,175875,175876,175877,175878,175879,175880,175881,175882,175883,175884,175885,175886,175887,175888,175889,175890,175891,175892,175893,175894,175895,175896,175897,175898,175899,175900,175901,175902,175903,175904,175905,175906,175907,175908,175909,175910,175911,175912,175913,175914,175915,175916,175917,175918,175919,175920,175921,175922,175923,175924,175925,175926,175927,175928,175929,175930,175931,175932,175933,175934,175935,175936,175937,175938,175939,175940,175941,175942,175943,175944,175945,175946,175947,175948,175949,175950,175951,175952,175953,175954,175955,175956,175957,175958,175959,175960,175961,175962,175963,175964,175965,175966,175967,175968,175969,175970,175971,175972,175973,175974,175975,175976,175977,175978,175979,175980,175981,175982,175983,175984,175985,175986,175987,175988,175989,175990,175991,175992,175993,175994,175995,175996,175997,175998,175999,176000,176001,176002,176003,176004,176005,176006,176007,176008,176009,176010,176011,176012,176013,176014,176015,176016,176017,176018,176019,176020,176021,176022,176023,176024,176025,176026,176027,176028,176029,176030,176031,176032,176033,176034,176035,176036,176037,176038,176039,176040,176041,176042,176043,176044,176045,176046,176047,176048,176049,176050,176051,176052,176053,176054,176055,176056,176057,176058,176059,176060,176061,176062,176063,176064,176065,176066,176067,176068,176069,176070,176071,176072,176073,176074,176075,176076,176077,176078,176079,176080,176081,176082,176083,176084,176085,176086,176087,176088,176089,176090,176091,176092,176093,176094,176095,176096,176097,176098,176099,176100,176101,176102,176103,176104,176105,176106,176107,176108,176109,176110,176111,176112,176113,176114,176115,176116,176117,176118,176119,176120,176121,176122,176123,176124,176125,176126,176127,176128,176129,176130,176131,176132,176133,176134,176135,176136,176137,176138,176139,176140,176141,176142,176143,176144,176145,176146,176147,176148,176149,176150,176151,176152,176153,176154,176155,176156,176157,176158,176159,176160,176161,176162,176163,176164,176165,176166,176167,176168,176169,176170,176171,176172,176173,176174,176175,176176,176177,176178,176179,176180,176181,176182,176183,176184,176185,176186,176187,176188,176189,176190,176191,176192,176193,176194,176195,176196,176197,176198,176199,176200,176201,176202,176203,176204,176205,176206,176207,176208,176209,176210,176211,176212,176213,176214,176215,176216,176217,176218,176219,176220,176221,176222,176223,176224,176225,176226,176227,176228,176229,176230,176231,176232,176233,176234,176235,176236,176237,176238,176239,176240,176241,176242,176243,176244,176245,176246,176247,176248,176249,176250,176251,176252,176253,176254,176255,176256,176257,176258,176259,176260,176261,176262,176263,176264,176265,176266,176267,176268,176269,176270,176271,176272,176273,176274,176275,176276,176277,176278,176279,176280,176281,176282,176283,176284,176285,176286,176287,176288,176289,176290,176291,176292,176293,176294,176295,176296,176297,176298,176299,176300,176301,176302,176303,176304,176305,176306,176307,176308,176309,176310,176311,176312,176313,176314,176315,176316,176317,176318,176319,176320,176321,176322,176323,176324,176325,176326,176327,176328,176329,176330,176331,176332,176333,176334,176335,176336,176337,176338,176339,176340,176341,176342,176343,176344,176345,176346,176347,176348,176349,176350,176351,176352,176353,176354,176355,176356,176357,176358,176359,176360,176361,176362,176363,176364,176365,176366,176367,176368,176369,176370,176371,176372,176373,176374,176375,176376,176377,176378,176379,176380,176381,176382,176383,176384,176385,176386,176387,176388,176389,176390,176391,176392,176393,176394,176395,176396,176397,176398,176399,176400,176401,176402,176403,176404,176405,176406,176407,176408,176409,176410,176411,176412,176413,176414,176415,176416,176417,176418,176419,176420,176421,176422,176423,176424,176425,176426,176427,176428,176429,176430,176431,176432,176433,176434,176435,176436,176437,176438,176439,176440,176441,176442,176443,176444,176445,176446,176447,176448,176449,176450,176451,176452,176453,176454,176455,176456,176457,176458,176459,176460,176461,176462,176463,176464,176465,176466,176467,176468,176469,176470,176471,176472,176473,176474,176475,176476,176477,176478,176479,176480,176481,176482,176483,176484,176485,176486,176487,176488,176489,176490,176491,176492,176493,176494,176495,176496,176497,176498,176499,176500,176501,176502,176503,176504,176505,176506,176507,176508,176509,176510,176511,176512,176513,176514,176515,176516,176517,176518,176519,176520,176521,176522,176523,176524,176525,176526,176527,176528,176529,176530,176531,176532,176533,176534,176535,176536,176537,176538,176539,176540,176541,176542,176543,176544,176545,176546,176547,176548,176549,176550,176551,176552,176553,176554,176555,176556,176557,176558,176559,176560,176561,176562,176563,176564,176565,176566,176567,176568,176569,176570,176571,176572,176573,176574,176575,176576,176577,176578,176579,176580,176581,176582,176583,176584,176585,176586,176587,176588,176589,176590,176591,176592,176593,176594,176595,176596,176597,176598,176599,176600,176601,176602,176603,176604,176605,176606,176607,176608,176609,176610,176611,176612,176613,176614,176615,176616,176617,176618,176619,176620,176621,176622,176623,176624,176625,176626,176627,176628,176629,176630,176631,176632,176633,176634,176635,176636,176637,176638,176639,176640,176641,176642,176643,176644,176645,176646,176647,176648,176649,176650,176651,176652,176653,176654,176655,176656,176657,176658,176659,176660,176661,176662,176663,176664,176665,176666,176667,176668,176669,176670,176671,176672,176673,176674,176675,176676,176677,176678,176679,176680,176681,176682,176683,176684,176685,176686,176687,176688,176689,176690,176691,176692,176693,176694,176695,176696,176697,176698,176699,176700,176701,176702,176703,176704,176705,176706,176707,176708,176709,176710,176711,176712,176713,176714,176715,176716,176717,176718,176719,176720,176721,176722,176723,176724,176725,176726,176727,176728,176729,176730,176731,176732,176733,176734,176735,176736,176737,176738,176739,176740,176741,176742,176743,176744,176745,176746,176747,176748,176749,176750,176751,176752,176753,176754,176755,176756,176757,176758,176759,176760,176761,176762,176763,176764,176765,176766,176767,176768,176769,176770,176771,176772,176773,176774,176775,176776,176777,176778,176779,176780,176781,176782,176783,176784,176785,176786,176787,176788,176789,176790,176791,176792,176793,176794,176795,176796,176797,176798,176799,176800,176801,176802,176803,176804,176805,176806,176807,176808,176809,176810,176811,176812,176813,176814,176815,176816,176817,176818,176819,176820,176821,176822,176823,176824,176825,176826,176827,176828,176829,176830,176831,176832,176833,176834,176835,176836,176837,176838,176839,176840,176841,176842,176843,176844,176845,176846,176847,176848,176849,176850,176851,176852,176853,176854,176855,176856,176857,176858,176859,176860,176861,176862,176863,176864,176865,176866,176867,176868,176869,176870,176871,176872,176873,176874,176875,176876,176877,176878,176879,176880,176881,176882,176883,176884,176885,176886,176887,176888,176889,176890,176891,176892,176893,176894,176895,176896,176897,176898,176899,176900,176901,176902,176903,176904,176905,176906,176907,176908,176909,176910,176911,176912,176913,176914,176915,176916,176917,176918,176919,176920,176921,176922,176923,176924,176925,176926,176927,176928,176929,176930,176931,176932,176933,176934,176935,176936,176937,176938,176939,176940,176941,176942,176943,176944,176945,176946,176947,176948,176949,176950,176951,176952,176953,176954,176955,176956,176957,176958,176959,176960,176961,176962,176963,176964,176965,176966,176967,176968,176969,176970,176971,176972,176973,176974,176975,176976,176977,176978,176979,176980,176981,176982,176983,176984,176985,176986,176987,176988,176989,176990,176991,176992,176993,176994,176995,176996,176997,176998,176999,177000,177001,177002,177003,177004,177005,177006,177007,177008,177009,177010,177011,177012,177013,177014,177015,177016,177017,177018,177019,177020,177021,177022,177023,177024,177025,177026,177027,177028,177029,177030,177031,177032,177033,177034,177035,177036,177037,177038,177039,177040,177041,177042,177043,177044,177045,177046,177047,177048,177049,177050,177051,177052,177053,177054,177055,177056,177057,177058,177059,177060,177061,177062,177063,177064,177065,177066,177067,177068,177069,177070,177071,177072,177073,177074,177075,177076,177077,177078,177079,177080,177081,177082,177083,177084,177085,177086,177087,177088,177089,177090,177091,177092,177093,177094,177095,177096,177097,177098,177099,177100,177101,177102,177103,177104,177105,177106,177107,177108,177109,177110,177111,177112,177113,177114,177115,177116,177117,177118,177119,177120,177121,177122,177123,177124,177125,177126,177127,177128,177129,177130,177131,177132,177133,177134,177135,177136,177137,177138,177139,177140,177141,177142,177143,177144,177145,177146,177147,177148,177149,177150,177151,177152,177153,177154,177155,177156,177157,177158,177159,177160,177161,177162,177163,177164,177165,177166,177167,177168,177169,177170,177171,177172,177173,177174,177175,177176,177177,177178,177179,177180,177181,177182,177183,177184,177185,177186,177187,177188,177189,177190,177191,177192,177193,177194,177195,177196,177197,177198,177199,177200,177201,177202,177203,177204,177205,177206,177207,177208,177209,177210,177211,177212,177213,177214,177215,177216,177217,177218,177219,177220,177221,177222,177223,177224,177225,177226,177227,177228,177229,177230,177231,177232,177233,177234,177235,177236,177237,177238,177239,177240,177241,177242,177243,177244,177245,177246,177247,177248,177249,177250,177251,177252,177253,177254,177255,177256,177257,177258,177259,177260,177261,177262,177263,177264,177265,177266,177267,177268,177269,177270,177271,177272,177273,177274,177275,177276,177277,177278,177279,177280,177281,177282,177283,177284,177285,177286,177287,177288,177289,177290,177291,177292,177293,177294,177295,177296,177297,177298,177299,177300,177301,177302,177303,177304,177305,177306,177307,177308,177309,177310,177311,177312,177313,177314,177315,177316,177317,177318,177319,177320,177321,177322,177323,177324,177325,177326,177327,177328,177329,177330,177331,177332,177333,177334,177335,177336,177337,177338,177339,177340,177341,177342,177343,177344,177345,177346,177347,177348,177349,177350,177351,177352,177353,177354,177355,177356,177357,177358,177359,177360,177361,177362,177363,177364,177365,177366,177367,177368,177369,177370,177371,177372,177373,177374,177375,177376,177377,177378,177379,177380,177381,177382,177383,177384,177385,177386,177387,177388,177389,177390,177391,177392,177393,177394,177395,177396,177397,177398,177399,177400,177401,177402,177403,177404,177405,177406,177407,177408,177409,177410,177411,177412,177413,177414,177415,177416,177417,177418,177419,177420,177421,177422,177423,177424,177425,177426,177427,177428,177429,177430,177431,177432,177433,177434,177435,177436,177437,177438,177439,177440,177441,177442,177443,177444,177445,177446,177447,177448,177449,177450,177451,177452,177453,177454,177455,177456,177457,177458,177459,177460,177461,177462,177463,177464,177465,177466,177467,177468,177469,177470,177471,177472,177473,177474,177475,177476,177477,177478,177479,177480,177481,177482,177483,177484,177485,177486,177487,177488,177489,177490,177491,177492,177493,177494,177495,177496,177497,177498,177499,177500,177501,177502,177503,177504,177505,177506,177507,177508,177509,177510,177511,177512,177513,177514,177515,177516,177517,177518,177519,177520,177521,177522,177523,177524,177525,177526,177527,177528,177529,177530,177531,177532,177533,177534,177535,177536,177537,177538,177539,177540,177541,177542,177543,177544,177545,177546,177547,177548,177549,177550,177551,177552,177553,177554,177555,177556,177557,177558,177559,177560,177561,177562,177563,177564,177565,177566,177567,177568,177569,177570,177571,177572,177573,177574,177575,177576,177577,177578,177579,177580,177581,177582,177583,177584,177585,177586,177587,177588,177589,177590,177591,177592,177593,177594,177595,177596,177597,177598,177599,177600,177601,177602,177603,177604,177605,177606,177607,177608,177609,177610,177611,177612,177613,177614,177615,177616,177617,177618,177619,177620,177621,177622,177623,177624,177625,177626,177627,177628,177629,177630,177631,177632,177633,177634,177635,177636,177637,177638,177639,177640,177641,177642,177643,177644,177645,177646,177647,177648,177649,177650,177651,177652,177653,177654,177655,177656,177657,177658,177659,177660,177661,177662,177663,177664,177665,177666,177667,177668,177669,177670,177671,177672,177673,177674,177675,177676,177677,177678,177679,177680,177681,177682,177683,177684,177685,177686,177687,177688,177689,177690,177691,177692,177693,177694,177695,177696,177697,177698,177699,177700,177701,177702,177703,177704,177705,177706,177707,177708,177709,177710,177711,177712,177713,177714,177715,177716,177717,177718,177719,177720,177721,177722,177723,177724,177725,177726,177727,177728,177729,177730,177731,177732,177733,177734,177735,177736,177737,177738,177739,177740,177741,177742,177743,177744,177745,177746,177747,177748,177749,177750,177751,177752,177753,177754,177755,177756,177757,177758,177759,177760,177761,177762,177763,177764,177765,177766,177767,177768,177769,177770,177771,177772,177773,177774,177775,177776,177777,177778,177779,177780,177781,177782,177783,177784,177785,177786,177787,177788,177789,177790,177791,177792,177793,177794,177795,177796,177797,177798,177799,177800,177801,177802,177803,177804,177805,177806,177807,177808,177809,177810,177811,177812,177813,177814,177815,177816,177817,177818,177819,177820,177821,177822,177823,177824,177825,177826,177827,177828,177829,177830,177831,177832,177833,177834,177835,177836,177837,177838,177839,177840,177841,177842,177843,177844,177845,177846,177847,177848,177849,177850,177851,177852,177853,177854,177855,177856,177857,177858,177859,177860,177861,177862,177863,177864,177865,177866,177867,177868,177869,177870,177871,177872,177873,177874,177875,177876,177877,177878,177879,177880,177881,177882,177883,177884,177885,177886,177887,177888,177889,177890,177891,177892,177893,177894,177895,177896,177897,177898,177899,177900,177901,177902,177903,177904,177905,177906,177907,177908,177909,177910,177911,177912,177913,177914,177915,177916,177917,177918,177919,177920,177921,177922,177923,177924,177925,177926,177927,177928,177929,177930,177931,177932,177933,177934,177935,177936,177937,177938,177939,177940,177941,177942,177943,177944,177945,177946,177947,177948,177949,177950,177951,177952,177953,177954,177955,177956,177957,177958,177959,177960,177961,177962,177963,177964,177965,177966,177967,177968,177969,177970,177971,177972,177984,177985,177986,177987,177988,177989,177990,177991,177992,177993,177994,177995,177996,177997,177998,177999,178000,178001,178002,178003,178004,178005,178006,178007,178008,178009,178010,178011,178012,178013,178014,178015,178016,178017,178018,178019,178020,178021,178022,178023,178024,178025,178026,178027,178028,178029,178030,178031,178032,178033,178034,178035,178036,178037,178038,178039,178040,178041,178042,178043,178044,178045,178046,178047,178048,178049,178050,178051,178052,178053,178054,178055,178056,178057,178058,178059,178060,178061,178062,178063,178064,178065,178066,178067,178068,178069,178070,178071,178072,178073,178074,178075,178076,178077,178078,178079,178080,178081,178082,178083,178084,178085,178086,178087,178088,178089,178090,178091,178092,178093,178094,178095,178096,178097,178098,178099,178100,178101,178102,178103,178104,178105,178106,178107,178108,178109,178110,178111,178112,178113,178114,178115,178116,178117,178118,178119,178120,178121,178122,178123,178124,178125,178126,178127,178128,178129,178130,178131,178132,178133,178134,178135,178136,178137,178138,178139,178140,178141,178142,178143,178144,178145,178146,178147,178148,178149,178150,178151,178152,178153,178154,178155,178156,178157,178158,178159,178160,178161,178162,178163,178164,178165,178166,178167,178168,178169,178170,178171,178172,178173,178174,178175,178176,178177,178178,178179,178180,178181,178182,178183,178184,178185,178186,178187,178188,178189,178190,178191,178192,178193,178194,178195,178196,178197,178198,178199,178200,178201,178202,178203,178204,178205,194560,194561,194562,194563,194564,194565,194566,194567,194568,194569,194570,194571,194572,194573,194574,194575,194576,194577,194578,194579,194580,194581,194582,194583,194584,194585,194586,194587,194588,194589,194590,194591,194592,194593,194594,194595,194596,194597,194598,194599,194600,194601,194602,194603,194604,194605,194606,194607,194608,194609,194610,194611,194612,194613,194614,194615,194616,194617,194618,194619,194620,194621,194622,194623,194624,194625,194626,194627,194628,194629,194630,194631,194632,194633,194634,194635,194636,194637,194638,194639,194640,194641,194642,194643,194644,194645,194646,194647,194648,194649,194650,194651,194652,194653,194654,194655,194656,194657,194658,194659,194660,194661,194662,194663,194664,194665,194666,194667,194668,194669,194670,194671,194672,194673,194674,194675,194676,194677,194678,194679,194680,194681,194682,194683,194684,194685,194686,194687,194688,194689,194690,194691,194692,194693,194694,194695,194696,194697,194698,194699,194700,194701,194702,194703,194704,194705,194706,194707,194708,194709,194710,194711,194712,194713,194714,194715,194716,194717,194718,194719,194720,194721,194722,194723,194724,194725,194726,194727,194728,194729,194730,194731,194732,194733,194734,194735,194736,194737,194738,194739,194740,194741,194742,194743,194744,194745,194746,194747,194748,194749,194750,194751,194752,194753,194754,194755,194756,194757,194758,194759,194760,194761,194762,194763,194764,194765,194766,194767,194768,194769,194770,194771,194772,194773,194774,194775,194776,194777,194778,194779,194780,194781,194782,194783,194784,194785,194786,194787,194788,194789,194790,194791,194792,194793,194794,194795,194796,194797,194798,194799,194800,194801,194802,194803,194804,194805,194806,194807,194808,194809,194810,194811,194812,194813,194814,194815,194816,194817,194818,194819,194820,194821,194822,194823,194824,194825,194826,194827,194828,194829,194830,194831,194832,194833,194834,194835,194836,194837,194838,194839,194840,194841,194842,194843,194844,194845,194846,194847,194848,194849,194850,194851,194852,194853,194854,194855,194856,194857,194858,194859,194860,194861,194862,194863,194864,194865,194866,194867,194868,194869,194870,194871,194872,194873,194874,194875,194876,194877,194878,194879,194880,194881,194882,194883,194884,194885,194886,194887,194888,194889,194890,194891,194892,194893,194894,194895,194896,194897,194898,194899,194900,194901,194902,194903,194904,194905,194906,194907,194908,194909,194910,194911,194912,194913,194914,194915,194916,194917,194918,194919,194920,194921,194922,194923,194924,194925,194926,194927,194928,194929,194930,194931,194932,194933,194934,194935,194936,194937,194938,194939,194940,194941,194942,194943,194944,194945,194946,194947,194948,194949,194950,194951,194952,194953,194954,194955,194956,194957,194958,194959,194960,194961,194962,194963,194964,194965,194966,194967,194968,194969,194970,194971,194972,194973,194974,194975,194976,194977,194978,194979,194980,194981,194982,194983,194984,194985,194986,194987,194988,194989,194990,194991,194992,194993,194994,194995,194996,194997,194998,194999,195000,195001,195002,195003,195004,195005,195006,195007,195008,195009,195010,195011,195012,195013,195014,195015,195016,195017,195018,195019,195020,195021,195022,195023,195024,195025,195026,195027,195028,195029,195030,195031,195032,195033,195034,195035,195036,195037,195038,195039,195040,195041,195042,195043,195044,195045,195046,195047,195048,195049,195050,195051,195052,195053,195054,195055,195056,195057,195058,195059,195060,195061,195062,195063,195064,195065,195066,195067,195068,195069,195070,195071,195072,195073,195074,195075,195076,195077,195078,195079,195080,195081,195082,195083,195084,195085,195086,195087,195088,195089,195090,195091,195092,195093,195094,195095,195096,195097,195098,195099,195100,195101] +},{}],137:[function(require,module,exports){ +module.exports=[453,456,459,498,8072,8073,8074,8075,8076,8077,8078,8079,8088,8089,8090,8091,8092,8093,8094,8095,8104,8105,8106,8107,8108,8109,8110,8111,8124,8140,8188] +},{}],138:[function(require,module,exports){ +module.exports=[65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,216,217,218,219,220,221,222,256,258,260,262,264,266,268,270,272,274,276,278,280,282,284,286,288,290,292,294,296,298,300,302,304,306,308,310,313,315,317,319,321,323,325,327,330,332,334,336,338,340,342,344,346,348,350,352,354,356,358,360,362,364,366,368,370,372,374,376,377,379,381,385,386,388,390,391,393,394,395,398,399,400,401,403,404,406,407,408,412,413,415,416,418,420,422,423,425,428,430,431,433,434,435,437,439,440,444,452,455,458,461,463,465,467,469,471,473,475,478,480,482,484,486,488,490,492,494,497,500,502,503,504,506,508,510,512,514,516,518,520,522,524,526,528,530,532,534,536,538,540,542,544,546,548,550,552,554,556,558,560,562,570,571,573,574,577,579,580,581,582,584,586,588,590,880,882,886,902,904,905,906,908,910,911,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,938,939,975,978,979,980,984,986,988,990,992,994,996,998,1000,1002,1004,1006,1012,1015,1017,1018,1021,1022,1023,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1120,1122,1124,1126,1128,1130,1132,1134,1136,1138,1140,1142,1144,1146,1148,1150,1152,1162,1164,1166,1168,1170,1172,1174,1176,1178,1180,1182,1184,1186,1188,1190,1192,1194,1196,1198,1200,1202,1204,1206,1208,1210,1212,1214,1216,1217,1219,1221,1223,1225,1227,1229,1232,1234,1236,1238,1240,1242,1244,1246,1248,1250,1252,1254,1256,1258,1260,1262,1264,1266,1268,1270,1272,1274,1276,1278,1280,1282,1284,1286,1288,1290,1292,1294,1296,1298,1300,1302,1304,1306,1308,1310,1312,1314,1316,1318,1329,1330,1331,1332,1333,1334,1335,1336,1337,1338,1339,1340,1341,1342,1343,1344,1345,1346,1347,1348,1349,1350,1351,1352,1353,1354,1355,1356,1357,1358,1359,1360,1361,1362,1363,1364,1365,1366,4256,4257,4258,4259,4260,4261,4262,4263,4264,4265,4266,4267,4268,4269,4270,4271,4272,4273,4274,4275,4276,4277,4278,4279,4280,4281,4282,4283,4284,4285,4286,4287,4288,4289,4290,4291,4292,4293,4295,4301,7680,7682,7684,7686,7688,7690,7692,7694,7696,7698,7700,7702,7704,7706,7708,7710,7712,7714,7716,7718,7720,7722,7724,7726,7728,7730,7732,7734,7736,7738,7740,7742,7744,7746,7748,7750,7752,7754,7756,7758,7760,7762,7764,7766,7768,7770,7772,7774,7776,7778,7780,7782,7784,7786,7788,7790,7792,7794,7796,7798,7800,7802,7804,7806,7808,7810,7812,7814,7816,7818,7820,7822,7824,7826,7828,7838,7840,7842,7844,7846,7848,7850,7852,7854,7856,7858,7860,7862,7864,7866,7868,7870,7872,7874,7876,7878,7880,7882,7884,7886,7888,7890,7892,7894,7896,7898,7900,7902,7904,7906,7908,7910,7912,7914,7916,7918,7920,7922,7924,7926,7928,7930,7932,7934,7944,7945,7946,7947,7948,7949,7950,7951,7960,7961,7962,7963,7964,7965,7976,7977,7978,7979,7980,7981,7982,7983,7992,7993,7994,7995,7996,7997,7998,7999,8008,8009,8010,8011,8012,8013,8025,8027,8029,8031,8040,8041,8042,8043,8044,8045,8046,8047,8120,8121,8122,8123,8136,8137,8138,8139,8152,8153,8154,8155,8168,8169,8170,8171,8172,8184,8185,8186,8187,8450,8455,8459,8460,8461,8464,8465,8466,8469,8473,8474,8475,8476,8477,8484,8486,8488,8490,8491,8492,8493,8496,8497,8498,8499,8510,8511,8517,8579,11264,11265,11266,11267,11268,11269,11270,11271,11272,11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288,11289,11290,11291,11292,11293,11294,11295,11296,11297,11298,11299,11300,11301,11302,11303,11304,11305,11306,11307,11308,11309,11310,11360,11362,11363,11364,11367,11369,11371,11373,11374,11375,11376,11378,11381,11390,11391,11392,11394,11396,11398,11400,11402,11404,11406,11408,11410,11412,11414,11416,11418,11420,11422,11424,11426,11428,11430,11432,11434,11436,11438,11440,11442,11444,11446,11448,11450,11452,11454,11456,11458,11460,11462,11464,11466,11468,11470,11472,11474,11476,11478,11480,11482,11484,11486,11488,11490,11499,11501,11506,42560,42562,42564,42566,42568,42570,42572,42574,42576,42578,42580,42582,42584,42586,42588,42590,42592,42594,42596,42598,42600,42602,42604,42624,42626,42628,42630,42632,42634,42636,42638,42640,42642,42644,42646,42786,42788,42790,42792,42794,42796,42798,42802,42804,42806,42808,42810,42812,42814,42816,42818,42820,42822,42824,42826,42828,42830,42832,42834,42836,42838,42840,42842,42844,42846,42848,42850,42852,42854,42856,42858,42860,42862,42873,42875,42877,42878,42880,42882,42884,42886,42891,42893,42896,42898,42912,42914,42916,42918,42920,42922,65313,65314,65315,65316,65317,65318,65319,65320,65321,65322,65323,65324,65325,65326,65327,65328,65329,65330,65331,65332,65333,65334,65335,65336,65337,65338,66560,66561,66562,66563,66564,66565,66566,66567,66568,66569,66570,66571,66572,66573,66574,66575,66576,66577,66578,66579,66580,66581,66582,66583,66584,66585,66586,66587,66588,66589,66590,66591,66592,66593,66594,66595,66596,66597,66598,66599,119808,119809,119810,119811,119812,119813,119814,119815,119816,119817,119818,119819,119820,119821,119822,119823,119824,119825,119826,119827,119828,119829,119830,119831,119832,119833,119860,119861,119862,119863,119864,119865,119866,119867,119868,119869,119870,119871,119872,119873,119874,119875,119876,119877,119878,119879,119880,119881,119882,119883,119884,119885,119912,119913,119914,119915,119916,119917,119918,119919,119920,119921,119922,119923,119924,119925,119926,119927,119928,119929,119930,119931,119932,119933,119934,119935,119936,119937,119964,119966,119967,119970,119973,119974,119977,119978,119979,119980,119982,119983,119984,119985,119986,119987,119988,119989,120016,120017,120018,120019,120020,120021,120022,120023,120024,120025,120026,120027,120028,120029,120030,120031,120032,120033,120034,120035,120036,120037,120038,120039,120040,120041,120068,120069,120071,120072,120073,120074,120077,120078,120079,120080,120081,120082,120083,120084,120086,120087,120088,120089,120090,120091,120092,120120,120121,120123,120124,120125,120126,120128,120129,120130,120131,120132,120134,120138,120139,120140,120141,120142,120143,120144,120172,120173,120174,120175,120176,120177,120178,120179,120180,120181,120182,120183,120184,120185,120186,120187,120188,120189,120190,120191,120192,120193,120194,120195,120196,120197,120224,120225,120226,120227,120228,120229,120230,120231,120232,120233,120234,120235,120236,120237,120238,120239,120240,120241,120242,120243,120244,120245,120246,120247,120248,120249,120276,120277,120278,120279,120280,120281,120282,120283,120284,120285,120286,120287,120288,120289,120290,120291,120292,120293,120294,120295,120296,120297,120298,120299,120300,120301,120328,120329,120330,120331,120332,120333,120334,120335,120336,120337,120338,120339,120340,120341,120342,120343,120344,120345,120346,120347,120348,120349,120350,120351,120352,120353,120380,120381,120382,120383,120384,120385,120386,120387,120388,120389,120390,120391,120392,120393,120394,120395,120396,120397,120398,120399,120400,120401,120402,120403,120404,120405,120432,120433,120434,120435,120436,120437,120438,120439,120440,120441,120442,120443,120444,120445,120446,120447,120448,120449,120450,120451,120452,120453,120454,120455,120456,120457,120488,120489,120490,120491,120492,120493,120494,120495,120496,120497,120498,120499,120500,120501,120502,120503,120504,120505,120506,120507,120508,120509,120510,120511,120512,120546,120547,120548,120549,120550,120551,120552,120553,120554,120555,120556,120557,120558,120559,120560,120561,120562,120563,120564,120565,120566,120567,120568,120569,120570,120604,120605,120606,120607,120608,120609,120610,120611,120612,120613,120614,120615,120616,120617,120618,120619,120620,120621,120622,120623,120624,120625,120626,120627,120628,120662,120663,120664,120665,120666,120667,120668,120669,120670,120671,120672,120673,120674,120675,120676,120677,120678,120679,120680,120681,120682,120683,120684,120685,120686,120720,120721,120722,120723,120724,120725,120726,120727,120728,120729,120730,120731,120732,120733,120734,120735,120736,120737,120738,120739,120740,120741,120742,120743,120744,120778] +},{}],139:[function(require,module,exports){ +module.exports={ + "disallowSpacesInNamedFunctionExpression": { + "beforeOpeningRoundBrace": true + }, + "disallowSpacesInFunctionExpression": { + "beforeOpeningRoundBrace": true + }, + "disallowSpacesInAnonymousFunctionExpression": { + "beforeOpeningRoundBrace": true + }, + "disallowSpacesInFunctionDeclaration": { + "beforeOpeningRoundBrace": true + }, + "disallowEmptyBlocks": true, + "disallowSpacesInsideArrayBrackets": true, + "disallowSpacesInsideParentheses": true, + "disallowQuotedKeysInObjects": true, + "disallowSpaceAfterObjectKeys": true, + "disallowSpaceAfterPrefixUnaryOperators": true, + "disallowSpaceBeforePostfixUnaryOperators": true, + "disallowSpaceBeforeBinaryOperators": [ + "," + ], + "disallowMixedSpacesAndTabs": true, + "disallowTrailingWhitespace": true, + "disallowTrailingComma": true, + "disallowYodaConditions": true, + "disallowKeywords": [ "with" ], + "disallowMultipleLineBreaks": true, + "requireSpaceBeforeBlockStatements": true, + "requireParenthesesAroundIIFE": true, + "requireSpacesInConditionalExpression": true, + "requireMultipleVarDecl": "onevar", + "requireBlocksOnNewline": 1, + "requireCommaBeforeLineBreak": true, + "requireSpaceBeforeBinaryOperators": true, + "requireSpaceAfterBinaryOperators": true, + "requireCamelCaseOrUpperCaseIdentifiers": true, + "requireLineFeedAtFileEnd": true, + "requireCapitalizedConstructors": true, + "requireDotNotation": true, + "requireCurlyBraces": [ + "do" + ], + "requireSpaceAfterKeywords": [ + "if", + "else", + "for", + "while", + "do", + "switch", + "case", + "return", + "try", + "catch", + "typeof" + ], + "safeContextKeyword": "_this", + "validateLineBreaks": "LF", + "validateQuoteMarks": "'", + "validateIndentation": 2 +} + +},{}],140:[function(require,module,exports){ +module.exports={ + "requireCurlyBraces": [ + "if", + "else", + "for", + "while", + "do", + "try", + "catch" + ], + "requireSpaceAfterKeywords": [ + "if", + "else", + "for", + "while", + "do", + "switch", + "case", + "return", + "try", + "catch", + "function", + "typeof" + ], + "requireSpaceBeforeBlockStatements": true, + "requireParenthesesAroundIIFE": true, + "requireSpacesInConditionalExpression": true, + "disallowSpacesInNamedFunctionExpression": { + "beforeOpeningRoundBrace": true + }, + "disallowSpacesInFunctionDeclaration": { + "beforeOpeningRoundBrace": true + }, + "requireMultipleVarDecl": "onevar", + "requireBlocksOnNewline": true, + "disallowEmptyBlocks": true, + "disallowSpacesInsideArrayBrackets": true, + "disallowSpacesInsideParentheses": true, + "disallowDanglingUnderscores": true, + "requireCommaBeforeLineBreak": true, + "disallowSpaceAfterPrefixUnaryOperators": true, + "disallowSpaceBeforePostfixUnaryOperators": true, + "disallowSpaceBeforeBinaryOperators": [ + "," + ], + "requireSpaceBeforeBinaryOperators": true, + "requireSpaceAfterBinaryOperators": true, + "disallowKeywords": [ + "with", + "continue" + ], + "validateIndentation": 4, + "disallowMixedSpacesAndTabs": true, + "disallowTrailingWhitespace": true, + "disallowTrailingComma": true, + "disallowKeywordsOnNewLine": [ + "else" + ], + "requireLineFeedAtFileEnd": true, + "requireCapitalizedConstructors": true, + "requireDotNotation": true, + "disallowNewlineBeforeBlockStatements": true, + "disallowMultipleLineStrings": true +} + +},{}],141:[function(require,module,exports){ +module.exports={ + "requireCurlyBraces": [ + "if", + "else", + "for", + "while", + "do", + "try", + "catch" + ], + "requireOperatorBeforeLineBreak": true, + "requireCamelCaseOrUpperCaseIdentifiers": true, + "maximumLineLength": { + "value": 80, + "allowComments": true, + "allowRegex": true + }, + "validateIndentation": 2, + "validateQuoteMarks": "'", + + "disallowMultipleLineStrings": true, + "disallowMixedSpacesAndTabs": true, + "disallowTrailingWhitespace": true, + "disallowSpaceAfterPrefixUnaryOperators": true, + "disallowMultipleVarDecl": true, + + "requireSpaceAfterKeywords": [ + "if", + "else", + "for", + "while", + "do", + "switch", + "return", + "try", + "catch" + ], + "requireSpaceBeforeBinaryOperators": [ + "=", "+=", "-=", "*=", "/=", "%=", "<<=", ">>=", ">>>=", + "&=", "|=", "^=", "+=", + + "+", "-", "*", "/", "%", "<<", ">>", ">>>", "&", + "|", "^", "&&", "||", "===", "==", ">=", + "<=", "<", ">", "!=", "!==" + ], + "requireSpaceAfterBinaryOperators": true, + "requireSpacesInConditionalExpression": true, + "requireSpaceBeforeBlockStatements": true, + "requireLineFeedAtFileEnd": true, + "requireSpacesInFunctionExpression": { + "beforeOpeningCurlyBrace": true + }, + "disallowSpacesInAnonymousFunctionExpression": { + "beforeOpeningRoundBrace": true + }, + "disallowSpacesInsideObjectBrackets": "all", + "disallowSpacesInsideArrayBrackets": "all", + "disallowSpacesInsideParentheses": true, + + + "validateJSDoc": { + "checkParamNames": true, + "requireParamTypes": true + }, + + "disallowMultipleLineBreaks": true, + "disallowNewlineBeforeBlockStatements": true +} + +},{}],142:[function(require,module,exports){ +module.exports={ + "preset": "google", + "maximumLineLength": 120, + "requireCamelCaseOrUpperCaseIdentifiers": "ignoreProperties", + "validateQuoteMarks": { "mark": "'", "escape": true }, + "disallowMultipleVarDecl": "exceptUndefined" +} + +},{}],143:[function(require,module,exports){ +module.exports={ + "requireCurlyBraces": [ + "if", + "else", + "for", + "while", + "do", + "try", + "catch" + ], + "requireOperatorBeforeLineBreak": true, + "requireParenthesesAroundIIFE": true, + "requireMultipleVarDecl": "onevar", + "requireCommaBeforeLineBreak": true, + "requireCamelCaseOrUpperCaseIdentifiers": true, + "requireDotNotation": true, + "maximumLineLength": { + "value": 100, + "tabSize": 4, + "allowUrlComments": true, + "allowRegex": true + }, + "validateQuoteMarks": { "mark": "\"", "escape": true }, + + "disallowMixedSpacesAndTabs": "smart", + "disallowTrailingWhitespace": true, + "disallowMultipleLineStrings": true, + "disallowTrailingComma": true, + + "requireSpaceBeforeBlockStatements": true, + "requireSpacesInFunctionExpression": { + "beforeOpeningCurlyBrace": true + }, + "requireSpaceAfterKeywords": [ + "if", + "else", + "for", + "while", + "do", + "switch", + "return", + "try", + "catch" + ], + "requireSpacesInsideObjectBrackets": "all", + "requireSpacesInsideArrayBrackets": "all", + "requireSpacesInConditionalExpression": true, + "requireSpaceAfterBinaryOperators": true, + "requireLineFeedAtFileEnd": true, + "requireSpaceBeforeBinaryOperators": [ + "=", "+=", "-=", "*=", "/=", "%=", "<<=", ">>=", ">>>=", + "&=", "|=", "^=", "+=", + + "+", "-", "*", "/", "%", "<<", ">>", ">>>", "&", + "|", "^", "&&", "||", "===", "==", ">=", + "<=", "<", ">", "!=", "!==" + ], + "requireSpacesInAnonymousFunctionExpression": { + "beforeOpeningCurlyBrace": true + }, + "requireSpacesInNamedFunctionExpression": { + "beforeOpeningCurlyBrace": true + }, + "validateLineBreaks": "LF", + + "disallowKeywords": [ "with" ], + "disallowKeywordsOnNewLine": [ "else" ], + "disallowSpacesInFunctionExpression": { + "beforeOpeningRoundBrace": true + }, + "disallowSpacesInNamedFunctionExpression": { + "beforeOpeningRoundBrace": true + }, + "disallowSpacesInAnonymousFunctionExpression": { + "beforeOpeningRoundBrace": true + }, + "disallowSpaceAfterObjectKeys": true, + "disallowSpaceAfterPrefixUnaryOperators": true, + "disallowSpaceBeforePostfixUnaryOperators": true, + "disallowSpaceBeforeBinaryOperators": [ ",", ":" ], + "disallowMultipleLineBreaks": true +} + +},{}],144:[function(require,module,exports){ +module.exports={ + "requireCurlyBraces": ["while", "do", "try", "catch"], + "requireSpaceAfterKeywords": ["if", "else", "for", "while", "do", "switch", "return", "try", "catch"], + "requireSpacesInFunctionExpression": { + "beforeOpeningCurlyBrace": true + }, + "requirePaddingNewlinesInBlocks": true, + "requireSpacesInsideObjectBrackets": "all", + "requireSpacesInsideArrayBrackets": "allButNested", + "requireSpaceBeforeBlockStatements": true, + "disallowKeywords": [ "with" ], + "requireLineFeedAtFileEnd": true, + "validateLineBreaks": "LF", + "validateIndentation": "\t", + + "requireSpaceAfterPrefixUnaryOperators": ["++", "--"], + "requireSpaceBeforePostfixUnaryOperators": ["++", "--"], + "requireSpaceBeforeBinaryOperators": [ "+", "-", "/", "*", "=", "==", "===", "!=", "!==", ">", ">=", "<", "<=" ], + "requireSpaceAfterBinaryOperators": [ "+", "-", "/", "*", "=", "==", "===", "!=", "!==", ">", ">=", "<", "<=" ], + "disallowSpaceBeforeBinaryOperators": [","], + "requireSpacesInConditionalExpression": { + "afterTest": true, + "beforeConsequent": true, + "afterConsequent": true, + "beforeAlternate": true + } +} + +},{}],145:[function(require,module,exports){ +module.exports={ + "requireCurlyBraces": [ + "if", + "else", + "for", + "while", + "do", + "try", + "catch" + ], + "requireSpaceBeforeKeywords": true, + "requireSpaceAfterKeywords": true, + "requireSpaceBeforeBlockStatements": true, + "requireParenthesesAroundIIFE": true, + "requireSpacesInConditionalExpression": true, + "disallowSpacesInNamedFunctionExpression": { + "beforeOpeningRoundBrace": true + }, + "disallowSpacesInFunctionDeclaration": { + "beforeOpeningRoundBrace": true + }, + "disallowSpacesInCallExpression": true, + "requireMultipleVarDecl": "onevar", + "requireBlocksOnNewline": 1, + "disallowEmptyBlocks": true, + "requireSpacesInsideObjectBrackets": "all", + "requireSpacesInsideArrayBrackets": "all", + "requireSpacesInsideParentheses": "all", + "disallowQuotedKeysInObjects": "allButReserved", + "disallowDanglingUnderscores": true, + "disallowSpaceAfterObjectKeys": true, + "requireSpaceBeforeObjectValues": true, + "requireCommaBeforeLineBreak": true, + "disallowSpaceAfterPrefixUnaryOperators": true, + "disallowSpaceBeforePostfixUnaryOperators": true, + "disallowSpaceBeforeBinaryOperators": [ + "," + ], + "requireSpaceBeforeBinaryOperators": true, + "requireSpaceAfterBinaryOperators": true, + "disallowImplicitTypeConversion": [ + "binary", + "string" + ], + "requireCamelCaseOrUpperCaseIdentifiers": true, + "disallowKeywords": [ + "with" + ], + "disallowMultipleLineBreaks": true, + "disallowMixedSpacesAndTabs": true, + "disallowOperatorBeforeLineBreak": [ + "." + ], + "disallowTrailingWhitespace": true, + "disallowTrailingComma": true, + "disallowKeywordsOnNewLine": [ + "else" + ], + "requireLineBreakAfterVariableAssignment": true, + "requireLineFeedAtFileEnd": true, + "requireCapitalizedConstructors": true, + "requireDotNotation": true, + "disallowYodaConditions": true, + "requireSpaceAfterLineComment": true, + "disallowNewlineBeforeBlockStatements": true, + "validateLineBreaks": "LF", + "validateQuoteMarks": "'", + "validateIndentation": "\t" +} + +},{}],146:[function(require,module,exports){ +module.exports={ + "requireCurlyBraces": [ + "if", + "else", + "for", + "while", + "do" + ], + "requireSpaceAfterKeywords": [ + "if", + "else", + "for", + "while", + "do", + "switch", + "return", + "catch" + ], + "disallowKeywords": [ + "with" + ], + "disallowKeywordsOnNewLine": [ + "else", + "catch" + ], + + "disallowSpaceAfterPrefixUnaryOperators": true, + "disallowSpaceBeforePostfixUnaryOperators": [ + "++", + "--" + ], + "requireSpaceBeforeBinaryOperators": true, + "requireSpaceAfterBinaryOperators": true, + + "disallowMultipleVarDecl": true, + + "disallowSpacesInsideParentheses": true, + "disallowEmptyBlocks": true, + + "requireParenthesesAroundIIFE": true, + "requireSpacesInFunctionDeclaration": { + "beforeOpeningCurlyBrace": true + }, + "disallowSpacesInFunctionDeclaration": { + "beforeOpeningRoundBrace": true + }, + "requireSpacesInAnonymousFunctionExpression": { + "beforeOpeningRoundBrace": true, + "beforeOpeningCurlyBrace": true + }, + "disallowSpacesInNamedFunctionExpression": { + "beforeOpeningRoundBrace": true + }, + "requireSpacesInNamedFunctionExpression": { + "beforeOpeningCurlyBrace": true + }, + + "requireSpacesInConditionalExpression": { + "afterTest": true, + "beforeConsequent": true, + "afterConsequent": true, + "beforeAlternate": true + }, + + "disallowSpaceBeforeBinaryOperators": [ + "," + ], + "requireCommaBeforeLineBreak": true, + + "validateQuoteMarks": "'", + "disallowMultipleLineStrings": true, + + "disallowImplicitTypeConversion": [ + "numeric", + "boolean", + "binary", + "string" + ], + "disallowYodaConditions": true, + + "disallowSpacesInsideArrayBrackets": true, + + "requireDotNotation": true, + "disallowSpaceAfterObjectKeys": true, + "disallowSpacesInsideObjectBrackets": true, + "disallowQuotedKeysInObjects": true, + + "validateJSDoc": { + "checkParamNames": true, + "requireParamTypes": true + }, + + "maximumLineLength": { + "value": 120, + "allowUrlComments": true + }, + "requireSpaceAfterLineComment": true, + "requireLineFeedAtFileEnd": true, + "disallowMultipleLineBreaks": true, + "disallowMixedSpacesAndTabs": true, + "disallowTrailingWhitespace": true, + "validateLineBreaks": "LF" +} + +},{}]},{},[103])(103) +}); \ No newline at end of file