├── .babelrc ├── .editorconfig ├── .eslintignore ├── .eslintrc.js ├── .gitignore ├── .postcssrc.js ├── README.md ├── build ├── build.js ├── check-versions.js ├── logo.png ├── utils.js ├── vue-loader.conf.js ├── webpack.base.conf.js ├── webpack.dev.conf.js └── webpack.prod.conf.js ├── config ├── dev.env.js ├── index.js └── prod.env.js ├── index.html ├── package-lock.json ├── package.json ├── src ├── App.vue ├── assets │ └── logo.png ├── components │ ├── SelfsqlEditor.vue │ └── SparksqlEditor.vue ├── main.js ├── plugins │ └── axiosPlugin.js ├── router │ └── index.js ├── selfsql │ └── selfsql.js └── sparkSql │ ├── ParseErrorListener.js │ ├── SqlBase.interp │ ├── SqlBase.tokens │ ├── SqlBaseLexer.interp │ ├── SqlBaseLexer.js │ ├── SqlBaseLexer.tokens │ ├── SqlBaseParser.js │ ├── UpperCaseCharStream.js │ └── sparksql-lint.js └── static └── .gitkeep /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | ["env", { 4 | "modules": false, 5 | "targets": { 6 | "browsers": ["> 1%", "last 2 versions", "not ie <= 8"] 7 | } 8 | }], 9 | "stage-2" 10 | ], 11 | "plugins": ["transform-vue-jsx", "transform-runtime"] 12 | } 13 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | indent_style = space 6 | indent_size = 2 7 | end_of_line = lf 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | /build/ 2 | /config/ 3 | /dist/ 4 | /*.js 5 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | // https://eslint.org/docs/user-guide/configuring 2 | 3 | module.exports = { 4 | root: true, 5 | parserOptions: { 6 | parser: 'babel-eslint' 7 | }, 8 | env: { 9 | browser: true, 10 | }, 11 | extends: [ 12 | // https://github.com/vuejs/eslint-plugin-vue#priority-a-essential-error-prevention 13 | // consider switching to `plugin:vue/strongly-recommended` or `plugin:vue/recommended` for stricter rules. 14 | 'plugin:vue/essential', 15 | // https://github.com/standard/standard/blob/master/docs/RULES-en.md 16 | 'standard' 17 | ], 18 | // required to lint *.vue files 19 | plugins: [ 20 | 'vue' 21 | ], 22 | // add your custom rules here 23 | rules: { 24 | // allow async-await 25 | 'generator-star-spacing': 'off', 26 | // allow debugger during development 27 | 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off' 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules/ 3 | /dist/ 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Editor directories and files 9 | .idea 10 | .vscode 11 | *.suo 12 | *.ntvs* 13 | *.njsproj 14 | *.sln 15 | -------------------------------------------------------------------------------- /.postcssrc.js: -------------------------------------------------------------------------------- 1 | // https://github.com/michael-ciniawsky/postcss-load-config 2 | 3 | module.exports = { 4 | "plugins": { 5 | "postcss-import": {}, 6 | "postcss-url": {}, 7 | // to edit target browsers: use "browserslist" field in package.json 8 | "autoprefixer": {} 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # spark-sql-online-editor 2 | 3 | 中文介绍可以看[这里](https://waltyou.github.io/Spark-Sql-Online-Editor/)。 4 | 5 | ## Base info 6 | 7 | ### feature 8 | 9 | 1. [x] syntax highlighting 10 | 2. [x] auto complete (Use 'Ctrl' key) 11 | 3. [x] show syntax error 12 | 4. [ ] check sql line one by one 13 | 5. [ ] sql context involve 14 | 15 | ### tech stack 16 | 17 | 1. codemirror 18 | 2. vue 19 | 3. js 20 | 21 | ## Usage 22 | 23 | ``` bash 24 | # install dependencies 25 | npm install 26 | 27 | # serve with hot reload at localhost:8080 28 | npm run dev 29 | ``` 30 | 31 | ## Introduce 32 | 33 | ### 1. Demo from official webset 34 | 35 | All feature's implement are base on [Codemirror](https://codemirror.net/). 36 | There already have "spark-sql" mode in [Codemirror sql mode](https://github.com/codemirror/CodeMirror/blob/master/mode/sql/sql.js). 37 | 38 | You can run this project and access 'http://localhost:8080' to find the Spark-Sql editor. 39 | 40 | ### 2. self defined word highlighting and autoComplete 41 | 42 | Try to access 'http://localhost:8080/#/selfsql' to see what happened. The implement you can find in `SelfsqlEditor.vue` and `selfsql.js`. 43 | 44 | ### 3. show syntax error 45 | 46 | Spark SQL uses module [Spark-Catalyst](https://github.com/apache/spark/tree/master/sql/catalyst) to do SQL parse. 47 | And Spark-Catalyst use ANTLR4 to generate Gammer Parser in Java. 48 | 49 | So if we want to use ANTLR4 for syntax check in webpage, we need generate code in JS. Refer to [here](https://github.com/antlr/antlr4/blob/master/doc/javascript-target.md). 50 | There also have a npm implement in github which named [antlr4-tool](https://github.com/mcchatman8009/antlr4-tool). 51 | 52 | The steps are as blow: 53 | 54 | 1. Get the [G4 file](https://github.com/apache/spark/blob/master/sql/catalyst/src/main/antlr4/org/apache/spark/sql/catalyst/parser/SqlBase.g4) from Spark-Catalyst. 55 | 2. Generate antlr4 related js by using antlr4-tool 56 | 3. According to [parsePlan#ParseDriver.scala](https://github.com/apache/spark/blob/master/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/parser/ParseDriver.scala), create JS function. 57 | 4. Register lint to codemirror 58 | -------------------------------------------------------------------------------- /build/build.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | require('./check-versions')() 3 | 4 | process.env.NODE_ENV = 'production' 5 | 6 | const ora = require('ora') 7 | const rm = require('rimraf') 8 | const path = require('path') 9 | const chalk = require('chalk') 10 | const webpack = require('webpack') 11 | const config = require('../config') 12 | const webpackConfig = require('./webpack.prod.conf') 13 | 14 | const spinner = ora('building for production...') 15 | spinner.start() 16 | 17 | rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => { 18 | if (err) throw err 19 | webpack(webpackConfig, (err, stats) => { 20 | spinner.stop() 21 | if (err) throw err 22 | process.stdout.write(stats.toString({ 23 | colors: true, 24 | modules: false, 25 | children: false, // If you are using ts-loader, setting this to true will make TypeScript errors show up during build. 26 | chunks: false, 27 | chunkModules: false 28 | }) + '\n\n') 29 | 30 | if (stats.hasErrors()) { 31 | console.log(chalk.red(' Build failed with errors.\n')) 32 | process.exit(1) 33 | } 34 | 35 | console.log(chalk.cyan(' Build complete.\n')) 36 | console.log(chalk.yellow( 37 | ' Tip: built files are meant to be served over an HTTP server.\n' + 38 | ' Opening index.html over file:// won\'t work.\n' 39 | )) 40 | }) 41 | }) 42 | -------------------------------------------------------------------------------- /build/check-versions.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const chalk = require('chalk') 3 | const semver = require('semver') 4 | const packageConfig = require('../package.json') 5 | const shell = require('shelljs') 6 | 7 | function exec (cmd) { 8 | return require('child_process').execSync(cmd).toString().trim() 9 | } 10 | 11 | const versionRequirements = [ 12 | { 13 | name: 'node', 14 | currentVersion: semver.clean(process.version), 15 | versionRequirement: packageConfig.engines.node 16 | } 17 | ] 18 | 19 | if (shell.which('npm')) { 20 | versionRequirements.push({ 21 | name: 'npm', 22 | currentVersion: exec('npm --version'), 23 | versionRequirement: packageConfig.engines.npm 24 | }) 25 | } 26 | 27 | module.exports = function () { 28 | const warnings = [] 29 | 30 | for (let i = 0; i < versionRequirements.length; i++) { 31 | const mod = versionRequirements[i] 32 | 33 | if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) { 34 | warnings.push(mod.name + ': ' + 35 | chalk.red(mod.currentVersion) + ' should be ' + 36 | chalk.green(mod.versionRequirement) 37 | ) 38 | } 39 | } 40 | 41 | if (warnings.length) { 42 | console.log('') 43 | console.log(chalk.yellow('To use this template, you must update following to modules:')) 44 | console.log() 45 | 46 | for (let i = 0; i < warnings.length; i++) { 47 | const warning = warnings[i] 48 | console.log(' ' + warning) 49 | } 50 | 51 | console.log() 52 | process.exit(1) 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /build/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/waltyou/spark-sql-online-editor/c8b049b2745b4252cc6021fce28b82f5bd69d2c8/build/logo.png -------------------------------------------------------------------------------- /build/utils.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const path = require('path') 3 | const config = require('../config') 4 | const ExtractTextPlugin = require('extract-text-webpack-plugin') 5 | const packageConfig = require('../package.json') 6 | 7 | exports.assetsPath = function (_path) { 8 | const assetsSubDirectory = process.env.NODE_ENV === 'production' 9 | ? config.build.assetsSubDirectory 10 | : config.dev.assetsSubDirectory 11 | 12 | return path.posix.join(assetsSubDirectory, _path) 13 | } 14 | 15 | exports.cssLoaders = function (options) { 16 | options = options || {} 17 | 18 | const cssLoader = { 19 | loader: 'css-loader', 20 | options: { 21 | sourceMap: options.sourceMap 22 | } 23 | } 24 | 25 | const postcssLoader = { 26 | loader: 'postcss-loader', 27 | options: { 28 | sourceMap: options.sourceMap 29 | } 30 | } 31 | 32 | // generate loader string to be used with extract text plugin 33 | function generateLoaders (loader, loaderOptions) { 34 | const loaders = options.usePostCSS ? [cssLoader, postcssLoader] : [cssLoader] 35 | 36 | if (loader) { 37 | loaders.push({ 38 | loader: loader + '-loader', 39 | options: Object.assign({}, loaderOptions, { 40 | sourceMap: options.sourceMap 41 | }) 42 | }) 43 | } 44 | 45 | // Extract CSS when that option is specified 46 | // (which is the case during production build) 47 | if (options.extract) { 48 | return ExtractTextPlugin.extract({ 49 | use: loaders, 50 | fallback: 'vue-style-loader' 51 | }) 52 | } else { 53 | return ['vue-style-loader'].concat(loaders) 54 | } 55 | } 56 | 57 | // https://vue-loader.vuejs.org/en/configurations/extract-css.html 58 | return { 59 | css: generateLoaders(), 60 | postcss: generateLoaders(), 61 | less: generateLoaders('less'), 62 | sass: generateLoaders('sass', { indentedSyntax: true }), 63 | scss: generateLoaders('sass'), 64 | stylus: generateLoaders('stylus'), 65 | styl: generateLoaders('stylus') 66 | } 67 | } 68 | 69 | // Generate loaders for standalone style files (outside of .vue) 70 | exports.styleLoaders = function (options) { 71 | const output = [] 72 | const loaders = exports.cssLoaders(options) 73 | 74 | for (const extension in loaders) { 75 | const loader = loaders[extension] 76 | output.push({ 77 | test: new RegExp('\\.' + extension + '$'), 78 | use: loader 79 | }) 80 | } 81 | 82 | return output 83 | } 84 | 85 | exports.createNotifierCallback = () => { 86 | const notifier = require('node-notifier') 87 | 88 | return (severity, errors) => { 89 | if (severity !== 'error') return 90 | 91 | const error = errors[0] 92 | const filename = error.file && error.file.split('!').pop() 93 | 94 | notifier.notify({ 95 | title: packageConfig.name, 96 | message: severity + ': ' + error.name, 97 | subtitle: filename || '', 98 | icon: path.join(__dirname, 'logo.png') 99 | }) 100 | } 101 | } 102 | -------------------------------------------------------------------------------- /build/vue-loader.conf.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const utils = require('./utils') 3 | const config = require('../config') 4 | const isProduction = process.env.NODE_ENV === 'production' 5 | const sourceMapEnabled = isProduction 6 | ? config.build.productionSourceMap 7 | : config.dev.cssSourceMap 8 | 9 | module.exports = { 10 | loaders: utils.cssLoaders({ 11 | sourceMap: sourceMapEnabled, 12 | extract: isProduction 13 | }), 14 | cssSourceMap: sourceMapEnabled, 15 | cacheBusting: config.dev.cacheBusting, 16 | transformToRequire: { 17 | video: ['src', 'poster'], 18 | source: 'src', 19 | img: 'src', 20 | image: 'xlink:href' 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /build/webpack.base.conf.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const path = require('path') 3 | const utils = require('./utils') 4 | const config = require('../config') 5 | const vueLoaderConfig = require('./vue-loader.conf') 6 | 7 | function resolve (dir) { 8 | return path.join(__dirname, '..', dir) 9 | } 10 | 11 | const createLintingRule = () => ({ 12 | test: /\.(js|vue)$/, 13 | loader: 'eslint-loader', 14 | enforce: 'pre', 15 | include: [resolve('src'), resolve('test')], 16 | options: { 17 | formatter: require('eslint-friendly-formatter'), 18 | emitWarning: !config.dev.showEslintErrorsInOverlay 19 | } 20 | }) 21 | 22 | module.exports = { 23 | context: path.resolve(__dirname, '../'), 24 | entry: { 25 | app: './src/main.js' 26 | }, 27 | output: { 28 | path: config.build.assetsRoot, 29 | filename: '[name].js', 30 | publicPath: process.env.NODE_ENV === 'production' 31 | ? config.build.assetsPublicPath 32 | : config.dev.assetsPublicPath 33 | }, 34 | resolve: { 35 | extensions: ['.js', '.vue', '.json'], 36 | alias: { 37 | 'vue$': 'vue/dist/vue.esm.js', 38 | '@': resolve('src'), 39 | } 40 | }, 41 | module: { 42 | rules: [ 43 | ...(config.dev.useEslint ? [createLintingRule()] : []), 44 | { 45 | test: /\.vue$/, 46 | loader: 'vue-loader', 47 | options: vueLoaderConfig 48 | }, 49 | { 50 | test: /\.js$/, 51 | loader: 'babel-loader', 52 | include: [resolve('src'), resolve('test'), resolve('node_modules/webpack-dev-server/client')] 53 | }, 54 | { 55 | test: /\.(png|jpe?g|gif|svg)(\?.*)?$/, 56 | loader: 'url-loader', 57 | options: { 58 | limit: 10000, 59 | name: utils.assetsPath('img/[name].[hash:7].[ext]') 60 | } 61 | }, 62 | { 63 | test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/, 64 | loader: 'url-loader', 65 | options: { 66 | limit: 10000, 67 | name: utils.assetsPath('media/[name].[hash:7].[ext]') 68 | } 69 | }, 70 | { 71 | test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/, 72 | loader: 'url-loader', 73 | options: { 74 | limit: 10000, 75 | name: utils.assetsPath('fonts/[name].[hash:7].[ext]') 76 | } 77 | } 78 | ] 79 | }, 80 | node: { 81 | // prevent webpack from injecting useless setImmediate polyfill because Vue 82 | // source contains it (although only uses it if it's native). 83 | setImmediate: false, 84 | // prevent webpack from injecting mocks to Node native modules 85 | // that does not make sense for the client 86 | dgram: 'empty', 87 | fs: 'empty', 88 | net: 'empty', 89 | tls: 'empty', 90 | child_process: 'empty' 91 | } 92 | } 93 | -------------------------------------------------------------------------------- /build/webpack.dev.conf.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const utils = require('./utils') 3 | const webpack = require('webpack') 4 | const config = require('../config') 5 | const merge = require('webpack-merge') 6 | const path = require('path') 7 | const baseWebpackConfig = require('./webpack.base.conf') 8 | const CopyWebpackPlugin = require('copy-webpack-plugin') 9 | const HtmlWebpackPlugin = require('html-webpack-plugin') 10 | const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin') 11 | const portfinder = require('portfinder') 12 | 13 | const HOST = process.env.HOST 14 | const PORT = process.env.PORT && Number(process.env.PORT) 15 | 16 | const devWebpackConfig = merge(baseWebpackConfig, { 17 | module: { 18 | rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap, usePostCSS: true }) 19 | }, 20 | // cheap-module-eval-source-map is faster for development 21 | devtool: config.dev.devtool, 22 | 23 | // these devServer options should be customized in /config/index.js 24 | devServer: { 25 | clientLogLevel: 'warning', 26 | historyApiFallback: { 27 | rewrites: [ 28 | { from: /.*/, to: path.posix.join(config.dev.assetsPublicPath, 'index.html') }, 29 | ], 30 | }, 31 | hot: true, 32 | contentBase: false, // since we use CopyWebpackPlugin. 33 | compress: true, 34 | host: HOST || config.dev.host, 35 | port: PORT || config.dev.port, 36 | open: config.dev.autoOpenBrowser, 37 | overlay: config.dev.errorOverlay 38 | ? { warnings: false, errors: true } 39 | : false, 40 | publicPath: config.dev.assetsPublicPath, 41 | proxy: config.dev.proxyTable, 42 | quiet: true, // necessary for FriendlyErrorsPlugin 43 | watchOptions: { 44 | poll: config.dev.poll, 45 | } 46 | }, 47 | plugins: [ 48 | new webpack.DefinePlugin({ 49 | 'process.env': require('../config/dev.env') 50 | }), 51 | new webpack.HotModuleReplacementPlugin(), 52 | new webpack.NamedModulesPlugin(), // HMR shows correct file names in console on update. 53 | new webpack.NoEmitOnErrorsPlugin(), 54 | // https://github.com/ampedandwired/html-webpack-plugin 55 | new HtmlWebpackPlugin({ 56 | filename: 'index.html', 57 | template: 'index.html', 58 | inject: true 59 | }), 60 | // copy custom static assets 61 | new CopyWebpackPlugin([ 62 | { 63 | from: path.resolve(__dirname, '../static'), 64 | to: config.dev.assetsSubDirectory, 65 | ignore: ['.*'] 66 | } 67 | ]) 68 | ] 69 | }) 70 | 71 | module.exports = new Promise((resolve, reject) => { 72 | portfinder.basePort = process.env.PORT || config.dev.port 73 | portfinder.getPort((err, port) => { 74 | if (err) { 75 | reject(err) 76 | } else { 77 | // publish the new Port, necessary for e2e tests 78 | process.env.PORT = port 79 | // add port to devServer config 80 | devWebpackConfig.devServer.port = port 81 | 82 | // Add FriendlyErrorsPlugin 83 | devWebpackConfig.plugins.push(new FriendlyErrorsPlugin({ 84 | compilationSuccessInfo: { 85 | messages: [`Your application is running here: http://${devWebpackConfig.devServer.host}:${port}`], 86 | }, 87 | onErrors: config.dev.notifyOnErrors 88 | ? utils.createNotifierCallback() 89 | : undefined 90 | })) 91 | 92 | resolve(devWebpackConfig) 93 | } 94 | }) 95 | }) 96 | -------------------------------------------------------------------------------- /build/webpack.prod.conf.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const path = require('path') 3 | const utils = require('./utils') 4 | const webpack = require('webpack') 5 | const config = require('../config') 6 | const merge = require('webpack-merge') 7 | const baseWebpackConfig = require('./webpack.base.conf') 8 | const CopyWebpackPlugin = require('copy-webpack-plugin') 9 | const HtmlWebpackPlugin = require('html-webpack-plugin') 10 | const ExtractTextPlugin = require('extract-text-webpack-plugin') 11 | const OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin') 12 | const UglifyJsPlugin = require('uglifyjs-webpack-plugin') 13 | 14 | const env = require('../config/prod.env') 15 | 16 | const webpackConfig = merge(baseWebpackConfig, { 17 | module: { 18 | rules: utils.styleLoaders({ 19 | sourceMap: config.build.productionSourceMap, 20 | extract: true, 21 | usePostCSS: true 22 | }) 23 | }, 24 | devtool: config.build.productionSourceMap ? config.build.devtool : false, 25 | output: { 26 | path: config.build.assetsRoot, 27 | filename: utils.assetsPath('js/[name].[chunkhash].js'), 28 | chunkFilename: utils.assetsPath('js/[id].[chunkhash].js') 29 | }, 30 | plugins: [ 31 | // http://vuejs.github.io/vue-loader/en/workflow/production.html 32 | new webpack.DefinePlugin({ 33 | 'process.env': env 34 | }), 35 | new UglifyJsPlugin({ 36 | uglifyOptions: { 37 | compress: { 38 | warnings: false 39 | } 40 | }, 41 | sourceMap: config.build.productionSourceMap, 42 | parallel: true 43 | }), 44 | // extract css into its own file 45 | new ExtractTextPlugin({ 46 | filename: utils.assetsPath('css/[name].[contenthash].css'), 47 | // Setting the following option to `false` will not extract CSS from codesplit chunks. 48 | // Their CSS will instead be inserted dynamically with style-loader when the codesplit chunk has been loaded by webpack. 49 | // It's currently set to `true` because we are seeing that sourcemaps are included in the codesplit bundle as well when it's `false`, 50 | // increasing file size: https://github.com/vuejs-templates/webpack/issues/1110 51 | allChunks: true, 52 | }), 53 | // Compress extracted CSS. We are using this plugin so that possible 54 | // duplicated CSS from different components can be deduped. 55 | new OptimizeCSSPlugin({ 56 | cssProcessorOptions: config.build.productionSourceMap 57 | ? { safe: true, map: { inline: false } } 58 | : { safe: true } 59 | }), 60 | // generate dist index.html with correct asset hash for caching. 61 | // you can customize output by editing /index.html 62 | // see https://github.com/ampedandwired/html-webpack-plugin 63 | new HtmlWebpackPlugin({ 64 | filename: config.build.index, 65 | template: 'index.html', 66 | inject: true, 67 | minify: { 68 | removeComments: true, 69 | collapseWhitespace: true, 70 | removeAttributeQuotes: true 71 | // more options: 72 | // https://github.com/kangax/html-minifier#options-quick-reference 73 | }, 74 | // necessary to consistently work with multiple chunks via CommonsChunkPlugin 75 | chunksSortMode: 'dependency' 76 | }), 77 | // keep module.id stable when vendor modules does not change 78 | new webpack.HashedModuleIdsPlugin(), 79 | // enable scope hoisting 80 | new webpack.optimize.ModuleConcatenationPlugin(), 81 | // split vendor js into its own file 82 | new webpack.optimize.CommonsChunkPlugin({ 83 | name: 'vendor', 84 | minChunks (module) { 85 | // any required modules inside node_modules are extracted to vendor 86 | return ( 87 | module.resource && 88 | /\.js$/.test(module.resource) && 89 | module.resource.indexOf( 90 | path.join(__dirname, '../node_modules') 91 | ) === 0 92 | ) 93 | } 94 | }), 95 | // extract webpack runtime and module manifest to its own file in order to 96 | // prevent vendor hash from being updated whenever app bundle is updated 97 | new webpack.optimize.CommonsChunkPlugin({ 98 | name: 'manifest', 99 | minChunks: Infinity 100 | }), 101 | // This instance extracts shared chunks from code splitted chunks and bundles them 102 | // in a separate chunk, similar to the vendor chunk 103 | // see: https://webpack.js.org/plugins/commons-chunk-plugin/#extra-async-commons-chunk 104 | new webpack.optimize.CommonsChunkPlugin({ 105 | name: 'app', 106 | async: 'vendor-async', 107 | children: true, 108 | minChunks: 3 109 | }), 110 | 111 | // copy custom static assets 112 | new CopyWebpackPlugin([ 113 | { 114 | from: path.resolve(__dirname, '../static'), 115 | to: config.build.assetsSubDirectory, 116 | ignore: ['.*'] 117 | } 118 | ]) 119 | ] 120 | }) 121 | 122 | if (config.build.productionGzip) { 123 | const CompressionWebpackPlugin = require('compression-webpack-plugin') 124 | 125 | webpackConfig.plugins.push( 126 | new CompressionWebpackPlugin({ 127 | asset: '[path].gz[query]', 128 | algorithm: 'gzip', 129 | test: new RegExp( 130 | '\\.(' + 131 | config.build.productionGzipExtensions.join('|') + 132 | ')$' 133 | ), 134 | threshold: 10240, 135 | minRatio: 0.8 136 | }) 137 | ) 138 | } 139 | 140 | if (config.build.bundleAnalyzerReport) { 141 | const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin 142 | webpackConfig.plugins.push(new BundleAnalyzerPlugin()) 143 | } 144 | 145 | module.exports = webpackConfig 146 | -------------------------------------------------------------------------------- /config/dev.env.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const merge = require('webpack-merge') 3 | const prodEnv = require('./prod.env') 4 | 5 | module.exports = merge(prodEnv, { 6 | NODE_ENV: '"development"' 7 | }) 8 | -------------------------------------------------------------------------------- /config/index.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | // Template version: 1.3.1 3 | // see http://vuejs-templates.github.io/webpack for documentation. 4 | 5 | const path = require('path') 6 | 7 | module.exports = { 8 | dev: { 9 | 10 | // Paths 11 | assetsSubDirectory: 'static', 12 | assetsPublicPath: '/', 13 | proxyTable: {}, 14 | 15 | // Various Dev Server settings 16 | host: 'localhost', // can be overwritten by process.env.HOST 17 | port: 8080, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined 18 | autoOpenBrowser: false, 19 | errorOverlay: true, 20 | notifyOnErrors: true, 21 | poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions- 22 | 23 | // Use Eslint Loader? 24 | // If true, your code will be linted during bundling and 25 | // linting errors and warnings will be shown in the console. 26 | useEslint: true, 27 | // If true, eslint errors and warnings will also be shown in the error overlay 28 | // in the browser. 29 | showEslintErrorsInOverlay: false, 30 | 31 | /** 32 | * Source Maps 33 | */ 34 | 35 | // https://webpack.js.org/configuration/devtool/#development 36 | devtool: 'cheap-module-eval-source-map', 37 | 38 | // If you have problems debugging vue-files in devtools, 39 | // set this to false - it *may* help 40 | // https://vue-loader.vuejs.org/en/options.html#cachebusting 41 | cacheBusting: true, 42 | 43 | cssSourceMap: true 44 | }, 45 | 46 | build: { 47 | // Template for index.html 48 | index: path.resolve(__dirname, '../dist/index.html'), 49 | 50 | // Paths 51 | assetsRoot: path.resolve(__dirname, '../dist'), 52 | assetsSubDirectory: 'static', 53 | assetsPublicPath: '/', 54 | 55 | /** 56 | * Source Maps 57 | */ 58 | 59 | productionSourceMap: true, 60 | // https://webpack.js.org/configuration/devtool/#production 61 | devtool: '#source-map', 62 | 63 | // Gzip off by default as many popular static hosts such as 64 | // Surge or Netlify already gzip all static assets for you. 65 | // Before setting to `true`, make sure to: 66 | // npm install --save-dev compression-webpack-plugin 67 | productionGzip: false, 68 | productionGzipExtensions: ['js', 'css'], 69 | 70 | // Run the build command with an extra argument to 71 | // View the bundle analyzer report after build finishes: 72 | // `npm run build --report` 73 | // Set to `true` or `false` to always turn it on or off 74 | bundleAnalyzerReport: process.env.npm_config_report 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /config/prod.env.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | module.exports = { 3 | NODE_ENV: '"production"' 4 | } 5 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | spark-sql-online-editor 7 | 8 | 9 |
10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "spark-sql-online-editor", 3 | "version": "1.0.0", 4 | "description": "A Vue.js project", 5 | "author": "waltyou", 6 | "private": true, 7 | "scripts": { 8 | "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js", 9 | "start": "npm run dev", 10 | "lint": "eslint --ext .js,.vue src", 11 | "build": "node build/build.js" 12 | }, 13 | "dependencies": { 14 | "antlr4": "^4.7.2", 15 | "axios": "^0.19.0", 16 | "element-ui": "^2.12.0", 17 | "vue": "^2.5.2", 18 | "vue-codemirror": "^4.0.6", 19 | "vue-router": "^3.0.1" 20 | }, 21 | "devDependencies": { 22 | "autoprefixer": "^7.1.2", 23 | "babel-core": "^6.22.1", 24 | "babel-eslint": "^8.2.1", 25 | "babel-helper-vue-jsx-merge-props": "^2.0.3", 26 | "babel-loader": "^7.1.1", 27 | "babel-plugin-syntax-jsx": "^6.18.0", 28 | "babel-plugin-transform-runtime": "^6.22.0", 29 | "babel-plugin-transform-vue-jsx": "^3.5.0", 30 | "babel-preset-env": "^1.3.2", 31 | "babel-preset-stage-2": "^6.22.0", 32 | "chalk": "^2.0.1", 33 | "copy-webpack-plugin": "^4.0.1", 34 | "css-loader": "^3.2.0", 35 | "eslint": "^4.15.0", 36 | "eslint-config-standard": "^10.2.1", 37 | "eslint-friendly-formatter": "^3.0.0", 38 | "eslint-loader": "^1.7.1", 39 | "eslint-plugin-import": "^2.7.0", 40 | "eslint-plugin-node": "^5.2.0", 41 | "eslint-plugin-promise": "^3.4.0", 42 | "eslint-plugin-standard": "^3.0.1", 43 | "eslint-plugin-vue": "^4.0.0", 44 | "extract-text-webpack-plugin": "^3.0.0", 45 | "file-loader": "^1.1.4", 46 | "friendly-errors-webpack-plugin": "^1.6.1", 47 | "html-webpack-plugin": "^2.30.1", 48 | "node-notifier": "^5.1.2", 49 | "optimize-css-assets-webpack-plugin": "^3.2.0", 50 | "ora": "^1.2.0", 51 | "portfinder": "^1.0.13", 52 | "postcss-import": "^11.0.0", 53 | "postcss-loader": "^2.0.8", 54 | "postcss-url": "^7.2.1", 55 | "rimraf": "^2.6.0", 56 | "semver": "^5.3.0", 57 | "shelljs": "^0.7.6", 58 | "uglifyjs-webpack-plugin": "^1.1.1", 59 | "url-loader": "^2.2.0", 60 | "vue-loader": "^13.3.0", 61 | "vue-style-loader": "^3.0.1", 62 | "vue-template-compiler": "^2.5.2", 63 | "webpack": "^3.6.0", 64 | "webpack-bundle-analyzer": "^3.6.0", 65 | "webpack-dev-server": "^2.9.1", 66 | "webpack-merge": "^4.1.0" 67 | }, 68 | "engines": { 69 | "node": ">= 6.0.0", 70 | "npm": ">= 3.0.0" 71 | }, 72 | "browserslist": [ 73 | "> 1%", 74 | "last 2 versions", 75 | "not ie <= 8" 76 | ] 77 | } 78 | -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 12 | -------------------------------------------------------------------------------- /src/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/waltyou/spark-sql-online-editor/c8b049b2745b4252cc6021fce28b82f5bd69d2c8/src/assets/logo.png -------------------------------------------------------------------------------- /src/components/SelfsqlEditor.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 51 | 52 | 58 | -------------------------------------------------------------------------------- /src/components/SparksqlEditor.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 50 | 51 | 57 | -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | // The Vue build version to load with the `import` command 2 | // (runtime-only or standalone) has been set in webpack.base.conf with an alias. 3 | import Vue from 'vue' 4 | import App from './App' 5 | import router from './router' 6 | import VueCodemirror from 'vue-codemirror' 7 | // require styles 8 | import 'codemirror/lib/codemirror.css' 9 | // require more codemirror resource... 10 | 11 | // you can set default global options and events when use 12 | Vue.use(VueCodemirror /* { 13 | options: { theme: 'base16-dark', ... }, 14 | events: ['scroll', ...] 15 | } */) 16 | 17 | Vue.config.productionTip = false 18 | 19 | /* eslint-disable no-new */ 20 | new Vue({ 21 | el: '#app', 22 | router, 23 | components: { App }, 24 | template: '' 25 | }) 26 | -------------------------------------------------------------------------------- /src/plugins/axiosPlugin.js: -------------------------------------------------------------------------------- 1 | import axios from 'axios' 2 | import { 3 | Message 4 | } from 'element-ui' 5 | 6 | // axios config 7 | axios.defaults.baseURL = '/api' 8 | 9 | const Axios = axios.create({ 10 | baseURL: '/', // remember to do reverse proxy 11 | timeout: 10000, 12 | responseType: 'json', 13 | // set withCredentials to true will make axios send request with cookie 14 | withCredentials: true 15 | }) 16 | 17 | // request interceptor 18 | Axios.interceptors.request.use( 19 | config => { 20 | return config 21 | }, 22 | error => { 23 | Message({ 24 | showClose: true, 25 | message: error.data.err_msg ? error.data.err_msg : error.data, 26 | type: 'error' 27 | }) 28 | return Promise.reject(error) 29 | } 30 | ) 31 | 32 | export default Axios 33 | -------------------------------------------------------------------------------- /src/router/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Router from 'vue-router' 3 | import SparksqlEditor from '@/components/SparksqlEditor' 4 | import SelfsqlEditor from '@/components/SelfsqlEditor' 5 | 6 | Vue.use(Router) 7 | 8 | export default new Router({ 9 | routes: [ 10 | { 11 | path: '/', 12 | name: 'SparksqlEditor', 13 | component: SparksqlEditor 14 | }, 15 | { 16 | path: '/selfsql', 17 | name: 'SelfsqlEditor', 18 | component: SelfsqlEditor 19 | } 20 | ] 21 | }) 22 | -------------------------------------------------------------------------------- /src/selfsql/selfsql.js: -------------------------------------------------------------------------------- 1 | import CodeMirror from 'codemirror' 2 | 3 | // turn a space-separated list into an array 4 | function set (str) { 5 | var obj = {} 6 | var words = str.split(' ') 7 | for (var i = 0; i < words.length; ++i) obj[words[i]] = true 8 | return obj 9 | } 10 | 11 | var defaultBuiltin = 'tinyint smallint int bigint boolean float double string binary timestamp decimal array map struct uniontype delimited serde sequencefile textfile rcfile inputformat outputformat' 12 | var sparklSqlKeywords = 'add after all alter analyze and anti archive array as asc at between bucket buckets by cache cascade case cast change clear cluster clustered codegen collection column columns comment commit compact compactions compute concatenate cost create cross cube current current_date current_timestamp database databases datata dbproperties defined delete delimited deny desc describe dfs directories distinct distribute drop else end escaped except exchange exists explain export extended external false fields fileformat first following for format formatted from full function functions global grant group grouping having if ignore import in index indexes inner inpath inputformat insert intersect interval into is items join keys last lateral lazy left like limit lines list load local location lock locks logical macro map minus msck natural no not null nulls of on optimize option options or order out outer outputformat over overwrite partition partitioned partitions percent preceding principals purge range recordreader recordwriter recover reduce refresh regexp rename repair replace reset restrict revoke right rlike role roles rollback rollup row rows schema schemas select semi separated serde serdeproperties set sets show skewed sort sorted start statistics stored stratify struct table tables tablesample tblproperties temp temporary terminated then to touch transaction transactions transform true truncate unarchive unbounded uncache union unlock unset use using values view when where window with' 13 | // ====================== self defined keywords ================================ 14 | var selfsqlLoadType = 'pig parquet csv json avro' 15 | var selfsqlAllKeywords = defaultBuiltin + ' ' + sparklSqlKeywords + ' ' + selfsqlLoadType 16 | 17 | CodeMirror.defineMIME('text/x-selfsql', { 18 | name: 'sql', 19 | keywords: set(selfsqlAllKeywords) 20 | }) 21 | -------------------------------------------------------------------------------- /src/sparkSql/ParseErrorListener.js: -------------------------------------------------------------------------------- 1 | const antlr4 = require('antlr4') 2 | 3 | var ParseErrorListener = function () { 4 | antlr4.error.ErrorListener.call(this) 5 | this.annotations = [] 6 | return this 7 | } 8 | 9 | ParseErrorListener.prototype = Object.create(antlr4.error.ErrorListener.prototype) 10 | ParseErrorListener.prototype.constructor = ParseErrorListener 11 | 12 | ParseErrorListener.prototype.syntaxError = function (recognizer, offendingSymbol, line, column, msg, e) { 13 | this.annotations.push({ 14 | row: line - 1, 15 | col: column, 16 | text: msg 17 | }) 18 | } 19 | 20 | ParseErrorListener.prototype.getErrors = function () { 21 | return this.annotations 22 | } 23 | 24 | export { 25 | ParseErrorListener 26 | } 27 | -------------------------------------------------------------------------------- /src/sparkSql/SqlBase.tokens: -------------------------------------------------------------------------------- 1 | T__0=1 2 | T__1=2 3 | T__2=3 4 | T__3=4 5 | T__4=5 6 | T__5=6 7 | T__6=7 8 | T__7=8 9 | T__8=9 10 | T__9=10 11 | ADD=11 12 | AFTER=12 13 | ALL=13 14 | ALTER=14 15 | ANALYZE=15 16 | AND=16 17 | ANTI=17 18 | ANY=18 19 | ARCHIVE=19 20 | ARRAY=20 21 | AS=21 22 | ASC=22 23 | AT=23 24 | AUTHORIZATION=24 25 | BETWEEN=25 26 | BOTH=26 27 | BUCKET=27 28 | BUCKETS=28 29 | BY=29 30 | CACHE=30 31 | CASCADE=31 32 | CASE=32 33 | CAST=33 34 | CHANGE=34 35 | CHECK=35 36 | CLEAR=36 37 | CLUSTER=37 38 | CLUSTERED=38 39 | CODEGEN=39 40 | COLLATE=40 41 | COLLECTION=41 42 | COLUMN=42 43 | COLUMNS=43 44 | COMMENT=44 45 | COMMIT=45 46 | COMPACT=46 47 | COMPACTIONS=47 48 | COMPUTE=48 49 | CONCATENATE=49 50 | CONSTRAINT=50 51 | COST=51 52 | CREATE=52 53 | CROSS=53 54 | CUBE=54 55 | CURRENT=55 56 | CURRENT_DATE=56 57 | CURRENT_TIME=57 58 | CURRENT_TIMESTAMP=58 59 | CURRENT_USER=59 60 | DATA=60 61 | DATABASE=61 62 | DATABASES=62 63 | DAY=63 64 | DAYS=64 65 | DBPROPERTIES=65 66 | DEFINED=66 67 | DELETE=67 68 | DELIMITED=68 69 | DESC=69 70 | DESCRIBE=70 71 | DFS=71 72 | DIRECTORIES=72 73 | DIRECTORY=73 74 | DISTINCT=74 75 | DISTRIBUTE=75 76 | DROP=76 77 | ELSE=77 78 | END=78 79 | ESCAPED=79 80 | EXCEPT=80 81 | EXCHANGE=81 82 | EXISTS=82 83 | EXPLAIN=83 84 | EXPORT=84 85 | EXTENDED=85 86 | EXTERNAL=86 87 | EXTRACT=87 88 | FALSE=88 89 | FETCH=89 90 | FIELDS=90 91 | FILEFORMAT=91 92 | FIRST=92 93 | FIRST_VALUE=93 94 | FOLLOWING=94 95 | FOR=95 96 | FOREIGN=96 97 | FORMAT=97 98 | FORMATTED=98 99 | FROM=99 100 | FULL=100 101 | FUNCTION=101 102 | FUNCTIONS=102 103 | GLOBAL=103 104 | GRANT=104 105 | GROUP=105 106 | GROUPING=106 107 | HAVING=107 108 | HOUR=108 109 | HOURS=109 110 | IF=110 111 | IGNORE=111 112 | IMPORT=112 113 | IN=113 114 | INDEX=114 115 | INDEXES=115 116 | INNER=116 117 | INPATH=117 118 | INPUTFORMAT=118 119 | INSERT=119 120 | INTERSECT=120 121 | INTERVAL=121 122 | INTO=122 123 | IS=123 124 | ITEMS=124 125 | JOIN=125 126 | KEYS=126 127 | LAST=127 128 | LAST_VALUE=128 129 | LATERAL=129 130 | LAZY=130 131 | LEADING=131 132 | LEFT=132 133 | LIKE=133 134 | LIMIT=134 135 | LINES=135 136 | LIST=136 137 | LOAD=137 138 | LOCAL=138 139 | LOCATION=139 140 | LOCK=140 141 | LOCKS=141 142 | LOGICAL=142 143 | MACRO=143 144 | MAP=144 145 | MICROSECOND=145 146 | MICROSECONDS=146 147 | MILLISECOND=147 148 | MILLISECONDS=148 149 | MINUTE=149 150 | MINUTES=150 151 | MONTH=151 152 | MONTHS=152 153 | MSCK=153 154 | NAMESPACE=154 155 | NAMESPACES=155 156 | NATURAL=156 157 | NO=157 158 | NOT=158 159 | NULL=159 160 | NULLS=160 161 | OF=161 162 | ON=162 163 | ONLY=163 164 | OPTION=164 165 | OPTIONS=165 166 | OR=166 167 | ORDER=167 168 | OUT=168 169 | OUTER=169 170 | OUTPUTFORMAT=170 171 | OVER=171 172 | OVERLAPS=172 173 | OVERLAY=173 174 | OVERWRITE=174 175 | PARTITION=175 176 | PARTITIONED=176 177 | PARTITIONS=177 178 | PERCENTLIT=178 179 | PIVOT=179 180 | PLACING=180 181 | POSITION=181 182 | PRECEDING=182 183 | PRIMARY=183 184 | PRINCIPALS=184 185 | PURGE=185 186 | QUERY=186 187 | RANGE=187 188 | RECORDREADER=188 189 | RECORDWRITER=189 190 | RECOVER=190 191 | REDUCE=191 192 | REFERENCES=192 193 | REFRESH=193 194 | RENAME=194 195 | REPAIR=195 196 | REPLACE=196 197 | RESET=197 198 | RESPECT=198 199 | RESTRICT=199 200 | REVOKE=200 201 | RIGHT=201 202 | RLIKE=202 203 | ROLE=203 204 | ROLES=204 205 | ROLLBACK=205 206 | ROLLUP=206 207 | ROW=207 208 | ROWS=208 209 | SCHEMA=209 210 | SECOND=210 211 | SECONDS=211 212 | SELECT=212 213 | SEMI=213 214 | SEPARATED=214 215 | SERDE=215 216 | SERDEPROPERTIES=216 217 | SESSION_USER=217 218 | SET=218 219 | SETMINUS=219 220 | SETS=220 221 | SHOW=221 222 | SKEWED=222 223 | SOME=223 224 | SORT=224 225 | SORTED=225 226 | START=226 227 | STATISTICS=227 228 | STORED=228 229 | STRATIFY=229 230 | STRUCT=230 231 | SUBSTR=231 232 | SUBSTRING=232 233 | TABLE=233 234 | TABLES=234 235 | TABLESAMPLE=235 236 | TBLPROPERTIES=236 237 | TEMPORARY=237 238 | TERMINATED=238 239 | THEN=239 240 | TO=240 241 | TOUCH=241 242 | TRAILING=242 243 | TRANSACTION=243 244 | TRANSACTIONS=244 245 | TRANSFORM=245 246 | TRIM=246 247 | TRUE=247 248 | TRUNCATE=248 249 | TYPE=249 250 | UNARCHIVE=250 251 | UNBOUNDED=251 252 | UNCACHE=252 253 | UNION=253 254 | UNIQUE=254 255 | UNKNOWN=255 256 | UNLOCK=256 257 | UNSET=257 258 | UPDATE=258 259 | USE=259 260 | USER=260 261 | USING=261 262 | VALUES=262 263 | VIEW=263 264 | WEEK=264 265 | WEEKS=265 266 | WHEN=266 267 | WHERE=267 268 | WINDOW=268 269 | WITH=269 270 | YEAR=270 271 | YEARS=271 272 | EQ=272 273 | NSEQ=273 274 | NEQ=274 275 | NEQJ=275 276 | LT=276 277 | LTE=277 278 | GT=278 279 | GTE=279 280 | PLUS=280 281 | MINUS=281 282 | ASTERISK=282 283 | SLASH=283 284 | PERCENT=284 285 | DIV=285 286 | TILDE=286 287 | AMPERSAND=287 288 | PIPE=288 289 | CONCAT_PIPE=289 290 | HAT=290 291 | STRING=291 292 | BIGINT_LITERAL=292 293 | SMALLINT_LITERAL=293 294 | TINYINT_LITERAL=294 295 | INTEGER_VALUE=295 296 | DECIMAL_VALUE=296 297 | DOUBLE_LITERAL=297 298 | BIGDECIMAL_LITERAL=298 299 | IDENTIFIER=299 300 | BACKQUOTED_IDENTIFIER=300 301 | SIMPLE_COMMENT=301 302 | BRACKETED_EMPTY_COMMENT=302 303 | BRACKETED_COMMENT=303 304 | WS=304 305 | UNRECOGNIZED=305 306 | '('=1 307 | ')'=2 308 | ','=3 309 | '.'=4 310 | '/*+'=5 311 | '*/'=6 312 | '->'=7 313 | '['=8 314 | ']'=9 315 | ':'=10 316 | 'ADD'=11 317 | 'AFTER'=12 318 | 'ALL'=13 319 | 'ALTER'=14 320 | 'ANALYZE'=15 321 | 'AND'=16 322 | 'ANTI'=17 323 | 'ANY'=18 324 | 'ARCHIVE'=19 325 | 'ARRAY'=20 326 | 'AS'=21 327 | 'ASC'=22 328 | 'AT'=23 329 | 'AUTHORIZATION'=24 330 | 'BETWEEN'=25 331 | 'BOTH'=26 332 | 'BUCKET'=27 333 | 'BUCKETS'=28 334 | 'BY'=29 335 | 'CACHE'=30 336 | 'CASCADE'=31 337 | 'CASE'=32 338 | 'CAST'=33 339 | 'CHANGE'=34 340 | 'CHECK'=35 341 | 'CLEAR'=36 342 | 'CLUSTER'=37 343 | 'CLUSTERED'=38 344 | 'CODEGEN'=39 345 | 'COLLATE'=40 346 | 'COLLECTION'=41 347 | 'COLUMN'=42 348 | 'COLUMNS'=43 349 | 'COMMENT'=44 350 | 'COMMIT'=45 351 | 'COMPACT'=46 352 | 'COMPACTIONS'=47 353 | 'COMPUTE'=48 354 | 'CONCATENATE'=49 355 | 'CONSTRAINT'=50 356 | 'COST'=51 357 | 'CREATE'=52 358 | 'CROSS'=53 359 | 'CUBE'=54 360 | 'CURRENT'=55 361 | 'CURRENT_DATE'=56 362 | 'CURRENT_TIME'=57 363 | 'CURRENT_TIMESTAMP'=58 364 | 'CURRENT_USER'=59 365 | 'DATA'=60 366 | 'DATABASE'=61 367 | 'DAY'=63 368 | 'DAYS'=64 369 | 'DBPROPERTIES'=65 370 | 'DEFINED'=66 371 | 'DELETE'=67 372 | 'DELIMITED'=68 373 | 'DESC'=69 374 | 'DESCRIBE'=70 375 | 'DFS'=71 376 | 'DIRECTORIES'=72 377 | 'DIRECTORY'=73 378 | 'DISTINCT'=74 379 | 'DISTRIBUTE'=75 380 | 'DROP'=76 381 | 'ELSE'=77 382 | 'END'=78 383 | 'ESCAPED'=79 384 | 'EXCEPT'=80 385 | 'EXCHANGE'=81 386 | 'EXISTS'=82 387 | 'EXPLAIN'=83 388 | 'EXPORT'=84 389 | 'EXTENDED'=85 390 | 'EXTERNAL'=86 391 | 'EXTRACT'=87 392 | 'FALSE'=88 393 | 'FETCH'=89 394 | 'FIELDS'=90 395 | 'FILEFORMAT'=91 396 | 'FIRST'=92 397 | 'FIRST_VALUE'=93 398 | 'FOLLOWING'=94 399 | 'FOR'=95 400 | 'FOREIGN'=96 401 | 'FORMAT'=97 402 | 'FORMATTED'=98 403 | 'FROM'=99 404 | 'FULL'=100 405 | 'FUNCTION'=101 406 | 'FUNCTIONS'=102 407 | 'GLOBAL'=103 408 | 'GRANT'=104 409 | 'GROUP'=105 410 | 'GROUPING'=106 411 | 'HAVING'=107 412 | 'HOUR'=108 413 | 'HOURS'=109 414 | 'IF'=110 415 | 'IGNORE'=111 416 | 'IMPORT'=112 417 | 'IN'=113 418 | 'INDEX'=114 419 | 'INDEXES'=115 420 | 'INNER'=116 421 | 'INPATH'=117 422 | 'INPUTFORMAT'=118 423 | 'INSERT'=119 424 | 'INTERSECT'=120 425 | 'INTERVAL'=121 426 | 'INTO'=122 427 | 'IS'=123 428 | 'ITEMS'=124 429 | 'JOIN'=125 430 | 'KEYS'=126 431 | 'LAST'=127 432 | 'LAST_VALUE'=128 433 | 'LATERAL'=129 434 | 'LAZY'=130 435 | 'LEADING'=131 436 | 'LEFT'=132 437 | 'LIKE'=133 438 | 'LIMIT'=134 439 | 'LINES'=135 440 | 'LIST'=136 441 | 'LOAD'=137 442 | 'LOCAL'=138 443 | 'LOCATION'=139 444 | 'LOCK'=140 445 | 'LOCKS'=141 446 | 'LOGICAL'=142 447 | 'MACRO'=143 448 | 'MAP'=144 449 | 'MICROSECOND'=145 450 | 'MICROSECONDS'=146 451 | 'MILLISECOND'=147 452 | 'MILLISECONDS'=148 453 | 'MINUTE'=149 454 | 'MINUTES'=150 455 | 'MONTH'=151 456 | 'MONTHS'=152 457 | 'MSCK'=153 458 | 'NAMESPACE'=154 459 | 'NAMESPACES'=155 460 | 'NATURAL'=156 461 | 'NO'=157 462 | 'NULL'=159 463 | 'NULLS'=160 464 | 'OF'=161 465 | 'ON'=162 466 | 'ONLY'=163 467 | 'OPTION'=164 468 | 'OPTIONS'=165 469 | 'OR'=166 470 | 'ORDER'=167 471 | 'OUT'=168 472 | 'OUTER'=169 473 | 'OUTPUTFORMAT'=170 474 | 'OVER'=171 475 | 'OVERLAPS'=172 476 | 'OVERLAY'=173 477 | 'OVERWRITE'=174 478 | 'PARTITION'=175 479 | 'PARTITIONED'=176 480 | 'PARTITIONS'=177 481 | 'PERCENT'=178 482 | 'PIVOT'=179 483 | 'PLACING'=180 484 | 'POSITION'=181 485 | 'PRECEDING'=182 486 | 'PRIMARY'=183 487 | 'PRINCIPALS'=184 488 | 'PURGE'=185 489 | 'QUERY'=186 490 | 'RANGE'=187 491 | 'RECORDREADER'=188 492 | 'RECORDWRITER'=189 493 | 'RECOVER'=190 494 | 'REDUCE'=191 495 | 'REFERENCES'=192 496 | 'REFRESH'=193 497 | 'RENAME'=194 498 | 'REPAIR'=195 499 | 'REPLACE'=196 500 | 'RESET'=197 501 | 'RESPECT'=198 502 | 'RESTRICT'=199 503 | 'REVOKE'=200 504 | 'RIGHT'=201 505 | 'ROLE'=203 506 | 'ROLES'=204 507 | 'ROLLBACK'=205 508 | 'ROLLUP'=206 509 | 'ROW'=207 510 | 'ROWS'=208 511 | 'SCHEMA'=209 512 | 'SECOND'=210 513 | 'SECONDS'=211 514 | 'SELECT'=212 515 | 'SEMI'=213 516 | 'SEPARATED'=214 517 | 'SERDE'=215 518 | 'SERDEPROPERTIES'=216 519 | 'SESSION_USER'=217 520 | 'SET'=218 521 | 'MINUS'=219 522 | 'SETS'=220 523 | 'SHOW'=221 524 | 'SKEWED'=222 525 | 'SOME'=223 526 | 'SORT'=224 527 | 'SORTED'=225 528 | 'START'=226 529 | 'STATISTICS'=227 530 | 'STORED'=228 531 | 'STRATIFY'=229 532 | 'STRUCT'=230 533 | 'SUBSTR'=231 534 | 'SUBSTRING'=232 535 | 'TABLE'=233 536 | 'TABLES'=234 537 | 'TABLESAMPLE'=235 538 | 'TBLPROPERTIES'=236 539 | 'TERMINATED'=238 540 | 'THEN'=239 541 | 'TO'=240 542 | 'TOUCH'=241 543 | 'TRAILING'=242 544 | 'TRANSACTION'=243 545 | 'TRANSACTIONS'=244 546 | 'TRANSFORM'=245 547 | 'TRIM'=246 548 | 'TRUE'=247 549 | 'TRUNCATE'=248 550 | 'TYPE'=249 551 | 'UNARCHIVE'=250 552 | 'UNBOUNDED'=251 553 | 'UNCACHE'=252 554 | 'UNION'=253 555 | 'UNIQUE'=254 556 | 'UNKNOWN'=255 557 | 'UNLOCK'=256 558 | 'UNSET'=257 559 | 'UPDATE'=258 560 | 'USE'=259 561 | 'USER'=260 562 | 'USING'=261 563 | 'VALUES'=262 564 | 'VIEW'=263 565 | 'WEEK'=264 566 | 'WEEKS'=265 567 | 'WHEN'=266 568 | 'WHERE'=267 569 | 'WINDOW'=268 570 | 'WITH'=269 571 | 'YEAR'=270 572 | 'YEARS'=271 573 | '<=>'=273 574 | '<>'=274 575 | '!='=275 576 | '<'=276 577 | '>'=278 578 | '+'=280 579 | '-'=281 580 | '*'=282 581 | '/'=283 582 | '%'=284 583 | 'DIV'=285 584 | '~'=286 585 | '&'=287 586 | '|'=288 587 | '||'=289 588 | '^'=290 589 | '/**/'=302 590 | -------------------------------------------------------------------------------- /src/sparkSql/SqlBaseLexer.interp: -------------------------------------------------------------------------------- 1 | token literal names: 2 | null 3 | '(' 4 | ')' 5 | ',' 6 | '.' 7 | '/*+' 8 | '*/' 9 | '->' 10 | '[' 11 | ']' 12 | ':' 13 | 'ADD' 14 | 'AFTER' 15 | 'ALL' 16 | 'ALTER' 17 | 'ANALYZE' 18 | 'AND' 19 | 'ANTI' 20 | 'ANY' 21 | 'ARCHIVE' 22 | 'ARRAY' 23 | 'AS' 24 | 'ASC' 25 | 'AT' 26 | 'AUTHORIZATION' 27 | 'BETWEEN' 28 | 'BOTH' 29 | 'BUCKET' 30 | 'BUCKETS' 31 | 'BY' 32 | 'CACHE' 33 | 'CASCADE' 34 | 'CASE' 35 | 'CAST' 36 | 'CHANGE' 37 | 'CHECK' 38 | 'CLEAR' 39 | 'CLUSTER' 40 | 'CLUSTERED' 41 | 'CODEGEN' 42 | 'COLLATE' 43 | 'COLLECTION' 44 | 'COLUMN' 45 | 'COLUMNS' 46 | 'COMMENT' 47 | 'COMMIT' 48 | 'COMPACT' 49 | 'COMPACTIONS' 50 | 'COMPUTE' 51 | 'CONCATENATE' 52 | 'CONSTRAINT' 53 | 'COST' 54 | 'CREATE' 55 | 'CROSS' 56 | 'CUBE' 57 | 'CURRENT' 58 | 'CURRENT_DATE' 59 | 'CURRENT_TIME' 60 | 'CURRENT_TIMESTAMP' 61 | 'CURRENT_USER' 62 | 'DATA' 63 | 'DATABASE' 64 | null 65 | 'DAY' 66 | 'DAYS' 67 | 'DBPROPERTIES' 68 | 'DEFINED' 69 | 'DELETE' 70 | 'DELIMITED' 71 | 'DESC' 72 | 'DESCRIBE' 73 | 'DFS' 74 | 'DIRECTORIES' 75 | 'DIRECTORY' 76 | 'DISTINCT' 77 | 'DISTRIBUTE' 78 | 'DROP' 79 | 'ELSE' 80 | 'END' 81 | 'ESCAPED' 82 | 'EXCEPT' 83 | 'EXCHANGE' 84 | 'EXISTS' 85 | 'EXPLAIN' 86 | 'EXPORT' 87 | 'EXTENDED' 88 | 'EXTERNAL' 89 | 'EXTRACT' 90 | 'FALSE' 91 | 'FETCH' 92 | 'FIELDS' 93 | 'FILEFORMAT' 94 | 'FIRST' 95 | 'FIRST_VALUE' 96 | 'FOLLOWING' 97 | 'FOR' 98 | 'FOREIGN' 99 | 'FORMAT' 100 | 'FORMATTED' 101 | 'FROM' 102 | 'FULL' 103 | 'FUNCTION' 104 | 'FUNCTIONS' 105 | 'GLOBAL' 106 | 'GRANT' 107 | 'GROUP' 108 | 'GROUPING' 109 | 'HAVING' 110 | 'HOUR' 111 | 'HOURS' 112 | 'IF' 113 | 'IGNORE' 114 | 'IMPORT' 115 | 'IN' 116 | 'INDEX' 117 | 'INDEXES' 118 | 'INNER' 119 | 'INPATH' 120 | 'INPUTFORMAT' 121 | 'INSERT' 122 | 'INTERSECT' 123 | 'INTERVAL' 124 | 'INTO' 125 | 'IS' 126 | 'ITEMS' 127 | 'JOIN' 128 | 'KEYS' 129 | 'LAST' 130 | 'LAST_VALUE' 131 | 'LATERAL' 132 | 'LAZY' 133 | 'LEADING' 134 | 'LEFT' 135 | 'LIKE' 136 | 'LIMIT' 137 | 'LINES' 138 | 'LIST' 139 | 'LOAD' 140 | 'LOCAL' 141 | 'LOCATION' 142 | 'LOCK' 143 | 'LOCKS' 144 | 'LOGICAL' 145 | 'MACRO' 146 | 'MAP' 147 | 'MICROSECOND' 148 | 'MICROSECONDS' 149 | 'MILLISECOND' 150 | 'MILLISECONDS' 151 | 'MINUTE' 152 | 'MINUTES' 153 | 'MONTH' 154 | 'MONTHS' 155 | 'MSCK' 156 | 'NAMESPACE' 157 | 'NAMESPACES' 158 | 'NATURAL' 159 | 'NO' 160 | null 161 | 'NULL' 162 | 'NULLS' 163 | 'OF' 164 | 'ON' 165 | 'ONLY' 166 | 'OPTION' 167 | 'OPTIONS' 168 | 'OR' 169 | 'ORDER' 170 | 'OUT' 171 | 'OUTER' 172 | 'OUTPUTFORMAT' 173 | 'OVER' 174 | 'OVERLAPS' 175 | 'OVERLAY' 176 | 'OVERWRITE' 177 | 'PARTITION' 178 | 'PARTITIONED' 179 | 'PARTITIONS' 180 | 'PERCENT' 181 | 'PIVOT' 182 | 'PLACING' 183 | 'POSITION' 184 | 'PRECEDING' 185 | 'PRIMARY' 186 | 'PRINCIPALS' 187 | 'PURGE' 188 | 'QUERY' 189 | 'RANGE' 190 | 'RECORDREADER' 191 | 'RECORDWRITER' 192 | 'RECOVER' 193 | 'REDUCE' 194 | 'REFERENCES' 195 | 'REFRESH' 196 | 'RENAME' 197 | 'REPAIR' 198 | 'REPLACE' 199 | 'RESET' 200 | 'RESPECT' 201 | 'RESTRICT' 202 | 'REVOKE' 203 | 'RIGHT' 204 | null 205 | 'ROLE' 206 | 'ROLES' 207 | 'ROLLBACK' 208 | 'ROLLUP' 209 | 'ROW' 210 | 'ROWS' 211 | 'SCHEMA' 212 | 'SECOND' 213 | 'SECONDS' 214 | 'SELECT' 215 | 'SEMI' 216 | 'SEPARATED' 217 | 'SERDE' 218 | 'SERDEPROPERTIES' 219 | 'SESSION_USER' 220 | 'SET' 221 | 'MINUS' 222 | 'SETS' 223 | 'SHOW' 224 | 'SKEWED' 225 | 'SOME' 226 | 'SORT' 227 | 'SORTED' 228 | 'START' 229 | 'STATISTICS' 230 | 'STORED' 231 | 'STRATIFY' 232 | 'STRUCT' 233 | 'SUBSTR' 234 | 'SUBSTRING' 235 | 'TABLE' 236 | 'TABLES' 237 | 'TABLESAMPLE' 238 | 'TBLPROPERTIES' 239 | null 240 | 'TERMINATED' 241 | 'THEN' 242 | 'TO' 243 | 'TOUCH' 244 | 'TRAILING' 245 | 'TRANSACTION' 246 | 'TRANSACTIONS' 247 | 'TRANSFORM' 248 | 'TRIM' 249 | 'TRUE' 250 | 'TRUNCATE' 251 | 'TYPE' 252 | 'UNARCHIVE' 253 | 'UNBOUNDED' 254 | 'UNCACHE' 255 | 'UNION' 256 | 'UNIQUE' 257 | 'UNKNOWN' 258 | 'UNLOCK' 259 | 'UNSET' 260 | 'UPDATE' 261 | 'USE' 262 | 'USER' 263 | 'USING' 264 | 'VALUES' 265 | 'VIEW' 266 | 'WEEK' 267 | 'WEEKS' 268 | 'WHEN' 269 | 'WHERE' 270 | 'WINDOW' 271 | 'WITH' 272 | 'YEAR' 273 | 'YEARS' 274 | null 275 | '<=>' 276 | '<>' 277 | '!=' 278 | '<' 279 | null 280 | '>' 281 | null 282 | '+' 283 | '-' 284 | '*' 285 | '/' 286 | '%' 287 | 'DIV' 288 | '~' 289 | '&' 290 | '|' 291 | '||' 292 | '^' 293 | null 294 | null 295 | null 296 | null 297 | null 298 | null 299 | null 300 | null 301 | null 302 | null 303 | null 304 | '/**/' 305 | null 306 | null 307 | null 308 | 309 | token symbolic names: 310 | null 311 | null 312 | null 313 | null 314 | null 315 | null 316 | null 317 | null 318 | null 319 | null 320 | null 321 | ADD 322 | AFTER 323 | ALL 324 | ALTER 325 | ANALYZE 326 | AND 327 | ANTI 328 | ANY 329 | ARCHIVE 330 | ARRAY 331 | AS 332 | ASC 333 | AT 334 | AUTHORIZATION 335 | BETWEEN 336 | BOTH 337 | BUCKET 338 | BUCKETS 339 | BY 340 | CACHE 341 | CASCADE 342 | CASE 343 | CAST 344 | CHANGE 345 | CHECK 346 | CLEAR 347 | CLUSTER 348 | CLUSTERED 349 | CODEGEN 350 | COLLATE 351 | COLLECTION 352 | COLUMN 353 | COLUMNS 354 | COMMENT 355 | COMMIT 356 | COMPACT 357 | COMPACTIONS 358 | COMPUTE 359 | CONCATENATE 360 | CONSTRAINT 361 | COST 362 | CREATE 363 | CROSS 364 | CUBE 365 | CURRENT 366 | CURRENT_DATE 367 | CURRENT_TIME 368 | CURRENT_TIMESTAMP 369 | CURRENT_USER 370 | DATA 371 | DATABASE 372 | DATABASES 373 | DAY 374 | DAYS 375 | DBPROPERTIES 376 | DEFINED 377 | DELETE 378 | DELIMITED 379 | DESC 380 | DESCRIBE 381 | DFS 382 | DIRECTORIES 383 | DIRECTORY 384 | DISTINCT 385 | DISTRIBUTE 386 | DROP 387 | ELSE 388 | END 389 | ESCAPED 390 | EXCEPT 391 | EXCHANGE 392 | EXISTS 393 | EXPLAIN 394 | EXPORT 395 | EXTENDED 396 | EXTERNAL 397 | EXTRACT 398 | FALSE 399 | FETCH 400 | FIELDS 401 | FILEFORMAT 402 | FIRST 403 | FIRST_VALUE 404 | FOLLOWING 405 | FOR 406 | FOREIGN 407 | FORMAT 408 | FORMATTED 409 | FROM 410 | FULL 411 | FUNCTION 412 | FUNCTIONS 413 | GLOBAL 414 | GRANT 415 | GROUP 416 | GROUPING 417 | HAVING 418 | HOUR 419 | HOURS 420 | IF 421 | IGNORE 422 | IMPORT 423 | IN 424 | INDEX 425 | INDEXES 426 | INNER 427 | INPATH 428 | INPUTFORMAT 429 | INSERT 430 | INTERSECT 431 | INTERVAL 432 | INTO 433 | IS 434 | ITEMS 435 | JOIN 436 | KEYS 437 | LAST 438 | LAST_VALUE 439 | LATERAL 440 | LAZY 441 | LEADING 442 | LEFT 443 | LIKE 444 | LIMIT 445 | LINES 446 | LIST 447 | LOAD 448 | LOCAL 449 | LOCATION 450 | LOCK 451 | LOCKS 452 | LOGICAL 453 | MACRO 454 | MAP 455 | MICROSECOND 456 | MICROSECONDS 457 | MILLISECOND 458 | MILLISECONDS 459 | MINUTE 460 | MINUTES 461 | MONTH 462 | MONTHS 463 | MSCK 464 | NAMESPACE 465 | NAMESPACES 466 | NATURAL 467 | NO 468 | NOT 469 | NULL 470 | NULLS 471 | OF 472 | ON 473 | ONLY 474 | OPTION 475 | OPTIONS 476 | OR 477 | ORDER 478 | OUT 479 | OUTER 480 | OUTPUTFORMAT 481 | OVER 482 | OVERLAPS 483 | OVERLAY 484 | OVERWRITE 485 | PARTITION 486 | PARTITIONED 487 | PARTITIONS 488 | PERCENTLIT 489 | PIVOT 490 | PLACING 491 | POSITION 492 | PRECEDING 493 | PRIMARY 494 | PRINCIPALS 495 | PURGE 496 | QUERY 497 | RANGE 498 | RECORDREADER 499 | RECORDWRITER 500 | RECOVER 501 | REDUCE 502 | REFERENCES 503 | REFRESH 504 | RENAME 505 | REPAIR 506 | REPLACE 507 | RESET 508 | RESPECT 509 | RESTRICT 510 | REVOKE 511 | RIGHT 512 | RLIKE 513 | ROLE 514 | ROLES 515 | ROLLBACK 516 | ROLLUP 517 | ROW 518 | ROWS 519 | SCHEMA 520 | SECOND 521 | SECONDS 522 | SELECT 523 | SEMI 524 | SEPARATED 525 | SERDE 526 | SERDEPROPERTIES 527 | SESSION_USER 528 | SET 529 | SETMINUS 530 | SETS 531 | SHOW 532 | SKEWED 533 | SOME 534 | SORT 535 | SORTED 536 | START 537 | STATISTICS 538 | STORED 539 | STRATIFY 540 | STRUCT 541 | SUBSTR 542 | SUBSTRING 543 | TABLE 544 | TABLES 545 | TABLESAMPLE 546 | TBLPROPERTIES 547 | TEMPORARY 548 | TERMINATED 549 | THEN 550 | TO 551 | TOUCH 552 | TRAILING 553 | TRANSACTION 554 | TRANSACTIONS 555 | TRANSFORM 556 | TRIM 557 | TRUE 558 | TRUNCATE 559 | TYPE 560 | UNARCHIVE 561 | UNBOUNDED 562 | UNCACHE 563 | UNION 564 | UNIQUE 565 | UNKNOWN 566 | UNLOCK 567 | UNSET 568 | UPDATE 569 | USE 570 | USER 571 | USING 572 | VALUES 573 | VIEW 574 | WEEK 575 | WEEKS 576 | WHEN 577 | WHERE 578 | WINDOW 579 | WITH 580 | YEAR 581 | YEARS 582 | EQ 583 | NSEQ 584 | NEQ 585 | NEQJ 586 | LT 587 | LTE 588 | GT 589 | GTE 590 | PLUS 591 | MINUS 592 | ASTERISK 593 | SLASH 594 | PERCENT 595 | DIV 596 | TILDE 597 | AMPERSAND 598 | PIPE 599 | CONCAT_PIPE 600 | HAT 601 | STRING 602 | BIGINT_LITERAL 603 | SMALLINT_LITERAL 604 | TINYINT_LITERAL 605 | INTEGER_VALUE 606 | DECIMAL_VALUE 607 | DOUBLE_LITERAL 608 | BIGDECIMAL_LITERAL 609 | IDENTIFIER 610 | BACKQUOTED_IDENTIFIER 611 | SIMPLE_COMMENT 612 | BRACKETED_EMPTY_COMMENT 613 | BRACKETED_COMMENT 614 | WS 615 | UNRECOGNIZED 616 | 617 | rule names: 618 | T__0 619 | T__1 620 | T__2 621 | T__3 622 | T__4 623 | T__5 624 | T__6 625 | T__7 626 | T__8 627 | T__9 628 | ADD 629 | AFTER 630 | ALL 631 | ALTER 632 | ANALYZE 633 | AND 634 | ANTI 635 | ANY 636 | ARCHIVE 637 | ARRAY 638 | AS 639 | ASC 640 | AT 641 | AUTHORIZATION 642 | BETWEEN 643 | BOTH 644 | BUCKET 645 | BUCKETS 646 | BY 647 | CACHE 648 | CASCADE 649 | CASE 650 | CAST 651 | CHANGE 652 | CHECK 653 | CLEAR 654 | CLUSTER 655 | CLUSTERED 656 | CODEGEN 657 | COLLATE 658 | COLLECTION 659 | COLUMN 660 | COLUMNS 661 | COMMENT 662 | COMMIT 663 | COMPACT 664 | COMPACTIONS 665 | COMPUTE 666 | CONCATENATE 667 | CONSTRAINT 668 | COST 669 | CREATE 670 | CROSS 671 | CUBE 672 | CURRENT 673 | CURRENT_DATE 674 | CURRENT_TIME 675 | CURRENT_TIMESTAMP 676 | CURRENT_USER 677 | DATA 678 | DATABASE 679 | DATABASES 680 | DAY 681 | DAYS 682 | DBPROPERTIES 683 | DEFINED 684 | DELETE 685 | DELIMITED 686 | DESC 687 | DESCRIBE 688 | DFS 689 | DIRECTORIES 690 | DIRECTORY 691 | DISTINCT 692 | DISTRIBUTE 693 | DROP 694 | ELSE 695 | END 696 | ESCAPED 697 | EXCEPT 698 | EXCHANGE 699 | EXISTS 700 | EXPLAIN 701 | EXPORT 702 | EXTENDED 703 | EXTERNAL 704 | EXTRACT 705 | FALSE 706 | FETCH 707 | FIELDS 708 | FILEFORMAT 709 | FIRST 710 | FIRST_VALUE 711 | FOLLOWING 712 | FOR 713 | FOREIGN 714 | FORMAT 715 | FORMATTED 716 | FROM 717 | FULL 718 | FUNCTION 719 | FUNCTIONS 720 | GLOBAL 721 | GRANT 722 | GROUP 723 | GROUPING 724 | HAVING 725 | HOUR 726 | HOURS 727 | IF 728 | IGNORE 729 | IMPORT 730 | IN 731 | INDEX 732 | INDEXES 733 | INNER 734 | INPATH 735 | INPUTFORMAT 736 | INSERT 737 | INTERSECT 738 | INTERVAL 739 | INTO 740 | IS 741 | ITEMS 742 | JOIN 743 | KEYS 744 | LAST 745 | LAST_VALUE 746 | LATERAL 747 | LAZY 748 | LEADING 749 | LEFT 750 | LIKE 751 | LIMIT 752 | LINES 753 | LIST 754 | LOAD 755 | LOCAL 756 | LOCATION 757 | LOCK 758 | LOCKS 759 | LOGICAL 760 | MACRO 761 | MAP 762 | MICROSECOND 763 | MICROSECONDS 764 | MILLISECOND 765 | MILLISECONDS 766 | MINUTE 767 | MINUTES 768 | MONTH 769 | MONTHS 770 | MSCK 771 | NAMESPACE 772 | NAMESPACES 773 | NATURAL 774 | NO 775 | NOT 776 | NULL 777 | NULLS 778 | OF 779 | ON 780 | ONLY 781 | OPTION 782 | OPTIONS 783 | OR 784 | ORDER 785 | OUT 786 | OUTER 787 | OUTPUTFORMAT 788 | OVER 789 | OVERLAPS 790 | OVERLAY 791 | OVERWRITE 792 | PARTITION 793 | PARTITIONED 794 | PARTITIONS 795 | PERCENTLIT 796 | PIVOT 797 | PLACING 798 | POSITION 799 | PRECEDING 800 | PRIMARY 801 | PRINCIPALS 802 | PURGE 803 | QUERY 804 | RANGE 805 | RECORDREADER 806 | RECORDWRITER 807 | RECOVER 808 | REDUCE 809 | REFERENCES 810 | REFRESH 811 | RENAME 812 | REPAIR 813 | REPLACE 814 | RESET 815 | RESPECT 816 | RESTRICT 817 | REVOKE 818 | RIGHT 819 | RLIKE 820 | ROLE 821 | ROLES 822 | ROLLBACK 823 | ROLLUP 824 | ROW 825 | ROWS 826 | SCHEMA 827 | SECOND 828 | SECONDS 829 | SELECT 830 | SEMI 831 | SEPARATED 832 | SERDE 833 | SERDEPROPERTIES 834 | SESSION_USER 835 | SET 836 | SETMINUS 837 | SETS 838 | SHOW 839 | SKEWED 840 | SOME 841 | SORT 842 | SORTED 843 | START 844 | STATISTICS 845 | STORED 846 | STRATIFY 847 | STRUCT 848 | SUBSTR 849 | SUBSTRING 850 | TABLE 851 | TABLES 852 | TABLESAMPLE 853 | TBLPROPERTIES 854 | TEMPORARY 855 | TERMINATED 856 | THEN 857 | TO 858 | TOUCH 859 | TRAILING 860 | TRANSACTION 861 | TRANSACTIONS 862 | TRANSFORM 863 | TRIM 864 | TRUE 865 | TRUNCATE 866 | TYPE 867 | UNARCHIVE 868 | UNBOUNDED 869 | UNCACHE 870 | UNION 871 | UNIQUE 872 | UNKNOWN 873 | UNLOCK 874 | UNSET 875 | UPDATE 876 | USE 877 | USER 878 | USING 879 | VALUES 880 | VIEW 881 | WEEK 882 | WEEKS 883 | WHEN 884 | WHERE 885 | WINDOW 886 | WITH 887 | YEAR 888 | YEARS 889 | EQ 890 | NSEQ 891 | NEQ 892 | NEQJ 893 | LT 894 | LTE 895 | GT 896 | GTE 897 | PLUS 898 | MINUS 899 | ASTERISK 900 | SLASH 901 | PERCENT 902 | DIV 903 | TILDE 904 | AMPERSAND 905 | PIPE 906 | CONCAT_PIPE 907 | HAT 908 | STRING 909 | BIGINT_LITERAL 910 | SMALLINT_LITERAL 911 | TINYINT_LITERAL 912 | INTEGER_VALUE 913 | DECIMAL_VALUE 914 | DOUBLE_LITERAL 915 | BIGDECIMAL_LITERAL 916 | IDENTIFIER 917 | BACKQUOTED_IDENTIFIER 918 | DECIMAL_DIGITS 919 | EXPONENT 920 | DIGIT 921 | LETTER 922 | SIMPLE_COMMENT 923 | BRACKETED_EMPTY_COMMENT 924 | BRACKETED_COMMENT 925 | WS 926 | UNRECOGNIZED 927 | 928 | channel names: 929 | DEFAULT_TOKEN_CHANNEL 930 | HIDDEN 931 | 932 | mode names: 933 | DEFAULT_MODE 934 | 935 | atn: 936 | [3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 307, 2848, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, 81, 9, 81, 4, 82, 9, 82, 4, 83, 9, 83, 4, 84, 9, 84, 4, 85, 9, 85, 4, 86, 9, 86, 4, 87, 9, 87, 4, 88, 9, 88, 4, 89, 9, 89, 4, 90, 9, 90, 4, 91, 9, 91, 4, 92, 9, 92, 4, 93, 9, 93, 4, 94, 9, 94, 4, 95, 9, 95, 4, 96, 9, 96, 4, 97, 9, 97, 4, 98, 9, 98, 4, 99, 9, 99, 4, 100, 9, 100, 4, 101, 9, 101, 4, 102, 9, 102, 4, 103, 9, 103, 4, 104, 9, 104, 4, 105, 9, 105, 4, 106, 9, 106, 4, 107, 9, 107, 4, 108, 9, 108, 4, 109, 9, 109, 4, 110, 9, 110, 4, 111, 9, 111, 4, 112, 9, 112, 4, 113, 9, 113, 4, 114, 9, 114, 4, 115, 9, 115, 4, 116, 9, 116, 4, 117, 9, 117, 4, 118, 9, 118, 4, 119, 9, 119, 4, 120, 9, 120, 4, 121, 9, 121, 4, 122, 9, 122, 4, 123, 9, 123, 4, 124, 9, 124, 4, 125, 9, 125, 4, 126, 9, 126, 4, 127, 9, 127, 4, 128, 9, 128, 4, 129, 9, 129, 4, 130, 9, 130, 4, 131, 9, 131, 4, 132, 9, 132, 4, 133, 9, 133, 4, 134, 9, 134, 4, 135, 9, 135, 4, 136, 9, 136, 4, 137, 9, 137, 4, 138, 9, 138, 4, 139, 9, 139, 4, 140, 9, 140, 4, 141, 9, 141, 4, 142, 9, 142, 4, 143, 9, 143, 4, 144, 9, 144, 4, 145, 9, 145, 4, 146, 9, 146, 4, 147, 9, 147, 4, 148, 9, 148, 4, 149, 9, 149, 4, 150, 9, 150, 4, 151, 9, 151, 4, 152, 9, 152, 4, 153, 9, 153, 4, 154, 9, 154, 4, 155, 9, 155, 4, 156, 9, 156, 4, 157, 9, 157, 4, 158, 9, 158, 4, 159, 9, 159, 4, 160, 9, 160, 4, 161, 9, 161, 4, 162, 9, 162, 4, 163, 9, 163, 4, 164, 9, 164, 4, 165, 9, 165, 4, 166, 9, 166, 4, 167, 9, 167, 4, 168, 9, 168, 4, 169, 9, 169, 4, 170, 9, 170, 4, 171, 9, 171, 4, 172, 9, 172, 4, 173, 9, 173, 4, 174, 9, 174, 4, 175, 9, 175, 4, 176, 9, 176, 4, 177, 9, 177, 4, 178, 9, 178, 4, 179, 9, 179, 4, 180, 9, 180, 4, 181, 9, 181, 4, 182, 9, 182, 4, 183, 9, 183, 4, 184, 9, 184, 4, 185, 9, 185, 4, 186, 9, 186, 4, 187, 9, 187, 4, 188, 9, 188, 4, 189, 9, 189, 4, 190, 9, 190, 4, 191, 9, 191, 4, 192, 9, 192, 4, 193, 9, 193, 4, 194, 9, 194, 4, 195, 9, 195, 4, 196, 9, 196, 4, 197, 9, 197, 4, 198, 9, 198, 4, 199, 9, 199, 4, 200, 9, 200, 4, 201, 9, 201, 4, 202, 9, 202, 4, 203, 9, 203, 4, 204, 9, 204, 4, 205, 9, 205, 4, 206, 9, 206, 4, 207, 9, 207, 4, 208, 9, 208, 4, 209, 9, 209, 4, 210, 9, 210, 4, 211, 9, 211, 4, 212, 9, 212, 4, 213, 9, 213, 4, 214, 9, 214, 4, 215, 9, 215, 4, 216, 9, 216, 4, 217, 9, 217, 4, 218, 9, 218, 4, 219, 9, 219, 4, 220, 9, 220, 4, 221, 9, 221, 4, 222, 9, 222, 4, 223, 9, 223, 4, 224, 9, 224, 4, 225, 9, 225, 4, 226, 9, 226, 4, 227, 9, 227, 4, 228, 9, 228, 4, 229, 9, 229, 4, 230, 9, 230, 4, 231, 9, 231, 4, 232, 9, 232, 4, 233, 9, 233, 4, 234, 9, 234, 4, 235, 9, 235, 4, 236, 9, 236, 4, 237, 9, 237, 4, 238, 9, 238, 4, 239, 9, 239, 4, 240, 9, 240, 4, 241, 9, 241, 4, 242, 9, 242, 4, 243, 9, 243, 4, 244, 9, 244, 4, 245, 9, 245, 4, 246, 9, 246, 4, 247, 9, 247, 4, 248, 9, 248, 4, 249, 9, 249, 4, 250, 9, 250, 4, 251, 9, 251, 4, 252, 9, 252, 4, 253, 9, 253, 4, 254, 9, 254, 4, 255, 9, 255, 4, 256, 9, 256, 4, 257, 9, 257, 4, 258, 9, 258, 4, 259, 9, 259, 4, 260, 9, 260, 4, 261, 9, 261, 4, 262, 9, 262, 4, 263, 9, 263, 4, 264, 9, 264, 4, 265, 9, 265, 4, 266, 9, 266, 4, 267, 9, 267, 4, 268, 9, 268, 4, 269, 9, 269, 4, 270, 9, 270, 4, 271, 9, 271, 4, 272, 9, 272, 4, 273, 9, 273, 4, 274, 9, 274, 4, 275, 9, 275, 4, 276, 9, 276, 4, 277, 9, 277, 4, 278, 9, 278, 4, 279, 9, 279, 4, 280, 9, 280, 4, 281, 9, 281, 4, 282, 9, 282, 4, 283, 9, 283, 4, 284, 9, 284, 4, 285, 9, 285, 4, 286, 9, 286, 4, 287, 9, 287, 4, 288, 9, 288, 4, 289, 9, 289, 4, 290, 9, 290, 4, 291, 9, 291, 4, 292, 9, 292, 4, 293, 9, 293, 4, 294, 9, 294, 4, 295, 9, 295, 4, 296, 9, 296, 4, 297, 9, 297, 4, 298, 9, 298, 4, 299, 9, 299, 4, 300, 9, 300, 4, 301, 9, 301, 4, 302, 9, 302, 4, 303, 9, 303, 4, 304, 9, 304, 4, 305, 9, 305, 4, 306, 9, 306, 4, 307, 9, 307, 4, 308, 9, 308, 4, 309, 9, 309, 4, 310, 9, 310, 3, 2, 3, 2, 3, 3, 3, 3, 3, 4, 3, 4, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 10, 3, 10, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 38, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 62, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 5, 63, 1043, 10, 63, 3, 64, 3, 64, 3, 64, 3, 64, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 72, 3, 72, 3, 72, 3, 72, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 77, 3, 77, 3, 77, 3, 77, 3, 77, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 79, 3, 79, 3, 79, 3, 79, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 80, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 3, 83, 3, 83, 3, 83, 3, 83, 3, 83, 3, 83, 3, 83, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 84, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 85, 3, 86, 3, 86, 3, 86, 3, 86, 3, 86, 3, 86, 3, 86, 3, 86, 3, 86, 3, 87, 3, 87, 3, 87, 3, 87, 3, 87, 3, 87, 3, 87, 3, 87, 3, 87, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 88, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 89, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 91, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 92, 3, 93, 3, 93, 3, 93, 3, 93, 3, 93, 3, 93, 3, 94, 3, 94, 3, 94, 3, 94, 3, 94, 3, 94, 3, 94, 3, 94, 3, 94, 3, 94, 3, 94, 3, 94, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 95, 3, 96, 3, 96, 3, 96, 3, 96, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 97, 3, 98, 3, 98, 3, 98, 3, 98, 3, 98, 3, 98, 3, 98, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 99, 3, 100, 3, 100, 3, 100, 3, 100, 3, 100, 3, 101, 3, 101, 3, 101, 3, 101, 3, 101, 3, 102, 3, 102, 3, 102, 3, 102, 3, 102, 3, 102, 3, 102, 3, 102, 3, 102, 3, 103, 3, 103, 3, 103, 3, 103, 3, 103, 3, 103, 3, 103, 3, 103, 3, 103, 3, 103, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 105, 3, 105, 3, 105, 3, 105, 3, 105, 3, 105, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 107, 3, 107, 3, 107, 3, 107, 3, 107, 3, 107, 3, 107, 3, 107, 3, 107, 3, 108, 3, 108, 3, 108, 3, 108, 3, 108, 3, 108, 3, 108, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 110, 3, 110, 3, 110, 3, 110, 3, 110, 3, 110, 3, 111, 3, 111, 3, 111, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 112, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 113, 3, 114, 3, 114, 3, 114, 3, 115, 3, 115, 3, 115, 3, 115, 3, 115, 3, 115, 3, 116, 3, 116, 3, 116, 3, 116, 3, 116, 3, 116, 3, 116, 3, 116, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 3, 118, 3, 118, 3, 118, 3, 118, 3, 118, 3, 118, 3, 118, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 3, 119, 3, 120, 3, 120, 3, 120, 3, 120, 3, 120, 3, 120, 3, 120, 3, 121, 3, 121, 3, 121, 3, 121, 3, 121, 3, 121, 3, 121, 3, 121, 3, 121, 3, 121, 3, 122, 3, 122, 3, 122, 3, 122, 3, 122, 3, 122, 3, 122, 3, 122, 3, 122, 3, 123, 3, 123, 3, 123, 3, 123, 3, 123, 3, 124, 3, 124, 3, 124, 3, 125, 3, 125, 3, 125, 3, 125, 3, 125, 3, 125, 3, 126, 3, 126, 3, 126, 3, 126, 3, 126, 3, 127, 3, 127, 3, 127, 3, 127, 3, 127, 3, 128, 3, 128, 3, 128, 3, 128, 3, 128, 3, 129, 3, 129, 3, 129, 3, 129, 3, 129, 3, 129, 3, 129, 3, 129, 3, 129, 3, 129, 3, 129, 3, 130, 3, 130, 3, 130, 3, 130, 3, 130, 3, 130, 3, 130, 3, 130, 3, 131, 3, 131, 3, 131, 3, 131, 3, 131, 3, 132, 3, 132, 3, 132, 3, 132, 3, 132, 3, 132, 3, 132, 3, 132, 3, 133, 3, 133, 3, 133, 3, 133, 3, 133, 3, 134, 3, 134, 3, 134, 3, 134, 3, 134, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 136, 3, 136, 3, 136, 3, 136, 3, 136, 3, 136, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 138, 3, 138, 3, 138, 3, 138, 3, 138, 3, 139, 3, 139, 3, 139, 3, 139, 3, 139, 3, 139, 3, 140, 3, 140, 3, 140, 3, 140, 3, 140, 3, 140, 3, 140, 3, 140, 3, 140, 3, 141, 3, 141, 3, 141, 3, 141, 3, 141, 3, 142, 3, 142, 3, 142, 3, 142, 3, 142, 3, 142, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 3, 145, 3, 145, 3, 145, 3, 145, 3, 146, 3, 146, 3, 146, 3, 146, 3, 146, 3, 146, 3, 146, 3, 146, 3, 146, 3, 146, 3, 146, 3, 146, 3, 147, 3, 147, 3, 147, 3, 147, 3, 147, 3, 147, 3, 147, 3, 147, 3, 147, 3, 147, 3, 147, 3, 147, 3, 147, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 148, 3, 149, 3, 149, 3, 149, 3, 149, 3, 149, 3, 149, 3, 149, 3, 149, 3, 149, 3, 149, 3, 149, 3, 149, 3, 149, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 150, 3, 151, 3, 151, 3, 151, 3, 151, 3, 151, 3, 151, 3, 151, 3, 151, 3, 152, 3, 152, 3, 152, 3, 152, 3, 152, 3, 152, 3, 153, 3, 153, 3, 153, 3, 153, 3, 153, 3, 153, 3, 153, 3, 154, 3, 154, 3, 154, 3, 154, 3, 154, 3, 155, 3, 155, 3, 155, 3, 155, 3, 155, 3, 155, 3, 155, 3, 155, 3, 155, 3, 155, 3, 156, 3, 156, 3, 156, 3, 156, 3, 156, 3, 156, 3, 156, 3, 156, 3, 156, 3, 156, 3, 156, 3, 157, 3, 157, 3, 157, 3, 157, 3, 157, 3, 157, 3, 157, 3, 157, 3, 158, 3, 158, 3, 158, 3, 159, 3, 159, 3, 159, 3, 159, 5, 159, 1741, 10, 159, 3, 160, 3, 160, 3, 160, 3, 160, 3, 160, 3, 161, 3, 161, 3, 161, 3, 161, 3, 161, 3, 161, 3, 162, 3, 162, 3, 162, 3, 163, 3, 163, 3, 163, 3, 164, 3, 164, 3, 164, 3, 164, 3, 164, 3, 165, 3, 165, 3, 165, 3, 165, 3, 165, 3, 165, 3, 165, 3, 166, 3, 166, 3, 166, 3, 166, 3, 166, 3, 166, 3, 166, 3, 166, 3, 167, 3, 167, 3, 167, 3, 168, 3, 168, 3, 168, 3, 168, 3, 168, 3, 168, 3, 169, 3, 169, 3, 169, 3, 169, 3, 170, 3, 170, 3, 170, 3, 170, 3, 170, 3, 170, 3, 171, 3, 171, 3, 171, 3, 171, 3, 171, 3, 171, 3, 171, 3, 171, 3, 171, 3, 171, 3, 171, 3, 171, 3, 171, 3, 172, 3, 172, 3, 172, 3, 172, 3, 172, 3, 173, 3, 173, 3, 173, 3, 173, 3, 173, 3, 173, 3, 173, 3, 173, 3, 173, 3, 174, 3, 174, 3, 174, 3, 174, 3, 174, 3, 174, 3, 174, 3, 174, 3, 175, 3, 175, 3, 175, 3, 175, 3, 175, 3, 175, 3, 175, 3, 175, 3, 175, 3, 175, 3, 176, 3, 176, 3, 176, 3, 176, 3, 176, 3, 176, 3, 176, 3, 176, 3, 176, 3, 176, 3, 177, 3, 177, 3, 177, 3, 177, 3, 177, 3, 177, 3, 177, 3, 177, 3, 177, 3, 177, 3, 177, 3, 177, 3, 178, 3, 178, 3, 178, 3, 178, 3, 178, 3, 178, 3, 178, 3, 178, 3, 178, 3, 178, 3, 178, 3, 179, 3, 179, 3, 179, 3, 179, 3, 179, 3, 179, 3, 179, 3, 179, 3, 180, 3, 180, 3, 180, 3, 180, 3, 180, 3, 180, 3, 181, 3, 181, 3, 181, 3, 181, 3, 181, 3, 181, 3, 181, 3, 181, 3, 182, 3, 182, 3, 182, 3, 182, 3, 182, 3, 182, 3, 182, 3, 182, 3, 182, 3, 183, 3, 183, 3, 183, 3, 183, 3, 183, 3, 183, 3, 183, 3, 183, 3, 183, 3, 183, 3, 184, 3, 184, 3, 184, 3, 184, 3, 184, 3, 184, 3, 184, 3, 184, 3, 185, 3, 185, 3, 185, 3, 185, 3, 185, 3, 185, 3, 185, 3, 185, 3, 185, 3, 185, 3, 185, 3, 186, 3, 186, 3, 186, 3, 186, 3, 186, 3, 186, 3, 187, 3, 187, 3, 187, 3, 187, 3, 187, 3, 187, 3, 188, 3, 188, 3, 188, 3, 188, 3, 188, 3, 188, 3, 189, 3, 189, 3, 189, 3, 189, 3, 189, 3, 189, 3, 189, 3, 189, 3, 189, 3, 189, 3, 189, 3, 189, 3, 189, 3, 190, 3, 190, 3, 190, 3, 190, 3, 190, 3, 190, 3, 190, 3, 190, 3, 190, 3, 190, 3, 190, 3, 190, 3, 190, 3, 191, 3, 191, 3, 191, 3, 191, 3, 191, 3, 191, 3, 191, 3, 191, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 193, 3, 193, 3, 193, 3, 193, 3, 193, 3, 193, 3, 193, 3, 193, 3, 193, 3, 193, 3, 193, 3, 194, 3, 194, 3, 194, 3, 194, 3, 194, 3, 194, 3, 194, 3, 194, 3, 195, 3, 195, 3, 195, 3, 195, 3, 195, 3, 195, 3, 195, 3, 196, 3, 196, 3, 196, 3, 196, 3, 196, 3, 196, 3, 196, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 198, 3, 198, 3, 198, 3, 198, 3, 198, 3, 198, 3, 199, 3, 199, 3, 199, 3, 199, 3, 199, 3, 199, 3, 199, 3, 199, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 201, 3, 201, 3, 201, 3, 201, 3, 201, 3, 201, 3, 201, 3, 202, 3, 202, 3, 202, 3, 202, 3, 202, 3, 202, 3, 203, 3, 203, 3, 203, 3, 203, 3, 203, 3, 203, 3, 203, 3, 203, 3, 203, 3, 203, 3, 203, 5, 203, 2084, 10, 203, 3, 204, 3, 204, 3, 204, 3, 204, 3, 204, 3, 205, 3, 205, 3, 205, 3, 205, 3, 205, 3, 205, 3, 206, 3, 206, 3, 206, 3, 206, 3, 206, 3, 206, 3, 206, 3, 206, 3, 206, 3, 207, 3, 207, 3, 207, 3, 207, 3, 207, 3, 207, 3, 207, 3, 208, 3, 208, 3, 208, 3, 208, 3, 209, 3, 209, 3, 209, 3, 209, 3, 209, 3, 210, 3, 210, 3, 210, 3, 210, 3, 210, 3, 210, 3, 210, 3, 211, 3, 211, 3, 211, 3, 211, 3, 211, 3, 211, 3, 211, 3, 212, 3, 212, 3, 212, 3, 212, 3, 212, 3, 212, 3, 212, 3, 212, 3, 213, 3, 213, 3, 213, 3, 213, 3, 213, 3, 213, 3, 213, 3, 214, 3, 214, 3, 214, 3, 214, 3, 214, 3, 215, 3, 215, 3, 215, 3, 215, 3, 215, 3, 215, 3, 215, 3, 215, 3, 215, 3, 215, 3, 216, 3, 216, 3, 216, 3, 216, 3, 216, 3, 216, 3, 217, 3, 217, 3, 217, 3, 217, 3, 217, 3, 217, 3, 217, 3, 217, 3, 217, 3, 217, 3, 217, 3, 217, 3, 217, 3, 217, 3, 217, 3, 217, 3, 218, 3, 218, 3, 218, 3, 218, 3, 218, 3, 218, 3, 218, 3, 218, 3, 218, 3, 218, 3, 218, 3, 218, 3, 218, 3, 219, 3, 219, 3, 219, 3, 219, 3, 220, 3, 220, 3, 220, 3, 220, 3, 220, 3, 220, 3, 221, 3, 221, 3, 221, 3, 221, 3, 221, 3, 222, 3, 222, 3, 222, 3, 222, 3, 222, 3, 223, 3, 223, 3, 223, 3, 223, 3, 223, 3, 223, 3, 223, 3, 224, 3, 224, 3, 224, 3, 224, 3, 224, 3, 225, 3, 225, 3, 225, 3, 225, 3, 225, 3, 226, 3, 226, 3, 226, 3, 226, 3, 226, 3, 226, 3, 226, 3, 227, 3, 227, 3, 227, 3, 227, 3, 227, 3, 227, 3, 228, 3, 228, 3, 228, 3, 228, 3, 228, 3, 228, 3, 228, 3, 228, 3, 228, 3, 228, 3, 228, 3, 229, 3, 229, 3, 229, 3, 229, 3, 229, 3, 229, 3, 229, 3, 230, 3, 230, 3, 230, 3, 230, 3, 230, 3, 230, 3, 230, 3, 230, 3, 230, 3, 231, 3, 231, 3, 231, 3, 231, 3, 231, 3, 231, 3, 231, 3, 232, 3, 232, 3, 232, 3, 232, 3, 232, 3, 232, 3, 232, 3, 233, 3, 233, 3, 233, 3, 233, 3, 233, 3, 233, 3, 233, 3, 233, 3, 233, 3, 233, 3, 234, 3, 234, 3, 234, 3, 234, 3, 234, 3, 234, 3, 235, 3, 235, 3, 235, 3, 235, 3, 235, 3, 235, 3, 235, 3, 236, 3, 236, 3, 236, 3, 236, 3, 236, 3, 236, 3, 236, 3, 236, 3, 236, 3, 236, 3, 236, 3, 236, 3, 237, 3, 237, 3, 237, 3, 237, 3, 237, 3, 237, 3, 237, 3, 237, 3, 237, 3, 237, 3, 237, 3, 237, 3, 237, 3, 237, 3, 238, 3, 238, 3, 238, 3, 238, 3, 238, 3, 238, 3, 238, 3, 238, 3, 238, 3, 238, 3, 238, 3, 238, 3, 238, 5, 238, 2354, 10, 238, 3, 239, 3, 239, 3, 239, 3, 239, 3, 239, 3, 239, 3, 239, 3, 239, 3, 239, 3, 239, 3, 239, 3, 240, 3, 240, 3, 240, 3, 240, 3, 240, 3, 241, 3, 241, 3, 241, 3, 242, 3, 242, 3, 242, 3, 242, 3, 242, 3, 242, 3, 243, 3, 243, 3, 243, 3, 243, 3, 243, 3, 243, 3, 243, 3, 243, 3, 243, 3, 244, 3, 244, 3, 244, 3, 244, 3, 244, 3, 244, 3, 244, 3, 244, 3, 244, 3, 244, 3, 244, 3, 244, 3, 245, 3, 245, 3, 245, 3, 245, 3, 245, 3, 245, 3, 245, 3, 245, 3, 245, 3, 245, 3, 245, 3, 245, 3, 245, 3, 246, 3, 246, 3, 246, 3, 246, 3, 246, 3, 246, 3, 246, 3, 246, 3, 246, 3, 246, 3, 247, 3, 247, 3, 247, 3, 247, 3, 247, 3, 248, 3, 248, 3, 248, 3, 248, 3, 248, 3, 249, 3, 249, 3, 249, 3, 249, 3, 249, 3, 249, 3, 249, 3, 249, 3, 249, 3, 250, 3, 250, 3, 250, 3, 250, 3, 250, 3, 251, 3, 251, 3, 251, 3, 251, 3, 251, 3, 251, 3, 251, 3, 251, 3, 251, 3, 251, 3, 252, 3, 252, 3, 252, 3, 252, 3, 252, 3, 252, 3, 252, 3, 252, 3, 252, 3, 252, 3, 253, 3, 253, 3, 253, 3, 253, 3, 253, 3, 253, 3, 253, 3, 253, 3, 254, 3, 254, 3, 254, 3, 254, 3, 254, 3, 254, 3, 255, 3, 255, 3, 255, 3, 255, 3, 255, 3, 255, 3, 255, 3, 256, 3, 256, 3, 256, 3, 256, 3, 256, 3, 256, 3, 256, 3, 256, 3, 257, 3, 257, 3, 257, 3, 257, 3, 257, 3, 257, 3, 257, 3, 258, 3, 258, 3, 258, 3, 258, 3, 258, 3, 258, 3, 259, 3, 259, 3, 259, 3, 259, 3, 259, 3, 259, 3, 259, 3, 260, 3, 260, 3, 260, 3, 260, 3, 261, 3, 261, 3, 261, 3, 261, 3, 261, 3, 262, 3, 262, 3, 262, 3, 262, 3, 262, 3, 262, 3, 263, 3, 263, 3, 263, 3, 263, 3, 263, 3, 263, 3, 263, 3, 264, 3, 264, 3, 264, 3, 264, 3, 264, 3, 265, 3, 265, 3, 265, 3, 265, 3, 265, 3, 266, 3, 266, 3, 266, 3, 266, 3, 266, 3, 266, 3, 267, 3, 267, 3, 267, 3, 267, 3, 267, 3, 268, 3, 268, 3, 268, 3, 268, 3, 268, 3, 268, 3, 269, 3, 269, 3, 269, 3, 269, 3, 269, 3, 269, 3, 269, 3, 270, 3, 270, 3, 270, 3, 270, 3, 270, 3, 271, 3, 271, 3, 271, 3, 271, 3, 271, 3, 272, 3, 272, 3, 272, 3, 272, 3, 272, 3, 272, 3, 273, 3, 273, 3, 273, 5, 273, 2593, 10, 273, 3, 274, 3, 274, 3, 274, 3, 274, 3, 275, 3, 275, 3, 275, 3, 276, 3, 276, 3, 276, 3, 277, 3, 277, 3, 278, 3, 278, 3, 278, 3, 278, 5, 278, 2611, 10, 278, 3, 279, 3, 279, 3, 280, 3, 280, 3, 280, 3, 280, 5, 280, 2619, 10, 280, 3, 281, 3, 281, 3, 282, 3, 282, 3, 283, 3, 283, 3, 284, 3, 284, 3, 285, 3, 285, 3, 286, 3, 286, 3, 286, 3, 286, 3, 287, 3, 287, 3, 288, 3, 288, 3, 289, 3, 289, 3, 290, 3, 290, 3, 290, 3, 291, 3, 291, 3, 292, 3, 292, 3, 292, 3, 292, 7, 292, 2650, 10, 292, 12, 292, 14, 292, 2653, 11, 292, 3, 292, 3, 292, 3, 292, 3, 292, 3, 292, 7, 292, 2660, 10, 292, 12, 292, 14, 292, 2663, 11, 292, 3, 292, 5, 292, 2666, 10, 292, 3, 293, 6, 293, 2669, 10, 293, 13, 293, 14, 293, 2670, 3, 293, 3, 293, 3, 294, 6, 294, 2676, 10, 294, 13, 294, 14, 294, 2677, 3, 294, 3, 294, 3, 295, 6, 295, 2683, 10, 295, 13, 295, 14, 295, 2684, 3, 295, 3, 295, 3, 296, 6, 296, 2690, 10, 296, 13, 296, 14, 296, 2691, 3, 297, 6, 297, 2695, 10, 297, 13, 297, 14, 297, 2696, 3, 297, 3, 297, 3, 297, 3, 297, 5, 297, 2703, 10, 297, 3, 297, 3, 297, 5, 297, 2707, 10, 297, 3, 298, 6, 298, 2710, 10, 298, 13, 298, 14, 298, 2711, 3, 298, 5, 298, 2715, 10, 298, 3, 298, 3, 298, 3, 298, 3, 298, 5, 298, 2721, 10, 298, 3, 298, 3, 298, 3, 298, 5, 298, 2726, 10, 298, 3, 299, 6, 299, 2729, 10, 299, 13, 299, 14, 299, 2730, 3, 299, 5, 299, 2734, 10, 299, 3, 299, 3, 299, 3, 299, 3, 299, 3, 299, 5, 299, 2741, 10, 299, 3, 299, 3, 299, 3, 299, 3, 299, 3, 299, 5, 299, 2748, 10, 299, 3, 300, 3, 300, 3, 300, 6, 300, 2753, 10, 300, 13, 300, 14, 300, 2754, 3, 301, 3, 301, 3, 301, 3, 301, 7, 301, 2761, 10, 301, 12, 301, 14, 301, 2764, 11, 301, 3, 301, 3, 301, 3, 302, 6, 302, 2769, 10, 302, 13, 302, 14, 302, 2770, 3, 302, 3, 302, 7, 302, 2775, 10, 302, 12, 302, 14, 302, 2778, 11, 302, 3, 302, 3, 302, 6, 302, 2782, 10, 302, 13, 302, 14, 302, 2783, 5, 302, 2786, 10, 302, 3, 303, 3, 303, 5, 303, 2790, 10, 303, 3, 303, 6, 303, 2793, 10, 303, 13, 303, 14, 303, 2794, 3, 304, 3, 304, 3, 305, 3, 305, 3, 306, 3, 306, 3, 306, 3, 306, 7, 306, 2805, 10, 306, 12, 306, 14, 306, 2808, 11, 306, 3, 306, 5, 306, 2811, 10, 306, 3, 306, 5, 306, 2814, 10, 306, 3, 306, 3, 306, 3, 307, 3, 307, 3, 307, 3, 307, 3, 307, 3, 307, 3, 307, 3, 308, 3, 308, 3, 308, 3, 308, 3, 308, 7, 308, 2830, 10, 308, 12, 308, 14, 308, 2833, 11, 308, 3, 308, 3, 308, 3, 308, 3, 308, 3, 308, 3, 309, 6, 309, 2841, 10, 309, 13, 309, 14, 309, 2842, 3, 309, 3, 309, 3, 310, 3, 310, 3, 2831, 2, 311, 3, 3, 5, 4, 7, 5, 9, 6, 11, 7, 13, 8, 15, 9, 17, 10, 19, 11, 21, 12, 23, 13, 25, 14, 27, 15, 29, 16, 31, 17, 33, 18, 35, 19, 37, 20, 39, 21, 41, 22, 43, 23, 45, 24, 47, 25, 49, 26, 51, 27, 53, 28, 55, 29, 57, 30, 59, 31, 61, 32, 63, 33, 65, 34, 67, 35, 69, 36, 71, 37, 73, 38, 75, 39, 77, 40, 79, 41, 81, 42, 83, 43, 85, 44, 87, 45, 89, 46, 91, 47, 93, 48, 95, 49, 97, 50, 99, 51, 101, 52, 103, 53, 105, 54, 107, 55, 109, 56, 111, 57, 113, 58, 115, 59, 117, 60, 119, 61, 121, 62, 123, 63, 125, 64, 127, 65, 129, 66, 131, 67, 133, 68, 135, 69, 137, 70, 139, 71, 141, 72, 143, 73, 145, 74, 147, 75, 149, 76, 151, 77, 153, 78, 155, 79, 157, 80, 159, 81, 161, 82, 163, 83, 165, 84, 167, 85, 169, 86, 171, 87, 173, 88, 175, 89, 177, 90, 179, 91, 181, 92, 183, 93, 185, 94, 187, 95, 189, 96, 191, 97, 193, 98, 195, 99, 197, 100, 199, 101, 201, 102, 203, 103, 205, 104, 207, 105, 209, 106, 211, 107, 213, 108, 215, 109, 217, 110, 219, 111, 221, 112, 223, 113, 225, 114, 227, 115, 229, 116, 231, 117, 233, 118, 235, 119, 237, 120, 239, 121, 241, 122, 243, 123, 245, 124, 247, 125, 249, 126, 251, 127, 253, 128, 255, 129, 257, 130, 259, 131, 261, 132, 263, 133, 265, 134, 267, 135, 269, 136, 271, 137, 273, 138, 275, 139, 277, 140, 279, 141, 281, 142, 283, 143, 285, 144, 287, 145, 289, 146, 291, 147, 293, 148, 295, 149, 297, 150, 299, 151, 301, 152, 303, 153, 305, 154, 307, 155, 309, 156, 311, 157, 313, 158, 315, 159, 317, 160, 319, 161, 321, 162, 323, 163, 325, 164, 327, 165, 329, 166, 331, 167, 333, 168, 335, 169, 337, 170, 339, 171, 341, 172, 343, 173, 345, 174, 347, 175, 349, 176, 351, 177, 353, 178, 355, 179, 357, 180, 359, 181, 361, 182, 363, 183, 365, 184, 367, 185, 369, 186, 371, 187, 373, 188, 375, 189, 377, 190, 379, 191, 381, 192, 383, 193, 385, 194, 387, 195, 389, 196, 391, 197, 393, 198, 395, 199, 397, 200, 399, 201, 401, 202, 403, 203, 405, 204, 407, 205, 409, 206, 411, 207, 413, 208, 415, 209, 417, 210, 419, 211, 421, 212, 423, 213, 425, 214, 427, 215, 429, 216, 431, 217, 433, 218, 435, 219, 437, 220, 439, 221, 441, 222, 443, 223, 445, 224, 447, 225, 449, 226, 451, 227, 453, 228, 455, 229, 457, 230, 459, 231, 461, 232, 463, 233, 465, 234, 467, 235, 469, 236, 471, 237, 473, 238, 475, 239, 477, 240, 479, 241, 481, 242, 483, 243, 485, 244, 487, 245, 489, 246, 491, 247, 493, 248, 495, 249, 497, 250, 499, 251, 501, 252, 503, 253, 505, 254, 507, 255, 509, 256, 511, 257, 513, 258, 515, 259, 517, 260, 519, 261, 521, 262, 523, 263, 525, 264, 527, 265, 529, 266, 531, 267, 533, 268, 535, 269, 537, 270, 539, 271, 541, 272, 543, 273, 545, 274, 547, 275, 549, 276, 551, 277, 553, 278, 555, 279, 557, 280, 559, 281, 561, 282, 563, 283, 565, 284, 567, 285, 569, 286, 571, 287, 573, 288, 575, 289, 577, 290, 579, 291, 581, 292, 583, 293, 585, 294, 587, 295, 589, 296, 591, 297, 593, 298, 595, 299, 597, 300, 599, 301, 601, 302, 603, 2, 605, 2, 607, 2, 609, 2, 611, 303, 613, 304, 615, 305, 617, 306, 619, 307, 3, 2, 11, 4, 2, 41, 41, 94, 94, 4, 2, 36, 36, 94, 94, 3, 2, 98, 98, 4, 2, 45, 45, 47, 47, 3, 2, 50, 59, 3, 2, 67, 92, 4, 2, 12, 12, 15, 15, 3, 2, 45, 45, 5, 2, 11, 12, 15, 15, 34, 34, 2, 2886, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, 2, 2, 2, 25, 3, 2, 2, 2, 2, 27, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, 3, 2, 2, 2, 2, 61, 3, 2, 2, 2, 2, 63, 3, 2, 2, 2, 2, 65, 3, 2, 2, 2, 2, 67, 3, 2, 2, 2, 2, 69, 3, 2, 2, 2, 2, 71, 3, 2, 2, 2, 2, 73, 3, 2, 2, 2, 2, 75, 3, 2, 2, 2, 2, 77, 3, 2, 2, 2, 2, 79, 3, 2, 2, 2, 2, 81, 3, 2, 2, 2, 2, 83, 3, 2, 2, 2, 2, 85, 3, 2, 2, 2, 2, 87, 3, 2, 2, 2, 2, 89, 3, 2, 2, 2, 2, 91, 3, 2, 2, 2, 2, 93, 3, 2, 2, 2, 2, 95, 3, 2, 2, 2, 2, 97, 3, 2, 2, 2, 2, 99, 3, 2, 2, 2, 2, 101, 3, 2, 2, 2, 2, 103, 3, 2, 2, 2, 2, 105, 3, 2, 2, 2, 2, 107, 3, 2, 2, 2, 2, 109, 3, 2, 2, 2, 2, 111, 3, 2, 2, 2, 2, 113, 3, 2, 2, 2, 2, 115, 3, 2, 2, 2, 2, 117, 3, 2, 2, 2, 2, 119, 3, 2, 2, 2, 2, 121, 3, 2, 2, 2, 2, 123, 3, 2, 2, 2, 2, 125, 3, 2, 2, 2, 2, 127, 3, 2, 2, 2, 2, 129, 3, 2, 2, 2, 2, 131, 3, 2, 2, 2, 2, 133, 3, 2, 2, 2, 2, 135, 3, 2, 2, 2, 2, 137, 3, 2, 2, 2, 2, 139, 3, 2, 2, 2, 2, 141, 3, 2, 2, 2, 2, 143, 3, 2, 2, 2, 2, 145, 3, 2, 2, 2, 2, 147, 3, 2, 2, 2, 2, 149, 3, 2, 2, 2, 2, 151, 3, 2, 2, 2, 2, 153, 3, 2, 2, 2, 2, 155, 3, 2, 2, 2, 2, 157, 3, 2, 2, 2, 2, 159, 3, 2, 2, 2, 2, 161, 3, 2, 2, 2, 2, 163, 3, 2, 2, 2, 2, 165, 3, 2, 2, 2, 2, 167, 3, 2, 2, 2, 2, 169, 3, 2, 2, 2, 2, 171, 3, 2, 2, 2, 2, 173, 3, 2, 2, 2, 2, 175, 3, 2, 2, 2, 2, 177, 3, 2, 2, 2, 2, 179, 3, 2, 2, 2, 2, 181, 3, 2, 2, 2, 2, 183, 3, 2, 2, 2, 2, 185, 3, 2, 2, 2, 2, 187, 3, 2, 2, 2, 2, 189, 3, 2, 2, 2, 2, 191, 3, 2, 2, 2, 2, 193, 3, 2, 2, 2, 2, 195, 3, 2, 2, 2, 2, 197, 3, 2, 2, 2, 2, 199, 3, 2, 2, 2, 2, 201, 3, 2, 2, 2, 2, 203, 3, 2, 2, 2, 2, 205, 3, 2, 2, 2, 2, 207, 3, 2, 2, 2, 2, 209, 3, 2, 2, 2, 2, 211, 3, 2, 2, 2, 2, 213, 3, 2, 2, 2, 2, 215, 3, 2, 2, 2, 2, 217, 3, 2, 2, 2, 2, 219, 3, 2, 2, 2, 2, 221, 3, 2, 2, 2, 2, 223, 3, 2, 2, 2, 2, 225, 3, 2, 2, 2, 2, 227, 3, 2, 2, 2, 2, 229, 3, 2, 2, 2, 2, 231, 3, 2, 2, 2, 2, 233, 3, 2, 2, 2, 2, 235, 3, 2, 2, 2, 2, 237, 3, 2, 2, 2, 2, 239, 3, 2, 2, 2, 2, 241, 3, 2, 2, 2, 2, 243, 3, 2, 2, 2, 2, 245, 3, 2, 2, 2, 2, 247, 3, 2, 2, 2, 2, 249, 3, 2, 2, 2, 2, 251, 3, 2, 2, 2, 2, 253, 3, 2, 2, 2, 2, 255, 3, 2, 2, 2, 2, 257, 3, 2, 2, 2, 2, 259, 3, 2, 2, 2, 2, 261, 3, 2, 2, 2, 2, 263, 3, 2, 2, 2, 2, 265, 3, 2, 2, 2, 2, 267, 3, 2, 2, 2, 2, 269, 3, 2, 2, 2, 2, 271, 3, 2, 2, 2, 2, 273, 3, 2, 2, 2, 2, 275, 3, 2, 2, 2, 2, 277, 3, 2, 2, 2, 2, 279, 3, 2, 2, 2, 2, 281, 3, 2, 2, 2, 2, 283, 3, 2, 2, 2, 2, 285, 3, 2, 2, 2, 2, 287, 3, 2, 2, 2, 2, 289, 3, 2, 2, 2, 2, 291, 3, 2, 2, 2, 2, 293, 3, 2, 2, 2, 2, 295, 3, 2, 2, 2, 2, 297, 3, 2, 2, 2, 2, 299, 3, 2, 2, 2, 2, 301, 3, 2, 2, 2, 2, 303, 3, 2, 2, 2, 2, 305, 3, 2, 2, 2, 2, 307, 3, 2, 2, 2, 2, 309, 3, 2, 2, 2, 2, 311, 3, 2, 2, 2, 2, 313, 3, 2, 2, 2, 2, 315, 3, 2, 2, 2, 2, 317, 3, 2, 2, 2, 2, 319, 3, 2, 2, 2, 2, 321, 3, 2, 2, 2, 2, 323, 3, 2, 2, 2, 2, 325, 3, 2, 2, 2, 2, 327, 3, 2, 2, 2, 2, 329, 3, 2, 2, 2, 2, 331, 3, 2, 2, 2, 2, 333, 3, 2, 2, 2, 2, 335, 3, 2, 2, 2, 2, 337, 3, 2, 2, 2, 2, 339, 3, 2, 2, 2, 2, 341, 3, 2, 2, 2, 2, 343, 3, 2, 2, 2, 2, 345, 3, 2, 2, 2, 2, 347, 3, 2, 2, 2, 2, 349, 3, 2, 2, 2, 2, 351, 3, 2, 2, 2, 2, 353, 3, 2, 2, 2, 2, 355, 3, 2, 2, 2, 2, 357, 3, 2, 2, 2, 2, 359, 3, 2, 2, 2, 2, 361, 3, 2, 2, 2, 2, 363, 3, 2, 2, 2, 2, 365, 3, 2, 2, 2, 2, 367, 3, 2, 2, 2, 2, 369, 3, 2, 2, 2, 2, 371, 3, 2, 2, 2, 2, 373, 3, 2, 2, 2, 2, 375, 3, 2, 2, 2, 2, 377, 3, 2, 2, 2, 2, 379, 3, 2, 2, 2, 2, 381, 3, 2, 2, 2, 2, 383, 3, 2, 2, 2, 2, 385, 3, 2, 2, 2, 2, 387, 3, 2, 2, 2, 2, 389, 3, 2, 2, 2, 2, 391, 3, 2, 2, 2, 2, 393, 3, 2, 2, 2, 2, 395, 3, 2, 2, 2, 2, 397, 3, 2, 2, 2, 2, 399, 3, 2, 2, 2, 2, 401, 3, 2, 2, 2, 2, 403, 3, 2, 2, 2, 2, 405, 3, 2, 2, 2, 2, 407, 3, 2, 2, 2, 2, 409, 3, 2, 2, 2, 2, 411, 3, 2, 2, 2, 2, 413, 3, 2, 2, 2, 2, 415, 3, 2, 2, 2, 2, 417, 3, 2, 2, 2, 2, 419, 3, 2, 2, 2, 2, 421, 3, 2, 2, 2, 2, 423, 3, 2, 2, 2, 2, 425, 3, 2, 2, 2, 2, 427, 3, 2, 2, 2, 2, 429, 3, 2, 2, 2, 2, 431, 3, 2, 2, 2, 2, 433, 3, 2, 2, 2, 2, 435, 3, 2, 2, 2, 2, 437, 3, 2, 2, 2, 2, 439, 3, 2, 2, 2, 2, 441, 3, 2, 2, 2, 2, 443, 3, 2, 2, 2, 2, 445, 3, 2, 2, 2, 2, 447, 3, 2, 2, 2, 2, 449, 3, 2, 2, 2, 2, 451, 3, 2, 2, 2, 2, 453, 3, 2, 2, 2, 2, 455, 3, 2, 2, 2, 2, 457, 3, 2, 2, 2, 2, 459, 3, 2, 2, 2, 2, 461, 3, 2, 2, 2, 2, 463, 3, 2, 2, 2, 2, 465, 3, 2, 2, 2, 2, 467, 3, 2, 2, 2, 2, 469, 3, 2, 2, 2, 2, 471, 3, 2, 2, 2, 2, 473, 3, 2, 2, 2, 2, 475, 3, 2, 2, 2, 2, 477, 3, 2, 2, 2, 2, 479, 3, 2, 2, 2, 2, 481, 3, 2, 2, 2, 2, 483, 3, 2, 2, 2, 2, 485, 3, 2, 2, 2, 2, 487, 3, 2, 2, 2, 2, 489, 3, 2, 2, 2, 2, 491, 3, 2, 2, 2, 2, 493, 3, 2, 2, 2, 2, 495, 3, 2, 2, 2, 2, 497, 3, 2, 2, 2, 2, 499, 3, 2, 2, 2, 2, 501, 3, 2, 2, 2, 2, 503, 3, 2, 2, 2, 2, 505, 3, 2, 2, 2, 2, 507, 3, 2, 2, 2, 2, 509, 3, 2, 2, 2, 2, 511, 3, 2, 2, 2, 2, 513, 3, 2, 2, 2, 2, 515, 3, 2, 2, 2, 2, 517, 3, 2, 2, 2, 2, 519, 3, 2, 2, 2, 2, 521, 3, 2, 2, 2, 2, 523, 3, 2, 2, 2, 2, 525, 3, 2, 2, 2, 2, 527, 3, 2, 2, 2, 2, 529, 3, 2, 2, 2, 2, 531, 3, 2, 2, 2, 2, 533, 3, 2, 2, 2, 2, 535, 3, 2, 2, 2, 2, 537, 3, 2, 2, 2, 2, 539, 3, 2, 2, 2, 2, 541, 3, 2, 2, 2, 2, 543, 3, 2, 2, 2, 2, 545, 3, 2, 2, 2, 2, 547, 3, 2, 2, 2, 2, 549, 3, 2, 2, 2, 2, 551, 3, 2, 2, 2, 2, 553, 3, 2, 2, 2, 2, 555, 3, 2, 2, 2, 2, 557, 3, 2, 2, 2, 2, 559, 3, 2, 2, 2, 2, 561, 3, 2, 2, 2, 2, 563, 3, 2, 2, 2, 2, 565, 3, 2, 2, 2, 2, 567, 3, 2, 2, 2, 2, 569, 3, 2, 2, 2, 2, 571, 3, 2, 2, 2, 2, 573, 3, 2, 2, 2, 2, 575, 3, 2, 2, 2, 2, 577, 3, 2, 2, 2, 2, 579, 3, 2, 2, 2, 2, 581, 3, 2, 2, 2, 2, 583, 3, 2, 2, 2, 2, 585, 3, 2, 2, 2, 2, 587, 3, 2, 2, 2, 2, 589, 3, 2, 2, 2, 2, 591, 3, 2, 2, 2, 2, 593, 3, 2, 2, 2, 2, 595, 3, 2, 2, 2, 2, 597, 3, 2, 2, 2, 2, 599, 3, 2, 2, 2, 2, 601, 3, 2, 2, 2, 2, 611, 3, 2, 2, 2, 2, 613, 3, 2, 2, 2, 2, 615, 3, 2, 2, 2, 2, 617, 3, 2, 2, 2, 2, 619, 3, 2, 2, 2, 3, 621, 3, 2, 2, 2, 5, 623, 3, 2, 2, 2, 7, 625, 3, 2, 2, 2, 9, 627, 3, 2, 2, 2, 11, 629, 3, 2, 2, 2, 13, 633, 3, 2, 2, 2, 15, 636, 3, 2, 2, 2, 17, 639, 3, 2, 2, 2, 19, 641, 3, 2, 2, 2, 21, 643, 3, 2, 2, 2, 23, 645, 3, 2, 2, 2, 25, 649, 3, 2, 2, 2, 27, 655, 3, 2, 2, 2, 29, 659, 3, 2, 2, 2, 31, 665, 3, 2, 2, 2, 33, 673, 3, 2, 2, 2, 35, 677, 3, 2, 2, 2, 37, 682, 3, 2, 2, 2, 39, 686, 3, 2, 2, 2, 41, 694, 3, 2, 2, 2, 43, 700, 3, 2, 2, 2, 45, 703, 3, 2, 2, 2, 47, 707, 3, 2, 2, 2, 49, 710, 3, 2, 2, 2, 51, 724, 3, 2, 2, 2, 53, 732, 3, 2, 2, 2, 55, 737, 3, 2, 2, 2, 57, 744, 3, 2, 2, 2, 59, 752, 3, 2, 2, 2, 61, 755, 3, 2, 2, 2, 63, 761, 3, 2, 2, 2, 65, 769, 3, 2, 2, 2, 67, 774, 3, 2, 2, 2, 69, 779, 3, 2, 2, 2, 71, 786, 3, 2, 2, 2, 73, 792, 3, 2, 2, 2, 75, 798, 3, 2, 2, 2, 77, 806, 3, 2, 2, 2, 79, 816, 3, 2, 2, 2, 81, 824, 3, 2, 2, 2, 83, 832, 3, 2, 2, 2, 85, 843, 3, 2, 2, 2, 87, 850, 3, 2, 2, 2, 89, 858, 3, 2, 2, 2, 91, 866, 3, 2, 2, 2, 93, 873, 3, 2, 2, 2, 95, 881, 3, 2, 2, 2, 97, 893, 3, 2, 2, 2, 99, 901, 3, 2, 2, 2, 101, 913, 3, 2, 2, 2, 103, 924, 3, 2, 2, 2, 105, 929, 3, 2, 2, 2, 107, 936, 3, 2, 2, 2, 109, 942, 3, 2, 2, 2, 111, 947, 3, 2, 2, 2, 113, 955, 3, 2, 2, 2, 115, 968, 3, 2, 2, 2, 117, 981, 3, 2, 2, 2, 119, 999, 3, 2, 2, 2, 121, 1012, 3, 2, 2, 2, 123, 1017, 3, 2, 2, 2, 125, 1042, 3, 2, 2, 2, 127, 1044, 3, 2, 2, 2, 129, 1048, 3, 2, 2, 2, 131, 1053, 3, 2, 2, 2, 133, 1066, 3, 2, 2, 2, 135, 1074, 3, 2, 2, 2, 137, 1081, 3, 2, 2, 2, 139, 1091, 3, 2, 2, 2, 141, 1096, 3, 2, 2, 2, 143, 1105, 3, 2, 2, 2, 145, 1109, 3, 2, 2, 2, 147, 1121, 3, 2, 2, 2, 149, 1131, 3, 2, 2, 2, 151, 1140, 3, 2, 2, 2, 153, 1151, 3, 2, 2, 2, 155, 1156, 3, 2, 2, 2, 157, 1161, 3, 2, 2, 2, 159, 1165, 3, 2, 2, 2, 161, 1173, 3, 2, 2, 2, 163, 1180, 3, 2, 2, 2, 165, 1189, 3, 2, 2, 2, 167, 1196, 3, 2, 2, 2, 169, 1204, 3, 2, 2, 2, 171, 1211, 3, 2, 2, 2, 173, 1220, 3, 2, 2, 2, 175, 1229, 3, 2, 2, 2, 177, 1237, 3, 2, 2, 2, 179, 1243, 3, 2, 2, 2, 181, 1249, 3, 2, 2, 2, 183, 1256, 3, 2, 2, 2, 185, 1267, 3, 2, 2, 2, 187, 1273, 3, 2, 2, 2, 189, 1285, 3, 2, 2, 2, 191, 1295, 3, 2, 2, 2, 193, 1299, 3, 2, 2, 2, 195, 1307, 3, 2, 2, 2, 197, 1314, 3, 2, 2, 2, 199, 1324, 3, 2, 2, 2, 201, 1329, 3, 2, 2, 2, 203, 1334, 3, 2, 2, 2, 205, 1343, 3, 2, 2, 2, 207, 1353, 3, 2, 2, 2, 209, 1360, 3, 2, 2, 2, 211, 1366, 3, 2, 2, 2, 213, 1372, 3, 2, 2, 2, 215, 1381, 3, 2, 2, 2, 217, 1388, 3, 2, 2, 2, 219, 1393, 3, 2, 2, 2, 221, 1399, 3, 2, 2, 2, 223, 1402, 3, 2, 2, 2, 225, 1409, 3, 2, 2, 2, 227, 1416, 3, 2, 2, 2, 229, 1419, 3, 2, 2, 2, 231, 1425, 3, 2, 2, 2, 233, 1433, 3, 2, 2, 2, 235, 1439, 3, 2, 2, 2, 237, 1446, 3, 2, 2, 2, 239, 1458, 3, 2, 2, 2, 241, 1465, 3, 2, 2, 2, 243, 1475, 3, 2, 2, 2, 245, 1484, 3, 2, 2, 2, 247, 1489, 3, 2, 2, 2, 249, 1492, 3, 2, 2, 2, 251, 1498, 3, 2, 2, 2, 253, 1503, 3, 2, 2, 2, 255, 1508, 3, 2, 2, 2, 257, 1513, 3, 2, 2, 2, 259, 1524, 3, 2, 2, 2, 261, 1532, 3, 2, 2, 2, 263, 1537, 3, 2, 2, 2, 265, 1545, 3, 2, 2, 2, 267, 1550, 3, 2, 2, 2, 269, 1555, 3, 2, 2, 2, 271, 1561, 3, 2, 2, 2, 273, 1567, 3, 2, 2, 2, 275, 1572, 3, 2, 2, 2, 277, 1577, 3, 2, 2, 2, 279, 1583, 3, 2, 2, 2, 281, 1592, 3, 2, 2, 2, 283, 1597, 3, 2, 2, 2, 285, 1603, 3, 2, 2, 2, 287, 1611, 3, 2, 2, 2, 289, 1617, 3, 2, 2, 2, 291, 1621, 3, 2, 2, 2, 293, 1633, 3, 2, 2, 2, 295, 1646, 3, 2, 2, 2, 297, 1658, 3, 2, 2, 2, 299, 1671, 3, 2, 2, 2, 301, 1678, 3, 2, 2, 2, 303, 1686, 3, 2, 2, 2, 305, 1692, 3, 2, 2, 2, 307, 1699, 3, 2, 2, 2, 309, 1704, 3, 2, 2, 2, 311, 1714, 3, 2, 2, 2, 313, 1725, 3, 2, 2, 2, 315, 1733, 3, 2, 2, 2, 317, 1740, 3, 2, 2, 2, 319, 1742, 3, 2, 2, 2, 321, 1747, 3, 2, 2, 2, 323, 1753, 3, 2, 2, 2, 325, 1756, 3, 2, 2, 2, 327, 1759, 3, 2, 2, 2, 329, 1764, 3, 2, 2, 2, 331, 1771, 3, 2, 2, 2, 333, 1779, 3, 2, 2, 2, 335, 1782, 3, 2, 2, 2, 337, 1788, 3, 2, 2, 2, 339, 1792, 3, 2, 2, 2, 341, 1798, 3, 2, 2, 2, 343, 1811, 3, 2, 2, 2, 345, 1816, 3, 2, 2, 2, 347, 1825, 3, 2, 2, 2, 349, 1833, 3, 2, 2, 2, 351, 1843, 3, 2, 2, 2, 353, 1853, 3, 2, 2, 2, 355, 1865, 3, 2, 2, 2, 357, 1876, 3, 2, 2, 2, 359, 1884, 3, 2, 2, 2, 361, 1890, 3, 2, 2, 2, 363, 1898, 3, 2, 2, 2, 365, 1907, 3, 2, 2, 2, 367, 1917, 3, 2, 2, 2, 369, 1925, 3, 2, 2, 2, 371, 1936, 3, 2, 2, 2, 373, 1942, 3, 2, 2, 2, 375, 1948, 3, 2, 2, 2, 377, 1954, 3, 2, 2, 2, 379, 1967, 3, 2, 2, 2, 381, 1980, 3, 2, 2, 2, 383, 1988, 3, 2, 2, 2, 385, 1995, 3, 2, 2, 2, 387, 2006, 3, 2, 2, 2, 389, 2014, 3, 2, 2, 2, 391, 2021, 3, 2, 2, 2, 393, 2028, 3, 2, 2, 2, 395, 2036, 3, 2, 2, 2, 397, 2042, 3, 2, 2, 2, 399, 2050, 3, 2, 2, 2, 401, 2059, 3, 2, 2, 2, 403, 2066, 3, 2, 2, 2, 405, 2083, 3, 2, 2, 2, 407, 2085, 3, 2, 2, 2, 409, 2090, 3, 2, 2, 2, 411, 2096, 3, 2, 2, 2, 413, 2105, 3, 2, 2, 2, 415, 2112, 3, 2, 2, 2, 417, 2116, 3, 2, 2, 2, 419, 2121, 3, 2, 2, 2, 421, 2128, 3, 2, 2, 2, 423, 2135, 3, 2, 2, 2, 425, 2143, 3, 2, 2, 2, 427, 2150, 3, 2, 2, 2, 429, 2155, 3, 2, 2, 2, 431, 2165, 3, 2, 2, 2, 433, 2171, 3, 2, 2, 2, 435, 2187, 3, 2, 2, 2, 437, 2200, 3, 2, 2, 2, 439, 2204, 3, 2, 2, 2, 441, 2210, 3, 2, 2, 2, 443, 2215, 3, 2, 2, 2, 445, 2220, 3, 2, 2, 2, 447, 2227, 3, 2, 2, 2, 449, 2232, 3, 2, 2, 2, 451, 2237, 3, 2, 2, 2, 453, 2244, 3, 2, 2, 2, 455, 2250, 3, 2, 2, 2, 457, 2261, 3, 2, 2, 2, 459, 2268, 3, 2, 2, 2, 461, 2277, 3, 2, 2, 2, 463, 2284, 3, 2, 2, 2, 465, 2291, 3, 2, 2, 2, 467, 2301, 3, 2, 2, 2, 469, 2307, 3, 2, 2, 2, 471, 2314, 3, 2, 2, 2, 473, 2326, 3, 2, 2, 2, 475, 2353, 3, 2, 2, 2, 477, 2355, 3, 2, 2, 2, 479, 2366, 3, 2, 2, 2, 481, 2371, 3, 2, 2, 2, 483, 2374, 3, 2, 2, 2, 485, 2380, 3, 2, 2, 2, 487, 2389, 3, 2, 2, 2, 489, 2401, 3, 2, 2, 2, 491, 2414, 3, 2, 2, 2, 493, 2424, 3, 2, 2, 2, 495, 2429, 3, 2, 2, 2, 497, 2434, 3, 2, 2, 2, 499, 2443, 3, 2, 2, 2, 501, 2448, 3, 2, 2, 2, 503, 2458, 3, 2, 2, 2, 505, 2468, 3, 2, 2, 2, 507, 2476, 3, 2, 2, 2, 509, 2482, 3, 2, 2, 2, 511, 2489, 3, 2, 2, 2, 513, 2497, 3, 2, 2, 2, 515, 2504, 3, 2, 2, 2, 517, 2510, 3, 2, 2, 2, 519, 2517, 3, 2, 2, 2, 521, 2521, 3, 2, 2, 2, 523, 2526, 3, 2, 2, 2, 525, 2532, 3, 2, 2, 2, 527, 2539, 3, 2, 2, 2, 529, 2544, 3, 2, 2, 2, 531, 2549, 3, 2, 2, 2, 533, 2555, 3, 2, 2, 2, 535, 2560, 3, 2, 2, 2, 537, 2566, 3, 2, 2, 2, 539, 2573, 3, 2, 2, 2, 541, 2578, 3, 2, 2, 2, 543, 2583, 3, 2, 2, 2, 545, 2592, 3, 2, 2, 2, 547, 2594, 3, 2, 2, 2, 549, 2598, 3, 2, 2, 2, 551, 2601, 3, 2, 2, 2, 553, 2604, 3, 2, 2, 2, 555, 2610, 3, 2, 2, 2, 557, 2612, 3, 2, 2, 2, 559, 2618, 3, 2, 2, 2, 561, 2620, 3, 2, 2, 2, 563, 2622, 3, 2, 2, 2, 565, 2624, 3, 2, 2, 2, 567, 2626, 3, 2, 2, 2, 569, 2628, 3, 2, 2, 2, 571, 2630, 3, 2, 2, 2, 573, 2634, 3, 2, 2, 2, 575, 2636, 3, 2, 2, 2, 577, 2638, 3, 2, 2, 2, 579, 2640, 3, 2, 2, 2, 581, 2643, 3, 2, 2, 2, 583, 2665, 3, 2, 2, 2, 585, 2668, 3, 2, 2, 2, 587, 2675, 3, 2, 2, 2, 589, 2682, 3, 2, 2, 2, 591, 2689, 3, 2, 2, 2, 593, 2706, 3, 2, 2, 2, 595, 2725, 3, 2, 2, 2, 597, 2747, 3, 2, 2, 2, 599, 2752, 3, 2, 2, 2, 601, 2756, 3, 2, 2, 2, 603, 2785, 3, 2, 2, 2, 605, 2787, 3, 2, 2, 2, 607, 2796, 3, 2, 2, 2, 609, 2798, 3, 2, 2, 2, 611, 2800, 3, 2, 2, 2, 613, 2817, 3, 2, 2, 2, 615, 2824, 3, 2, 2, 2, 617, 2840, 3, 2, 2, 2, 619, 2846, 3, 2, 2, 2, 621, 622, 7, 42, 2, 2, 622, 4, 3, 2, 2, 2, 623, 624, 7, 43, 2, 2, 624, 6, 3, 2, 2, 2, 625, 626, 7, 46, 2, 2, 626, 8, 3, 2, 2, 2, 627, 628, 7, 48, 2, 2, 628, 10, 3, 2, 2, 2, 629, 630, 7, 49, 2, 2, 630, 631, 7, 44, 2, 2, 631, 632, 7, 45, 2, 2, 632, 12, 3, 2, 2, 2, 633, 634, 7, 44, 2, 2, 634, 635, 7, 49, 2, 2, 635, 14, 3, 2, 2, 2, 636, 637, 7, 47, 2, 2, 637, 638, 7, 64, 2, 2, 638, 16, 3, 2, 2, 2, 639, 640, 7, 93, 2, 2, 640, 18, 3, 2, 2, 2, 641, 642, 7, 95, 2, 2, 642, 20, 3, 2, 2, 2, 643, 644, 7, 60, 2, 2, 644, 22, 3, 2, 2, 2, 645, 646, 7, 67, 2, 2, 646, 647, 7, 70, 2, 2, 647, 648, 7, 70, 2, 2, 648, 24, 3, 2, 2, 2, 649, 650, 7, 67, 2, 2, 650, 651, 7, 72, 2, 2, 651, 652, 7, 86, 2, 2, 652, 653, 7, 71, 2, 2, 653, 654, 7, 84, 2, 2, 654, 26, 3, 2, 2, 2, 655, 656, 7, 67, 2, 2, 656, 657, 7, 78, 2, 2, 657, 658, 7, 78, 2, 2, 658, 28, 3, 2, 2, 2, 659, 660, 7, 67, 2, 2, 660, 661, 7, 78, 2, 2, 661, 662, 7, 86, 2, 2, 662, 663, 7, 71, 2, 2, 663, 664, 7, 84, 2, 2, 664, 30, 3, 2, 2, 2, 665, 666, 7, 67, 2, 2, 666, 667, 7, 80, 2, 2, 667, 668, 7, 67, 2, 2, 668, 669, 7, 78, 2, 2, 669, 670, 7, 91, 2, 2, 670, 671, 7, 92, 2, 2, 671, 672, 7, 71, 2, 2, 672, 32, 3, 2, 2, 2, 673, 674, 7, 67, 2, 2, 674, 675, 7, 80, 2, 2, 675, 676, 7, 70, 2, 2, 676, 34, 3, 2, 2, 2, 677, 678, 7, 67, 2, 2, 678, 679, 7, 80, 2, 2, 679, 680, 7, 86, 2, 2, 680, 681, 7, 75, 2, 2, 681, 36, 3, 2, 2, 2, 682, 683, 7, 67, 2, 2, 683, 684, 7, 80, 2, 2, 684, 685, 7, 91, 2, 2, 685, 38, 3, 2, 2, 2, 686, 687, 7, 67, 2, 2, 687, 688, 7, 84, 2, 2, 688, 689, 7, 69, 2, 2, 689, 690, 7, 74, 2, 2, 690, 691, 7, 75, 2, 2, 691, 692, 7, 88, 2, 2, 692, 693, 7, 71, 2, 2, 693, 40, 3, 2, 2, 2, 694, 695, 7, 67, 2, 2, 695, 696, 7, 84, 2, 2, 696, 697, 7, 84, 2, 2, 697, 698, 7, 67, 2, 2, 698, 699, 7, 91, 2, 2, 699, 42, 3, 2, 2, 2, 700, 701, 7, 67, 2, 2, 701, 702, 7, 85, 2, 2, 702, 44, 3, 2, 2, 2, 703, 704, 7, 67, 2, 2, 704, 705, 7, 85, 2, 2, 705, 706, 7, 69, 2, 2, 706, 46, 3, 2, 2, 2, 707, 708, 7, 67, 2, 2, 708, 709, 7, 86, 2, 2, 709, 48, 3, 2, 2, 2, 710, 711, 7, 67, 2, 2, 711, 712, 7, 87, 2, 2, 712, 713, 7, 86, 2, 2, 713, 714, 7, 74, 2, 2, 714, 715, 7, 81, 2, 2, 715, 716, 7, 84, 2, 2, 716, 717, 7, 75, 2, 2, 717, 718, 7, 92, 2, 2, 718, 719, 7, 67, 2, 2, 719, 720, 7, 86, 2, 2, 720, 721, 7, 75, 2, 2, 721, 722, 7, 81, 2, 2, 722, 723, 7, 80, 2, 2, 723, 50, 3, 2, 2, 2, 724, 725, 7, 68, 2, 2, 725, 726, 7, 71, 2, 2, 726, 727, 7, 86, 2, 2, 727, 728, 7, 89, 2, 2, 728, 729, 7, 71, 2, 2, 729, 730, 7, 71, 2, 2, 730, 731, 7, 80, 2, 2, 731, 52, 3, 2, 2, 2, 732, 733, 7, 68, 2, 2, 733, 734, 7, 81, 2, 2, 734, 735, 7, 86, 2, 2, 735, 736, 7, 74, 2, 2, 736, 54, 3, 2, 2, 2, 737, 738, 7, 68, 2, 2, 738, 739, 7, 87, 2, 2, 739, 740, 7, 69, 2, 2, 740, 741, 7, 77, 2, 2, 741, 742, 7, 71, 2, 2, 742, 743, 7, 86, 2, 2, 743, 56, 3, 2, 2, 2, 744, 745, 7, 68, 2, 2, 745, 746, 7, 87, 2, 2, 746, 747, 7, 69, 2, 2, 747, 748, 7, 77, 2, 2, 748, 749, 7, 71, 2, 2, 749, 750, 7, 86, 2, 2, 750, 751, 7, 85, 2, 2, 751, 58, 3, 2, 2, 2, 752, 753, 7, 68, 2, 2, 753, 754, 7, 91, 2, 2, 754, 60, 3, 2, 2, 2, 755, 756, 7, 69, 2, 2, 756, 757, 7, 67, 2, 2, 757, 758, 7, 69, 2, 2, 758, 759, 7, 74, 2, 2, 759, 760, 7, 71, 2, 2, 760, 62, 3, 2, 2, 2, 761, 762, 7, 69, 2, 2, 762, 763, 7, 67, 2, 2, 763, 764, 7, 85, 2, 2, 764, 765, 7, 69, 2, 2, 765, 766, 7, 67, 2, 2, 766, 767, 7, 70, 2, 2, 767, 768, 7, 71, 2, 2, 768, 64, 3, 2, 2, 2, 769, 770, 7, 69, 2, 2, 770, 771, 7, 67, 2, 2, 771, 772, 7, 85, 2, 2, 772, 773, 7, 71, 2, 2, 773, 66, 3, 2, 2, 2, 774, 775, 7, 69, 2, 2, 775, 776, 7, 67, 2, 2, 776, 777, 7, 85, 2, 2, 777, 778, 7, 86, 2, 2, 778, 68, 3, 2, 2, 2, 779, 780, 7, 69, 2, 2, 780, 781, 7, 74, 2, 2, 781, 782, 7, 67, 2, 2, 782, 783, 7, 80, 2, 2, 783, 784, 7, 73, 2, 2, 784, 785, 7, 71, 2, 2, 785, 70, 3, 2, 2, 2, 786, 787, 7, 69, 2, 2, 787, 788, 7, 74, 2, 2, 788, 789, 7, 71, 2, 2, 789, 790, 7, 69, 2, 2, 790, 791, 7, 77, 2, 2, 791, 72, 3, 2, 2, 2, 792, 793, 7, 69, 2, 2, 793, 794, 7, 78, 2, 2, 794, 795, 7, 71, 2, 2, 795, 796, 7, 67, 2, 2, 796, 797, 7, 84, 2, 2, 797, 74, 3, 2, 2, 2, 798, 799, 7, 69, 2, 2, 799, 800, 7, 78, 2, 2, 800, 801, 7, 87, 2, 2, 801, 802, 7, 85, 2, 2, 802, 803, 7, 86, 2, 2, 803, 804, 7, 71, 2, 2, 804, 805, 7, 84, 2, 2, 805, 76, 3, 2, 2, 2, 806, 807, 7, 69, 2, 2, 807, 808, 7, 78, 2, 2, 808, 809, 7, 87, 2, 2, 809, 810, 7, 85, 2, 2, 810, 811, 7, 86, 2, 2, 811, 812, 7, 71, 2, 2, 812, 813, 7, 84, 2, 2, 813, 814, 7, 71, 2, 2, 814, 815, 7, 70, 2, 2, 815, 78, 3, 2, 2, 2, 816, 817, 7, 69, 2, 2, 817, 818, 7, 81, 2, 2, 818, 819, 7, 70, 2, 2, 819, 820, 7, 71, 2, 2, 820, 821, 7, 73, 2, 2, 821, 822, 7, 71, 2, 2, 822, 823, 7, 80, 2, 2, 823, 80, 3, 2, 2, 2, 824, 825, 7, 69, 2, 2, 825, 826, 7, 81, 2, 2, 826, 827, 7, 78, 2, 2, 827, 828, 7, 78, 2, 2, 828, 829, 7, 67, 2, 2, 829, 830, 7, 86, 2, 2, 830, 831, 7, 71, 2, 2, 831, 82, 3, 2, 2, 2, 832, 833, 7, 69, 2, 2, 833, 834, 7, 81, 2, 2, 834, 835, 7, 78, 2, 2, 835, 836, 7, 78, 2, 2, 836, 837, 7, 71, 2, 2, 837, 838, 7, 69, 2, 2, 838, 839, 7, 86, 2, 2, 839, 840, 7, 75, 2, 2, 840, 841, 7, 81, 2, 2, 841, 842, 7, 80, 2, 2, 842, 84, 3, 2, 2, 2, 843, 844, 7, 69, 2, 2, 844, 845, 7, 81, 2, 2, 845, 846, 7, 78, 2, 2, 846, 847, 7, 87, 2, 2, 847, 848, 7, 79, 2, 2, 848, 849, 7, 80, 2, 2, 849, 86, 3, 2, 2, 2, 850, 851, 7, 69, 2, 2, 851, 852, 7, 81, 2, 2, 852, 853, 7, 78, 2, 2, 853, 854, 7, 87, 2, 2, 854, 855, 7, 79, 2, 2, 855, 856, 7, 80, 2, 2, 856, 857, 7, 85, 2, 2, 857, 88, 3, 2, 2, 2, 858, 859, 7, 69, 2, 2, 859, 860, 7, 81, 2, 2, 860, 861, 7, 79, 2, 2, 861, 862, 7, 79, 2, 2, 862, 863, 7, 71, 2, 2, 863, 864, 7, 80, 2, 2, 864, 865, 7, 86, 2, 2, 865, 90, 3, 2, 2, 2, 866, 867, 7, 69, 2, 2, 867, 868, 7, 81, 2, 2, 868, 869, 7, 79, 2, 2, 869, 870, 7, 79, 2, 2, 870, 871, 7, 75, 2, 2, 871, 872, 7, 86, 2, 2, 872, 92, 3, 2, 2, 2, 873, 874, 7, 69, 2, 2, 874, 875, 7, 81, 2, 2, 875, 876, 7, 79, 2, 2, 876, 877, 7, 82, 2, 2, 877, 878, 7, 67, 2, 2, 878, 879, 7, 69, 2, 2, 879, 880, 7, 86, 2, 2, 880, 94, 3, 2, 2, 2, 881, 882, 7, 69, 2, 2, 882, 883, 7, 81, 2, 2, 883, 884, 7, 79, 2, 2, 884, 885, 7, 82, 2, 2, 885, 886, 7, 67, 2, 2, 886, 887, 7, 69, 2, 2, 887, 888, 7, 86, 2, 2, 888, 889, 7, 75, 2, 2, 889, 890, 7, 81, 2, 2, 890, 891, 7, 80, 2, 2, 891, 892, 7, 85, 2, 2, 892, 96, 3, 2, 2, 2, 893, 894, 7, 69, 2, 2, 894, 895, 7, 81, 2, 2, 895, 896, 7, 79, 2, 2, 896, 897, 7, 82, 2, 2, 897, 898, 7, 87, 2, 2, 898, 899, 7, 86, 2, 2, 899, 900, 7, 71, 2, 2, 900, 98, 3, 2, 2, 2, 901, 902, 7, 69, 2, 2, 902, 903, 7, 81, 2, 2, 903, 904, 7, 80, 2, 2, 904, 905, 7, 69, 2, 2, 905, 906, 7, 67, 2, 2, 906, 907, 7, 86, 2, 2, 907, 908, 7, 71, 2, 2, 908, 909, 7, 80, 2, 2, 909, 910, 7, 67, 2, 2, 910, 911, 7, 86, 2, 2, 911, 912, 7, 71, 2, 2, 912, 100, 3, 2, 2, 2, 913, 914, 7, 69, 2, 2, 914, 915, 7, 81, 2, 2, 915, 916, 7, 80, 2, 2, 916, 917, 7, 85, 2, 2, 917, 918, 7, 86, 2, 2, 918, 919, 7, 84, 2, 2, 919, 920, 7, 67, 2, 2, 920, 921, 7, 75, 2, 2, 921, 922, 7, 80, 2, 2, 922, 923, 7, 86, 2, 2, 923, 102, 3, 2, 2, 2, 924, 925, 7, 69, 2, 2, 925, 926, 7, 81, 2, 2, 926, 927, 7, 85, 2, 2, 927, 928, 7, 86, 2, 2, 928, 104, 3, 2, 2, 2, 929, 930, 7, 69, 2, 2, 930, 931, 7, 84, 2, 2, 931, 932, 7, 71, 2, 2, 932, 933, 7, 67, 2, 2, 933, 934, 7, 86, 2, 2, 934, 935, 7, 71, 2, 2, 935, 106, 3, 2, 2, 2, 936, 937, 7, 69, 2, 2, 937, 938, 7, 84, 2, 2, 938, 939, 7, 81, 2, 2, 939, 940, 7, 85, 2, 2, 940, 941, 7, 85, 2, 2, 941, 108, 3, 2, 2, 2, 942, 943, 7, 69, 2, 2, 943, 944, 7, 87, 2, 2, 944, 945, 7, 68, 2, 2, 945, 946, 7, 71, 2, 2, 946, 110, 3, 2, 2, 2, 947, 948, 7, 69, 2, 2, 948, 949, 7, 87, 2, 2, 949, 950, 7, 84, 2, 2, 950, 951, 7, 84, 2, 2, 951, 952, 7, 71, 2, 2, 952, 953, 7, 80, 2, 2, 953, 954, 7, 86, 2, 2, 954, 112, 3, 2, 2, 2, 955, 956, 7, 69, 2, 2, 956, 957, 7, 87, 2, 2, 957, 958, 7, 84, 2, 2, 958, 959, 7, 84, 2, 2, 959, 960, 7, 71, 2, 2, 960, 961, 7, 80, 2, 2, 961, 962, 7, 86, 2, 2, 962, 963, 7, 97, 2, 2, 963, 964, 7, 70, 2, 2, 964, 965, 7, 67, 2, 2, 965, 966, 7, 86, 2, 2, 966, 967, 7, 71, 2, 2, 967, 114, 3, 2, 2, 2, 968, 969, 7, 69, 2, 2, 969, 970, 7, 87, 2, 2, 970, 971, 7, 84, 2, 2, 971, 972, 7, 84, 2, 2, 972, 973, 7, 71, 2, 2, 973, 974, 7, 80, 2, 2, 974, 975, 7, 86, 2, 2, 975, 976, 7, 97, 2, 2, 976, 977, 7, 86, 2, 2, 977, 978, 7, 75, 2, 2, 978, 979, 7, 79, 2, 2, 979, 980, 7, 71, 2, 2, 980, 116, 3, 2, 2, 2, 981, 982, 7, 69, 2, 2, 982, 983, 7, 87, 2, 2, 983, 984, 7, 84, 2, 2, 984, 985, 7, 84, 2, 2, 985, 986, 7, 71, 2, 2, 986, 987, 7, 80, 2, 2, 987, 988, 7, 86, 2, 2, 988, 989, 7, 97, 2, 2, 989, 990, 7, 86, 2, 2, 990, 991, 7, 75, 2, 2, 991, 992, 7, 79, 2, 2, 992, 993, 7, 71, 2, 2, 993, 994, 7, 85, 2, 2, 994, 995, 7, 86, 2, 2, 995, 996, 7, 67, 2, 2, 996, 997, 7, 79, 2, 2, 997, 998, 7, 82, 2, 2, 998, 118, 3, 2, 2, 2, 999, 1000, 7, 69, 2, 2, 1000, 1001, 7, 87, 2, 2, 1001, 1002, 7, 84, 2, 2, 1002, 1003, 7, 84, 2, 2, 1003, 1004, 7, 71, 2, 2, 1004, 1005, 7, 80, 2, 2, 1005, 1006, 7, 86, 2, 2, 1006, 1007, 7, 97, 2, 2, 1007, 1008, 7, 87, 2, 2, 1008, 1009, 7, 85, 2, 2, 1009, 1010, 7, 71, 2, 2, 1010, 1011, 7, 84, 2, 2, 1011, 120, 3, 2, 2, 2, 1012, 1013, 7, 70, 2, 2, 1013, 1014, 7, 67, 2, 2, 1014, 1015, 7, 86, 2, 2, 1015, 1016, 7, 67, 2, 2, 1016, 122, 3, 2, 2, 2, 1017, 1018, 7, 70, 2, 2, 1018, 1019, 7, 67, 2, 2, 1019, 1020, 7, 86, 2, 2, 1020, 1021, 7, 67, 2, 2, 1021, 1022, 7, 68, 2, 2, 1022, 1023, 7, 67, 2, 2, 1023, 1024, 7, 85, 2, 2, 1024, 1025, 7, 71, 2, 2, 1025, 124, 3, 2, 2, 2, 1026, 1027, 7, 70, 2, 2, 1027, 1028, 7, 67, 2, 2, 1028, 1029, 7, 86, 2, 2, 1029, 1030, 7, 67, 2, 2, 1030, 1031, 7, 68, 2, 2, 1031, 1032, 7, 67, 2, 2, 1032, 1033, 7, 85, 2, 2, 1033, 1034, 7, 71, 2, 2, 1034, 1043, 7, 85, 2, 2, 1035, 1036, 7, 85, 2, 2, 1036, 1037, 7, 69, 2, 2, 1037, 1038, 7, 74, 2, 2, 1038, 1039, 7, 71, 2, 2, 1039, 1040, 7, 79, 2, 2, 1040, 1041, 7, 67, 2, 2, 1041, 1043, 7, 85, 2, 2, 1042, 1026, 3, 2, 2, 2, 1042, 1035, 3, 2, 2, 2, 1043, 126, 3, 2, 2, 2, 1044, 1045, 7, 70, 2, 2, 1045, 1046, 7, 67, 2, 2, 1046, 1047, 7, 91, 2, 2, 1047, 128, 3, 2, 2, 2, 1048, 1049, 7, 70, 2, 2, 1049, 1050, 7, 67, 2, 2, 1050, 1051, 7, 91, 2, 2, 1051, 1052, 7, 85, 2, 2, 1052, 130, 3, 2, 2, 2, 1053, 1054, 7, 70, 2, 2, 1054, 1055, 7, 68, 2, 2, 1055, 1056, 7, 82, 2, 2, 1056, 1057, 7, 84, 2, 2, 1057, 1058, 7, 81, 2, 2, 1058, 1059, 7, 82, 2, 2, 1059, 1060, 7, 71, 2, 2, 1060, 1061, 7, 84, 2, 2, 1061, 1062, 7, 86, 2, 2, 1062, 1063, 7, 75, 2, 2, 1063, 1064, 7, 71, 2, 2, 1064, 1065, 7, 85, 2, 2, 1065, 132, 3, 2, 2, 2, 1066, 1067, 7, 70, 2, 2, 1067, 1068, 7, 71, 2, 2, 1068, 1069, 7, 72, 2, 2, 1069, 1070, 7, 75, 2, 2, 1070, 1071, 7, 80, 2, 2, 1071, 1072, 7, 71, 2, 2, 1072, 1073, 7, 70, 2, 2, 1073, 134, 3, 2, 2, 2, 1074, 1075, 7, 70, 2, 2, 1075, 1076, 7, 71, 2, 2, 1076, 1077, 7, 78, 2, 2, 1077, 1078, 7, 71, 2, 2, 1078, 1079, 7, 86, 2, 2, 1079, 1080, 7, 71, 2, 2, 1080, 136, 3, 2, 2, 2, 1081, 1082, 7, 70, 2, 2, 1082, 1083, 7, 71, 2, 2, 1083, 1084, 7, 78, 2, 2, 1084, 1085, 7, 75, 2, 2, 1085, 1086, 7, 79, 2, 2, 1086, 1087, 7, 75, 2, 2, 1087, 1088, 7, 86, 2, 2, 1088, 1089, 7, 71, 2, 2, 1089, 1090, 7, 70, 2, 2, 1090, 138, 3, 2, 2, 2, 1091, 1092, 7, 70, 2, 2, 1092, 1093, 7, 71, 2, 2, 1093, 1094, 7, 85, 2, 2, 1094, 1095, 7, 69, 2, 2, 1095, 140, 3, 2, 2, 2, 1096, 1097, 7, 70, 2, 2, 1097, 1098, 7, 71, 2, 2, 1098, 1099, 7, 85, 2, 2, 1099, 1100, 7, 69, 2, 2, 1100, 1101, 7, 84, 2, 2, 1101, 1102, 7, 75, 2, 2, 1102, 1103, 7, 68, 2, 2, 1103, 1104, 7, 71, 2, 2, 1104, 142, 3, 2, 2, 2, 1105, 1106, 7, 70, 2, 2, 1106, 1107, 7, 72, 2, 2, 1107, 1108, 7, 85, 2, 2, 1108, 144, 3, 2, 2, 2, 1109, 1110, 7, 70, 2, 2, 1110, 1111, 7, 75, 2, 2, 1111, 1112, 7, 84, 2, 2, 1112, 1113, 7, 71, 2, 2, 1113, 1114, 7, 69, 2, 2, 1114, 1115, 7, 86, 2, 2, 1115, 1116, 7, 81, 2, 2, 1116, 1117, 7, 84, 2, 2, 1117, 1118, 7, 75, 2, 2, 1118, 1119, 7, 71, 2, 2, 1119, 1120, 7, 85, 2, 2, 1120, 146, 3, 2, 2, 2, 1121, 1122, 7, 70, 2, 2, 1122, 1123, 7, 75, 2, 2, 1123, 1124, 7, 84, 2, 2, 1124, 1125, 7, 71, 2, 2, 1125, 1126, 7, 69, 2, 2, 1126, 1127, 7, 86, 2, 2, 1127, 1128, 7, 81, 2, 2, 1128, 1129, 7, 84, 2, 2, 1129, 1130, 7, 91, 2, 2, 1130, 148, 3, 2, 2, 2, 1131, 1132, 7, 70, 2, 2, 1132, 1133, 7, 75, 2, 2, 1133, 1134, 7, 85, 2, 2, 1134, 1135, 7, 86, 2, 2, 1135, 1136, 7, 75, 2, 2, 1136, 1137, 7, 80, 2, 2, 1137, 1138, 7, 69, 2, 2, 1138, 1139, 7, 86, 2, 2, 1139, 150, 3, 2, 2, 2, 1140, 1141, 7, 70, 2, 2, 1141, 1142, 7, 75, 2, 2, 1142, 1143, 7, 85, 2, 2, 1143, 1144, 7, 86, 2, 2, 1144, 1145, 7, 84, 2, 2, 1145, 1146, 7, 75, 2, 2, 1146, 1147, 7, 68, 2, 2, 1147, 1148, 7, 87, 2, 2, 1148, 1149, 7, 86, 2, 2, 1149, 1150, 7, 71, 2, 2, 1150, 152, 3, 2, 2, 2, 1151, 1152, 7, 70, 2, 2, 1152, 1153, 7, 84, 2, 2, 1153, 1154, 7, 81, 2, 2, 1154, 1155, 7, 82, 2, 2, 1155, 154, 3, 2, 2, 2, 1156, 1157, 7, 71, 2, 2, 1157, 1158, 7, 78, 2, 2, 1158, 1159, 7, 85, 2, 2, 1159, 1160, 7, 71, 2, 2, 1160, 156, 3, 2, 2, 2, 1161, 1162, 7, 71, 2, 2, 1162, 1163, 7, 80, 2, 2, 1163, 1164, 7, 70, 2, 2, 1164, 158, 3, 2, 2, 2, 1165, 1166, 7, 71, 2, 2, 1166, 1167, 7, 85, 2, 2, 1167, 1168, 7, 69, 2, 2, 1168, 1169, 7, 67, 2, 2, 1169, 1170, 7, 82, 2, 2, 1170, 1171, 7, 71, 2, 2, 1171, 1172, 7, 70, 2, 2, 1172, 160, 3, 2, 2, 2, 1173, 1174, 7, 71, 2, 2, 1174, 1175, 7, 90, 2, 2, 1175, 1176, 7, 69, 2, 2, 1176, 1177, 7, 71, 2, 2, 1177, 1178, 7, 82, 2, 2, 1178, 1179, 7, 86, 2, 2, 1179, 162, 3, 2, 2, 2, 1180, 1181, 7, 71, 2, 2, 1181, 1182, 7, 90, 2, 2, 1182, 1183, 7, 69, 2, 2, 1183, 1184, 7, 74, 2, 2, 1184, 1185, 7, 67, 2, 2, 1185, 1186, 7, 80, 2, 2, 1186, 1187, 7, 73, 2, 2, 1187, 1188, 7, 71, 2, 2, 1188, 164, 3, 2, 2, 2, 1189, 1190, 7, 71, 2, 2, 1190, 1191, 7, 90, 2, 2, 1191, 1192, 7, 75, 2, 2, 1192, 1193, 7, 85, 2, 2, 1193, 1194, 7, 86, 2, 2, 1194, 1195, 7, 85, 2, 2, 1195, 166, 3, 2, 2, 2, 1196, 1197, 7, 71, 2, 2, 1197, 1198, 7, 90, 2, 2, 1198, 1199, 7, 82, 2, 2, 1199, 1200, 7, 78, 2, 2, 1200, 1201, 7, 67, 2, 2, 1201, 1202, 7, 75, 2, 2, 1202, 1203, 7, 80, 2, 2, 1203, 168, 3, 2, 2, 2, 1204, 1205, 7, 71, 2, 2, 1205, 1206, 7, 90, 2, 2, 1206, 1207, 7, 82, 2, 2, 1207, 1208, 7, 81, 2, 2, 1208, 1209, 7, 84, 2, 2, 1209, 1210, 7, 86, 2, 2, 1210, 170, 3, 2, 2, 2, 1211, 1212, 7, 71, 2, 2, 1212, 1213, 7, 90, 2, 2, 1213, 1214, 7, 86, 2, 2, 1214, 1215, 7, 71, 2, 2, 1215, 1216, 7, 80, 2, 2, 1216, 1217, 7, 70, 2, 2, 1217, 1218, 7, 71, 2, 2, 1218, 1219, 7, 70, 2, 2, 1219, 172, 3, 2, 2, 2, 1220, 1221, 7, 71, 2, 2, 1221, 1222, 7, 90, 2, 2, 1222, 1223, 7, 86, 2, 2, 1223, 1224, 7, 71, 2, 2, 1224, 1225, 7, 84, 2, 2, 1225, 1226, 7, 80, 2, 2, 1226, 1227, 7, 67, 2, 2, 1227, 1228, 7, 78, 2, 2, 1228, 174, 3, 2, 2, 2, 1229, 1230, 7, 71, 2, 2, 1230, 1231, 7, 90, 2, 2, 1231, 1232, 7, 86, 2, 2, 1232, 1233, 7, 84, 2, 2, 1233, 1234, 7, 67, 2, 2, 1234, 1235, 7, 69, 2, 2, 1235, 1236, 7, 86, 2, 2, 1236, 176, 3, 2, 2, 2, 1237, 1238, 7, 72, 2, 2, 1238, 1239, 7, 67, 2, 2, 1239, 1240, 7, 78, 2, 2, 1240, 1241, 7, 85, 2, 2, 1241, 1242, 7, 71, 2, 2, 1242, 178, 3, 2, 2, 2, 1243, 1244, 7, 72, 2, 2, 1244, 1245, 7, 71, 2, 2, 1245, 1246, 7, 86, 2, 2, 1246, 1247, 7, 69, 2, 2, 1247, 1248, 7, 74, 2, 2, 1248, 180, 3, 2, 2, 2, 1249, 1250, 7, 72, 2, 2, 1250, 1251, 7, 75, 2, 2, 1251, 1252, 7, 71, 2, 2, 1252, 1253, 7, 78, 2, 2, 1253, 1254, 7, 70, 2, 2, 1254, 1255, 7, 85, 2, 2, 1255, 182, 3, 2, 2, 2, 1256, 1257, 7, 72, 2, 2, 1257, 1258, 7, 75, 2, 2, 1258, 1259, 7, 78, 2, 2, 1259, 1260, 7, 71, 2, 2, 1260, 1261, 7, 72, 2, 2, 1261, 1262, 7, 81, 2, 2, 1262, 1263, 7, 84, 2, 2, 1263, 1264, 7, 79, 2, 2, 1264, 1265, 7, 67, 2, 2, 1265, 1266, 7, 86, 2, 2, 1266, 184, 3, 2, 2, 2, 1267, 1268, 7, 72, 2, 2, 1268, 1269, 7, 75, 2, 2, 1269, 1270, 7, 84, 2, 2, 1270, 1271, 7, 85, 2, 2, 1271, 1272, 7, 86, 2, 2, 1272, 186, 3, 2, 2, 2, 1273, 1274, 7, 72, 2, 2, 1274, 1275, 7, 75, 2, 2, 1275, 1276, 7, 84, 2, 2, 1276, 1277, 7, 85, 2, 2, 1277, 1278, 7, 86, 2, 2, 1278, 1279, 7, 97, 2, 2, 1279, 1280, 7, 88, 2, 2, 1280, 1281, 7, 67, 2, 2, 1281, 1282, 7, 78, 2, 2, 1282, 1283, 7, 87, 2, 2, 1283, 1284, 7, 71, 2, 2, 1284, 188, 3, 2, 2, 2, 1285, 1286, 7, 72, 2, 2, 1286, 1287, 7, 81, 2, 2, 1287, 1288, 7, 78, 2, 2, 1288, 1289, 7, 78, 2, 2, 1289, 1290, 7, 81, 2, 2, 1290, 1291, 7, 89, 2, 2, 1291, 1292, 7, 75, 2, 2, 1292, 1293, 7, 80, 2, 2, 1293, 1294, 7, 73, 2, 2, 1294, 190, 3, 2, 2, 2, 1295, 1296, 7, 72, 2, 2, 1296, 1297, 7, 81, 2, 2, 1297, 1298, 7, 84, 2, 2, 1298, 192, 3, 2, 2, 2, 1299, 1300, 7, 72, 2, 2, 1300, 1301, 7, 81, 2, 2, 1301, 1302, 7, 84, 2, 2, 1302, 1303, 7, 71, 2, 2, 1303, 1304, 7, 75, 2, 2, 1304, 1305, 7, 73, 2, 2, 1305, 1306, 7, 80, 2, 2, 1306, 194, 3, 2, 2, 2, 1307, 1308, 7, 72, 2, 2, 1308, 1309, 7, 81, 2, 2, 1309, 1310, 7, 84, 2, 2, 1310, 1311, 7, 79, 2, 2, 1311, 1312, 7, 67, 2, 2, 1312, 1313, 7, 86, 2, 2, 1313, 196, 3, 2, 2, 2, 1314, 1315, 7, 72, 2, 2, 1315, 1316, 7, 81, 2, 2, 1316, 1317, 7, 84, 2, 2, 1317, 1318, 7, 79, 2, 2, 1318, 1319, 7, 67, 2, 2, 1319, 1320, 7, 86, 2, 2, 1320, 1321, 7, 86, 2, 2, 1321, 1322, 7, 71, 2, 2, 1322, 1323, 7, 70, 2, 2, 1323, 198, 3, 2, 2, 2, 1324, 1325, 7, 72, 2, 2, 1325, 1326, 7, 84, 2, 2, 1326, 1327, 7, 81, 2, 2, 1327, 1328, 7, 79, 2, 2, 1328, 200, 3, 2, 2, 2, 1329, 1330, 7, 72, 2, 2, 1330, 1331, 7, 87, 2, 2, 1331, 1332, 7, 78, 2, 2, 1332, 1333, 7, 78, 2, 2, 1333, 202, 3, 2, 2, 2, 1334, 1335, 7, 72, 2, 2, 1335, 1336, 7, 87, 2, 2, 1336, 1337, 7, 80, 2, 2, 1337, 1338, 7, 69, 2, 2, 1338, 1339, 7, 86, 2, 2, 1339, 1340, 7, 75, 2, 2, 1340, 1341, 7, 81, 2, 2, 1341, 1342, 7, 80, 2, 2, 1342, 204, 3, 2, 2, 2, 1343, 1344, 7, 72, 2, 2, 1344, 1345, 7, 87, 2, 2, 1345, 1346, 7, 80, 2, 2, 1346, 1347, 7, 69, 2, 2, 1347, 1348, 7, 86, 2, 2, 1348, 1349, 7, 75, 2, 2, 1349, 1350, 7, 81, 2, 2, 1350, 1351, 7, 80, 2, 2, 1351, 1352, 7, 85, 2, 2, 1352, 206, 3, 2, 2, 2, 1353, 1354, 7, 73, 2, 2, 1354, 1355, 7, 78, 2, 2, 1355, 1356, 7, 81, 2, 2, 1356, 1357, 7, 68, 2, 2, 1357, 1358, 7, 67, 2, 2, 1358, 1359, 7, 78, 2, 2, 1359, 208, 3, 2, 2, 2, 1360, 1361, 7, 73, 2, 2, 1361, 1362, 7, 84, 2, 2, 1362, 1363, 7, 67, 2, 2, 1363, 1364, 7, 80, 2, 2, 1364, 1365, 7, 86, 2, 2, 1365, 210, 3, 2, 2, 2, 1366, 1367, 7, 73, 2, 2, 1367, 1368, 7, 84, 2, 2, 1368, 1369, 7, 81, 2, 2, 1369, 1370, 7, 87, 2, 2, 1370, 1371, 7, 82, 2, 2, 1371, 212, 3, 2, 2, 2, 1372, 1373, 7, 73, 2, 2, 1373, 1374, 7, 84, 2, 2, 1374, 1375, 7, 81, 2, 2, 1375, 1376, 7, 87, 2, 2, 1376, 1377, 7, 82, 2, 2, 1377, 1378, 7, 75, 2, 2, 1378, 1379, 7, 80, 2, 2, 1379, 1380, 7, 73, 2, 2, 1380, 214, 3, 2, 2, 2, 1381, 1382, 7, 74, 2, 2, 1382, 1383, 7, 67, 2, 2, 1383, 1384, 7, 88, 2, 2, 1384, 1385, 7, 75, 2, 2, 1385, 1386, 7, 80, 2, 2, 1386, 1387, 7, 73, 2, 2, 1387, 216, 3, 2, 2, 2, 1388, 1389, 7, 74, 2, 2, 1389, 1390, 7, 81, 2, 2, 1390, 1391, 7, 87, 2, 2, 1391, 1392, 7, 84, 2, 2, 1392, 218, 3, 2, 2, 2, 1393, 1394, 7, 74, 2, 2, 1394, 1395, 7, 81, 2, 2, 1395, 1396, 7, 87, 2, 2, 1396, 1397, 7, 84, 2, 2, 1397, 1398, 7, 85, 2, 2, 1398, 220, 3, 2, 2, 2, 1399, 1400, 7, 75, 2, 2, 1400, 1401, 7, 72, 2, 2, 1401, 222, 3, 2, 2, 2, 1402, 1403, 7, 75, 2, 2, 1403, 1404, 7, 73, 2, 2, 1404, 1405, 7, 80, 2, 2, 1405, 1406, 7, 81, 2, 2, 1406, 1407, 7, 84, 2, 2, 1407, 1408, 7, 71, 2, 2, 1408, 224, 3, 2, 2, 2, 1409, 1410, 7, 75, 2, 2, 1410, 1411, 7, 79, 2, 2, 1411, 1412, 7, 82, 2, 2, 1412, 1413, 7, 81, 2, 2, 1413, 1414, 7, 84, 2, 2, 1414, 1415, 7, 86, 2, 2, 1415, 226, 3, 2, 2, 2, 1416, 1417, 7, 75, 2, 2, 1417, 1418, 7, 80, 2, 2, 1418, 228, 3, 2, 2, 2, 1419, 1420, 7, 75, 2, 2, 1420, 1421, 7, 80, 2, 2, 1421, 1422, 7, 70, 2, 2, 1422, 1423, 7, 71, 2, 2, 1423, 1424, 7, 90, 2, 2, 1424, 230, 3, 2, 2, 2, 1425, 1426, 7, 75, 2, 2, 1426, 1427, 7, 80, 2, 2, 1427, 1428, 7, 70, 2, 2, 1428, 1429, 7, 71, 2, 2, 1429, 1430, 7, 90, 2, 2, 1430, 1431, 7, 71, 2, 2, 1431, 1432, 7, 85, 2, 2, 1432, 232, 3, 2, 2, 2, 1433, 1434, 7, 75, 2, 2, 1434, 1435, 7, 80, 2, 2, 1435, 1436, 7, 80, 2, 2, 1436, 1437, 7, 71, 2, 2, 1437, 1438, 7, 84, 2, 2, 1438, 234, 3, 2, 2, 2, 1439, 1440, 7, 75, 2, 2, 1440, 1441, 7, 80, 2, 2, 1441, 1442, 7, 82, 2, 2, 1442, 1443, 7, 67, 2, 2, 1443, 1444, 7, 86, 2, 2, 1444, 1445, 7, 74, 2, 2, 1445, 236, 3, 2, 2, 2, 1446, 1447, 7, 75, 2, 2, 1447, 1448, 7, 80, 2, 2, 1448, 1449, 7, 82, 2, 2, 1449, 1450, 7, 87, 2, 2, 1450, 1451, 7, 86, 2, 2, 1451, 1452, 7, 72, 2, 2, 1452, 1453, 7, 81, 2, 2, 1453, 1454, 7, 84, 2, 2, 1454, 1455, 7, 79, 2, 2, 1455, 1456, 7, 67, 2, 2, 1456, 1457, 7, 86, 2, 2, 1457, 238, 3, 2, 2, 2, 1458, 1459, 7, 75, 2, 2, 1459, 1460, 7, 80, 2, 2, 1460, 1461, 7, 85, 2, 2, 1461, 1462, 7, 71, 2, 2, 1462, 1463, 7, 84, 2, 2, 1463, 1464, 7, 86, 2, 2, 1464, 240, 3, 2, 2, 2, 1465, 1466, 7, 75, 2, 2, 1466, 1467, 7, 80, 2, 2, 1467, 1468, 7, 86, 2, 2, 1468, 1469, 7, 71, 2, 2, 1469, 1470, 7, 84, 2, 2, 1470, 1471, 7, 85, 2, 2, 1471, 1472, 7, 71, 2, 2, 1472, 1473, 7, 69, 2, 2, 1473, 1474, 7, 86, 2, 2, 1474, 242, 3, 2, 2, 2, 1475, 1476, 7, 75, 2, 2, 1476, 1477, 7, 80, 2, 2, 1477, 1478, 7, 86, 2, 2, 1478, 1479, 7, 71, 2, 2, 1479, 1480, 7, 84, 2, 2, 1480, 1481, 7, 88, 2, 2, 1481, 1482, 7, 67, 2, 2, 1482, 1483, 7, 78, 2, 2, 1483, 244, 3, 2, 2, 2, 1484, 1485, 7, 75, 2, 2, 1485, 1486, 7, 80, 2, 2, 1486, 1487, 7, 86, 2, 2, 1487, 1488, 7, 81, 2, 2, 1488, 246, 3, 2, 2, 2, 1489, 1490, 7, 75, 2, 2, 1490, 1491, 7, 85, 2, 2, 1491, 248, 3, 2, 2, 2, 1492, 1493, 7, 75, 2, 2, 1493, 1494, 7, 86, 2, 2, 1494, 1495, 7, 71, 2, 2, 1495, 1496, 7, 79, 2, 2, 1496, 1497, 7, 85, 2, 2, 1497, 250, 3, 2, 2, 2, 1498, 1499, 7, 76, 2, 2, 1499, 1500, 7, 81, 2, 2, 1500, 1501, 7, 75, 2, 2, 1501, 1502, 7, 80, 2, 2, 1502, 252, 3, 2, 2, 2, 1503, 1504, 7, 77, 2, 2, 1504, 1505, 7, 71, 2, 2, 1505, 1506, 7, 91, 2, 2, 1506, 1507, 7, 85, 2, 2, 1507, 254, 3, 2, 2, 2, 1508, 1509, 7, 78, 2, 2, 1509, 1510, 7, 67, 2, 2, 1510, 1511, 7, 85, 2, 2, 1511, 1512, 7, 86, 2, 2, 1512, 256, 3, 2, 2, 2, 1513, 1514, 7, 78, 2, 2, 1514, 1515, 7, 67, 2, 2, 1515, 1516, 7, 85, 2, 2, 1516, 1517, 7, 86, 2, 2, 1517, 1518, 7, 97, 2, 2, 1518, 1519, 7, 88, 2, 2, 1519, 1520, 7, 67, 2, 2, 1520, 1521, 7, 78, 2, 2, 1521, 1522, 7, 87, 2, 2, 1522, 1523, 7, 71, 2, 2, 1523, 258, 3, 2, 2, 2, 1524, 1525, 7, 78, 2, 2, 1525, 1526, 7, 67, 2, 2, 1526, 1527, 7, 86, 2, 2, 1527, 1528, 7, 71, 2, 2, 1528, 1529, 7, 84, 2, 2, 1529, 1530, 7, 67, 2, 2, 1530, 1531, 7, 78, 2, 2, 1531, 260, 3, 2, 2, 2, 1532, 1533, 7, 78, 2, 2, 1533, 1534, 7, 67, 2, 2, 1534, 1535, 7, 92, 2, 2, 1535, 1536, 7, 91, 2, 2, 1536, 262, 3, 2, 2, 2, 1537, 1538, 7, 78, 2, 2, 1538, 1539, 7, 71, 2, 2, 1539, 1540, 7, 67, 2, 2, 1540, 1541, 7, 70, 2, 2, 1541, 1542, 7, 75, 2, 2, 1542, 1543, 7, 80, 2, 2, 1543, 1544, 7, 73, 2, 2, 1544, 264, 3, 2, 2, 2, 1545, 1546, 7, 78, 2, 2, 1546, 1547, 7, 71, 2, 2, 1547, 1548, 7, 72, 2, 2, 1548, 1549, 7, 86, 2, 2, 1549, 266, 3, 2, 2, 2, 1550, 1551, 7, 78, 2, 2, 1551, 1552, 7, 75, 2, 2, 1552, 1553, 7, 77, 2, 2, 1553, 1554, 7, 71, 2, 2, 1554, 268, 3, 2, 2, 2, 1555, 1556, 7, 78, 2, 2, 1556, 1557, 7, 75, 2, 2, 1557, 1558, 7, 79, 2, 2, 1558, 1559, 7, 75, 2, 2, 1559, 1560, 7, 86, 2, 2, 1560, 270, 3, 2, 2, 2, 1561, 1562, 7, 78, 2, 2, 1562, 1563, 7, 75, 2, 2, 1563, 1564, 7, 80, 2, 2, 1564, 1565, 7, 71, 2, 2, 1565, 1566, 7, 85, 2, 2, 1566, 272, 3, 2, 2, 2, 1567, 1568, 7, 78, 2, 2, 1568, 1569, 7, 75, 2, 2, 1569, 1570, 7, 85, 2, 2, 1570, 1571, 7, 86, 2, 2, 1571, 274, 3, 2, 2, 2, 1572, 1573, 7, 78, 2, 2, 1573, 1574, 7, 81, 2, 2, 1574, 1575, 7, 67, 2, 2, 1575, 1576, 7, 70, 2, 2, 1576, 276, 3, 2, 2, 2, 1577, 1578, 7, 78, 2, 2, 1578, 1579, 7, 81, 2, 2, 1579, 1580, 7, 69, 2, 2, 1580, 1581, 7, 67, 2, 2, 1581, 1582, 7, 78, 2, 2, 1582, 278, 3, 2, 2, 2, 1583, 1584, 7, 78, 2, 2, 1584, 1585, 7, 81, 2, 2, 1585, 1586, 7, 69, 2, 2, 1586, 1587, 7, 67, 2, 2, 1587, 1588, 7, 86, 2, 2, 1588, 1589, 7, 75, 2, 2, 1589, 1590, 7, 81, 2, 2, 1590, 1591, 7, 80, 2, 2, 1591, 280, 3, 2, 2, 2, 1592, 1593, 7, 78, 2, 2, 1593, 1594, 7, 81, 2, 2, 1594, 1595, 7, 69, 2, 2, 1595, 1596, 7, 77, 2, 2, 1596, 282, 3, 2, 2, 2, 1597, 1598, 7, 78, 2, 2, 1598, 1599, 7, 81, 2, 2, 1599, 1600, 7, 69, 2, 2, 1600, 1601, 7, 77, 2, 2, 1601, 1602, 7, 85, 2, 2, 1602, 284, 3, 2, 2, 2, 1603, 1604, 7, 78, 2, 2, 1604, 1605, 7, 81, 2, 2, 1605, 1606, 7, 73, 2, 2, 1606, 1607, 7, 75, 2, 2, 1607, 1608, 7, 69, 2, 2, 1608, 1609, 7, 67, 2, 2, 1609, 1610, 7, 78, 2, 2, 1610, 286, 3, 2, 2, 2, 1611, 1612, 7, 79, 2, 2, 1612, 1613, 7, 67, 2, 2, 1613, 1614, 7, 69, 2, 2, 1614, 1615, 7, 84, 2, 2, 1615, 1616, 7, 81, 2, 2, 1616, 288, 3, 2, 2, 2, 1617, 1618, 7, 79, 2, 2, 1618, 1619, 7, 67, 2, 2, 1619, 1620, 7, 82, 2, 2, 1620, 290, 3, 2, 2, 2, 1621, 1622, 7, 79, 2, 2, 1622, 1623, 7, 75, 2, 2, 1623, 1624, 7, 69, 2, 2, 1624, 1625, 7, 84, 2, 2, 1625, 1626, 7, 81, 2, 2, 1626, 1627, 7, 85, 2, 2, 1627, 1628, 7, 71, 2, 2, 1628, 1629, 7, 69, 2, 2, 1629, 1630, 7, 81, 2, 2, 1630, 1631, 7, 80, 2, 2, 1631, 1632, 7, 70, 2, 2, 1632, 292, 3, 2, 2, 2, 1633, 1634, 7, 79, 2, 2, 1634, 1635, 7, 75, 2, 2, 1635, 1636, 7, 69, 2, 2, 1636, 1637, 7, 84, 2, 2, 1637, 1638, 7, 81, 2, 2, 1638, 1639, 7, 85, 2, 2, 1639, 1640, 7, 71, 2, 2, 1640, 1641, 7, 69, 2, 2, 1641, 1642, 7, 81, 2, 2, 1642, 1643, 7, 80, 2, 2, 1643, 1644, 7, 70, 2, 2, 1644, 1645, 7, 85, 2, 2, 1645, 294, 3, 2, 2, 2, 1646, 1647, 7, 79, 2, 2, 1647, 1648, 7, 75, 2, 2, 1648, 1649, 7, 78, 2, 2, 1649, 1650, 7, 78, 2, 2, 1650, 1651, 7, 75, 2, 2, 1651, 1652, 7, 85, 2, 2, 1652, 1653, 7, 71, 2, 2, 1653, 1654, 7, 69, 2, 2, 1654, 1655, 7, 81, 2, 2, 1655, 1656, 7, 80, 2, 2, 1656, 1657, 7, 70, 2, 2, 1657, 296, 3, 2, 2, 2, 1658, 1659, 7, 79, 2, 2, 1659, 1660, 7, 75, 2, 2, 1660, 1661, 7, 78, 2, 2, 1661, 1662, 7, 78, 2, 2, 1662, 1663, 7, 75, 2, 2, 1663, 1664, 7, 85, 2, 2, 1664, 1665, 7, 71, 2, 2, 1665, 1666, 7, 69, 2, 2, 1666, 1667, 7, 81, 2, 2, 1667, 1668, 7, 80, 2, 2, 1668, 1669, 7, 70, 2, 2, 1669, 1670, 7, 85, 2, 2, 1670, 298, 3, 2, 2, 2, 1671, 1672, 7, 79, 2, 2, 1672, 1673, 7, 75, 2, 2, 1673, 1674, 7, 80, 2, 2, 1674, 1675, 7, 87, 2, 2, 1675, 1676, 7, 86, 2, 2, 1676, 1677, 7, 71, 2, 2, 1677, 300, 3, 2, 2, 2, 1678, 1679, 7, 79, 2, 2, 1679, 1680, 7, 75, 2, 2, 1680, 1681, 7, 80, 2, 2, 1681, 1682, 7, 87, 2, 2, 1682, 1683, 7, 86, 2, 2, 1683, 1684, 7, 71, 2, 2, 1684, 1685, 7, 85, 2, 2, 1685, 302, 3, 2, 2, 2, 1686, 1687, 7, 79, 2, 2, 1687, 1688, 7, 81, 2, 2, 1688, 1689, 7, 80, 2, 2, 1689, 1690, 7, 86, 2, 2, 1690, 1691, 7, 74, 2, 2, 1691, 304, 3, 2, 2, 2, 1692, 1693, 7, 79, 2, 2, 1693, 1694, 7, 81, 2, 2, 1694, 1695, 7, 80, 2, 2, 1695, 1696, 7, 86, 2, 2, 1696, 1697, 7, 74, 2, 2, 1697, 1698, 7, 85, 2, 2, 1698, 306, 3, 2, 2, 2, 1699, 1700, 7, 79, 2, 2, 1700, 1701, 7, 85, 2, 2, 1701, 1702, 7, 69, 2, 2, 1702, 1703, 7, 77, 2, 2, 1703, 308, 3, 2, 2, 2, 1704, 1705, 7, 80, 2, 2, 1705, 1706, 7, 67, 2, 2, 1706, 1707, 7, 79, 2, 2, 1707, 1708, 7, 71, 2, 2, 1708, 1709, 7, 85, 2, 2, 1709, 1710, 7, 82, 2, 2, 1710, 1711, 7, 67, 2, 2, 1711, 1712, 7, 69, 2, 2, 1712, 1713, 7, 71, 2, 2, 1713, 310, 3, 2, 2, 2, 1714, 1715, 7, 80, 2, 2, 1715, 1716, 7, 67, 2, 2, 1716, 1717, 7, 79, 2, 2, 1717, 1718, 7, 71, 2, 2, 1718, 1719, 7, 85, 2, 2, 1719, 1720, 7, 82, 2, 2, 1720, 1721, 7, 67, 2, 2, 1721, 1722, 7, 69, 2, 2, 1722, 1723, 7, 71, 2, 2, 1723, 1724, 7, 85, 2, 2, 1724, 312, 3, 2, 2, 2, 1725, 1726, 7, 80, 2, 2, 1726, 1727, 7, 67, 2, 2, 1727, 1728, 7, 86, 2, 2, 1728, 1729, 7, 87, 2, 2, 1729, 1730, 7, 84, 2, 2, 1730, 1731, 7, 67, 2, 2, 1731, 1732, 7, 78, 2, 2, 1732, 314, 3, 2, 2, 2, 1733, 1734, 7, 80, 2, 2, 1734, 1735, 7, 81, 2, 2, 1735, 316, 3, 2, 2, 2, 1736, 1737, 7, 80, 2, 2, 1737, 1738, 7, 81, 2, 2, 1738, 1741, 7, 86, 2, 2, 1739, 1741, 7, 35, 2, 2, 1740, 1736, 3, 2, 2, 2, 1740, 1739, 3, 2, 2, 2, 1741, 318, 3, 2, 2, 2, 1742, 1743, 7, 80, 2, 2, 1743, 1744, 7, 87, 2, 2, 1744, 1745, 7, 78, 2, 2, 1745, 1746, 7, 78, 2, 2, 1746, 320, 3, 2, 2, 2, 1747, 1748, 7, 80, 2, 2, 1748, 1749, 7, 87, 2, 2, 1749, 1750, 7, 78, 2, 2, 1750, 1751, 7, 78, 2, 2, 1751, 1752, 7, 85, 2, 2, 1752, 322, 3, 2, 2, 2, 1753, 1754, 7, 81, 2, 2, 1754, 1755, 7, 72, 2, 2, 1755, 324, 3, 2, 2, 2, 1756, 1757, 7, 81, 2, 2, 1757, 1758, 7, 80, 2, 2, 1758, 326, 3, 2, 2, 2, 1759, 1760, 7, 81, 2, 2, 1760, 1761, 7, 80, 2, 2, 1761, 1762, 7, 78, 2, 2, 1762, 1763, 7, 91, 2, 2, 1763, 328, 3, 2, 2, 2, 1764, 1765, 7, 81, 2, 2, 1765, 1766, 7, 82, 2, 2, 1766, 1767, 7, 86, 2, 2, 1767, 1768, 7, 75, 2, 2, 1768, 1769, 7, 81, 2, 2, 1769, 1770, 7, 80, 2, 2, 1770, 330, 3, 2, 2, 2, 1771, 1772, 7, 81, 2, 2, 1772, 1773, 7, 82, 2, 2, 1773, 1774, 7, 86, 2, 2, 1774, 1775, 7, 75, 2, 2, 1775, 1776, 7, 81, 2, 2, 1776, 1777, 7, 80, 2, 2, 1777, 1778, 7, 85, 2, 2, 1778, 332, 3, 2, 2, 2, 1779, 1780, 7, 81, 2, 2, 1780, 1781, 7, 84, 2, 2, 1781, 334, 3, 2, 2, 2, 1782, 1783, 7, 81, 2, 2, 1783, 1784, 7, 84, 2, 2, 1784, 1785, 7, 70, 2, 2, 1785, 1786, 7, 71, 2, 2, 1786, 1787, 7, 84, 2, 2, 1787, 336, 3, 2, 2, 2, 1788, 1789, 7, 81, 2, 2, 1789, 1790, 7, 87, 2, 2, 1790, 1791, 7, 86, 2, 2, 1791, 338, 3, 2, 2, 2, 1792, 1793, 7, 81, 2, 2, 1793, 1794, 7, 87, 2, 2, 1794, 1795, 7, 86, 2, 2, 1795, 1796, 7, 71, 2, 2, 1796, 1797, 7, 84, 2, 2, 1797, 340, 3, 2, 2, 2, 1798, 1799, 7, 81, 2, 2, 1799, 1800, 7, 87, 2, 2, 1800, 1801, 7, 86, 2, 2, 1801, 1802, 7, 82, 2, 2, 1802, 1803, 7, 87, 2, 2, 1803, 1804, 7, 86, 2, 2, 1804, 1805, 7, 72, 2, 2, 1805, 1806, 7, 81, 2, 2, 1806, 1807, 7, 84, 2, 2, 1807, 1808, 7, 79, 2, 2, 1808, 1809, 7, 67, 2, 2, 1809, 1810, 7, 86, 2, 2, 1810, 342, 3, 2, 2, 2, 1811, 1812, 7, 81, 2, 2, 1812, 1813, 7, 88, 2, 2, 1813, 1814, 7, 71, 2, 2, 1814, 1815, 7, 84, 2, 2, 1815, 344, 3, 2, 2, 2, 1816, 1817, 7, 81, 2, 2, 1817, 1818, 7, 88, 2, 2, 1818, 1819, 7, 71, 2, 2, 1819, 1820, 7, 84, 2, 2, 1820, 1821, 7, 78, 2, 2, 1821, 1822, 7, 67, 2, 2, 1822, 1823, 7, 82, 2, 2, 1823, 1824, 7, 85, 2, 2, 1824, 346, 3, 2, 2, 2, 1825, 1826, 7, 81, 2, 2, 1826, 1827, 7, 88, 2, 2, 1827, 1828, 7, 71, 2, 2, 1828, 1829, 7, 84, 2, 2, 1829, 1830, 7, 78, 2, 2, 1830, 1831, 7, 67, 2, 2, 1831, 1832, 7, 91, 2, 2, 1832, 348, 3, 2, 2, 2, 1833, 1834, 7, 81, 2, 2, 1834, 1835, 7, 88, 2, 2, 1835, 1836, 7, 71, 2, 2, 1836, 1837, 7, 84, 2, 2, 1837, 1838, 7, 89, 2, 2, 1838, 1839, 7, 84, 2, 2, 1839, 1840, 7, 75, 2, 2, 1840, 1841, 7, 86, 2, 2, 1841, 1842, 7, 71, 2, 2, 1842, 350, 3, 2, 2, 2, 1843, 1844, 7, 82, 2, 2, 1844, 1845, 7, 67, 2, 2, 1845, 1846, 7, 84, 2, 2, 1846, 1847, 7, 86, 2, 2, 1847, 1848, 7, 75, 2, 2, 1848, 1849, 7, 86, 2, 2, 1849, 1850, 7, 75, 2, 2, 1850, 1851, 7, 81, 2, 2, 1851, 1852, 7, 80, 2, 2, 1852, 352, 3, 2, 2, 2, 1853, 1854, 7, 82, 2, 2, 1854, 1855, 7, 67, 2, 2, 1855, 1856, 7, 84, 2, 2, 1856, 1857, 7, 86, 2, 2, 1857, 1858, 7, 75, 2, 2, 1858, 1859, 7, 86, 2, 2, 1859, 1860, 7, 75, 2, 2, 1860, 1861, 7, 81, 2, 2, 1861, 1862, 7, 80, 2, 2, 1862, 1863, 7, 71, 2, 2, 1863, 1864, 7, 70, 2, 2, 1864, 354, 3, 2, 2, 2, 1865, 1866, 7, 82, 2, 2, 1866, 1867, 7, 67, 2, 2, 1867, 1868, 7, 84, 2, 2, 1868, 1869, 7, 86, 2, 2, 1869, 1870, 7, 75, 2, 2, 1870, 1871, 7, 86, 2, 2, 1871, 1872, 7, 75, 2, 2, 1872, 1873, 7, 81, 2, 2, 1873, 1874, 7, 80, 2, 2, 1874, 1875, 7, 85, 2, 2, 1875, 356, 3, 2, 2, 2, 1876, 1877, 7, 82, 2, 2, 1877, 1878, 7, 71, 2, 2, 1878, 1879, 7, 84, 2, 2, 1879, 1880, 7, 69, 2, 2, 1880, 1881, 7, 71, 2, 2, 1881, 1882, 7, 80, 2, 2, 1882, 1883, 7, 86, 2, 2, 1883, 358, 3, 2, 2, 2, 1884, 1885, 7, 82, 2, 2, 1885, 1886, 7, 75, 2, 2, 1886, 1887, 7, 88, 2, 2, 1887, 1888, 7, 81, 2, 2, 1888, 1889, 7, 86, 2, 2, 1889, 360, 3, 2, 2, 2, 1890, 1891, 7, 82, 2, 2, 1891, 1892, 7, 78, 2, 2, 1892, 1893, 7, 67, 2, 2, 1893, 1894, 7, 69, 2, 2, 1894, 1895, 7, 75, 2, 2, 1895, 1896, 7, 80, 2, 2, 1896, 1897, 7, 73, 2, 2, 1897, 362, 3, 2, 2, 2, 1898, 1899, 7, 82, 2, 2, 1899, 1900, 7, 81, 2, 2, 1900, 1901, 7, 85, 2, 2, 1901, 1902, 7, 75, 2, 2, 1902, 1903, 7, 86, 2, 2, 1903, 1904, 7, 75, 2, 2, 1904, 1905, 7, 81, 2, 2, 1905, 1906, 7, 80, 2, 2, 1906, 364, 3, 2, 2, 2, 1907, 1908, 7, 82, 2, 2, 1908, 1909, 7, 84, 2, 2, 1909, 1910, 7, 71, 2, 2, 1910, 1911, 7, 69, 2, 2, 1911, 1912, 7, 71, 2, 2, 1912, 1913, 7, 70, 2, 2, 1913, 1914, 7, 75, 2, 2, 1914, 1915, 7, 80, 2, 2, 1915, 1916, 7, 73, 2, 2, 1916, 366, 3, 2, 2, 2, 1917, 1918, 7, 82, 2, 2, 1918, 1919, 7, 84, 2, 2, 1919, 1920, 7, 75, 2, 2, 1920, 1921, 7, 79, 2, 2, 1921, 1922, 7, 67, 2, 2, 1922, 1923, 7, 84, 2, 2, 1923, 1924, 7, 91, 2, 2, 1924, 368, 3, 2, 2, 2, 1925, 1926, 7, 82, 2, 2, 1926, 1927, 7, 84, 2, 2, 1927, 1928, 7, 75, 2, 2, 1928, 1929, 7, 80, 2, 2, 1929, 1930, 7, 69, 2, 2, 1930, 1931, 7, 75, 2, 2, 1931, 1932, 7, 82, 2, 2, 1932, 1933, 7, 67, 2, 2, 1933, 1934, 7, 78, 2, 2, 1934, 1935, 7, 85, 2, 2, 1935, 370, 3, 2, 2, 2, 1936, 1937, 7, 82, 2, 2, 1937, 1938, 7, 87, 2, 2, 1938, 1939, 7, 84, 2, 2, 1939, 1940, 7, 73, 2, 2, 1940, 1941, 7, 71, 2, 2, 1941, 372, 3, 2, 2, 2, 1942, 1943, 7, 83, 2, 2, 1943, 1944, 7, 87, 2, 2, 1944, 1945, 7, 71, 2, 2, 1945, 1946, 7, 84, 2, 2, 1946, 1947, 7, 91, 2, 2, 1947, 374, 3, 2, 2, 2, 1948, 1949, 7, 84, 2, 2, 1949, 1950, 7, 67, 2, 2, 1950, 1951, 7, 80, 2, 2, 1951, 1952, 7, 73, 2, 2, 1952, 1953, 7, 71, 2, 2, 1953, 376, 3, 2, 2, 2, 1954, 1955, 7, 84, 2, 2, 1955, 1956, 7, 71, 2, 2, 1956, 1957, 7, 69, 2, 2, 1957, 1958, 7, 81, 2, 2, 1958, 1959, 7, 84, 2, 2, 1959, 1960, 7, 70, 2, 2, 1960, 1961, 7, 84, 2, 2, 1961, 1962, 7, 71, 2, 2, 1962, 1963, 7, 67, 2, 2, 1963, 1964, 7, 70, 2, 2, 1964, 1965, 7, 71, 2, 2, 1965, 1966, 7, 84, 2, 2, 1966, 378, 3, 2, 2, 2, 1967, 1968, 7, 84, 2, 2, 1968, 1969, 7, 71, 2, 2, 1969, 1970, 7, 69, 2, 2, 1970, 1971, 7, 81, 2, 2, 1971, 1972, 7, 84, 2, 2, 1972, 1973, 7, 70, 2, 2, 1973, 1974, 7, 89, 2, 2, 1974, 1975, 7, 84, 2, 2, 1975, 1976, 7, 75, 2, 2, 1976, 1977, 7, 86, 2, 2, 1977, 1978, 7, 71, 2, 2, 1978, 1979, 7, 84, 2, 2, 1979, 380, 3, 2, 2, 2, 1980, 1981, 7, 84, 2, 2, 1981, 1982, 7, 71, 2, 2, 1982, 1983, 7, 69, 2, 2, 1983, 1984, 7, 81, 2, 2, 1984, 1985, 7, 88, 2, 2, 1985, 1986, 7, 71, 2, 2, 1986, 1987, 7, 84, 2, 2, 1987, 382, 3, 2, 2, 2, 1988, 1989, 7, 84, 2, 2, 1989, 1990, 7, 71, 2, 2, 1990, 1991, 7, 70, 2, 2, 1991, 1992, 7, 87, 2, 2, 1992, 1993, 7, 69, 2, 2, 1993, 1994, 7, 71, 2, 2, 1994, 384, 3, 2, 2, 2, 1995, 1996, 7, 84, 2, 2, 1996, 1997, 7, 71, 2, 2, 1997, 1998, 7, 72, 2, 2, 1998, 1999, 7, 71, 2, 2, 1999, 2000, 7, 84, 2, 2, 2000, 2001, 7, 71, 2, 2, 2001, 2002, 7, 80, 2, 2, 2002, 2003, 7, 69, 2, 2, 2003, 2004, 7, 71, 2, 2, 2004, 2005, 7, 85, 2, 2, 2005, 386, 3, 2, 2, 2, 2006, 2007, 7, 84, 2, 2, 2007, 2008, 7, 71, 2, 2, 2008, 2009, 7, 72, 2, 2, 2009, 2010, 7, 84, 2, 2, 2010, 2011, 7, 71, 2, 2, 2011, 2012, 7, 85, 2, 2, 2012, 2013, 7, 74, 2, 2, 2013, 388, 3, 2, 2, 2, 2014, 2015, 7, 84, 2, 2, 2015, 2016, 7, 71, 2, 2, 2016, 2017, 7, 80, 2, 2, 2017, 2018, 7, 67, 2, 2, 2018, 2019, 7, 79, 2, 2, 2019, 2020, 7, 71, 2, 2, 2020, 390, 3, 2, 2, 2, 2021, 2022, 7, 84, 2, 2, 2022, 2023, 7, 71, 2, 2, 2023, 2024, 7, 82, 2, 2, 2024, 2025, 7, 67, 2, 2, 2025, 2026, 7, 75, 2, 2, 2026, 2027, 7, 84, 2, 2, 2027, 392, 3, 2, 2, 2, 2028, 2029, 7, 84, 2, 2, 2029, 2030, 7, 71, 2, 2, 2030, 2031, 7, 82, 2, 2, 2031, 2032, 7, 78, 2, 2, 2032, 2033, 7, 67, 2, 2, 2033, 2034, 7, 69, 2, 2, 2034, 2035, 7, 71, 2, 2, 2035, 394, 3, 2, 2, 2, 2036, 2037, 7, 84, 2, 2, 2037, 2038, 7, 71, 2, 2, 2038, 2039, 7, 85, 2, 2, 2039, 2040, 7, 71, 2, 2, 2040, 2041, 7, 86, 2, 2, 2041, 396, 3, 2, 2, 2, 2042, 2043, 7, 84, 2, 2, 2043, 2044, 7, 71, 2, 2, 2044, 2045, 7, 85, 2, 2, 2045, 2046, 7, 82, 2, 2, 2046, 2047, 7, 71, 2, 2, 2047, 2048, 7, 69, 2, 2, 2048, 2049, 7, 86, 2, 2, 2049, 398, 3, 2, 2, 2, 2050, 2051, 7, 84, 2, 2, 2051, 2052, 7, 71, 2, 2, 2052, 2053, 7, 85, 2, 2, 2053, 2054, 7, 86, 2, 2, 2054, 2055, 7, 84, 2, 2, 2055, 2056, 7, 75, 2, 2, 2056, 2057, 7, 69, 2, 2, 2057, 2058, 7, 86, 2, 2, 2058, 400, 3, 2, 2, 2, 2059, 2060, 7, 84, 2, 2, 2060, 2061, 7, 71, 2, 2, 2061, 2062, 7, 88, 2, 2, 2062, 2063, 7, 81, 2, 2, 2063, 2064, 7, 77, 2, 2, 2064, 2065, 7, 71, 2, 2, 2065, 402, 3, 2, 2, 2, 2066, 2067, 7, 84, 2, 2, 2067, 2068, 7, 75, 2, 2, 2068, 2069, 7, 73, 2, 2, 2069, 2070, 7, 74, 2, 2, 2070, 2071, 7, 86, 2, 2, 2071, 404, 3, 2, 2, 2, 2072, 2073, 7, 84, 2, 2, 2073, 2074, 7, 78, 2, 2, 2074, 2075, 7, 75, 2, 2, 2075, 2076, 7, 77, 2, 2, 2076, 2084, 7, 71, 2, 2, 2077, 2078, 7, 84, 2, 2, 2078, 2079, 7, 71, 2, 2, 2079, 2080, 7, 73, 2, 2, 2080, 2081, 7, 71, 2, 2, 2081, 2082, 7, 90, 2, 2, 2082, 2084, 7, 82, 2, 2, 2083, 2072, 3, 2, 2, 2, 2083, 2077, 3, 2, 2, 2, 2084, 406, 3, 2, 2, 2, 2085, 2086, 7, 84, 2, 2, 2086, 2087, 7, 81, 2, 2, 2087, 2088, 7, 78, 2, 2, 2088, 2089, 7, 71, 2, 2, 2089, 408, 3, 2, 2, 2, 2090, 2091, 7, 84, 2, 2, 2091, 2092, 7, 81, 2, 2, 2092, 2093, 7, 78, 2, 2, 2093, 2094, 7, 71, 2, 2, 2094, 2095, 7, 85, 2, 2, 2095, 410, 3, 2, 2, 2, 2096, 2097, 7, 84, 2, 2, 2097, 2098, 7, 81, 2, 2, 2098, 2099, 7, 78, 2, 2, 2099, 2100, 7, 78, 2, 2, 2100, 2101, 7, 68, 2, 2, 2101, 2102, 7, 67, 2, 2, 2102, 2103, 7, 69, 2, 2, 2103, 2104, 7, 77, 2, 2, 2104, 412, 3, 2, 2, 2, 2105, 2106, 7, 84, 2, 2, 2106, 2107, 7, 81, 2, 2, 2107, 2108, 7, 78, 2, 2, 2108, 2109, 7, 78, 2, 2, 2109, 2110, 7, 87, 2, 2, 2110, 2111, 7, 82, 2, 2, 2111, 414, 3, 2, 2, 2, 2112, 2113, 7, 84, 2, 2, 2113, 2114, 7, 81, 2, 2, 2114, 2115, 7, 89, 2, 2, 2115, 416, 3, 2, 2, 2, 2116, 2117, 7, 84, 2, 2, 2117, 2118, 7, 81, 2, 2, 2118, 2119, 7, 89, 2, 2, 2119, 2120, 7, 85, 2, 2, 2120, 418, 3, 2, 2, 2, 2121, 2122, 7, 85, 2, 2, 2122, 2123, 7, 69, 2, 2, 2123, 2124, 7, 74, 2, 2, 2124, 2125, 7, 71, 2, 2, 2125, 2126, 7, 79, 2, 2, 2126, 2127, 7, 67, 2, 2, 2127, 420, 3, 2, 2, 2, 2128, 2129, 7, 85, 2, 2, 2129, 2130, 7, 71, 2, 2, 2130, 2131, 7, 69, 2, 2, 2131, 2132, 7, 81, 2, 2, 2132, 2133, 7, 80, 2, 2, 2133, 2134, 7, 70, 2, 2, 2134, 422, 3, 2, 2, 2, 2135, 2136, 7, 85, 2, 2, 2136, 2137, 7, 71, 2, 2, 2137, 2138, 7, 69, 2, 2, 2138, 2139, 7, 81, 2, 2, 2139, 2140, 7, 80, 2, 2, 2140, 2141, 7, 70, 2, 2, 2141, 2142, 7, 85, 2, 2, 2142, 424, 3, 2, 2, 2, 2143, 2144, 7, 85, 2, 2, 2144, 2145, 7, 71, 2, 2, 2145, 2146, 7, 78, 2, 2, 2146, 2147, 7, 71, 2, 2, 2147, 2148, 7, 69, 2, 2, 2148, 2149, 7, 86, 2, 2, 2149, 426, 3, 2, 2, 2, 2150, 2151, 7, 85, 2, 2, 2151, 2152, 7, 71, 2, 2, 2152, 2153, 7, 79, 2, 2, 2153, 2154, 7, 75, 2, 2, 2154, 428, 3, 2, 2, 2, 2155, 2156, 7, 85, 2, 2, 2156, 2157, 7, 71, 2, 2, 2157, 2158, 7, 82, 2, 2, 2158, 2159, 7, 67, 2, 2, 2159, 2160, 7, 84, 2, 2, 2160, 2161, 7, 67, 2, 2, 2161, 2162, 7, 86, 2, 2, 2162, 2163, 7, 71, 2, 2, 2163, 2164, 7, 70, 2, 2, 2164, 430, 3, 2, 2, 2, 2165, 2166, 7, 85, 2, 2, 2166, 2167, 7, 71, 2, 2, 2167, 2168, 7, 84, 2, 2, 2168, 2169, 7, 70, 2, 2, 2169, 2170, 7, 71, 2, 2, 2170, 432, 3, 2, 2, 2, 2171, 2172, 7, 85, 2, 2, 2172, 2173, 7, 71, 2, 2, 2173, 2174, 7, 84, 2, 2, 2174, 2175, 7, 70, 2, 2, 2175, 2176, 7, 71, 2, 2, 2176, 2177, 7, 82, 2, 2, 2177, 2178, 7, 84, 2, 2, 2178, 2179, 7, 81, 2, 2, 2179, 2180, 7, 82, 2, 2, 2180, 2181, 7, 71, 2, 2, 2181, 2182, 7, 84, 2, 2, 2182, 2183, 7, 86, 2, 2, 2183, 2184, 7, 75, 2, 2, 2184, 2185, 7, 71, 2, 2, 2185, 2186, 7, 85, 2, 2, 2186, 434, 3, 2, 2, 2, 2187, 2188, 7, 85, 2, 2, 2188, 2189, 7, 71, 2, 2, 2189, 2190, 7, 85, 2, 2, 2190, 2191, 7, 85, 2, 2, 2191, 2192, 7, 75, 2, 2, 2192, 2193, 7, 81, 2, 2, 2193, 2194, 7, 80, 2, 2, 2194, 2195, 7, 97, 2, 2, 2195, 2196, 7, 87, 2, 2, 2196, 2197, 7, 85, 2, 2, 2197, 2198, 7, 71, 2, 2, 2198, 2199, 7, 84, 2, 2, 2199, 436, 3, 2, 2, 2, 2200, 2201, 7, 85, 2, 2, 2201, 2202, 7, 71, 2, 2, 2202, 2203, 7, 86, 2, 2, 2203, 438, 3, 2, 2, 2, 2204, 2205, 7, 79, 2, 2, 2205, 2206, 7, 75, 2, 2, 2206, 2207, 7, 80, 2, 2, 2207, 2208, 7, 87, 2, 2, 2208, 2209, 7, 85, 2, 2, 2209, 440, 3, 2, 2, 2, 2210, 2211, 7, 85, 2, 2, 2211, 2212, 7, 71, 2, 2, 2212, 2213, 7, 86, 2, 2, 2213, 2214, 7, 85, 2, 2, 2214, 442, 3, 2, 2, 2, 2215, 2216, 7, 85, 2, 2, 2216, 2217, 7, 74, 2, 2, 2217, 2218, 7, 81, 2, 2, 2218, 2219, 7, 89, 2, 2, 2219, 444, 3, 2, 2, 2, 2220, 2221, 7, 85, 2, 2, 2221, 2222, 7, 77, 2, 2, 2222, 2223, 7, 71, 2, 2, 2223, 2224, 7, 89, 2, 2, 2224, 2225, 7, 71, 2, 2, 2225, 2226, 7, 70, 2, 2, 2226, 446, 3, 2, 2, 2, 2227, 2228, 7, 85, 2, 2, 2228, 2229, 7, 81, 2, 2, 2229, 2230, 7, 79, 2, 2, 2230, 2231, 7, 71, 2, 2, 2231, 448, 3, 2, 2, 2, 2232, 2233, 7, 85, 2, 2, 2233, 2234, 7, 81, 2, 2, 2234, 2235, 7, 84, 2, 2, 2235, 2236, 7, 86, 2, 2, 2236, 450, 3, 2, 2, 2, 2237, 2238, 7, 85, 2, 2, 2238, 2239, 7, 81, 2, 2, 2239, 2240, 7, 84, 2, 2, 2240, 2241, 7, 86, 2, 2, 2241, 2242, 7, 71, 2, 2, 2242, 2243, 7, 70, 2, 2, 2243, 452, 3, 2, 2, 2, 2244, 2245, 7, 85, 2, 2, 2245, 2246, 7, 86, 2, 2, 2246, 2247, 7, 67, 2, 2, 2247, 2248, 7, 84, 2, 2, 2248, 2249, 7, 86, 2, 2, 2249, 454, 3, 2, 2, 2, 2250, 2251, 7, 85, 2, 2, 2251, 2252, 7, 86, 2, 2, 2252, 2253, 7, 67, 2, 2, 2253, 2254, 7, 86, 2, 2, 2254, 2255, 7, 75, 2, 2, 2255, 2256, 7, 85, 2, 2, 2256, 2257, 7, 86, 2, 2, 2257, 2258, 7, 75, 2, 2, 2258, 2259, 7, 69, 2, 2, 2259, 2260, 7, 85, 2, 2, 2260, 456, 3, 2, 2, 2, 2261, 2262, 7, 85, 2, 2, 2262, 2263, 7, 86, 2, 2, 2263, 2264, 7, 81, 2, 2, 2264, 2265, 7, 84, 2, 2, 2265, 2266, 7, 71, 2, 2, 2266, 2267, 7, 70, 2, 2, 2267, 458, 3, 2, 2, 2, 2268, 2269, 7, 85, 2, 2, 2269, 2270, 7, 86, 2, 2, 2270, 2271, 7, 84, 2, 2, 2271, 2272, 7, 67, 2, 2, 2272, 2273, 7, 86, 2, 2, 2273, 2274, 7, 75, 2, 2, 2274, 2275, 7, 72, 2, 2, 2275, 2276, 7, 91, 2, 2, 2276, 460, 3, 2, 2, 2, 2277, 2278, 7, 85, 2, 2, 2278, 2279, 7, 86, 2, 2, 2279, 2280, 7, 84, 2, 2, 2280, 2281, 7, 87, 2, 2, 2281, 2282, 7, 69, 2, 2, 2282, 2283, 7, 86, 2, 2, 2283, 462, 3, 2, 2, 2, 2284, 2285, 7, 85, 2, 2, 2285, 2286, 7, 87, 2, 2, 2286, 2287, 7, 68, 2, 2, 2287, 2288, 7, 85, 2, 2, 2288, 2289, 7, 86, 2, 2, 2289, 2290, 7, 84, 2, 2, 2290, 464, 3, 2, 2, 2, 2291, 2292, 7, 85, 2, 2, 2292, 2293, 7, 87, 2, 2, 2293, 2294, 7, 68, 2, 2, 2294, 2295, 7, 85, 2, 2, 2295, 2296, 7, 86, 2, 2, 2296, 2297, 7, 84, 2, 2, 2297, 2298, 7, 75, 2, 2, 2298, 2299, 7, 80, 2, 2, 2299, 2300, 7, 73, 2, 2, 2300, 466, 3, 2, 2, 2, 2301, 2302, 7, 86, 2, 2, 2302, 2303, 7, 67, 2, 2, 2303, 2304, 7, 68, 2, 2, 2304, 2305, 7, 78, 2, 2, 2305, 2306, 7, 71, 2, 2, 2306, 468, 3, 2, 2, 2, 2307, 2308, 7, 86, 2, 2, 2308, 2309, 7, 67, 2, 2, 2309, 2310, 7, 68, 2, 2, 2310, 2311, 7, 78, 2, 2, 2311, 2312, 7, 71, 2, 2, 2312, 2313, 7, 85, 2, 2, 2313, 470, 3, 2, 2, 2, 2314, 2315, 7, 86, 2, 2, 2315, 2316, 7, 67, 2, 2, 2316, 2317, 7, 68, 2, 2, 2317, 2318, 7, 78, 2, 2, 2318, 2319, 7, 71, 2, 2, 2319, 2320, 7, 85, 2, 2, 2320, 2321, 7, 67, 2, 2, 2321, 2322, 7, 79, 2, 2, 2322, 2323, 7, 82, 2, 2, 2323, 2324, 7, 78, 2, 2, 2324, 2325, 7, 71, 2, 2, 2325, 472, 3, 2, 2, 2, 2326, 2327, 7, 86, 2, 2, 2327, 2328, 7, 68, 2, 2, 2328, 2329, 7, 78, 2, 2, 2329, 2330, 7, 82, 2, 2, 2330, 2331, 7, 84, 2, 2, 2331, 2332, 7, 81, 2, 2, 2332, 2333, 7, 82, 2, 2, 2333, 2334, 7, 71, 2, 2, 2334, 2335, 7, 84, 2, 2, 2335, 2336, 7, 86, 2, 2, 2336, 2337, 7, 75, 2, 2, 2337, 2338, 7, 71, 2, 2, 2338, 2339, 7, 85, 2, 2, 2339, 474, 3, 2, 2, 2, 2340, 2341, 7, 86, 2, 2, 2341, 2342, 7, 71, 2, 2, 2342, 2343, 7, 79, 2, 2, 2343, 2344, 7, 82, 2, 2, 2344, 2345, 7, 81, 2, 2, 2345, 2346, 7, 84, 2, 2, 2346, 2347, 7, 67, 2, 2, 2347, 2348, 7, 84, 2, 2, 2348, 2354, 7, 91, 2, 2, 2349, 2350, 7, 86, 2, 2, 2350, 2351, 7, 71, 2, 2, 2351, 2352, 7, 79, 2, 2, 2352, 2354, 7, 82, 2, 2, 2353, 2340, 3, 2, 2, 2, 2353, 2349, 3, 2, 2, 2, 2354, 476, 3, 2, 2, 2, 2355, 2356, 7, 86, 2, 2, 2356, 2357, 7, 71, 2, 2, 2357, 2358, 7, 84, 2, 2, 2358, 2359, 7, 79, 2, 2, 2359, 2360, 7, 75, 2, 2, 2360, 2361, 7, 80, 2, 2, 2361, 2362, 7, 67, 2, 2, 2362, 2363, 7, 86, 2, 2, 2363, 2364, 7, 71, 2, 2, 2364, 2365, 7, 70, 2, 2, 2365, 478, 3, 2, 2, 2, 2366, 2367, 7, 86, 2, 2, 2367, 2368, 7, 74, 2, 2, 2368, 2369, 7, 71, 2, 2, 2369, 2370, 7, 80, 2, 2, 2370, 480, 3, 2, 2, 2, 2371, 2372, 7, 86, 2, 2, 2372, 2373, 7, 81, 2, 2, 2373, 482, 3, 2, 2, 2, 2374, 2375, 7, 86, 2, 2, 2375, 2376, 7, 81, 2, 2, 2376, 2377, 7, 87, 2, 2, 2377, 2378, 7, 69, 2, 2, 2378, 2379, 7, 74, 2, 2, 2379, 484, 3, 2, 2, 2, 2380, 2381, 7, 86, 2, 2, 2381, 2382, 7, 84, 2, 2, 2382, 2383, 7, 67, 2, 2, 2383, 2384, 7, 75, 2, 2, 2384, 2385, 7, 78, 2, 2, 2385, 2386, 7, 75, 2, 2, 2386, 2387, 7, 80, 2, 2, 2387, 2388, 7, 73, 2, 2, 2388, 486, 3, 2, 2, 2, 2389, 2390, 7, 86, 2, 2, 2390, 2391, 7, 84, 2, 2, 2391, 2392, 7, 67, 2, 2, 2392, 2393, 7, 80, 2, 2, 2393, 2394, 7, 85, 2, 2, 2394, 2395, 7, 67, 2, 2, 2395, 2396, 7, 69, 2, 2, 2396, 2397, 7, 86, 2, 2, 2397, 2398, 7, 75, 2, 2, 2398, 2399, 7, 81, 2, 2, 2399, 2400, 7, 80, 2, 2, 2400, 488, 3, 2, 2, 2, 2401, 2402, 7, 86, 2, 2, 2402, 2403, 7, 84, 2, 2, 2403, 2404, 7, 67, 2, 2, 2404, 2405, 7, 80, 2, 2, 2405, 2406, 7, 85, 2, 2, 2406, 2407, 7, 67, 2, 2, 2407, 2408, 7, 69, 2, 2, 2408, 2409, 7, 86, 2, 2, 2409, 2410, 7, 75, 2, 2, 2410, 2411, 7, 81, 2, 2, 2411, 2412, 7, 80, 2, 2, 2412, 2413, 7, 85, 2, 2, 2413, 490, 3, 2, 2, 2, 2414, 2415, 7, 86, 2, 2, 2415, 2416, 7, 84, 2, 2, 2416, 2417, 7, 67, 2, 2, 2417, 2418, 7, 80, 2, 2, 2418, 2419, 7, 85, 2, 2, 2419, 2420, 7, 72, 2, 2, 2420, 2421, 7, 81, 2, 2, 2421, 2422, 7, 84, 2, 2, 2422, 2423, 7, 79, 2, 2, 2423, 492, 3, 2, 2, 2, 2424, 2425, 7, 86, 2, 2, 2425, 2426, 7, 84, 2, 2, 2426, 2427, 7, 75, 2, 2, 2427, 2428, 7, 79, 2, 2, 2428, 494, 3, 2, 2, 2, 2429, 2430, 7, 86, 2, 2, 2430, 2431, 7, 84, 2, 2, 2431, 2432, 7, 87, 2, 2, 2432, 2433, 7, 71, 2, 2, 2433, 496, 3, 2, 2, 2, 2434, 2435, 7, 86, 2, 2, 2435, 2436, 7, 84, 2, 2, 2436, 2437, 7, 87, 2, 2, 2437, 2438, 7, 80, 2, 2, 2438, 2439, 7, 69, 2, 2, 2439, 2440, 7, 67, 2, 2, 2440, 2441, 7, 86, 2, 2, 2441, 2442, 7, 71, 2, 2, 2442, 498, 3, 2, 2, 2, 2443, 2444, 7, 86, 2, 2, 2444, 2445, 7, 91, 2, 2, 2445, 2446, 7, 82, 2, 2, 2446, 2447, 7, 71, 2, 2, 2447, 500, 3, 2, 2, 2, 2448, 2449, 7, 87, 2, 2, 2449, 2450, 7, 80, 2, 2, 2450, 2451, 7, 67, 2, 2, 2451, 2452, 7, 84, 2, 2, 2452, 2453, 7, 69, 2, 2, 2453, 2454, 7, 74, 2, 2, 2454, 2455, 7, 75, 2, 2, 2455, 2456, 7, 88, 2, 2, 2456, 2457, 7, 71, 2, 2, 2457, 502, 3, 2, 2, 2, 2458, 2459, 7, 87, 2, 2, 2459, 2460, 7, 80, 2, 2, 2460, 2461, 7, 68, 2, 2, 2461, 2462, 7, 81, 2, 2, 2462, 2463, 7, 87, 2, 2, 2463, 2464, 7, 80, 2, 2, 2464, 2465, 7, 70, 2, 2, 2465, 2466, 7, 71, 2, 2, 2466, 2467, 7, 70, 2, 2, 2467, 504, 3, 2, 2, 2, 2468, 2469, 7, 87, 2, 2, 2469, 2470, 7, 80, 2, 2, 2470, 2471, 7, 69, 2, 2, 2471, 2472, 7, 67, 2, 2, 2472, 2473, 7, 69, 2, 2, 2473, 2474, 7, 74, 2, 2, 2474, 2475, 7, 71, 2, 2, 2475, 506, 3, 2, 2, 2, 2476, 2477, 7, 87, 2, 2, 2477, 2478, 7, 80, 2, 2, 2478, 2479, 7, 75, 2, 2, 2479, 2480, 7, 81, 2, 2, 2480, 2481, 7, 80, 2, 2, 2481, 508, 3, 2, 2, 2, 2482, 2483, 7, 87, 2, 2, 2483, 2484, 7, 80, 2, 2, 2484, 2485, 7, 75, 2, 2, 2485, 2486, 7, 83, 2, 2, 2486, 2487, 7, 87, 2, 2, 2487, 2488, 7, 71, 2, 2, 2488, 510, 3, 2, 2, 2, 2489, 2490, 7, 87, 2, 2, 2490, 2491, 7, 80, 2, 2, 2491, 2492, 7, 77, 2, 2, 2492, 2493, 7, 80, 2, 2, 2493, 2494, 7, 81, 2, 2, 2494, 2495, 7, 89, 2, 2, 2495, 2496, 7, 80, 2, 2, 2496, 512, 3, 2, 2, 2, 2497, 2498, 7, 87, 2, 2, 2498, 2499, 7, 80, 2, 2, 2499, 2500, 7, 78, 2, 2, 2500, 2501, 7, 81, 2, 2, 2501, 2502, 7, 69, 2, 2, 2502, 2503, 7, 77, 2, 2, 2503, 514, 3, 2, 2, 2, 2504, 2505, 7, 87, 2, 2, 2505, 2506, 7, 80, 2, 2, 2506, 2507, 7, 85, 2, 2, 2507, 2508, 7, 71, 2, 2, 2508, 2509, 7, 86, 2, 2, 2509, 516, 3, 2, 2, 2, 2510, 2511, 7, 87, 2, 2, 2511, 2512, 7, 82, 2, 2, 2512, 2513, 7, 70, 2, 2, 2513, 2514, 7, 67, 2, 2, 2514, 2515, 7, 86, 2, 2, 2515, 2516, 7, 71, 2, 2, 2516, 518, 3, 2, 2, 2, 2517, 2518, 7, 87, 2, 2, 2518, 2519, 7, 85, 2, 2, 2519, 2520, 7, 71, 2, 2, 2520, 520, 3, 2, 2, 2, 2521, 2522, 7, 87, 2, 2, 2522, 2523, 7, 85, 2, 2, 2523, 2524, 7, 71, 2, 2, 2524, 2525, 7, 84, 2, 2, 2525, 522, 3, 2, 2, 2, 2526, 2527, 7, 87, 2, 2, 2527, 2528, 7, 85, 2, 2, 2528, 2529, 7, 75, 2, 2, 2529, 2530, 7, 80, 2, 2, 2530, 2531, 7, 73, 2, 2, 2531, 524, 3, 2, 2, 2, 2532, 2533, 7, 88, 2, 2, 2533, 2534, 7, 67, 2, 2, 2534, 2535, 7, 78, 2, 2, 2535, 2536, 7, 87, 2, 2, 2536, 2537, 7, 71, 2, 2, 2537, 2538, 7, 85, 2, 2, 2538, 526, 3, 2, 2, 2, 2539, 2540, 7, 88, 2, 2, 2540, 2541, 7, 75, 2, 2, 2541, 2542, 7, 71, 2, 2, 2542, 2543, 7, 89, 2, 2, 2543, 528, 3, 2, 2, 2, 2544, 2545, 7, 89, 2, 2, 2545, 2546, 7, 71, 2, 2, 2546, 2547, 7, 71, 2, 2, 2547, 2548, 7, 77, 2, 2, 2548, 530, 3, 2, 2, 2, 2549, 2550, 7, 89, 2, 2, 2550, 2551, 7, 71, 2, 2, 2551, 2552, 7, 71, 2, 2, 2552, 2553, 7, 77, 2, 2, 2553, 2554, 7, 85, 2, 2, 2554, 532, 3, 2, 2, 2, 2555, 2556, 7, 89, 2, 2, 2556, 2557, 7, 74, 2, 2, 2557, 2558, 7, 71, 2, 2, 2558, 2559, 7, 80, 2, 2, 2559, 534, 3, 2, 2, 2, 2560, 2561, 7, 89, 2, 2, 2561, 2562, 7, 74, 2, 2, 2562, 2563, 7, 71, 2, 2, 2563, 2564, 7, 84, 2, 2, 2564, 2565, 7, 71, 2, 2, 2565, 536, 3, 2, 2, 2, 2566, 2567, 7, 89, 2, 2, 2567, 2568, 7, 75, 2, 2, 2568, 2569, 7, 80, 2, 2, 2569, 2570, 7, 70, 2, 2, 2570, 2571, 7, 81, 2, 2, 2571, 2572, 7, 89, 2, 2, 2572, 538, 3, 2, 2, 2, 2573, 2574, 7, 89, 2, 2, 2574, 2575, 7, 75, 2, 2, 2575, 2576, 7, 86, 2, 2, 2576, 2577, 7, 74, 2, 2, 2577, 540, 3, 2, 2, 2, 2578, 2579, 7, 91, 2, 2, 2579, 2580, 7, 71, 2, 2, 2580, 2581, 7, 67, 2, 2, 2581, 2582, 7, 84, 2, 2, 2582, 542, 3, 2, 2, 2, 2583, 2584, 7, 91, 2, 2, 2584, 2585, 7, 71, 2, 2, 2585, 2586, 7, 67, 2, 2, 2586, 2587, 7, 84, 2, 2, 2587, 2588, 7, 85, 2, 2, 2588, 544, 3, 2, 2, 2, 2589, 2593, 7, 63, 2, 2, 2590, 2591, 7, 63, 2, 2, 2591, 2593, 7, 63, 2, 2, 2592, 2589, 3, 2, 2, 2, 2592, 2590, 3, 2, 2, 2, 2593, 546, 3, 2, 2, 2, 2594, 2595, 7, 62, 2, 2, 2595, 2596, 7, 63, 2, 2, 2596, 2597, 7, 64, 2, 2, 2597, 548, 3, 2, 2, 2, 2598, 2599, 7, 62, 2, 2, 2599, 2600, 7, 64, 2, 2, 2600, 550, 3, 2, 2, 2, 2601, 2602, 7, 35, 2, 2, 2602, 2603, 7, 63, 2, 2, 2603, 552, 3, 2, 2, 2, 2604, 2605, 7, 62, 2, 2, 2605, 554, 3, 2, 2, 2, 2606, 2607, 7, 62, 2, 2, 2607, 2611, 7, 63, 2, 2, 2608, 2609, 7, 35, 2, 2, 2609, 2611, 7, 64, 2, 2, 2610, 2606, 3, 2, 2, 2, 2610, 2608, 3, 2, 2, 2, 2611, 556, 3, 2, 2, 2, 2612, 2613, 7, 64, 2, 2, 2613, 558, 3, 2, 2, 2, 2614, 2615, 7, 64, 2, 2, 2615, 2619, 7, 63, 2, 2, 2616, 2617, 7, 35, 2, 2, 2617, 2619, 7, 62, 2, 2, 2618, 2614, 3, 2, 2, 2, 2618, 2616, 3, 2, 2, 2, 2619, 560, 3, 2, 2, 2, 2620, 2621, 7, 45, 2, 2, 2621, 562, 3, 2, 2, 2, 2622, 2623, 7, 47, 2, 2, 2623, 564, 3, 2, 2, 2, 2624, 2625, 7, 44, 2, 2, 2625, 566, 3, 2, 2, 2, 2626, 2627, 7, 49, 2, 2, 2627, 568, 3, 2, 2, 2, 2628, 2629, 7, 39, 2, 2, 2629, 570, 3, 2, 2, 2, 2630, 2631, 7, 70, 2, 2, 2631, 2632, 7, 75, 2, 2, 2632, 2633, 7, 88, 2, 2, 2633, 572, 3, 2, 2, 2, 2634, 2635, 7, 128, 2, 2, 2635, 574, 3, 2, 2, 2, 2636, 2637, 7, 40, 2, 2, 2637, 576, 3, 2, 2, 2, 2638, 2639, 7, 126, 2, 2, 2639, 578, 3, 2, 2, 2, 2640, 2641, 7, 126, 2, 2, 2641, 2642, 7, 126, 2, 2, 2642, 580, 3, 2, 2, 2, 2643, 2644, 7, 96, 2, 2, 2644, 582, 3, 2, 2, 2, 2645, 2651, 7, 41, 2, 2, 2646, 2650, 10, 2, 2, 2, 2647, 2648, 7, 94, 2, 2, 2648, 2650, 11, 2, 2, 2, 2649, 2646, 3, 2, 2, 2, 2649, 2647, 3, 2, 2, 2, 2650, 2653, 3, 2, 2, 2, 2651, 2649, 3, 2, 2, 2, 2651, 2652, 3, 2, 2, 2, 2652, 2654, 3, 2, 2, 2, 2653, 2651, 3, 2, 2, 2, 2654, 2666, 7, 41, 2, 2, 2655, 2661, 7, 36, 2, 2, 2656, 2660, 10, 3, 2, 2, 2657, 2658, 7, 94, 2, 2, 2658, 2660, 11, 2, 2, 2, 2659, 2656, 3, 2, 2, 2, 2659, 2657, 3, 2, 2, 2, 2660, 2663, 3, 2, 2, 2, 2661, 2659, 3, 2, 2, 2, 2661, 2662, 3, 2, 2, 2, 2662, 2664, 3, 2, 2, 2, 2663, 2661, 3, 2, 2, 2, 2664, 2666, 7, 36, 2, 2, 2665, 2645, 3, 2, 2, 2, 2665, 2655, 3, 2, 2, 2, 2666, 584, 3, 2, 2, 2, 2667, 2669, 5, 607, 304, 2, 2668, 2667, 3, 2, 2, 2, 2669, 2670, 3, 2, 2, 2, 2670, 2668, 3, 2, 2, 2, 2670, 2671, 3, 2, 2, 2, 2671, 2672, 3, 2, 2, 2, 2672, 2673, 7, 78, 2, 2, 2673, 586, 3, 2, 2, 2, 2674, 2676, 5, 607, 304, 2, 2675, 2674, 3, 2, 2, 2, 2676, 2677, 3, 2, 2, 2, 2677, 2675, 3, 2, 2, 2, 2677, 2678, 3, 2, 2, 2, 2678, 2679, 3, 2, 2, 2, 2679, 2680, 7, 85, 2, 2, 2680, 588, 3, 2, 2, 2, 2681, 2683, 5, 607, 304, 2, 2682, 2681, 3, 2, 2, 2, 2683, 2684, 3, 2, 2, 2, 2684, 2682, 3, 2, 2, 2, 2684, 2685, 3, 2, 2, 2, 2685, 2686, 3, 2, 2, 2, 2686, 2687, 7, 91, 2, 2, 2687, 590, 3, 2, 2, 2, 2688, 2690, 5, 607, 304, 2, 2689, 2688, 3, 2, 2, 2, 2690, 2691, 3, 2, 2, 2, 2691, 2689, 3, 2, 2, 2, 2691, 2692, 3, 2, 2, 2, 2692, 592, 3, 2, 2, 2, 2693, 2695, 5, 607, 304, 2, 2694, 2693, 3, 2, 2, 2, 2695, 2696, 3, 2, 2, 2, 2696, 2694, 3, 2, 2, 2, 2696, 2697, 3, 2, 2, 2, 2697, 2698, 3, 2, 2, 2, 2698, 2699, 5, 605, 303, 2, 2699, 2707, 3, 2, 2, 2, 2700, 2702, 5, 603, 302, 2, 2701, 2703, 5, 605, 303, 2, 2702, 2701, 3, 2, 2, 2, 2702, 2703, 3, 2, 2, 2, 2703, 2704, 3, 2, 2, 2, 2704, 2705, 6, 297, 2, 2, 2705, 2707, 3, 2, 2, 2, 2706, 2694, 3, 2, 2, 2, 2706, 2700, 3, 2, 2, 2, 2707, 594, 3, 2, 2, 2, 2708, 2710, 5, 607, 304, 2, 2709, 2708, 3, 2, 2, 2, 2710, 2711, 3, 2, 2, 2, 2711, 2709, 3, 2, 2, 2, 2711, 2712, 3, 2, 2, 2, 2712, 2714, 3, 2, 2, 2, 2713, 2715, 5, 605, 303, 2, 2714, 2713, 3, 2, 2, 2, 2714, 2715, 3, 2, 2, 2, 2715, 2716, 3, 2, 2, 2, 2716, 2717, 7, 70, 2, 2, 2717, 2726, 3, 2, 2, 2, 2718, 2720, 5, 603, 302, 2, 2719, 2721, 5, 605, 303, 2, 2720, 2719, 3, 2, 2, 2, 2720, 2721, 3, 2, 2, 2, 2721, 2722, 3, 2, 2, 2, 2722, 2723, 7, 70, 2, 2, 2723, 2724, 6, 298, 3, 2, 2724, 2726, 3, 2, 2, 2, 2725, 2709, 3, 2, 2, 2, 2725, 2718, 3, 2, 2, 2, 2726, 596, 3, 2, 2, 2, 2727, 2729, 5, 607, 304, 2, 2728, 2727, 3, 2, 2, 2, 2729, 2730, 3, 2, 2, 2, 2730, 2728, 3, 2, 2, 2, 2730, 2731, 3, 2, 2, 2, 2731, 2733, 3, 2, 2, 2, 2732, 2734, 5, 605, 303, 2, 2733, 2732, 3, 2, 2, 2, 2733, 2734, 3, 2, 2, 2, 2734, 2735, 3, 2, 2, 2, 2735, 2736, 7, 68, 2, 2, 2736, 2737, 7, 70, 2, 2, 2737, 2748, 3, 2, 2, 2, 2738, 2740, 5, 603, 302, 2, 2739, 2741, 5, 605, 303, 2, 2740, 2739, 3, 2, 2, 2, 2740, 2741, 3, 2, 2, 2, 2741, 2742, 3, 2, 2, 2, 2742, 2743, 7, 68, 2, 2, 2743, 2744, 7, 70, 2, 2, 2744, 2745, 3, 2, 2, 2, 2745, 2746, 6, 299, 4, 2, 2746, 2748, 3, 2, 2, 2, 2747, 2728, 3, 2, 2, 2, 2747, 2738, 3, 2, 2, 2, 2748, 598, 3, 2, 2, 2, 2749, 2753, 5, 609, 305, 2, 2750, 2753, 5, 607, 304, 2, 2751, 2753, 7, 97, 2, 2, 2752, 2749, 3, 2, 2, 2, 2752, 2750, 3, 2, 2, 2, 2752, 2751, 3, 2, 2, 2, 2753, 2754, 3, 2, 2, 2, 2754, 2752, 3, 2, 2, 2, 2754, 2755, 3, 2, 2, 2, 2755, 600, 3, 2, 2, 2, 2756, 2762, 7, 98, 2, 2, 2757, 2761, 10, 4, 2, 2, 2758, 2759, 7, 98, 2, 2, 2759, 2761, 7, 98, 2, 2, 2760, 2757, 3, 2, 2, 2, 2760, 2758, 3, 2, 2, 2, 2761, 2764, 3, 2, 2, 2, 2762, 2760, 3, 2, 2, 2, 2762, 2763, 3, 2, 2, 2, 2763, 2765, 3, 2, 2, 2, 2764, 2762, 3, 2, 2, 2, 2765, 2766, 7, 98, 2, 2, 2766, 602, 3, 2, 2, 2, 2767, 2769, 5, 607, 304, 2, 2768, 2767, 3, 2, 2, 2, 2769, 2770, 3, 2, 2, 2, 2770, 2768, 3, 2, 2, 2, 2770, 2771, 3, 2, 2, 2, 2771, 2772, 3, 2, 2, 2, 2772, 2776, 7, 48, 2, 2, 2773, 2775, 5, 607, 304, 2, 2774, 2773, 3, 2, 2, 2, 2775, 2778, 3, 2, 2, 2, 2776, 2774, 3, 2, 2, 2, 2776, 2777, 3, 2, 2, 2, 2777, 2786, 3, 2, 2, 2, 2778, 2776, 3, 2, 2, 2, 2779, 2781, 7, 48, 2, 2, 2780, 2782, 5, 607, 304, 2, 2781, 2780, 3, 2, 2, 2, 2782, 2783, 3, 2, 2, 2, 2783, 2781, 3, 2, 2, 2, 2783, 2784, 3, 2, 2, 2, 2784, 2786, 3, 2, 2, 2, 2785, 2768, 3, 2, 2, 2, 2785, 2779, 3, 2, 2, 2, 2786, 604, 3, 2, 2, 2, 2787, 2789, 7, 71, 2, 2, 2788, 2790, 9, 5, 2, 2, 2789, 2788, 3, 2, 2, 2, 2789, 2790, 3, 2, 2, 2, 2790, 2792, 3, 2, 2, 2, 2791, 2793, 5, 607, 304, 2, 2792, 2791, 3, 2, 2, 2, 2793, 2794, 3, 2, 2, 2, 2794, 2792, 3, 2, 2, 2, 2794, 2795, 3, 2, 2, 2, 2795, 606, 3, 2, 2, 2, 2796, 2797, 9, 6, 2, 2, 2797, 608, 3, 2, 2, 2, 2798, 2799, 9, 7, 2, 2, 2799, 610, 3, 2, 2, 2, 2800, 2801, 7, 47, 2, 2, 2801, 2802, 7, 47, 2, 2, 2802, 2806, 3, 2, 2, 2, 2803, 2805, 10, 8, 2, 2, 2804, 2803, 3, 2, 2, 2, 2805, 2808, 3, 2, 2, 2, 2806, 2804, 3, 2, 2, 2, 2806, 2807, 3, 2, 2, 2, 2807, 2810, 3, 2, 2, 2, 2808, 2806, 3, 2, 2, 2, 2809, 2811, 7, 15, 2, 2, 2810, 2809, 3, 2, 2, 2, 2810, 2811, 3, 2, 2, 2, 2811, 2813, 3, 2, 2, 2, 2812, 2814, 7, 12, 2, 2, 2813, 2812, 3, 2, 2, 2, 2813, 2814, 3, 2, 2, 2, 2814, 2815, 3, 2, 2, 2, 2815, 2816, 8, 306, 2, 2, 2816, 612, 3, 2, 2, 2, 2817, 2818, 7, 49, 2, 2, 2818, 2819, 7, 44, 2, 2, 2819, 2820, 7, 44, 2, 2, 2820, 2821, 7, 49, 2, 2, 2821, 2822, 3, 2, 2, 2, 2822, 2823, 8, 307, 2, 2, 2823, 614, 3, 2, 2, 2, 2824, 2825, 7, 49, 2, 2, 2825, 2826, 7, 44, 2, 2, 2826, 2827, 3, 2, 2, 2, 2827, 2831, 10, 9, 2, 2, 2828, 2830, 11, 2, 2, 2, 2829, 2828, 3, 2, 2, 2, 2830, 2833, 3, 2, 2, 2, 2831, 2832, 3, 2, 2, 2, 2831, 2829, 3, 2, 2, 2, 2832, 2834, 3, 2, 2, 2, 2833, 2831, 3, 2, 2, 2, 2834, 2835, 7, 44, 2, 2, 2835, 2836, 7, 49, 2, 2, 2836, 2837, 3, 2, 2, 2, 2837, 2838, 8, 308, 2, 2, 2838, 616, 3, 2, 2, 2, 2839, 2841, 9, 10, 2, 2, 2840, 2839, 3, 2, 2, 2, 2841, 2842, 3, 2, 2, 2, 2842, 2840, 3, 2, 2, 2, 2842, 2843, 3, 2, 2, 2, 2843, 2844, 3, 2, 2, 2, 2844, 2845, 8, 309, 2, 2, 2845, 618, 3, 2, 2, 2, 2846, 2847, 11, 2, 2, 2, 2847, 620, 3, 2, 2, 2, 45, 2, 1042, 1740, 2083, 2353, 2592, 2610, 2618, 2649, 2651, 2659, 2661, 2665, 2670, 2677, 2684, 2691, 2696, 2702, 2706, 2711, 2714, 2720, 2725, 2730, 2733, 2740, 2747, 2752, 2754, 2760, 2762, 2770, 2776, 2783, 2785, 2789, 2794, 2806, 2810, 2813, 2831, 2842, 3, 2, 3, 2] -------------------------------------------------------------------------------- /src/sparkSql/SqlBaseLexer.tokens: -------------------------------------------------------------------------------- 1 | T__0=1 2 | T__1=2 3 | T__2=3 4 | T__3=4 5 | T__4=5 6 | T__5=6 7 | T__6=7 8 | T__7=8 9 | T__8=9 10 | T__9=10 11 | ADD=11 12 | AFTER=12 13 | ALL=13 14 | ALTER=14 15 | ANALYZE=15 16 | AND=16 17 | ANTI=17 18 | ANY=18 19 | ARCHIVE=19 20 | ARRAY=20 21 | AS=21 22 | ASC=22 23 | AT=23 24 | AUTHORIZATION=24 25 | BETWEEN=25 26 | BOTH=26 27 | BUCKET=27 28 | BUCKETS=28 29 | BY=29 30 | CACHE=30 31 | CASCADE=31 32 | CASE=32 33 | CAST=33 34 | CHANGE=34 35 | CHECK=35 36 | CLEAR=36 37 | CLUSTER=37 38 | CLUSTERED=38 39 | CODEGEN=39 40 | COLLATE=40 41 | COLLECTION=41 42 | COLUMN=42 43 | COLUMNS=43 44 | COMMENT=44 45 | COMMIT=45 46 | COMPACT=46 47 | COMPACTIONS=47 48 | COMPUTE=48 49 | CONCATENATE=49 50 | CONSTRAINT=50 51 | COST=51 52 | CREATE=52 53 | CROSS=53 54 | CUBE=54 55 | CURRENT=55 56 | CURRENT_DATE=56 57 | CURRENT_TIME=57 58 | CURRENT_TIMESTAMP=58 59 | CURRENT_USER=59 60 | DATA=60 61 | DATABASE=61 62 | DATABASES=62 63 | DAY=63 64 | DAYS=64 65 | DBPROPERTIES=65 66 | DEFINED=66 67 | DELETE=67 68 | DELIMITED=68 69 | DESC=69 70 | DESCRIBE=70 71 | DFS=71 72 | DIRECTORIES=72 73 | DIRECTORY=73 74 | DISTINCT=74 75 | DISTRIBUTE=75 76 | DROP=76 77 | ELSE=77 78 | END=78 79 | ESCAPED=79 80 | EXCEPT=80 81 | EXCHANGE=81 82 | EXISTS=82 83 | EXPLAIN=83 84 | EXPORT=84 85 | EXTENDED=85 86 | EXTERNAL=86 87 | EXTRACT=87 88 | FALSE=88 89 | FETCH=89 90 | FIELDS=90 91 | FILEFORMAT=91 92 | FIRST=92 93 | FIRST_VALUE=93 94 | FOLLOWING=94 95 | FOR=95 96 | FOREIGN=96 97 | FORMAT=97 98 | FORMATTED=98 99 | FROM=99 100 | FULL=100 101 | FUNCTION=101 102 | FUNCTIONS=102 103 | GLOBAL=103 104 | GRANT=104 105 | GROUP=105 106 | GROUPING=106 107 | HAVING=107 108 | HOUR=108 109 | HOURS=109 110 | IF=110 111 | IGNORE=111 112 | IMPORT=112 113 | IN=113 114 | INDEX=114 115 | INDEXES=115 116 | INNER=116 117 | INPATH=117 118 | INPUTFORMAT=118 119 | INSERT=119 120 | INTERSECT=120 121 | INTERVAL=121 122 | INTO=122 123 | IS=123 124 | ITEMS=124 125 | JOIN=125 126 | KEYS=126 127 | LAST=127 128 | LAST_VALUE=128 129 | LATERAL=129 130 | LAZY=130 131 | LEADING=131 132 | LEFT=132 133 | LIKE=133 134 | LIMIT=134 135 | LINES=135 136 | LIST=136 137 | LOAD=137 138 | LOCAL=138 139 | LOCATION=139 140 | LOCK=140 141 | LOCKS=141 142 | LOGICAL=142 143 | MACRO=143 144 | MAP=144 145 | MICROSECOND=145 146 | MICROSECONDS=146 147 | MILLISECOND=147 148 | MILLISECONDS=148 149 | MINUTE=149 150 | MINUTES=150 151 | MONTH=151 152 | MONTHS=152 153 | MSCK=153 154 | NAMESPACE=154 155 | NAMESPACES=155 156 | NATURAL=156 157 | NO=157 158 | NOT=158 159 | NULL=159 160 | NULLS=160 161 | OF=161 162 | ON=162 163 | ONLY=163 164 | OPTION=164 165 | OPTIONS=165 166 | OR=166 167 | ORDER=167 168 | OUT=168 169 | OUTER=169 170 | OUTPUTFORMAT=170 171 | OVER=171 172 | OVERLAPS=172 173 | OVERLAY=173 174 | OVERWRITE=174 175 | PARTITION=175 176 | PARTITIONED=176 177 | PARTITIONS=177 178 | PERCENTLIT=178 179 | PIVOT=179 180 | PLACING=180 181 | POSITION=181 182 | PRECEDING=182 183 | PRIMARY=183 184 | PRINCIPALS=184 185 | PURGE=185 186 | QUERY=186 187 | RANGE=187 188 | RECORDREADER=188 189 | RECORDWRITER=189 190 | RECOVER=190 191 | REDUCE=191 192 | REFERENCES=192 193 | REFRESH=193 194 | RENAME=194 195 | REPAIR=195 196 | REPLACE=196 197 | RESET=197 198 | RESPECT=198 199 | RESTRICT=199 200 | REVOKE=200 201 | RIGHT=201 202 | RLIKE=202 203 | ROLE=203 204 | ROLES=204 205 | ROLLBACK=205 206 | ROLLUP=206 207 | ROW=207 208 | ROWS=208 209 | SCHEMA=209 210 | SECOND=210 211 | SECONDS=211 212 | SELECT=212 213 | SEMI=213 214 | SEPARATED=214 215 | SERDE=215 216 | SERDEPROPERTIES=216 217 | SESSION_USER=217 218 | SET=218 219 | SETMINUS=219 220 | SETS=220 221 | SHOW=221 222 | SKEWED=222 223 | SOME=223 224 | SORT=224 225 | SORTED=225 226 | START=226 227 | STATISTICS=227 228 | STORED=228 229 | STRATIFY=229 230 | STRUCT=230 231 | SUBSTR=231 232 | SUBSTRING=232 233 | TABLE=233 234 | TABLES=234 235 | TABLESAMPLE=235 236 | TBLPROPERTIES=236 237 | TEMPORARY=237 238 | TERMINATED=238 239 | THEN=239 240 | TO=240 241 | TOUCH=241 242 | TRAILING=242 243 | TRANSACTION=243 244 | TRANSACTIONS=244 245 | TRANSFORM=245 246 | TRIM=246 247 | TRUE=247 248 | TRUNCATE=248 249 | TYPE=249 250 | UNARCHIVE=250 251 | UNBOUNDED=251 252 | UNCACHE=252 253 | UNION=253 254 | UNIQUE=254 255 | UNKNOWN=255 256 | UNLOCK=256 257 | UNSET=257 258 | UPDATE=258 259 | USE=259 260 | USER=260 261 | USING=261 262 | VALUES=262 263 | VIEW=263 264 | WEEK=264 265 | WEEKS=265 266 | WHEN=266 267 | WHERE=267 268 | WINDOW=268 269 | WITH=269 270 | YEAR=270 271 | YEARS=271 272 | EQ=272 273 | NSEQ=273 274 | NEQ=274 275 | NEQJ=275 276 | LT=276 277 | LTE=277 278 | GT=278 279 | GTE=279 280 | PLUS=280 281 | MINUS=281 282 | ASTERISK=282 283 | SLASH=283 284 | PERCENT=284 285 | DIV=285 286 | TILDE=286 287 | AMPERSAND=287 288 | PIPE=288 289 | CONCAT_PIPE=289 290 | HAT=290 291 | STRING=291 292 | BIGINT_LITERAL=292 293 | SMALLINT_LITERAL=293 294 | TINYINT_LITERAL=294 295 | INTEGER_VALUE=295 296 | DECIMAL_VALUE=296 297 | DOUBLE_LITERAL=297 298 | BIGDECIMAL_LITERAL=298 299 | IDENTIFIER=299 300 | BACKQUOTED_IDENTIFIER=300 301 | SIMPLE_COMMENT=301 302 | BRACKETED_EMPTY_COMMENT=302 303 | BRACKETED_COMMENT=303 304 | WS=304 305 | UNRECOGNIZED=305 306 | '('=1 307 | ')'=2 308 | ','=3 309 | '.'=4 310 | '/*+'=5 311 | '*/'=6 312 | '->'=7 313 | '['=8 314 | ']'=9 315 | ':'=10 316 | 'ADD'=11 317 | 'AFTER'=12 318 | 'ALL'=13 319 | 'ALTER'=14 320 | 'ANALYZE'=15 321 | 'AND'=16 322 | 'ANTI'=17 323 | 'ANY'=18 324 | 'ARCHIVE'=19 325 | 'ARRAY'=20 326 | 'AS'=21 327 | 'ASC'=22 328 | 'AT'=23 329 | 'AUTHORIZATION'=24 330 | 'BETWEEN'=25 331 | 'BOTH'=26 332 | 'BUCKET'=27 333 | 'BUCKETS'=28 334 | 'BY'=29 335 | 'CACHE'=30 336 | 'CASCADE'=31 337 | 'CASE'=32 338 | 'CAST'=33 339 | 'CHANGE'=34 340 | 'CHECK'=35 341 | 'CLEAR'=36 342 | 'CLUSTER'=37 343 | 'CLUSTERED'=38 344 | 'CODEGEN'=39 345 | 'COLLATE'=40 346 | 'COLLECTION'=41 347 | 'COLUMN'=42 348 | 'COLUMNS'=43 349 | 'COMMENT'=44 350 | 'COMMIT'=45 351 | 'COMPACT'=46 352 | 'COMPACTIONS'=47 353 | 'COMPUTE'=48 354 | 'CONCATENATE'=49 355 | 'CONSTRAINT'=50 356 | 'COST'=51 357 | 'CREATE'=52 358 | 'CROSS'=53 359 | 'CUBE'=54 360 | 'CURRENT'=55 361 | 'CURRENT_DATE'=56 362 | 'CURRENT_TIME'=57 363 | 'CURRENT_TIMESTAMP'=58 364 | 'CURRENT_USER'=59 365 | 'DATA'=60 366 | 'DATABASE'=61 367 | 'DAY'=63 368 | 'DAYS'=64 369 | 'DBPROPERTIES'=65 370 | 'DEFINED'=66 371 | 'DELETE'=67 372 | 'DELIMITED'=68 373 | 'DESC'=69 374 | 'DESCRIBE'=70 375 | 'DFS'=71 376 | 'DIRECTORIES'=72 377 | 'DIRECTORY'=73 378 | 'DISTINCT'=74 379 | 'DISTRIBUTE'=75 380 | 'DROP'=76 381 | 'ELSE'=77 382 | 'END'=78 383 | 'ESCAPED'=79 384 | 'EXCEPT'=80 385 | 'EXCHANGE'=81 386 | 'EXISTS'=82 387 | 'EXPLAIN'=83 388 | 'EXPORT'=84 389 | 'EXTENDED'=85 390 | 'EXTERNAL'=86 391 | 'EXTRACT'=87 392 | 'FALSE'=88 393 | 'FETCH'=89 394 | 'FIELDS'=90 395 | 'FILEFORMAT'=91 396 | 'FIRST'=92 397 | 'FIRST_VALUE'=93 398 | 'FOLLOWING'=94 399 | 'FOR'=95 400 | 'FOREIGN'=96 401 | 'FORMAT'=97 402 | 'FORMATTED'=98 403 | 'FROM'=99 404 | 'FULL'=100 405 | 'FUNCTION'=101 406 | 'FUNCTIONS'=102 407 | 'GLOBAL'=103 408 | 'GRANT'=104 409 | 'GROUP'=105 410 | 'GROUPING'=106 411 | 'HAVING'=107 412 | 'HOUR'=108 413 | 'HOURS'=109 414 | 'IF'=110 415 | 'IGNORE'=111 416 | 'IMPORT'=112 417 | 'IN'=113 418 | 'INDEX'=114 419 | 'INDEXES'=115 420 | 'INNER'=116 421 | 'INPATH'=117 422 | 'INPUTFORMAT'=118 423 | 'INSERT'=119 424 | 'INTERSECT'=120 425 | 'INTERVAL'=121 426 | 'INTO'=122 427 | 'IS'=123 428 | 'ITEMS'=124 429 | 'JOIN'=125 430 | 'KEYS'=126 431 | 'LAST'=127 432 | 'LAST_VALUE'=128 433 | 'LATERAL'=129 434 | 'LAZY'=130 435 | 'LEADING'=131 436 | 'LEFT'=132 437 | 'LIKE'=133 438 | 'LIMIT'=134 439 | 'LINES'=135 440 | 'LIST'=136 441 | 'LOAD'=137 442 | 'LOCAL'=138 443 | 'LOCATION'=139 444 | 'LOCK'=140 445 | 'LOCKS'=141 446 | 'LOGICAL'=142 447 | 'MACRO'=143 448 | 'MAP'=144 449 | 'MICROSECOND'=145 450 | 'MICROSECONDS'=146 451 | 'MILLISECOND'=147 452 | 'MILLISECONDS'=148 453 | 'MINUTE'=149 454 | 'MINUTES'=150 455 | 'MONTH'=151 456 | 'MONTHS'=152 457 | 'MSCK'=153 458 | 'NAMESPACE'=154 459 | 'NAMESPACES'=155 460 | 'NATURAL'=156 461 | 'NO'=157 462 | 'NULL'=159 463 | 'NULLS'=160 464 | 'OF'=161 465 | 'ON'=162 466 | 'ONLY'=163 467 | 'OPTION'=164 468 | 'OPTIONS'=165 469 | 'OR'=166 470 | 'ORDER'=167 471 | 'OUT'=168 472 | 'OUTER'=169 473 | 'OUTPUTFORMAT'=170 474 | 'OVER'=171 475 | 'OVERLAPS'=172 476 | 'OVERLAY'=173 477 | 'OVERWRITE'=174 478 | 'PARTITION'=175 479 | 'PARTITIONED'=176 480 | 'PARTITIONS'=177 481 | 'PERCENT'=178 482 | 'PIVOT'=179 483 | 'PLACING'=180 484 | 'POSITION'=181 485 | 'PRECEDING'=182 486 | 'PRIMARY'=183 487 | 'PRINCIPALS'=184 488 | 'PURGE'=185 489 | 'QUERY'=186 490 | 'RANGE'=187 491 | 'RECORDREADER'=188 492 | 'RECORDWRITER'=189 493 | 'RECOVER'=190 494 | 'REDUCE'=191 495 | 'REFERENCES'=192 496 | 'REFRESH'=193 497 | 'RENAME'=194 498 | 'REPAIR'=195 499 | 'REPLACE'=196 500 | 'RESET'=197 501 | 'RESPECT'=198 502 | 'RESTRICT'=199 503 | 'REVOKE'=200 504 | 'RIGHT'=201 505 | 'ROLE'=203 506 | 'ROLES'=204 507 | 'ROLLBACK'=205 508 | 'ROLLUP'=206 509 | 'ROW'=207 510 | 'ROWS'=208 511 | 'SCHEMA'=209 512 | 'SECOND'=210 513 | 'SECONDS'=211 514 | 'SELECT'=212 515 | 'SEMI'=213 516 | 'SEPARATED'=214 517 | 'SERDE'=215 518 | 'SERDEPROPERTIES'=216 519 | 'SESSION_USER'=217 520 | 'SET'=218 521 | 'MINUS'=219 522 | 'SETS'=220 523 | 'SHOW'=221 524 | 'SKEWED'=222 525 | 'SOME'=223 526 | 'SORT'=224 527 | 'SORTED'=225 528 | 'START'=226 529 | 'STATISTICS'=227 530 | 'STORED'=228 531 | 'STRATIFY'=229 532 | 'STRUCT'=230 533 | 'SUBSTR'=231 534 | 'SUBSTRING'=232 535 | 'TABLE'=233 536 | 'TABLES'=234 537 | 'TABLESAMPLE'=235 538 | 'TBLPROPERTIES'=236 539 | 'TERMINATED'=238 540 | 'THEN'=239 541 | 'TO'=240 542 | 'TOUCH'=241 543 | 'TRAILING'=242 544 | 'TRANSACTION'=243 545 | 'TRANSACTIONS'=244 546 | 'TRANSFORM'=245 547 | 'TRIM'=246 548 | 'TRUE'=247 549 | 'TRUNCATE'=248 550 | 'TYPE'=249 551 | 'UNARCHIVE'=250 552 | 'UNBOUNDED'=251 553 | 'UNCACHE'=252 554 | 'UNION'=253 555 | 'UNIQUE'=254 556 | 'UNKNOWN'=255 557 | 'UNLOCK'=256 558 | 'UNSET'=257 559 | 'UPDATE'=258 560 | 'USE'=259 561 | 'USER'=260 562 | 'USING'=261 563 | 'VALUES'=262 564 | 'VIEW'=263 565 | 'WEEK'=264 566 | 'WEEKS'=265 567 | 'WHEN'=266 568 | 'WHERE'=267 569 | 'WINDOW'=268 570 | 'WITH'=269 571 | 'YEAR'=270 572 | 'YEARS'=271 573 | '<=>'=273 574 | '<>'=274 575 | '!='=275 576 | '<'=276 577 | '>'=278 578 | '+'=280 579 | '-'=281 580 | '*'=282 581 | '/'=283 582 | '%'=284 583 | 'DIV'=285 584 | '~'=286 585 | '&'=287 586 | '|'=288 587 | '||'=289 588 | '^'=290 589 | '/**/'=302 590 | -------------------------------------------------------------------------------- /src/sparkSql/UpperCaseCharStream.js: -------------------------------------------------------------------------------- 1 | const UpperCaseCharStream = function (wrapped) { 2 | this.wrapped = wrapped 3 | } 4 | 5 | UpperCaseCharStream.prototype.consume = function () { 6 | this.wrapped.consume() 7 | } 8 | UpperCaseCharStream.prototype.getSourceName = function () { 9 | return this.wrapped.getSourceName 10 | } 11 | 12 | UpperCaseCharStream.prototype.index = function () { 13 | return this.wrapped.index 14 | } 15 | 16 | UpperCaseCharStream.prototype.mark = function () { 17 | return this.wrapped.mark 18 | } 19 | 20 | UpperCaseCharStream.prototype.release = function (marker) { 21 | return this.wrapped.release(marker) 22 | } 23 | 24 | UpperCaseCharStream.prototype.seek = function (where) { 25 | this.wrapped.seek(where) 26 | } 27 | 28 | UpperCaseCharStream.prototype.size = function () { 29 | return this.wrapped.size 30 | } 31 | 32 | UpperCaseCharStream.prototype.getText = function (interval) { 33 | if (this.size() > 0 && (interval.b - interval.a >= 0)) { 34 | return this.wrapped.getText(interval) 35 | } else { 36 | return '' 37 | } 38 | } 39 | 40 | /** 41 | * @return {number} 42 | */ 43 | UpperCaseCharStream.prototype.LA = function (i) { 44 | const la = this.wrapped.LA(i) 45 | if (la >= 97 && la <= 122) { 46 | return la - 32 47 | } else { 48 | return la 49 | } 50 | } 51 | 52 | export { 53 | UpperCaseCharStream 54 | } 55 | -------------------------------------------------------------------------------- /src/sparkSql/sparksql-lint.js: -------------------------------------------------------------------------------- 1 | import CodeMirror from 'codemirror' 2 | 3 | const antlr4 = require('antlr4') 4 | const SqlBaseLexer = require('./SqlBaseLexer.js').SqlBaseLexer 5 | const SqlBaseParser = require('./SqlBaseParser').SqlBaseParser 6 | const ParseErrorListener = require('./ParseErrorListener').ParseErrorListener 7 | 8 | CodeMirror.registerHelper('lint', 'sql', function (text, options) { 9 | const parserErrors = getAntlr4Errors(text) 10 | return parserErrors.map((err) => mapParseErrorToCodeMirrorError(err)) 11 | }) 12 | 13 | function getAntlr4Errors (input) { 14 | const stream = antlr4.CharStreams.fromString(input.toUpperCase()) 15 | const lexer = new SqlBaseLexer(stream) 16 | lexer.removeErrorListeners() 17 | var listener = new ParseErrorListener() 18 | lexer.addErrorListener(listener) 19 | const tokens = new antlr4.CommonTokenStream(lexer) 20 | const parser = new SqlBaseParser(tokens) 21 | parser.removeErrorListeners() 22 | parser.addErrorListener(listener) 23 | 24 | parser.singleStatement() 25 | 26 | return listener.getErrors() 27 | } 28 | 29 | function mapParseErrorToCodeMirrorError (err) { 30 | return { 31 | from: CodeMirror.Pos(err.row, err.col), 32 | to: CodeMirror.Pos(err.row, err.col + 3), 33 | message: err.text, 34 | severity: 'error' 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /static/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/waltyou/spark-sql-online-editor/c8b049b2745b4252cc6021fce28b82f5bd69d2c8/static/.gitkeep --------------------------------------------------------------------------------