From 976a95b70b4af6031a6c91febba2a3e4fce8187c Mon Sep 17 00:00:00 2001 From: Serhii Filonenko Date: Mon, 29 Jan 2024 12:53:36 +0200 Subject: [PATCH 01/37] package: add lodash library --- package-lock.json | 3100 +++++++++++++++++++++++++++++++++++++++++---- package.json | 20 +- 2 files changed, 2841 insertions(+), 279 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4002970..7aa8541 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,14 +7,20 @@ "": { "name": "CouchbaseV7Plus", "version": "0.0.3", + "dependencies": { + "lodash": "^4.17.21" + }, "devDependencies": { "@hackolade/hck-esbuild-plugins-pack": "0.0.1", - "esbuild": "0.19.12", + "@types/couchbase": "^2.4.9", + "esbuild": "0.19.11", "esbuild-plugin-clean": "1.0.1", "eslint": "8.56.0", "eslint-config-prettier": "9.1.0", "eslint-plugin-prettier": "5.1.3", + "install": "^0.13.0", "lint-staged": "14.0.1", + "npm": "^10.4.0", "prettier": "3.2.4", "simple-git-hooks": "2.9.0" }, @@ -33,9 +39,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", - "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.11.tgz", + "integrity": "sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==", "cpu": [ "ppc64" ], @@ -49,9 +55,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", - "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.11.tgz", + "integrity": "sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==", "cpu": [ "arm" ], @@ -65,9 +71,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", - "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.11.tgz", + "integrity": "sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==", "cpu": [ "arm64" ], @@ -81,9 +87,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", - "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.11.tgz", + "integrity": "sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==", "cpu": [ "x64" ], @@ -97,9 +103,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", - "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.11.tgz", + "integrity": "sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==", "cpu": [ "arm64" ], @@ -113,9 +119,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", - "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.11.tgz", + "integrity": "sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==", "cpu": [ "x64" ], @@ -129,9 +135,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", - "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.11.tgz", + "integrity": "sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==", "cpu": [ "arm64" ], @@ -145,9 +151,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", - "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.11.tgz", + "integrity": "sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==", "cpu": [ "x64" ], @@ -161,9 +167,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", - "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.11.tgz", + "integrity": "sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==", "cpu": [ "arm" ], @@ -177,9 +183,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", - "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.11.tgz", + "integrity": "sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==", "cpu": [ "arm64" ], @@ -193,9 +199,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", - "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.11.tgz", + "integrity": "sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==", "cpu": [ "ia32" ], @@ -209,9 +215,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", - "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.11.tgz", + "integrity": "sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==", "cpu": [ "loong64" ], @@ -225,9 +231,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", - "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.11.tgz", + "integrity": "sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==", "cpu": [ "mips64el" ], @@ -241,9 +247,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", - "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.11.tgz", + "integrity": "sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==", "cpu": [ "ppc64" ], @@ -257,9 +263,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", - "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.11.tgz", + "integrity": "sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==", "cpu": [ "riscv64" ], @@ -273,9 +279,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", - "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.11.tgz", + "integrity": "sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==", "cpu": [ "s390x" ], @@ -289,9 +295,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", - "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.11.tgz", + "integrity": "sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==", "cpu": [ "x64" ], @@ -305,9 +311,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", - "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.11.tgz", + "integrity": "sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==", "cpu": [ "x64" ], @@ -321,9 +327,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", - "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.11.tgz", + "integrity": "sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==", "cpu": [ "x64" ], @@ -337,9 +343,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", - "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.11.tgz", + "integrity": "sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==", "cpu": [ "x64" ], @@ -353,9 +359,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", - "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.11.tgz", + "integrity": "sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==", "cpu": [ "arm64" ], @@ -369,9 +375,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", - "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.11.tgz", + "integrity": "sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==", "cpu": [ "ia32" ], @@ -385,9 +391,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", - "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.11.tgz", + "integrity": "sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==", "cpu": [ "x64" ], @@ -548,6 +554,24 @@ "url": "https://opencollective.com/unts" } }, + "node_modules/@types/couchbase": { + "version": "2.4.9", + "resolved": "https://registry.npmjs.org/@types/couchbase/-/couchbase-2.4.9.tgz", + "integrity": "sha512-qQzFxeMbFU5U/s26UW4COD2MevkYRhunXx3D+GOuZROanOHmR3Hd3uKjOfqO4DpkXh3DMjVJX9qcMoM3CDdAFg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "20.11.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.6.tgz", + "integrity": "sha512-+EOokTnksGVgip2PbYbr3xnR7kZigh4LbybAfBAw5BpnQ+FqBYUsvCEjYd70IXKlbohQ64mzEYmMtlWUY8q//Q==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, "node_modules/@ungap/structured-clone": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", @@ -898,9 +922,9 @@ "dev": true }, "node_modules/esbuild": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", - "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", + "version": "0.19.11", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.11.tgz", + "integrity": "sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==", "dev": true, "hasInstallScript": true, "bin": { @@ -910,29 +934,29 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.19.12", - "@esbuild/android-arm": "0.19.12", - "@esbuild/android-arm64": "0.19.12", - "@esbuild/android-x64": "0.19.12", - "@esbuild/darwin-arm64": "0.19.12", - "@esbuild/darwin-x64": "0.19.12", - "@esbuild/freebsd-arm64": "0.19.12", - "@esbuild/freebsd-x64": "0.19.12", - "@esbuild/linux-arm": "0.19.12", - "@esbuild/linux-arm64": "0.19.12", - "@esbuild/linux-ia32": "0.19.12", - "@esbuild/linux-loong64": "0.19.12", - "@esbuild/linux-mips64el": "0.19.12", - "@esbuild/linux-ppc64": "0.19.12", - "@esbuild/linux-riscv64": "0.19.12", - "@esbuild/linux-s390x": "0.19.12", - "@esbuild/linux-x64": "0.19.12", - "@esbuild/netbsd-x64": "0.19.12", - "@esbuild/openbsd-x64": "0.19.12", - "@esbuild/sunos-x64": "0.19.12", - "@esbuild/win32-arm64": "0.19.12", - "@esbuild/win32-ia32": "0.19.12", - "@esbuild/win32-x64": "0.19.12" + "@esbuild/aix-ppc64": "0.19.11", + "@esbuild/android-arm": "0.19.11", + "@esbuild/android-arm64": "0.19.11", + "@esbuild/android-x64": "0.19.11", + "@esbuild/darwin-arm64": "0.19.11", + "@esbuild/darwin-x64": "0.19.11", + "@esbuild/freebsd-arm64": "0.19.11", + "@esbuild/freebsd-x64": "0.19.11", + "@esbuild/linux-arm": "0.19.11", + "@esbuild/linux-arm64": "0.19.11", + "@esbuild/linux-ia32": "0.19.11", + "@esbuild/linux-loong64": "0.19.11", + "@esbuild/linux-mips64el": "0.19.11", + "@esbuild/linux-ppc64": "0.19.11", + "@esbuild/linux-riscv64": "0.19.11", + "@esbuild/linux-s390x": "0.19.11", + "@esbuild/linux-x64": "0.19.11", + "@esbuild/netbsd-x64": "0.19.11", + "@esbuild/openbsd-x64": "0.19.11", + "@esbuild/sunos-x64": "0.19.11", + "@esbuild/win32-arm64": "0.19.11", + "@esbuild/win32-ia32": "0.19.11", + "@esbuild/win32-x64": "0.19.11" } }, "node_modules/esbuild-plugin-clean": { @@ -1482,6 +1506,15 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, + "node_modules/install": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/install/-/install-0.13.0.tgz", + "integrity": "sha512-zDml/jzr2PKU9I8J/xyZBQn8rPCAY//UOYNmR01XwNwyfhEWObo2SWfSl1+0tm1u6PhxLwDnfsT/6jB7OUxqFA==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -1712,6 +1745,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -1828,6 +1866,163 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, + "node_modules/npm": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/npm/-/npm-10.4.0.tgz", + "integrity": "sha512-RS7Mx0OVfXlOcQLRePuDIYdFCVBPCNapWHplDK+mh7GDdP/Tvor4ocuybRRPSvfcRb2vjRJt1fHCqw3cr8qACQ==", + "bundleDependencies": [ + "@isaacs/string-locale-compare", + "@npmcli/arborist", + "@npmcli/config", + "@npmcli/fs", + "@npmcli/map-workspaces", + "@npmcli/package-json", + "@npmcli/promise-spawn", + "@npmcli/run-script", + "@sigstore/tuf", + "abbrev", + "archy", + "cacache", + "chalk", + "ci-info", + "cli-columns", + "cli-table3", + "columnify", + "fastest-levenshtein", + "fs-minipass", + "glob", + "graceful-fs", + "hosted-git-info", + "ini", + "init-package-json", + "is-cidr", + "json-parse-even-better-errors", + "libnpmaccess", + "libnpmdiff", + "libnpmexec", + "libnpmfund", + "libnpmhook", + "libnpmorg", + "libnpmpack", + "libnpmpublish", + "libnpmsearch", + "libnpmteam", + "libnpmversion", + "make-fetch-happen", + "minimatch", + "minipass", + "minipass-pipeline", + "ms", + "node-gyp", + "nopt", + "normalize-package-data", + "npm-audit-report", + "npm-install-checks", + "npm-package-arg", + "npm-pick-manifest", + "npm-profile", + "npm-registry-fetch", + "npm-user-validate", + "npmlog", + "p-map", + "pacote", + "parse-conflict-json", + "proc-log", + "qrcode-terminal", + "read", + "semver", + "spdx-expression-parse", + "ssri", + "supports-color", + "tar", + "text-table", + "tiny-relative-date", + "treeverse", + "validate-npm-package-name", + "which", + "write-file-atomic" + ], + "dev": true, + "dependencies": { + "@isaacs/string-locale-compare": "^1.1.0", + "@npmcli/arborist": "^7.2.1", + "@npmcli/config": "^8.0.2", + "@npmcli/fs": "^3.1.0", + "@npmcli/map-workspaces": "^3.0.4", + "@npmcli/package-json": "^5.0.0", + "@npmcli/promise-spawn": "^7.0.1", + "@npmcli/run-script": "^7.0.4", + "@sigstore/tuf": "^2.3.0", + "abbrev": "^2.0.0", + "archy": "~1.0.0", + "cacache": "^18.0.2", + "chalk": "^5.3.0", + "ci-info": "^4.0.0", + "cli-columns": "^4.0.0", + "cli-table3": "^0.6.3", + "columnify": "^1.6.0", + "fastest-levenshtein": "^1.0.16", + "fs-minipass": "^3.0.3", + "glob": "^10.3.10", + "graceful-fs": "^4.2.11", + "hosted-git-info": "^7.0.1", + "ini": "^4.1.1", + "init-package-json": "^6.0.0", + "is-cidr": "^5.0.3", + "json-parse-even-better-errors": "^3.0.1", + "libnpmaccess": "^8.0.1", + "libnpmdiff": "^6.0.3", + "libnpmexec": "^7.0.4", + "libnpmfund": "^5.0.1", + "libnpmhook": "^10.0.0", + "libnpmorg": "^6.0.1", + "libnpmpack": "^6.0.3", + "libnpmpublish": "^9.0.2", + "libnpmsearch": "^7.0.0", + "libnpmteam": "^6.0.0", + "libnpmversion": "^5.0.1", + "make-fetch-happen": "^13.0.0", + "minimatch": "^9.0.3", + "minipass": "^7.0.4", + "minipass-pipeline": "^1.2.4", + "ms": "^2.1.2", + "node-gyp": "^10.0.1", + "nopt": "^7.2.0", + "normalize-package-data": "^6.0.0", + "npm-audit-report": "^5.0.0", + "npm-install-checks": "^6.3.0", + "npm-package-arg": "^11.0.1", + "npm-pick-manifest": "^9.0.0", + "npm-profile": "^9.0.0", + "npm-registry-fetch": "^16.1.0", + "npm-user-validate": "^2.0.0", + "npmlog": "^7.0.1", + "p-map": "^4.0.0", + "pacote": "^17.0.6", + "parse-conflict-json": "^3.0.1", + "proc-log": "^3.0.0", + "qrcode-terminal": "^0.12.0", + "read": "^2.1.0", + "semver": "^7.5.4", + "spdx-expression-parse": "^3.0.1", + "ssri": "^10.0.5", + "supports-color": "^9.4.0", + "tar": "^6.2.0", + "text-table": "~0.2.0", + "tiny-relative-date": "^1.3.0", + "treeverse": "^3.0.0", + "validate-npm-package-name": "^5.0.0", + "which": "^4.0.0", + "write-file-atomic": "^5.0.1" + }, + "bin": { + "npm": "bin/npm-cli.js", + "npx": "bin/npx-cli.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, "node_modules/npm-run-path": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.2.0.tgz", @@ -1855,252 +2050,2619 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "dependencies": { - "mimic-fn": "^4.0.0" - }, + "node_modules/npm/node_modules/@colors/colors": { + "version": "1.5.0", + "inBundle": true, + "license": "MIT", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.1.90" } }, - "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dev": true, + "node_modules/npm/node_modules/@isaacs/cliui": { + "version": "8.0.2", + "inBundle": true, + "license": "ISC", "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=12" } }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, + "node_modules/npm/node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "inBundle": true, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, + "node_modules/npm/node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "inBundle": true, + "license": "MIT", "dependencies": { - "p-limit": "^3.0.2" + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, + "node_modules/npm/node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "inBundle": true, + "license": "MIT", "dependencies": { - "aggregate-error": "^3.0.0" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, + "node_modules/npm/node_modules/@isaacs/string-locale-compare": { + "version": "1.1.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/@npmcli/agent": { + "version": "2.2.0", + "inBundle": true, + "license": "ISC", "dependencies": { - "callsites": "^3.0.0" + "agent-base": "^7.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "lru-cache": "^10.0.1", + "socks-proxy-agent": "^8.0.1" }, "engines": { - "node": ">=6" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, + "node_modules/npm/node_modules/@npmcli/arborist": { + "version": "7.3.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@isaacs/string-locale-compare": "^1.1.0", + "@npmcli/fs": "^3.1.0", + "@npmcli/installed-package-contents": "^2.0.2", + "@npmcli/map-workspaces": "^3.0.2", + "@npmcli/metavuln-calculator": "^7.0.0", + "@npmcli/name-from-folder": "^2.0.0", + "@npmcli/node-gyp": "^3.0.0", + "@npmcli/package-json": "^5.0.0", + "@npmcli/query": "^3.0.1", + "@npmcli/run-script": "^7.0.2", + "bin-links": "^4.0.1", + "cacache": "^18.0.0", + "common-ancestor-path": "^1.0.1", + "hosted-git-info": "^7.0.1", + "json-parse-even-better-errors": "^3.0.0", + "json-stringify-nice": "^1.1.4", + "minimatch": "^9.0.0", + "nopt": "^7.0.0", + "npm-install-checks": "^6.2.0", + "npm-package-arg": "^11.0.1", + "npm-pick-manifest": "^9.0.0", + "npm-registry-fetch": "^16.0.0", + "npmlog": "^7.0.1", + "pacote": "^17.0.4", + "parse-conflict-json": "^3.0.0", + "proc-log": "^3.0.0", + "promise-all-reject-late": "^1.0.0", + "promise-call-limit": "^3.0.1", + "read-package-json-fast": "^3.0.2", + "semver": "^7.3.7", + "ssri": "^10.0.5", + "treeverse": "^3.0.0", + "walk-up-path": "^3.0.1" + }, + "bin": { + "arborist": "bin/index.js" + }, "engines": { - "node": ">=8" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, + "node_modules/npm/node_modules/@npmcli/config": { + "version": "8.1.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/map-workspaces": "^3.0.2", + "ci-info": "^4.0.0", + "ini": "^4.1.0", + "nopt": "^7.0.0", + "proc-log": "^3.0.0", + "read-package-json-fast": "^3.0.2", + "semver": "^7.3.5", + "walk-up-path": "^3.0.1" + }, "engines": { - "node": ">=0.10.0" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, + "node_modules/npm/node_modules/@npmcli/disparity-colors": { + "version": "3.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "ansi-styles": "^4.3.0" + }, "engines": { - "node": ">=8" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, + "node_modules/npm/node_modules/@npmcli/disparity-colors/node_modules/ansi-styles": { + "version": "4.3.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { "node": ">=8" - } - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/pidtree": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", - "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", - "dev": true, - "bin": { - "pidtree": "bin/pidtree.js" + "node_modules/npm/node_modules/@npmcli/fs": { + "version": "3.1.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "semver": "^7.3.5" }, "engines": { - "node": ">=0.10" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, + "node_modules/npm/node_modules/@npmcli/git": { + "version": "5.0.4", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/promise-spawn": "^7.0.0", + "lru-cache": "^10.0.1", + "npm-pick-manifest": "^9.0.0", + "proc-log": "^3.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^4.0.0" + }, "engines": { - "node": ">= 0.8.0" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/prettier": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.4.tgz", - "integrity": "sha512-FWu1oLHKCrtpO1ypU6J0SbK2d9Ckwysq6bHj/uaCP26DxrPpppCLQRGVuqAxSTvhF00AcvDRyYrLNW7ocBhFFQ==", - "dev": true, + "node_modules/npm/node_modules/@npmcli/installed-package-contents": { + "version": "2.0.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-bundled": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, "bin": { - "prettier": "bin/prettier.cjs" + "installed-package-contents": "lib/index.js" }, "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, + "node_modules/npm/node_modules/@npmcli/map-workspaces": { + "version": "3.0.4", + "inBundle": true, + "license": "ISC", "dependencies": { - "fast-diff": "^1.1.2" + "@npmcli/name-from-folder": "^2.0.0", + "glob": "^10.2.2", + "minimatch": "^9.0.0", + "read-package-json-fast": "^3.0.0" }, "engines": { - "node": ">=6.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, + "node_modules/npm/node_modules/@npmcli/metavuln-calculator": { + "version": "7.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "cacache": "^18.0.0", + "json-parse-even-better-errors": "^3.0.0", + "pacote": "^17.0.0", + "semver": "^7.3.5" + }, "engines": { - "node": ">=6" + "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "node_modules/npm/node_modules/@npmcli/name-from-folder": { + "version": "2.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, + "node_modules/npm/node_modules/@npmcli/node-gyp": { + "version": "3.0.0", + "inBundle": true, + "license": "ISC", "engines": { - "node": ">=4" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/restore-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", - "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", - "dev": true, + "node_modules/npm/node_modules/@npmcli/package-json": { + "version": "5.0.0", + "inBundle": true, + "license": "ISC", "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" + "@npmcli/git": "^5.0.0", + "glob": "^10.2.2", + "hosted-git-info": "^7.0.0", + "json-parse-even-better-errors": "^3.0.0", + "normalize-package-data": "^6.0.0", + "proc-log": "^3.0.0", + "semver": "^7.5.3" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/promise-spawn": { + "version": "7.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "which": "^4.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/query": { + "version": "3.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@npmcli/run-script": { + "version": "7.0.4", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/node-gyp": "^3.0.0", + "@npmcli/package-json": "^5.0.0", + "@npmcli/promise-spawn": "^7.0.0", + "node-gyp": "^10.0.0", + "which": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/npm/node_modules/@sigstore/bundle": { + "version": "2.1.1", + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/protobuf-specs": "^0.2.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@sigstore/core": { + "version": "0.2.0", + "inBundle": true, + "license": "Apache-2.0", + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@sigstore/protobuf-specs": { + "version": "0.2.1", + "inBundle": true, + "license": "Apache-2.0", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@sigstore/sign": { + "version": "2.2.1", + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^2.1.1", + "@sigstore/core": "^0.2.0", + "@sigstore/protobuf-specs": "^0.2.1", + "make-fetch-happen": "^13.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@sigstore/tuf": { + "version": "2.3.0", + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/protobuf-specs": "^0.2.1", + "tuf-js": "^2.2.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@sigstore/verify": { + "version": "0.1.0", + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^2.1.1", + "@sigstore/core": "^0.2.0", + "@sigstore/protobuf-specs": "^0.2.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@tufjs/canonical-json": { + "version": "2.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/@tufjs/models": { + "version": "2.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "@tufjs/canonical-json": "2.0.0", + "minimatch": "^9.0.3" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/abbrev": { + "version": "2.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/agent-base": { + "version": "7.1.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/npm/node_modules/aggregate-error": { + "version": "3.1.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/ansi-regex": { + "version": "5.0.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/ansi-styles": { + "version": "6.2.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/npm/node_modules/aproba": { + "version": "2.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/archy": { + "version": "1.0.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/are-we-there-yet": { + "version": "4.0.2", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/balanced-match": { + "version": "1.0.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/bin-links": { + "version": "4.0.3", + "inBundle": true, + "license": "ISC", + "dependencies": { + "cmd-shim": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "read-cmd-shim": "^4.0.0", + "write-file-atomic": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/binary-extensions": { + "version": "2.2.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/brace-expansion": { + "version": "2.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/npm/node_modules/builtins": { + "version": "5.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "semver": "^7.0.0" + } + }, + "node_modules/npm/node_modules/cacache": { + "version": "18.0.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^10.0.1", + "minipass": "^7.0.3", + "minipass-collect": "^2.0.1", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^4.0.0", + "ssri": "^10.0.0", + "tar": "^6.1.11", + "unique-filename": "^3.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/chalk": { + "version": "5.3.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/npm/node_modules/chownr": { + "version": "2.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/ci-info": { + "version": "4.0.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/cidr-regex": { + "version": "4.0.3", + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "ip-regex": "^5.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/npm/node_modules/clean-stack": { + "version": "2.2.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/npm/node_modules/cli-columns": { + "version": "4.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/npm/node_modules/cli-table3": { + "version": "0.6.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "node_modules/npm/node_modules/clone": { + "version": "1.0.4", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/npm/node_modules/cmd-shim": { + "version": "6.0.2", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/color-convert": { + "version": "2.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/npm/node_modules/color-name": { + "version": "1.1.4", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/color-support": { + "version": "1.1.3", + "inBundle": true, + "license": "ISC", + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/npm/node_modules/columnify": { + "version": "1.6.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "strip-ansi": "^6.0.1", + "wcwidth": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/npm/node_modules/common-ancestor-path": { + "version": "1.0.1", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/console-control-strings": { + "version": "1.1.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/cross-spawn": { + "version": "7.0.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/npm/node_modules/cross-spawn/node_modules/which": { + "version": "2.0.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/npm/node_modules/cssesc": { + "version": "3.0.0", + "inBundle": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm/node_modules/debug": { + "version": "4.3.4", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/npm/node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/defaults": { + "version": "1.0.4", + "inBundle": true, + "license": "MIT", + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm/node_modules/diff": { + "version": "5.1.0", + "inBundle": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/npm/node_modules/eastasianwidth": { + "version": "0.2.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/emoji-regex": { + "version": "8.0.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/encoding": { + "version": "0.1.13", + "inBundle": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/npm/node_modules/env-paths": { + "version": "2.2.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/npm/node_modules/err-code": { + "version": "2.0.3", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/exponential-backoff": { + "version": "3.1.1", + "inBundle": true, + "license": "Apache-2.0" + }, + "node_modules/npm/node_modules/fastest-levenshtein": { + "version": "1.0.16", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/npm/node_modules/foreground-child": { + "version": "3.1.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/fs-minipass": { + "version": "3.0.3", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/function-bind": { + "version": "1.1.2", + "inBundle": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/npm/node_modules/gauge": { + "version": "5.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^4.0.1", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/glob": { + "version": "10.3.10", + "inBundle": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/graceful-fs": { + "version": "4.2.11", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/has-unicode": { + "version": "2.0.1", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/hasown": { + "version": "2.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/npm/node_modules/hosted-git-info": { + "version": "7.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/http-cache-semantics": { + "version": "4.1.1", + "inBundle": true, + "license": "BSD-2-Clause" + }, + "node_modules/npm/node_modules/http-proxy-agent": { + "version": "7.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/npm/node_modules/https-proxy-agent": { + "version": "7.0.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/npm/node_modules/iconv-lite": { + "version": "0.6.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm/node_modules/ignore-walk": { + "version": "6.0.4", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minimatch": "^9.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/imurmurhash": { + "version": "0.1.4", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/npm/node_modules/indent-string": { + "version": "4.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/ini": { + "version": "4.1.1", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/init-package-json": { + "version": "6.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-package-arg": "^11.0.0", + "promzard": "^1.0.0", + "read": "^2.0.0", + "read-package-json": "^7.0.0", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/ip": { + "version": "2.0.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/ip-regex": { + "version": "5.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm/node_modules/is-cidr": { + "version": "5.0.3", + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "cidr-regex": "4.0.3" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/npm/node_modules/is-core-module": { + "version": "2.13.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/npm/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/is-lambda": { + "version": "1.0.1", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/isexe": { + "version": "2.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/jackspeak": { + "version": "2.3.6", + "inBundle": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/npm/node_modules/json-parse-even-better-errors": { + "version": "3.0.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/json-stringify-nice": { + "version": "1.1.4", + "inBundle": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/jsonparse": { + "version": "1.3.1", + "engines": [ + "node >= 0.2.0" + ], + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/just-diff": { + "version": "6.0.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/just-diff-apply": { + "version": "5.5.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/libnpmaccess": { + "version": "8.0.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-package-arg": "^11.0.1", + "npm-registry-fetch": "^16.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmdiff": { + "version": "6.0.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/arborist": "^7.2.1", + "@npmcli/disparity-colors": "^3.0.0", + "@npmcli/installed-package-contents": "^2.0.2", + "binary-extensions": "^2.2.0", + "diff": "^5.1.0", + "minimatch": "^9.0.0", + "npm-package-arg": "^11.0.1", + "pacote": "^17.0.4", + "tar": "^6.2.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmexec": { + "version": "7.0.7", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/arborist": "^7.2.1", + "@npmcli/run-script": "^7.0.2", + "ci-info": "^4.0.0", + "npm-package-arg": "^11.0.1", + "npmlog": "^7.0.1", + "pacote": "^17.0.4", + "proc-log": "^3.0.0", + "read": "^2.0.0", + "read-package-json-fast": "^3.0.2", + "semver": "^7.3.7", + "walk-up-path": "^3.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmfund": { + "version": "5.0.4", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/arborist": "^7.2.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmhook": { + "version": "10.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^16.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmorg": { + "version": "6.0.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^16.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmpack": { + "version": "6.0.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/arborist": "^7.2.1", + "@npmcli/run-script": "^7.0.2", + "npm-package-arg": "^11.0.1", + "pacote": "^17.0.4" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmpublish": { + "version": "9.0.4", + "inBundle": true, + "license": "ISC", + "dependencies": { + "ci-info": "^4.0.0", + "normalize-package-data": "^6.0.0", + "npm-package-arg": "^11.0.1", + "npm-registry-fetch": "^16.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.7", + "sigstore": "^2.2.0", + "ssri": "^10.0.5" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmsearch": { + "version": "7.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-registry-fetch": "^16.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmteam": { + "version": "6.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "aproba": "^2.0.0", + "npm-registry-fetch": "^16.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/libnpmversion": { + "version": "5.0.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^5.0.3", + "@npmcli/run-script": "^7.0.2", + "json-parse-even-better-errors": "^3.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.7" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/lru-cache": { + "version": "10.1.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/npm/node_modules/make-fetch-happen": { + "version": "13.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/agent": "^2.0.0", + "cacache": "^18.0.0", + "http-cache-semantics": "^4.1.1", + "is-lambda": "^1.0.1", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "ssri": "^10.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/minimatch": { + "version": "9.0.3", + "inBundle": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/minipass": { + "version": "7.0.4", + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/npm/node_modules/minipass-collect": { + "version": "2.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/npm/node_modules/minipass-fetch": { + "version": "3.0.4", + "inBundle": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/npm/node_modules/minipass-flush": { + "version": "1.0.5", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/npm/node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minipass-json-stream": { + "version": "1.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" + } + }, + "node_modules/npm/node_modules/minipass-json-stream/node_modules/minipass": { + "version": "3.3.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minipass-pipeline": { + "version": "1.2.4", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minipass-sized": { + "version": "1.0.3", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/minizlib": { + "version": "2.1.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/npm/node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/mkdirp": { + "version": "1.0.4", + "inBundle": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/ms": { + "version": "2.1.3", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/mute-stream": { + "version": "1.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/negotiator": { + "version": "0.6.3", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/npm/node_modules/node-gyp": { + "version": "10.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "glob": "^10.3.10", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^13.0.0", + "nopt": "^7.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^4.0.0" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/nopt": { + "version": "7.2.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "abbrev": "^2.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/normalize-package-data": { + "version": "6.0.0", + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^7.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-audit-report": { + "version": "5.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-bundled": { + "version": "3.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-install-checks": { + "version": "6.3.0", + "inBundle": true, + "license": "BSD-2-Clause", + "dependencies": { + "semver": "^7.1.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-normalize-package-bin": { + "version": "3.0.1", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-package-arg": { + "version": "11.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "hosted-git-info": "^7.0.0", + "proc-log": "^3.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-packlist": { + "version": "8.0.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "ignore-walk": "^6.0.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-pick-manifest": { + "version": "9.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-install-checks": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "npm-package-arg": "^11.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-profile": { + "version": "9.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "npm-registry-fetch": "^16.0.0", + "proc-log": "^3.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-registry-fetch": { + "version": "16.1.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "make-fetch-happen": "^13.0.0", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.1.2", + "npm-package-arg": "^11.0.0", + "proc-log": "^3.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npm-user-validate": { + "version": "2.0.0", + "inBundle": true, + "license": "BSD-2-Clause", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/npmlog": { + "version": "7.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "are-we-there-yet": "^4.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^5.0.0", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/p-map": { + "version": "4.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm/node_modules/pacote": { + "version": "17.0.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^5.0.0", + "@npmcli/installed-package-contents": "^2.0.1", + "@npmcli/promise-spawn": "^7.0.0", + "@npmcli/run-script": "^7.0.0", + "cacache": "^18.0.0", + "fs-minipass": "^3.0.0", + "minipass": "^7.0.2", + "npm-package-arg": "^11.0.0", + "npm-packlist": "^8.0.0", + "npm-pick-manifest": "^9.0.0", + "npm-registry-fetch": "^16.0.0", + "proc-log": "^3.0.0", + "promise-retry": "^2.0.1", + "read-package-json": "^7.0.0", + "read-package-json-fast": "^3.0.0", + "sigstore": "^2.2.0", + "ssri": "^10.0.0", + "tar": "^6.1.11" + }, + "bin": { + "pacote": "lib/bin.js" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/parse-conflict-json": { + "version": "3.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "json-parse-even-better-errors": "^3.0.0", + "just-diff": "^6.0.0", + "just-diff-apply": "^5.2.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/path-key": { + "version": "3.1.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/path-scurry": { + "version": "1.10.1", + "inBundle": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/postcss-selector-parser": { + "version": "6.0.15", + "inBundle": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm/node_modules/proc-log": { + "version": "3.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/promise-all-reject-late": { + "version": "1.0.1", + "inBundle": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/promise-call-limit": { + "version": "3.0.1", + "inBundle": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/promise-inflight": { + "version": "1.0.1", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/promise-retry": { + "version": "2.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/promzard": { + "version": "1.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "read": "^2.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/qrcode-terminal": { + "version": "0.12.0", + "inBundle": true, + "bin": { + "qrcode-terminal": "bin/qrcode-terminal.js" + } + }, + "node_modules/npm/node_modules/read": { + "version": "2.1.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "mute-stream": "~1.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/read-cmd-shim": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/read-package-json": { + "version": "7.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "glob": "^10.2.2", + "json-parse-even-better-errors": "^3.0.0", + "normalize-package-data": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/read-package-json-fast": { + "version": "3.0.2", + "inBundle": true, + "license": "ISC", + "dependencies": { + "json-parse-even-better-errors": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/retry": { + "version": "0.12.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/npm/node_modules/safer-buffer": { + "version": "2.1.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/semver": { + "version": "7.5.4", + "inBundle": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/set-blocking": { + "version": "2.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/shebang-command": { + "version": "2.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/shebang-regex": { + "version": "3.0.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/signal-exit": { + "version": "4.1.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm/node_modules/sigstore": { + "version": "2.2.0", + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^2.1.1", + "@sigstore/core": "^0.2.0", + "@sigstore/protobuf-specs": "^0.2.1", + "@sigstore/sign": "^2.2.1", + "@sigstore/tuf": "^2.3.0", + "@sigstore/verify": "^0.1.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/smart-buffer": { + "version": "4.2.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/npm/node_modules/socks": { + "version": "2.7.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/npm/node_modules/socks-proxy-agent": { + "version": "8.0.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "socks": "^2.7.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/npm/node_modules/spdx-correct": { + "version": "3.2.0", + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/npm/node_modules/spdx-exceptions": { + "version": "2.3.0", + "inBundle": true, + "license": "CC-BY-3.0" + }, + "node_modules/npm/node_modules/spdx-expression-parse": { + "version": "3.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/npm/node_modules/spdx-license-ids": { + "version": "3.0.16", + "inBundle": true, + "license": "CC0-1.0" + }, + "node_modules/npm/node_modules/ssri": { + "version": "10.0.5", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/string-width": { + "version": "4.2.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "inBundle": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/strip-ansi": { + "version": "6.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/supports-color": { + "version": "9.4.0", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/npm/node_modules/tar": { + "version": "6.2.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm/node_modules/tar/node_modules/fs-minipass": { + "version": "2.1.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/npm/node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "inBundle": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm/node_modules/text-table": { + "version": "0.2.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/tiny-relative-date": { + "version": "1.3.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/treeverse": { + "version": "3.0.0", + "inBundle": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/tuf-js": { + "version": "2.2.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "@tufjs/models": "2.0.0", + "debug": "^4.3.4", + "make-fetch-happen": "^13.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/unique-filename": { + "version": "3.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "unique-slug": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/unique-slug": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/util-deprecate": { + "version": "1.0.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/validate-npm-package-license": { + "version": "3.0.4", + "inBundle": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/npm/node_modules/validate-npm-package-name": { + "version": "5.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "builtins": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/walk-up-path": { + "version": "3.0.1", + "inBundle": true, + "license": "ISC" + }, + "node_modules/npm/node_modules/wcwidth": { + "version": "1.0.1", + "inBundle": true, + "license": "MIT", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/npm/node_modules/which": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/which/node_modules/isexe": { + "version": "3.1.1", + "inBundle": true, + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "node_modules/npm/node_modules/wide-align": { + "version": "1.1.5", + "inBundle": true, + "license": "ISC", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/npm/node_modules/wrap-ansi": { + "version": "8.1.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/npm/node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/npm/node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/npm/node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "inBundle": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/npm/node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "9.2.2", + "inBundle": true, + "license": "MIT" + }, + "node_modules/npm/node_modules/wrap-ansi/node_modules/string-width": { + "version": "5.1.2", + "inBundle": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm/node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.0", + "inBundle": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/npm/node_modules/write-file-atomic": { + "version": "5.0.1", + "inBundle": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm/node_modules/yallist": { + "version": "4.0.0", + "inBundle": true, + "license": "ISC" + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pidtree": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", + "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", + "dev": true, + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.4.tgz", + "integrity": "sha512-FWu1oLHKCrtpO1ypU6J0SbK2d9Ckwysq6bHj/uaCP26DxrPpppCLQRGVuqAxSTvhF00AcvDRyYrLNW7ocBhFFQ==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/restore-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/restore-cursor/node_modules/mimic-fn": { @@ -2420,6 +4982,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, "node_modules/universalify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", diff --git a/package.json b/package.json index 6b7919b..fd8da2d 100644 --- a/package.json +++ b/package.json @@ -16,20 +16,8 @@ ] }, "features": { - "nestedCollections": false, - "forwardEngineering": { - "jsonSchema": { - "keepParentType": { - "binary": {} - } - } - }, - "enableReverseEngineering": true, "enableForwardEngineering": true, - "enableReverseEngineeringDetectionSchemaByContent": false, - "enableReversingDateTypeAsISODate": true, - "supportInferRelationships": true, - "enableREQueryAndSortCriteria": true + "enableArrayCollections": false } }, "description": "Hackolade plugin for Couchbase v7+ with scopes and collections", @@ -46,13 +34,19 @@ }, "devDependencies": { "@hackolade/hck-esbuild-plugins-pack": "0.0.1", + "@types/couchbase": "^2.4.9", "esbuild": "0.19.12", "esbuild-plugin-clean": "1.0.1", "eslint": "8.56.0", "eslint-config-prettier": "9.1.0", "eslint-plugin-prettier": "5.1.3", + "install": "^0.13.0", "lint-staged": "14.0.1", + "npm": "^10.4.0", "prettier": "3.2.4", "simple-git-hooks": "2.9.0" + }, + "dependencies": { + "lodash": "^4.17.21" } } From c617f9d4d8421c8c475753fc88d8f0fd0f22dee7 Mon Sep 17 00:00:00 2001 From: Serhii Filonenko Date: Mon, 29 Jan 2024 12:54:32 +0200 Subject: [PATCH 02/37] RE: update re modal config --- reverse_engineering/config.json | 9 +- .../connectionSettingsModalConfig.json | 204 ++++++------------ 2 files changed, 65 insertions(+), 148 deletions(-) diff --git a/reverse_engineering/config.json b/reverse_engineering/config.json index 46838f5..13e467b 100644 --- a/reverse_engineering/config.json +++ b/reverse_engineering/config.json @@ -5,11 +5,10 @@ */ { "errors": { - "NO_DATABASES": "There are no clusters in the DocumentDB instance", - "WRONG_CONNECTION": "Can not connect to the DocumentDB instance" + "NO_DATABASES": "There are no clusters in the Couchbase instance", + "WRONG_CONNECTION": "Can not connect to the Couchbase instance" }, "excludeDocKind": ["id"], - "scenario": "connectToDB", - "typeOfSerializer": "bson", - "helpUrl": "https://hackolade.com/help/ConnecttoaDocumentDBinstance.html" + "scenario": "getDocumentKind", + "helpUrl": "https://hackolade.com/help/ConnecttoaCouchbaseinstance.html" } diff --git a/reverse_engineering/connection_settings_modal/connectionSettingsModalConfig.json b/reverse_engineering/connection_settings_modal/connectionSettingsModalConfig.json index c33abf0..25f7386 100644 --- a/reverse_engineering/connection_settings_modal/connectionSettingsModalConfig.json +++ b/reverse_engineering/connection_settings_modal/connectionSettingsModalConfig.json @@ -6,190 +6,108 @@ "inputLabel": "Name", "inputKeyword": "name", "inputType": "text", - "inputPlaceholder": "Name" + "inputPlaceholder": "Name", + "description": "Choose a friendly connection name" }, { - "inputLabel": "Host", + "inputLabel": "Address", "inputKeyword": "host", "inputType": "text", - "inputPlaceholder": ".cluster-..docdb.amazonaws.com", - "defaultValue": "" + "inputPlaceholder": "Address", + "description": "Specify host IP address or DNS name of Couchbase server", + "validation": { + "regex": "([^\\s])" + } }, { "inputLabel": "Port", "inputKeyword": "port", - "inputType": "numeric", - "inputPlaceholder": "27017", - "defaultValue": "" - } - ] - }, - { - "tab": "Authentication", - "structure": [ + "inputType": "text", + "inputPlaceholder": "8091", + "description": "Specify port number of Couchbase server" + }, { - "inputLabel": "User Name", - "inputKeyword": "username", + "inputLabel": "Key Value Port", + "inputKeyword": "kv_port", "inputType": "text", - "inputPlaceholder": "User Name" + "inputPlaceholder": "11210", + "description": "Specify port number of Couchbase Key Value service" }, { - "inputLabel": "Password", - "inputKeyword": "password", - "inputType": "password", - "inputTooltip": "Password", - "isHiddenKey": true, - "defaultValue": "" + "inputLabel": "Specific bucket", + "inputType": "label" + }, + { + "inputLabel": "Name", + "inputKeyword": "couchbase_bucket", + "inputType": "text", + "inputPlaceholder": "Bucket", + "description": "Specify bucket name if it has a password" } ] }, { - "tab": "SSL", + "tab": "Auth", "structure": [ { - "inputLabel": "SSL", - "inputKeyword": "sslType", + "inputLabel": "Authentication", + "inputKeyword": "authType", "inputType": "select", + "defaultValue": "username_password", "options": [ { - "value": "Off", - "label": "Off" + "value": "username_password", + "label": "Username / Password" }, { - "value": "UNVALIDATED_SSL", - "label": "Unvalidated" - }, - { - "value": "TRUST_CUSTOM_CA_SIGNED_CERTIFICATES", - "label": "Server validation" + "value": "security_certificate", + "label": "Security certificate" } ] }, { - "inputLabel": "Certificate Authority", - "inputKeyword": "certAuthority", - "inputType": "file", - "inputPlaceholder": "Certificate Authority", - "extensions": ["pem", "crt", "key"], - "dependency": { - "key": "sslType", - "value": ["TRUST_CUSTOM_CA_SIGNED_CERTIFICATES"] - } - } - ] - }, - { - "tab": "SSH", - "structure": [ - { - "inputLabel": "Use SSH Tunnel", - "inputKeyword": "ssh", - "inputType": "checkbox", - "defaultValue": false - }, - { - "inputLabel": "SSH Address", - "inputKeyword": "ssh_host", - "inputType": "text", - "inputPlaceholder": "SSH Address", - "disable": { - "key": "ssh", - "value": false - } - }, - { - "inputLabel": "Port", - "inputKeyword": "ssh_port", - "inputType": "numeric", - "inputPlaceholder": "Port", - "defaultValue": 22, - "disable": { - "key": "ssh", - "value": false - } - }, - { - "inputLabel": "SSH User Name", - "inputKeyword": "ssh_user", + "inputLabel": "User Name", + "inputKeyword": "couchbase_username", "inputType": "text", - "inputPlaceholder": "ec2-user", - "defaultValue": "ec2-user", - "disable": { - "key": "ssh", - "value": false + "inputPlaceholder": "User Name", + "inputTooltip": "Provide username/password of either Full Couchbase administrator or Read-Only user (pre-5.x), or of user with proper role (5.0 and up)", + "dependency": { + "key": "authType", + "value": "username_password" } }, { - "inputLabel": "SSH Auth Method", - "inputKeyword": "ssh_method", - "inputType": "select", - "defaultValue": "privateKey", - "options": [ - { - "value": "privateKey", - "label": "Private Key" - } - ], - "disable": { - "key": "ssh", - "value": false + "inputLabel": "Password", + "inputKeyword": "couchbase_password", + "inputType": "password", + "inputPlaceholder": "Password", + "dependency": { + "key": "authType", + "value": "username_password" } }, { - "inputLabel": "Private Key", - "inputKeyword": "ssh_key_file", - "inputType": "file", - "inputPlaceholder": "Private Key", - "extensions": ["*"], + "inputLabel": "Security certificate", + "inputKeyword": "security_certificate", + "inputType": "certificate-file", + "inputPlaceholder": "Security certificate", + "description": "Specify path to the certificate which should be used for certificate authentication", "dependency": { - "key": "ssh_method", - "value": ["privateKey", ""] - }, - "disable": { - "key": "ssh", - "value": false + "key": "authType", + "value": "security_certificate" } }, { - "inputLabel": "Passphrase", - "inputKeyword": "ssh_key_passphrase", - "inputType": "password", - "inputPlaceholder": "Passphrase", - "isHiddenKey": true, + "inputLabel": "Key", + "inputKeyword": "security_certificate_key", + "inputType": "certificate-file", + "inputPlaceholder": "Key", + "description": "Specify path to the key which should be used for certificate authentication", "dependency": { - "key": "ssh_method", - "value": ["privateKey", ""] - }, - "disable": { - "key": "ssh", - "value": false + "key": "authType", + "value": "security_certificate" } } ] - }, - { - "lowerTab": "AWS Access", - "structure": [ - { - "inputLabel": "Access Key ID", - "inputKeyword": "accessKeyId", - "inputType": "text", - "inputPlaceholder": "Access Key ID" - }, - { - "inputLabel": "Secret Access Key", - "inputKeyword": "secretAccessKey", - "inputType": "password", - "inputPlaceholder": "Secret Access Key", - "isHiddenKey": true - }, - { - "inputLabel": "Session token", - "inputKeyword": "sessionToken", - "inputType": "text", - "inputPlaceholder": "Optional session token", - "isHiddenKey": true - } - ] } ] From 2b5ce56d6af92ace50c347d0e495475e10905d0f Mon Sep 17 00:00:00 2001 From: Serhii Filonenko Date: Mon, 29 Jan 2024 12:55:04 +0200 Subject: [PATCH 03/37] RE: implement get document kinds method --- reverse_engineering/api.js | 135 ++++++-- reverse_engineering/helpers/clusterHelper.js | 226 ++++++++++++ .../helpers/connectionHelper.js | 93 ++++- .../helpers/documentKindHelper.js | 327 ++++++++++++++++++ reverse_engineering/helpers/logHelper.js | 15 +- reverse_engineering/helpers/queryHelper.js | 24 ++ shared/constants.js | 52 +++ shared/types.d.ts | 104 ++++++ 8 files changed, 944 insertions(+), 32 deletions(-) create mode 100644 reverse_engineering/helpers/clusterHelper.js create mode 100644 reverse_engineering/helpers/documentKindHelper.js create mode 100644 reverse_engineering/helpers/queryHelper.js create mode 100644 shared/constants.js create mode 100644 shared/types.d.ts diff --git a/reverse_engineering/api.js b/reverse_engineering/api.js index 27aa76e..b29ef71 100644 --- a/reverse_engineering/api.js +++ b/reverse_engineering/api.js @@ -1,35 +1,116 @@ 'use strict'; +/** + * @typedef {import('../shared/types').App} App + * @typedef {import('../shared/types').ConnectionInfo} ConnectionInfo + * @typedef {import('../shared/types').Logger} Logger + * @typedef {import('../shared/types').Callback} Callback + */ + const connectionHelper = require('./helpers/connectionHelper'); -const { createLogger } = require('./helpers/logHelper'); +const clusterHelper = require('./helpers/clusterHelper'); +const documentKindHelper = require('./helpers/documentKindHelper'); +const logHelper = require('./helpers/logHelper'); -module.exports = { - disconnect: function (connectionInfo, logger, cb) { - connectionHelper.close(); - cb(); - }, - - async testConnection(connectionInfo, logger, cb) { - const log = createLogger({ - title: 'Test connection', - hiddenKeys: connectionInfo.hiddenKeys, - logger, - }); - }, +/** + * @param {ConnectionInfo} connectionInfo + * @param {Logger} logger + * @param {Callback} callback + */ +const disconnect = async (__connectionInfo, __logger, callback) => { + await connectionHelper.disconnect(); + callback(); +}; - async getDbCollectionsNames(connectionInfo, logger, cb, app) { - const log = createLogger({ - title: 'Retrieving databases and collections information', - hiddenKeys: connectionInfo.hiddenKeys, - logger, - }); - }, +/** + * @param {ConnectionInfo} connectionInfo + * @param {Logger} logger + * @param {Callback} callback + * @param {App} app + */ +const testConnection = async (connectionInfo, __logger, callback, app) => { + try { + await connectionHelper.disconnect(); + await connectionHelper.connect({ connectionInfo, app }); + await connectionHelper.disconnect(); + callback(); + } catch (error) { + callback(error); + } +}; - async getDbCollectionsData(data, logger, cb, app) { - const log = createLogger({ - title: 'Retrieving data for inferring schema', - hiddenKeys: data.hiddenKeys, - logger, +/** + * @param {ConnectionInfo} connectionInfo + * @param {Logger} logger + * @param {Callback} callback + * @param {App} app + */ +const getDocumentKinds = async (connectionInfo, logger, callback, app) => { + const log = logHelper.createLogger({ + title: 'Retrieving bucket default collection document kinds', + hiddenKeys: connectionInfo.hiddenKeys, + logger, + }); + try { + const cluster = await connectionHelper.connect({ connectionInfo, app }); + const bucketsDocumentKindList = await documentKindHelper.getBucketsDocumentKindList({ + cluster, + connectionInfo, + log, }); - }, + callback(null, bucketsDocumentKindList); + } catch (error) { + log.error(error); + await connectionHelper.disconnect(); + callback(error, []); + } +}; + +/** + * @param {ConnectionInfo} connectionInfo + * @param {Logger} logger + * @param {Callback} callback + * @param {App} app + */ +const getDbCollectionsNames = async (connectionInfo, logger, callback, app) => { + const log = logHelper.createLogger({ + title: 'Retrieving databases and collections information', + hiddenKeys: connectionInfo.hiddenKeys, + logger, + }); + + try { + const cluster = await connectionHelper.connect({ connectionInfo, app }); + const documents = await clusterHelper.getDbCollectionsNames({ connectionInfo, cluster, log }); + + callback(null, documents); + } catch (error) { + log.error(error); + connectionHelper.disconnect(); + callback(error); + } +}; + +/** + * @param {any} data + * @param {Logger} logger + * @param {Callback} callback + * @param {App} app + */ +const getDbCollectionsData = async (data, logger, callback, app) => { + const log = logHelper.createLogger({ + title: 'Retrieving data for inferring schema', + hiddenKeys: data.hiddenKeys, + logger, + }); + + callback(null, []); +}; + +module.exports = { + disconnect, + getDbCollectionsNames, + getDbCollectionsData, + getDocumentKinds, + testConnection, }; diff --git a/reverse_engineering/helpers/clusterHelper.js b/reverse_engineering/helpers/clusterHelper.js new file mode 100644 index 0000000..ce8c778 --- /dev/null +++ b/reverse_engineering/helpers/clusterHelper.js @@ -0,0 +1,226 @@ +/** + * @typedef {import('../../shared/types').Cluster} Cluster + * @typedef {import('../../shared/types').Bucket} Bucket + * @typedef {import('../../shared/types').Scope} Scope + * @typedef {import('../../shared/types').NameMap} NameMap + * @typedef {import('../../shared/types').ConnectionDataItem} ConnectionDataItem + * @typedef {import('../../shared/types').ConnectionInfo} ConnectionInfo + * @typedef {import('../../shared/types').Logger} Logger + */ +const _ = require('lodash'); +const { + COUCHBASE_ERROR_CODE, + DEFAULT_DOCUMENT_KIND, + DEFAULT_NAME, + DISABLED_TOOLTIP, + STATUS, +} = require('../../shared/constants'); +const queryHelper = require('./queryHelper'); + +/** + * @param {{ cluster: Cluster }} param0 + * @returns {Promise} + */ +const getAllBuckets = async ({ cluster }) => { + return await cluster.buckets().getAllBuckets(); +}; + +/** + * @param {{ cluster: Cluster; selectedBucket: string }} selectedBucket + * @returns {Promise} + */ +const getBucketsForReverse = async ({ cluster, selectedBucket }) => { + if (selectedBucket) { + return [{ name: selectedBucket }]; + } + + return getAllBuckets({ cluster }); +}; + +/** + * @param {{ cluster: Cluster; bucketName: string }} param0 + * @returns {Promise} + */ +const getBucketScopes = async ({ cluster, bucketName }) => { + const bucketInstance = await cluster.bucket(bucketName); + const collectionManager = await bucketInstance.collections(); + const bucketScopes = await collectionManager.getAllScopes(); + + return bucketScopes; +}; + +/** + * @param {{cluster: Cluster; selectedBucket: string; }} param0 + * @returns {Promise} + */ +const getBucketScopeNameMap = async ({ cluster, selectedBucket }) => { + const buckets = await getBucketsForReverse({ cluster, selectedBucket }); + const bucketScopeMap = {}; + + for (const bucket of buckets) { + const scopes = await getBucketScopes({ cluster, bucketName: bucket.name }); + bucketScopeMap[bucket.name] = scopes; + } + + return bucketScopeMap; +}; + +/** + * @param {{ scopes: Scope[] }} param0 + * @returns {boolean} + */ +const isBucketHasDefaultCollection = ({ scopes }) => { + const defaultScope = scopes.find(scope => scope.name === DEFAULT_NAME); + return !!defaultScope && defaultScope.collections.some(collection => collection.name === DEFAULT_NAME); +}; + +/** + * @param {{ cluster: Cluster;connectionInfo: ConnectionInfo;log: Logger; }} param0 + * @returns {Promise} + */ +const getDbCollectionsNames = async ({ cluster, connectionInfo, log }) => { + const connectionDataItems = []; + const bucketScopeMap = await getBucketScopeNameMap({ cluster, selectedBucket: connectionInfo.couchbase_bucket }); + + for (const bucketName in bucketScopeMap) { + const documentKind = connectionInfo.documentKinds?.[bucketName]?.documentKindName || DEFAULT_DOCUMENT_KIND; + const scopes = bucketScopeMap[bucketName]; + + for (const scope of scopes) { + const scopeName = scope.name; + const scopeCollectionNames = scope.collections.map(collection => collection.name); + const hasDefaultCollection = isBucketHasDefaultCollection({ scopes: [scope] }); + const documentKindCollectionNames = hasDefaultCollection + ? await getDocumentKindCollectionNames({ cluster, bucketName, documentKind, log }) + : []; + const collectionNames = [...documentKindCollectionNames, ...scopeCollectionNames]; + const dataItem = prepareConnectionDataItem({ bucketName, scopeName, collectionNames }); + + connectionDataItems.push(dataItem); + } + } + + return connectionDataItems; +}; + +/** + * + * @param {{ cluster: Cluster;bucketName: string;scopeName: string;documentKind: string; log: Logger }} param0 + * @returns {Promise} + */ +const getDocumentKindCollectionNames = async ({ cluster, bucketName, documentKind, log }) => { + try { + if (documentKind === DEFAULT_DOCUMENT_KIND) { + return []; + } + + const selectQuery = queryHelper.getSelectBucketDocumentKindQuery({ bucketName, documentKind }); + const { rows: documents } = await cluster.query(selectQuery); + const collectionNames = documents.map(doc => doc[documentKind]).filter(Boolean); + + return collectionNames; + } catch (error) { + const errorCode = getErrorCode({ error }); + const errorMessage = getErrorMessage({ error }); + if ( + errorCode === COUCHBASE_ERROR_CODE.primaryIndexDoesNotExist || + errorCode === COUCHBASE_ERROR_CODE.n1qlMethodsAreNotSupported + ) { + //TODO get Fetched documents + return []; + } + + log.error(errorMessage); + return []; + } +}; +/** + * @param {{ cluster: Cluster; bucketName: string; }} param0 + * @throws {Error} + * @returns {Promise} + */ +const getDocumentsByInfer = async ({ cluster, bucketName }) => { + const inferBucketDocumentsQuery = queryHelper.getInferBucketDocumentsQuery({ bucketName }); + const { rows: documents, meta } = await cluster.query(inferBucketDocumentsQuery); + const metaError = _.get(meta, 'errors.[0].[0]'); + const isDocumentEmpty = _.get(documents, '[0].properties'); + + if (metaError) { + throw metaError; + } + + if (isDocumentEmpty) { + const error = new Error(); + error.code = COUCHBASE_ERROR_CODE.bucketIsEmpty; + throw error; + } + + return documents; +}; + +/** + * @param {{ cluster: Cluster; bucketName: string; }} param0 + * @returns {Promise} + */ +const getDocumentsBySelectStatement = async ({ cluster, bucketName }) => { + const selectBucketDocumentsQuery = queryHelper.getSelectBucketDocumentsQuery({ bucketName }); + const { rows: documents } = await cluster.query(selectBucketDocumentsQuery); + + return documents; +}; + +/** + * @param {{ error: Error }} param0 + * @returns {number | undefined} + */ +const getErrorCode = ({ error }) => { + return error?.cause?.first_error_code || error?.code; +}; + +/** + * @param {{ error: Error }} param0 + * @returns {string} + */ +const getErrorMessage = ({ error }) => { + const errorCode = getErrorCode({ error }); + switch (errorCode) { + case COUCHBASE_ERROR_CODE.bucketIsEmpty: + return 'Collection is empty.'; + case COUCHBASE_ERROR_CODE.n1qlMethodsAreNotSupported: + return 'N1QL methods are not supported.'; + case COUCHBASE_ERROR_CODE.parseSyntaxError: + case COUCHBASE_ERROR_CODE.inferMethodIsNotSupport: + return 'Infer method is not supported.'; + case COUCHBASE_ERROR_CODE.userDoesNotHaveAccessToPrivilegeCluster: + return 'User doesn`t have credentials for privileged cluster.'; + default: + return error?.message || ''; + } +}; + +/** + * @param {{ bucketName: string; scopeName: string; collectionNames?: string[]; status?: STATUS; }} param0 + * @returns {ConnectionDataItem} + */ +const prepareConnectionDataItem = ({ bucketName, scopeName, collectionNames, status }) => { + const hasError = status === STATUS.hasError; + const dbCollections = hasError ? [] : _.uniq(collectionNames); + return { + scopeName, + dbCollections, + dbName: bucketName, + ...(status && { status }), + ...(hasError && { disabledTooltip: DISABLED_TOOLTIP }), + }; +}; + +module.exports = { + isBucketHasDefaultCollection, + getAllBuckets, + getBucketScopeNameMap, + getDbCollectionsNames, + getDocumentsBySelectStatement, + getDocumentsByInfer, + getErrorCode, + getErrorMessage, +}; diff --git a/reverse_engineering/helpers/connectionHelper.js b/reverse_engineering/helpers/connectionHelper.js index 8d61709..76b8981 100644 --- a/reverse_engineering/helpers/connectionHelper.js +++ b/reverse_engineering/helpers/connectionHelper.js @@ -1,10 +1,95 @@ -function generateConnectionParams(connectionInfo) {} +/** + * @typedef {import('../../shared/types').App} App + * @typedef {import('../../shared/types').Cluster} Cluster + * @typedef {import('../../shared/types').ConnectionInfo} ConnectionInfo + * @typedef {import('../../shared/types').ConnectionParams} ConnectionParams + */ -async function connect(connectionInfo) {} +const clusterHelper = require('./clusterHelper'); +const { AUTH_TYPE, COUCHBASE_HOST_PREFIX, COUCHBASE_DEFAULT_KV_CONNECTION_PORT } = require('../../shared/constants'); -function close() {} +let cluster = null; + +/** + * @param {{ connectionInfo: ConnectionInfo }} param0 + * @returns {boolean} + */ +const isCloudStorage = ({ connectionInfo }) => { + return connectionInfo.host.startsWith(COUCHBASE_HOST_PREFIX.cloud); +}; + +/** + * @param {{ connectionInfo: ConnectionInfo }} param0 + * @returns {string} + */ +const generateUrl = ({ connectionInfo }) => { + if (isCloudStorage({ connectionInfo })) { + return connectionInfo.host; + } + + const keyValuePort = connectionInfo.kv_port || COUCHBASE_DEFAULT_KV_CONNECTION_PORT; + + return `${COUCHBASE_HOST_PREFIX.selfHosted}${connectionInfo.host}:${keyValuePort}`; +}; + +/** + * @param {{ connectionInfo: ConnectionInfo }} + * @returns {ConnectionParams} + */ +const generateConnectionParams = ({ connectionInfo }) => { + if (connectionInfo.authType === AUTH_TYPE.securityCertificate) { + return { + url: generateUrl({ connectionInfo }), + options: { + authenticator: { + certificatePath: connectionInfo.security_certificate, + keyPath: connectionInfo.security_certificate_key, + }, + }, + }; + } + + return { + url: generateUrl({ connectionInfo }), + options: { + username: connectionInfo.couchbase_username, + password: connectionInfo.couchbase_password, + }, + }; +}; + +/** + * @param {{ connectionInfo: ConnectionInfo; app: App; }} param0 + * @throws {Error} + * @returns {Promise} + */ +const connect = async ({ connectionInfo, app }) => { + if (cluster) { + return cluster; + } + + const couchbase = app.require('couchbase'); + const { url, options } = generateConnectionParams({ connectionInfo }); + cluster = await couchbase.connect(url, options); + const buckets = await clusterHelper.getAllBuckets({ cluster }); + const selectedBucket = connectionInfo.couchbase_bucket; + + if (selectedBucket && !buckets.includes(selectedBucket)) { + throw new Error(`Bucket ${selectedBucket} doesn't exist`); + } + + return cluster; +}; + +/** + * @returns {Promise} + */ +const disconnect = async () => { + await cluster?.close(); + cluster = null; +}; module.exports = { connect, - close, + disconnect, }; diff --git a/reverse_engineering/helpers/documentKindHelper.js b/reverse_engineering/helpers/documentKindHelper.js new file mode 100644 index 0000000..41806c4 --- /dev/null +++ b/reverse_engineering/helpers/documentKindHelper.js @@ -0,0 +1,327 @@ +/** + * @typedef {import("../../shared/types").Cluster} Cluster + * @typedef {import("../../shared/types").ConnectionInfo} ConnectionInfo + * @typedef {import("../../shared/types").ConnectionDataItem} ConnectionDataItem + * @typedef {import("../../shared/types").Logger} Logger + */ +const _ = require('lodash'); +const clusterHelper = require('./clusterHelper'); +const { COUCHBASE_ERROR_CODE, DEFAULT_NAME, FLAVOR_REGEX, STATUS } = require('../../shared/constants'); + +/** + * @param {{ bucketName: string; status?: STATUS; }} param0 + * @returns {DocumentKindData} + */ +const getDefaultDocumentKindDataByBucket = ({ bucketName, status }) => { + return { bucketName, documentList: [], documentKind: '', status }; +}; + +/** + * @param {{ cluster: Cluster; connectionInfo: ConnectionInfo; log: Logger; }} param0 + * @returns {Promise} + */ +const getBucketsDocumentKindList = async ({ cluster, connectionInfo, log }) => { + const documentKindList = []; + const selectedBucket = connectionInfo.couchbase_bucket; + const bucketScopeNameMap = await clusterHelper.getBucketScopeNameMap({ cluster, selectedBucket }); + + for (const bucketName in bucketScopeNameMap) { + const scopes = bucketScopeNameMap[bucketName]; + const hasDefaultCollection = clusterHelper.isBucketHasDefaultCollection({ scopes }); + + if (hasDefaultCollection) { + const documentKindData = await getBucketDocumentKindData({ cluster, connectionInfo, bucketName, log }); + documentKindList.push(documentKindData); + } + } + + return documentKindList; +}; + +/** + * @param {{ cluster: Cluster; connectionInfo: ConnectionInfo; bucketName: string; log: Logger; }} param0 + * @returns {Promise} + */ +const getBucketDocumentKindData = async ({ cluster, connectionInfo, bucketName, log }) => { + const keySpaceName = `${bucketName}.${DEFAULT_NAME}.${DEFAULT_NAME}: `; + + return clusterHelper + .getDocumentsByInfer({ cluster, bucketName }) + .then(documents => { + log.info(keySpaceName + 'Inference schema retrieved successfully.'); + return getDocumentKindDataByBucket({ cluster, connectionInfo, bucketName, documents }); + }) + .catch(error => { + const errorMessage = clusterHelper.getErrorMessage({ error }); + log.info(keySpaceName + errorMessage); + return getDocumentKindDataByBucket({ cluster, connectionInfo, bucketName, error }); + }) + .catch(error => { + const errorMessage = clusterHelper.getErrorMessage({ error }); + log.error(keySpaceName + errorMessage); + return getDefaultDocumentKindDataByBucket({ bucketName, status: STATUS.hasError }); + }); +}; + +/** + * @param {{ bucketName: string; documents: Document[]; }} param0 + * @returns {any} + */ +const generateCustomInferSchema = ({ bucketName, documents }) => { + const typeOf = obj => { + return {}.toString.call(obj).split(' ')[1].slice(0, -1).toLowerCase(); + }; + + documents = documents.map(item => { + if (typeof item[bucketName] === 'object') { + return item[bucketName]; + } else { + return { 'unknown': item[bucketName] }; + } + }); + + let inferSchema = { + '#docs': 0, + '$schema': 'http://json-schema.org/schema#', + 'properties': {}, + }; + + documents.forEach(item => { + inferSchema['#docs']++; + + for (const prop in item) { + if (inferSchema.properties.hasOwnProperty(prop)) { + const minimumNumberOfSamples = 20; + const samples = inferSchema.properties[prop]['samples']; + const propDoesNotExists = samples.indexOf(item[prop]) === -1; + const shouldAddSample = samples.length < minimumNumberOfSamples; + + inferSchema.properties[prop]['#docs']++; + + if (propDoesNotExists && shouldAddSample) { + inferSchema.properties[prop]['samples'].push(item[prop]); + } + + inferSchema.properties[prop]['type'] = typeOf(item[prop]); + } else { + inferSchema.properties[prop] = { + '#docs': 1, + '%docs': 100, + 'samples': [item[prop]], + 'type': typeOf(item[prop]), + }; + } + } + }); + + for (const prop in inferSchema.properties) { + inferSchema.properties[prop]['%docs'] = _.round( + (inferSchema.properties[prop]['#docs'] / inferSchema['#docs']) * 100, + 2, + ); + } + return inferSchema; +}; + +/** + * @param {Document} property + * @returns {boolean} + */ +const isSuggestedDocKind = property => { + return property['%docs'] >= 70 && property.samples?.length && typeof property.samples[0] !== 'object'; +}; + +/** + * @param {string[]} array + * @returns {string[]} + */ +const replaceQuotes = array => + array.map(item => { + const inQuotes = _.first(item) === '`' && _.last(item) === '`'; + + return inQuotes ? item.slice(1, -1) : item; + }); + +const rejectPropertiesWithLowAppearancePercentage = properties => { + return _.chain(properties) + .toPairs() + .filter(([, propertyData]) => isSuggestedDocKind(propertyData)) + .fromPairs() + .value(); +}; + +/** + * @param {Document[]} inferences + * @returns {string[]} + */ +const getSuggestedDocKindsFromInference = inferences => { + return _.uniq( + inferences.flatMap(inference => Object.keys(rejectPropertiesWithLowAppearancePercentage(inference.properties))), + ); +}; + +/** + * @param {{ bucketName: string; inference: Document; isCustomInfer: boolean; flavorValue: string; }} param0 + * @returns {DocumentKindData} + */ +const getDocumentKindDataFromInfer = ({ bucketName, inference, isCustomInfer, flavorValue }) => { + let suggestedDocKinds = []; + let otherDocKinds = []; + let documentKind = { + key: '', + probability: 0, + }; + + if (isCustomInfer) { + let minCount = Infinity; + inference = inference.properties; + + for (let key in inference) { + if (isSuggestedDocKind(inference[key])) { + suggestedDocKinds.push(key); + + if (inference[key]['%docs'] >= documentKind.probability && inference[key].samples.length < minCount) { + minCount = inference[key].samples.length; + documentKind.probability = inference[key]['%docs']; + documentKind.key = key; + } + } else if (inference[key]['type'] === 'string') { + otherDocKinds.push(key); + } + } + } else { + const flavor = flavorValue ? flavorValue.split(',') : inference[0].Flavor.split(','); + if (flavor.length === 1) { + suggestedDocKinds = getSuggestedDocKindsFromInference(inference); + const flavorRegex = new RegExp(FLAVOR_REGEX); + const matchedDocKind = flavor[0].match(flavorRegex); + documentKind.key = matchedDocKind.length ? matchedDocKind[1] : ''; + } + } + + documentKind.key = replaceQuotes([documentKind.key])[0]; + + let documentKindData = { + bucketName, + documentList: suggestedDocKinds, + documentKind: documentKind.key, + otherDocKinds, + }; + + return documentKindData; +}; + +const manualInfer = ({ bucketName, documents }) => { + const inference = generateCustomInferSchema({ bucketName, documents }); + return getDocumentKindDataFromInfer({ bucketName, inference, isCustomInfer: true }); +}; + +/** + * @param {{ bucketName: string; connectionInfo: ConnectionInfo; }} param0 + * @returns {Promise} + */ +const getDocumentsUsingRestApi = async ({ bucketName, connectionInfo }) => { + return new Promise((resolve, reject) => { + this.getFetchedDocuments( + { + connectionInfo, + bucketName, + recordSamplingSettings: connectionInfo.recordSamplingSettings, + }, + (err, documents) => { + if (err) { + return reject(err); + } + + documents = documents.filter(item => !this.isBinaryFile(item)); + documents = documents.map(item => ({ [bucketName]: item.json })); + + resolve(documents); + }, + ); + }); +}; + +/** + * @param {{ bucketName: string; connectionInfo: ConnectionInfo; log: Logger }} param0 + * @returns {Promise} + */ +const getDocumentKindUsingRestApi = async ({ bucketName, connectionInfo, log }) => { + try { + const documents = await getDocumentsUsingRestApi({ bucketName, connectionInfo }); + return manualInfer({ bucketName, documents }); + } catch (error) { + const errorMessage = clusterHelper.getErrorMessage({ error }); + log.error(errorMessage); + return getDefaultDocumentKindDataByBucket({ bucketName, status: STATUS.hasError }); + } +}; + +/** + * @param {{ cluster: Cluster; bucketName: string; }} param0 + * @returns {Promise} + */ +const getDocumentKindUsingN1ql = async ({ cluster, bucketName }) => { + const documents = await clusterHelper.getDocumentsBySelectStatement({ cluster, bucketName }); + return manualInfer({ bucketName, documents }); +}; + +/** + * @param {Document} data + * @returns {string | undefined} + */ +const getNonEmptyFlavorValue = data => { + return data?.find(item => item.Flavor)?.Flavor; +}; + +/** + * @param {{ bucketName: string; documents: Document[]; }} param0 + * @throws {Error} + * @returns {DocumentKindData} + */ +const getDocumentKindData = ({ bucketName, documents }) => { + const [inference] = documents; + const flavorValue = getNonEmptyFlavorValue(inference); + const isFlavourString = _.isString(flavorValue); + const flavours = isFlavourString ? flavorValue.split(',') : []; + const isMultipleFlavours = flavours.length > 1; + const flavor = flavorValue.match(new RegExp(FLAVOR_REGEX)); + const [, , documentKindName] = flavor; + const shouldCreateManually = !isFlavourString || isMultipleFlavours || !documentKindName; + + if (shouldCreateManually) { + const error = new Error(); + error.code = COUCHBASE_ERROR_CODE.inferMethodIsNotSupport; + throw error; + } + + return getDocumentKindDataFromInfer({ bucketName, inference, flavorValue }); +}; + +/** + * @param {{ cluster: Cluster; connectionInfo: ConnectionInfo; error: Error; bucketName: string; documents: Document[]; log: Logger; }} param0 + * @throws {Error} + * @returns {Promise} + */ +const getDocumentKindDataByBucket = async ({ cluster, connectionInfo, error, bucketName, documents, log }) => { + const errorCode = clusterHelper.getErrorCode({ error }); + switch (errorCode) { + case undefined: + return getDocumentKindData({ bucketName, connectionInfo, documents }); + case COUCHBASE_ERROR_CODE.bucketIsEmpty: + return getDefaultDocumentKindDataByBucket({ bucketName }); + case COUCHBASE_ERROR_CODE.primaryIndexDoesNotExist: + case COUCHBASE_ERROR_CODE.n1qlMethodsAreNotSupported: + case COUCHBASE_ERROR_CODE.userDoesNotHaveAccessToPrivilegeCluster: + return getDocumentKindUsingRestApi({ bucketName, connectionInfo, log }); + case COUCHBASE_ERROR_CODE.parseSyntaxError: + case COUCHBASE_ERROR_CODE.inferMethodIsNotSupport: + return getDocumentKindUsingN1ql({ cluster, bucketName }); + default: + throw error; + } +}; + +module.exports = { + getBucketsDocumentKindList, +}; diff --git a/reverse_engineering/helpers/logHelper.js b/reverse_engineering/helpers/logHelper.js index cc65ba3..2d55ead 100644 --- a/reverse_engineering/helpers/logHelper.js +++ b/reverse_engineering/helpers/logHelper.js @@ -1,3 +1,8 @@ +/** + * @typedef {import('../../shared/types').AppLogger} AppLogger + * @typedef {import('../../shared/types').Logger} Logger + */ + const os = require('os'); const packageFile = require('../../package.json'); @@ -43,6 +48,10 @@ const toTime = number => { return Math.floor(number / 3600) + ':' + prefixZero(parseInt((number / 3600 - Math.floor(number / 3600)) * 60)); }; +/** + * @param {{ title: string; logger: AppLogger; hiddenKeys: string[] }} param0 + * @returns {Logger} + */ const createLogger = ({ title, logger, hiddenKeys }) => { return { info(message) { @@ -59,7 +68,11 @@ const createLogger = ({ title, logger, hiddenKeys }) => { }; }; -const createError = error => {}; +const createError = error => { + return { + message: error.cause?.message || error.message, + }; +}; const logHelper = { getSystemInfo, diff --git a/reverse_engineering/helpers/queryHelper.js b/reverse_engineering/helpers/queryHelper.js new file mode 100644 index 0000000..b8cc34a --- /dev/null +++ b/reverse_engineering/helpers/queryHelper.js @@ -0,0 +1,24 @@ +/** + * @param {{ + * bucketName: string; + * documentKind: string; + * }} param0 + * @returns {string} + */ +const getSelectBucketDocumentKindQuery = ({ bucketName, documentKind }) => { + return `SELECT ${documentKind} FROM \`${bucketName}\` WHERE ${documentKind} IS NOT MISSING GROUP BY ${documentKind}`; +}; + +const getInferBucketDocumentsQuery = ({ bucketName }) => { + return `INFER \`${bucketName}\` WITH {"sample_size": 1000,"num_sample_values":3};`; +}; + +const getSelectBucketDocumentsQuery = ({ bucketName, limit }) => { + return `SELECT * FROM \`${bucketName}\`` + (limit ? `LIMIT ${limit}` : ''); +}; + +module.exports = { + getInferBucketDocumentsQuery, + getSelectBucketDocumentKindQuery, + getSelectBucketDocumentsQuery, +}; diff --git a/shared/constants.js b/shared/constants.js new file mode 100644 index 0000000..3013a64 --- /dev/null +++ b/shared/constants.js @@ -0,0 +1,52 @@ +/** + * @enum {string} + */ +const AUTH_TYPE = { + usernamePassword: 'username_password', + securityCertificate: 'security_certificate', +}; + +/** + * @enum {string} + */ +const COUCHBASE_HOST_PREFIX = { + selfHosted: 'couchbase://', + cloud: 'couchbases://', +}; + +/** + * @enum {number} + */ +const COUCHBASE_ERROR_CODE = { + bucketIsEmpty: 0, + primaryIndexDoesNotExist: 4000, + n1qlMethodsAreNotSupported: 19, + userDoesNotHaveAccessToPrivilegeCluster: 13014, + parseSyntaxError: 3000, + inferMethodIsNotSupport: 16003, +}; + +/** + * @enum {string} + */ +const STATUS = { + hasError: 'hasError', +}; + +const DEFAULT_DOCUMENT_KIND = '*'; +const COUCHBASE_DEFAULT_KV_CONNECTION_PORT = 11210; +const DISABLED_TOOLTIP = 'Something went wrong. Please, check logs for more details'; +const DEFAULT_NAME = '_default'; +const FLAVOR_REGEX = /([\s\S]*?) \= "?([\s\S]*?)"?$/; + +module.exports = { + AUTH_TYPE, + COUCHBASE_ERROR_CODE, + COUCHBASE_HOST_PREFIX, + COUCHBASE_DEFAULT_KV_CONNECTION_PORT, + DEFAULT_DOCUMENT_KIND, + DEFAULT_NAME, + DISABLED_TOOLTIP, + FLAVOR_REGEX, + STATUS, +}; diff --git a/shared/types.d.ts b/shared/types.d.ts new file mode 100644 index 0000000..9b34075 --- /dev/null +++ b/shared/types.d.ts @@ -0,0 +1,104 @@ +import { Cluster, Scope, Bucket } from '@types/couchbase'; + +type UUID = string; + +type FilePath = string; + +type AppTarget = 'COUCHBASEV7PLUS'; + +type App = { + require: (packageName: string) => any; +}; + +type Pagination = { + enabled: boolean; + value: number; +}; + +type RecordSamplingType = 'relative' | 'absolute'; + +type RecordSamplingSettings = { + [key: RecordSamplingType]: { + value: number; + }; + active: RecordSamplingType; + maxValue: number; +}; + +enum AuthTypeEnum { + usernamePassword = 'username_password', + securityCertificate = 'security_certificate', +} + +type AuthType = `${AuthTypeEnum}`; + +type ConnectionInfo = { + name: string; + host: string; + authType: AuthType; + couchbase_bucket: string; + couchbase_username: string; + couchbase_password: string; + security_certificate: FilePath; + security_certificate_key: FilePath; + kv_port: number | undefined; + target: AppTarget; + id: UUID; + appVersion: string; + tempFolder: FilePath; + pluginVersion: string | undefined; + includeSystemCollection: boolean; + includeEmptyCollection: boolean; + pagination: Pagination; + recordSamplingSettings: RecordSamplingSettings; + queryRequestTimeout: number; + applyToInstanceQueryRequestTimeout: number; + activeProxyPool: string[]; + hiddenKeys: string[]; + options: any; +}; + +type ConnectionParams = { + url: string; + options: CouchbaseTypes.ClassicAuthenticator; +}; + +type LoggerMethod = (message: string) => void; + +type Logger = { + log?: LoggerMethod; + info?: LoggerMethod; + error?: LoggerMethod; +}; + +type Callback = (error: Error, result: any[], info?: { version?: string }, relationships?: any[]) => void; + +type NameMap = { + [key: string]: NameMap | string[]; +}; + +type ConnectionDataItem = { + dbName: string; + scopeName?: string; + dbCollections?: string[]; + status?: string; + disabledTooltip?: string; +}; + +export { + App, + AppTarget, + Bucket, + Callback, + Cluster, + ConnectionDataItem, + ConnectionInfo, + ConnectionParams, + FilePath, + NameMap, + Logger, + Pagination, + RecordSamplingSettings, + Scope, + UUID, +}; From 8b9bc1617c4eb41e4a67be316f1f9e95dbee17af Mon Sep 17 00:00:00 2001 From: Serhii Filonenko Date: Mon, 29 Jan 2024 14:51:44 +0200 Subject: [PATCH 04/37] RE: add types for document kind data methods --- reverse_engineering/api.js | 41 +++++------ reverse_engineering/helpers/clusterHelper.js | 43 ++++++----- .../helpers/documentKindHelper.js | 72 +++++++++---------- reverse_engineering/helpers/logHelper.js | 4 +- reverse_engineering/helpers/queryHelper.js | 13 ++-- shared/types.d.ts | 46 ++++++++---- 6 files changed, 117 insertions(+), 102 deletions(-) diff --git a/reverse_engineering/api.js b/reverse_engineering/api.js index b29ef71..100d94b 100644 --- a/reverse_engineering/api.js +++ b/reverse_engineering/api.js @@ -2,6 +2,7 @@ /** * @typedef {import('../shared/types').App} App + * @typedef {import('../shared/types').AppLogger} AppLogger * @typedef {import('../shared/types').ConnectionInfo} ConnectionInfo * @typedef {import('../shared/types').Logger} Logger * @typedef {import('../shared/types').Callback} Callback @@ -14,21 +15,21 @@ const logHelper = require('./helpers/logHelper'); /** * @param {ConnectionInfo} connectionInfo - * @param {Logger} logger + * @param {AppLogger} appLogger * @param {Callback} callback */ -const disconnect = async (__connectionInfo, __logger, callback) => { +const disconnect = async (__connectionInfo, __appLogger, callback) => { await connectionHelper.disconnect(); callback(); }; /** * @param {ConnectionInfo} connectionInfo - * @param {Logger} logger + * @param {AppLogger} appLogger * @param {Callback} callback * @param {App} app */ -const testConnection = async (connectionInfo, __logger, callback, app) => { +const testConnection = async (connectionInfo, __appLogger, callback, app) => { try { await connectionHelper.disconnect(); await connectionHelper.connect({ connectionInfo, app }); @@ -41,26 +42,26 @@ const testConnection = async (connectionInfo, __logger, callback, app) => { /** * @param {ConnectionInfo} connectionInfo - * @param {Logger} logger + * @param {AppLogger} appLogger * @param {Callback} callback * @param {App} app */ -const getDocumentKinds = async (connectionInfo, logger, callback, app) => { - const log = logHelper.createLogger({ +const getDocumentKinds = async (connectionInfo, appLogger, callback, app) => { + const logger = logHelper.createLogger({ title: 'Retrieving bucket default collection document kinds', hiddenKeys: connectionInfo.hiddenKeys, - logger, + logger: appLogger, }); try { const cluster = await connectionHelper.connect({ connectionInfo, app }); const bucketsDocumentKindList = await documentKindHelper.getBucketsDocumentKindList({ cluster, connectionInfo, - log, + logger, }); callback(null, bucketsDocumentKindList); } catch (error) { - log.error(error); + logger.error(error); await connectionHelper.disconnect(); callback(error, []); } @@ -68,24 +69,24 @@ const getDocumentKinds = async (connectionInfo, logger, callback, app) => { /** * @param {ConnectionInfo} connectionInfo - * @param {Logger} logger + * @param {AppLogger} appLogger * @param {Callback} callback * @param {App} app */ -const getDbCollectionsNames = async (connectionInfo, logger, callback, app) => { - const log = logHelper.createLogger({ +const getDbCollectionsNames = async (connectionInfo, appLogger, callback, app) => { + const logger = logHelper.createLogger({ title: 'Retrieving databases and collections information', hiddenKeys: connectionInfo.hiddenKeys, - logger, + logger: appLogger, }); try { const cluster = await connectionHelper.connect({ connectionInfo, app }); - const documents = await clusterHelper.getDbCollectionsNames({ connectionInfo, cluster, log }); + const documents = await clusterHelper.getDbCollectionsNames({ connectionInfo, cluster, logger }); callback(null, documents); } catch (error) { - log.error(error); + logger.error(error); connectionHelper.disconnect(); callback(error); } @@ -93,15 +94,15 @@ const getDbCollectionsNames = async (connectionInfo, logger, callback, app) => { /** * @param {any} data - * @param {Logger} logger + * @param {AppLogger} appLogger * @param {Callback} callback * @param {App} app */ -const getDbCollectionsData = async (data, logger, callback, app) => { - const log = logHelper.createLogger({ +const getDbCollectionsData = async (data, appLogger, callback, app) => { + const logger = logHelper.createLogger({ title: 'Retrieving data for inferring schema', hiddenKeys: data.hiddenKeys, - logger, + logger: appLogger, }); callback(null, []); diff --git a/reverse_engineering/helpers/clusterHelper.js b/reverse_engineering/helpers/clusterHelper.js index ce8c778..a7b8e5f 100644 --- a/reverse_engineering/helpers/clusterHelper.js +++ b/reverse_engineering/helpers/clusterHelper.js @@ -1,9 +1,10 @@ /** + * @typedef {import('../../shared/types').Document} Document * @typedef {import('../../shared/types').Cluster} Cluster * @typedef {import('../../shared/types').Bucket} Bucket * @typedef {import('../../shared/types').Scope} Scope * @typedef {import('../../shared/types').NameMap} NameMap - * @typedef {import('../../shared/types').ConnectionDataItem} ConnectionDataItem + * @typedef {import('../../shared/types').BucketCollectionNamesData} BucketCollectionNamesData * @typedef {import('../../shared/types').ConnectionInfo} ConnectionInfo * @typedef {import('../../shared/types').Logger} Logger */ @@ -75,11 +76,11 @@ const isBucketHasDefaultCollection = ({ scopes }) => { }; /** - * @param {{ cluster: Cluster;connectionInfo: ConnectionInfo;log: Logger; }} param0 - * @returns {Promise} + * @param {{ cluster: Cluster;connectionInfo: ConnectionInfo; logger: Logger; }} param0 + * @returns {Promise} */ -const getDbCollectionsNames = async ({ cluster, connectionInfo, log }) => { - const connectionDataItems = []; +const getDbCollectionsNames = async ({ cluster, connectionInfo, logger }) => { + const dbCollectionNames = []; const bucketScopeMap = await getBucketScopeNameMap({ cluster, selectedBucket: connectionInfo.couchbase_bucket }); for (const bucketName in bucketScopeMap) { @@ -89,26 +90,27 @@ const getDbCollectionsNames = async ({ cluster, connectionInfo, log }) => { for (const scope of scopes) { const scopeName = scope.name; const scopeCollectionNames = scope.collections.map(collection => collection.name); + const notDefaultScopeCollectionNames = scopeCollectionNames.filter(name => name !== DEFAULT_NAME); const hasDefaultCollection = isBucketHasDefaultCollection({ scopes: [scope] }); const documentKindCollectionNames = hasDefaultCollection - ? await getDocumentKindCollectionNames({ cluster, bucketName, documentKind, log }) + ? await getDocumentKindCollectionNames({ cluster, bucketName, documentKind, logger }) : []; - const collectionNames = [...documentKindCollectionNames, ...scopeCollectionNames]; - const dataItem = prepareConnectionDataItem({ bucketName, scopeName, collectionNames }); + const collectionNames = [...documentKindCollectionNames, ...notDefaultScopeCollectionNames]; + const dbCollectionNameData = prepareBucketCollectionNamesData({ bucketName, scopeName, collectionNames }); - connectionDataItems.push(dataItem); + dbCollectionNames.push(dbCollectionNameData); } } - return connectionDataItems; + return dbCollectionNames; }; /** * - * @param {{ cluster: Cluster;bucketName: string;scopeName: string;documentKind: string; log: Logger }} param0 + * @param {{ cluster: Cluster;bucketName: string;scopeName: string;documentKind: string; logger: Logger }} param0 * @returns {Promise} */ -const getDocumentKindCollectionNames = async ({ cluster, bucketName, documentKind, log }) => { +const getDocumentKindCollectionNames = async ({ cluster, bucketName, documentKind, logger }) => { try { if (documentKind === DEFAULT_DOCUMENT_KIND) { return []; @@ -121,7 +123,6 @@ const getDocumentKindCollectionNames = async ({ cluster, bucketName, documentKin return collectionNames; } catch (error) { const errorCode = getErrorCode({ error }); - const errorMessage = getErrorMessage({ error }); if ( errorCode === COUCHBASE_ERROR_CODE.primaryIndexDoesNotExist || errorCode === COUCHBASE_ERROR_CODE.n1qlMethodsAreNotSupported @@ -130,14 +131,14 @@ const getDocumentKindCollectionNames = async ({ cluster, bucketName, documentKin return []; } - log.error(errorMessage); + logger.error(error); return []; } }; /** * @param {{ cluster: Cluster; bucketName: string; }} param0 * @throws {Error} - * @returns {Promise} + * @returns {Promise} */ const getDocumentsByInfer = async ({ cluster, bucketName }) => { const inferBucketDocumentsQuery = queryHelper.getInferBucketDocumentsQuery({ bucketName }); @@ -150,9 +151,7 @@ const getDocumentsByInfer = async ({ cluster, bucketName }) => { } if (isDocumentEmpty) { - const error = new Error(); - error.code = COUCHBASE_ERROR_CODE.bucketIsEmpty; - throw error; + throw _.set(new Error(), 'code', COUCHBASE_ERROR_CODE.bucketIsEmpty); } return documents; @@ -160,7 +159,7 @@ const getDocumentsByInfer = async ({ cluster, bucketName }) => { /** * @param {{ cluster: Cluster; bucketName: string; }} param0 - * @returns {Promise} + * @returns {Promise} */ const getDocumentsBySelectStatement = async ({ cluster, bucketName }) => { const selectBucketDocumentsQuery = queryHelper.getSelectBucketDocumentsQuery({ bucketName }); @@ -194,15 +193,15 @@ const getErrorMessage = ({ error }) => { case COUCHBASE_ERROR_CODE.userDoesNotHaveAccessToPrivilegeCluster: return 'User doesn`t have credentials for privileged cluster.'; default: - return error?.message || ''; + return error?.cause?.message || error?.message || ''; } }; /** * @param {{ bucketName: string; scopeName: string; collectionNames?: string[]; status?: STATUS; }} param0 - * @returns {ConnectionDataItem} + * @returns {BucketCollectionNamesData} */ -const prepareConnectionDataItem = ({ bucketName, scopeName, collectionNames, status }) => { +const prepareBucketCollectionNamesData = ({ bucketName, scopeName, collectionNames, status }) => { const hasError = status === STATUS.hasError; const dbCollections = hasError ? [] : _.uniq(collectionNames); return { diff --git a/reverse_engineering/helpers/documentKindHelper.js b/reverse_engineering/helpers/documentKindHelper.js index 41806c4..2ad5adc 100644 --- a/reverse_engineering/helpers/documentKindHelper.js +++ b/reverse_engineering/helpers/documentKindHelper.js @@ -1,8 +1,9 @@ /** - * @typedef {import("../../shared/types").Cluster} Cluster - * @typedef {import("../../shared/types").ConnectionInfo} ConnectionInfo - * @typedef {import("../../shared/types").ConnectionDataItem} ConnectionDataItem - * @typedef {import("../../shared/types").Logger} Logger + * @typedef {import('../../shared/types').DocumentKindData} DocumentKindData + * @typedef {import('../../shared/types').Cluster} Cluster + * @typedef {import('../../shared/types').ConnectionInfo} ConnectionInfo + * @typedef {import('../../shared/types').BucketCollectionNamesData} BucketCollectionNamesData + * @typedef {import('../../shared/types').Logger} Logger */ const _ = require('lodash'); const clusterHelper = require('./clusterHelper'); @@ -12,15 +13,15 @@ const { COUCHBASE_ERROR_CODE, DEFAULT_NAME, FLAVOR_REGEX, STATUS } = require('.. * @param {{ bucketName: string; status?: STATUS; }} param0 * @returns {DocumentKindData} */ -const getDefaultDocumentKindDataByBucket = ({ bucketName, status }) => { +const getDefaultDocumentKindData = ({ bucketName, status }) => { return { bucketName, documentList: [], documentKind: '', status }; }; /** - * @param {{ cluster: Cluster; connectionInfo: ConnectionInfo; log: Logger; }} param0 + * @param {{ cluster: Cluster; connectionInfo: ConnectionInfo; logger: Logger; }} param0 * @returns {Promise} */ -const getBucketsDocumentKindList = async ({ cluster, connectionInfo, log }) => { +const getBucketsDocumentKindList = async ({ cluster, connectionInfo, logger }) => { const documentKindList = []; const selectedBucket = connectionInfo.couchbase_bucket; const bucketScopeNameMap = await clusterHelper.getBucketScopeNameMap({ cluster, selectedBucket }); @@ -30,7 +31,7 @@ const getBucketsDocumentKindList = async ({ cluster, connectionInfo, log }) => { const hasDefaultCollection = clusterHelper.isBucketHasDefaultCollection({ scopes }); if (hasDefaultCollection) { - const documentKindData = await getBucketDocumentKindData({ cluster, connectionInfo, bucketName, log }); + const documentKindData = await getBucketDocumentKindData({ cluster, connectionInfo, bucketName, logger }); documentKindList.push(documentKindData); } } @@ -39,27 +40,22 @@ const getBucketsDocumentKindList = async ({ cluster, connectionInfo, log }) => { }; /** - * @param {{ cluster: Cluster; connectionInfo: ConnectionInfo; bucketName: string; log: Logger; }} param0 + * @param {{ cluster: Cluster; connectionInfo: ConnectionInfo; bucketName: string; logger: Logger; }} param0 * @returns {Promise} */ -const getBucketDocumentKindData = async ({ cluster, connectionInfo, bucketName, log }) => { +const getBucketDocumentKindData = async ({ cluster, connectionInfo, bucketName, logger }) => { const keySpaceName = `${bucketName}.${DEFAULT_NAME}.${DEFAULT_NAME}: `; - return clusterHelper - .getDocumentsByInfer({ cluster, bucketName }) - .then(documents => { - log.info(keySpaceName + 'Inference schema retrieved successfully.'); - return getDocumentKindDataByBucket({ cluster, connectionInfo, bucketName, documents }); - }) + return getDocumentKindDataByInference({ cluster, bucketName }) .catch(error => { const errorMessage = clusterHelper.getErrorMessage({ error }); - log.info(keySpaceName + errorMessage); - return getDocumentKindDataByBucket({ cluster, connectionInfo, bucketName, error }); + logger.info(keySpaceName + errorMessage); + return getDocumentKindDataByErrorHandling({ cluster, connectionInfo, bucketName, error }); }) .catch(error => { const errorMessage = clusterHelper.getErrorMessage({ error }); - log.error(keySpaceName + errorMessage); - return getDefaultDocumentKindDataByBucket({ bucketName, status: STATUS.hasError }); + logger.info(keySpaceName + errorMessage); + return getDefaultDocumentKindData({ bucketName, status: STATUS.hasError }); }); }; @@ -243,17 +239,16 @@ const getDocumentsUsingRestApi = async ({ bucketName, connectionInfo }) => { }; /** - * @param {{ bucketName: string; connectionInfo: ConnectionInfo; log: Logger }} param0 + * @param {{ bucketName: string; connectionInfo: ConnectionInfo; logger: Logger }} param0 * @returns {Promise} */ -const getDocumentKindUsingRestApi = async ({ bucketName, connectionInfo, log }) => { +const getDocumentKindDataUsingRestApi = async ({ bucketName, connectionInfo, logger }) => { try { const documents = await getDocumentsUsingRestApi({ bucketName, connectionInfo }); return manualInfer({ bucketName, documents }); } catch (error) { - const errorMessage = clusterHelper.getErrorMessage({ error }); - log.error(errorMessage); - return getDefaultDocumentKindDataByBucket({ bucketName, status: STATUS.hasError }); + logger.error(error); + return getDefaultDocumentKindData({ bucketName, status: STATUS.hasError }); } }; @@ -261,7 +256,7 @@ const getDocumentKindUsingRestApi = async ({ bucketName, connectionInfo, log }) * @param {{ cluster: Cluster; bucketName: string; }} param0 * @returns {Promise} */ -const getDocumentKindUsingN1ql = async ({ cluster, bucketName }) => { +const getDocumentKindDataUsingN1ql = async ({ cluster, bucketName }) => { const documents = await clusterHelper.getDocumentsBySelectStatement({ cluster, bucketName }); return manualInfer({ bucketName, documents }); }; @@ -275,11 +270,12 @@ const getNonEmptyFlavorValue = data => { }; /** - * @param {{ bucketName: string; documents: Document[]; }} param0 + * @param {{cluster: Cluster; bucketName: string; }} param0 * @throws {Error} - * @returns {DocumentKindData} + * @returns {Promise} */ -const getDocumentKindData = ({ bucketName, documents }) => { +const getDocumentKindDataByInference = async ({ cluster, bucketName }) => { + const documents = await clusterHelper.getDocumentsByInfer({ cluster, bucketName }); const [inference] = documents; const flavorValue = getNonEmptyFlavorValue(inference); const isFlavourString = _.isString(flavorValue); @@ -290,33 +286,29 @@ const getDocumentKindData = ({ bucketName, documents }) => { const shouldCreateManually = !isFlavourString || isMultipleFlavours || !documentKindName; if (shouldCreateManually) { - const error = new Error(); - error.code = COUCHBASE_ERROR_CODE.inferMethodIsNotSupport; - throw error; + throw _.set(new Error(), 'code', COUCHBASE_ERROR_CODE.inferMethodIsNotSupport); } return getDocumentKindDataFromInfer({ bucketName, inference, flavorValue }); }; /** - * @param {{ cluster: Cluster; connectionInfo: ConnectionInfo; error: Error; bucketName: string; documents: Document[]; log: Logger; }} param0 + * @param {{ cluster: Cluster; connectionInfo: ConnectionInfo; bucketName: string; error: Error; logger: Logger; }} param0 * @throws {Error} - * @returns {Promise} + * @returns {Promise} */ -const getDocumentKindDataByBucket = async ({ cluster, connectionInfo, error, bucketName, documents, log }) => { +const getDocumentKindDataByErrorHandling = async ({ cluster, connectionInfo, bucketName, error, logger }) => { const errorCode = clusterHelper.getErrorCode({ error }); switch (errorCode) { - case undefined: - return getDocumentKindData({ bucketName, connectionInfo, documents }); case COUCHBASE_ERROR_CODE.bucketIsEmpty: - return getDefaultDocumentKindDataByBucket({ bucketName }); + return getDefaultDocumentKindData({ bucketName }); case COUCHBASE_ERROR_CODE.primaryIndexDoesNotExist: case COUCHBASE_ERROR_CODE.n1qlMethodsAreNotSupported: case COUCHBASE_ERROR_CODE.userDoesNotHaveAccessToPrivilegeCluster: - return getDocumentKindUsingRestApi({ bucketName, connectionInfo, log }); + return getDocumentKindDataUsingRestApi({ bucketName, connectionInfo, logger }); case COUCHBASE_ERROR_CODE.parseSyntaxError: case COUCHBASE_ERROR_CODE.inferMethodIsNotSupport: - return getDocumentKindUsingN1ql({ cluster, bucketName }); + return getDocumentKindDataUsingN1ql({ cluster, bucketName }); default: throw error; } diff --git a/reverse_engineering/helpers/logHelper.js b/reverse_engineering/helpers/logHelper.js index 2d55ead..e6bd39a 100644 --- a/reverse_engineering/helpers/logHelper.js +++ b/reverse_engineering/helpers/logHelper.js @@ -58,8 +58,8 @@ const createLogger = ({ title, logger, hiddenKeys }) => { logger.log('info', { message }, title, hiddenKeys); }, - progress(message, dbName = '', tableName = '') { - logger.progress({ message, containerName: dbName, entityName: tableName }); + progress(message, containerName = '', entityName = '') { + logger.progress({ message, containerName, entityName }); }, error(error) { diff --git a/reverse_engineering/helpers/queryHelper.js b/reverse_engineering/helpers/queryHelper.js index b8cc34a..f505221 100644 --- a/reverse_engineering/helpers/queryHelper.js +++ b/reverse_engineering/helpers/queryHelper.js @@ -1,18 +1,23 @@ /** - * @param {{ - * bucketName: string; - * documentKind: string; - * }} param0 + * @param {{ bucketName: string; documentKind: string; }} param0 * @returns {string} */ const getSelectBucketDocumentKindQuery = ({ bucketName, documentKind }) => { return `SELECT ${documentKind} FROM \`${bucketName}\` WHERE ${documentKind} IS NOT MISSING GROUP BY ${documentKind}`; }; +/** + * @param {{ bucketName: string }} param0 + * @returns {string} + */ const getInferBucketDocumentsQuery = ({ bucketName }) => { return `INFER \`${bucketName}\` WITH {"sample_size": 1000,"num_sample_values":3};`; }; +/** + * @param {{ bucketName: string; limit?: number; }} param0 + * @returns {string} + */ const getSelectBucketDocumentsQuery = ({ bucketName, limit }) => { return `SELECT * FROM \`${bucketName}\`` + (limit ? `LIMIT ${limit}` : ''); }; diff --git a/shared/types.d.ts b/shared/types.d.ts index 9b34075..b596702 100644 --- a/shared/types.d.ts +++ b/shared/types.d.ts @@ -1,4 +1,5 @@ import { Cluster, Scope, Bucket } from '@types/couchbase'; +import { STATUS } from './constants'; type UUID = string; @@ -7,7 +8,11 @@ type FilePath = string; type AppTarget = 'COUCHBASEV7PLUS'; type App = { - require: (packageName: string) => any; + require: (packageName: string) => any; +}; + +type AppLogger = { + log: (logType: string, logData: { message: string }, title: string, hiddenKeys: string[]) => void; }; type Pagination = { @@ -63,12 +68,10 @@ type ConnectionParams = { options: CouchbaseTypes.ClassicAuthenticator; }; -type LoggerMethod = (message: string) => void; - type Logger = { - log?: LoggerMethod; - info?: LoggerMethod; - error?: LoggerMethod; + error: (error: Error) => void; + info: (message: string) => void; + progress: (message: string, containerName: string, entityName: string) => void; }; type Callback = (error: Error, result: any[], info?: { version?: string }, relationships?: any[]) => void; @@ -77,7 +80,7 @@ type NameMap = { [key: string]: NameMap | string[]; }; -type ConnectionDataItem = { +type BucketCollectionNamesData = { dbName: string; scopeName?: string; dbCollections?: string[]; @@ -85,20 +88,35 @@ type ConnectionDataItem = { disabledTooltip?: string; }; +type Document = { + [key: string]: any; +}; + +type DocumentKindData = { + bucketName: string; + documentList: string[]; + otherDocKinds: string[]; + documentKind: string; + status?: STATUS; +}; + export { - App, + App, + AppLogger, AppTarget, - Bucket, + Bucket, + BucketCollectionNamesData, Callback, - Cluster, - ConnectionDataItem, + Cluster, ConnectionInfo, ConnectionParams, + Document, + DocumentKindData, FilePath, - NameMap, - Logger, + NameMap, + Logger, Pagination, RecordSamplingSettings, - Scope, + Scope, UUID, }; From c4716de7e41818f5f6a795fcf4c1616697747e02 Mon Sep 17 00:00:00 2001 From: Serhii Filonenko Date: Mon, 29 Jan 2024 15:51:15 +0200 Subject: [PATCH 05/37] package: add async library --- package-lock.json | 198 ++++++++++++++++++++++++---------------------- package.json | 1 + 2 files changed, 103 insertions(+), 96 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7aa8541..c18ae18 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,12 +8,13 @@ "name": "CouchbaseV7Plus", "version": "0.0.3", "dependencies": { + "async": "^3.2.5", "lodash": "^4.17.21" }, "devDependencies": { "@hackolade/hck-esbuild-plugins-pack": "0.0.1", "@types/couchbase": "^2.4.9", - "esbuild": "0.19.11", + "esbuild": "0.19.12", "esbuild-plugin-clean": "1.0.1", "eslint": "8.56.0", "eslint-config-prettier": "9.1.0", @@ -39,9 +40,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.11.tgz", - "integrity": "sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", + "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", "cpu": [ "ppc64" ], @@ -55,9 +56,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.11.tgz", - "integrity": "sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", + "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", "cpu": [ "arm" ], @@ -71,9 +72,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.11.tgz", - "integrity": "sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", + "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", "cpu": [ "arm64" ], @@ -87,9 +88,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.11.tgz", - "integrity": "sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", + "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", "cpu": [ "x64" ], @@ -103,9 +104,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.11.tgz", - "integrity": "sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", + "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", "cpu": [ "arm64" ], @@ -119,9 +120,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.11.tgz", - "integrity": "sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", + "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", "cpu": [ "x64" ], @@ -135,9 +136,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.11.tgz", - "integrity": "sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", + "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", "cpu": [ "arm64" ], @@ -151,9 +152,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.11.tgz", - "integrity": "sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", + "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", "cpu": [ "x64" ], @@ -167,9 +168,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.11.tgz", - "integrity": "sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", + "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", "cpu": [ "arm" ], @@ -183,9 +184,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.11.tgz", - "integrity": "sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", + "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", "cpu": [ "arm64" ], @@ -199,9 +200,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.11.tgz", - "integrity": "sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", + "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", "cpu": [ "ia32" ], @@ -215,9 +216,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.11.tgz", - "integrity": "sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", + "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", "cpu": [ "loong64" ], @@ -231,9 +232,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.11.tgz", - "integrity": "sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", + "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", "cpu": [ "mips64el" ], @@ -247,9 +248,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.11.tgz", - "integrity": "sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", + "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", "cpu": [ "ppc64" ], @@ -263,9 +264,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.11.tgz", - "integrity": "sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", + "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", "cpu": [ "riscv64" ], @@ -279,9 +280,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.11.tgz", - "integrity": "sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", + "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", "cpu": [ "s390x" ], @@ -295,9 +296,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.11.tgz", - "integrity": "sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", + "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", "cpu": [ "x64" ], @@ -311,9 +312,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.11.tgz", - "integrity": "sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", + "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", "cpu": [ "x64" ], @@ -327,9 +328,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.11.tgz", - "integrity": "sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", + "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", "cpu": [ "x64" ], @@ -343,9 +344,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.11.tgz", - "integrity": "sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", + "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", "cpu": [ "x64" ], @@ -359,9 +360,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.11.tgz", - "integrity": "sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", + "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", "cpu": [ "arm64" ], @@ -375,9 +376,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.11.tgz", - "integrity": "sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", + "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", "cpu": [ "ia32" ], @@ -391,9 +392,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.11.tgz", - "integrity": "sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", + "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", "cpu": [ "x64" ], @@ -694,6 +695,11 @@ "node": ">=8" } }, + "node_modules/async": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -922,9 +928,9 @@ "dev": true }, "node_modules/esbuild": { - "version": "0.19.11", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.11.tgz", - "integrity": "sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", + "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", "dev": true, "hasInstallScript": true, "bin": { @@ -934,29 +940,29 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.19.11", - "@esbuild/android-arm": "0.19.11", - "@esbuild/android-arm64": "0.19.11", - "@esbuild/android-x64": "0.19.11", - "@esbuild/darwin-arm64": "0.19.11", - "@esbuild/darwin-x64": "0.19.11", - "@esbuild/freebsd-arm64": "0.19.11", - "@esbuild/freebsd-x64": "0.19.11", - "@esbuild/linux-arm": "0.19.11", - "@esbuild/linux-arm64": "0.19.11", - "@esbuild/linux-ia32": "0.19.11", - "@esbuild/linux-loong64": "0.19.11", - "@esbuild/linux-mips64el": "0.19.11", - "@esbuild/linux-ppc64": "0.19.11", - "@esbuild/linux-riscv64": "0.19.11", - "@esbuild/linux-s390x": "0.19.11", - "@esbuild/linux-x64": "0.19.11", - "@esbuild/netbsd-x64": "0.19.11", - "@esbuild/openbsd-x64": "0.19.11", - "@esbuild/sunos-x64": "0.19.11", - "@esbuild/win32-arm64": "0.19.11", - "@esbuild/win32-ia32": "0.19.11", - "@esbuild/win32-x64": "0.19.11" + "@esbuild/aix-ppc64": "0.19.12", + "@esbuild/android-arm": "0.19.12", + "@esbuild/android-arm64": "0.19.12", + "@esbuild/android-x64": "0.19.12", + "@esbuild/darwin-arm64": "0.19.12", + "@esbuild/darwin-x64": "0.19.12", + "@esbuild/freebsd-arm64": "0.19.12", + "@esbuild/freebsd-x64": "0.19.12", + "@esbuild/linux-arm": "0.19.12", + "@esbuild/linux-arm64": "0.19.12", + "@esbuild/linux-ia32": "0.19.12", + "@esbuild/linux-loong64": "0.19.12", + "@esbuild/linux-mips64el": "0.19.12", + "@esbuild/linux-ppc64": "0.19.12", + "@esbuild/linux-riscv64": "0.19.12", + "@esbuild/linux-s390x": "0.19.12", + "@esbuild/linux-x64": "0.19.12", + "@esbuild/netbsd-x64": "0.19.12", + "@esbuild/openbsd-x64": "0.19.12", + "@esbuild/sunos-x64": "0.19.12", + "@esbuild/win32-arm64": "0.19.12", + "@esbuild/win32-ia32": "0.19.12", + "@esbuild/win32-x64": "0.19.12" } }, "node_modules/esbuild-plugin-clean": { diff --git a/package.json b/package.json index fd8da2d..0791fae 100644 --- a/package.json +++ b/package.json @@ -47,6 +47,7 @@ "simple-git-hooks": "2.9.0" }, "dependencies": { + "async": "^3.2.5", "lodash": "^4.17.21" } } From a5784a882d3cf738f99818d7eb32736accd2264b Mon Sep 17 00:00:00 2001 From: Serhii Filonenko Date: Mon, 29 Jan 2024 15:51:29 +0200 Subject: [PATCH 06/37] RE: create rest api helper --- reverse_engineering/api.js | 1 + reverse_engineering/helpers/clusterHelper.js | 5 +- .../helpers/documentKindHelper.js | 60 +++--- reverse_engineering/helpers/queryHelper.js | 6 +- reverse_engineering/helpers/restApiHelper.js | 178 ++++++++++++++++++ shared/constants.js | 2 + 6 files changed, 208 insertions(+), 44 deletions(-) create mode 100644 reverse_engineering/helpers/restApiHelper.js diff --git a/reverse_engineering/api.js b/reverse_engineering/api.js index 100d94b..6645487 100644 --- a/reverse_engineering/api.js +++ b/reverse_engineering/api.js @@ -58,6 +58,7 @@ const getDocumentKinds = async (connectionInfo, appLogger, callback, app) => { cluster, connectionInfo, logger, + app, }); callback(null, bucketsDocumentKindList); } catch (error) { diff --git a/reverse_engineering/helpers/clusterHelper.js b/reverse_engineering/helpers/clusterHelper.js index a7b8e5f..6e40b29 100644 --- a/reverse_engineering/helpers/clusterHelper.js +++ b/reverse_engineering/helpers/clusterHelper.js @@ -15,6 +15,7 @@ const { DEFAULT_NAME, DISABLED_TOOLTIP, STATUS, + DEFAULT_LIMIT, } = require('../../shared/constants'); const queryHelper = require('./queryHelper'); @@ -141,7 +142,7 @@ const getDocumentKindCollectionNames = async ({ cluster, bucketName, documentKin * @returns {Promise} */ const getDocumentsByInfer = async ({ cluster, bucketName }) => { - const inferBucketDocumentsQuery = queryHelper.getInferBucketDocumentsQuery({ bucketName }); + const inferBucketDocumentsQuery = queryHelper.getInferBucketDocumentsQuery({ bucketName, limit: DEFAULT_LIMIT }); const { rows: documents, meta } = await cluster.query(inferBucketDocumentsQuery); const metaError = _.get(meta, 'errors.[0].[0]'); const isDocumentEmpty = _.get(documents, '[0].properties'); @@ -162,7 +163,7 @@ const getDocumentsByInfer = async ({ cluster, bucketName }) => { * @returns {Promise} */ const getDocumentsBySelectStatement = async ({ cluster, bucketName }) => { - const selectBucketDocumentsQuery = queryHelper.getSelectBucketDocumentsQuery({ bucketName }); + const selectBucketDocumentsQuery = queryHelper.getSelectBucketDocumentsQuery({ bucketName, limit: DEFAULT_LIMIT }); const { rows: documents } = await cluster.query(selectBucketDocumentsQuery); return documents; diff --git a/reverse_engineering/helpers/documentKindHelper.js b/reverse_engineering/helpers/documentKindHelper.js index 2ad5adc..4700065 100644 --- a/reverse_engineering/helpers/documentKindHelper.js +++ b/reverse_engineering/helpers/documentKindHelper.js @@ -1,4 +1,5 @@ /** + * @typedef {import('../../shared/types').App} App * @typedef {import('../../shared/types').DocumentKindData} DocumentKindData * @typedef {import('../../shared/types').Cluster} Cluster * @typedef {import('../../shared/types').ConnectionInfo} ConnectionInfo @@ -7,7 +8,8 @@ */ const _ = require('lodash'); const clusterHelper = require('./clusterHelper'); -const { COUCHBASE_ERROR_CODE, DEFAULT_NAME, FLAVOR_REGEX, STATUS } = require('../../shared/constants'); +const restApiHelper = require('./restApiHelper'); +const { COUCHBASE_ERROR_CODE, DEFAULT_NAME, FLAVOR_REGEX, STATUS, DEFAULT_LIMIT } = require('../../shared/constants'); /** * @param {{ bucketName: string; status?: STATUS; }} param0 @@ -18,10 +20,10 @@ const getDefaultDocumentKindData = ({ bucketName, status }) => { }; /** - * @param {{ cluster: Cluster; connectionInfo: ConnectionInfo; logger: Logger; }} param0 + * @param {{ cluster: Cluster; connectionInfo: ConnectionInfo; logger: Logger; app: App }} param0 * @returns {Promise} */ -const getBucketsDocumentKindList = async ({ cluster, connectionInfo, logger }) => { +const getBucketsDocumentKindList = async ({ cluster, connectionInfo, logger, app }) => { const documentKindList = []; const selectedBucket = connectionInfo.couchbase_bucket; const bucketScopeNameMap = await clusterHelper.getBucketScopeNameMap({ cluster, selectedBucket }); @@ -31,7 +33,13 @@ const getBucketsDocumentKindList = async ({ cluster, connectionInfo, logger }) = const hasDefaultCollection = clusterHelper.isBucketHasDefaultCollection({ scopes }); if (hasDefaultCollection) { - const documentKindData = await getBucketDocumentKindData({ cluster, connectionInfo, bucketName, logger }); + const documentKindData = await getBucketDocumentKindData({ + cluster, + connectionInfo, + bucketName, + logger, + app, + }); documentKindList.push(documentKindData); } } @@ -40,17 +48,17 @@ const getBucketsDocumentKindList = async ({ cluster, connectionInfo, logger }) = }; /** - * @param {{ cluster: Cluster; connectionInfo: ConnectionInfo; bucketName: string; logger: Logger; }} param0 + * @param {{ cluster: Cluster; connectionInfo: ConnectionInfo; bucketName: string; logger: Logger; app: App }} param0 * @returns {Promise} */ -const getBucketDocumentKindData = async ({ cluster, connectionInfo, bucketName, logger }) => { +const getBucketDocumentKindData = async ({ cluster, connectionInfo, bucketName, logger, app }) => { const keySpaceName = `${bucketName}.${DEFAULT_NAME}.${DEFAULT_NAME}: `; return getDocumentKindDataByInference({ cluster, bucketName }) .catch(error => { const errorMessage = clusterHelper.getErrorMessage({ error }); logger.info(keySpaceName + errorMessage); - return getDocumentKindDataByErrorHandling({ cluster, connectionInfo, bucketName, error }); + return getDocumentKindDataByErrorHandling({ cluster, connectionInfo, bucketName, error, app }); }) .catch(error => { const errorMessage = clusterHelper.getErrorMessage({ error }); @@ -213,38 +221,12 @@ const manualInfer = ({ bucketName, documents }) => { }; /** - * @param {{ bucketName: string; connectionInfo: ConnectionInfo; }} param0 - * @returns {Promise} - */ -const getDocumentsUsingRestApi = async ({ bucketName, connectionInfo }) => { - return new Promise((resolve, reject) => { - this.getFetchedDocuments( - { - connectionInfo, - bucketName, - recordSamplingSettings: connectionInfo.recordSamplingSettings, - }, - (err, documents) => { - if (err) { - return reject(err); - } - - documents = documents.filter(item => !this.isBinaryFile(item)); - documents = documents.map(item => ({ [bucketName]: item.json })); - - resolve(documents); - }, - ); - }); -}; - -/** - * @param {{ bucketName: string; connectionInfo: ConnectionInfo; logger: Logger }} param0 + * @param {{ bucketName: string; connectionInfo: ConnectionInfo; logger: Logger; app: App }} param0 * @returns {Promise} */ -const getDocumentKindDataUsingRestApi = async ({ bucketName, connectionInfo, logger }) => { +const getDocumentKindDataUsingRestApi = async ({ bucketName, connectionInfo, logger, app }) => { try { - const documents = await getDocumentsUsingRestApi({ bucketName, connectionInfo }); + const documents = await restApiHelper.getDocuments({ bucketName, connectionInfo, logger, app }); return manualInfer({ bucketName, documents }); } catch (error) { logger.error(error); @@ -293,11 +275,11 @@ const getDocumentKindDataByInference = async ({ cluster, bucketName }) => { }; /** - * @param {{ cluster: Cluster; connectionInfo: ConnectionInfo; bucketName: string; error: Error; logger: Logger; }} param0 + * @param {{ cluster: Cluster; connectionInfo: ConnectionInfo; bucketName: string; error: Error; logger: Logger; app: App }} param0 * @throws {Error} * @returns {Promise} */ -const getDocumentKindDataByErrorHandling = async ({ cluster, connectionInfo, bucketName, error, logger }) => { +const getDocumentKindDataByErrorHandling = async ({ cluster, connectionInfo, bucketName, error, logger, app }) => { const errorCode = clusterHelper.getErrorCode({ error }); switch (errorCode) { case COUCHBASE_ERROR_CODE.bucketIsEmpty: @@ -305,7 +287,7 @@ const getDocumentKindDataByErrorHandling = async ({ cluster, connectionInfo, buc case COUCHBASE_ERROR_CODE.primaryIndexDoesNotExist: case COUCHBASE_ERROR_CODE.n1qlMethodsAreNotSupported: case COUCHBASE_ERROR_CODE.userDoesNotHaveAccessToPrivilegeCluster: - return getDocumentKindDataUsingRestApi({ bucketName, connectionInfo, logger }); + return getDocumentKindDataUsingRestApi({ bucketName, connectionInfo, logger, app }); case COUCHBASE_ERROR_CODE.parseSyntaxError: case COUCHBASE_ERROR_CODE.inferMethodIsNotSupport: return getDocumentKindDataUsingN1ql({ cluster, bucketName }); diff --git a/reverse_engineering/helpers/queryHelper.js b/reverse_engineering/helpers/queryHelper.js index f505221..f4e3f3c 100644 --- a/reverse_engineering/helpers/queryHelper.js +++ b/reverse_engineering/helpers/queryHelper.js @@ -7,11 +7,11 @@ const getSelectBucketDocumentKindQuery = ({ bucketName, documentKind }) => { }; /** - * @param {{ bucketName: string }} param0 + * @param {{ bucketName: string; limit: number; }} param0 * @returns {string} */ -const getInferBucketDocumentsQuery = ({ bucketName }) => { - return `INFER \`${bucketName}\` WITH {"sample_size": 1000,"num_sample_values":3};`; +const getInferBucketDocumentsQuery = ({ bucketName, limit }) => { + return `INFER \`${bucketName}\` WITH {"sample_size": ${limit},"num_sample_values":3};`; }; /** diff --git a/reverse_engineering/helpers/restApiHelper.js b/reverse_engineering/helpers/restApiHelper.js new file mode 100644 index 0000000..19121df --- /dev/null +++ b/reverse_engineering/helpers/restApiHelper.js @@ -0,0 +1,178 @@ +const _ = require('lodash'); +const async = require('async'); +const { DEFAULT_LIMIT } = require('../../shared/constants'); + +class CouchbaseRestApiService { + constructor(connectionInfo, httpService) { + this.host = connectionInfo.host; + this.port = connectionInfo.port; + + if (connectionInfo.couchbase_username && connectionInfo.couchbase_password) { + this.password = connectionInfo.couchbase_password; + this.username = connectionInfo.couchbase_username; + } + + this.httpService = httpService; + } + + async fetch(endpoint, options = {}) { + const uri = `http://${this.host}:${this.port}${endpoint}`; + + if (this.username && this.password) { + let encodedCredentials = Buffer.from(`${this.username}:${this.password}`).toString('base64'); + options = { + ...options, + headers: { + ...(options.headers || {}), + Authorization: `Basic ${encodedCredentials}`, + }, + }; + } + + try { + return await this.httpService.get(uri, options); + } catch (error) { + throw new Error({ + message: error.statusText || error.message, + code: error.status || error.code, + description: await error?.text?.(), + }); + } + } + + async count(bucketName) { + const body = await this.fetch(`/pools/default/buckets/${bucketName}`); + + return body?.basicStats?.itemCount; + } + + async getDocuments(bucketName, size) { + let docsUri = `/pools/default/buckets/${bucketName}/docs?include_docs=true&limit=${size}&skip=0`; + + const body = await this.fetch(docsUri); + + return body?.rows?.map(item => { + return { + json: safeParse(item?.doc?.json), + meta: { + id: item?.id, + }, + }; + }); + } + + async getDocumentByKey(bucketName, key) { + let docsUri = `/pools/default/buckets/${bucketName}/docs/${encodeURIComponent(key.replace(/\u0000/g, ''))}`; + const body = await this.fetch(docsUri); + + return { + ...body, + json: safeParse(body.json), + }; + } + + async getRandomKey(bucketName) { + const randomKeyUri = `/pools/default/buckets/${bucketName}/localRandomKey`; + + return this.fetch(randomKeyUri); + } + + async getVersion() { + const body = await this.fetch('/pools'); + + return body.implementationVersion; + } + + async getIndexes() { + const body = await this.fetch('/indexStatus'); + + return body.indexes; + } +} + +const safeParse = value => { + try { + if (typeof value !== 'string') { + return value; + } + return JSON.parse(value); + } catch (error) { + return value; + } +}; +const isBinaryFile = obj => _.isObject(obj) && !!obj.base64 && !!obj.meta; + +const createRestApiService = ({ connectionInfo, app }) => { + const httpService = app.require('httpService'); + const httpServiceInstance = httpService.createInstance(connectionInfo); + const apiService = new CouchbaseRestApiService(connectionInfo, httpServiceInstance); + + return apiService; +}; + +const getDocuments = async ({ connectionInfo, bucketName, logger, app }) => { + logger.info(`${bucketName}: Start getting documents using REST API`); + const apiService = createRestApiService({ connectionInfo, app }); + const count = await apiService.count(bucketName); + const body = await apiService.getRandomKey(bucketName); + const size = count ?? DEFAULT_LIMIT; + + if (body.error === 'fallback_to_all_docs') { + logger.error({ message: `"localRandomKey" in not available or bucket ${bucketName} is empty` }); + + return await apiService.getDocuments(bucketName, size); + } + + logger.info(`REST API: fetching documents by random key`); + + const maxNumberOfAttempts = 5; + + let numberOfAttempts = 0; + + return new Promise((resolve, reject) => { + async.timesLimit( + size, + 50, + async index => { + if (numberOfAttempts > maxNumberOfAttempts) { + return; + } + + const keyBody = await apiService.getRandomKey(bucketName).catch(error => { + logger.error({ message: `Error fetching random key from bucket "${bucketName}" (${index})` }); + return Promise.reject(error); + }); + + return await apiService.getDocumentByKey(bucketName, keyBody.key).catch(error => { + if (numberOfAttempts >= maxNumberOfAttempts) { + throw error; + } + + logger.error({ + message: `Error fetching document by random key from bucket "${bucketName}" (${index})`, + }); + + numberOfAttempts++; + }); + }, + (error, result) => { + if (error) { + logger.error(error); + return reject(error); + } + + logger.info(`Successfully read ${result.length} document(s)`); + + const documents = (result || []) + .filter(item => Boolean(item) && !isBinaryFile(item)) + .map(item => ({ [bucketName]: item.json })); + + return resolve(documents); + }, + ); + }); +}; + +module.exports = { + getDocuments, +}; diff --git a/shared/constants.js b/shared/constants.js index 3013a64..0859cd0 100644 --- a/shared/constants.js +++ b/shared/constants.js @@ -38,6 +38,7 @@ const COUCHBASE_DEFAULT_KV_CONNECTION_PORT = 11210; const DISABLED_TOOLTIP = 'Something went wrong. Please, check logs for more details'; const DEFAULT_NAME = '_default'; const FLAVOR_REGEX = /([\s\S]*?) \= "?([\s\S]*?)"?$/; +const DEFAULT_LIMIT = 1000; module.exports = { AUTH_TYPE, @@ -45,6 +46,7 @@ module.exports = { COUCHBASE_HOST_PREFIX, COUCHBASE_DEFAULT_KV_CONNECTION_PORT, DEFAULT_DOCUMENT_KIND, + DEFAULT_LIMIT, DEFAULT_NAME, DISABLED_TOOLTIP, FLAVOR_REGEX, From 6f4e5d11888c9f0fcbf79cc8a511b3d50ed83456 Mon Sep 17 00:00:00 2001 From: Serhii Filonenko Date: Mon, 29 Jan 2024 17:43:52 +0200 Subject: [PATCH 07/37] RE: add retrive collections by doc kind using rest api --- reverse_engineering/api.js | 2 +- reverse_engineering/helpers/clusterHelper.js | 38 ++++++++++++++----- .../helpers/documentKindHelper.js | 10 ++--- reverse_engineering/helpers/restApiHelper.js | 6 ++- 4 files changed, 38 insertions(+), 18 deletions(-) diff --git a/reverse_engineering/api.js b/reverse_engineering/api.js index 6645487..54221bb 100644 --- a/reverse_engineering/api.js +++ b/reverse_engineering/api.js @@ -83,7 +83,7 @@ const getDbCollectionsNames = async (connectionInfo, appLogger, callback, app) = try { const cluster = await connectionHelper.connect({ connectionInfo, app }); - const documents = await clusterHelper.getDbCollectionsNames({ connectionInfo, cluster, logger }); + const documents = await clusterHelper.getDbCollectionsNames({ connectionInfo, cluster, logger, app }); callback(null, documents); } catch (error) { diff --git a/reverse_engineering/helpers/clusterHelper.js b/reverse_engineering/helpers/clusterHelper.js index 6e40b29..a16fe98 100644 --- a/reverse_engineering/helpers/clusterHelper.js +++ b/reverse_engineering/helpers/clusterHelper.js @@ -9,6 +9,7 @@ * @typedef {import('../../shared/types').Logger} Logger */ const _ = require('lodash'); +const restApiHelper = require('./restApiHelper'); const { COUCHBASE_ERROR_CODE, DEFAULT_DOCUMENT_KIND, @@ -77,10 +78,10 @@ const isBucketHasDefaultCollection = ({ scopes }) => { }; /** - * @param {{ cluster: Cluster;connectionInfo: ConnectionInfo; logger: Logger; }} param0 + * @param {{ cluster: Cluster;connectionInfo: ConnectionInfo; logger: Logger; app: App }} param0 * @returns {Promise} */ -const getDbCollectionsNames = async ({ cluster, connectionInfo, logger }) => { +const getDbCollectionsNames = async ({ cluster, connectionInfo, logger, app }) => { const dbCollectionNames = []; const bucketScopeMap = await getBucketScopeNameMap({ cluster, selectedBucket: connectionInfo.couchbase_bucket }); @@ -94,7 +95,14 @@ const getDbCollectionsNames = async ({ cluster, connectionInfo, logger }) => { const notDefaultScopeCollectionNames = scopeCollectionNames.filter(name => name !== DEFAULT_NAME); const hasDefaultCollection = isBucketHasDefaultCollection({ scopes: [scope] }); const documentKindCollectionNames = hasDefaultCollection - ? await getDocumentKindCollectionNames({ cluster, bucketName, documentKind, logger }) + ? await getDocumentKindCollectionNames({ + cluster, + connectionInfo, + bucketName, + documentKind, + logger, + app, + }) : []; const collectionNames = [...documentKindCollectionNames, ...notDefaultScopeCollectionNames]; const dbCollectionNameData = prepareBucketCollectionNamesData({ bucketName, scopeName, collectionNames }); @@ -108,10 +116,10 @@ const getDbCollectionsNames = async ({ cluster, connectionInfo, logger }) => { /** * - * @param {{ cluster: Cluster;bucketName: string;scopeName: string;documentKind: string; logger: Logger }} param0 + * @param {{ cluster: Cluster; connectionInfo: ConnectionInfo; bucketName: string; documentKind: string; logger: Logger; app: App }} param0 * @returns {Promise} */ -const getDocumentKindCollectionNames = async ({ cluster, bucketName, documentKind, logger }) => { +const getDocumentKindCollectionNames = async ({ cluster, connectionInfo, bucketName, documentKind, logger, app }) => { try { if (documentKind === DEFAULT_DOCUMENT_KIND) { return []; @@ -128,8 +136,18 @@ const getDocumentKindCollectionNames = async ({ cluster, bucketName, documentKin errorCode === COUCHBASE_ERROR_CODE.primaryIndexDoesNotExist || errorCode === COUCHBASE_ERROR_CODE.n1qlMethodsAreNotSupported ) { - //TODO get Fetched documents - return []; + const documents = await restApiHelper.getDocuments({ connectionInfo, bucketName, logger, app }); + const collectionNames = documents.reduce((result, doc) => { + const collectionName = doc[bucketName]?.[documentKind]; + + if (!collectionName || result.includes(collectionName)) { + return result; + } + + return [...result, collectionName]; + }, []); + + return collectionNames; } logger.error(error); @@ -138,7 +156,7 @@ const getDocumentKindCollectionNames = async ({ cluster, bucketName, documentKin }; /** * @param {{ cluster: Cluster; bucketName: string; }} param0 - * @throws {Error} + * @throws * @returns {Promise} */ const getDocumentsByInfer = async ({ cluster, bucketName }) => { @@ -152,7 +170,7 @@ const getDocumentsByInfer = async ({ cluster, bucketName }) => { } if (isDocumentEmpty) { - throw _.set(new Error(), 'code', COUCHBASE_ERROR_CODE.bucketIsEmpty); + throw { code: COUCHBASE_ERROR_CODE.bucketIsEmpty }; } return documents; @@ -174,7 +192,7 @@ const getDocumentsBySelectStatement = async ({ cluster, bucketName }) => { * @returns {number | undefined} */ const getErrorCode = ({ error }) => { - return error?.cause?.first_error_code || error?.code; + return error?.cause?.first_error_code ?? error?.code; }; /** diff --git a/reverse_engineering/helpers/documentKindHelper.js b/reverse_engineering/helpers/documentKindHelper.js index 4700065..4812a7a 100644 --- a/reverse_engineering/helpers/documentKindHelper.js +++ b/reverse_engineering/helpers/documentKindHelper.js @@ -58,7 +58,7 @@ const getBucketDocumentKindData = async ({ cluster, connectionInfo, bucketName, .catch(error => { const errorMessage = clusterHelper.getErrorMessage({ error }); logger.info(keySpaceName + errorMessage); - return getDocumentKindDataByErrorHandling({ cluster, connectionInfo, bucketName, error, app }); + return getDocumentKindDataByErrorHandling({ cluster, connectionInfo, bucketName, error, logger, app }); }) .catch(error => { const errorMessage = clusterHelper.getErrorMessage({ error }); @@ -253,7 +253,7 @@ const getNonEmptyFlavorValue = data => { /** * @param {{cluster: Cluster; bucketName: string; }} param0 - * @throws {Error} + * @throws * @returns {Promise} */ const getDocumentKindDataByInference = async ({ cluster, bucketName }) => { @@ -263,12 +263,12 @@ const getDocumentKindDataByInference = async ({ cluster, bucketName }) => { const isFlavourString = _.isString(flavorValue); const flavours = isFlavourString ? flavorValue.split(',') : []; const isMultipleFlavours = flavours.length > 1; - const flavor = flavorValue.match(new RegExp(FLAVOR_REGEX)); - const [, , documentKindName] = flavor; + const flavor = flavorValue?.match(new RegExp(FLAVOR_REGEX)); + const documentKindName = flavor?.[2]; const shouldCreateManually = !isFlavourString || isMultipleFlavours || !documentKindName; if (shouldCreateManually) { - throw _.set(new Error(), 'code', COUCHBASE_ERROR_CODE.inferMethodIsNotSupport); + throw { code: COUCHBASE_ERROR_CODE.inferMethodIsNotSupport }; } return getDocumentKindDataFromInfer({ bucketName, inference, flavorValue }); diff --git a/reverse_engineering/helpers/restApiHelper.js b/reverse_engineering/helpers/restApiHelper.js index 19121df..4b61dda 100644 --- a/reverse_engineering/helpers/restApiHelper.js +++ b/reverse_engineering/helpers/restApiHelper.js @@ -26,17 +26,18 @@ class CouchbaseRestApiService { ...(options.headers || {}), Authorization: `Basic ${encodedCredentials}`, }, + useElectronNet: false, }; } try { return await this.httpService.get(uri, options); } catch (error) { - throw new Error({ + throw { message: error.statusText || error.message, code: error.status || error.code, description: await error?.text?.(), - }); + }; } } @@ -112,6 +113,7 @@ const createRestApiService = ({ connectionInfo, app }) => { const getDocuments = async ({ connectionInfo, bucketName, logger, app }) => { logger.info(`${bucketName}: Start getting documents using REST API`); + const apiService = createRestApiService({ connectionInfo, app }); const count = await apiService.count(bucketName); const body = await apiService.getRandomKey(bucketName); From b7b1b4dc1d1a145eeb75d5870ff56ebdff94c0fd Mon Sep 17 00:00:00 2001 From: Serhii Filonenko Date: Thu, 1 Feb 2024 14:52:14 +0200 Subject: [PATCH 08/37] RE: implement retrive documents from default collection --- reverse_engineering/api.js | 34 +++++++++++++++++-- .../helpers/documentKindHelper.js | 2 +- reverse_engineering/helpers/restApiHelper.js | 17 +++++++--- 3 files changed, 45 insertions(+), 8 deletions(-) diff --git a/reverse_engineering/api.js b/reverse_engineering/api.js index 54221bb..5b11e77 100644 --- a/reverse_engineering/api.js +++ b/reverse_engineering/api.js @@ -12,6 +12,7 @@ const connectionHelper = require('./helpers/connectionHelper'); const clusterHelper = require('./helpers/clusterHelper'); const documentKindHelper = require('./helpers/documentKindHelper'); const logHelper = require('./helpers/logHelper'); +const { DEFAULT_LIMIT } = require('../shared/constants'); /** * @param {ConnectionInfo} connectionInfo @@ -88,7 +89,7 @@ const getDbCollectionsNames = async (connectionInfo, appLogger, callback, app) = callback(null, documents); } catch (error) { logger.error(error); - connectionHelper.disconnect(); + await connectionHelper.disconnect(); callback(error); } }; @@ -106,7 +107,36 @@ const getDbCollectionsData = async (data, appLogger, callback, app) => { logger: appLogger, }); - callback(null, []); + try { + const cluster = await connectionHelper.connect({ connectionInfo: data.connectionInfo, app }); + const collectionVersion = data.collectionData.collectionVersion; + + const dbCollectionsData = []; + + for (const bucketName in collectionVersion) { + for (const scopeName in collectionVersion[bucketName]) { + for (const collectionName of collectionVersion[bucketName][scopeName]) { + const dbCollectionData = await clusterHelper.getDbCollectionData({ + cluster, + data, + bucketName, + scopeName, + collectionName, + logger, + app, + }); + + dbCollectionsData.push(dbCollectionData); + } + } + } + + callback(null, dbCollectionsData); + } catch (error) { + callback(error); + } finally { + await connectionHelper.disconnect(); + } }; module.exports = { diff --git a/reverse_engineering/helpers/documentKindHelper.js b/reverse_engineering/helpers/documentKindHelper.js index 4812a7a..440ae31 100644 --- a/reverse_engineering/helpers/documentKindHelper.js +++ b/reverse_engineering/helpers/documentKindHelper.js @@ -257,7 +257,7 @@ const getNonEmptyFlavorValue = data => { * @returns {Promise} */ const getDocumentKindDataByInference = async ({ cluster, bucketName }) => { - const documents = await clusterHelper.getDocumentsByInfer({ cluster, bucketName }); + const documents = await clusterHelper.getBucketDocumentsByInfer({ cluster, bucketName }); const [inference] = documents; const flavorValue = getNonEmptyFlavorValue(inference); const isFlavourString = _.isString(flavorValue); diff --git a/reverse_engineering/helpers/restApiHelper.js b/reverse_engineering/helpers/restApiHelper.js index 4b61dda..1af27a3 100644 --- a/reverse_engineering/helpers/restApiHelper.js +++ b/reverse_engineering/helpers/restApiHelper.js @@ -2,6 +2,14 @@ const _ = require('lodash'); const async = require('async'); const { DEFAULT_LIMIT } = require('../../shared/constants'); +class CustomError extends Error { + constructor({ code, message }) { + super(); + this.code = code; + this.message = message; + } +} + class CouchbaseRestApiService { constructor(connectionInfo, httpService) { this.host = connectionInfo.host; @@ -33,11 +41,10 @@ class CouchbaseRestApiService { try { return await this.httpService.get(uri, options); } catch (error) { - throw { + throw new CustomError({ message: error.statusText || error.message, code: error.status || error.code, - description: await error?.text?.(), - }; + }); } } @@ -111,7 +118,7 @@ const createRestApiService = ({ connectionInfo, app }) => { return apiService; }; -const getDocuments = async ({ connectionInfo, bucketName, logger, app }) => { +const getBucketDocuments = async ({ connectionInfo, bucketName, logger, app }) => { logger.info(`${bucketName}: Start getting documents using REST API`); const apiService = createRestApiService({ connectionInfo, app }); @@ -176,5 +183,5 @@ const getDocuments = async ({ connectionInfo, bucketName, logger, app }) => { }; module.exports = { - getDocuments, + getBucketDocuments, }; From fc873c6dd29425b1a261fc9c9eb0e8d4117bd917 Mon Sep 17 00:00:00 2001 From: Serhii Filonenko Date: Thu, 1 Feb 2024 14:52:51 +0200 Subject: [PATCH 09/37] RE: implement retrive documents for scopes and collections --- reverse_engineering/helpers/clusterHelper.js | 218 ++++++++++++++++++- reverse_engineering/helpers/queryHelper.js | 50 ++++- reverse_engineering/helpers/schemaHelper.js | 62 ++++++ shared/constants.js | 1 + shared/types.d.ts | 12 + 5 files changed, 333 insertions(+), 10 deletions(-) create mode 100644 reverse_engineering/helpers/schemaHelper.js diff --git a/reverse_engineering/helpers/clusterHelper.js b/reverse_engineering/helpers/clusterHelper.js index a16fe98..3b5771a 100644 --- a/reverse_engineering/helpers/clusterHelper.js +++ b/reverse_engineering/helpers/clusterHelper.js @@ -1,4 +1,5 @@ /** + * @typedef {import('../../shared/types').DbCollectionData} DbCollectionData * @typedef {import('../../shared/types').Document} Document * @typedef {import('../../shared/types').Cluster} Cluster * @typedef {import('../../shared/types').Bucket} Bucket @@ -7,9 +8,11 @@ * @typedef {import('../../shared/types').BucketCollectionNamesData} BucketCollectionNamesData * @typedef {import('../../shared/types').ConnectionInfo} ConnectionInfo * @typedef {import('../../shared/types').Logger} Logger + * @typedef {import('../../shared/types').RecordSamplingSettings} RecordSamplingSettings */ const _ = require('lodash'); const restApiHelper = require('./restApiHelper'); +const schemaHelper = require('./schemaHelper'); const { COUCHBASE_ERROR_CODE, DEFAULT_DOCUMENT_KIND, @@ -136,7 +139,7 @@ const getDocumentKindCollectionNames = async ({ cluster, connectionInfo, bucketN errorCode === COUCHBASE_ERROR_CODE.primaryIndexDoesNotExist || errorCode === COUCHBASE_ERROR_CODE.n1qlMethodsAreNotSupported ) { - const documents = await restApiHelper.getDocuments({ connectionInfo, bucketName, logger, app }); + const documents = await restApiHelper.getBucketDocuments({ connectionInfo, bucketName, logger, app }); const collectionNames = documents.reduce((result, doc) => { const collectionName = doc[bucketName]?.[documentKind]; @@ -159,10 +162,10 @@ const getDocumentKindCollectionNames = async ({ cluster, connectionInfo, bucketN * @throws * @returns {Promise} */ -const getDocumentsByInfer = async ({ cluster, bucketName }) => { +const getBucketDocumentsByInfer = async ({ cluster, bucketName }) => { const inferBucketDocumentsQuery = queryHelper.getInferBucketDocumentsQuery({ bucketName, limit: DEFAULT_LIMIT }); const { rows: documents, meta } = await cluster.query(inferBucketDocumentsQuery); - const metaError = _.get(meta, 'errors.[0].[0]'); + const metaError = _.get(meta, 'errors.[0]'); const isDocumentEmpty = _.get(documents, '[0].properties'); if (metaError) { @@ -177,11 +180,11 @@ const getDocumentsByInfer = async ({ cluster, bucketName }) => { }; /** - * @param {{ cluster: Cluster; bucketName: string; }} param0 + * @param {{ cluster: Cluster; bucketName: string; limit: number }} param0 * @returns {Promise} */ -const getDocumentsBySelectStatement = async ({ cluster, bucketName }) => { - const selectBucketDocumentsQuery = queryHelper.getSelectBucketDocumentsQuery({ bucketName, limit: DEFAULT_LIMIT }); +const getDocumentsBySelectStatement = async ({ cluster, bucketName, limit = DEFAULT_LIMIT }) => { + const selectBucketDocumentsQuery = queryHelper.getSelectBucketDocumentsQuery({ bucketName, limit }); const { rows: documents } = await cluster.query(selectBucketDocumentsQuery); return documents; @@ -232,13 +235,214 @@ const prepareBucketCollectionNamesData = ({ bucketName, scopeName, collectionNam }; }; +/** + * @typedef {(args: object) => string} getQuery + * @param {{ cluster: Cluster; options: object; getQuery: getQuery; logger: Logger }} param0 + * @returns {Promise} + */ +const getPaginatedQuery = async ({ cluster, options, query, logger }) => { + const { bucketName, scopeName, collectionName, pagination, limit } = options; + logger.progress('Get data from database', bucketName + '.' + scopeName, collectionName); + + if (!pagination?.enabled) { + const queryWithOptions = queryHelper.getQueryOptions({ query, limit }); + const { rows } = await cluster.query(queryWithOptions); + return rows; + } + + const pageSize = Number(options.pagination.value) || DEFAULT_LIMIT; + const pages = Math.ceil(options.limit / pageSize); + const rowsByPages = []; + + let counter = 0; + + for (const page of pages) { + const offset = pageSize * page; + const limit = options.limit - offset < pageSize ? options.limit - offset : pageSize; + const queryWithOptions = queryHelper.getQueryOptions({ query, limit, offset }); + const { rows } = await cluster.query(queryWithOptions); + + counter += rows.length; + rowsByPages.push(...rows); + + logger.progress( + `Collection sampling: ${counter} / ${options.limit}`, + bucketName + '.' + scopeName, + collectionName, + ); + } + + return rowsByPages; +}; + +/** + * @param {{size: number; recordSamplingSettings: RecordSamplingSettings }} param0 + * @returns {number} + */ +const getDocSamplingSize = ({ size, recordSamplingSettings }) => { + if (recordSamplingSettings.active === 'absolute') { + return Number(recordSamplingSettings.absolute.value); + } + + const limit = Math.ceil((size * recordSamplingSettings.relative.value) / 100); + + return Math.min(limit, recordSamplingSettings.maxValue); +}; + +/** + * @param {{ cluster: Cluster; bucketName: string; scopeName: string; collectionName: string; recordSamplingSettings: RecordSamplingSettings; logger: Logger }} param0 + * @returns {Promise} + */ +const getCollectionSamplingSize = async ({ + cluster, + bucketName, + scopeName, + collectionName, + recordSamplingSettings, + logger, +}) => { + try { + const query = queryHelper.getCountCollectionDocumentsQuery({ bucketName, scopeName, collectionName }); + const { rows } = await cluster.query(query); + const size = rows?.[0]?.size; + + return getDocSamplingSize({ size, recordSamplingSettings }) || DEFAULT_LIMIT; + } catch (error) { + logger.error(error); + return DEFAULT_LIMIT; + } +}; + +/** + * @param {{ cluster: Cluster; bucketName: string; scopeName: string; collectionName: string; limit: number }} param0 + * @returns {Promise} + */ +const getCollectionDocumentsByInfer = async ({ cluster, bucketName, scopeName, collectionName, limit }) => { + query = queryHelper.getInferCollectionDocumentsQuery({ bucketName, scopeName, collectionName, limit }); + const { rows, meta } = await cluster.query(query); + const metaError = _.get(meta, 'errors.[0]'); + + if (metaError) { + throw metaError; + } + + const [[inference]] = rows; + + return schemaHelper.convertInferSchemaToDocuments({ inference, bucketName }); +}; + +/** + * @param {{ + * cluster: Cluster; + * data: object; + * bucketName: string; + * scopeName: string; + * collectionName: string; + * collectionIndexes: object[]; + * logger: Logger; + * app: App; + * }} param0 + * @returns {Promise} + */ +const getDbCollectionData = async ({ + cluster, + data, + bucketName, + scopeName, + collectionName, + collectionIndexes, + logger, + app, +}) => { + const limit = await getCollectionSamplingSize({ + cluster, + bucketName, + scopeName, + collectionName, + recordSamplingSettings: data.recordSamplingSettings, + logger, + }); + const documentKind = data.documentKinds?.[bucketName]?.documentKindName || ''; + const options = { limit, pagination: data.pagination, bucketName, scopeName, collectionName }; + + let documents = []; + let query = queryHelper.getSelectCollectionDocumentsQuery({ bucketName, scopeName, collectionName }); + + try { + documents = await getPaginatedQuery({ cluster, options, query, logger }); + + return schemaHelper.getDbCollectionData({ + bucketName, + scopeName, + collectionName, + documents, + collectionIndexes, + }); + } catch (error) { + try { + const errorCode = getErrorCode({ error }); + switch (errorCode) { + case COUCHBASE_ERROR_CODE.collectionDoesNotExist: + query = queryHelper.getSelectBucketDocumentsByDocumentKindQuery({ + bucketName, + documentKind, + collectionName, + }); + documents = await getPaginatedQuery({ cluster, options, query, logger }); + break; + case COUCHBASE_ERROR_CODE.primaryIndexDoesNotExist: + documents = await getCollectionDocumentsByInfer({ + cluster, + bucketName, + scopeName, + collectionName, + limit, + }); + break; + case COUCHBASE_ERROR_CODE.inferMethodIsNotSupport: + case COUCHBASE_ERROR_CODE.n1qlMethodsAreNotSupported: + documents = await restApiHelper.getBucketDocuments({ + connectionInfo: data.connectionInfo, + bucketName, + logger, + app, + }); + break; + } + } catch (error) { + const errorCode = getErrorCode({ error }); + if (errorCode === COUCHBASE_ERROR_CODE.n1qlMethodsAreNotSupported) { + documents = await restApiHelper.getBucketDocuments({ + connectionInfo: data.connectionInfo, + bucketName, + logger, + app, + }); + } + logger.error(error); + } + + logger.error(error); + + return schemaHelper.getDbCollectionData({ + bucketName, + scopeName, + collectionName, + documents, + collectionIndexes, + }); + } +}; + module.exports = { isBucketHasDefaultCollection, getAllBuckets, getBucketScopeNameMap, getDbCollectionsNames, + getDbCollectionData, getDocumentsBySelectStatement, - getDocumentsByInfer, + getBucketDocumentsByInfer, getErrorCode, getErrorMessage, + getPaginatedQuery, }; diff --git a/reverse_engineering/helpers/queryHelper.js b/reverse_engineering/helpers/queryHelper.js index f4e3f3c..4ce93a3 100644 --- a/reverse_engineering/helpers/queryHelper.js +++ b/reverse_engineering/helpers/queryHelper.js @@ -15,15 +15,59 @@ const getInferBucketDocumentsQuery = ({ bucketName, limit }) => { }; /** - * @param {{ bucketName: string; limit?: number; }} param0 + * @param {{ bucketName: string; scopeName: string; collectionName: string; limit: number }} param0 + * @returns + */ +const getInferCollectionDocumentsQuery = ({ bucketName, scopeName, collectionName, limit }) => { + return `INFER \`${bucketName}\`.\`${scopeName}\`.\`${collectionName}\` WITH {"sample_size":${limit}, "num_sample_values":3};`; +}; + +/** + * @param {{ bucketName: string; limit?: number; offset: number; }} param0 + * @returns {string} + */ +const getSelectBucketDocumentsQuery = ({ bucketName, limit, offset }) => { + const query = `SELECT * FROM \`${bucketName}\``; + return getQueryOptions({ query, limit, offset }); +}; + +/** + * @param {{ bucketName: string; scopeName: string; collectionName: string; limit: number; offset: number }} param0 + * @returns {string} + */ +const getSelectCollectionDocumentsQuery = ({ bucketName, scopeName, collectionName, limit, offset }) => { + const query = `SELECT *, META().id AS docid FROM \`${bucketName}\`.\`${scopeName}\`.\`${collectionName}\` AS \`${bucketName}\``; + return getQueryOptions({ query, limit, offset }); +}; + +/** + * @param {{ bucketName: string; scopeName: string; collectionName: string; }} param0 + * @returns {string} + */ +const getCountCollectionDocumentsQuery = ({ bucketName, scopeName, collectionName }) => { + return `SELECT COUNT(*) AS size FROM \`${bucketName}\`.\`${scopeName}\`.\`${collectionName}\``; +}; + +const getSelectBucketDocumentsByDocumentKindQuery = ({ bucketName, documentKind, collectionName, limit, offset }) => { + const query = `SELECT *, META().id as docid FROM \`${bucketName}\` WHERE \`${documentKind}\` = "${collectionName}"`; + return getQueryOptions({ query, limit, offset }); +}; + +/** + * @param {{ query: string; limit: number; offset: number; }} param0 * @returns {string} */ -const getSelectBucketDocumentsQuery = ({ bucketName, limit }) => { - return `SELECT * FROM \`${bucketName}\`` + (limit ? `LIMIT ${limit}` : ''); +const getQueryOptions = ({ query, limit, offset }) => { + return query + (limit ? ` LIMIT ${limit}` : '') + (offset ? ` OFFSET ${offset}` : ''); }; module.exports = { + getCountCollectionDocumentsQuery, getInferBucketDocumentsQuery, + getInferCollectionDocumentsQuery, getSelectBucketDocumentKindQuery, + getSelectBucketDocumentsByDocumentKindQuery, getSelectBucketDocumentsQuery, + getSelectCollectionDocumentsQuery, + getQueryOptions, }; diff --git a/reverse_engineering/helpers/schemaHelper.js b/reverse_engineering/helpers/schemaHelper.js new file mode 100644 index 0000000..7228618 --- /dev/null +++ b/reverse_engineering/helpers/schemaHelper.js @@ -0,0 +1,62 @@ +/** + * @typedef {import('../../shared/types').DbCollectionData} DbCollectionData + * @typedef {import('../../shared/types').Document} Document + */ +const _ = require('lodash'); + +/** + * + * @param {{ documents: Document[]; bucketName: string; scopeName: string; collectionName: string; collectionIndexes: object[] }} param0 + * @returns {DbCollectionData} + */ +const getDbCollectionData = ({ documents, bucketName, scopeName, collectionName, collectionIndexes }) => { + const jsonDocuments = documents + .filter(item => _.isPlainObject(item[bucketName])) + .map(item => ({ + KEY: item.docid, + ...item[bucketName], + })); + + return { + dbName: scopeName, + collectionName: collectionName, + documentKind: '', + collectionDocs: {}, + bucketInfo: { + bucket: bucketName, + }, + emptyBucket: !jsonDocuments.length, + indexes: collectionIndexes, + documents: jsonDocuments, + }; +}; + +/** + * @param {{ inference: object; bucketName: string; }} param0 + * @returns {Document[]} + */ +const convertInferSchemaToDocuments = ({ inference, bucketName }) => { + if (_.isEmpty(inference?.properties)) { + return []; + } + + const documents = Object.keys(inference.properties).reduce((result, propertyName) => { + const samples = inference.properties[propertyName]?.samples || []; + + return samples.reduce((acc, sample, index) => { + const document = acc[index] || {}; + acc[index] = { ...document, [propertyName]: sample }; + return acc; + }, result); + }, []); + + return documents.map(document => ({ + docid: '', + [bucketName]: document, + })); +}; + +module.exports = { + getDbCollectionData, + convertInferSchemaToDocuments, +}; diff --git a/shared/constants.js b/shared/constants.js index 0859cd0..5ff7829 100644 --- a/shared/constants.js +++ b/shared/constants.js @@ -24,6 +24,7 @@ const COUCHBASE_ERROR_CODE = { userDoesNotHaveAccessToPrivilegeCluster: 13014, parseSyntaxError: 3000, inferMethodIsNotSupport: 16003, + collectionDoesNotExist: 12003, }; /** diff --git a/shared/types.d.ts b/shared/types.d.ts index b596702..a614107 100644 --- a/shared/types.d.ts +++ b/shared/types.d.ts @@ -100,6 +100,17 @@ type DocumentKindData = { status?: STATUS; }; +type DbCollectionData = { + dbName: string; + collectionName: string; + documentKind: string; + collectionDocs: object; + bucketInfo: object; + emptyBucket: boolean; + indexes: object[]; + documents: Document[]; +} + export { App, AppLogger, @@ -110,6 +121,7 @@ export { Cluster, ConnectionInfo, ConnectionParams, + DbCollectionData, Document, DocumentKindData, FilePath, From 08004d5989ae8fad08f23ceda7ee81b0c2e49e85 Mon Sep 17 00:00:00 2001 From: Serhii Filonenko Date: Thu, 1 Feb 2024 15:09:06 +0200 Subject: [PATCH 10/37] RE: fix typo --- reverse_engineering/helpers/clusterHelper.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reverse_engineering/helpers/clusterHelper.js b/reverse_engineering/helpers/clusterHelper.js index 3b5771a..a8016f2 100644 --- a/reverse_engineering/helpers/clusterHelper.js +++ b/reverse_engineering/helpers/clusterHelper.js @@ -318,7 +318,7 @@ const getCollectionSamplingSize = async ({ * @returns {Promise} */ const getCollectionDocumentsByInfer = async ({ cluster, bucketName, scopeName, collectionName, limit }) => { - query = queryHelper.getInferCollectionDocumentsQuery({ bucketName, scopeName, collectionName, limit }); + const query = queryHelper.getInferCollectionDocumentsQuery({ bucketName, scopeName, collectionName, limit }); const { rows, meta } = await cluster.query(query); const metaError = _.get(meta, 'errors.[0]'); From bac227be471d973c38c87f076965817abbafc3e7 Mon Sep 17 00:00:00 2001 From: Serhii Filonenko Date: Fri, 2 Feb 2024 08:47:06 +0200 Subject: [PATCH 11/37] package: install antler --- package-lock.json | 9 +++++++++ package.json | 1 + 2 files changed, 10 insertions(+) diff --git a/package-lock.json b/package-lock.json index c18ae18..08f1cbf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,7 @@ "name": "CouchbaseV7Plus", "version": "0.0.3", "dependencies": { + "antlr4": "^4.9.2", "async": "^3.2.5", "lodash": "^4.17.21" }, @@ -680,6 +681,14 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/antlr4": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/antlr4/-/antlr4-4.9.2.tgz", + "integrity": "sha512-UjMSlenUORL+a+6g4RNZxRh5LcFWybRi2g0ASDBpgXBY6nlavg0BRVAVEQF0dz8jH6SyX3lV7uP5y/krJzc+Hw==", + "engines": { + "node": ">=14" + } + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", diff --git a/package.json b/package.json index 0791fae..55ac739 100644 --- a/package.json +++ b/package.json @@ -47,6 +47,7 @@ "simple-git-hooks": "2.9.0" }, "dependencies": { + "antlr4": "^4.9.2", "async": "^3.2.5", "lodash": "^4.17.21" } From aa54e755f39a1abb26cc1b8787aeafaa83c973f6 Mon Sep 17 00:00:00 2001 From: Serhii Filonenko Date: Fri, 2 Feb 2024 08:47:40 +0200 Subject: [PATCH 12/37] RE: implement antlr parser --- .../antlr/antlrErrorListener.js | 9 + reverse_engineering/antlr/buildParser.sh | 23 + reverse_engineering/antlr/grammars/n1ql.g4 | 1151 + .../antlr/n1qlToCollectionVisitor.js | 292 + reverse_engineering/antlr/parser/n1ql.interp | 752 + reverse_engineering/antlr/parser/n1ql.tokens | 264 + .../antlr/parser/n1qlLexer.interp | 746 + reverse_engineering/antlr/parser/n1qlLexer.js | 2304 ++ .../antlr/parser/n1qlLexer.tokens | 264 + .../antlr/parser/n1qlParser.js | 25232 ++++++++++++++++ .../antlr/parser/n1qlVisitor.js | 1314 + 11 files changed, 32351 insertions(+) create mode 100644 reverse_engineering/antlr/antlrErrorListener.js create mode 100644 reverse_engineering/antlr/buildParser.sh create mode 100644 reverse_engineering/antlr/grammars/n1ql.g4 create mode 100644 reverse_engineering/antlr/n1qlToCollectionVisitor.js create mode 100644 reverse_engineering/antlr/parser/n1ql.interp create mode 100644 reverse_engineering/antlr/parser/n1ql.tokens create mode 100644 reverse_engineering/antlr/parser/n1qlLexer.interp create mode 100644 reverse_engineering/antlr/parser/n1qlLexer.js create mode 100644 reverse_engineering/antlr/parser/n1qlLexer.tokens create mode 100644 reverse_engineering/antlr/parser/n1qlParser.js create mode 100644 reverse_engineering/antlr/parser/n1qlVisitor.js diff --git a/reverse_engineering/antlr/antlrErrorListener.js b/reverse_engineering/antlr/antlrErrorListener.js new file mode 100644 index 0000000..48d2f82 --- /dev/null +++ b/reverse_engineering/antlr/antlrErrorListener.js @@ -0,0 +1,9 @@ +const antlr4 = require('antlr4'); + +class ExprErrorListener extends antlr4.error.ErrorListener { + syntaxError(recognizer, offendingSymbol, line, column, msg, err) { + throw new Error(`line ${line}:${column} ${msg}`); + } +} + +module.exports = ExprErrorListener; diff --git a/reverse_engineering/antlr/buildParser.sh b/reverse_engineering/antlr/buildParser.sh new file mode 100644 index 0000000..19ed503 --- /dev/null +++ b/reverse_engineering/antlr/buildParser.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +# * run with `sh buildParser.sh` + +# !important: don't forget to change `import` and `export` to `require` and `module.exports` after the parser is built + +# https://www.antlr.org/download/antlr-4.9.2-complete.jar +# +# set antlr4 aliases +# export CLASSPATH=".:/usr/local/lib/antlr-4.9.2-complete.jar:$CLASSPATH" +# alias antlr4='java -jar /usr/local/lib/antlr-4.9.2-complete.jar' +# alias grun='java org.antlr.v4.gui.TestRig' + +# build parser +java -jar /usr/local/lib/antlr-4.9.2-complete.jar -Dlanguage=JavaScript \ + -lib grammars \ + -o parser/ \ + -visitor \ + -no-listener \ + -Xexact-output-dir \ + grammars/n1ql.g4 + +npx prettier --write ./parser/**/*.js diff --git a/reverse_engineering/antlr/grammars/n1ql.g4 b/reverse_engineering/antlr/grammars/n1ql.g4 new file mode 100644 index 0000000..311452e --- /dev/null +++ b/reverse_engineering/antlr/grammars/n1ql.g4 @@ -0,0 +1,1151 @@ +/* + * This is an automotically generated Antlr4 N1QL parser. + * + * Actually, the lexer part is hand-generated, and the parser rules are extracted + * using an Antlr4 parser that parses the rules from the goyacc n1ql.y file. + */ + +grammar n1ql; + +fragment SingleStringCharacter: '\'\'' | '\\\'' | '\\' ~['] | ~['\r\n\\]; +fragment DoubleStringCharacter: '\\"' | '\\' ~["] | ~["\\]; + +STR: '\'' SingleStringCharacter* '\'' +| '"' DoubleStringCharacter* '"'; + +fragment NumStart: '0' | [1-9]; +fragment Digit: [0-9]; + +fragment Int: '0' | NumStart Digit*; +fragment Exponent: [eE][+-]? Digit+; + +INT: Int; + +NUM: Int '.' Digit+ Exponent? | Int Exponent; +BLOCK_COMMENT: '/*' .*? '*/'; + +LINE_COMMENT: '--' ~[\n\r]*; +WHITESPACE: [ \t\n\r\f]+ -> skip; +DOT: '.'; +PLUS: '+'; +MINUS: '-' | [mM][iI][nN][uU][sS]; +STAR: '*'; +DIV: '/'; +MOD: '%'; +DEQ: '=='; +EQ: '='; +NE: '!=' | '<>'; +LT: '<'; +LE: '<='; +GT: '>'; +GE: '>='; +CONCAT: '||'; +LPAREN: '('; +RPAREN: ')'; +LBRACE: '{'; +RBRACE: '}'; +COMMA: ','; +COLON: ':'; +LBRACKET: '['; +RBRACKET: ']'; +RBRACKET_ICASE:']i'; +SEMI: ';'; +NOT_A_TOKEN: '!'; + +ADVISE: [aA][dD][vV][iI][sS][eE]; +ALL: [aA][lL][lL]; +ALTER: [aA][lL][tT][eE][rR]; +ANALYZE: [aA][nN][aA][lL][yY][zZ][eE]; +AND: [aA][nN][dD]; +ANY: [aA][nN][yY]; +ARRAY: [aA][rR][rR][aA][yY]; +AS: [aA][sS]; +ASC: [aA][sS][cC]; +AT: [aA][tT]; +BEGIN: [bB][eE][gG][iI][nN]; +BETWEEN: [bB][eE][tT][wW][eE][eE][nN]; +BINARY: [bB][iI][nN][aA][rR][yY]; +BOOLEAN: [bB][oO][oO][lL][eE][aA][nN]; +BREAK: [bB][rR][eE][aA][kK]; +BUCKET: [bB][uU][cC][kK][eE][tT]; +BUILD: [bB][uU][iI][lL][dD]; +BY: [bB][yY]; +CALL: [cC][aA][lL][lL]; +CASE: [cC][aA][sS][eE]; +CAST: [cC][aA][sS][tT]; +CLUSTER: [cC][lL][uU][sS][tT][eE][rR]; +COLLATE: [cC][oO][lL][lL][aA][tT][eE]; +COLLECTION: [cC][oO][lL][lL][eE][cC][tT][iI][oO][nN]; +COMMIT: [cC][oO][mM][mM][iI][tT]; +COMMITTED: [cC][oO][mM][mM][iI][tT][tT][eE][dD]; +CONNECT: [cC][oO][nN][nN][eE][cC][tT]; +CONTINUE: [cC][oO][nN][tT][iI][nN][uU][eE]; +CORRELATED: [cC][oO][rR][rR][eE][lL][aA][tT][eE][dD]; +COVER: [cC][oO][vV][eE][rR]; +CREATE: [cC][rR][eE][aA][tT][eE]; +CURRENT: [cC][uU][rR][rR][eE][nN][tT]; +DATABASE: [dD][aA][tT][aA][bB][aA][sS][eE]; +DATASET: [dD][aA][tT][aA][sS][eE][tT]; +DATASTORE: [dD][aA][tT][aA][sS][tT][oO][rR][eE]; +DECLARE: [dD][eE][cC][lL][aA][rR][eE]; +DECREMENT: [dD][eE][cC][rR][eE][mM][eE][nN][tT]; +DELETE_: [dD][eE][lL][eE][tT][eE]; +DERIVED: [dD][eE][rR][iI][vV][eE][dD]; +DESC: [dD][eE][sS][cC]; +DESCRIBE: [dD][eE][sS][cC][rR][iI][bB][eE]; +DISTINCT: [dD][iI][sS][tT][iI][nN][cC][tT]; +DO: [dD][oO]; +DROP: [dD][rR][oO][pP]; +EACH: [eE][aA][cC][hH]; +ELEMENT: [eE][lL][eE][mM][eE][nN][tT]; +ELSE: [eE][lL][sS][eE]; +END: [eE][nN][dD]; +EVERY: [eE][vV][eE][rR][yY]; +EXCEPT: [eE][xX][cC][eE][pP][tT]; +EXCLUDE: [eE][xX][cC][lL][uU][dD][eE]; +EXECUTE: [eE][xX][eE][cC][uU][tT][eE]; +EXISTS: [eE][xX][iI][sS][tT][sS]; +EXPLAIN: [eE][xX][pP][lL][aA][iI][nN]; +FALSE: [fF][aA][lL][sS][eE]; +FETCH: [fF][eE][tT][cC][hH]; +FILTER: [fF][iI][lL][tT][eE][rR]; +FIRST: [fF][iI][rR][sS][tT]; +FLATTEN: [fF][lL][aA][tT][tT][eE][nN]; +FLUSH: [fF][lL][uU][sS][hH]; +FOLLOWING: [fF][oO][lL][lL][oO][wW][iI][nN][gG]; +FOR: [fF][oO][rR]; +FORCE: [fF][oO][rR][cC][eE]; +FROM: [fF][rR][oO][mM]; +FTS: [fF][tT][sS]; +FUNCTION: [fF][uU][nN][cC][tT][iI][oO][nN]; +GOLANG: [gG][oO][lL][aA][nN][gG]; +GRANT: [gG][rR][aA][nN][tT]; +GROUP: [gG][rR][oO][uU][pP]; +GROUPS: [gG][rR][oO][uU][pP][sS]; +GSI: [gG][sS][iI]; +HASH: [hH][aA][sS][hH]; +HAVING: [hH][aA][vV][iI][nN][gG]; +IF: [iI][fF]; +IGNORE: [iI][gG][nN][oO][rR][eE]; +ILIKE: [iI][lL][iI][kK][eE]; +IN: [iI][nN]; +INCLUDE: [iI][nN][cC][lL][uU][dD][eE]; +INCREMENT: [iI][nN][cC][rR][eE][mM][eE][nN][tT]; +INDEX: [iI][nN][dD][eE][xX]; +INFER: [iI][nN][fF][eE][rR]; +INLINE: [iI][nN][lL][iI][nN][eE]; +INNER: [iI][nN][nN][eE][rR]; +INSERT: [iI][nN][sS][eE][rR][tT]; +INTERSECT: [iI][nN][tT][eE][rR][sS][eE][cC][tT]; +INTO: [iI][nN][tT][oO]; +IS: [iI][sS]; +ISOLATION: [iI][sS][oO][lL][aA][tT][iI][oO][nN]; +JAVASCRIPT: [jJ][aA][vV][aA][sS][cC][rR][iI][pP][tT]; +JOIN: [jJ][oO][iI][nN]; +KEY: [kK][eE][yY]; +KEYS: [kK][eE][yY][sS]; +KEYSPACE: [kK][eE][yY][sS][pP][aA][cC][eE]; +KNOWN: [kK][nN][oO][wW][nN]; +LANGUAGE: [lL][aA][nN][gG][uU][aA][gG][eE]; +LAST: [lL][aA][sS][tT]; +LEFT: [lL][eE][fF][tT]; +LET_: [lL][eE][tT]; +LETTING: [lL][eE][tT][tT][iI][nN][gG]; +LEVEL: [lL][eE][vV][eE][lL]; +LIKE: [lL][iI][kK][eE]; +LIMIT: [lL][iI][mM][iI][tT]; +LSM: [lL][sS][mM]; +MAP: [mM][aA][pP]; +MAPPING: [mM][aA][pP][pP][iI][nN][gG]; +MATCHED: [mM][aA][tT][cC][hH][eE][dD]; +MATERIALIZED: [mM][aA][tT][eE][rR][iI][aA][lL][iI][zZ][eE][dD]; +MERGE: [mM][eE][rR][gG][eE]; +MISSING: [mM][iI][sS][sS][iI][nN][gG]; +NAMESPACE: [nN][aA][mM][eE][sS][pP][aA][cC][eE]; +NEST: [nN][eE][sS][tT]; +NL: [nN][lL]; +NO: [nN][oO]; +NOT: [nN][oO][tT]; +NTH_VALUE: [nN][tT][hH][_][vV][aA][lL][uU][eE]; +NULL: [nN][uU][lL][lL]; +NULLS: [nN][uU][lL][lL][sS]; +NUMBER: [nN][uN][mM][bB][eE][rR]; +OBJECT: [oO][bB][jJ][eE][cC][tT]; +OFFSET: [oO][fF][fF][sS][eE][tT]; +ON: [oO][nN]; +OPTION: [oO][pP][tT][iI][oO][nN]; +OPTIONS: [oO][pP][tT][iI][oO][nN][sS]; +OR: [oO][rR]; +ORDER: [oO][rR][dD][eE][rR]; +OTHERS: [oO][tT][hH][eE][rR][sS]; +OUTER: [oO][uU][tT][eE][rR]; +OVER: [oO][vV][eE][rR]; +PARSE: [pP][aA][rR][sS][eE]; +PARTITION: [pP][aA][rR][tT][iI][tT][iI][oO][nN]; +PASSWORD: [pP][aA][sS][sS][wW][oO][rR][dD]; +PATH: [pP][aA][tT][hH]; +POOL: [pP][oO][oO][lL]; +PRECEDING: [pP][rR][eE][cC][eE][dD][iI][nN][gG]; +PREPARE: [pP][rR][eE][pP][aA][rR][eE]; +PRIMARY: [pP][rR][iI][mM][aA][rR][yY]; +PRIVATE: [pP][rR][iI][vV][aA][tT][eE]; +PRIVILEGE: [pP][rR][iI][vV][iI][lL][eE][gG][eE]; +PROCEDURE: [pP][rR][oO][cC][eE][dD][uU][rR][eE]; +PROBE: [pP][rR][oO][bB][eE]; +PUBLIC: [pP][uU][bB][lL][iI][cC]; +RANGE: [rR][aA][nN][gG][eE]; +RAW: [rR][aA][wW]; +READ: [rR][eE][aA][dD]; +REALM: [rR][eE][aA][lL][mM]; +REDUCE: [rR][eE][dD][uU][cC][eE]; +RENAME: [rR][eE][nN][aA][mM][eE]; +REPLACE: [rR][eE][pP][lL][aA][cC][eE]; +RESPECT: [rR][eE][sS][pP][eE][cC][tT]; +RETURN: [rR][eE][tT][uU][rR][nN]; +RETURNING: [rR][eE][tT][uU][rR][nN][iI][nN][gG]; +REVOKE: [rR][eE][vV][oO][kK][eE]; +RIGHT: [rR][iI][gG][hH][tT]; +ROLE: [rR][oO][lL][eE]; +ROLLBACK: [rR][oO][lL][lL][bB][aA][cC][kK]; +ROW: [rR][oO][wW]; +ROWS: [rR][oO][wW][sS]; +SATISFIES: [sS][aA][tT][iI][sS][fF][iI][eE][sS]; +SAVEPOINT: [sS][aA][vV][eE][pP][oO][iI][nN][tT]; +SCHEMA: [sS][cC][hH][eE][mM][aA]; +SCOPE: [sS][cC][oO][pP][eE]; +SELECT: [sS][eE][lL][eE][cC][tT]; +SELF: [sS][eE][lL][fF]; +SET: [sS][eE][tT]; +SHOW: [sS][hH][oO][wW]; +SOME: [sS][oO][mM][eE]; +START: [sS][tT][aA][rR][tT]; +STATISTICS: [sS][tT][aA][tT][iI][sS][tT][iI][cC][sS]; +STRING: [sS][tT][rR][iI][nN][gG]; +SYSTEM: [sS][yY][sS][tT][eE][mM]; +THEN: [tT][hH][eE][nN]; +TIES: [tT][iI][eE][sS]; +TO: [tT][oO]; +TRAN: [tT][rR][aA][nN]; +TRANSACTION: [tT][rR][aA][nN][sS][aA][cC][tT][iI][oO][nN]; +TRIGGER: [tT][rR][iI][gG][gG][eE][rR]; +TRUE: [tT][rR][uU][eE]; +TRUNCATE: [tT][rR][uU][nN][cC][aA][tT][eE]; +UNBOUNDED: [uU][nN][bB][oO][uU][nN][dD][eE][dD]; +UNDER: [uU][nN][dD][eE][rR]; +UNION: [uU][nN][iI][oO][nN]; +UNIQUE: [uU][nN][iI][qQ][uU][eE]; +UNKNOWN: [uU][nN][kK][nN][oO][wW][nN]; +UNNEST: [uU][nN][nN][eE][sS][tT]; +UNSET: [uU][nN][sS][eE][tT]; +UPDATE: [uU][pP][dD][aA][tT][eE]; +UPSERT: [uU][pP][sS][eE][rR][tT]; +USE: [uU][sS][eE]; +USER: [uU][sS][eE][rR]; +USING: [uU][sS][iI][nN][gG]; +VALIDATE: [vV][aA][lL][iI][dD][aA][tT][eE]; +VALUE: [vV][aA][lL][uU][eE]; +VALUED: [vV][aA][lL][uU][eE][dD]; +VALUES: [vV][aA][lL][uU][eE][sS]; +VIA: [vV][iI][aA]; +VIEW: [vV][iI][eE][wW]; +WHEN: [wW][hH][eE][nN]; +WHERE: [wW][hH][eE][rR][eE]; +WHILE: [wW][hH][iI][lL][eE]; +WINDOW: [wW][iI][nN][dD][oO][wW]; +WITH: [wW][iI][tT][hH]; +WITHIN: [wW][iI][tT][hH][iI][nN]; +WORK: [wW][oO][rR][kK]; +XOR: [xX][oO][rR]; + +fragment IdentChar: '``' | ~[`]; +fragment IdentFirstChar: [a-zA-Z_]; +fragment IdentLaterChar: [a-zA-Z0-9_]; + +IDENT_ICASE: '`' IdentChar+ '`i'; +IDENT: '`' IdentChar+ '`' | IdentFirstChar IdentLaterChar*; +NAMED_PARAM: '$' IdentFirstChar IdentLaterChar*; +POSITIONAL_PARAM: '$' [1-9] [0-9]*; +NEXT_PARAM: '?'; +statements:input input* +; + +input: stmt_body opt_trailer + | expr_input +; + +opt_trailer: + | opt_trailer SEMI +; +stmt_body: advise + | explain + | prepare + | execute + | stmt +; +stmt: select_stmt + | dml_stmt + | ddl_stmt + | infer + | update_statistics + | role_stmt + | function_stmt + | transaction_stmt +; +advise: ADVISE opt_index stmt +; +opt_index: + | INDEX +; +explain: EXPLAIN stmt +; +prepare: PREPARE opt_force opt_name stmt +; +opt_force: + | FORCE +; +opt_name: + | IDENT from_or_as + | STR from_or_as +; +from_or_as: FROM + | AS +; +execute: EXECUTE expr execute_using +; +execute_using: + | USING construction_expr +; +infer: INFER opt_keyspace_collection simple_keyspace_ref opt_infer_using opt_infer_ustat_with +; +opt_keyspace_collection: + | KEYSPACE + | COLLECTION +; +opt_infer_using: +; +opt_infer_ustat_with: + | infer_ustat_with +; +infer_ustat_with: WITH expr +; +select_stmt: fullselect +; +dml_stmt: insert + | upsert + | delete_ + | update + | merge +; +ddl_stmt: index_stmt + | scope_stmt + | collection_stmt +; +role_stmt: grant_role + | revoke_role +; +index_stmt: create_index + | create_primary_index + | drop_index + | alter_index + | build_index +; +scope_stmt: create_scope + | drop_scope +; +collection_stmt: create_collection + | drop_collection + | flush_collection +; +function_stmt: create_function + | drop_function + | execute_function +; +transaction_stmt: start_transaction + | commit_transaction + | rollback_transaction + | savepoint + | set_transaction_isolation +; +fullselect: select_terms opt_order_by + | select_terms opt_order_by limit opt_offset + | select_terms opt_order_by offset opt_limit +; +select_terms: subselect + | select_terms UNION select_term + | select_terms UNION ALL select_term + | select_terms INTERSECT select_term + | select_terms INTERSECT ALL select_term + | select_terms EXCEPT select_term + | select_terms EXCEPT ALL select_term + | subquery_expr UNION select_term + | subquery_expr UNION ALL select_term + | subquery_expr INTERSECT select_term + | subquery_expr INTERSECT ALL select_term + | subquery_expr EXCEPT select_term + | subquery_expr EXCEPT ALL select_term +; +select_term: subselect + | subquery_expr +; +subselect: from_select + | select_from +; +from_select: opt_with from opt_let opt_where opt_group opt_window_clause select_clause +; +select_from: opt_with select_clause opt_from opt_let opt_where opt_group opt_window_clause +; +select_clause: SELECT projection +; +projection: opt_quantifier projects + | opt_quantifier raw expr opt_as_alias +; +opt_quantifier: + | ALL + | DISTINCT +; +raw: RAW + | ELEMENT + | VALUE +; +projects: project + | projects COMMA project +; +project: STAR + | expr DOT STAR + | expr opt_as_alias +; +opt_as_alias: + | as_alias +; +as_alias: alias + | AS alias +; +alias: IDENT +; +opt_from: + | from +; +from: FROM from_term +; +from_term: simple_from_term + | from_term opt_join_type JOIN simple_from_term on_keys + | from_term opt_join_type JOIN simple_from_term on_key FOR IDENT + | from_term opt_join_type NEST simple_from_term on_keys + | from_term opt_join_type NEST simple_from_term on_key FOR IDENT + | from_term opt_join_type unnest expr opt_as_alias + | from_term opt_join_type JOIN simple_from_term ON expr + | from_term opt_join_type NEST simple_from_term ON expr + | simple_from_term RIGHT opt_outer JOIN simple_from_term ON expr +; +simple_from_term: keyspace_term + | expr opt_as_alias opt_use +; +unnest: UNNEST + | FLATTEN +; +keyspace_term: keyspace_path opt_as_alias opt_use +; +keyspace_path: namespace_term keyspace_name + | namespace_term bucket_name DOT scope_name DOT keyspace_name +; +namespace_term: namespace_name + | SYSTEM COLON +; +namespace_name: IDENT COLON +; +bucket_name: IDENT +; +scope_name: IDENT +; +keyspace_name: IDENT +; +opt_use: + | USE use_options +; +use_options: use_keys + | use_index + | join_hint + | use_index join_hint + | join_hint use_index + | use_keys join_hint + | join_hint use_keys +; +use_keys: opt_primary KEYS expr +; +use_index: INDEX LPAREN index_refs RPAREN +; +join_hint: HASH LPAREN use_hash_option RPAREN + | NL +; +opt_primary: + | PRIMARY +; +index_refs: index_ref + | index_refs COMMA index_ref +; +index_ref: opt_index_name opt_index_using +; +use_hash_option: BUILD + | PROBE +; +opt_use_del_upd: opt_use +; +opt_join_type: + | INNER + | LEFT opt_outer +; +opt_outer: + | OUTER +; +on_keys: ON opt_primary KEYS expr +; +on_key: ON opt_primary KEY expr +; +opt_let: + | let_ +; +let_: LET_ bindings +; +bindings: binding + | bindings COMMA binding +; +binding: alias EQ expr +; +opt_with: + | WITH with_list +; +with_list: with_term + | with_list COMMA with_term +; +with_term: alias AS paren_expr +; +opt_where: + | where +; +where: WHERE expr +; +opt_group: + | group +; +group: GROUP BY group_terms opt_letting opt_having + | letting +; +group_terms: group_term + | group_terms COMMA group_term +; +group_term: expr opt_as_alias +; +opt_letting: + | letting +; +letting: LETTING bindings +; +opt_having: + | having +; +having: HAVING expr +; +opt_order_by: + | order_by +; +order_by: ORDER BY sort_terms +; +sort_terms: sort_term + | sort_terms COMMA sort_term +; +sort_term: expr opt_dir opt_order_nulls +; +opt_dir: + | dir +; +dir: ASC + | DESC +; +opt_order_nulls: + | nulls first_last +; +first_last: FIRST + | LAST +; +nulls: NULLS +; +opt_limit: + | limit +; +limit: LIMIT expr +; +opt_offset: + | offset +; +offset: OFFSET expr +; +insert: INSERT INTO keyspace_ref opt_values_header values_list opt_returning + | INSERT INTO keyspace_ref LPAREN key_val_options_expr_header RPAREN fullselect opt_returning +; +simple_keyspace_ref: keyspace_name opt_as_alias + | keyspace_path opt_as_alias + | bucket_name DOT scope_name DOT keyspace_name opt_as_alias +; +keyspace_ref: simple_keyspace_ref + | param_expr opt_as_alias +; +opt_values_header: + | LPAREN opt_primary KEY COMMA VALUE RPAREN + | LPAREN opt_primary KEY COMMA VALUE COMMA OPTIONS RPAREN +; +key: opt_primary KEY +; +values_list: values + | values_list COMMA next_values +; +values: VALUES key_val_expr + | VALUES key_val_options_expr +; +next_values: values + | key_val_expr + | key_val_options_expr +; +key_val_expr: LPAREN expr COMMA expr RPAREN +; +key_val_options_expr: LPAREN expr COMMA expr COMMA expr RPAREN +; +opt_returning: + | returning +; +returning: RETURNING returns_ +; +returns_: projects + | raw expr +; +key_expr_header: key expr +; +value_expr_header: VALUE expr +; +options_expr_header: OPTIONS expr +; +key_val_options_expr_header: key_expr_header + | key_expr_header COMMA value_expr_header + | key_expr_header COMMA value_expr_header COMMA options_expr_header + | key_expr_header COMMA options_expr_header +; +upsert: UPSERT INTO keyspace_ref opt_values_header values_list opt_returning + | UPSERT INTO keyspace_ref LPAREN key_val_options_expr_header RPAREN fullselect opt_returning +; +delete_: DELETE_ FROM keyspace_ref opt_use_del_upd opt_where opt_limit opt_returning +; +update: UPDATE keyspace_ref opt_use_del_upd set unset opt_where opt_limit opt_returning + | UPDATE keyspace_ref opt_use_del_upd set opt_where opt_limit opt_returning + | UPDATE keyspace_ref opt_use_del_upd unset opt_where opt_limit opt_returning +; +set: SET set_terms +; +set_terms: set_term + | set_terms COMMA set_term +; +set_term: path EQ expr opt_update_for + | function_meta_expr DOT path EQ expr +; +function_meta_expr: function_name LPAREN opt_exprs RPAREN +; +opt_update_for: + | update_for +; +update_for: update_dimensions opt_when END +; +update_dimensions: FOR update_dimension + | update_dimensions FOR update_dimension +; +update_dimension: update_binding + | update_dimension COMMA update_binding +; +update_binding: variable IN expr + | variable WITHIN expr + | variable COLON variable IN expr + | variable COLON variable WITHIN expr +; +variable: IDENT +; +opt_when: + | WHEN expr +; +unset: UNSET unset_terms +; +unset_terms: unset_term + | unset_terms COMMA unset_term +; +unset_term: path opt_update_for +; +merge: MERGE INTO simple_keyspace_ref opt_use_merge USING simple_from_term ON opt_key expr merge_actions opt_limit opt_returning +; +opt_use_merge: opt_use +; +opt_key: + | key +; +merge_actions: + | WHEN MATCHED THEN UPDATE merge_update opt_merge_delete_insert + | WHEN MATCHED THEN DELETE_ merge_delete opt_merge_insert + | WHEN NOT MATCHED THEN INSERT merge_insert +; +opt_merge_delete_insert: + | WHEN MATCHED THEN DELETE_ merge_delete opt_merge_insert + | WHEN NOT MATCHED THEN INSERT merge_insert +; +opt_merge_insert: + | WHEN NOT MATCHED THEN INSERT merge_insert +; +merge_update: set opt_where + | set unset opt_where + | unset opt_where +; +merge_delete: opt_where +; +merge_insert: expr opt_where + | key_val_expr opt_where + | key_val_options_expr opt_where + | LPAREN key_val_options_expr_header RPAREN opt_where +; +grant_role: GRANT role_list TO user_list + | GRANT role_list ON keyspace_scope_list TO user_list +; +role_list: role_name + | role_list COMMA role_name +; +role_name: IDENT + | SELECT + | INSERT + | UPDATE + | DELETE_ +; +keyspace_scope_list: keyspace_scope + | keyspace_scope_list COMMA keyspace_scope +; +keyspace_scope: keyspace_name + | namespace_name keyspace_name + | namespace_name bucket_name DOT scope_name DOT keyspace_name + | bucket_name DOT scope_name DOT keyspace_name + | namespace_name bucket_name DOT scope_name + | bucket_name DOT scope_name +; +user_list: user + | user_list COMMA user +; +user: IDENT + | IDENT COLON IDENT +; +revoke_role: REVOKE role_list FROM user_list + | REVOKE role_list ON keyspace_scope_list FROM user_list +; +create_scope: CREATE SCOPE named_scope_ref if_not_exists? +; +drop_scope: DROP SCOPE named_scope_ref if_exists? +; +create_collection: CREATE COLLECTION named_keyspace_ref if_not_exists? +; +drop_collection: DROP COLLECTION named_keyspace_ref if_exists? +; +flush_collection: flush_or_truncate COLLECTION named_keyspace_ref +; +flush_or_truncate: FLUSH + | TRUNCATE +; +create_index: CREATE INDEX index_name ON named_keyspace_ref LPAREN index_terms RPAREN index_partition index_where opt_index_using opt_index_with if_not_exists? +; + +create_primary_index: CREATE PRIMARY INDEX opt_primary_name ON named_keyspace_ref index_partition opt_index_using opt_index_with if_not_exists? +; +opt_primary_name: + | index_name +; +index_name: IDENT +; +opt_index_name: + | index_name +; +named_keyspace_ref: simple_named_keyspace_ref + | namespace_name bucket_name + | bucket_name DOT scope_name DOT keyspace_name +; +simple_named_keyspace_ref: keyspace_name + | namespace_name bucket_name DOT scope_name DOT keyspace_name +; +named_scope_ref: namespace_name bucket_name DOT scope_name + | bucket_name DOT scope_name +; +index_partition: + | PARTITION BY HASH LPAREN exprs RPAREN +; +opt_index_using: + | index_using +; +index_using: USING VIEW + | USING GSI + | USING FTS +; +opt_index_with: + | index_with +; +index_with: WITH expr +; +index_terms: index_term + | index_terms COMMA index_term +; +index_term: index_term_expr opt_ikattr +; +index_term_expr: index_expr + | all index_expr + | all DISTINCT index_expr + | DISTINCT index_expr +; +index_expr: expr +; +all: ALL + | EACH +; +index_where: + | WHERE index_expr +; +opt_ikattr: + | ikattr + | ikattr ikattr +; +ikattr: ASC + | DESC + | MISSING +; +drop_index: DROP PRIMARY INDEX ON named_keyspace_ref opt_index_using + | DROP INDEX simple_named_keyspace_ref DOT index_name opt_index_using + | DROP INDEX index_name ON named_keyspace_ref opt_index_using +; +alter_index: ALTER INDEX simple_named_keyspace_ref DOT index_name opt_index_using index_with + | ALTER INDEX index_name ON named_keyspace_ref opt_index_using index_with +; +build_index: BUILD INDEX ON named_keyspace_ref LPAREN exprs RPAREN opt_index_using +; +create_function: CREATE opt_replace FUNCTION func_name LPAREN parm_list RPAREN func_body +; +opt_replace: + | OR REPLACE +; +func_name: short_func_name + | long_func_name +; +short_func_name: keyspace_name +; +long_func_name: namespace_term keyspace_name + | namespace_term bucket_name DOT scope_name DOT keyspace_name +; +parm_list: + | DOT DOT DOT + | parameter_terms +; +parameter_terms: IDENT + | parameter_terms COMMA IDENT +; +func_body: LBRACE expr RBRACE + | LANGUAGE INLINE AS expr + | LANGUAGE GOLANG AS STR AT STR + | LANGUAGE JAVASCRIPT AS STR AT STR +; +drop_function: DROP FUNCTION func_name +; +execute_function: EXECUTE FUNCTION func_name LPAREN opt_exprs RPAREN +; +update_statistics: UPDATE STATISTICS opt_for named_keyspace_ref LPAREN update_stat_terms RPAREN opt_infer_ustat_with + | UPDATE STATISTICS opt_for named_keyspace_ref DELETE_ LPAREN update_stat_terms RPAREN + | UPDATE STATISTICS opt_for named_keyspace_ref DELETE_ ALL + | UPDATE STATISTICS opt_for named_keyspace_ref INDEX LPAREN exprs RPAREN opt_index_using opt_infer_ustat_with + | UPDATE STATISTICS opt_for named_keyspace_ref INDEX ALL opt_index_using opt_infer_ustat_with + | UPDATE STATISTICS FOR INDEX simple_named_keyspace_ref DOT index_name opt_index_using opt_infer_ustat_with + | UPDATE STATISTICS FOR INDEX index_name ON named_keyspace_ref opt_index_using opt_infer_ustat_with + | ANALYZE opt_keyspace_collection named_keyspace_ref LPAREN update_stat_terms RPAREN opt_infer_ustat_with + | ANALYZE opt_keyspace_collection named_keyspace_ref DELETE_ STATISTICS LPAREN update_stat_terms RPAREN + | ANALYZE opt_keyspace_collection named_keyspace_ref DELETE_ STATISTICS + | ANALYZE opt_keyspace_collection named_keyspace_ref INDEX LPAREN exprs RPAREN opt_index_using opt_infer_ustat_with + | ANALYZE opt_keyspace_collection named_keyspace_ref INDEX ALL opt_index_using opt_infer_ustat_with + | ANALYZE INDEX simple_named_keyspace_ref DOT index_name opt_index_using opt_infer_ustat_with + | ANALYZE INDEX index_name ON named_keyspace_ref opt_index_using opt_infer_ustat_with +; +opt_for: + | FOR +; +update_stat_terms: update_stat_term + | update_stat_terms COMMA update_stat_term +; +update_stat_term: index_term_expr +; +path: IDENT + | path DOT IDENT + | path DOT IDENT_ICASE + | path DOT LBRACKET expr RBRACKET + | path DOT LBRACKET expr RBRACKET_ICASE + | path LBRACKET expr RBRACKET +; +expr: c_expr + | expr DOT IDENT + | expr DOT IDENT_ICASE + | expr DOT LBRACKET expr RBRACKET + | expr DOT LBRACKET expr RBRACKET_ICASE + | expr LBRACKET expr RBRACKET + | expr LBRACKET expr COLON RBRACKET + | expr LBRACKET expr COLON expr RBRACKET + | expr LBRACKET STAR RBRACKET + | expr PLUS expr + | expr MINUS expr + | expr STAR expr + | expr DIV expr + | expr MOD expr + | expr CONCAT expr + | expr AND expr + | expr OR expr + | NOT expr + | expr EQ expr + | expr DEQ expr + | expr NE expr + | expr LT expr + | expr GT expr + | expr LE expr + | expr GE expr + | expr BETWEEN b_expr AND b_expr + | expr NOT BETWEEN b_expr AND b_expr + | expr LIKE expr + | expr NOT LIKE expr + | expr IN expr + | expr NOT IN expr + | expr WITHIN expr + | expr NOT WITHIN expr + | expr IS NULL + | expr IS NOT NULL + | expr IS MISSING + | expr IS NOT MISSING + | expr IS valued + | expr IS NOT valued + | EXISTS expr +; +valued: VALUED + | KNOWN +; +c_expr: literal + | construction_expr + | IDENT + | IDENT_ICASE + | SELF + | param_expr + | function_expr + | MINUS + | case_expr + | collection_expr + | paren_expr + | COVER LPAREN expr RPAREN +; +b_expr: c_expr + | b_expr DOT IDENT + | b_expr DOT IDENT_ICASE + | b_expr DOT LBRACKET expr RBRACKET + | b_expr DOT LBRACKET expr RBRACKET_ICASE + | b_expr LBRACKET expr RBRACKET + | b_expr LBRACKET expr COLON RBRACKET + | b_expr LBRACKET expr COLON expr RBRACKET + | b_expr LBRACKET STAR RBRACKET + | b_expr PLUS b_expr + | b_expr MINUS b_expr + | b_expr STAR b_expr + | b_expr DIV b_expr + | b_expr MOD b_expr + | b_expr CONCAT b_expr +; +literal: NULL + | MISSING + | FALSE + | TRUE + | NUM + | INT + | STR +; +construction_expr: object + | array +; +object: LBRACE opt_members RBRACE +; +opt_members: + | members +; +members: member + | members COMMA member +; +member: expr COLON expr + | expr +; +array: LBRACKET opt_exprs RBRACKET +; +opt_exprs: + | exprs +; +exprs: expr + | exprs COMMA expr +; +param_expr: NAMED_PARAM + | POSITIONAL_PARAM + | NEXT_PARAM +; +case_expr: CASE simple_or_searched_case END +; +simple_or_searched_case: simple_case + | searched_case +; +simple_case: expr when_thens opt_else +; +when_thens: WHEN expr THEN expr + | when_thens WHEN expr THEN expr +; +searched_case: when_thens opt_else +; +opt_else: + | ELSE expr +; +function_expr: NTH_VALUE LPAREN exprs RPAREN opt_from_first_last opt_nulls_treatment window_function_details + | function_name LPAREN opt_exprs RPAREN opt_filter opt_nulls_treatment opt_window_function + | function_name LPAREN agg_quantifier expr RPAREN opt_filter opt_window_function + | function_name LPAREN STAR RPAREN opt_filter opt_window_function + | long_func_name LPAREN opt_exprs RPAREN +; +function_name: IDENT + | REPLACE +; +collection_expr: collection_cond + | collection_xform +; +collection_cond: ANY coll_bindings satisfies END + | SOME coll_bindings satisfies END + | EVERY coll_bindings satisfies END + | ANY AND EVERY coll_bindings satisfies END + | SOME AND EVERY coll_bindings satisfies END +; +coll_bindings: coll_binding + | coll_bindings COMMA coll_binding +; +coll_binding: variable IN expr + | variable WITHIN expr + | variable COLON variable IN expr + | variable COLON variable WITHIN expr +; +satisfies: SATISFIES expr +; +collection_xform: ARRAY expr FOR coll_bindings opt_when END + | FIRST expr FOR coll_bindings opt_when END + | OBJECT expr COLON expr FOR coll_bindings opt_when END +; +paren_expr: LPAREN expr RPAREN + | LPAREN all_expr RPAREN + | subquery_expr +; +subquery_expr: CORRELATED LPAREN fullselect RPAREN + | LPAREN fullselect RPAREN +; +expr_input: expr + | all_expr +; +all_expr: all expr + | all DISTINCT expr + | DISTINCT expr +; +opt_window_clause: + | WINDOW window_list +; +window_list: window_term + | window_list COMMA window_term +; +window_term: IDENT AS window_specification +; +window_specification: LPAREN opt_window_name opt_window_partition opt_order_by opt_window_frame RPAREN +; +opt_window_name: + | IDENT +; +opt_window_partition: + | PARTITION BY exprs +; +opt_window_frame: + | window_frame_modifier window_frame_extents opt_window_frame_exclusion +; +window_frame_modifier: ROWS + | RANGE + | GROUPS +; +opt_window_frame_exclusion: + | EXCLUDE NO OTHERS + | EXCLUDE CURRENT ROW + | EXCLUDE TIES + | EXCLUDE GROUP +; +window_frame_extents: window_frame_extent + | BETWEEN window_frame_extent AND window_frame_extent +; +window_frame_extent: UNBOUNDED PRECEDING + | UNBOUNDED FOLLOWING + | CURRENT ROW + | expr window_frame_valexpr_modifier +; +window_frame_valexpr_modifier: PRECEDING + | FOLLOWING +; +opt_nulls_treatment: + | nulls_treatment +; +nulls_treatment: RESPECT NULLS + | IGNORE NULLS +; +opt_from_first_last: + | FROM first_last +; +agg_quantifier: ALL + | DISTINCT +; +opt_filter: + | FILTER LPAREN where RPAREN +; +opt_window_function: + | window_function_details +; +window_function_details: OVER IDENT + | OVER window_specification +; +start_transaction: start_or_begin transaction opt_isolation_level +; +commit_transaction: COMMIT opt_transaction +; +rollback_transaction: ROLLBACK opt_transaction opt_savepoint +; +start_or_begin: START + | BEGIN +; +opt_transaction: + | transaction +; +transaction: TRAN + | TRANSACTION + | WORK +; +opt_savepoint: + | TO SAVEPOINT savepoint_name +; +savepoint_name: IDENT +; +opt_isolation_level: + | isolation_level +; +isolation_level: ISOLATION LEVEL isolation_val +; +isolation_val: READ COMMITTED +; +set_transaction_isolation: SET TRANSACTION isolation_level +; +savepoint: SAVEPOINT savepoint_name +; + +if_exists: IF EXISTS +; + +if_not_exists: IF NOT EXISTS +; + diff --git a/reverse_engineering/antlr/n1qlToCollectionVisitor.js b/reverse_engineering/antlr/n1qlToCollectionVisitor.js new file mode 100644 index 0000000..c220893 --- /dev/null +++ b/reverse_engineering/antlr/n1qlToCollectionVisitor.js @@ -0,0 +1,292 @@ +/* + * Copyright © 2016-2023 by IntegrIT S.A. dba Hackolade. All rights reserved. + * + * The copyright to the computer software herein is the property of IntegrIT S.A. + * The software may be used and/or copied only with the written permission of + * IntegrIT S.A. or in accordance with the terms and conditions stipulated in + * the agreement/contract under which the software has been supplied. + */ +const n1qlVisitor = require('./parser/n1qlVisitor'); + +class Visitor extends n1qlVisitor { + visitCreate_index(ctx) { + const indxName = this.visit(ctx.index_name()); + const indexKeys = this.visit(ctx.index_terms()); + const { bucketName, scopeName, collectionName } = this.visit(ctx.named_keyspace_ref()); + const usingGSI = this.visitIfExists(ctx, 'opt_index_using', false); + const partitionByHashExpr = this.visitIfExists(ctx, 'index_partition', ''); + const whereClause = this.visitIfExists(ctx, 'index_where', ''); + const withOptions = this.visitIfExists(ctx, 'opt_index_with', {}); + if (isMetaIndex(indexKeys)) { + return { + index: { + indxName, + indxType: 'Metadata', + }, + bucketName, + scopeName, + collectionName, + indexKeys: { + indexKeysPropertyKeyword: 'metadataExpr', + indexKeysIntervals: indexKeys, + }, + }; + } else if (isArrayIndex(indexKeys)) { + return { + index: { + indxName, + indxType: 'Array', + usingGSI, + whereClause, + withOptions, + }, + bucketName, + scopeName, + collectionName, + indexKeys: { + indexKeysPropertyKeyword: 'arrayExpr', + indexKeysIntervals: indexKeys, + }, + }; + } else { + return { + index: { + indxName, + indxType: 'Secondary', + usingGSI, + whereClause, + withOptions, + ...(partitionByHashExpr && { partitionByHash: 'Expression', partitionByHashExpr }), + }, + bucketName, + scopeName, + collectionName, + indexKeys: { + indexKeysPropertyKeyword: 'indxKey', + indexKeysIntervals: indexKeys, + }, + }; + } + } + visitCreate_primary_index(ctx) { + const indxName = this.visit(ctx.opt_primary_name()); + const usingGSI = this.visitIfExists(ctx, 'opt_index_using', false); + const { bucketName, scopeName, collectionName } = this.visit(ctx.named_keyspace_ref()); + const withOptions = this.visitIfExists(ctx, 'opt_index_with', {}); + return { + index: { + indxName, + indxType: 'Primary', + partitionByHash: '', + usingGSI, + withOptions, + }, + bucketName, + scopeName, + collectionName, + }; + } + + visitIndex_partition(ctx) { + return this.visitIfExists(ctx, 'exprs', []).join(', '); + } + + visitIndex_terms(ctx) { + const singleTerm = this.visit(ctx.index_term()); + const otherTerms = this.visitIfExists(ctx, 'index_terms', null); + if (otherTerms) { + return [...otherTerms, singleTerm]; + } + return [singleTerm]; + } + + visitIndex_term(ctx) { + const indexOrder = this.visit(ctx.opt_ikattr()); + const expr = this.visit(ctx.index_term_expr()); + + return { + name: expr, + type: indexOrder === 'DESC' ? 'descending' : 'ascending', + select: { + start: ctx.index_term_expr().start.start, + stop: ctx.index_term_expr().stop.stop + 1, + }, + }; + } + + visitIndex_term_expr(ctx) { + const distinct = getName(ctx.DISTINCT()); + const all = getName(ctx.all()); + return all + distinct + this.visitIfExists(ctx, 'index_expr', ''); + } + + visitOpt_ikattr(ctx) { + return this.visit(ctx.ikattr())[0]; + } + visitIkattr(ctx) { + return ctx.getText(); + } + + visitOpt_index_with(ctx) { + return this.visit(ctx.index_with()); + } + + visitIndex_with(ctx) { + const expression = this.visit(ctx.expr()); + const withOptions = JSON.parse(expression); + if (!withOptions.nodes) { + return withOptions; + } + const mappedNodes = withOptions.nodes.map(node => ({ nodeName: node })); + return { ...withOptions, nodes: mappedNodes }; + } + + visitIndex_where(ctx) { + return this.visit(ctx.index_expr()); + } + + visitIndex_expr(ctx) { + return getName(ctx); + } + + visitOpt_primary_name(ctx) { + return getName(ctx); + } + + visitIndex_name(ctx) { + return getName(ctx); + } + + visitNamed_keyspace_ref(ctx) { + const defaultBucketName = this.visitIfExists(ctx, 'simple_named_keyspace_ref', ''); + const bucketName = this.visitIfExists(ctx, 'bucket_name', ''); + const scopeName = this.visitIfExists(ctx, 'scope_name', ''); + const collectionName = this.visitIfExists(ctx, 'keyspace_name', ''); + + return { + bucketName: defaultBucketName || bucketName, + scopeName, + collectionName, + }; + } + + visitExpr(ctx) { + return getName(ctx); + } + + visitSimple_named_keyspace_ref(ctx) { + return getName(ctx); + } + + visitKeyspace_name(ctx) { + return getName(ctx); + } + + visitOpt_index_using(ctx) { + const usingStatement = ctx.getText(); + if (!usingStatement) { + return false; + } + return usingStatement.trim().toUpperCase() === 'USINGGSI'; + } + + visitStatements(ctx) { + return this.visit(ctx.input()); + } + + visitInput(ctx) { + return this.visit(ctx.stmt_body()); + } + + visitStmt_body(ctx) { + return this.visit(ctx.stmt()); + } + + visitStmt(ctx) { + return this.visitIfExists(ctx, 'ddl_stmt', []); + } + + visitDdl_stmt(ctx) { + const scopes = this.visitIfExists(ctx, 'scope_stmt', []); + const collections = this.visitIfExists(ctx, 'collection_stmt', []); + const indexes = this.visitIfExists(ctx, 'index_stmt', []); + + return { + scopes, + collections, + indexes, + }; + } + + visitIfExists(ctx, funcName, defaultValue) { + try { + return this.visit(ctx[funcName]()); + } catch (e) { + return defaultValue; + } + } + + visitCreate_scope(ctx) { + const { bucketName, scopeName } = this.visit(ctx.named_scope_ref()); + const ifNotExists = this.visitIfExists(ctx, 'if_not_exists', false); + + return { + bucketName, + scopeName, + ifNotExists, + }; + } + + visitCreate_collection(ctx) { + const { bucketName, scopeName, collectionName } = this.visit(ctx.named_keyspace_ref()); + const ifNotExists = this.visitIfExists(ctx, 'if_not_exists', false); + + return { + bucketName, + scopeName, + collectionName, + ifNotExists, + }; + } + + visitNamed_scope_ref(ctx) { + const bucketName = this.visit(ctx.bucket_name()); + const scopeName = this.visit(ctx.scope_name()); + + return { + bucketName, + scopeName, + }; + } + + visitBucket_name(ctx) { + return getName(ctx); + } + + visitScope_name(ctx) { + return getName(ctx); + } + + visitIf_not_exists(ctx) { + return true; + } +} + +const isMetaIndex = indexKeys => { + return indexKeys.map(key => key.name).some(key => /^\(?META\(\)/i.test(key)); +}; + +const isArrayIndex = indexKeys => { + return indexKeys.map(key => key.name).some(key => /^\(?(ALLARRAY|DISTINCTARRAY|DISTINCT|ARRAY)/i.test(key)); +}; + +const getName = context => { + if (!context) { + return ''; + } + return removeQuotes(context.getText()); +}; + +const removeQuotes = string => string.replace(/^(['`"])(.*)\1$/, '$2'); + +module.exports = Visitor; diff --git a/reverse_engineering/antlr/parser/n1ql.interp b/reverse_engineering/antlr/parser/n1ql.interp new file mode 100644 index 0000000..1118838 --- /dev/null +++ b/reverse_engineering/antlr/parser/n1ql.interp @@ -0,0 +1,752 @@ +token literal names: +null +null +null +null +null +null +null +'.' +'+' +null +'*' +'/' +'%' +'==' +'=' +null +'<' +'<=' +'>' +'>=' +'||' +'(' +')' +'{' +'}' +',' +':' +'[' +']' +']i' +';' +'!' +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +'?' + +token symbolic names: +null +STR +INT +NUM +BLOCK_COMMENT +LINE_COMMENT +WHITESPACE +DOT +PLUS +MINUS +STAR +DIV +MOD +DEQ +EQ +NE +LT +LE +GT +GE +CONCAT +LPAREN +RPAREN +LBRACE +RBRACE +COMMA +COLON +LBRACKET +RBRACKET +RBRACKET_ICASE +SEMI +NOT_A_TOKEN +ADVISE +ALL +ALTER +ANALYZE +AND +ANY +ARRAY +AS +ASC +AT +BEGIN +BETWEEN +BINARY +BOOLEAN +BREAK +BUCKET +BUILD +BY +CALL +CASE +CAST +CLUSTER +COLLATE +COLLECTION +COMMIT +COMMITTED +CONNECT +CONTINUE +CORRELATED +COVER +CREATE +CURRENT +DATABASE +DATASET +DATASTORE +DECLARE +DECREMENT +DELETE_ +DERIVED +DESC +DESCRIBE +DISTINCT +DO +DROP +EACH +ELEMENT +ELSE +END +EVERY +EXCEPT +EXCLUDE +EXECUTE +EXISTS +EXPLAIN +FALSE +FETCH +FILTER +FIRST +FLATTEN +FLUSH +FOLLOWING +FOR +FORCE +FROM +FTS +FUNCTION +GOLANG +GRANT +GROUP +GROUPS +GSI +HASH +HAVING +IF +IGNORE +ILIKE +IN +INCLUDE +INCREMENT +INDEX +INFER +INLINE +INNER +INSERT +INTERSECT +INTO +IS +ISOLATION +JAVASCRIPT +JOIN +KEY +KEYS +KEYSPACE +KNOWN +LANGUAGE +LAST +LEFT +LET_ +LETTING +LEVEL +LIKE +LIMIT +LSM +MAP +MAPPING +MATCHED +MATERIALIZED +MERGE +MISSING +NAMESPACE +NEST +NL +NO +NOT +NTH_VALUE +NULL +NULLS +NUMBER +OBJECT +OFFSET +ON +OPTION +OPTIONS +OR +ORDER +OTHERS +OUTER +OVER +PARSE +PARTITION +PASSWORD +PATH +POOL +PRECEDING +PREPARE +PRIMARY +PRIVATE +PRIVILEGE +PROCEDURE +PROBE +PUBLIC +RANGE +RAW +READ +REALM +REDUCE +RENAME +REPLACE +RESPECT +RETURN +RETURNING +REVOKE +RIGHT +ROLE +ROLLBACK +ROW +ROWS +SATISFIES +SAVEPOINT +SCHEMA +SCOPE +SELECT +SELF +SET +SHOW +SOME +START +STATISTICS +STRING +SYSTEM +THEN +TIES +TO +TRAN +TRANSACTION +TRIGGER +TRUE +TRUNCATE +UNBOUNDED +UNDER +UNION +UNIQUE +UNKNOWN +UNNEST +UNSET +UPDATE +UPSERT +USE +USER +USING +VALIDATE +VALUE +VALUED +VALUES +VIA +VIEW +WHEN +WHERE +WHILE +WINDOW +WITH +WITHIN +WORK +XOR +IDENT_ICASE +IDENT +NAMED_PARAM +POSITIONAL_PARAM +NEXT_PARAM + +rule names: +statements +input +opt_trailer +stmt_body +stmt +advise +opt_index +explain +prepare +opt_force +opt_name +from_or_as +execute +execute_using +infer +opt_keyspace_collection +opt_infer_using +opt_infer_ustat_with +infer_ustat_with +select_stmt +dml_stmt +ddl_stmt +role_stmt +index_stmt +scope_stmt +collection_stmt +function_stmt +transaction_stmt +fullselect +select_terms +select_term +subselect +from_select +select_from +select_clause +projection +opt_quantifier +raw +projects +project +opt_as_alias +as_alias +alias +opt_from +from +from_term +simple_from_term +unnest +keyspace_term +keyspace_path +namespace_term +namespace_name +bucket_name +scope_name +keyspace_name +opt_use +use_options +use_keys +use_index +join_hint +opt_primary +index_refs +index_ref +use_hash_option +opt_use_del_upd +opt_join_type +opt_outer +on_keys +on_key +opt_let +let_ +bindings +binding +opt_with +with_list +with_term +opt_where +where +opt_group +group +group_terms +group_term +opt_letting +letting +opt_having +having +opt_order_by +order_by +sort_terms +sort_term +opt_dir +dir +opt_order_nulls +first_last +nulls +opt_limit +limit +opt_offset +offset +insert +simple_keyspace_ref +keyspace_ref +opt_values_header +key +values_list +values +next_values +key_val_expr +key_val_options_expr +opt_returning +returning +returns_ +key_expr_header +value_expr_header +options_expr_header +key_val_options_expr_header +upsert +delete_ +update +set +set_terms +set_term +function_meta_expr +opt_update_for +update_for +update_dimensions +update_dimension +update_binding +variable +opt_when +unset +unset_terms +unset_term +merge +opt_use_merge +opt_key +merge_actions +opt_merge_delete_insert +opt_merge_insert +merge_update +merge_delete +merge_insert +grant_role +role_list +role_name +keyspace_scope_list +keyspace_scope +user_list +user +revoke_role +create_scope +drop_scope +create_collection +drop_collection +flush_collection +flush_or_truncate +create_index +create_primary_index +opt_primary_name +index_name +opt_index_name +named_keyspace_ref +simple_named_keyspace_ref +named_scope_ref +index_partition +opt_index_using +index_using +opt_index_with +index_with +index_terms +index_term +index_term_expr +index_expr +all +index_where +opt_ikattr +ikattr +drop_index +alter_index +build_index +create_function +opt_replace +func_name +short_func_name +long_func_name +parm_list +parameter_terms +func_body +drop_function +execute_function +update_statistics +opt_for +update_stat_terms +update_stat_term +path +expr +valued +c_expr +b_expr +literal +construction_expr +object +opt_members +members +member +array +opt_exprs +exprs +param_expr +case_expr +simple_or_searched_case +simple_case +when_thens +searched_case +opt_else +function_expr +function_name +collection_expr +collection_cond +coll_bindings +coll_binding +satisfies +collection_xform +paren_expr +subquery_expr +expr_input +all_expr +opt_window_clause +window_list +window_term +window_specification +opt_window_name +opt_window_partition +opt_window_frame +window_frame_modifier +opt_window_frame_exclusion +window_frame_extents +window_frame_extent +window_frame_valexpr_modifier +opt_nulls_treatment +nulls_treatment +opt_from_first_last +agg_quantifier +opt_filter +opt_window_function +window_function_details +start_transaction +commit_transaction +rollback_transaction +start_or_begin +opt_transaction +transaction +opt_savepoint +savepoint_name +opt_isolation_level +isolation_level +isolation_val +set_transaction_isolation +savepoint +if_exists +if_not_exists + + +atn: +[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 242, 2789, 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, 3, 2, 3, 2, 7, 2, 527, 10, 2, 12, 2, 14, 2, 530, 11, 2, 3, 3, 3, 3, 3, 3, 3, 3, 5, 3, 536, 10, 3, 3, 4, 3, 4, 3, 4, 7, 4, 541, 10, 4, 12, 4, 14, 4, 544, 11, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 5, 5, 551, 10, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 5, 6, 561, 10, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 5, 8, 569, 10, 8, 3, 9, 3, 9, 3, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 10, 3, 11, 3, 11, 5, 11, 581, 10, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 588, 10, 12, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 5, 15, 599, 10, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 5, 17, 610, 10, 17, 3, 18, 3, 18, 3, 19, 3, 19, 5, 19, 616, 10, 19, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 5, 22, 628, 10, 22, 3, 23, 3, 23, 3, 23, 5, 23, 633, 10, 23, 3, 24, 3, 24, 5, 24, 637, 10, 24, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 5, 25, 644, 10, 25, 3, 26, 3, 26, 5, 26, 648, 10, 26, 3, 27, 3, 27, 3, 27, 5, 27, 653, 10, 27, 3, 28, 3, 28, 3, 28, 5, 28, 658, 10, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 5, 29, 665, 10, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 3, 30, 5, 30, 680, 10, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 5, 31, 711, 10, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 7, 31, 734, 10, 31, 12, 31, 14, 31, 737, 11, 31, 3, 32, 3, 32, 5, 32, 741, 10, 32, 3, 33, 3, 33, 5, 33, 745, 10, 33, 3, 34, 3, 34, 3, 34, 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, 35, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 5, 37, 774, 10, 37, 3, 38, 3, 38, 3, 38, 5, 38, 779, 10, 38, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 7, 40, 789, 10, 40, 12, 40, 14, 40, 792, 11, 40, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 5, 41, 802, 10, 41, 3, 42, 3, 42, 5, 42, 806, 10, 42, 3, 43, 3, 43, 3, 43, 5, 43, 811, 10, 43, 3, 44, 3, 44, 3, 45, 3, 45, 5, 45, 817, 10, 45, 3, 46, 3, 46, 3, 46, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 5, 47, 832, 10, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 7, 47, 882, 10, 47, 12, 47, 14, 47, 885, 11, 47, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 5, 48, 892, 10, 48, 3, 49, 3, 49, 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, 5, 51, 910, 10, 51, 3, 52, 3, 52, 3, 52, 5, 52, 915, 10, 52, 3, 53, 3, 53, 3, 53, 3, 54, 3, 54, 3, 55, 3, 55, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 5, 57, 929, 10, 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, 58, 3, 58, 5, 58, 946, 10, 58, 3, 59, 3, 59, 3, 59, 3, 59, 3, 60, 3, 60, 3, 60, 3, 60, 3, 60, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 3, 61, 5, 61, 963, 10, 61, 3, 62, 3, 62, 5, 62, 967, 10, 62, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 7, 63, 975, 10, 63, 12, 63, 14, 63, 978, 11, 63, 3, 64, 3, 64, 3, 64, 3, 65, 3, 65, 3, 66, 3, 66, 3, 67, 3, 67, 3, 67, 3, 67, 5, 67, 991, 10, 67, 3, 68, 3, 68, 5, 68, 995, 10, 68, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 71, 3, 71, 5, 71, 1009, 10, 71, 3, 72, 3, 72, 3, 72, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 7, 73, 1020, 10, 73, 12, 73, 14, 73, 1023, 11, 73, 3, 74, 3, 74, 3, 74, 3, 74, 3, 75, 3, 75, 3, 75, 5, 75, 1032, 10, 75, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 3, 76, 7, 76, 1040, 10, 76, 12, 76, 14, 76, 1043, 11, 76, 3, 77, 3, 77, 3, 77, 3, 77, 3, 78, 3, 78, 5, 78, 1051, 10, 78, 3, 79, 3, 79, 3, 79, 3, 80, 3, 80, 5, 80, 1058, 10, 80, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 3, 81, 5, 81, 1067, 10, 81, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 7, 82, 1075, 10, 82, 12, 82, 14, 82, 1078, 11, 82, 3, 83, 3, 83, 3, 83, 3, 84, 3, 84, 5, 84, 1085, 10, 84, 3, 85, 3, 85, 3, 85, 3, 86, 3, 86, 5, 86, 1092, 10, 86, 3, 87, 3, 87, 3, 87, 3, 88, 3, 88, 5, 88, 1099, 10, 88, 3, 89, 3, 89, 3, 89, 3, 89, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 3, 90, 7, 90, 1111, 10, 90, 12, 90, 14, 90, 1114, 11, 90, 3, 91, 3, 91, 3, 91, 3, 91, 3, 92, 3, 92, 5, 92, 1122, 10, 92, 3, 93, 3, 93, 3, 94, 3, 94, 3, 94, 3, 94, 5, 94, 1130, 10, 94, 3, 95, 3, 95, 3, 96, 3, 96, 3, 97, 3, 97, 5, 97, 1138, 10, 97, 3, 98, 3, 98, 3, 98, 3, 99, 3, 99, 5, 99, 1145, 10, 99, 3, 100, 3, 100, 3, 100, 3, 101, 3, 101, 3, 101, 3, 101, 3, 101, 3, 101, 3, 101, 3, 101, 3, 101, 3, 101, 3, 101, 3, 101, 3, 101, 3, 101, 3, 101, 3, 101, 5, 101, 1166, 10, 101, 3, 102, 3, 102, 3, 102, 3, 102, 3, 102, 3, 102, 3, 102, 3, 102, 3, 102, 3, 102, 3, 102, 3, 102, 3, 102, 5, 102, 1181, 10, 102, 3, 103, 3, 103, 3, 103, 3, 103, 5, 103, 1187, 10, 103, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 3, 104, 5, 104, 1206, 10, 104, 3, 105, 3, 105, 3, 105, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 3, 106, 7, 106, 1217, 10, 106, 12, 106, 14, 106, 1220, 11, 106, 3, 107, 3, 107, 3, 107, 3, 107, 5, 107, 1226, 10, 107, 3, 108, 3, 108, 3, 108, 5, 108, 1231, 10, 108, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 109, 3, 110, 3, 110, 3, 110, 3, 110, 3, 110, 3, 110, 3, 110, 3, 110, 3, 111, 3, 111, 5, 111, 1249, 10, 111, 3, 112, 3, 112, 3, 112, 3, 113, 3, 113, 3, 113, 3, 113, 5, 113, 1258, 10, 113, 3, 114, 3, 114, 3, 114, 3, 115, 3, 115, 3, 115, 3, 116, 3, 116, 3, 116, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 3, 117, 5, 117, 1284, 10, 117, 3, 118, 3, 118, 3, 118, 3, 118, 3, 118, 3, 118, 3, 118, 3, 118, 3, 118, 3, 118, 3, 118, 3, 118, 3, 118, 3, 118, 3, 118, 3, 118, 5, 118, 1302, 10, 118, 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, 120, 3, 120, 3, 120, 3, 120, 3, 120, 3, 120, 3, 120, 3, 120, 3, 120, 3, 120, 3, 120, 3, 120, 3, 120, 3, 120, 3, 120, 3, 120, 3, 120, 3, 120, 5, 120, 1337, 10, 120, 3, 121, 3, 121, 3, 121, 3, 122, 3, 122, 3, 122, 3, 122, 3, 122, 3, 122, 7, 122, 1348, 10, 122, 12, 122, 14, 122, 1351, 11, 122, 3, 123, 3, 123, 3, 123, 3, 123, 3, 123, 3, 123, 3, 123, 3, 123, 3, 123, 3, 123, 3, 123, 5, 123, 1364, 10, 123, 3, 124, 3, 124, 3, 124, 3, 124, 3, 124, 3, 125, 3, 125, 5, 125, 1373, 10, 125, 3, 126, 3, 126, 3, 126, 3, 126, 3, 127, 3, 127, 3, 127, 3, 127, 3, 127, 3, 127, 3, 127, 7, 127, 1386, 10, 127, 12, 127, 14, 127, 1389, 11, 127, 3, 128, 3, 128, 3, 128, 3, 128, 3, 128, 3, 128, 7, 128, 1397, 10, 128, 12, 128, 14, 128, 1400, 11, 128, 3, 129, 3, 129, 3, 129, 3, 129, 3, 129, 3, 129, 3, 129, 3, 129, 3, 129, 3, 129, 3, 129, 3, 129, 3, 129, 3, 129, 3, 129, 3, 129, 3, 129, 3, 129, 3, 129, 3, 129, 5, 129, 1422, 10, 129, 3, 130, 3, 130, 3, 131, 3, 131, 3, 131, 5, 131, 1429, 10, 131, 3, 132, 3, 132, 3, 132, 3, 133, 3, 133, 3, 133, 3, 133, 3, 133, 3, 133, 7, 133, 1440, 10, 133, 12, 133, 14, 133, 1443, 11, 133, 3, 134, 3, 134, 3, 134, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 135, 3, 136, 3, 136, 3, 137, 3, 137, 5, 137, 1465, 10, 137, 3, 138, 3, 138, 3, 138, 3, 138, 3, 138, 3, 138, 3, 138, 3, 138, 3, 138, 3, 138, 3, 138, 3, 138, 3, 138, 3, 138, 3, 138, 3, 138, 3, 138, 3, 138, 3, 138, 3, 138, 3, 138, 5, 138, 1488, 10, 138, 3, 139, 3, 139, 3, 139, 3, 139, 3, 139, 3, 139, 3, 139, 3, 139, 3, 139, 3, 139, 3, 139, 3, 139, 3, 139, 3, 139, 5, 139, 1504, 10, 139, 3, 140, 3, 140, 3, 140, 3, 140, 3, 140, 3, 140, 3, 140, 5, 140, 1513, 10, 140, 3, 141, 3, 141, 3, 141, 3, 141, 3, 141, 3, 141, 3, 141, 3, 141, 3, 141, 3, 141, 5, 141, 1525, 10, 141, 3, 142, 3, 142, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 3, 143, 5, 143, 1543, 10, 143, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 3, 144, 5, 144, 1557, 10, 144, 3, 145, 3, 145, 3, 145, 3, 145, 3, 145, 3, 145, 7, 145, 1565, 10, 145, 12, 145, 14, 145, 1568, 11, 145, 3, 146, 3, 146, 3, 147, 3, 147, 3, 147, 3, 147, 3, 147, 3, 147, 7, 147, 1578, 10, 147, 12, 147, 14, 147, 1581, 11, 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, 148, 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, 148, 5, 148, 1609, 10, 148, 3, 149, 3, 149, 3, 149, 3, 149, 3, 149, 3, 149, 7, 149, 1617, 10, 149, 12, 149, 14, 149, 1620, 11, 149, 3, 150, 3, 150, 3, 150, 3, 150, 5, 150, 1626, 10, 150, 3, 151, 3, 151, 3, 151, 3, 151, 3, 151, 3, 151, 3, 151, 3, 151, 3, 151, 3, 151, 3, 151, 3, 151, 5, 151, 1640, 10, 151, 3, 152, 3, 152, 3, 152, 3, 152, 5, 152, 1646, 10, 152, 3, 153, 3, 153, 3, 153, 3, 153, 5, 153, 1652, 10, 153, 3, 154, 3, 154, 3, 154, 3, 154, 5, 154, 1658, 10, 154, 3, 155, 3, 155, 3, 155, 3, 155, 5, 155, 1664, 10, 155, 3, 156, 3, 156, 3, 156, 3, 156, 3, 157, 3, 157, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 5, 158, 1685, 10, 158, 3, 159, 3, 159, 3, 159, 3, 159, 3, 159, 3, 159, 3, 159, 3, 159, 3, 159, 3, 159, 5, 159, 1697, 10, 159, 3, 160, 3, 160, 5, 160, 1701, 10, 160, 3, 161, 3, 161, 3, 162, 3, 162, 5, 162, 1707, 10, 162, 3, 163, 3, 163, 3, 163, 3, 163, 3, 163, 3, 163, 3, 163, 3, 163, 3, 163, 3, 163, 5, 163, 1719, 10, 163, 3, 164, 3, 164, 3, 164, 3, 164, 3, 164, 3, 164, 3, 164, 3, 164, 5, 164, 1729, 10, 164, 3, 165, 3, 165, 3, 165, 3, 165, 3, 165, 3, 165, 3, 165, 3, 165, 3, 165, 5, 165, 1740, 10, 165, 3, 166, 3, 166, 3, 166, 3, 166, 3, 166, 3, 166, 3, 166, 3, 166, 5, 166, 1750, 10, 166, 3, 167, 3, 167, 5, 167, 1754, 10, 167, 3, 168, 3, 168, 3, 168, 3, 168, 3, 168, 3, 168, 5, 168, 1762, 10, 168, 3, 169, 3, 169, 5, 169, 1766, 10, 169, 3, 170, 3, 170, 3, 170, 3, 171, 3, 171, 3, 171, 3, 171, 3, 171, 3, 171, 7, 171, 1777, 10, 171, 12, 171, 14, 171, 1780, 11, 171, 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, 173, 5, 173, 1795, 10, 173, 3, 174, 3, 174, 3, 175, 3, 175, 3, 176, 3, 176, 3, 176, 5, 176, 1804, 10, 176, 3, 177, 3, 177, 3, 177, 3, 177, 3, 177, 5, 177, 1811, 10, 177, 3, 178, 3, 178, 3, 179, 3, 179, 3, 179, 3, 179, 3, 179, 3, 179, 3, 179, 3, 179, 3, 179, 3, 179, 3, 179, 3, 179, 3, 179, 3, 179, 3, 179, 3, 179, 3, 179, 3, 179, 3, 179, 3, 179, 3, 179, 5, 179, 1836, 10, 179, 3, 180, 3, 180, 3, 180, 3, 180, 3, 180, 3, 180, 3, 180, 3, 180, 3, 180, 3, 180, 3, 180, 3, 180, 3, 180, 3, 180, 3, 180, 3, 180, 5, 180, 1854, 10, 180, 3, 181, 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, 5, 183, 1877, 10, 183, 3, 184, 3, 184, 5, 184, 1881, 10, 184, 3, 185, 3, 185, 3, 186, 3, 186, 3, 186, 3, 186, 3, 186, 3, 186, 3, 186, 3, 186, 3, 186, 3, 186, 5, 186, 1895, 10, 186, 3, 187, 3, 187, 3, 187, 3, 187, 3, 187, 5, 187, 1902, 10, 187, 3, 188, 3, 188, 3, 188, 3, 188, 3, 188, 3, 188, 7, 188, 1910, 10, 188, 12, 188, 14, 188, 1913, 11, 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, 189, 3, 189, 3, 189, 3, 189, 3, 189, 3, 189, 3, 189, 5, 189, 1935, 10, 189, 3, 190, 3, 190, 3, 190, 3, 190, 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, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 3, 192, 5, 192, 2070, 10, 192, 3, 193, 3, 193, 5, 193, 2074, 10, 193, 3, 194, 3, 194, 3, 194, 3, 194, 3, 194, 3, 194, 7, 194, 2082, 10, 194, 12, 194, 14, 194, 2085, 11, 194, 3, 195, 3, 195, 3, 196, 3, 196, 3, 196, 3, 196, 3, 196, 3, 196, 3, 196, 3, 196, 3, 196, 3, 196, 3, 196, 3, 196, 3, 196, 3, 196, 3, 196, 3, 196, 3, 196, 3, 196, 3, 196, 3, 196, 3, 196, 3, 196, 3, 196, 3, 196, 3, 196, 3, 196, 7, 196, 2115, 10, 196, 12, 196, 14, 196, 2118, 11, 196, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 5, 197, 2126, 10, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 3, 197, 7, 197, 2268, 10, 197, 12, 197, 14, 197, 2271, 11, 197, 3, 198, 3, 198, 3, 199, 3, 199, 3, 199, 3, 199, 3, 199, 3, 199, 3, 199, 3, 199, 3, 199, 3, 199, 3, 199, 3, 199, 3, 199, 3, 199, 3, 199, 3, 199, 5, 199, 2291, 10, 199, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 3, 200, 7, 200, 2354, 10, 200, 12, 200, 14, 200, 2357, 11, 200, 3, 201, 3, 201, 3, 202, 3, 202, 5, 202, 2363, 10, 202, 3, 203, 3, 203, 3, 203, 3, 203, 3, 204, 3, 204, 5, 204, 2371, 10, 204, 3, 205, 3, 205, 3, 205, 3, 205, 3, 205, 3, 205, 7, 205, 2379, 10, 205, 12, 205, 14, 205, 2382, 11, 205, 3, 206, 3, 206, 3, 206, 3, 206, 3, 206, 5, 206, 2389, 10, 206, 3, 207, 3, 207, 3, 207, 3, 207, 3, 208, 3, 208, 5, 208, 2397, 10, 208, 3, 209, 3, 209, 3, 209, 3, 209, 3, 209, 3, 209, 7, 209, 2405, 10, 209, 12, 209, 14, 209, 2408, 11, 209, 3, 210, 3, 210, 3, 211, 3, 211, 3, 211, 3, 211, 3, 212, 3, 212, 5, 212, 2418, 10, 212, 3, 213, 3, 213, 3, 213, 3, 213, 3, 214, 3, 214, 3, 214, 3, 214, 3, 214, 3, 214, 3, 214, 3, 214, 3, 214, 3, 214, 3, 214, 3, 214, 7, 214, 2436, 10, 214, 12, 214, 14, 214, 2439, 11, 214, 3, 215, 3, 215, 3, 215, 3, 216, 3, 216, 3, 216, 5, 216, 2447, 10, 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, 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, 217, 3, 217, 3, 217, 3, 217, 5, 217, 2485, 10, 217, 3, 218, 3, 218, 3, 219, 3, 219, 5, 219, 2491, 10, 219, 3, 220, 3, 220, 3, 220, 3, 220, 3, 220, 3, 220, 3, 220, 3, 220, 3, 220, 3, 220, 3, 220, 3, 220, 3, 220, 3, 220, 3, 220, 3, 220, 3, 220, 3, 220, 3, 220, 3, 220, 3, 220, 3, 220, 3, 220, 3, 220, 3, 220, 3, 220, 3, 220, 3, 220, 3, 220, 5, 220, 2522, 10, 220, 3, 221, 3, 221, 3, 221, 3, 221, 3, 221, 3, 221, 7, 221, 2530, 10, 221, 12, 221, 14, 221, 2533, 11, 221, 3, 222, 3, 222, 3, 222, 3, 222, 3, 222, 3, 222, 3, 222, 3, 222, 3, 222, 3, 222, 3, 222, 3, 222, 3, 222, 3, 222, 3, 222, 3, 222, 3, 222, 3, 222, 3, 222, 3, 222, 5, 222, 2555, 10, 222, 3, 223, 3, 223, 3, 223, 3, 224, 3, 224, 3, 224, 3, 224, 3, 224, 3, 224, 3, 224, 3, 224, 3, 224, 3, 224, 3, 224, 3, 224, 3, 224, 3, 224, 3, 224, 3, 224, 3, 224, 3, 224, 3, 224, 3, 224, 3, 224, 3, 224, 3, 224, 5, 224, 2583, 10, 224, 3, 225, 3, 225, 3, 225, 3, 225, 3, 225, 3, 225, 3, 225, 3, 225, 3, 225, 5, 225, 2594, 10, 225, 3, 226, 3, 226, 3, 226, 3, 226, 3, 226, 3, 226, 3, 226, 3, 226, 3, 226, 5, 226, 2605, 10, 226, 3, 227, 3, 227, 5, 227, 2609, 10, 227, 3, 228, 3, 228, 3, 228, 3, 228, 3, 228, 3, 228, 3, 228, 3, 228, 3, 228, 5, 228, 2620, 10, 228, 3, 229, 3, 229, 3, 229, 5, 229, 2625, 10, 229, 3, 230, 3, 230, 3, 230, 3, 230, 3, 230, 3, 230, 7, 230, 2633, 10, 230, 12, 230, 14, 230, 2636, 11, 230, 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, 5, 233, 2651, 10, 233, 3, 234, 3, 234, 3, 234, 3, 234, 5, 234, 2657, 10, 234, 3, 235, 3, 235, 3, 235, 3, 235, 3, 235, 5, 235, 2664, 10, 235, 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, 5, 237, 2679, 10, 237, 3, 238, 3, 238, 3, 238, 3, 238, 3, 238, 3, 238, 5, 238, 2687, 10, 238, 3, 239, 3, 239, 3, 239, 3, 239, 3, 239, 3, 239, 3, 239, 3, 239, 3, 239, 5, 239, 2698, 10, 239, 3, 240, 3, 240, 3, 241, 3, 241, 5, 241, 2704, 10, 241, 3, 242, 3, 242, 3, 242, 3, 242, 5, 242, 2710, 10, 242, 3, 243, 3, 243, 3, 243, 5, 243, 2715, 10, 243, 3, 244, 3, 244, 3, 245, 3, 245, 3, 245, 3, 245, 3, 245, 3, 245, 5, 245, 2725, 10, 245, 3, 246, 3, 246, 5, 246, 2729, 10, 246, 3, 247, 3, 247, 3, 247, 3, 247, 5, 247, 2735, 10, 247, 3, 248, 3, 248, 3, 248, 3, 248, 3, 249, 3, 249, 3, 249, 3, 250, 3, 250, 3, 250, 3, 250, 3, 251, 3, 251, 3, 252, 3, 252, 5, 252, 2752, 10, 252, 3, 253, 3, 253, 3, 254, 3, 254, 3, 254, 3, 254, 5, 254, 2760, 10, 254, 3, 255, 3, 255, 3, 256, 3, 256, 5, 256, 2766, 10, 256, 3, 257, 3, 257, 3, 257, 3, 257, 3, 258, 3, 258, 3, 258, 3, 259, 3, 259, 3, 259, 3, 259, 3, 260, 3, 260, 3, 260, 3, 261, 3, 261, 3, 261, 3, 262, 3, 262, 3, 262, 3, 262, 3, 262, 2, 30, 6, 60, 78, 92, 124, 144, 150, 162, 178, 210, 242, 252, 254, 264, 288, 292, 296, 340, 374, 386, 390, 392, 398, 408, 416, 426, 440, 458, 263, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 174, 176, 178, 180, 182, 184, 186, 188, 190, 192, 194, 196, 198, 200, 202, 204, 206, 208, 210, 212, 214, 216, 218, 220, 222, 224, 226, 228, 230, 232, 234, 236, 238, 240, 242, 244, 246, 248, 250, 252, 254, 256, 258, 260, 262, 264, 266, 268, 270, 272, 274, 276, 278, 280, 282, 284, 286, 288, 290, 292, 294, 296, 298, 300, 302, 304, 306, 308, 310, 312, 314, 316, 318, 320, 322, 324, 326, 328, 330, 332, 334, 336, 338, 340, 342, 344, 346, 348, 350, 352, 354, 356, 358, 360, 362, 364, 366, 368, 370, 372, 374, 376, 378, 380, 382, 384, 386, 388, 390, 392, 394, 396, 398, 400, 402, 404, 406, 408, 410, 412, 414, 416, 418, 420, 422, 424, 426, 428, 430, 432, 434, 436, 438, 440, 442, 444, 446, 448, 450, 452, 454, 456, 458, 460, 462, 464, 466, 468, 470, 472, 474, 476, 478, 480, 482, 484, 486, 488, 490, 492, 494, 496, 498, 500, 502, 504, 506, 508, 510, 512, 514, 516, 518, 520, 522, 2, 21, 4, 2, 41, 41, 97, 97, 5, 2, 79, 79, 176, 176, 225, 225, 4, 2, 92, 92, 217, 217, 4, 2, 50, 50, 173, 173, 4, 2, 42, 42, 73, 73, 4, 2, 91, 91, 129, 129, 7, 2, 71, 71, 117, 117, 195, 195, 219, 219, 239, 239, 4, 2, 93, 93, 211, 211, 4, 2, 35, 35, 78, 78, 5, 2, 42, 42, 73, 73, 142, 142, 4, 2, 127, 127, 226, 226, 7, 2, 3, 5, 88, 88, 142, 142, 149, 149, 210, 210, 3, 2, 240, 242, 4, 2, 181, 181, 239, 239, 5, 2, 103, 103, 175, 175, 190, 190, 4, 2, 94, 94, 167, 167, 4, 2, 35, 35, 75, 75, 4, 2, 44, 44, 200, 200, 4, 2, 207, 208, 236, 236, 2, 2857, 2, 524, 3, 2, 2, 2, 4, 535, 3, 2, 2, 2, 6, 537, 3, 2, 2, 2, 8, 550, 3, 2, 2, 2, 10, 560, 3, 2, 2, 2, 12, 562, 3, 2, 2, 2, 14, 568, 3, 2, 2, 2, 16, 570, 3, 2, 2, 2, 18, 573, 3, 2, 2, 2, 20, 580, 3, 2, 2, 2, 22, 587, 3, 2, 2, 2, 24, 589, 3, 2, 2, 2, 26, 591, 3, 2, 2, 2, 28, 598, 3, 2, 2, 2, 30, 600, 3, 2, 2, 2, 32, 609, 3, 2, 2, 2, 34, 611, 3, 2, 2, 2, 36, 615, 3, 2, 2, 2, 38, 617, 3, 2, 2, 2, 40, 620, 3, 2, 2, 2, 42, 627, 3, 2, 2, 2, 44, 632, 3, 2, 2, 2, 46, 636, 3, 2, 2, 2, 48, 643, 3, 2, 2, 2, 50, 647, 3, 2, 2, 2, 52, 652, 3, 2, 2, 2, 54, 657, 3, 2, 2, 2, 56, 664, 3, 2, 2, 2, 58, 679, 3, 2, 2, 2, 60, 710, 3, 2, 2, 2, 62, 740, 3, 2, 2, 2, 64, 744, 3, 2, 2, 2, 66, 746, 3, 2, 2, 2, 68, 754, 3, 2, 2, 2, 70, 762, 3, 2, 2, 2, 72, 773, 3, 2, 2, 2, 74, 778, 3, 2, 2, 2, 76, 780, 3, 2, 2, 2, 78, 782, 3, 2, 2, 2, 80, 801, 3, 2, 2, 2, 82, 805, 3, 2, 2, 2, 84, 810, 3, 2, 2, 2, 86, 812, 3, 2, 2, 2, 88, 816, 3, 2, 2, 2, 90, 818, 3, 2, 2, 2, 92, 831, 3, 2, 2, 2, 94, 891, 3, 2, 2, 2, 96, 893, 3, 2, 2, 2, 98, 895, 3, 2, 2, 2, 100, 909, 3, 2, 2, 2, 102, 914, 3, 2, 2, 2, 104, 916, 3, 2, 2, 2, 106, 919, 3, 2, 2, 2, 108, 921, 3, 2, 2, 2, 110, 923, 3, 2, 2, 2, 112, 928, 3, 2, 2, 2, 114, 945, 3, 2, 2, 2, 116, 947, 3, 2, 2, 2, 118, 951, 3, 2, 2, 2, 120, 962, 3, 2, 2, 2, 122, 966, 3, 2, 2, 2, 124, 968, 3, 2, 2, 2, 126, 979, 3, 2, 2, 2, 128, 982, 3, 2, 2, 2, 130, 984, 3, 2, 2, 2, 132, 990, 3, 2, 2, 2, 134, 994, 3, 2, 2, 2, 136, 996, 3, 2, 2, 2, 138, 1001, 3, 2, 2, 2, 140, 1008, 3, 2, 2, 2, 142, 1010, 3, 2, 2, 2, 144, 1013, 3, 2, 2, 2, 146, 1024, 3, 2, 2, 2, 148, 1031, 3, 2, 2, 2, 150, 1033, 3, 2, 2, 2, 152, 1044, 3, 2, 2, 2, 154, 1050, 3, 2, 2, 2, 156, 1052, 3, 2, 2, 2, 158, 1057, 3, 2, 2, 2, 160, 1066, 3, 2, 2, 2, 162, 1068, 3, 2, 2, 2, 164, 1079, 3, 2, 2, 2, 166, 1084, 3, 2, 2, 2, 168, 1086, 3, 2, 2, 2, 170, 1091, 3, 2, 2, 2, 172, 1093, 3, 2, 2, 2, 174, 1098, 3, 2, 2, 2, 176, 1100, 3, 2, 2, 2, 178, 1104, 3, 2, 2, 2, 180, 1115, 3, 2, 2, 2, 182, 1121, 3, 2, 2, 2, 184, 1123, 3, 2, 2, 2, 186, 1129, 3, 2, 2, 2, 188, 1131, 3, 2, 2, 2, 190, 1133, 3, 2, 2, 2, 192, 1137, 3, 2, 2, 2, 194, 1139, 3, 2, 2, 2, 196, 1144, 3, 2, 2, 2, 198, 1146, 3, 2, 2, 2, 200, 1165, 3, 2, 2, 2, 202, 1180, 3, 2, 2, 2, 204, 1186, 3, 2, 2, 2, 206, 1205, 3, 2, 2, 2, 208, 1207, 3, 2, 2, 2, 210, 1210, 3, 2, 2, 2, 212, 1225, 3, 2, 2, 2, 214, 1230, 3, 2, 2, 2, 216, 1232, 3, 2, 2, 2, 218, 1238, 3, 2, 2, 2, 220, 1248, 3, 2, 2, 2, 222, 1250, 3, 2, 2, 2, 224, 1257, 3, 2, 2, 2, 226, 1259, 3, 2, 2, 2, 228, 1262, 3, 2, 2, 2, 230, 1265, 3, 2, 2, 2, 232, 1283, 3, 2, 2, 2, 234, 1301, 3, 2, 2, 2, 236, 1303, 3, 2, 2, 2, 238, 1336, 3, 2, 2, 2, 240, 1338, 3, 2, 2, 2, 242, 1341, 3, 2, 2, 2, 244, 1363, 3, 2, 2, 2, 246, 1365, 3, 2, 2, 2, 248, 1372, 3, 2, 2, 2, 250, 1374, 3, 2, 2, 2, 252, 1378, 3, 2, 2, 2, 254, 1390, 3, 2, 2, 2, 256, 1421, 3, 2, 2, 2, 258, 1423, 3, 2, 2, 2, 260, 1428, 3, 2, 2, 2, 262, 1430, 3, 2, 2, 2, 264, 1433, 3, 2, 2, 2, 266, 1444, 3, 2, 2, 2, 268, 1447, 3, 2, 2, 2, 270, 1460, 3, 2, 2, 2, 272, 1464, 3, 2, 2, 2, 274, 1487, 3, 2, 2, 2, 276, 1503, 3, 2, 2, 2, 278, 1512, 3, 2, 2, 2, 280, 1524, 3, 2, 2, 2, 282, 1526, 3, 2, 2, 2, 284, 1542, 3, 2, 2, 2, 286, 1556, 3, 2, 2, 2, 288, 1558, 3, 2, 2, 2, 290, 1569, 3, 2, 2, 2, 292, 1571, 3, 2, 2, 2, 294, 1608, 3, 2, 2, 2, 296, 1610, 3, 2, 2, 2, 298, 1625, 3, 2, 2, 2, 300, 1639, 3, 2, 2, 2, 302, 1641, 3, 2, 2, 2, 304, 1647, 3, 2, 2, 2, 306, 1653, 3, 2, 2, 2, 308, 1659, 3, 2, 2, 2, 310, 1665, 3, 2, 2, 2, 312, 1669, 3, 2, 2, 2, 314, 1671, 3, 2, 2, 2, 316, 1686, 3, 2, 2, 2, 318, 1700, 3, 2, 2, 2, 320, 1702, 3, 2, 2, 2, 322, 1706, 3, 2, 2, 2, 324, 1718, 3, 2, 2, 2, 326, 1728, 3, 2, 2, 2, 328, 1739, 3, 2, 2, 2, 330, 1749, 3, 2, 2, 2, 332, 1753, 3, 2, 2, 2, 334, 1761, 3, 2, 2, 2, 336, 1765, 3, 2, 2, 2, 338, 1767, 3, 2, 2, 2, 340, 1770, 3, 2, 2, 2, 342, 1781, 3, 2, 2, 2, 344, 1794, 3, 2, 2, 2, 346, 1796, 3, 2, 2, 2, 348, 1798, 3, 2, 2, 2, 350, 1803, 3, 2, 2, 2, 352, 1810, 3, 2, 2, 2, 354, 1812, 3, 2, 2, 2, 356, 1835, 3, 2, 2, 2, 358, 1853, 3, 2, 2, 2, 360, 1855, 3, 2, 2, 2, 362, 1864, 3, 2, 2, 2, 364, 1876, 3, 2, 2, 2, 366, 1880, 3, 2, 2, 2, 368, 1882, 3, 2, 2, 2, 370, 1894, 3, 2, 2, 2, 372, 1901, 3, 2, 2, 2, 374, 1903, 3, 2, 2, 2, 376, 1934, 3, 2, 2, 2, 378, 1936, 3, 2, 2, 2, 380, 1940, 3, 2, 2, 2, 382, 2069, 3, 2, 2, 2, 384, 2073, 3, 2, 2, 2, 386, 2075, 3, 2, 2, 2, 388, 2086, 3, 2, 2, 2, 390, 2088, 3, 2, 2, 2, 392, 2125, 3, 2, 2, 2, 394, 2272, 3, 2, 2, 2, 396, 2290, 3, 2, 2, 2, 398, 2292, 3, 2, 2, 2, 400, 2358, 3, 2, 2, 2, 402, 2362, 3, 2, 2, 2, 404, 2364, 3, 2, 2, 2, 406, 2370, 3, 2, 2, 2, 408, 2372, 3, 2, 2, 2, 410, 2388, 3, 2, 2, 2, 412, 2390, 3, 2, 2, 2, 414, 2396, 3, 2, 2, 2, 416, 2398, 3, 2, 2, 2, 418, 2409, 3, 2, 2, 2, 420, 2411, 3, 2, 2, 2, 422, 2417, 3, 2, 2, 2, 424, 2419, 3, 2, 2, 2, 426, 2423, 3, 2, 2, 2, 428, 2440, 3, 2, 2, 2, 430, 2446, 3, 2, 2, 2, 432, 2484, 3, 2, 2, 2, 434, 2486, 3, 2, 2, 2, 436, 2490, 3, 2, 2, 2, 438, 2521, 3, 2, 2, 2, 440, 2523, 3, 2, 2, 2, 442, 2554, 3, 2, 2, 2, 444, 2556, 3, 2, 2, 2, 446, 2582, 3, 2, 2, 2, 448, 2593, 3, 2, 2, 2, 450, 2604, 3, 2, 2, 2, 452, 2608, 3, 2, 2, 2, 454, 2619, 3, 2, 2, 2, 456, 2624, 3, 2, 2, 2, 458, 2626, 3, 2, 2, 2, 460, 2637, 3, 2, 2, 2, 462, 2641, 3, 2, 2, 2, 464, 2650, 3, 2, 2, 2, 466, 2656, 3, 2, 2, 2, 468, 2663, 3, 2, 2, 2, 470, 2665, 3, 2, 2, 2, 472, 2678, 3, 2, 2, 2, 474, 2686, 3, 2, 2, 2, 476, 2697, 3, 2, 2, 2, 478, 2699, 3, 2, 2, 2, 480, 2703, 3, 2, 2, 2, 482, 2709, 3, 2, 2, 2, 484, 2714, 3, 2, 2, 2, 486, 2716, 3, 2, 2, 2, 488, 2724, 3, 2, 2, 2, 490, 2728, 3, 2, 2, 2, 492, 2734, 3, 2, 2, 2, 494, 2736, 3, 2, 2, 2, 496, 2740, 3, 2, 2, 2, 498, 2743, 3, 2, 2, 2, 500, 2747, 3, 2, 2, 2, 502, 2751, 3, 2, 2, 2, 504, 2753, 3, 2, 2, 2, 506, 2759, 3, 2, 2, 2, 508, 2761, 3, 2, 2, 2, 510, 2765, 3, 2, 2, 2, 512, 2767, 3, 2, 2, 2, 514, 2771, 3, 2, 2, 2, 516, 2774, 3, 2, 2, 2, 518, 2778, 3, 2, 2, 2, 520, 2781, 3, 2, 2, 2, 522, 2784, 3, 2, 2, 2, 524, 528, 5, 4, 3, 2, 525, 527, 5, 4, 3, 2, 526, 525, 3, 2, 2, 2, 527, 530, 3, 2, 2, 2, 528, 526, 3, 2, 2, 2, 528, 529, 3, 2, 2, 2, 529, 3, 3, 2, 2, 2, 530, 528, 3, 2, 2, 2, 531, 532, 5, 8, 5, 2, 532, 533, 5, 6, 4, 2, 533, 536, 3, 2, 2, 2, 534, 536, 5, 452, 227, 2, 535, 531, 3, 2, 2, 2, 535, 534, 3, 2, 2, 2, 536, 5, 3, 2, 2, 2, 537, 542, 8, 4, 1, 2, 538, 539, 12, 3, 2, 2, 539, 541, 7, 32, 2, 2, 540, 538, 3, 2, 2, 2, 541, 544, 3, 2, 2, 2, 542, 540, 3, 2, 2, 2, 542, 543, 3, 2, 2, 2, 543, 7, 3, 2, 2, 2, 544, 542, 3, 2, 2, 2, 545, 551, 5, 12, 7, 2, 546, 551, 5, 16, 9, 2, 547, 551, 5, 18, 10, 2, 548, 551, 5, 26, 14, 2, 549, 551, 5, 10, 6, 2, 550, 545, 3, 2, 2, 2, 550, 546, 3, 2, 2, 2, 550, 547, 3, 2, 2, 2, 550, 548, 3, 2, 2, 2, 550, 549, 3, 2, 2, 2, 551, 9, 3, 2, 2, 2, 552, 561, 5, 40, 21, 2, 553, 561, 5, 42, 22, 2, 554, 561, 5, 44, 23, 2, 555, 561, 5, 30, 16, 2, 556, 561, 5, 382, 192, 2, 557, 561, 5, 46, 24, 2, 558, 561, 5, 54, 28, 2, 559, 561, 5, 56, 29, 2, 560, 552, 3, 2, 2, 2, 560, 553, 3, 2, 2, 2, 560, 554, 3, 2, 2, 2, 560, 555, 3, 2, 2, 2, 560, 556, 3, 2, 2, 2, 560, 557, 3, 2, 2, 2, 560, 558, 3, 2, 2, 2, 560, 559, 3, 2, 2, 2, 561, 11, 3, 2, 2, 2, 562, 563, 7, 34, 2, 2, 563, 564, 5, 14, 8, 2, 564, 565, 5, 10, 6, 2, 565, 13, 3, 2, 2, 2, 566, 569, 3, 2, 2, 2, 567, 569, 7, 113, 2, 2, 568, 566, 3, 2, 2, 2, 568, 567, 3, 2, 2, 2, 569, 15, 3, 2, 2, 2, 570, 571, 7, 87, 2, 2, 571, 572, 5, 10, 6, 2, 572, 17, 3, 2, 2, 2, 573, 574, 7, 168, 2, 2, 574, 575, 5, 20, 11, 2, 575, 576, 5, 22, 12, 2, 576, 577, 5, 10, 6, 2, 577, 19, 3, 2, 2, 2, 578, 581, 3, 2, 2, 2, 579, 581, 7, 96, 2, 2, 580, 578, 3, 2, 2, 2, 580, 579, 3, 2, 2, 2, 581, 21, 3, 2, 2, 2, 582, 588, 3, 2, 2, 2, 583, 584, 7, 239, 2, 2, 584, 588, 5, 24, 13, 2, 585, 586, 7, 3, 2, 2, 586, 588, 5, 24, 13, 2, 587, 582, 3, 2, 2, 2, 587, 583, 3, 2, 2, 2, 587, 585, 3, 2, 2, 2, 588, 23, 3, 2, 2, 2, 589, 590, 9, 2, 2, 2, 590, 25, 3, 2, 2, 2, 591, 592, 7, 85, 2, 2, 592, 593, 5, 392, 197, 2, 593, 594, 5, 28, 15, 2, 594, 27, 3, 2, 2, 2, 595, 599, 3, 2, 2, 2, 596, 597, 7, 223, 2, 2, 597, 599, 5, 402, 202, 2, 598, 595, 3, 2, 2, 2, 598, 596, 3, 2, 2, 2, 599, 29, 3, 2, 2, 2, 600, 601, 7, 114, 2, 2, 601, 602, 5, 32, 17, 2, 602, 603, 5, 202, 102, 2, 603, 604, 5, 34, 18, 2, 604, 605, 5, 36, 19, 2, 605, 31, 3, 2, 2, 2, 606, 610, 3, 2, 2, 2, 607, 610, 7, 126, 2, 2, 608, 610, 7, 57, 2, 2, 609, 606, 3, 2, 2, 2, 609, 607, 3, 2, 2, 2, 609, 608, 3, 2, 2, 2, 610, 33, 3, 2, 2, 2, 611, 612, 3, 2, 2, 2, 612, 35, 3, 2, 2, 2, 613, 616, 3, 2, 2, 2, 614, 616, 5, 38, 20, 2, 615, 613, 3, 2, 2, 2, 615, 614, 3, 2, 2, 2, 616, 37, 3, 2, 2, 2, 617, 618, 7, 234, 2, 2, 618, 619, 5, 392, 197, 2, 619, 39, 3, 2, 2, 2, 620, 621, 5, 58, 30, 2, 621, 41, 3, 2, 2, 2, 622, 628, 5, 200, 101, 2, 623, 628, 5, 234, 118, 2, 624, 628, 5, 236, 119, 2, 625, 628, 5, 238, 120, 2, 626, 628, 5, 268, 135, 2, 627, 622, 3, 2, 2, 2, 627, 623, 3, 2, 2, 2, 627, 624, 3, 2, 2, 2, 627, 625, 3, 2, 2, 2, 627, 626, 3, 2, 2, 2, 628, 43, 3, 2, 2, 2, 629, 633, 5, 48, 25, 2, 630, 633, 5, 50, 26, 2, 631, 633, 5, 52, 27, 2, 632, 629, 3, 2, 2, 2, 632, 630, 3, 2, 2, 2, 632, 631, 3, 2, 2, 2, 633, 45, 3, 2, 2, 2, 634, 637, 5, 286, 144, 2, 635, 637, 5, 300, 151, 2, 636, 634, 3, 2, 2, 2, 636, 635, 3, 2, 2, 2, 637, 47, 3, 2, 2, 2, 638, 644, 5, 314, 158, 2, 639, 644, 5, 316, 159, 2, 640, 644, 5, 356, 179, 2, 641, 644, 5, 358, 180, 2, 642, 644, 5, 360, 181, 2, 643, 638, 3, 2, 2, 2, 643, 639, 3, 2, 2, 2, 643, 640, 3, 2, 2, 2, 643, 641, 3, 2, 2, 2, 643, 642, 3, 2, 2, 2, 644, 49, 3, 2, 2, 2, 645, 648, 5, 302, 152, 2, 646, 648, 5, 304, 153, 2, 647, 645, 3, 2, 2, 2, 647, 646, 3, 2, 2, 2, 648, 51, 3, 2, 2, 2, 649, 653, 5, 306, 154, 2, 650, 653, 5, 308, 155, 2, 651, 653, 5, 310, 156, 2, 652, 649, 3, 2, 2, 2, 652, 650, 3, 2, 2, 2, 652, 651, 3, 2, 2, 2, 653, 53, 3, 2, 2, 2, 654, 658, 5, 362, 182, 2, 655, 658, 5, 378, 190, 2, 656, 658, 5, 380, 191, 2, 657, 654, 3, 2, 2, 2, 657, 655, 3, 2, 2, 2, 657, 656, 3, 2, 2, 2, 658, 55, 3, 2, 2, 2, 659, 665, 5, 494, 248, 2, 660, 665, 5, 496, 249, 2, 661, 665, 5, 498, 250, 2, 662, 665, 5, 518, 260, 2, 663, 665, 5, 516, 259, 2, 664, 659, 3, 2, 2, 2, 664, 660, 3, 2, 2, 2, 664, 661, 3, 2, 2, 2, 664, 662, 3, 2, 2, 2, 664, 663, 3, 2, 2, 2, 665, 57, 3, 2, 2, 2, 666, 667, 5, 60, 31, 2, 667, 668, 5, 174, 88, 2, 668, 680, 3, 2, 2, 2, 669, 670, 5, 60, 31, 2, 670, 671, 5, 174, 88, 2, 671, 672, 5, 194, 98, 2, 672, 673, 5, 196, 99, 2, 673, 680, 3, 2, 2, 2, 674, 675, 5, 60, 31, 2, 675, 676, 5, 174, 88, 2, 676, 677, 5, 198, 100, 2, 677, 678, 5, 192, 97, 2, 678, 680, 3, 2, 2, 2, 679, 666, 3, 2, 2, 2, 679, 669, 3, 2, 2, 2, 679, 674, 3, 2, 2, 2, 680, 59, 3, 2, 2, 2, 681, 682, 8, 31, 1, 2, 682, 711, 5, 64, 33, 2, 683, 684, 5, 450, 226, 2, 684, 685, 7, 214, 2, 2, 685, 686, 5, 62, 32, 2, 686, 711, 3, 2, 2, 2, 687, 688, 5, 450, 226, 2, 688, 689, 7, 214, 2, 2, 689, 690, 7, 35, 2, 2, 690, 691, 5, 62, 32, 2, 691, 711, 3, 2, 2, 2, 692, 693, 5, 450, 226, 2, 693, 694, 7, 118, 2, 2, 694, 695, 5, 62, 32, 2, 695, 711, 3, 2, 2, 2, 696, 697, 5, 450, 226, 2, 697, 698, 7, 118, 2, 2, 698, 699, 7, 35, 2, 2, 699, 700, 5, 62, 32, 2, 700, 711, 3, 2, 2, 2, 701, 702, 5, 450, 226, 2, 702, 703, 7, 83, 2, 2, 703, 704, 5, 62, 32, 2, 704, 711, 3, 2, 2, 2, 705, 706, 5, 450, 226, 2, 706, 707, 7, 83, 2, 2, 707, 708, 7, 35, 2, 2, 708, 709, 5, 62, 32, 2, 709, 711, 3, 2, 2, 2, 710, 681, 3, 2, 2, 2, 710, 683, 3, 2, 2, 2, 710, 687, 3, 2, 2, 2, 710, 692, 3, 2, 2, 2, 710, 696, 3, 2, 2, 2, 710, 701, 3, 2, 2, 2, 710, 705, 3, 2, 2, 2, 711, 735, 3, 2, 2, 2, 712, 713, 12, 14, 2, 2, 713, 714, 7, 214, 2, 2, 714, 734, 5, 62, 32, 2, 715, 716, 12, 13, 2, 2, 716, 717, 7, 214, 2, 2, 717, 718, 7, 35, 2, 2, 718, 734, 5, 62, 32, 2, 719, 720, 12, 12, 2, 2, 720, 721, 7, 118, 2, 2, 721, 734, 5, 62, 32, 2, 722, 723, 12, 11, 2, 2, 723, 724, 7, 118, 2, 2, 724, 725, 7, 35, 2, 2, 725, 734, 5, 62, 32, 2, 726, 727, 12, 10, 2, 2, 727, 728, 7, 83, 2, 2, 728, 734, 5, 62, 32, 2, 729, 730, 12, 9, 2, 2, 730, 731, 7, 83, 2, 2, 731, 732, 7, 35, 2, 2, 732, 734, 5, 62, 32, 2, 733, 712, 3, 2, 2, 2, 733, 715, 3, 2, 2, 2, 733, 719, 3, 2, 2, 2, 733, 722, 3, 2, 2, 2, 733, 726, 3, 2, 2, 2, 733, 729, 3, 2, 2, 2, 734, 737, 3, 2, 2, 2, 735, 733, 3, 2, 2, 2, 735, 736, 3, 2, 2, 2, 736, 61, 3, 2, 2, 2, 737, 735, 3, 2, 2, 2, 738, 741, 5, 64, 33, 2, 739, 741, 5, 450, 226, 2, 740, 738, 3, 2, 2, 2, 740, 739, 3, 2, 2, 2, 741, 63, 3, 2, 2, 2, 742, 745, 5, 66, 34, 2, 743, 745, 5, 68, 35, 2, 744, 742, 3, 2, 2, 2, 744, 743, 3, 2, 2, 2, 745, 65, 3, 2, 2, 2, 746, 747, 5, 148, 75, 2, 747, 748, 5, 90, 46, 2, 748, 749, 5, 140, 71, 2, 749, 750, 5, 154, 78, 2, 750, 751, 5, 158, 80, 2, 751, 752, 5, 456, 229, 2, 752, 753, 5, 70, 36, 2, 753, 67, 3, 2, 2, 2, 754, 755, 5, 148, 75, 2, 755, 756, 5, 70, 36, 2, 756, 757, 5, 88, 45, 2, 757, 758, 5, 140, 71, 2, 758, 759, 5, 154, 78, 2, 759, 760, 5, 158, 80, 2, 760, 761, 5, 456, 229, 2, 761, 69, 3, 2, 2, 2, 762, 763, 7, 195, 2, 2, 763, 764, 5, 72, 37, 2, 764, 71, 3, 2, 2, 2, 765, 766, 5, 74, 38, 2, 766, 767, 5, 78, 40, 2, 767, 774, 3, 2, 2, 2, 768, 769, 5, 74, 38, 2, 769, 770, 5, 76, 39, 2, 770, 771, 5, 392, 197, 2, 771, 772, 5, 82, 42, 2, 772, 774, 3, 2, 2, 2, 773, 765, 3, 2, 2, 2, 773, 768, 3, 2, 2, 2, 774, 73, 3, 2, 2, 2, 775, 779, 3, 2, 2, 2, 776, 779, 7, 35, 2, 2, 777, 779, 7, 75, 2, 2, 778, 775, 3, 2, 2, 2, 778, 776, 3, 2, 2, 2, 778, 777, 3, 2, 2, 2, 779, 75, 3, 2, 2, 2, 780, 781, 9, 3, 2, 2, 781, 77, 3, 2, 2, 2, 782, 783, 8, 40, 1, 2, 783, 784, 5, 80, 41, 2, 784, 790, 3, 2, 2, 2, 785, 786, 12, 3, 2, 2, 786, 787, 7, 27, 2, 2, 787, 789, 5, 80, 41, 2, 788, 785, 3, 2, 2, 2, 789, 792, 3, 2, 2, 2, 790, 788, 3, 2, 2, 2, 790, 791, 3, 2, 2, 2, 791, 79, 3, 2, 2, 2, 792, 790, 3, 2, 2, 2, 793, 802, 7, 12, 2, 2, 794, 795, 5, 392, 197, 2, 795, 796, 7, 9, 2, 2, 796, 797, 7, 12, 2, 2, 797, 802, 3, 2, 2, 2, 798, 799, 5, 392, 197, 2, 799, 800, 5, 82, 42, 2, 800, 802, 3, 2, 2, 2, 801, 793, 3, 2, 2, 2, 801, 794, 3, 2, 2, 2, 801, 798, 3, 2, 2, 2, 802, 81, 3, 2, 2, 2, 803, 806, 3, 2, 2, 2, 804, 806, 5, 84, 43, 2, 805, 803, 3, 2, 2, 2, 805, 804, 3, 2, 2, 2, 806, 83, 3, 2, 2, 2, 807, 811, 5, 86, 44, 2, 808, 809, 7, 41, 2, 2, 809, 811, 5, 86, 44, 2, 810, 807, 3, 2, 2, 2, 810, 808, 3, 2, 2, 2, 811, 85, 3, 2, 2, 2, 812, 813, 7, 239, 2, 2, 813, 87, 3, 2, 2, 2, 814, 817, 3, 2, 2, 2, 815, 817, 5, 90, 46, 2, 816, 814, 3, 2, 2, 2, 816, 815, 3, 2, 2, 2, 817, 89, 3, 2, 2, 2, 818, 819, 7, 97, 2, 2, 819, 820, 5, 92, 47, 2, 820, 91, 3, 2, 2, 2, 821, 822, 8, 47, 1, 2, 822, 832, 5, 94, 48, 2, 823, 824, 5, 94, 48, 2, 824, 825, 7, 186, 2, 2, 825, 826, 5, 134, 68, 2, 826, 827, 7, 123, 2, 2, 827, 828, 5, 94, 48, 2, 828, 829, 7, 154, 2, 2, 829, 830, 5, 392, 197, 2, 830, 832, 3, 2, 2, 2, 831, 821, 3, 2, 2, 2, 831, 823, 3, 2, 2, 2, 832, 883, 3, 2, 2, 2, 833, 834, 12, 10, 2, 2, 834, 835, 5, 132, 67, 2, 835, 836, 7, 123, 2, 2, 836, 837, 5, 94, 48, 2, 837, 838, 5, 136, 69, 2, 838, 882, 3, 2, 2, 2, 839, 840, 12, 9, 2, 2, 840, 841, 5, 132, 67, 2, 841, 842, 7, 123, 2, 2, 842, 843, 5, 94, 48, 2, 843, 844, 5, 138, 70, 2, 844, 845, 7, 95, 2, 2, 845, 846, 7, 239, 2, 2, 846, 882, 3, 2, 2, 2, 847, 848, 12, 8, 2, 2, 848, 849, 5, 132, 67, 2, 849, 850, 7, 144, 2, 2, 850, 851, 5, 94, 48, 2, 851, 852, 5, 136, 69, 2, 852, 882, 3, 2, 2, 2, 853, 854, 12, 7, 2, 2, 854, 855, 5, 132, 67, 2, 855, 856, 7, 144, 2, 2, 856, 857, 5, 94, 48, 2, 857, 858, 5, 138, 70, 2, 858, 859, 7, 95, 2, 2, 859, 860, 7, 239, 2, 2, 860, 882, 3, 2, 2, 2, 861, 862, 12, 6, 2, 2, 862, 863, 5, 132, 67, 2, 863, 864, 5, 96, 49, 2, 864, 865, 5, 392, 197, 2, 865, 866, 5, 82, 42, 2, 866, 882, 3, 2, 2, 2, 867, 868, 12, 5, 2, 2, 868, 869, 5, 132, 67, 2, 869, 870, 7, 123, 2, 2, 870, 871, 5, 94, 48, 2, 871, 872, 7, 154, 2, 2, 872, 873, 5, 392, 197, 2, 873, 882, 3, 2, 2, 2, 874, 875, 12, 4, 2, 2, 875, 876, 5, 132, 67, 2, 876, 877, 7, 144, 2, 2, 877, 878, 5, 94, 48, 2, 878, 879, 7, 154, 2, 2, 879, 880, 5, 392, 197, 2, 880, 882, 3, 2, 2, 2, 881, 833, 3, 2, 2, 2, 881, 839, 3, 2, 2, 2, 881, 847, 3, 2, 2, 2, 881, 853, 3, 2, 2, 2, 881, 861, 3, 2, 2, 2, 881, 867, 3, 2, 2, 2, 881, 874, 3, 2, 2, 2, 882, 885, 3, 2, 2, 2, 883, 881, 3, 2, 2, 2, 883, 884, 3, 2, 2, 2, 884, 93, 3, 2, 2, 2, 885, 883, 3, 2, 2, 2, 886, 892, 5, 98, 50, 2, 887, 888, 5, 392, 197, 2, 888, 889, 5, 82, 42, 2, 889, 890, 5, 112, 57, 2, 890, 892, 3, 2, 2, 2, 891, 886, 3, 2, 2, 2, 891, 887, 3, 2, 2, 2, 892, 95, 3, 2, 2, 2, 893, 894, 9, 4, 2, 2, 894, 97, 3, 2, 2, 2, 895, 896, 5, 100, 51, 2, 896, 897, 5, 82, 42, 2, 897, 898, 5, 112, 57, 2, 898, 99, 3, 2, 2, 2, 899, 900, 5, 102, 52, 2, 900, 901, 5, 110, 56, 2, 901, 910, 3, 2, 2, 2, 902, 903, 5, 102, 52, 2, 903, 904, 5, 106, 54, 2, 904, 905, 7, 9, 2, 2, 905, 906, 5, 108, 55, 2, 906, 907, 7, 9, 2, 2, 907, 908, 5, 110, 56, 2, 908, 910, 3, 2, 2, 2, 909, 899, 3, 2, 2, 2, 909, 902, 3, 2, 2, 2, 910, 101, 3, 2, 2, 2, 911, 915, 5, 104, 53, 2, 912, 913, 7, 203, 2, 2, 913, 915, 7, 28, 2, 2, 914, 911, 3, 2, 2, 2, 914, 912, 3, 2, 2, 2, 915, 103, 3, 2, 2, 2, 916, 917, 7, 239, 2, 2, 917, 918, 7, 28, 2, 2, 918, 105, 3, 2, 2, 2, 919, 920, 7, 239, 2, 2, 920, 107, 3, 2, 2, 2, 921, 922, 7, 239, 2, 2, 922, 109, 3, 2, 2, 2, 923, 924, 7, 239, 2, 2, 924, 111, 3, 2, 2, 2, 925, 929, 3, 2, 2, 2, 926, 927, 7, 221, 2, 2, 927, 929, 5, 114, 58, 2, 928, 925, 3, 2, 2, 2, 928, 926, 3, 2, 2, 2, 929, 113, 3, 2, 2, 2, 930, 946, 5, 116, 59, 2, 931, 946, 5, 118, 60, 2, 932, 946, 5, 120, 61, 2, 933, 934, 5, 118, 60, 2, 934, 935, 5, 120, 61, 2, 935, 946, 3, 2, 2, 2, 936, 937, 5, 120, 61, 2, 937, 938, 5, 118, 60, 2, 938, 946, 3, 2, 2, 2, 939, 940, 5, 116, 59, 2, 940, 941, 5, 120, 61, 2, 941, 946, 3, 2, 2, 2, 942, 943, 5, 120, 61, 2, 943, 944, 5, 116, 59, 2, 944, 946, 3, 2, 2, 2, 945, 930, 3, 2, 2, 2, 945, 931, 3, 2, 2, 2, 945, 932, 3, 2, 2, 2, 945, 933, 3, 2, 2, 2, 945, 936, 3, 2, 2, 2, 945, 939, 3, 2, 2, 2, 945, 942, 3, 2, 2, 2, 946, 115, 3, 2, 2, 2, 947, 948, 5, 122, 62, 2, 948, 949, 7, 125, 2, 2, 949, 950, 5, 392, 197, 2, 950, 117, 3, 2, 2, 2, 951, 952, 7, 113, 2, 2, 952, 953, 7, 23, 2, 2, 953, 954, 5, 124, 63, 2, 954, 955, 7, 24, 2, 2, 955, 119, 3, 2, 2, 2, 956, 957, 7, 105, 2, 2, 957, 958, 7, 23, 2, 2, 958, 959, 5, 128, 65, 2, 959, 960, 7, 24, 2, 2, 960, 963, 3, 2, 2, 2, 961, 963, 7, 145, 2, 2, 962, 956, 3, 2, 2, 2, 962, 961, 3, 2, 2, 2, 963, 121, 3, 2, 2, 2, 964, 967, 3, 2, 2, 2, 965, 967, 7, 169, 2, 2, 966, 964, 3, 2, 2, 2, 966, 965, 3, 2, 2, 2, 967, 123, 3, 2, 2, 2, 968, 969, 8, 63, 1, 2, 969, 970, 5, 126, 64, 2, 970, 976, 3, 2, 2, 2, 971, 972, 12, 3, 2, 2, 972, 973, 7, 27, 2, 2, 973, 975, 5, 126, 64, 2, 974, 971, 3, 2, 2, 2, 975, 978, 3, 2, 2, 2, 976, 974, 3, 2, 2, 2, 976, 977, 3, 2, 2, 2, 977, 125, 3, 2, 2, 2, 978, 976, 3, 2, 2, 2, 979, 980, 5, 322, 162, 2, 980, 981, 5, 332, 167, 2, 981, 127, 3, 2, 2, 2, 982, 983, 9, 5, 2, 2, 983, 129, 3, 2, 2, 2, 984, 985, 5, 112, 57, 2, 985, 131, 3, 2, 2, 2, 986, 991, 3, 2, 2, 2, 987, 991, 7, 116, 2, 2, 988, 989, 7, 130, 2, 2, 989, 991, 5, 134, 68, 2, 990, 986, 3, 2, 2, 2, 990, 987, 3, 2, 2, 2, 990, 988, 3, 2, 2, 2, 991, 133, 3, 2, 2, 2, 992, 995, 3, 2, 2, 2, 993, 995, 7, 160, 2, 2, 994, 992, 3, 2, 2, 2, 994, 993, 3, 2, 2, 2, 995, 135, 3, 2, 2, 2, 996, 997, 7, 154, 2, 2, 997, 998, 5, 122, 62, 2, 998, 999, 7, 125, 2, 2, 999, 1000, 5, 392, 197, 2, 1000, 137, 3, 2, 2, 2, 1001, 1002, 7, 154, 2, 2, 1002, 1003, 5, 122, 62, 2, 1003, 1004, 7, 124, 2, 2, 1004, 1005, 5, 392, 197, 2, 1005, 139, 3, 2, 2, 2, 1006, 1009, 3, 2, 2, 2, 1007, 1009, 5, 142, 72, 2, 1008, 1006, 3, 2, 2, 2, 1008, 1007, 3, 2, 2, 2, 1009, 141, 3, 2, 2, 2, 1010, 1011, 7, 131, 2, 2, 1011, 1012, 5, 144, 73, 2, 1012, 143, 3, 2, 2, 2, 1013, 1014, 8, 73, 1, 2, 1014, 1015, 5, 146, 74, 2, 1015, 1021, 3, 2, 2, 2, 1016, 1017, 12, 3, 2, 2, 1017, 1018, 7, 27, 2, 2, 1018, 1020, 5, 146, 74, 2, 1019, 1016, 3, 2, 2, 2, 1020, 1023, 3, 2, 2, 2, 1021, 1019, 3, 2, 2, 2, 1021, 1022, 3, 2, 2, 2, 1022, 145, 3, 2, 2, 2, 1023, 1021, 3, 2, 2, 2, 1024, 1025, 5, 86, 44, 2, 1025, 1026, 7, 16, 2, 2, 1026, 1027, 5, 392, 197, 2, 1027, 147, 3, 2, 2, 2, 1028, 1032, 3, 2, 2, 2, 1029, 1030, 7, 234, 2, 2, 1030, 1032, 5, 150, 76, 2, 1031, 1028, 3, 2, 2, 2, 1031, 1029, 3, 2, 2, 2, 1032, 149, 3, 2, 2, 2, 1033, 1034, 8, 76, 1, 2, 1034, 1035, 5, 152, 77, 2, 1035, 1041, 3, 2, 2, 2, 1036, 1037, 12, 3, 2, 2, 1037, 1038, 7, 27, 2, 2, 1038, 1040, 5, 152, 77, 2, 1039, 1036, 3, 2, 2, 2, 1040, 1043, 3, 2, 2, 2, 1041, 1039, 3, 2, 2, 2, 1041, 1042, 3, 2, 2, 2, 1042, 151, 3, 2, 2, 2, 1043, 1041, 3, 2, 2, 2, 1044, 1045, 5, 86, 44, 2, 1045, 1046, 7, 41, 2, 2, 1046, 1047, 5, 448, 225, 2, 1047, 153, 3, 2, 2, 2, 1048, 1051, 3, 2, 2, 2, 1049, 1051, 5, 156, 79, 2, 1050, 1048, 3, 2, 2, 2, 1050, 1049, 3, 2, 2, 2, 1051, 155, 3, 2, 2, 2, 1052, 1053, 7, 231, 2, 2, 1053, 1054, 5, 392, 197, 2, 1054, 157, 3, 2, 2, 2, 1055, 1058, 3, 2, 2, 2, 1056, 1058, 5, 160, 81, 2, 1057, 1055, 3, 2, 2, 2, 1057, 1056, 3, 2, 2, 2, 1058, 159, 3, 2, 2, 2, 1059, 1060, 7, 102, 2, 2, 1060, 1061, 7, 51, 2, 2, 1061, 1062, 5, 162, 82, 2, 1062, 1063, 5, 166, 84, 2, 1063, 1064, 5, 170, 86, 2, 1064, 1067, 3, 2, 2, 2, 1065, 1067, 5, 168, 85, 2, 1066, 1059, 3, 2, 2, 2, 1066, 1065, 3, 2, 2, 2, 1067, 161, 3, 2, 2, 2, 1068, 1069, 8, 82, 1, 2, 1069, 1070, 5, 164, 83, 2, 1070, 1076, 3, 2, 2, 2, 1071, 1072, 12, 3, 2, 2, 1072, 1073, 7, 27, 2, 2, 1073, 1075, 5, 164, 83, 2, 1074, 1071, 3, 2, 2, 2, 1075, 1078, 3, 2, 2, 2, 1076, 1074, 3, 2, 2, 2, 1076, 1077, 3, 2, 2, 2, 1077, 163, 3, 2, 2, 2, 1078, 1076, 3, 2, 2, 2, 1079, 1080, 5, 392, 197, 2, 1080, 1081, 5, 82, 42, 2, 1081, 165, 3, 2, 2, 2, 1082, 1085, 3, 2, 2, 2, 1083, 1085, 5, 168, 85, 2, 1084, 1082, 3, 2, 2, 2, 1084, 1083, 3, 2, 2, 2, 1085, 167, 3, 2, 2, 2, 1086, 1087, 7, 132, 2, 2, 1087, 1088, 5, 144, 73, 2, 1088, 169, 3, 2, 2, 2, 1089, 1092, 3, 2, 2, 2, 1090, 1092, 5, 172, 87, 2, 1091, 1089, 3, 2, 2, 2, 1091, 1090, 3, 2, 2, 2, 1092, 171, 3, 2, 2, 2, 1093, 1094, 7, 106, 2, 2, 1094, 1095, 5, 392, 197, 2, 1095, 173, 3, 2, 2, 2, 1096, 1099, 3, 2, 2, 2, 1097, 1099, 5, 176, 89, 2, 1098, 1096, 3, 2, 2, 2, 1098, 1097, 3, 2, 2, 2, 1099, 175, 3, 2, 2, 2, 1100, 1101, 7, 158, 2, 2, 1101, 1102, 7, 51, 2, 2, 1102, 1103, 5, 178, 90, 2, 1103, 177, 3, 2, 2, 2, 1104, 1105, 8, 90, 1, 2, 1105, 1106, 5, 180, 91, 2, 1106, 1112, 3, 2, 2, 2, 1107, 1108, 12, 3, 2, 2, 1108, 1109, 7, 27, 2, 2, 1109, 1111, 5, 180, 91, 2, 1110, 1107, 3, 2, 2, 2, 1111, 1114, 3, 2, 2, 2, 1112, 1110, 3, 2, 2, 2, 1112, 1113, 3, 2, 2, 2, 1113, 179, 3, 2, 2, 2, 1114, 1112, 3, 2, 2, 2, 1115, 1116, 5, 392, 197, 2, 1116, 1117, 5, 182, 92, 2, 1117, 1118, 5, 186, 94, 2, 1118, 181, 3, 2, 2, 2, 1119, 1122, 3, 2, 2, 2, 1120, 1122, 5, 184, 93, 2, 1121, 1119, 3, 2, 2, 2, 1121, 1120, 3, 2, 2, 2, 1122, 183, 3, 2, 2, 2, 1123, 1124, 9, 6, 2, 2, 1124, 185, 3, 2, 2, 2, 1125, 1130, 3, 2, 2, 2, 1126, 1127, 5, 190, 96, 2, 1127, 1128, 5, 188, 95, 2, 1128, 1130, 3, 2, 2, 2, 1129, 1125, 3, 2, 2, 2, 1129, 1126, 3, 2, 2, 2, 1130, 187, 3, 2, 2, 2, 1131, 1132, 9, 7, 2, 2, 1132, 189, 3, 2, 2, 2, 1133, 1134, 7, 150, 2, 2, 1134, 191, 3, 2, 2, 2, 1135, 1138, 3, 2, 2, 2, 1136, 1138, 5, 194, 98, 2, 1137, 1135, 3, 2, 2, 2, 1137, 1136, 3, 2, 2, 2, 1138, 193, 3, 2, 2, 2, 1139, 1140, 7, 135, 2, 2, 1140, 1141, 5, 392, 197, 2, 1141, 195, 3, 2, 2, 2, 1142, 1145, 3, 2, 2, 2, 1143, 1145, 5, 198, 100, 2, 1144, 1142, 3, 2, 2, 2, 1144, 1143, 3, 2, 2, 2, 1145, 197, 3, 2, 2, 2, 1146, 1147, 7, 153, 2, 2, 1147, 1148, 5, 392, 197, 2, 1148, 199, 3, 2, 2, 2, 1149, 1150, 7, 117, 2, 2, 1150, 1151, 7, 119, 2, 2, 1151, 1152, 5, 204, 103, 2, 1152, 1153, 5, 206, 104, 2, 1153, 1154, 5, 210, 106, 2, 1154, 1155, 5, 220, 111, 2, 1155, 1166, 3, 2, 2, 2, 1156, 1157, 7, 117, 2, 2, 1157, 1158, 7, 119, 2, 2, 1158, 1159, 5, 204, 103, 2, 1159, 1160, 7, 23, 2, 2, 1160, 1161, 5, 232, 117, 2, 1161, 1162, 7, 24, 2, 2, 1162, 1163, 5, 58, 30, 2, 1163, 1164, 5, 220, 111, 2, 1164, 1166, 3, 2, 2, 2, 1165, 1149, 3, 2, 2, 2, 1165, 1156, 3, 2, 2, 2, 1166, 201, 3, 2, 2, 2, 1167, 1168, 5, 110, 56, 2, 1168, 1169, 5, 82, 42, 2, 1169, 1181, 3, 2, 2, 2, 1170, 1171, 5, 100, 51, 2, 1171, 1172, 5, 82, 42, 2, 1172, 1181, 3, 2, 2, 2, 1173, 1174, 5, 106, 54, 2, 1174, 1175, 7, 9, 2, 2, 1175, 1176, 5, 108, 55, 2, 1176, 1177, 7, 9, 2, 2, 1177, 1178, 5, 110, 56, 2, 1178, 1179, 5, 82, 42, 2, 1179, 1181, 3, 2, 2, 2, 1180, 1167, 3, 2, 2, 2, 1180, 1170, 3, 2, 2, 2, 1180, 1173, 3, 2, 2, 2, 1181, 203, 3, 2, 2, 2, 1182, 1187, 5, 202, 102, 2, 1183, 1184, 5, 418, 210, 2, 1184, 1185, 5, 82, 42, 2, 1185, 1187, 3, 2, 2, 2, 1186, 1182, 3, 2, 2, 2, 1186, 1183, 3, 2, 2, 2, 1187, 205, 3, 2, 2, 2, 1188, 1206, 3, 2, 2, 2, 1189, 1190, 7, 23, 2, 2, 1190, 1191, 5, 122, 62, 2, 1191, 1192, 7, 124, 2, 2, 1192, 1193, 7, 27, 2, 2, 1193, 1194, 7, 225, 2, 2, 1194, 1195, 7, 24, 2, 2, 1195, 1206, 3, 2, 2, 2, 1196, 1197, 7, 23, 2, 2, 1197, 1198, 5, 122, 62, 2, 1198, 1199, 7, 124, 2, 2, 1199, 1200, 7, 27, 2, 2, 1200, 1201, 7, 225, 2, 2, 1201, 1202, 7, 27, 2, 2, 1202, 1203, 7, 156, 2, 2, 1203, 1204, 7, 24, 2, 2, 1204, 1206, 3, 2, 2, 2, 1205, 1188, 3, 2, 2, 2, 1205, 1189, 3, 2, 2, 2, 1205, 1196, 3, 2, 2, 2, 1206, 207, 3, 2, 2, 2, 1207, 1208, 5, 122, 62, 2, 1208, 1209, 7, 124, 2, 2, 1209, 209, 3, 2, 2, 2, 1210, 1211, 8, 106, 1, 2, 1211, 1212, 5, 212, 107, 2, 1212, 1218, 3, 2, 2, 2, 1213, 1214, 12, 3, 2, 2, 1214, 1215, 7, 27, 2, 2, 1215, 1217, 5, 214, 108, 2, 1216, 1213, 3, 2, 2, 2, 1217, 1220, 3, 2, 2, 2, 1218, 1216, 3, 2, 2, 2, 1218, 1219, 3, 2, 2, 2, 1219, 211, 3, 2, 2, 2, 1220, 1218, 3, 2, 2, 2, 1221, 1222, 7, 227, 2, 2, 1222, 1226, 5, 216, 109, 2, 1223, 1224, 7, 227, 2, 2, 1224, 1226, 5, 218, 110, 2, 1225, 1221, 3, 2, 2, 2, 1225, 1223, 3, 2, 2, 2, 1226, 213, 3, 2, 2, 2, 1227, 1231, 5, 212, 107, 2, 1228, 1231, 5, 216, 109, 2, 1229, 1231, 5, 218, 110, 2, 1230, 1227, 3, 2, 2, 2, 1230, 1228, 3, 2, 2, 2, 1230, 1229, 3, 2, 2, 2, 1231, 215, 3, 2, 2, 2, 1232, 1233, 7, 23, 2, 2, 1233, 1234, 5, 392, 197, 2, 1234, 1235, 7, 27, 2, 2, 1235, 1236, 5, 392, 197, 2, 1236, 1237, 7, 24, 2, 2, 1237, 217, 3, 2, 2, 2, 1238, 1239, 7, 23, 2, 2, 1239, 1240, 5, 392, 197, 2, 1240, 1241, 7, 27, 2, 2, 1241, 1242, 5, 392, 197, 2, 1242, 1243, 7, 27, 2, 2, 1243, 1244, 5, 392, 197, 2, 1244, 1245, 7, 24, 2, 2, 1245, 219, 3, 2, 2, 2, 1246, 1249, 3, 2, 2, 2, 1247, 1249, 5, 222, 112, 2, 1248, 1246, 3, 2, 2, 2, 1248, 1247, 3, 2, 2, 2, 1249, 221, 3, 2, 2, 2, 1250, 1251, 7, 184, 2, 2, 1251, 1252, 5, 224, 113, 2, 1252, 223, 3, 2, 2, 2, 1253, 1258, 5, 78, 40, 2, 1254, 1255, 5, 76, 39, 2, 1255, 1256, 5, 392, 197, 2, 1256, 1258, 3, 2, 2, 2, 1257, 1253, 3, 2, 2, 2, 1257, 1254, 3, 2, 2, 2, 1258, 225, 3, 2, 2, 2, 1259, 1260, 5, 208, 105, 2, 1260, 1261, 5, 392, 197, 2, 1261, 227, 3, 2, 2, 2, 1262, 1263, 7, 225, 2, 2, 1263, 1264, 5, 392, 197, 2, 1264, 229, 3, 2, 2, 2, 1265, 1266, 7, 156, 2, 2, 1266, 1267, 5, 392, 197, 2, 1267, 231, 3, 2, 2, 2, 1268, 1284, 5, 226, 114, 2, 1269, 1270, 5, 226, 114, 2, 1270, 1271, 7, 27, 2, 2, 1271, 1272, 5, 228, 115, 2, 1272, 1284, 3, 2, 2, 2, 1273, 1274, 5, 226, 114, 2, 1274, 1275, 7, 27, 2, 2, 1275, 1276, 5, 228, 115, 2, 1276, 1277, 7, 27, 2, 2, 1277, 1278, 5, 230, 116, 2, 1278, 1284, 3, 2, 2, 2, 1279, 1280, 5, 226, 114, 2, 1280, 1281, 7, 27, 2, 2, 1281, 1282, 5, 230, 116, 2, 1282, 1284, 3, 2, 2, 2, 1283, 1268, 3, 2, 2, 2, 1283, 1269, 3, 2, 2, 2, 1283, 1273, 3, 2, 2, 2, 1283, 1279, 3, 2, 2, 2, 1284, 233, 3, 2, 2, 2, 1285, 1286, 7, 220, 2, 2, 1286, 1287, 7, 119, 2, 2, 1287, 1288, 5, 204, 103, 2, 1288, 1289, 5, 206, 104, 2, 1289, 1290, 5, 210, 106, 2, 1290, 1291, 5, 220, 111, 2, 1291, 1302, 3, 2, 2, 2, 1292, 1293, 7, 220, 2, 2, 1293, 1294, 7, 119, 2, 2, 1294, 1295, 5, 204, 103, 2, 1295, 1296, 7, 23, 2, 2, 1296, 1297, 5, 232, 117, 2, 1297, 1298, 7, 24, 2, 2, 1298, 1299, 5, 58, 30, 2, 1299, 1300, 5, 220, 111, 2, 1300, 1302, 3, 2, 2, 2, 1301, 1285, 3, 2, 2, 2, 1301, 1292, 3, 2, 2, 2, 1302, 235, 3, 2, 2, 2, 1303, 1304, 7, 71, 2, 2, 1304, 1305, 7, 97, 2, 2, 1305, 1306, 5, 204, 103, 2, 1306, 1307, 5, 130, 66, 2, 1307, 1308, 5, 154, 78, 2, 1308, 1309, 5, 192, 97, 2, 1309, 1310, 5, 220, 111, 2, 1310, 237, 3, 2, 2, 2, 1311, 1312, 7, 219, 2, 2, 1312, 1313, 5, 204, 103, 2, 1313, 1314, 5, 130, 66, 2, 1314, 1315, 5, 240, 121, 2, 1315, 1316, 5, 262, 132, 2, 1316, 1317, 5, 154, 78, 2, 1317, 1318, 5, 192, 97, 2, 1318, 1319, 5, 220, 111, 2, 1319, 1337, 3, 2, 2, 2, 1320, 1321, 7, 219, 2, 2, 1321, 1322, 5, 204, 103, 2, 1322, 1323, 5, 130, 66, 2, 1323, 1324, 5, 240, 121, 2, 1324, 1325, 5, 154, 78, 2, 1325, 1326, 5, 192, 97, 2, 1326, 1327, 5, 220, 111, 2, 1327, 1337, 3, 2, 2, 2, 1328, 1329, 7, 219, 2, 2, 1329, 1330, 5, 204, 103, 2, 1330, 1331, 5, 130, 66, 2, 1331, 1332, 5, 262, 132, 2, 1332, 1333, 5, 154, 78, 2, 1333, 1334, 5, 192, 97, 2, 1334, 1335, 5, 220, 111, 2, 1335, 1337, 3, 2, 2, 2, 1336, 1311, 3, 2, 2, 2, 1336, 1320, 3, 2, 2, 2, 1336, 1328, 3, 2, 2, 2, 1337, 239, 3, 2, 2, 2, 1338, 1339, 7, 197, 2, 2, 1339, 1340, 5, 242, 122, 2, 1340, 241, 3, 2, 2, 2, 1341, 1342, 8, 122, 1, 2, 1342, 1343, 5, 244, 123, 2, 1343, 1349, 3, 2, 2, 2, 1344, 1345, 12, 3, 2, 2, 1345, 1346, 7, 27, 2, 2, 1346, 1348, 5, 244, 123, 2, 1347, 1344, 3, 2, 2, 2, 1348, 1351, 3, 2, 2, 2, 1349, 1347, 3, 2, 2, 2, 1349, 1350, 3, 2, 2, 2, 1350, 243, 3, 2, 2, 2, 1351, 1349, 3, 2, 2, 2, 1352, 1353, 5, 390, 196, 2, 1353, 1354, 7, 16, 2, 2, 1354, 1355, 5, 392, 197, 2, 1355, 1356, 5, 248, 125, 2, 1356, 1364, 3, 2, 2, 2, 1357, 1358, 5, 246, 124, 2, 1358, 1359, 7, 9, 2, 2, 1359, 1360, 5, 390, 196, 2, 1360, 1361, 7, 16, 2, 2, 1361, 1362, 5, 392, 197, 2, 1362, 1364, 3, 2, 2, 2, 1363, 1352, 3, 2, 2, 2, 1363, 1357, 3, 2, 2, 2, 1364, 245, 3, 2, 2, 2, 1365, 1366, 5, 434, 218, 2, 1366, 1367, 7, 23, 2, 2, 1367, 1368, 5, 414, 208, 2, 1368, 1369, 7, 24, 2, 2, 1369, 247, 3, 2, 2, 2, 1370, 1373, 3, 2, 2, 2, 1371, 1373, 5, 250, 126, 2, 1372, 1370, 3, 2, 2, 2, 1372, 1371, 3, 2, 2, 2, 1373, 249, 3, 2, 2, 2, 1374, 1375, 5, 252, 127, 2, 1375, 1376, 5, 260, 131, 2, 1376, 1377, 7, 81, 2, 2, 1377, 251, 3, 2, 2, 2, 1378, 1379, 8, 127, 1, 2, 1379, 1380, 7, 95, 2, 2, 1380, 1381, 5, 254, 128, 2, 1381, 1387, 3, 2, 2, 2, 1382, 1383, 12, 3, 2, 2, 1383, 1384, 7, 95, 2, 2, 1384, 1386, 5, 254, 128, 2, 1385, 1382, 3, 2, 2, 2, 1386, 1389, 3, 2, 2, 2, 1387, 1385, 3, 2, 2, 2, 1387, 1388, 3, 2, 2, 2, 1388, 253, 3, 2, 2, 2, 1389, 1387, 3, 2, 2, 2, 1390, 1391, 8, 128, 1, 2, 1391, 1392, 5, 256, 129, 2, 1392, 1398, 3, 2, 2, 2, 1393, 1394, 12, 3, 2, 2, 1394, 1395, 7, 27, 2, 2, 1395, 1397, 5, 256, 129, 2, 1396, 1393, 3, 2, 2, 2, 1397, 1400, 3, 2, 2, 2, 1398, 1396, 3, 2, 2, 2, 1398, 1399, 3, 2, 2, 2, 1399, 255, 3, 2, 2, 2, 1400, 1398, 3, 2, 2, 2, 1401, 1402, 5, 258, 130, 2, 1402, 1403, 7, 110, 2, 2, 1403, 1404, 5, 392, 197, 2, 1404, 1422, 3, 2, 2, 2, 1405, 1406, 5, 258, 130, 2, 1406, 1407, 7, 235, 2, 2, 1407, 1408, 5, 392, 197, 2, 1408, 1422, 3, 2, 2, 2, 1409, 1410, 5, 258, 130, 2, 1410, 1411, 7, 28, 2, 2, 1411, 1412, 5, 258, 130, 2, 1412, 1413, 7, 110, 2, 2, 1413, 1414, 5, 392, 197, 2, 1414, 1422, 3, 2, 2, 2, 1415, 1416, 5, 258, 130, 2, 1416, 1417, 7, 28, 2, 2, 1417, 1418, 5, 258, 130, 2, 1418, 1419, 7, 235, 2, 2, 1419, 1420, 5, 392, 197, 2, 1420, 1422, 3, 2, 2, 2, 1421, 1401, 3, 2, 2, 2, 1421, 1405, 3, 2, 2, 2, 1421, 1409, 3, 2, 2, 2, 1421, 1415, 3, 2, 2, 2, 1422, 257, 3, 2, 2, 2, 1423, 1424, 7, 239, 2, 2, 1424, 259, 3, 2, 2, 2, 1425, 1429, 3, 2, 2, 2, 1426, 1427, 7, 230, 2, 2, 1427, 1429, 5, 392, 197, 2, 1428, 1425, 3, 2, 2, 2, 1428, 1426, 3, 2, 2, 2, 1429, 261, 3, 2, 2, 2, 1430, 1431, 7, 218, 2, 2, 1431, 1432, 5, 264, 133, 2, 1432, 263, 3, 2, 2, 2, 1433, 1434, 8, 133, 1, 2, 1434, 1435, 5, 266, 134, 2, 1435, 1441, 3, 2, 2, 2, 1436, 1437, 12, 3, 2, 2, 1437, 1438, 7, 27, 2, 2, 1438, 1440, 5, 266, 134, 2, 1439, 1436, 3, 2, 2, 2, 1440, 1443, 3, 2, 2, 2, 1441, 1439, 3, 2, 2, 2, 1441, 1442, 3, 2, 2, 2, 1442, 265, 3, 2, 2, 2, 1443, 1441, 3, 2, 2, 2, 1444, 1445, 5, 390, 196, 2, 1445, 1446, 5, 248, 125, 2, 1446, 267, 3, 2, 2, 2, 1447, 1448, 7, 141, 2, 2, 1448, 1449, 7, 119, 2, 2, 1449, 1450, 5, 202, 102, 2, 1450, 1451, 5, 270, 136, 2, 1451, 1452, 7, 223, 2, 2, 1452, 1453, 5, 94, 48, 2, 1453, 1454, 7, 154, 2, 2, 1454, 1455, 5, 272, 137, 2, 1455, 1456, 5, 392, 197, 2, 1456, 1457, 5, 274, 138, 2, 1457, 1458, 5, 192, 97, 2, 1458, 1459, 5, 220, 111, 2, 1459, 269, 3, 2, 2, 2, 1460, 1461, 5, 112, 57, 2, 1461, 271, 3, 2, 2, 2, 1462, 1465, 3, 2, 2, 2, 1463, 1465, 5, 208, 105, 2, 1464, 1462, 3, 2, 2, 2, 1464, 1463, 3, 2, 2, 2, 1465, 273, 3, 2, 2, 2, 1466, 1488, 3, 2, 2, 2, 1467, 1468, 7, 230, 2, 2, 1468, 1469, 7, 139, 2, 2, 1469, 1470, 7, 204, 2, 2, 1470, 1471, 7, 219, 2, 2, 1471, 1472, 5, 280, 141, 2, 1472, 1473, 5, 276, 139, 2, 1473, 1488, 3, 2, 2, 2, 1474, 1475, 7, 230, 2, 2, 1475, 1476, 7, 139, 2, 2, 1476, 1477, 7, 204, 2, 2, 1477, 1478, 7, 71, 2, 2, 1478, 1479, 5, 282, 142, 2, 1479, 1480, 5, 278, 140, 2, 1480, 1488, 3, 2, 2, 2, 1481, 1482, 7, 230, 2, 2, 1482, 1483, 7, 147, 2, 2, 1483, 1484, 7, 139, 2, 2, 1484, 1485, 7, 204, 2, 2, 1485, 1486, 7, 117, 2, 2, 1486, 1488, 5, 284, 143, 2, 1487, 1466, 3, 2, 2, 2, 1487, 1467, 3, 2, 2, 2, 1487, 1474, 3, 2, 2, 2, 1487, 1481, 3, 2, 2, 2, 1488, 275, 3, 2, 2, 2, 1489, 1504, 3, 2, 2, 2, 1490, 1491, 7, 230, 2, 2, 1491, 1492, 7, 139, 2, 2, 1492, 1493, 7, 204, 2, 2, 1493, 1494, 7, 71, 2, 2, 1494, 1495, 5, 282, 142, 2, 1495, 1496, 5, 278, 140, 2, 1496, 1504, 3, 2, 2, 2, 1497, 1498, 7, 230, 2, 2, 1498, 1499, 7, 147, 2, 2, 1499, 1500, 7, 139, 2, 2, 1500, 1501, 7, 204, 2, 2, 1501, 1502, 7, 117, 2, 2, 1502, 1504, 5, 284, 143, 2, 1503, 1489, 3, 2, 2, 2, 1503, 1490, 3, 2, 2, 2, 1503, 1497, 3, 2, 2, 2, 1504, 277, 3, 2, 2, 2, 1505, 1513, 3, 2, 2, 2, 1506, 1507, 7, 230, 2, 2, 1507, 1508, 7, 147, 2, 2, 1508, 1509, 7, 139, 2, 2, 1509, 1510, 7, 204, 2, 2, 1510, 1511, 7, 117, 2, 2, 1511, 1513, 5, 284, 143, 2, 1512, 1505, 3, 2, 2, 2, 1512, 1506, 3, 2, 2, 2, 1513, 279, 3, 2, 2, 2, 1514, 1515, 5, 240, 121, 2, 1515, 1516, 5, 154, 78, 2, 1516, 1525, 3, 2, 2, 2, 1517, 1518, 5, 240, 121, 2, 1518, 1519, 5, 262, 132, 2, 1519, 1520, 5, 154, 78, 2, 1520, 1525, 3, 2, 2, 2, 1521, 1522, 5, 262, 132, 2, 1522, 1523, 5, 154, 78, 2, 1523, 1525, 3, 2, 2, 2, 1524, 1514, 3, 2, 2, 2, 1524, 1517, 3, 2, 2, 2, 1524, 1521, 3, 2, 2, 2, 1525, 281, 3, 2, 2, 2, 1526, 1527, 5, 154, 78, 2, 1527, 283, 3, 2, 2, 2, 1528, 1529, 5, 392, 197, 2, 1529, 1530, 5, 154, 78, 2, 1530, 1543, 3, 2, 2, 2, 1531, 1532, 5, 216, 109, 2, 1532, 1533, 5, 154, 78, 2, 1533, 1543, 3, 2, 2, 2, 1534, 1535, 5, 218, 110, 2, 1535, 1536, 5, 154, 78, 2, 1536, 1543, 3, 2, 2, 2, 1537, 1538, 7, 23, 2, 2, 1538, 1539, 5, 232, 117, 2, 1539, 1540, 7, 24, 2, 2, 1540, 1541, 5, 154, 78, 2, 1541, 1543, 3, 2, 2, 2, 1542, 1528, 3, 2, 2, 2, 1542, 1531, 3, 2, 2, 2, 1542, 1534, 3, 2, 2, 2, 1542, 1537, 3, 2, 2, 2, 1543, 285, 3, 2, 2, 2, 1544, 1545, 7, 101, 2, 2, 1545, 1546, 5, 288, 145, 2, 1546, 1547, 7, 206, 2, 2, 1547, 1548, 5, 296, 149, 2, 1548, 1557, 3, 2, 2, 2, 1549, 1550, 7, 101, 2, 2, 1550, 1551, 5, 288, 145, 2, 1551, 1552, 7, 154, 2, 2, 1552, 1553, 5, 292, 147, 2, 1553, 1554, 7, 206, 2, 2, 1554, 1555, 5, 296, 149, 2, 1555, 1557, 3, 2, 2, 2, 1556, 1544, 3, 2, 2, 2, 1556, 1549, 3, 2, 2, 2, 1557, 287, 3, 2, 2, 2, 1558, 1559, 8, 145, 1, 2, 1559, 1560, 5, 290, 146, 2, 1560, 1566, 3, 2, 2, 2, 1561, 1562, 12, 3, 2, 2, 1562, 1563, 7, 27, 2, 2, 1563, 1565, 5, 290, 146, 2, 1564, 1561, 3, 2, 2, 2, 1565, 1568, 3, 2, 2, 2, 1566, 1564, 3, 2, 2, 2, 1566, 1567, 3, 2, 2, 2, 1567, 289, 3, 2, 2, 2, 1568, 1566, 3, 2, 2, 2, 1569, 1570, 9, 8, 2, 2, 1570, 291, 3, 2, 2, 2, 1571, 1572, 8, 147, 1, 2, 1572, 1573, 5, 294, 148, 2, 1573, 1579, 3, 2, 2, 2, 1574, 1575, 12, 3, 2, 2, 1575, 1576, 7, 27, 2, 2, 1576, 1578, 5, 294, 148, 2, 1577, 1574, 3, 2, 2, 2, 1578, 1581, 3, 2, 2, 2, 1579, 1577, 3, 2, 2, 2, 1579, 1580, 3, 2, 2, 2, 1580, 293, 3, 2, 2, 2, 1581, 1579, 3, 2, 2, 2, 1582, 1609, 5, 110, 56, 2, 1583, 1584, 5, 104, 53, 2, 1584, 1585, 5, 110, 56, 2, 1585, 1609, 3, 2, 2, 2, 1586, 1587, 5, 104, 53, 2, 1587, 1588, 5, 106, 54, 2, 1588, 1589, 7, 9, 2, 2, 1589, 1590, 5, 108, 55, 2, 1590, 1591, 7, 9, 2, 2, 1591, 1592, 5, 110, 56, 2, 1592, 1609, 3, 2, 2, 2, 1593, 1594, 5, 106, 54, 2, 1594, 1595, 7, 9, 2, 2, 1595, 1596, 5, 108, 55, 2, 1596, 1597, 7, 9, 2, 2, 1597, 1598, 5, 110, 56, 2, 1598, 1609, 3, 2, 2, 2, 1599, 1600, 5, 104, 53, 2, 1600, 1601, 5, 106, 54, 2, 1601, 1602, 7, 9, 2, 2, 1602, 1603, 5, 108, 55, 2, 1603, 1609, 3, 2, 2, 2, 1604, 1605, 5, 106, 54, 2, 1605, 1606, 7, 9, 2, 2, 1606, 1607, 5, 108, 55, 2, 1607, 1609, 3, 2, 2, 2, 1608, 1582, 3, 2, 2, 2, 1608, 1583, 3, 2, 2, 2, 1608, 1586, 3, 2, 2, 2, 1608, 1593, 3, 2, 2, 2, 1608, 1599, 3, 2, 2, 2, 1608, 1604, 3, 2, 2, 2, 1609, 295, 3, 2, 2, 2, 1610, 1611, 8, 149, 1, 2, 1611, 1612, 5, 298, 150, 2, 1612, 1618, 3, 2, 2, 2, 1613, 1614, 12, 3, 2, 2, 1614, 1615, 7, 27, 2, 2, 1615, 1617, 5, 298, 150, 2, 1616, 1613, 3, 2, 2, 2, 1617, 1620, 3, 2, 2, 2, 1618, 1616, 3, 2, 2, 2, 1618, 1619, 3, 2, 2, 2, 1619, 297, 3, 2, 2, 2, 1620, 1618, 3, 2, 2, 2, 1621, 1626, 7, 239, 2, 2, 1622, 1623, 7, 239, 2, 2, 1623, 1624, 7, 28, 2, 2, 1624, 1626, 7, 239, 2, 2, 1625, 1621, 3, 2, 2, 2, 1625, 1622, 3, 2, 2, 2, 1626, 299, 3, 2, 2, 2, 1627, 1628, 7, 185, 2, 2, 1628, 1629, 5, 288, 145, 2, 1629, 1630, 7, 97, 2, 2, 1630, 1631, 5, 296, 149, 2, 1631, 1640, 3, 2, 2, 2, 1632, 1633, 7, 185, 2, 2, 1633, 1634, 5, 288, 145, 2, 1634, 1635, 7, 154, 2, 2, 1635, 1636, 5, 292, 147, 2, 1636, 1637, 7, 97, 2, 2, 1637, 1638, 5, 296, 149, 2, 1638, 1640, 3, 2, 2, 2, 1639, 1627, 3, 2, 2, 2, 1639, 1632, 3, 2, 2, 2, 1640, 301, 3, 2, 2, 2, 1641, 1642, 7, 64, 2, 2, 1642, 1643, 7, 194, 2, 2, 1643, 1645, 5, 328, 165, 2, 1644, 1646, 5, 522, 262, 2, 1645, 1644, 3, 2, 2, 2, 1645, 1646, 3, 2, 2, 2, 1646, 303, 3, 2, 2, 2, 1647, 1648, 7, 77, 2, 2, 1648, 1649, 7, 194, 2, 2, 1649, 1651, 5, 328, 165, 2, 1650, 1652, 5, 520, 261, 2, 1651, 1650, 3, 2, 2, 2, 1651, 1652, 3, 2, 2, 2, 1652, 305, 3, 2, 2, 2, 1653, 1654, 7, 64, 2, 2, 1654, 1655, 7, 57, 2, 2, 1655, 1657, 5, 324, 163, 2, 1656, 1658, 5, 522, 262, 2, 1657, 1656, 3, 2, 2, 2, 1657, 1658, 3, 2, 2, 2, 1658, 307, 3, 2, 2, 2, 1659, 1660, 7, 77, 2, 2, 1660, 1661, 7, 57, 2, 2, 1661, 1663, 5, 324, 163, 2, 1662, 1664, 5, 520, 261, 2, 1663, 1662, 3, 2, 2, 2, 1663, 1664, 3, 2, 2, 2, 1664, 309, 3, 2, 2, 2, 1665, 1666, 5, 312, 157, 2, 1666, 1667, 7, 57, 2, 2, 1667, 1668, 5, 324, 163, 2, 1668, 311, 3, 2, 2, 2, 1669, 1670, 9, 9, 2, 2, 1670, 313, 3, 2, 2, 2, 1671, 1672, 7, 64, 2, 2, 1672, 1673, 7, 113, 2, 2, 1673, 1674, 5, 320, 161, 2, 1674, 1675, 7, 154, 2, 2, 1675, 1676, 5, 324, 163, 2, 1676, 1677, 7, 23, 2, 2, 1677, 1678, 5, 340, 171, 2, 1678, 1679, 7, 24, 2, 2, 1679, 1680, 5, 330, 166, 2, 1680, 1681, 5, 350, 176, 2, 1681, 1682, 5, 332, 167, 2, 1682, 1684, 5, 336, 169, 2, 1683, 1685, 5, 522, 262, 2, 1684, 1683, 3, 2, 2, 2, 1684, 1685, 3, 2, 2, 2, 1685, 315, 3, 2, 2, 2, 1686, 1687, 7, 64, 2, 2, 1687, 1688, 7, 169, 2, 2, 1688, 1689, 7, 113, 2, 2, 1689, 1690, 5, 318, 160, 2, 1690, 1691, 7, 154, 2, 2, 1691, 1692, 5, 324, 163, 2, 1692, 1693, 5, 330, 166, 2, 1693, 1694, 5, 332, 167, 2, 1694, 1696, 5, 336, 169, 2, 1695, 1697, 5, 522, 262, 2, 1696, 1695, 3, 2, 2, 2, 1696, 1697, 3, 2, 2, 2, 1697, 317, 3, 2, 2, 2, 1698, 1701, 3, 2, 2, 2, 1699, 1701, 5, 320, 161, 2, 1700, 1698, 3, 2, 2, 2, 1700, 1699, 3, 2, 2, 2, 1701, 319, 3, 2, 2, 2, 1702, 1703, 7, 239, 2, 2, 1703, 321, 3, 2, 2, 2, 1704, 1707, 3, 2, 2, 2, 1705, 1707, 5, 320, 161, 2, 1706, 1704, 3, 2, 2, 2, 1706, 1705, 3, 2, 2, 2, 1707, 323, 3, 2, 2, 2, 1708, 1719, 5, 326, 164, 2, 1709, 1710, 5, 104, 53, 2, 1710, 1711, 5, 106, 54, 2, 1711, 1719, 3, 2, 2, 2, 1712, 1713, 5, 106, 54, 2, 1713, 1714, 7, 9, 2, 2, 1714, 1715, 5, 108, 55, 2, 1715, 1716, 7, 9, 2, 2, 1716, 1717, 5, 110, 56, 2, 1717, 1719, 3, 2, 2, 2, 1718, 1708, 3, 2, 2, 2, 1718, 1709, 3, 2, 2, 2, 1718, 1712, 3, 2, 2, 2, 1719, 325, 3, 2, 2, 2, 1720, 1729, 5, 110, 56, 2, 1721, 1722, 5, 104, 53, 2, 1722, 1723, 5, 106, 54, 2, 1723, 1724, 7, 9, 2, 2, 1724, 1725, 5, 108, 55, 2, 1725, 1726, 7, 9, 2, 2, 1726, 1727, 5, 110, 56, 2, 1727, 1729, 3, 2, 2, 2, 1728, 1720, 3, 2, 2, 2, 1728, 1721, 3, 2, 2, 2, 1729, 327, 3, 2, 2, 2, 1730, 1731, 5, 104, 53, 2, 1731, 1732, 5, 106, 54, 2, 1732, 1733, 7, 9, 2, 2, 1733, 1734, 5, 108, 55, 2, 1734, 1740, 3, 2, 2, 2, 1735, 1736, 5, 106, 54, 2, 1736, 1737, 7, 9, 2, 2, 1737, 1738, 5, 108, 55, 2, 1738, 1740, 3, 2, 2, 2, 1739, 1730, 3, 2, 2, 2, 1739, 1735, 3, 2, 2, 2, 1740, 329, 3, 2, 2, 2, 1741, 1750, 3, 2, 2, 2, 1742, 1743, 7, 163, 2, 2, 1743, 1744, 7, 51, 2, 2, 1744, 1745, 7, 105, 2, 2, 1745, 1746, 7, 23, 2, 2, 1746, 1747, 5, 416, 209, 2, 1747, 1748, 7, 24, 2, 2, 1748, 1750, 3, 2, 2, 2, 1749, 1741, 3, 2, 2, 2, 1749, 1742, 3, 2, 2, 2, 1750, 331, 3, 2, 2, 2, 1751, 1754, 3, 2, 2, 2, 1752, 1754, 5, 334, 168, 2, 1753, 1751, 3, 2, 2, 2, 1753, 1752, 3, 2, 2, 2, 1754, 333, 3, 2, 2, 2, 1755, 1756, 7, 223, 2, 2, 1756, 1762, 7, 229, 2, 2, 1757, 1758, 7, 223, 2, 2, 1758, 1762, 7, 104, 2, 2, 1759, 1760, 7, 223, 2, 2, 1760, 1762, 7, 98, 2, 2, 1761, 1755, 3, 2, 2, 2, 1761, 1757, 3, 2, 2, 2, 1761, 1759, 3, 2, 2, 2, 1762, 335, 3, 2, 2, 2, 1763, 1766, 3, 2, 2, 2, 1764, 1766, 5, 338, 170, 2, 1765, 1763, 3, 2, 2, 2, 1765, 1764, 3, 2, 2, 2, 1766, 337, 3, 2, 2, 2, 1767, 1768, 7, 234, 2, 2, 1768, 1769, 5, 392, 197, 2, 1769, 339, 3, 2, 2, 2, 1770, 1771, 8, 171, 1, 2, 1771, 1772, 5, 342, 172, 2, 1772, 1778, 3, 2, 2, 2, 1773, 1774, 12, 3, 2, 2, 1774, 1775, 7, 27, 2, 2, 1775, 1777, 5, 342, 172, 2, 1776, 1773, 3, 2, 2, 2, 1777, 1780, 3, 2, 2, 2, 1778, 1776, 3, 2, 2, 2, 1778, 1779, 3, 2, 2, 2, 1779, 341, 3, 2, 2, 2, 1780, 1778, 3, 2, 2, 2, 1781, 1782, 5, 344, 173, 2, 1782, 1783, 5, 352, 177, 2, 1783, 343, 3, 2, 2, 2, 1784, 1795, 5, 346, 174, 2, 1785, 1786, 5, 348, 175, 2, 1786, 1787, 5, 346, 174, 2, 1787, 1795, 3, 2, 2, 2, 1788, 1789, 5, 348, 175, 2, 1789, 1790, 7, 75, 2, 2, 1790, 1791, 5, 346, 174, 2, 1791, 1795, 3, 2, 2, 2, 1792, 1793, 7, 75, 2, 2, 1793, 1795, 5, 346, 174, 2, 1794, 1784, 3, 2, 2, 2, 1794, 1785, 3, 2, 2, 2, 1794, 1788, 3, 2, 2, 2, 1794, 1792, 3, 2, 2, 2, 1795, 345, 3, 2, 2, 2, 1796, 1797, 5, 392, 197, 2, 1797, 347, 3, 2, 2, 2, 1798, 1799, 9, 10, 2, 2, 1799, 349, 3, 2, 2, 2, 1800, 1804, 3, 2, 2, 2, 1801, 1802, 7, 231, 2, 2, 1802, 1804, 5, 346, 174, 2, 1803, 1800, 3, 2, 2, 2, 1803, 1801, 3, 2, 2, 2, 1804, 351, 3, 2, 2, 2, 1805, 1811, 3, 2, 2, 2, 1806, 1811, 5, 354, 178, 2, 1807, 1808, 5, 354, 178, 2, 1808, 1809, 5, 354, 178, 2, 1809, 1811, 3, 2, 2, 2, 1810, 1805, 3, 2, 2, 2, 1810, 1806, 3, 2, 2, 2, 1810, 1807, 3, 2, 2, 2, 1811, 353, 3, 2, 2, 2, 1812, 1813, 9, 11, 2, 2, 1813, 355, 3, 2, 2, 2, 1814, 1815, 7, 77, 2, 2, 1815, 1816, 7, 169, 2, 2, 1816, 1817, 7, 113, 2, 2, 1817, 1818, 7, 154, 2, 2, 1818, 1819, 5, 324, 163, 2, 1819, 1820, 5, 332, 167, 2, 1820, 1836, 3, 2, 2, 2, 1821, 1822, 7, 77, 2, 2, 1822, 1823, 7, 113, 2, 2, 1823, 1824, 5, 326, 164, 2, 1824, 1825, 7, 9, 2, 2, 1825, 1826, 5, 320, 161, 2, 1826, 1827, 5, 332, 167, 2, 1827, 1836, 3, 2, 2, 2, 1828, 1829, 7, 77, 2, 2, 1829, 1830, 7, 113, 2, 2, 1830, 1831, 5, 320, 161, 2, 1831, 1832, 7, 154, 2, 2, 1832, 1833, 5, 324, 163, 2, 1833, 1834, 5, 332, 167, 2, 1834, 1836, 3, 2, 2, 2, 1835, 1814, 3, 2, 2, 2, 1835, 1821, 3, 2, 2, 2, 1835, 1828, 3, 2, 2, 2, 1836, 357, 3, 2, 2, 2, 1837, 1838, 7, 36, 2, 2, 1838, 1839, 7, 113, 2, 2, 1839, 1840, 5, 326, 164, 2, 1840, 1841, 7, 9, 2, 2, 1841, 1842, 5, 320, 161, 2, 1842, 1843, 5, 332, 167, 2, 1843, 1844, 5, 338, 170, 2, 1844, 1854, 3, 2, 2, 2, 1845, 1846, 7, 36, 2, 2, 1846, 1847, 7, 113, 2, 2, 1847, 1848, 5, 320, 161, 2, 1848, 1849, 7, 154, 2, 2, 1849, 1850, 5, 324, 163, 2, 1850, 1851, 5, 332, 167, 2, 1851, 1852, 5, 338, 170, 2, 1852, 1854, 3, 2, 2, 2, 1853, 1837, 3, 2, 2, 2, 1853, 1845, 3, 2, 2, 2, 1854, 359, 3, 2, 2, 2, 1855, 1856, 7, 50, 2, 2, 1856, 1857, 7, 113, 2, 2, 1857, 1858, 7, 154, 2, 2, 1858, 1859, 5, 324, 163, 2, 1859, 1860, 7, 23, 2, 2, 1860, 1861, 5, 416, 209, 2, 1861, 1862, 7, 24, 2, 2, 1862, 1863, 5, 332, 167, 2, 1863, 361, 3, 2, 2, 2, 1864, 1865, 7, 64, 2, 2, 1865, 1866, 5, 364, 183, 2, 1866, 1867, 7, 99, 2, 2, 1867, 1868, 5, 366, 184, 2, 1868, 1869, 7, 23, 2, 2, 1869, 1870, 5, 372, 187, 2, 1870, 1871, 7, 24, 2, 2, 1871, 1872, 5, 376, 189, 2, 1872, 363, 3, 2, 2, 2, 1873, 1877, 3, 2, 2, 2, 1874, 1875, 7, 157, 2, 2, 1875, 1877, 7, 181, 2, 2, 1876, 1873, 3, 2, 2, 2, 1876, 1874, 3, 2, 2, 2, 1877, 365, 3, 2, 2, 2, 1878, 1881, 5, 368, 185, 2, 1879, 1881, 5, 370, 186, 2, 1880, 1878, 3, 2, 2, 2, 1880, 1879, 3, 2, 2, 2, 1881, 367, 3, 2, 2, 2, 1882, 1883, 5, 110, 56, 2, 1883, 369, 3, 2, 2, 2, 1884, 1885, 5, 102, 52, 2, 1885, 1886, 5, 110, 56, 2, 1886, 1895, 3, 2, 2, 2, 1887, 1888, 5, 102, 52, 2, 1888, 1889, 5, 106, 54, 2, 1889, 1890, 7, 9, 2, 2, 1890, 1891, 5, 108, 55, 2, 1891, 1892, 7, 9, 2, 2, 1892, 1893, 5, 110, 56, 2, 1893, 1895, 3, 2, 2, 2, 1894, 1884, 3, 2, 2, 2, 1894, 1887, 3, 2, 2, 2, 1895, 371, 3, 2, 2, 2, 1896, 1902, 3, 2, 2, 2, 1897, 1898, 7, 9, 2, 2, 1898, 1899, 7, 9, 2, 2, 1899, 1902, 7, 9, 2, 2, 1900, 1902, 5, 374, 188, 2, 1901, 1896, 3, 2, 2, 2, 1901, 1897, 3, 2, 2, 2, 1901, 1900, 3, 2, 2, 2, 1902, 373, 3, 2, 2, 2, 1903, 1904, 8, 188, 1, 2, 1904, 1905, 7, 239, 2, 2, 1905, 1911, 3, 2, 2, 2, 1906, 1907, 12, 3, 2, 2, 1907, 1908, 7, 27, 2, 2, 1908, 1910, 7, 239, 2, 2, 1909, 1906, 3, 2, 2, 2, 1910, 1913, 3, 2, 2, 2, 1911, 1909, 3, 2, 2, 2, 1911, 1912, 3, 2, 2, 2, 1912, 375, 3, 2, 2, 2, 1913, 1911, 3, 2, 2, 2, 1914, 1915, 7, 25, 2, 2, 1915, 1916, 5, 392, 197, 2, 1916, 1917, 7, 26, 2, 2, 1917, 1935, 3, 2, 2, 2, 1918, 1919, 7, 128, 2, 2, 1919, 1920, 7, 115, 2, 2, 1920, 1921, 7, 41, 2, 2, 1921, 1935, 5, 392, 197, 2, 1922, 1923, 7, 128, 2, 2, 1923, 1924, 7, 100, 2, 2, 1924, 1925, 7, 41, 2, 2, 1925, 1926, 7, 3, 2, 2, 1926, 1927, 7, 43, 2, 2, 1927, 1935, 7, 3, 2, 2, 1928, 1929, 7, 128, 2, 2, 1929, 1930, 7, 122, 2, 2, 1930, 1931, 7, 41, 2, 2, 1931, 1932, 7, 3, 2, 2, 1932, 1933, 7, 43, 2, 2, 1933, 1935, 7, 3, 2, 2, 1934, 1914, 3, 2, 2, 2, 1934, 1918, 3, 2, 2, 2, 1934, 1922, 3, 2, 2, 2, 1934, 1928, 3, 2, 2, 2, 1935, 377, 3, 2, 2, 2, 1936, 1937, 7, 77, 2, 2, 1937, 1938, 7, 99, 2, 2, 1938, 1939, 5, 366, 184, 2, 1939, 379, 3, 2, 2, 2, 1940, 1941, 7, 85, 2, 2, 1941, 1942, 7, 99, 2, 2, 1942, 1943, 5, 366, 184, 2, 1943, 1944, 7, 23, 2, 2, 1944, 1945, 5, 414, 208, 2, 1945, 1946, 7, 24, 2, 2, 1946, 381, 3, 2, 2, 2, 1947, 1948, 7, 219, 2, 2, 1948, 1949, 7, 201, 2, 2, 1949, 1950, 5, 384, 193, 2, 1950, 1951, 5, 324, 163, 2, 1951, 1952, 7, 23, 2, 2, 1952, 1953, 5, 386, 194, 2, 1953, 1954, 7, 24, 2, 2, 1954, 1955, 5, 36, 19, 2, 1955, 2070, 3, 2, 2, 2, 1956, 1957, 7, 219, 2, 2, 1957, 1958, 7, 201, 2, 2, 1958, 1959, 5, 384, 193, 2, 1959, 1960, 5, 324, 163, 2, 1960, 1961, 7, 71, 2, 2, 1961, 1962, 7, 23, 2, 2, 1962, 1963, 5, 386, 194, 2, 1963, 1964, 7, 24, 2, 2, 1964, 2070, 3, 2, 2, 2, 1965, 1966, 7, 219, 2, 2, 1966, 1967, 7, 201, 2, 2, 1967, 1968, 5, 384, 193, 2, 1968, 1969, 5, 324, 163, 2, 1969, 1970, 7, 71, 2, 2, 1970, 1971, 7, 35, 2, 2, 1971, 2070, 3, 2, 2, 2, 1972, 1973, 7, 219, 2, 2, 1973, 1974, 7, 201, 2, 2, 1974, 1975, 5, 384, 193, 2, 1975, 1976, 5, 324, 163, 2, 1976, 1977, 7, 113, 2, 2, 1977, 1978, 7, 23, 2, 2, 1978, 1979, 5, 416, 209, 2, 1979, 1980, 7, 24, 2, 2, 1980, 1981, 5, 332, 167, 2, 1981, 1982, 5, 36, 19, 2, 1982, 2070, 3, 2, 2, 2, 1983, 1984, 7, 219, 2, 2, 1984, 1985, 7, 201, 2, 2, 1985, 1986, 5, 384, 193, 2, 1986, 1987, 5, 324, 163, 2, 1987, 1988, 7, 113, 2, 2, 1988, 1989, 7, 35, 2, 2, 1989, 1990, 5, 332, 167, 2, 1990, 1991, 5, 36, 19, 2, 1991, 2070, 3, 2, 2, 2, 1992, 1993, 7, 219, 2, 2, 1993, 1994, 7, 201, 2, 2, 1994, 1995, 7, 95, 2, 2, 1995, 1996, 7, 113, 2, 2, 1996, 1997, 5, 326, 164, 2, 1997, 1998, 7, 9, 2, 2, 1998, 1999, 5, 320, 161, 2, 1999, 2000, 5, 332, 167, 2, 2000, 2001, 5, 36, 19, 2, 2001, 2070, 3, 2, 2, 2, 2002, 2003, 7, 219, 2, 2, 2003, 2004, 7, 201, 2, 2, 2004, 2005, 7, 95, 2, 2, 2005, 2006, 7, 113, 2, 2, 2006, 2007, 5, 320, 161, 2, 2007, 2008, 7, 154, 2, 2, 2008, 2009, 5, 324, 163, 2, 2009, 2010, 5, 332, 167, 2, 2010, 2011, 5, 36, 19, 2, 2011, 2070, 3, 2, 2, 2, 2012, 2013, 7, 37, 2, 2, 2013, 2014, 5, 32, 17, 2, 2014, 2015, 5, 324, 163, 2, 2015, 2016, 7, 23, 2, 2, 2016, 2017, 5, 386, 194, 2, 2017, 2018, 7, 24, 2, 2, 2018, 2019, 5, 36, 19, 2, 2019, 2070, 3, 2, 2, 2, 2020, 2021, 7, 37, 2, 2, 2021, 2022, 5, 32, 17, 2, 2022, 2023, 5, 324, 163, 2, 2023, 2024, 7, 71, 2, 2, 2024, 2025, 7, 201, 2, 2, 2025, 2026, 7, 23, 2, 2, 2026, 2027, 5, 386, 194, 2, 2027, 2028, 7, 24, 2, 2, 2028, 2070, 3, 2, 2, 2, 2029, 2030, 7, 37, 2, 2, 2030, 2031, 5, 32, 17, 2, 2031, 2032, 5, 324, 163, 2, 2032, 2033, 7, 71, 2, 2, 2033, 2034, 7, 201, 2, 2, 2034, 2070, 3, 2, 2, 2, 2035, 2036, 7, 37, 2, 2, 2036, 2037, 5, 32, 17, 2, 2037, 2038, 5, 324, 163, 2, 2038, 2039, 7, 113, 2, 2, 2039, 2040, 7, 23, 2, 2, 2040, 2041, 5, 416, 209, 2, 2041, 2042, 7, 24, 2, 2, 2042, 2043, 5, 332, 167, 2, 2043, 2044, 5, 36, 19, 2, 2044, 2070, 3, 2, 2, 2, 2045, 2046, 7, 37, 2, 2, 2046, 2047, 5, 32, 17, 2, 2047, 2048, 5, 324, 163, 2, 2048, 2049, 7, 113, 2, 2, 2049, 2050, 7, 35, 2, 2, 2050, 2051, 5, 332, 167, 2, 2051, 2052, 5, 36, 19, 2, 2052, 2070, 3, 2, 2, 2, 2053, 2054, 7, 37, 2, 2, 2054, 2055, 7, 113, 2, 2, 2055, 2056, 5, 326, 164, 2, 2056, 2057, 7, 9, 2, 2, 2057, 2058, 5, 320, 161, 2, 2058, 2059, 5, 332, 167, 2, 2059, 2060, 5, 36, 19, 2, 2060, 2070, 3, 2, 2, 2, 2061, 2062, 7, 37, 2, 2, 2062, 2063, 7, 113, 2, 2, 2063, 2064, 5, 320, 161, 2, 2064, 2065, 7, 154, 2, 2, 2065, 2066, 5, 324, 163, 2, 2066, 2067, 5, 332, 167, 2, 2067, 2068, 5, 36, 19, 2, 2068, 2070, 3, 2, 2, 2, 2069, 1947, 3, 2, 2, 2, 2069, 1956, 3, 2, 2, 2, 2069, 1965, 3, 2, 2, 2, 2069, 1972, 3, 2, 2, 2, 2069, 1983, 3, 2, 2, 2, 2069, 1992, 3, 2, 2, 2, 2069, 2002, 3, 2, 2, 2, 2069, 2012, 3, 2, 2, 2, 2069, 2020, 3, 2, 2, 2, 2069, 2029, 3, 2, 2, 2, 2069, 2035, 3, 2, 2, 2, 2069, 2045, 3, 2, 2, 2, 2069, 2053, 3, 2, 2, 2, 2069, 2061, 3, 2, 2, 2, 2070, 383, 3, 2, 2, 2, 2071, 2074, 3, 2, 2, 2, 2072, 2074, 7, 95, 2, 2, 2073, 2071, 3, 2, 2, 2, 2073, 2072, 3, 2, 2, 2, 2074, 385, 3, 2, 2, 2, 2075, 2076, 8, 194, 1, 2, 2076, 2077, 5, 388, 195, 2, 2077, 2083, 3, 2, 2, 2, 2078, 2079, 12, 3, 2, 2, 2079, 2080, 7, 27, 2, 2, 2080, 2082, 5, 388, 195, 2, 2081, 2078, 3, 2, 2, 2, 2082, 2085, 3, 2, 2, 2, 2083, 2081, 3, 2, 2, 2, 2083, 2084, 3, 2, 2, 2, 2084, 387, 3, 2, 2, 2, 2085, 2083, 3, 2, 2, 2, 2086, 2087, 5, 344, 173, 2, 2087, 389, 3, 2, 2, 2, 2088, 2089, 8, 196, 1, 2, 2089, 2090, 7, 239, 2, 2, 2090, 2116, 3, 2, 2, 2, 2091, 2092, 12, 7, 2, 2, 2092, 2093, 7, 9, 2, 2, 2093, 2115, 7, 239, 2, 2, 2094, 2095, 12, 6, 2, 2, 2095, 2096, 7, 9, 2, 2, 2096, 2115, 7, 238, 2, 2, 2097, 2098, 12, 5, 2, 2, 2098, 2099, 7, 9, 2, 2, 2099, 2100, 7, 29, 2, 2, 2100, 2101, 5, 392, 197, 2, 2101, 2102, 7, 30, 2, 2, 2102, 2115, 3, 2, 2, 2, 2103, 2104, 12, 4, 2, 2, 2104, 2105, 7, 9, 2, 2, 2105, 2106, 7, 29, 2, 2, 2106, 2107, 5, 392, 197, 2, 2107, 2108, 7, 31, 2, 2, 2108, 2115, 3, 2, 2, 2, 2109, 2110, 12, 3, 2, 2, 2110, 2111, 7, 29, 2, 2, 2111, 2112, 5, 392, 197, 2, 2112, 2113, 7, 30, 2, 2, 2113, 2115, 3, 2, 2, 2, 2114, 2091, 3, 2, 2, 2, 2114, 2094, 3, 2, 2, 2, 2114, 2097, 3, 2, 2, 2, 2114, 2103, 3, 2, 2, 2, 2114, 2109, 3, 2, 2, 2, 2115, 2118, 3, 2, 2, 2, 2116, 2114, 3, 2, 2, 2, 2116, 2117, 3, 2, 2, 2, 2117, 391, 3, 2, 2, 2, 2118, 2116, 3, 2, 2, 2, 2119, 2120, 8, 197, 1, 2, 2120, 2126, 5, 396, 199, 2, 2121, 2122, 7, 147, 2, 2, 2122, 2126, 5, 392, 197, 25, 2123, 2124, 7, 86, 2, 2, 2124, 2126, 5, 392, 197, 3, 2125, 2119, 3, 2, 2, 2, 2125, 2121, 3, 2, 2, 2, 2125, 2123, 3, 2, 2, 2, 2126, 2269, 3, 2, 2, 2, 2127, 2128, 12, 33, 2, 2, 2128, 2129, 7, 10, 2, 2, 2129, 2268, 5, 392, 197, 34, 2130, 2131, 12, 32, 2, 2, 2131, 2132, 7, 11, 2, 2, 2132, 2268, 5, 392, 197, 33, 2133, 2134, 12, 31, 2, 2, 2134, 2135, 7, 12, 2, 2, 2135, 2268, 5, 392, 197, 32, 2136, 2137, 12, 30, 2, 2, 2137, 2138, 7, 13, 2, 2, 2138, 2268, 5, 392, 197, 31, 2139, 2140, 12, 29, 2, 2, 2140, 2141, 7, 14, 2, 2, 2141, 2268, 5, 392, 197, 30, 2142, 2143, 12, 28, 2, 2, 2143, 2144, 7, 22, 2, 2, 2144, 2268, 5, 392, 197, 29, 2145, 2146, 12, 27, 2, 2, 2146, 2147, 7, 38, 2, 2, 2147, 2268, 5, 392, 197, 28, 2148, 2149, 12, 26, 2, 2, 2149, 2150, 7, 157, 2, 2, 2150, 2268, 5, 392, 197, 27, 2151, 2152, 12, 24, 2, 2, 2152, 2153, 7, 16, 2, 2, 2153, 2268, 5, 392, 197, 25, 2154, 2155, 12, 23, 2, 2, 2155, 2156, 7, 15, 2, 2, 2156, 2268, 5, 392, 197, 24, 2157, 2158, 12, 22, 2, 2, 2158, 2159, 7, 17, 2, 2, 2159, 2268, 5, 392, 197, 23, 2160, 2161, 12, 21, 2, 2, 2161, 2162, 7, 18, 2, 2, 2162, 2268, 5, 392, 197, 22, 2163, 2164, 12, 20, 2, 2, 2164, 2165, 7, 20, 2, 2, 2165, 2268, 5, 392, 197, 21, 2166, 2167, 12, 19, 2, 2, 2167, 2168, 7, 19, 2, 2, 2168, 2268, 5, 392, 197, 20, 2169, 2170, 12, 18, 2, 2, 2170, 2171, 7, 21, 2, 2, 2171, 2268, 5, 392, 197, 19, 2172, 2173, 12, 15, 2, 2, 2173, 2174, 7, 134, 2, 2, 2174, 2268, 5, 392, 197, 16, 2175, 2176, 12, 14, 2, 2, 2176, 2177, 7, 147, 2, 2, 2177, 2178, 7, 134, 2, 2, 2178, 2268, 5, 392, 197, 15, 2179, 2180, 12, 13, 2, 2, 2180, 2181, 7, 110, 2, 2, 2181, 2268, 5, 392, 197, 14, 2182, 2183, 12, 12, 2, 2, 2183, 2184, 7, 147, 2, 2, 2184, 2185, 7, 110, 2, 2, 2185, 2268, 5, 392, 197, 13, 2186, 2187, 12, 11, 2, 2, 2187, 2188, 7, 235, 2, 2, 2188, 2268, 5, 392, 197, 12, 2189, 2190, 12, 10, 2, 2, 2190, 2191, 7, 147, 2, 2, 2191, 2192, 7, 235, 2, 2, 2192, 2268, 5, 392, 197, 11, 2193, 2194, 12, 41, 2, 2, 2194, 2195, 7, 9, 2, 2, 2195, 2268, 7, 239, 2, 2, 2196, 2197, 12, 40, 2, 2, 2197, 2198, 7, 9, 2, 2, 2198, 2268, 7, 238, 2, 2, 2199, 2200, 12, 39, 2, 2, 2200, 2201, 7, 9, 2, 2, 2201, 2202, 7, 29, 2, 2, 2202, 2203, 5, 392, 197, 2, 2203, 2204, 7, 30, 2, 2, 2204, 2268, 3, 2, 2, 2, 2205, 2206, 12, 38, 2, 2, 2206, 2207, 7, 9, 2, 2, 2207, 2208, 7, 29, 2, 2, 2208, 2209, 5, 392, 197, 2, 2209, 2210, 7, 31, 2, 2, 2210, 2268, 3, 2, 2, 2, 2211, 2212, 12, 37, 2, 2, 2212, 2213, 7, 29, 2, 2, 2213, 2214, 5, 392, 197, 2, 2214, 2215, 7, 30, 2, 2, 2215, 2268, 3, 2, 2, 2, 2216, 2217, 12, 36, 2, 2, 2217, 2218, 7, 29, 2, 2, 2218, 2219, 5, 392, 197, 2, 2219, 2220, 7, 28, 2, 2, 2220, 2221, 7, 30, 2, 2, 2221, 2268, 3, 2, 2, 2, 2222, 2223, 12, 35, 2, 2, 2223, 2224, 7, 29, 2, 2, 2224, 2225, 5, 392, 197, 2, 2225, 2226, 7, 28, 2, 2, 2226, 2227, 5, 392, 197, 2, 2227, 2228, 7, 30, 2, 2, 2228, 2268, 3, 2, 2, 2, 2229, 2230, 12, 34, 2, 2, 2230, 2231, 7, 29, 2, 2, 2231, 2232, 7, 12, 2, 2, 2232, 2268, 7, 30, 2, 2, 2233, 2234, 12, 17, 2, 2, 2234, 2235, 7, 45, 2, 2, 2235, 2236, 5, 398, 200, 2, 2236, 2237, 7, 38, 2, 2, 2237, 2238, 5, 398, 200, 2, 2238, 2268, 3, 2, 2, 2, 2239, 2240, 12, 16, 2, 2, 2240, 2241, 7, 147, 2, 2, 2241, 2242, 7, 45, 2, 2, 2242, 2243, 5, 398, 200, 2, 2243, 2244, 7, 38, 2, 2, 2244, 2245, 5, 398, 200, 2, 2245, 2268, 3, 2, 2, 2, 2246, 2247, 12, 9, 2, 2, 2247, 2248, 7, 120, 2, 2, 2248, 2268, 7, 149, 2, 2, 2249, 2250, 12, 8, 2, 2, 2250, 2251, 7, 120, 2, 2, 2251, 2252, 7, 147, 2, 2, 2252, 2268, 7, 149, 2, 2, 2253, 2254, 12, 7, 2, 2, 2254, 2255, 7, 120, 2, 2, 2255, 2268, 7, 142, 2, 2, 2256, 2257, 12, 6, 2, 2, 2257, 2258, 7, 120, 2, 2, 2258, 2259, 7, 147, 2, 2, 2259, 2268, 7, 142, 2, 2, 2260, 2261, 12, 5, 2, 2, 2261, 2262, 7, 120, 2, 2, 2262, 2268, 5, 394, 198, 2, 2263, 2264, 12, 4, 2, 2, 2264, 2265, 7, 120, 2, 2, 2265, 2266, 7, 147, 2, 2, 2266, 2268, 5, 394, 198, 2, 2267, 2127, 3, 2, 2, 2, 2267, 2130, 3, 2, 2, 2, 2267, 2133, 3, 2, 2, 2, 2267, 2136, 3, 2, 2, 2, 2267, 2139, 3, 2, 2, 2, 2267, 2142, 3, 2, 2, 2, 2267, 2145, 3, 2, 2, 2, 2267, 2148, 3, 2, 2, 2, 2267, 2151, 3, 2, 2, 2, 2267, 2154, 3, 2, 2, 2, 2267, 2157, 3, 2, 2, 2, 2267, 2160, 3, 2, 2, 2, 2267, 2163, 3, 2, 2, 2, 2267, 2166, 3, 2, 2, 2, 2267, 2169, 3, 2, 2, 2, 2267, 2172, 3, 2, 2, 2, 2267, 2175, 3, 2, 2, 2, 2267, 2179, 3, 2, 2, 2, 2267, 2182, 3, 2, 2, 2, 2267, 2186, 3, 2, 2, 2, 2267, 2189, 3, 2, 2, 2, 2267, 2193, 3, 2, 2, 2, 2267, 2196, 3, 2, 2, 2, 2267, 2199, 3, 2, 2, 2, 2267, 2205, 3, 2, 2, 2, 2267, 2211, 3, 2, 2, 2, 2267, 2216, 3, 2, 2, 2, 2267, 2222, 3, 2, 2, 2, 2267, 2229, 3, 2, 2, 2, 2267, 2233, 3, 2, 2, 2, 2267, 2239, 3, 2, 2, 2, 2267, 2246, 3, 2, 2, 2, 2267, 2249, 3, 2, 2, 2, 2267, 2253, 3, 2, 2, 2, 2267, 2256, 3, 2, 2, 2, 2267, 2260, 3, 2, 2, 2, 2267, 2263, 3, 2, 2, 2, 2268, 2271, 3, 2, 2, 2, 2269, 2267, 3, 2, 2, 2, 2269, 2270, 3, 2, 2, 2, 2270, 393, 3, 2, 2, 2, 2271, 2269, 3, 2, 2, 2, 2272, 2273, 9, 12, 2, 2, 2273, 395, 3, 2, 2, 2, 2274, 2291, 5, 400, 201, 2, 2275, 2291, 5, 402, 202, 2, 2276, 2291, 7, 239, 2, 2, 2277, 2291, 7, 238, 2, 2, 2278, 2291, 7, 196, 2, 2, 2279, 2291, 5, 418, 210, 2, 2280, 2291, 5, 432, 217, 2, 2281, 2291, 7, 11, 2, 2, 2282, 2291, 5, 420, 211, 2, 2283, 2291, 5, 436, 219, 2, 2284, 2291, 5, 448, 225, 2, 2285, 2286, 7, 63, 2, 2, 2286, 2287, 7, 23, 2, 2, 2287, 2288, 5, 392, 197, 2, 2288, 2289, 7, 24, 2, 2, 2289, 2291, 3, 2, 2, 2, 2290, 2274, 3, 2, 2, 2, 2290, 2275, 3, 2, 2, 2, 2290, 2276, 3, 2, 2, 2, 2290, 2277, 3, 2, 2, 2, 2290, 2278, 3, 2, 2, 2, 2290, 2279, 3, 2, 2, 2, 2290, 2280, 3, 2, 2, 2, 2290, 2281, 3, 2, 2, 2, 2290, 2282, 3, 2, 2, 2, 2290, 2283, 3, 2, 2, 2, 2290, 2284, 3, 2, 2, 2, 2290, 2285, 3, 2, 2, 2, 2291, 397, 3, 2, 2, 2, 2292, 2293, 8, 200, 1, 2, 2293, 2294, 5, 396, 199, 2, 2294, 2355, 3, 2, 2, 2, 2295, 2296, 12, 8, 2, 2, 2296, 2297, 7, 10, 2, 2, 2297, 2354, 5, 398, 200, 9, 2298, 2299, 12, 7, 2, 2, 2299, 2300, 7, 11, 2, 2, 2300, 2354, 5, 398, 200, 8, 2301, 2302, 12, 6, 2, 2, 2302, 2303, 7, 12, 2, 2, 2303, 2354, 5, 398, 200, 7, 2304, 2305, 12, 5, 2, 2, 2305, 2306, 7, 13, 2, 2, 2306, 2354, 5, 398, 200, 6, 2307, 2308, 12, 4, 2, 2, 2308, 2309, 7, 14, 2, 2, 2309, 2354, 5, 398, 200, 5, 2310, 2311, 12, 3, 2, 2, 2311, 2312, 7, 22, 2, 2, 2312, 2354, 5, 398, 200, 4, 2313, 2314, 12, 16, 2, 2, 2314, 2315, 7, 9, 2, 2, 2315, 2354, 7, 239, 2, 2, 2316, 2317, 12, 15, 2, 2, 2317, 2318, 7, 9, 2, 2, 2318, 2354, 7, 238, 2, 2, 2319, 2320, 12, 14, 2, 2, 2320, 2321, 7, 9, 2, 2, 2321, 2322, 7, 29, 2, 2, 2322, 2323, 5, 392, 197, 2, 2323, 2324, 7, 30, 2, 2, 2324, 2354, 3, 2, 2, 2, 2325, 2326, 12, 13, 2, 2, 2326, 2327, 7, 9, 2, 2, 2327, 2328, 7, 29, 2, 2, 2328, 2329, 5, 392, 197, 2, 2329, 2330, 7, 31, 2, 2, 2330, 2354, 3, 2, 2, 2, 2331, 2332, 12, 12, 2, 2, 2332, 2333, 7, 29, 2, 2, 2333, 2334, 5, 392, 197, 2, 2334, 2335, 7, 30, 2, 2, 2335, 2354, 3, 2, 2, 2, 2336, 2337, 12, 11, 2, 2, 2337, 2338, 7, 29, 2, 2, 2338, 2339, 5, 392, 197, 2, 2339, 2340, 7, 28, 2, 2, 2340, 2341, 7, 30, 2, 2, 2341, 2354, 3, 2, 2, 2, 2342, 2343, 12, 10, 2, 2, 2343, 2344, 7, 29, 2, 2, 2344, 2345, 5, 392, 197, 2, 2345, 2346, 7, 28, 2, 2, 2346, 2347, 5, 392, 197, 2, 2347, 2348, 7, 30, 2, 2, 2348, 2354, 3, 2, 2, 2, 2349, 2350, 12, 9, 2, 2, 2350, 2351, 7, 29, 2, 2, 2351, 2352, 7, 12, 2, 2, 2352, 2354, 7, 30, 2, 2, 2353, 2295, 3, 2, 2, 2, 2353, 2298, 3, 2, 2, 2, 2353, 2301, 3, 2, 2, 2, 2353, 2304, 3, 2, 2, 2, 2353, 2307, 3, 2, 2, 2, 2353, 2310, 3, 2, 2, 2, 2353, 2313, 3, 2, 2, 2, 2353, 2316, 3, 2, 2, 2, 2353, 2319, 3, 2, 2, 2, 2353, 2325, 3, 2, 2, 2, 2353, 2331, 3, 2, 2, 2, 2353, 2336, 3, 2, 2, 2, 2353, 2342, 3, 2, 2, 2, 2353, 2349, 3, 2, 2, 2, 2354, 2357, 3, 2, 2, 2, 2355, 2353, 3, 2, 2, 2, 2355, 2356, 3, 2, 2, 2, 2356, 399, 3, 2, 2, 2, 2357, 2355, 3, 2, 2, 2, 2358, 2359, 9, 13, 2, 2, 2359, 401, 3, 2, 2, 2, 2360, 2363, 5, 404, 203, 2, 2361, 2363, 5, 412, 207, 2, 2362, 2360, 3, 2, 2, 2, 2362, 2361, 3, 2, 2, 2, 2363, 403, 3, 2, 2, 2, 2364, 2365, 7, 25, 2, 2, 2365, 2366, 5, 406, 204, 2, 2366, 2367, 7, 26, 2, 2, 2367, 405, 3, 2, 2, 2, 2368, 2371, 3, 2, 2, 2, 2369, 2371, 5, 408, 205, 2, 2370, 2368, 3, 2, 2, 2, 2370, 2369, 3, 2, 2, 2, 2371, 407, 3, 2, 2, 2, 2372, 2373, 8, 205, 1, 2, 2373, 2374, 5, 410, 206, 2, 2374, 2380, 3, 2, 2, 2, 2375, 2376, 12, 3, 2, 2, 2376, 2377, 7, 27, 2, 2, 2377, 2379, 5, 410, 206, 2, 2378, 2375, 3, 2, 2, 2, 2379, 2382, 3, 2, 2, 2, 2380, 2378, 3, 2, 2, 2, 2380, 2381, 3, 2, 2, 2, 2381, 409, 3, 2, 2, 2, 2382, 2380, 3, 2, 2, 2, 2383, 2384, 5, 392, 197, 2, 2384, 2385, 7, 28, 2, 2, 2385, 2386, 5, 392, 197, 2, 2386, 2389, 3, 2, 2, 2, 2387, 2389, 5, 392, 197, 2, 2388, 2383, 3, 2, 2, 2, 2388, 2387, 3, 2, 2, 2, 2389, 411, 3, 2, 2, 2, 2390, 2391, 7, 29, 2, 2, 2391, 2392, 5, 414, 208, 2, 2392, 2393, 7, 30, 2, 2, 2393, 413, 3, 2, 2, 2, 2394, 2397, 3, 2, 2, 2, 2395, 2397, 5, 416, 209, 2, 2396, 2394, 3, 2, 2, 2, 2396, 2395, 3, 2, 2, 2, 2397, 415, 3, 2, 2, 2, 2398, 2399, 8, 209, 1, 2, 2399, 2400, 5, 392, 197, 2, 2400, 2406, 3, 2, 2, 2, 2401, 2402, 12, 3, 2, 2, 2402, 2403, 7, 27, 2, 2, 2403, 2405, 5, 392, 197, 2, 2404, 2401, 3, 2, 2, 2, 2405, 2408, 3, 2, 2, 2, 2406, 2404, 3, 2, 2, 2, 2406, 2407, 3, 2, 2, 2, 2407, 417, 3, 2, 2, 2, 2408, 2406, 3, 2, 2, 2, 2409, 2410, 9, 14, 2, 2, 2410, 419, 3, 2, 2, 2, 2411, 2412, 7, 53, 2, 2, 2412, 2413, 5, 422, 212, 2, 2413, 2414, 7, 81, 2, 2, 2414, 421, 3, 2, 2, 2, 2415, 2418, 5, 424, 213, 2, 2416, 2418, 5, 428, 215, 2, 2417, 2415, 3, 2, 2, 2, 2417, 2416, 3, 2, 2, 2, 2418, 423, 3, 2, 2, 2, 2419, 2420, 5, 392, 197, 2, 2420, 2421, 5, 426, 214, 2, 2421, 2422, 5, 430, 216, 2, 2422, 425, 3, 2, 2, 2, 2423, 2424, 8, 214, 1, 2, 2424, 2425, 7, 230, 2, 2, 2425, 2426, 5, 392, 197, 2, 2426, 2427, 7, 204, 2, 2, 2427, 2428, 5, 392, 197, 2, 2428, 2437, 3, 2, 2, 2, 2429, 2430, 12, 3, 2, 2, 2430, 2431, 7, 230, 2, 2, 2431, 2432, 5, 392, 197, 2, 2432, 2433, 7, 204, 2, 2, 2433, 2434, 5, 392, 197, 2, 2434, 2436, 3, 2, 2, 2, 2435, 2429, 3, 2, 2, 2, 2436, 2439, 3, 2, 2, 2, 2437, 2435, 3, 2, 2, 2, 2437, 2438, 3, 2, 2, 2, 2438, 427, 3, 2, 2, 2, 2439, 2437, 3, 2, 2, 2, 2440, 2441, 5, 426, 214, 2, 2441, 2442, 5, 430, 216, 2, 2442, 429, 3, 2, 2, 2, 2443, 2447, 3, 2, 2, 2, 2444, 2445, 7, 80, 2, 2, 2445, 2447, 5, 392, 197, 2, 2446, 2443, 3, 2, 2, 2, 2446, 2444, 3, 2, 2, 2, 2447, 431, 3, 2, 2, 2, 2448, 2449, 7, 148, 2, 2, 2449, 2450, 7, 23, 2, 2, 2450, 2451, 5, 416, 209, 2, 2451, 2452, 7, 24, 2, 2, 2452, 2453, 5, 484, 243, 2, 2453, 2454, 5, 480, 241, 2, 2454, 2455, 5, 492, 247, 2, 2455, 2485, 3, 2, 2, 2, 2456, 2457, 5, 434, 218, 2, 2457, 2458, 7, 23, 2, 2, 2458, 2459, 5, 414, 208, 2, 2459, 2460, 7, 24, 2, 2, 2460, 2461, 5, 488, 245, 2, 2461, 2462, 5, 480, 241, 2, 2462, 2463, 5, 490, 246, 2, 2463, 2485, 3, 2, 2, 2, 2464, 2465, 5, 434, 218, 2, 2465, 2466, 7, 23, 2, 2, 2466, 2467, 5, 486, 244, 2, 2467, 2468, 5, 392, 197, 2, 2468, 2469, 7, 24, 2, 2, 2469, 2470, 5, 488, 245, 2, 2470, 2471, 5, 490, 246, 2, 2471, 2485, 3, 2, 2, 2, 2472, 2473, 5, 434, 218, 2, 2473, 2474, 7, 23, 2, 2, 2474, 2475, 7, 12, 2, 2, 2475, 2476, 7, 24, 2, 2, 2476, 2477, 5, 488, 245, 2, 2477, 2478, 5, 490, 246, 2, 2478, 2485, 3, 2, 2, 2, 2479, 2480, 5, 370, 186, 2, 2480, 2481, 7, 23, 2, 2, 2481, 2482, 5, 414, 208, 2, 2482, 2483, 7, 24, 2, 2, 2483, 2485, 3, 2, 2, 2, 2484, 2448, 3, 2, 2, 2, 2484, 2456, 3, 2, 2, 2, 2484, 2464, 3, 2, 2, 2, 2484, 2472, 3, 2, 2, 2, 2484, 2479, 3, 2, 2, 2, 2485, 433, 3, 2, 2, 2, 2486, 2487, 9, 15, 2, 2, 2487, 435, 3, 2, 2, 2, 2488, 2491, 5, 438, 220, 2, 2489, 2491, 5, 446, 224, 2, 2490, 2488, 3, 2, 2, 2, 2490, 2489, 3, 2, 2, 2, 2491, 437, 3, 2, 2, 2, 2492, 2493, 7, 39, 2, 2, 2493, 2494, 5, 440, 221, 2, 2494, 2495, 5, 444, 223, 2, 2495, 2496, 7, 81, 2, 2, 2496, 2522, 3, 2, 2, 2, 2497, 2498, 7, 199, 2, 2, 2498, 2499, 5, 440, 221, 2, 2499, 2500, 5, 444, 223, 2, 2500, 2501, 7, 81, 2, 2, 2501, 2522, 3, 2, 2, 2, 2502, 2503, 7, 82, 2, 2, 2503, 2504, 5, 440, 221, 2, 2504, 2505, 5, 444, 223, 2, 2505, 2506, 7, 81, 2, 2, 2506, 2522, 3, 2, 2, 2, 2507, 2508, 7, 39, 2, 2, 2508, 2509, 7, 38, 2, 2, 2509, 2510, 7, 82, 2, 2, 2510, 2511, 5, 440, 221, 2, 2511, 2512, 5, 444, 223, 2, 2512, 2513, 7, 81, 2, 2, 2513, 2522, 3, 2, 2, 2, 2514, 2515, 7, 199, 2, 2, 2515, 2516, 7, 38, 2, 2, 2516, 2517, 7, 82, 2, 2, 2517, 2518, 5, 440, 221, 2, 2518, 2519, 5, 444, 223, 2, 2519, 2520, 7, 81, 2, 2, 2520, 2522, 3, 2, 2, 2, 2521, 2492, 3, 2, 2, 2, 2521, 2497, 3, 2, 2, 2, 2521, 2502, 3, 2, 2, 2, 2521, 2507, 3, 2, 2, 2, 2521, 2514, 3, 2, 2, 2, 2522, 439, 3, 2, 2, 2, 2523, 2524, 8, 221, 1, 2, 2524, 2525, 5, 442, 222, 2, 2525, 2531, 3, 2, 2, 2, 2526, 2527, 12, 3, 2, 2, 2527, 2528, 7, 27, 2, 2, 2528, 2530, 5, 442, 222, 2, 2529, 2526, 3, 2, 2, 2, 2530, 2533, 3, 2, 2, 2, 2531, 2529, 3, 2, 2, 2, 2531, 2532, 3, 2, 2, 2, 2532, 441, 3, 2, 2, 2, 2533, 2531, 3, 2, 2, 2, 2534, 2535, 5, 258, 130, 2, 2535, 2536, 7, 110, 2, 2, 2536, 2537, 5, 392, 197, 2, 2537, 2555, 3, 2, 2, 2, 2538, 2539, 5, 258, 130, 2, 2539, 2540, 7, 235, 2, 2, 2540, 2541, 5, 392, 197, 2, 2541, 2555, 3, 2, 2, 2, 2542, 2543, 5, 258, 130, 2, 2543, 2544, 7, 28, 2, 2, 2544, 2545, 5, 258, 130, 2, 2545, 2546, 7, 110, 2, 2, 2546, 2547, 5, 392, 197, 2, 2547, 2555, 3, 2, 2, 2, 2548, 2549, 5, 258, 130, 2, 2549, 2550, 7, 28, 2, 2, 2550, 2551, 5, 258, 130, 2, 2551, 2552, 7, 235, 2, 2, 2552, 2553, 5, 392, 197, 2, 2553, 2555, 3, 2, 2, 2, 2554, 2534, 3, 2, 2, 2, 2554, 2538, 3, 2, 2, 2, 2554, 2542, 3, 2, 2, 2, 2554, 2548, 3, 2, 2, 2, 2555, 443, 3, 2, 2, 2, 2556, 2557, 7, 191, 2, 2, 2557, 2558, 5, 392, 197, 2, 2558, 445, 3, 2, 2, 2, 2559, 2560, 7, 40, 2, 2, 2560, 2561, 5, 392, 197, 2, 2561, 2562, 7, 95, 2, 2, 2562, 2563, 5, 440, 221, 2, 2563, 2564, 5, 260, 131, 2, 2564, 2565, 7, 81, 2, 2, 2565, 2583, 3, 2, 2, 2, 2566, 2567, 7, 91, 2, 2, 2567, 2568, 5, 392, 197, 2, 2568, 2569, 7, 95, 2, 2, 2569, 2570, 5, 440, 221, 2, 2570, 2571, 5, 260, 131, 2, 2571, 2572, 7, 81, 2, 2, 2572, 2583, 3, 2, 2, 2, 2573, 2574, 7, 152, 2, 2, 2574, 2575, 5, 392, 197, 2, 2575, 2576, 7, 28, 2, 2, 2576, 2577, 5, 392, 197, 2, 2577, 2578, 7, 95, 2, 2, 2578, 2579, 5, 440, 221, 2, 2579, 2580, 5, 260, 131, 2, 2580, 2581, 7, 81, 2, 2, 2581, 2583, 3, 2, 2, 2, 2582, 2559, 3, 2, 2, 2, 2582, 2566, 3, 2, 2, 2, 2582, 2573, 3, 2, 2, 2, 2583, 447, 3, 2, 2, 2, 2584, 2585, 7, 23, 2, 2, 2585, 2586, 5, 392, 197, 2, 2586, 2587, 7, 24, 2, 2, 2587, 2594, 3, 2, 2, 2, 2588, 2589, 7, 23, 2, 2, 2589, 2590, 5, 454, 228, 2, 2590, 2591, 7, 24, 2, 2, 2591, 2594, 3, 2, 2, 2, 2592, 2594, 5, 450, 226, 2, 2593, 2584, 3, 2, 2, 2, 2593, 2588, 3, 2, 2, 2, 2593, 2592, 3, 2, 2, 2, 2594, 449, 3, 2, 2, 2, 2595, 2596, 7, 62, 2, 2, 2596, 2597, 7, 23, 2, 2, 2597, 2598, 5, 58, 30, 2, 2598, 2599, 7, 24, 2, 2, 2599, 2605, 3, 2, 2, 2, 2600, 2601, 7, 23, 2, 2, 2601, 2602, 5, 58, 30, 2, 2602, 2603, 7, 24, 2, 2, 2603, 2605, 3, 2, 2, 2, 2604, 2595, 3, 2, 2, 2, 2604, 2600, 3, 2, 2, 2, 2605, 451, 3, 2, 2, 2, 2606, 2609, 5, 392, 197, 2, 2607, 2609, 5, 454, 228, 2, 2608, 2606, 3, 2, 2, 2, 2608, 2607, 3, 2, 2, 2, 2609, 453, 3, 2, 2, 2, 2610, 2611, 5, 348, 175, 2, 2611, 2612, 5, 392, 197, 2, 2612, 2620, 3, 2, 2, 2, 2613, 2614, 5, 348, 175, 2, 2614, 2615, 7, 75, 2, 2, 2615, 2616, 5, 392, 197, 2, 2616, 2620, 3, 2, 2, 2, 2617, 2618, 7, 75, 2, 2, 2618, 2620, 5, 392, 197, 2, 2619, 2610, 3, 2, 2, 2, 2619, 2613, 3, 2, 2, 2, 2619, 2617, 3, 2, 2, 2, 2620, 455, 3, 2, 2, 2, 2621, 2625, 3, 2, 2, 2, 2622, 2623, 7, 233, 2, 2, 2623, 2625, 5, 458, 230, 2, 2624, 2621, 3, 2, 2, 2, 2624, 2622, 3, 2, 2, 2, 2625, 457, 3, 2, 2, 2, 2626, 2627, 8, 230, 1, 2, 2627, 2628, 5, 460, 231, 2, 2628, 2634, 3, 2, 2, 2, 2629, 2630, 12, 3, 2, 2, 2630, 2631, 7, 27, 2, 2, 2631, 2633, 5, 460, 231, 2, 2632, 2629, 3, 2, 2, 2, 2633, 2636, 3, 2, 2, 2, 2634, 2632, 3, 2, 2, 2, 2634, 2635, 3, 2, 2, 2, 2635, 459, 3, 2, 2, 2, 2636, 2634, 3, 2, 2, 2, 2637, 2638, 7, 239, 2, 2, 2638, 2639, 7, 41, 2, 2, 2639, 2640, 5, 462, 232, 2, 2640, 461, 3, 2, 2, 2, 2641, 2642, 7, 23, 2, 2, 2642, 2643, 5, 464, 233, 2, 2643, 2644, 5, 466, 234, 2, 2644, 2645, 5, 174, 88, 2, 2645, 2646, 5, 468, 235, 2, 2646, 2647, 7, 24, 2, 2, 2647, 463, 3, 2, 2, 2, 2648, 2651, 3, 2, 2, 2, 2649, 2651, 7, 239, 2, 2, 2650, 2648, 3, 2, 2, 2, 2650, 2649, 3, 2, 2, 2, 2651, 465, 3, 2, 2, 2, 2652, 2657, 3, 2, 2, 2, 2653, 2654, 7, 163, 2, 2, 2654, 2655, 7, 51, 2, 2, 2655, 2657, 5, 416, 209, 2, 2656, 2652, 3, 2, 2, 2, 2656, 2653, 3, 2, 2, 2, 2657, 467, 3, 2, 2, 2, 2658, 2664, 3, 2, 2, 2, 2659, 2660, 5, 470, 236, 2, 2660, 2661, 5, 474, 238, 2, 2661, 2662, 5, 472, 237, 2, 2662, 2664, 3, 2, 2, 2, 2663, 2658, 3, 2, 2, 2, 2663, 2659, 3, 2, 2, 2, 2664, 469, 3, 2, 2, 2, 2665, 2666, 9, 16, 2, 2, 2666, 471, 3, 2, 2, 2, 2667, 2679, 3, 2, 2, 2, 2668, 2669, 7, 84, 2, 2, 2669, 2670, 7, 146, 2, 2, 2670, 2679, 7, 159, 2, 2, 2671, 2672, 7, 84, 2, 2, 2672, 2673, 7, 65, 2, 2, 2673, 2679, 7, 189, 2, 2, 2674, 2675, 7, 84, 2, 2, 2675, 2679, 7, 205, 2, 2, 2676, 2677, 7, 84, 2, 2, 2677, 2679, 7, 102, 2, 2, 2678, 2667, 3, 2, 2, 2, 2678, 2668, 3, 2, 2, 2, 2678, 2671, 3, 2, 2, 2, 2678, 2674, 3, 2, 2, 2, 2678, 2676, 3, 2, 2, 2, 2679, 473, 3, 2, 2, 2, 2680, 2687, 5, 476, 239, 2, 2681, 2682, 7, 45, 2, 2, 2682, 2683, 5, 476, 239, 2, 2683, 2684, 7, 38, 2, 2, 2684, 2685, 5, 476, 239, 2, 2685, 2687, 3, 2, 2, 2, 2686, 2680, 3, 2, 2, 2, 2686, 2681, 3, 2, 2, 2, 2687, 475, 3, 2, 2, 2, 2688, 2689, 7, 212, 2, 2, 2689, 2698, 7, 167, 2, 2, 2690, 2691, 7, 212, 2, 2, 2691, 2698, 7, 94, 2, 2, 2692, 2693, 7, 65, 2, 2, 2693, 2698, 7, 189, 2, 2, 2694, 2695, 5, 392, 197, 2, 2695, 2696, 5, 478, 240, 2, 2696, 2698, 3, 2, 2, 2, 2697, 2688, 3, 2, 2, 2, 2697, 2690, 3, 2, 2, 2, 2697, 2692, 3, 2, 2, 2, 2697, 2694, 3, 2, 2, 2, 2698, 477, 3, 2, 2, 2, 2699, 2700, 9, 17, 2, 2, 2700, 479, 3, 2, 2, 2, 2701, 2704, 3, 2, 2, 2, 2702, 2704, 5, 482, 242, 2, 2703, 2701, 3, 2, 2, 2, 2703, 2702, 3, 2, 2, 2, 2704, 481, 3, 2, 2, 2, 2705, 2706, 7, 182, 2, 2, 2706, 2710, 7, 150, 2, 2, 2707, 2708, 7, 108, 2, 2, 2708, 2710, 7, 150, 2, 2, 2709, 2705, 3, 2, 2, 2, 2709, 2707, 3, 2, 2, 2, 2710, 483, 3, 2, 2, 2, 2711, 2715, 3, 2, 2, 2, 2712, 2713, 7, 97, 2, 2, 2713, 2715, 5, 188, 95, 2, 2714, 2711, 3, 2, 2, 2, 2714, 2712, 3, 2, 2, 2, 2715, 485, 3, 2, 2, 2, 2716, 2717, 9, 18, 2, 2, 2717, 487, 3, 2, 2, 2, 2718, 2725, 3, 2, 2, 2, 2719, 2720, 7, 90, 2, 2, 2720, 2721, 7, 23, 2, 2, 2721, 2722, 5, 156, 79, 2, 2722, 2723, 7, 24, 2, 2, 2723, 2725, 3, 2, 2, 2, 2724, 2718, 3, 2, 2, 2, 2724, 2719, 3, 2, 2, 2, 2725, 489, 3, 2, 2, 2, 2726, 2729, 3, 2, 2, 2, 2727, 2729, 5, 492, 247, 2, 2728, 2726, 3, 2, 2, 2, 2728, 2727, 3, 2, 2, 2, 2729, 491, 3, 2, 2, 2, 2730, 2731, 7, 161, 2, 2, 2731, 2735, 7, 239, 2, 2, 2732, 2733, 7, 161, 2, 2, 2733, 2735, 5, 462, 232, 2, 2734, 2730, 3, 2, 2, 2, 2734, 2732, 3, 2, 2, 2, 2735, 493, 3, 2, 2, 2, 2736, 2737, 5, 500, 251, 2, 2737, 2738, 5, 504, 253, 2, 2738, 2739, 5, 510, 256, 2, 2739, 495, 3, 2, 2, 2, 2740, 2741, 7, 58, 2, 2, 2741, 2742, 5, 502, 252, 2, 2742, 497, 3, 2, 2, 2, 2743, 2744, 7, 188, 2, 2, 2744, 2745, 5, 502, 252, 2, 2745, 2746, 5, 506, 254, 2, 2746, 499, 3, 2, 2, 2, 2747, 2748, 9, 19, 2, 2, 2748, 501, 3, 2, 2, 2, 2749, 2752, 3, 2, 2, 2, 2750, 2752, 5, 504, 253, 2, 2751, 2749, 3, 2, 2, 2, 2751, 2750, 3, 2, 2, 2, 2752, 503, 3, 2, 2, 2, 2753, 2754, 9, 20, 2, 2, 2754, 505, 3, 2, 2, 2, 2755, 2760, 3, 2, 2, 2, 2756, 2757, 7, 206, 2, 2, 2757, 2758, 7, 192, 2, 2, 2758, 2760, 5, 508, 255, 2, 2759, 2755, 3, 2, 2, 2, 2759, 2756, 3, 2, 2, 2, 2760, 507, 3, 2, 2, 2, 2761, 2762, 7, 239, 2, 2, 2762, 509, 3, 2, 2, 2, 2763, 2766, 3, 2, 2, 2, 2764, 2766, 5, 512, 257, 2, 2765, 2763, 3, 2, 2, 2, 2765, 2764, 3, 2, 2, 2, 2766, 511, 3, 2, 2, 2, 2767, 2768, 7, 121, 2, 2, 2768, 2769, 7, 133, 2, 2, 2769, 2770, 5, 514, 258, 2, 2770, 513, 3, 2, 2, 2, 2771, 2772, 7, 177, 2, 2, 2772, 2773, 7, 59, 2, 2, 2773, 515, 3, 2, 2, 2, 2774, 2775, 7, 197, 2, 2, 2775, 2776, 7, 208, 2, 2, 2776, 2777, 5, 512, 257, 2, 2777, 517, 3, 2, 2, 2, 2778, 2779, 7, 192, 2, 2, 2779, 2780, 5, 508, 255, 2, 2780, 519, 3, 2, 2, 2, 2781, 2782, 7, 107, 2, 2, 2782, 2783, 7, 86, 2, 2, 2783, 521, 3, 2, 2, 2, 2784, 2785, 7, 107, 2, 2, 2785, 2786, 7, 147, 2, 2, 2786, 2787, 7, 86, 2, 2, 2787, 523, 3, 2, 2, 2, 170, 528, 535, 542, 550, 560, 568, 580, 587, 598, 609, 615, 627, 632, 636, 643, 647, 652, 657, 664, 679, 710, 733, 735, 740, 744, 773, 778, 790, 801, 805, 810, 816, 831, 881, 883, 891, 909, 914, 928, 945, 962, 966, 976, 990, 994, 1008, 1021, 1031, 1041, 1050, 1057, 1066, 1076, 1084, 1091, 1098, 1112, 1121, 1129, 1137, 1144, 1165, 1180, 1186, 1205, 1218, 1225, 1230, 1248, 1257, 1283, 1301, 1336, 1349, 1363, 1372, 1387, 1398, 1421, 1428, 1441, 1464, 1487, 1503, 1512, 1524, 1542, 1556, 1566, 1579, 1608, 1618, 1625, 1639, 1645, 1651, 1657, 1663, 1684, 1696, 1700, 1706, 1718, 1728, 1739, 1749, 1753, 1761, 1765, 1778, 1794, 1803, 1810, 1835, 1853, 1876, 1880, 1894, 1901, 1911, 1934, 2069, 2073, 2083, 2114, 2116, 2125, 2267, 2269, 2290, 2353, 2355, 2362, 2370, 2380, 2388, 2396, 2406, 2417, 2437, 2446, 2484, 2490, 2521, 2531, 2554, 2582, 2593, 2604, 2608, 2619, 2624, 2634, 2650, 2656, 2663, 2678, 2686, 2697, 2703, 2709, 2714, 2724, 2728, 2734, 2751, 2759, 2765] \ No newline at end of file diff --git a/reverse_engineering/antlr/parser/n1ql.tokens b/reverse_engineering/antlr/parser/n1ql.tokens new file mode 100644 index 0000000..3d957ca --- /dev/null +++ b/reverse_engineering/antlr/parser/n1ql.tokens @@ -0,0 +1,264 @@ +STR=1 +INT=2 +NUM=3 +BLOCK_COMMENT=4 +LINE_COMMENT=5 +WHITESPACE=6 +DOT=7 +PLUS=8 +MINUS=9 +STAR=10 +DIV=11 +MOD=12 +DEQ=13 +EQ=14 +NE=15 +LT=16 +LE=17 +GT=18 +GE=19 +CONCAT=20 +LPAREN=21 +RPAREN=22 +LBRACE=23 +RBRACE=24 +COMMA=25 +COLON=26 +LBRACKET=27 +RBRACKET=28 +RBRACKET_ICASE=29 +SEMI=30 +NOT_A_TOKEN=31 +ADVISE=32 +ALL=33 +ALTER=34 +ANALYZE=35 +AND=36 +ANY=37 +ARRAY=38 +AS=39 +ASC=40 +AT=41 +BEGIN=42 +BETWEEN=43 +BINARY=44 +BOOLEAN=45 +BREAK=46 +BUCKET=47 +BUILD=48 +BY=49 +CALL=50 +CASE=51 +CAST=52 +CLUSTER=53 +COLLATE=54 +COLLECTION=55 +COMMIT=56 +COMMITTED=57 +CONNECT=58 +CONTINUE=59 +CORRELATED=60 +COVER=61 +CREATE=62 +CURRENT=63 +DATABASE=64 +DATASET=65 +DATASTORE=66 +DECLARE=67 +DECREMENT=68 +DELETE_=69 +DERIVED=70 +DESC=71 +DESCRIBE=72 +DISTINCT=73 +DO=74 +DROP=75 +EACH=76 +ELEMENT=77 +ELSE=78 +END=79 +EVERY=80 +EXCEPT=81 +EXCLUDE=82 +EXECUTE=83 +EXISTS=84 +EXPLAIN=85 +FALSE=86 +FETCH=87 +FILTER=88 +FIRST=89 +FLATTEN=90 +FLUSH=91 +FOLLOWING=92 +FOR=93 +FORCE=94 +FROM=95 +FTS=96 +FUNCTION=97 +GOLANG=98 +GRANT=99 +GROUP=100 +GROUPS=101 +GSI=102 +HASH=103 +HAVING=104 +IF=105 +IGNORE=106 +ILIKE=107 +IN=108 +INCLUDE=109 +INCREMENT=110 +INDEX=111 +INFER=112 +INLINE=113 +INNER=114 +INSERT=115 +INTERSECT=116 +INTO=117 +IS=118 +ISOLATION=119 +JAVASCRIPT=120 +JOIN=121 +KEY=122 +KEYS=123 +KEYSPACE=124 +KNOWN=125 +LANGUAGE=126 +LAST=127 +LEFT=128 +LET_=129 +LETTING=130 +LEVEL=131 +LIKE=132 +LIMIT=133 +LSM=134 +MAP=135 +MAPPING=136 +MATCHED=137 +MATERIALIZED=138 +MERGE=139 +MISSING=140 +NAMESPACE=141 +NEST=142 +NL=143 +NO=144 +NOT=145 +NTH_VALUE=146 +NULL=147 +NULLS=148 +NUMBER=149 +OBJECT=150 +OFFSET=151 +ON=152 +OPTION=153 +OPTIONS=154 +OR=155 +ORDER=156 +OTHERS=157 +OUTER=158 +OVER=159 +PARSE=160 +PARTITION=161 +PASSWORD=162 +PATH=163 +POOL=164 +PRECEDING=165 +PREPARE=166 +PRIMARY=167 +PRIVATE=168 +PRIVILEGE=169 +PROCEDURE=170 +PROBE=171 +PUBLIC=172 +RANGE=173 +RAW=174 +READ=175 +REALM=176 +REDUCE=177 +RENAME=178 +REPLACE=179 +RESPECT=180 +RETURN=181 +RETURNING=182 +REVOKE=183 +RIGHT=184 +ROLE=185 +ROLLBACK=186 +ROW=187 +ROWS=188 +SATISFIES=189 +SAVEPOINT=190 +SCHEMA=191 +SCOPE=192 +SELECT=193 +SELF=194 +SET=195 +SHOW=196 +SOME=197 +START=198 +STATISTICS=199 +STRING=200 +SYSTEM=201 +THEN=202 +TIES=203 +TO=204 +TRAN=205 +TRANSACTION=206 +TRIGGER=207 +TRUE=208 +TRUNCATE=209 +UNBOUNDED=210 +UNDER=211 +UNION=212 +UNIQUE=213 +UNKNOWN=214 +UNNEST=215 +UNSET=216 +UPDATE=217 +UPSERT=218 +USE=219 +USER=220 +USING=221 +VALIDATE=222 +VALUE=223 +VALUED=224 +VALUES=225 +VIA=226 +VIEW=227 +WHEN=228 +WHERE=229 +WHILE=230 +WINDOW=231 +WITH=232 +WITHIN=233 +WORK=234 +XOR=235 +IDENT_ICASE=236 +IDENT=237 +NAMED_PARAM=238 +POSITIONAL_PARAM=239 +NEXT_PARAM=240 +'.'=7 +'+'=8 +'*'=10 +'/'=11 +'%'=12 +'=='=13 +'='=14 +'<'=16 +'<='=17 +'>'=18 +'>='=19 +'||'=20 +'('=21 +')'=22 +'{'=23 +'}'=24 +','=25 +':'=26 +'['=27 +']'=28 +']i'=29 +';'=30 +'!'=31 +'?'=240 diff --git a/reverse_engineering/antlr/parser/n1qlLexer.interp b/reverse_engineering/antlr/parser/n1qlLexer.interp new file mode 100644 index 0000000..9e8b73a --- /dev/null +++ b/reverse_engineering/antlr/parser/n1qlLexer.interp @@ -0,0 +1,746 @@ +token literal names: +null +null +null +null +null +null +null +'.' +'+' +null +'*' +'/' +'%' +'==' +'=' +null +'<' +'<=' +'>' +'>=' +'||' +'(' +')' +'{' +'}' +',' +':' +'[' +']' +']i' +';' +'!' +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +null +'?' + +token symbolic names: +null +STR +INT +NUM +BLOCK_COMMENT +LINE_COMMENT +WHITESPACE +DOT +PLUS +MINUS +STAR +DIV +MOD +DEQ +EQ +NE +LT +LE +GT +GE +CONCAT +LPAREN +RPAREN +LBRACE +RBRACE +COMMA +COLON +LBRACKET +RBRACKET +RBRACKET_ICASE +SEMI +NOT_A_TOKEN +ADVISE +ALL +ALTER +ANALYZE +AND +ANY +ARRAY +AS +ASC +AT +BEGIN +BETWEEN +BINARY +BOOLEAN +BREAK +BUCKET +BUILD +BY +CALL +CASE +CAST +CLUSTER +COLLATE +COLLECTION +COMMIT +COMMITTED +CONNECT +CONTINUE +CORRELATED +COVER +CREATE +CURRENT +DATABASE +DATASET +DATASTORE +DECLARE +DECREMENT +DELETE_ +DERIVED +DESC +DESCRIBE +DISTINCT +DO +DROP +EACH +ELEMENT +ELSE +END +EVERY +EXCEPT +EXCLUDE +EXECUTE +EXISTS +EXPLAIN +FALSE +FETCH +FILTER +FIRST +FLATTEN +FLUSH +FOLLOWING +FOR +FORCE +FROM +FTS +FUNCTION +GOLANG +GRANT +GROUP +GROUPS +GSI +HASH +HAVING +IF +IGNORE +ILIKE +IN +INCLUDE +INCREMENT +INDEX +INFER +INLINE +INNER +INSERT +INTERSECT +INTO +IS +ISOLATION +JAVASCRIPT +JOIN +KEY +KEYS +KEYSPACE +KNOWN +LANGUAGE +LAST +LEFT +LET_ +LETTING +LEVEL +LIKE +LIMIT +LSM +MAP +MAPPING +MATCHED +MATERIALIZED +MERGE +MISSING +NAMESPACE +NEST +NL +NO +NOT +NTH_VALUE +NULL +NULLS +NUMBER +OBJECT +OFFSET +ON +OPTION +OPTIONS +OR +ORDER +OTHERS +OUTER +OVER +PARSE +PARTITION +PASSWORD +PATH +POOL +PRECEDING +PREPARE +PRIMARY +PRIVATE +PRIVILEGE +PROCEDURE +PROBE +PUBLIC +RANGE +RAW +READ +REALM +REDUCE +RENAME +REPLACE +RESPECT +RETURN +RETURNING +REVOKE +RIGHT +ROLE +ROLLBACK +ROW +ROWS +SATISFIES +SAVEPOINT +SCHEMA +SCOPE +SELECT +SELF +SET +SHOW +SOME +START +STATISTICS +STRING +SYSTEM +THEN +TIES +TO +TRAN +TRANSACTION +TRIGGER +TRUE +TRUNCATE +UNBOUNDED +UNDER +UNION +UNIQUE +UNKNOWN +UNNEST +UNSET +UPDATE +UPSERT +USE +USER +USING +VALIDATE +VALUE +VALUED +VALUES +VIA +VIEW +WHEN +WHERE +WHILE +WINDOW +WITH +WITHIN +WORK +XOR +IDENT_ICASE +IDENT +NAMED_PARAM +POSITIONAL_PARAM +NEXT_PARAM + +rule names: +SingleStringCharacter +DoubleStringCharacter +STR +NumStart +Digit +Int +Exponent +INT +NUM +BLOCK_COMMENT +LINE_COMMENT +WHITESPACE +DOT +PLUS +MINUS +STAR +DIV +MOD +DEQ +EQ +NE +LT +LE +GT +GE +CONCAT +LPAREN +RPAREN +LBRACE +RBRACE +COMMA +COLON +LBRACKET +RBRACKET +RBRACKET_ICASE +SEMI +NOT_A_TOKEN +ADVISE +ALL +ALTER +ANALYZE +AND +ANY +ARRAY +AS +ASC +AT +BEGIN +BETWEEN +BINARY +BOOLEAN +BREAK +BUCKET +BUILD +BY +CALL +CASE +CAST +CLUSTER +COLLATE +COLLECTION +COMMIT +COMMITTED +CONNECT +CONTINUE +CORRELATED +COVER +CREATE +CURRENT +DATABASE +DATASET +DATASTORE +DECLARE +DECREMENT +DELETE_ +DERIVED +DESC +DESCRIBE +DISTINCT +DO +DROP +EACH +ELEMENT +ELSE +END +EVERY +EXCEPT +EXCLUDE +EXECUTE +EXISTS +EXPLAIN +FALSE +FETCH +FILTER +FIRST +FLATTEN +FLUSH +FOLLOWING +FOR +FORCE +FROM +FTS +FUNCTION +GOLANG +GRANT +GROUP +GROUPS +GSI +HASH +HAVING +IF +IGNORE +ILIKE +IN +INCLUDE +INCREMENT +INDEX +INFER +INLINE +INNER +INSERT +INTERSECT +INTO +IS +ISOLATION +JAVASCRIPT +JOIN +KEY +KEYS +KEYSPACE +KNOWN +LANGUAGE +LAST +LEFT +LET_ +LETTING +LEVEL +LIKE +LIMIT +LSM +MAP +MAPPING +MATCHED +MATERIALIZED +MERGE +MISSING +NAMESPACE +NEST +NL +NO +NOT +NTH_VALUE +NULL +NULLS +NUMBER +OBJECT +OFFSET +ON +OPTION +OPTIONS +OR +ORDER +OTHERS +OUTER +OVER +PARSE +PARTITION +PASSWORD +PATH +POOL +PRECEDING +PREPARE +PRIMARY +PRIVATE +PRIVILEGE +PROCEDURE +PROBE +PUBLIC +RANGE +RAW +READ +REALM +REDUCE +RENAME +REPLACE +RESPECT +RETURN +RETURNING +REVOKE +RIGHT +ROLE +ROLLBACK +ROW +ROWS +SATISFIES +SAVEPOINT +SCHEMA +SCOPE +SELECT +SELF +SET +SHOW +SOME +START +STATISTICS +STRING +SYSTEM +THEN +TIES +TO +TRAN +TRANSACTION +TRIGGER +TRUE +TRUNCATE +UNBOUNDED +UNDER +UNION +UNIQUE +UNKNOWN +UNNEST +UNSET +UPDATE +UPSERT +USE +USER +USING +VALIDATE +VALUE +VALUED +VALUES +VIA +VIEW +WHEN +WHERE +WHILE +WINDOW +WITH +WITHIN +WORK +XOR +IdentChar +IdentFirstChar +IdentLaterChar +IDENT_ICASE +IDENT +NAMED_PARAM +POSITIONAL_PARAM +NEXT_PARAM + +channel names: +DEFAULT_TOKEN_CHANNEL +HIDDEN + +mode names: +DEFAULT_MODE + +atn: +[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 242, 2064, 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, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 5, 2, 509, 10, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 3, 516, 10, 3, 3, 4, 3, 4, 7, 4, 520, 10, 4, 12, 4, 14, 4, 523, 11, 4, 3, 4, 3, 4, 3, 4, 7, 4, 528, 10, 4, 12, 4, 14, 4, 531, 11, 4, 3, 4, 5, 4, 534, 10, 4, 3, 5, 5, 5, 537, 10, 5, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 7, 7, 544, 10, 7, 12, 7, 14, 7, 547, 11, 7, 5, 7, 549, 10, 7, 3, 8, 3, 8, 5, 8, 553, 10, 8, 3, 8, 6, 8, 556, 10, 8, 13, 8, 14, 8, 557, 3, 9, 3, 9, 3, 10, 3, 10, 3, 10, 6, 10, 565, 10, 10, 13, 10, 14, 10, 566, 3, 10, 5, 10, 570, 10, 10, 3, 10, 3, 10, 3, 10, 5, 10, 575, 10, 10, 3, 11, 3, 11, 3, 11, 3, 11, 7, 11, 581, 10, 11, 12, 11, 14, 11, 584, 11, 11, 3, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 12, 7, 12, 593, 10, 12, 12, 12, 14, 12, 596, 11, 12, 3, 13, 6, 13, 599, 10, 13, 13, 13, 14, 13, 600, 3, 13, 3, 13, 3, 14, 3, 14, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 5, 16, 615, 10, 16, 3, 17, 3, 17, 3, 18, 3, 18, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 5, 22, 632, 10, 22, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 29, 3, 29, 3, 30, 3, 30, 3, 31, 3, 31, 3, 32, 3, 32, 3, 33, 3, 33, 3, 34, 3, 34, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 38, 3, 38, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 40, 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, 43, 3, 43, 3, 43, 3, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 46, 3, 47, 3, 47, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 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, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 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, 54, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 55, 3, 56, 3, 56, 3, 56, 3, 57, 3, 57, 3, 57, 3, 57, 3, 57, 3, 58, 3, 58, 3, 58, 3, 58, 3, 58, 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, 61, 3, 61, 3, 61, 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, 62, 3, 62, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 65, 3, 65, 3, 65, 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, 67, 3, 67, 3, 67, 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, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 70, 3, 70, 3, 70, 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, 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, 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, 75, 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, 77, 3, 77, 3, 77, 3, 78, 3, 78, 3, 78, 3, 78, 3, 78, 3, 79, 3, 79, 3, 79, 3, 79, 3, 79, 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, 80, 3, 81, 3, 81, 3, 81, 3, 82, 3, 82, 3, 82, 3, 82, 3, 82, 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, 86, 3, 86, 3, 86, 3, 86, 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, 89, 3, 89, 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, 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, 93, 3, 93, 3, 93, 3, 93, 3, 93, 3, 93, 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, 96, 3, 96, 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, 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, 101, 3, 101, 3, 101, 3, 101, 3, 101, 3, 101, 3, 102, 3, 102, 3, 102, 3, 102, 3, 102, 3, 103, 3, 103, 3, 103, 3, 103, 3, 104, 3, 104, 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, 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, 108, 3, 108, 3, 108, 3, 108, 3, 108, 3, 108, 3, 108, 3, 109, 3, 109, 3, 109, 3, 109, 3, 110, 3, 110, 3, 110, 3, 110, 3, 110, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 3, 111, 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, 114, 3, 114, 3, 114, 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, 117, 3, 117, 3, 117, 3, 117, 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, 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, 122, 3, 122, 3, 122, 3, 122, 3, 122, 3, 122, 3, 122, 3, 123, 3, 123, 3, 123, 3, 123, 3, 123, 3, 123, 3, 123, 3, 123, 3, 123, 3, 123, 3, 124, 3, 124, 3, 124, 3, 124, 3, 124, 3, 125, 3, 125, 3, 125, 3, 126, 3, 126, 3, 126, 3, 126, 3, 126, 3, 126, 3, 126, 3, 126, 3, 126, 3, 126, 3, 127, 3, 127, 3, 127, 3, 127, 3, 127, 3, 127, 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, 130, 3, 130, 3, 130, 3, 130, 3, 130, 3, 131, 3, 131, 3, 131, 3, 131, 3, 131, 3, 131, 3, 131, 3, 131, 3, 131, 3, 132, 3, 132, 3, 132, 3, 132, 3, 132, 3, 132, 3, 133, 3, 133, 3, 133, 3, 133, 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, 136, 3, 136, 3, 136, 3, 136, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 137, 3, 138, 3, 138, 3, 138, 3, 138, 3, 138, 3, 138, 3, 139, 3, 139, 3, 139, 3, 139, 3, 139, 3, 140, 3, 140, 3, 140, 3, 140, 3, 140, 3, 140, 3, 141, 3, 141, 3, 141, 3, 141, 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, 144, 3, 144, 3, 145, 3, 145, 3, 145, 3, 145, 3, 145, 3, 145, 3, 145, 3, 145, 3, 145, 3, 145, 3, 145, 3, 145, 3, 145, 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, 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, 150, 3, 150, 3, 150, 3, 151, 3, 151, 3, 151, 3, 152, 3, 152, 3, 152, 3, 152, 3, 153, 3, 153, 3, 153, 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, 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, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 158, 3, 159, 3, 159, 3, 159, 3, 160, 3, 160, 3, 160, 3, 160, 3, 160, 3, 160, 3, 160, 3, 161, 3, 161, 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, 163, 3, 163, 3, 163, 3, 164, 3, 164, 3, 164, 3, 164, 3, 164, 3, 164, 3, 164, 3, 165, 3, 165, 3, 165, 3, 165, 3, 165, 3, 165, 3, 166, 3, 166, 3, 166, 3, 166, 3, 166, 3, 167, 3, 167, 3, 167, 3, 167, 3, 167, 3, 167, 3, 168, 3, 168, 3, 168, 3, 168, 3, 168, 3, 168, 3, 168, 3, 168, 3, 168, 3, 168, 3, 169, 3, 169, 3, 169, 3, 169, 3, 169, 3, 169, 3, 169, 3, 169, 3, 169, 3, 170, 3, 170, 3, 170, 3, 170, 3, 170, 3, 171, 3, 171, 3, 171, 3, 171, 3, 171, 3, 172, 3, 172, 3, 172, 3, 172, 3, 172, 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, 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, 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, 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, 180, 3, 180, 3, 180, 3, 180, 3, 180, 3, 180, 3, 181, 3, 181, 3, 181, 3, 181, 3, 182, 3, 182, 3, 182, 3, 182, 3, 182, 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, 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, 186, 3, 186, 3, 187, 3, 187, 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, 188, 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, 191, 3, 191, 3, 191, 3, 191, 3, 191, 3, 191, 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, 194, 3, 194, 3, 194, 3, 194, 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, 196, 3, 196, 3, 196, 3, 197, 3, 197, 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, 198, 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, 201, 3, 201, 3, 201, 3, 201, 3, 201, 3, 202, 3, 202, 3, 202, 3, 202, 3, 203, 3, 203, 3, 203, 3, 203, 3, 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, 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, 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, 211, 3, 211, 3, 211, 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, 213, 3, 213, 3, 213, 3, 213, 3, 213, 3, 214, 3, 214, 3, 214, 3, 214, 3, 214, 3, 214, 3, 214, 3, 214, 3, 215, 3, 215, 3, 215, 3, 215, 3, 215, 3, 216, 3, 216, 3, 216, 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, 218, 3, 218, 3, 218, 3, 218, 3, 218, 3, 218, 3, 219, 3, 219, 3, 219, 3, 219, 3, 219, 3, 219, 3, 220, 3, 220, 3, 220, 3, 220, 3, 220, 3, 220, 3, 220, 3, 221, 3, 221, 3, 221, 3, 221, 3, 221, 3, 221, 3, 221, 3, 221, 3, 222, 3, 222, 3, 222, 3, 222, 3, 222, 3, 222, 3, 222, 3, 223, 3, 223, 3, 223, 3, 223, 3, 223, 3, 223, 3, 224, 3, 224, 3, 224, 3, 224, 3, 224, 3, 224, 3, 224, 3, 225, 3, 225, 3, 225, 3, 225, 3, 225, 3, 225, 3, 225, 3, 226, 3, 226, 3, 226, 3, 226, 3, 227, 3, 227, 3, 227, 3, 227, 3, 227, 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, 229, 3, 229, 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, 234, 3, 234, 3, 234, 3, 234, 3, 234, 3, 235, 3, 235, 3, 235, 3, 235, 3, 235, 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, 238, 3, 238, 3, 238, 3, 238, 3, 238, 3, 238, 3, 238, 3, 239, 3, 239, 3, 239, 3, 239, 3, 239, 3, 240, 3, 240, 3, 240, 3, 240, 3, 240, 3, 240, 3, 240, 3, 241, 3, 241, 3, 241, 3, 241, 3, 241, 3, 242, 3, 242, 3, 242, 3, 242, 3, 243, 3, 243, 3, 243, 5, 243, 2015, 10, 243, 3, 244, 3, 244, 3, 245, 3, 245, 3, 246, 3, 246, 6, 246, 2023, 10, 246, 13, 246, 14, 246, 2024, 3, 246, 3, 246, 3, 246, 3, 247, 3, 247, 6, 247, 2032, 10, 247, 13, 247, 14, 247, 2033, 3, 247, 3, 247, 3, 247, 3, 247, 7, 247, 2040, 10, 247, 12, 247, 14, 247, 2043, 11, 247, 5, 247, 2045, 10, 247, 3, 248, 3, 248, 3, 248, 7, 248, 2050, 10, 248, 12, 248, 14, 248, 2053, 11, 248, 3, 249, 3, 249, 3, 249, 7, 249, 2058, 10, 249, 12, 249, 14, 249, 2061, 11, 249, 3, 250, 3, 250, 3, 582, 2, 251, 3, 2, 5, 2, 7, 3, 9, 2, 11, 2, 13, 2, 15, 2, 17, 4, 19, 5, 21, 6, 23, 7, 25, 8, 27, 9, 29, 10, 31, 11, 33, 12, 35, 13, 37, 14, 39, 15, 41, 16, 43, 17, 45, 18, 47, 19, 49, 20, 51, 21, 53, 22, 55, 23, 57, 24, 59, 25, 61, 26, 63, 27, 65, 28, 67, 29, 69, 30, 71, 31, 73, 32, 75, 33, 77, 34, 79, 35, 81, 36, 83, 37, 85, 38, 87, 39, 89, 40, 91, 41, 93, 42, 95, 43, 97, 44, 99, 45, 101, 46, 103, 47, 105, 48, 107, 49, 109, 50, 111, 51, 113, 52, 115, 53, 117, 54, 119, 55, 121, 56, 123, 57, 125, 58, 127, 59, 129, 60, 131, 61, 133, 62, 135, 63, 137, 64, 139, 65, 141, 66, 143, 67, 145, 68, 147, 69, 149, 70, 151, 71, 153, 72, 155, 73, 157, 74, 159, 75, 161, 76, 163, 77, 165, 78, 167, 79, 169, 80, 171, 81, 173, 82, 175, 83, 177, 84, 179, 85, 181, 86, 183, 87, 185, 88, 187, 89, 189, 90, 191, 91, 193, 92, 195, 93, 197, 94, 199, 95, 201, 96, 203, 97, 205, 98, 207, 99, 209, 100, 211, 101, 213, 102, 215, 103, 217, 104, 219, 105, 221, 106, 223, 107, 225, 108, 227, 109, 229, 110, 231, 111, 233, 112, 235, 113, 237, 114, 239, 115, 241, 116, 243, 117, 245, 118, 247, 119, 249, 120, 251, 121, 253, 122, 255, 123, 257, 124, 259, 125, 261, 126, 263, 127, 265, 128, 267, 129, 269, 130, 271, 131, 273, 132, 275, 133, 277, 134, 279, 135, 281, 136, 283, 137, 285, 138, 287, 139, 289, 140, 291, 141, 293, 142, 295, 143, 297, 144, 299, 145, 301, 146, 303, 147, 305, 148, 307, 149, 309, 150, 311, 151, 313, 152, 315, 153, 317, 154, 319, 155, 321, 156, 323, 157, 325, 158, 327, 159, 329, 160, 331, 161, 333, 162, 335, 163, 337, 164, 339, 165, 341, 166, 343, 167, 345, 168, 347, 169, 349, 170, 351, 171, 353, 172, 355, 173, 357, 174, 359, 175, 361, 176, 363, 177, 365, 178, 367, 179, 369, 180, 371, 181, 373, 182, 375, 183, 377, 184, 379, 185, 381, 186, 383, 187, 385, 188, 387, 189, 389, 190, 391, 191, 393, 192, 395, 193, 397, 194, 399, 195, 401, 196, 403, 197, 405, 198, 407, 199, 409, 200, 411, 201, 413, 202, 415, 203, 417, 204, 419, 205, 421, 206, 423, 207, 425, 208, 427, 209, 429, 210, 431, 211, 433, 212, 435, 213, 437, 214, 439, 215, 441, 216, 443, 217, 445, 218, 447, 219, 449, 220, 451, 221, 453, 222, 455, 223, 457, 224, 459, 225, 461, 226, 463, 227, 465, 228, 467, 229, 469, 230, 471, 231, 473, 232, 475, 233, 477, 234, 479, 235, 481, 236, 483, 237, 485, 2, 487, 2, 489, 2, 491, 238, 493, 239, 495, 240, 497, 241, 499, 242, 3, 2, 42, 3, 2, 41, 41, 6, 2, 12, 12, 15, 15, 41, 41, 94, 94, 3, 2, 36, 36, 4, 2, 36, 36, 94, 94, 3, 2, 50, 59, 4, 2, 71, 71, 103, 103, 4, 2, 45, 45, 47, 47, 4, 2, 12, 12, 15, 15, 5, 2, 11, 12, 14, 15, 34, 34, 4, 2, 79, 79, 111, 111, 4, 2, 75, 75, 107, 107, 4, 2, 80, 80, 112, 112, 4, 2, 87, 87, 119, 119, 4, 2, 85, 85, 117, 117, 4, 2, 67, 67, 99, 99, 4, 2, 70, 70, 102, 102, 4, 2, 88, 88, 120, 120, 4, 2, 78, 78, 110, 110, 4, 2, 86, 86, 118, 118, 4, 2, 84, 84, 116, 116, 4, 2, 91, 91, 123, 123, 4, 2, 92, 92, 124, 124, 4, 2, 69, 69, 101, 101, 4, 2, 68, 68, 100, 100, 4, 2, 73, 73, 105, 105, 4, 2, 89, 89, 121, 121, 4, 2, 81, 81, 113, 113, 4, 2, 77, 77, 109, 109, 4, 2, 82, 82, 114, 114, 4, 2, 74, 74, 106, 106, 4, 2, 90, 90, 122, 122, 4, 2, 72, 72, 104, 104, 4, 2, 76, 76, 108, 108, 3, 2, 97, 97, 4, 2, 80, 80, 119, 119, 4, 2, 83, 83, 115, 115, 3, 2, 98, 98, 5, 2, 67, 92, 97, 97, 99, 124, 6, 2, 50, 59, 67, 92, 97, 97, 99, 124, 3, 2, 51, 59, 2, 2081, 2, 7, 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, 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, 3, 508, 3, 2, 2, 2, 5, 515, 3, 2, 2, 2, 7, 533, 3, 2, 2, 2, 9, 536, 3, 2, 2, 2, 11, 538, 3, 2, 2, 2, 13, 548, 3, 2, 2, 2, 15, 550, 3, 2, 2, 2, 17, 559, 3, 2, 2, 2, 19, 574, 3, 2, 2, 2, 21, 576, 3, 2, 2, 2, 23, 588, 3, 2, 2, 2, 25, 598, 3, 2, 2, 2, 27, 604, 3, 2, 2, 2, 29, 606, 3, 2, 2, 2, 31, 614, 3, 2, 2, 2, 33, 616, 3, 2, 2, 2, 35, 618, 3, 2, 2, 2, 37, 620, 3, 2, 2, 2, 39, 622, 3, 2, 2, 2, 41, 625, 3, 2, 2, 2, 43, 631, 3, 2, 2, 2, 45, 633, 3, 2, 2, 2, 47, 635, 3, 2, 2, 2, 49, 638, 3, 2, 2, 2, 51, 640, 3, 2, 2, 2, 53, 643, 3, 2, 2, 2, 55, 646, 3, 2, 2, 2, 57, 648, 3, 2, 2, 2, 59, 650, 3, 2, 2, 2, 61, 652, 3, 2, 2, 2, 63, 654, 3, 2, 2, 2, 65, 656, 3, 2, 2, 2, 67, 658, 3, 2, 2, 2, 69, 660, 3, 2, 2, 2, 71, 662, 3, 2, 2, 2, 73, 665, 3, 2, 2, 2, 75, 667, 3, 2, 2, 2, 77, 669, 3, 2, 2, 2, 79, 676, 3, 2, 2, 2, 81, 680, 3, 2, 2, 2, 83, 686, 3, 2, 2, 2, 85, 694, 3, 2, 2, 2, 87, 698, 3, 2, 2, 2, 89, 702, 3, 2, 2, 2, 91, 708, 3, 2, 2, 2, 93, 711, 3, 2, 2, 2, 95, 715, 3, 2, 2, 2, 97, 718, 3, 2, 2, 2, 99, 724, 3, 2, 2, 2, 101, 732, 3, 2, 2, 2, 103, 739, 3, 2, 2, 2, 105, 747, 3, 2, 2, 2, 107, 753, 3, 2, 2, 2, 109, 760, 3, 2, 2, 2, 111, 766, 3, 2, 2, 2, 113, 769, 3, 2, 2, 2, 115, 774, 3, 2, 2, 2, 117, 779, 3, 2, 2, 2, 119, 784, 3, 2, 2, 2, 121, 792, 3, 2, 2, 2, 123, 800, 3, 2, 2, 2, 125, 811, 3, 2, 2, 2, 127, 818, 3, 2, 2, 2, 129, 828, 3, 2, 2, 2, 131, 836, 3, 2, 2, 2, 133, 845, 3, 2, 2, 2, 135, 856, 3, 2, 2, 2, 137, 862, 3, 2, 2, 2, 139, 869, 3, 2, 2, 2, 141, 877, 3, 2, 2, 2, 143, 886, 3, 2, 2, 2, 145, 894, 3, 2, 2, 2, 147, 904, 3, 2, 2, 2, 149, 912, 3, 2, 2, 2, 151, 922, 3, 2, 2, 2, 153, 929, 3, 2, 2, 2, 155, 937, 3, 2, 2, 2, 157, 942, 3, 2, 2, 2, 159, 951, 3, 2, 2, 2, 161, 960, 3, 2, 2, 2, 163, 963, 3, 2, 2, 2, 165, 968, 3, 2, 2, 2, 167, 973, 3, 2, 2, 2, 169, 981, 3, 2, 2, 2, 171, 986, 3, 2, 2, 2, 173, 990, 3, 2, 2, 2, 175, 996, 3, 2, 2, 2, 177, 1003, 3, 2, 2, 2, 179, 1011, 3, 2, 2, 2, 181, 1019, 3, 2, 2, 2, 183, 1026, 3, 2, 2, 2, 185, 1034, 3, 2, 2, 2, 187, 1040, 3, 2, 2, 2, 189, 1046, 3, 2, 2, 2, 191, 1053, 3, 2, 2, 2, 193, 1059, 3, 2, 2, 2, 195, 1067, 3, 2, 2, 2, 197, 1073, 3, 2, 2, 2, 199, 1083, 3, 2, 2, 2, 201, 1087, 3, 2, 2, 2, 203, 1093, 3, 2, 2, 2, 205, 1098, 3, 2, 2, 2, 207, 1102, 3, 2, 2, 2, 209, 1111, 3, 2, 2, 2, 211, 1118, 3, 2, 2, 2, 213, 1124, 3, 2, 2, 2, 215, 1130, 3, 2, 2, 2, 217, 1137, 3, 2, 2, 2, 219, 1141, 3, 2, 2, 2, 221, 1146, 3, 2, 2, 2, 223, 1153, 3, 2, 2, 2, 225, 1156, 3, 2, 2, 2, 227, 1163, 3, 2, 2, 2, 229, 1169, 3, 2, 2, 2, 231, 1172, 3, 2, 2, 2, 233, 1180, 3, 2, 2, 2, 235, 1190, 3, 2, 2, 2, 237, 1196, 3, 2, 2, 2, 239, 1202, 3, 2, 2, 2, 241, 1209, 3, 2, 2, 2, 243, 1215, 3, 2, 2, 2, 245, 1222, 3, 2, 2, 2, 247, 1232, 3, 2, 2, 2, 249, 1237, 3, 2, 2, 2, 251, 1240, 3, 2, 2, 2, 253, 1250, 3, 2, 2, 2, 255, 1261, 3, 2, 2, 2, 257, 1266, 3, 2, 2, 2, 259, 1270, 3, 2, 2, 2, 261, 1275, 3, 2, 2, 2, 263, 1284, 3, 2, 2, 2, 265, 1290, 3, 2, 2, 2, 267, 1299, 3, 2, 2, 2, 269, 1304, 3, 2, 2, 2, 271, 1309, 3, 2, 2, 2, 273, 1313, 3, 2, 2, 2, 275, 1321, 3, 2, 2, 2, 277, 1327, 3, 2, 2, 2, 279, 1332, 3, 2, 2, 2, 281, 1338, 3, 2, 2, 2, 283, 1342, 3, 2, 2, 2, 285, 1346, 3, 2, 2, 2, 287, 1354, 3, 2, 2, 2, 289, 1362, 3, 2, 2, 2, 291, 1375, 3, 2, 2, 2, 293, 1381, 3, 2, 2, 2, 295, 1389, 3, 2, 2, 2, 297, 1399, 3, 2, 2, 2, 299, 1404, 3, 2, 2, 2, 301, 1407, 3, 2, 2, 2, 303, 1410, 3, 2, 2, 2, 305, 1414, 3, 2, 2, 2, 307, 1424, 3, 2, 2, 2, 309, 1429, 3, 2, 2, 2, 311, 1435, 3, 2, 2, 2, 313, 1442, 3, 2, 2, 2, 315, 1449, 3, 2, 2, 2, 317, 1456, 3, 2, 2, 2, 319, 1459, 3, 2, 2, 2, 321, 1466, 3, 2, 2, 2, 323, 1474, 3, 2, 2, 2, 325, 1477, 3, 2, 2, 2, 327, 1483, 3, 2, 2, 2, 329, 1490, 3, 2, 2, 2, 331, 1496, 3, 2, 2, 2, 333, 1501, 3, 2, 2, 2, 335, 1507, 3, 2, 2, 2, 337, 1517, 3, 2, 2, 2, 339, 1526, 3, 2, 2, 2, 341, 1531, 3, 2, 2, 2, 343, 1536, 3, 2, 2, 2, 345, 1546, 3, 2, 2, 2, 347, 1554, 3, 2, 2, 2, 349, 1562, 3, 2, 2, 2, 351, 1570, 3, 2, 2, 2, 353, 1580, 3, 2, 2, 2, 355, 1590, 3, 2, 2, 2, 357, 1596, 3, 2, 2, 2, 359, 1603, 3, 2, 2, 2, 361, 1609, 3, 2, 2, 2, 363, 1613, 3, 2, 2, 2, 365, 1618, 3, 2, 2, 2, 367, 1624, 3, 2, 2, 2, 369, 1631, 3, 2, 2, 2, 371, 1638, 3, 2, 2, 2, 373, 1646, 3, 2, 2, 2, 375, 1654, 3, 2, 2, 2, 377, 1661, 3, 2, 2, 2, 379, 1671, 3, 2, 2, 2, 381, 1678, 3, 2, 2, 2, 383, 1684, 3, 2, 2, 2, 385, 1689, 3, 2, 2, 2, 387, 1698, 3, 2, 2, 2, 389, 1702, 3, 2, 2, 2, 391, 1707, 3, 2, 2, 2, 393, 1717, 3, 2, 2, 2, 395, 1727, 3, 2, 2, 2, 397, 1734, 3, 2, 2, 2, 399, 1740, 3, 2, 2, 2, 401, 1747, 3, 2, 2, 2, 403, 1752, 3, 2, 2, 2, 405, 1756, 3, 2, 2, 2, 407, 1761, 3, 2, 2, 2, 409, 1766, 3, 2, 2, 2, 411, 1772, 3, 2, 2, 2, 413, 1783, 3, 2, 2, 2, 415, 1790, 3, 2, 2, 2, 417, 1797, 3, 2, 2, 2, 419, 1802, 3, 2, 2, 2, 421, 1807, 3, 2, 2, 2, 423, 1810, 3, 2, 2, 2, 425, 1815, 3, 2, 2, 2, 427, 1827, 3, 2, 2, 2, 429, 1835, 3, 2, 2, 2, 431, 1840, 3, 2, 2, 2, 433, 1849, 3, 2, 2, 2, 435, 1859, 3, 2, 2, 2, 437, 1865, 3, 2, 2, 2, 439, 1871, 3, 2, 2, 2, 441, 1878, 3, 2, 2, 2, 443, 1886, 3, 2, 2, 2, 445, 1893, 3, 2, 2, 2, 447, 1899, 3, 2, 2, 2, 449, 1906, 3, 2, 2, 2, 451, 1913, 3, 2, 2, 2, 453, 1917, 3, 2, 2, 2, 455, 1922, 3, 2, 2, 2, 457, 1928, 3, 2, 2, 2, 459, 1937, 3, 2, 2, 2, 461, 1943, 3, 2, 2, 2, 463, 1950, 3, 2, 2, 2, 465, 1957, 3, 2, 2, 2, 467, 1961, 3, 2, 2, 2, 469, 1966, 3, 2, 2, 2, 471, 1971, 3, 2, 2, 2, 473, 1977, 3, 2, 2, 2, 475, 1983, 3, 2, 2, 2, 477, 1990, 3, 2, 2, 2, 479, 1995, 3, 2, 2, 2, 481, 2002, 3, 2, 2, 2, 483, 2007, 3, 2, 2, 2, 485, 2014, 3, 2, 2, 2, 487, 2016, 3, 2, 2, 2, 489, 2018, 3, 2, 2, 2, 491, 2020, 3, 2, 2, 2, 493, 2044, 3, 2, 2, 2, 495, 2046, 3, 2, 2, 2, 497, 2054, 3, 2, 2, 2, 499, 2062, 3, 2, 2, 2, 501, 502, 7, 41, 2, 2, 502, 509, 7, 41, 2, 2, 503, 504, 7, 94, 2, 2, 504, 509, 7, 41, 2, 2, 505, 506, 7, 94, 2, 2, 506, 509, 10, 2, 2, 2, 507, 509, 10, 3, 2, 2, 508, 501, 3, 2, 2, 2, 508, 503, 3, 2, 2, 2, 508, 505, 3, 2, 2, 2, 508, 507, 3, 2, 2, 2, 509, 4, 3, 2, 2, 2, 510, 511, 7, 94, 2, 2, 511, 516, 7, 36, 2, 2, 512, 513, 7, 94, 2, 2, 513, 516, 10, 4, 2, 2, 514, 516, 10, 5, 2, 2, 515, 510, 3, 2, 2, 2, 515, 512, 3, 2, 2, 2, 515, 514, 3, 2, 2, 2, 516, 6, 3, 2, 2, 2, 517, 521, 7, 41, 2, 2, 518, 520, 5, 3, 2, 2, 519, 518, 3, 2, 2, 2, 520, 523, 3, 2, 2, 2, 521, 519, 3, 2, 2, 2, 521, 522, 3, 2, 2, 2, 522, 524, 3, 2, 2, 2, 523, 521, 3, 2, 2, 2, 524, 534, 7, 41, 2, 2, 525, 529, 7, 36, 2, 2, 526, 528, 5, 5, 3, 2, 527, 526, 3, 2, 2, 2, 528, 531, 3, 2, 2, 2, 529, 527, 3, 2, 2, 2, 529, 530, 3, 2, 2, 2, 530, 532, 3, 2, 2, 2, 531, 529, 3, 2, 2, 2, 532, 534, 7, 36, 2, 2, 533, 517, 3, 2, 2, 2, 533, 525, 3, 2, 2, 2, 534, 8, 3, 2, 2, 2, 535, 537, 4, 50, 59, 2, 536, 535, 3, 2, 2, 2, 537, 10, 3, 2, 2, 2, 538, 539, 9, 6, 2, 2, 539, 12, 3, 2, 2, 2, 540, 549, 7, 50, 2, 2, 541, 545, 5, 9, 5, 2, 542, 544, 5, 11, 6, 2, 543, 542, 3, 2, 2, 2, 544, 547, 3, 2, 2, 2, 545, 543, 3, 2, 2, 2, 545, 546, 3, 2, 2, 2, 546, 549, 3, 2, 2, 2, 547, 545, 3, 2, 2, 2, 548, 540, 3, 2, 2, 2, 548, 541, 3, 2, 2, 2, 549, 14, 3, 2, 2, 2, 550, 552, 9, 7, 2, 2, 551, 553, 9, 8, 2, 2, 552, 551, 3, 2, 2, 2, 552, 553, 3, 2, 2, 2, 553, 555, 3, 2, 2, 2, 554, 556, 5, 11, 6, 2, 555, 554, 3, 2, 2, 2, 556, 557, 3, 2, 2, 2, 557, 555, 3, 2, 2, 2, 557, 558, 3, 2, 2, 2, 558, 16, 3, 2, 2, 2, 559, 560, 5, 13, 7, 2, 560, 18, 3, 2, 2, 2, 561, 562, 5, 13, 7, 2, 562, 564, 7, 48, 2, 2, 563, 565, 5, 11, 6, 2, 564, 563, 3, 2, 2, 2, 565, 566, 3, 2, 2, 2, 566, 564, 3, 2, 2, 2, 566, 567, 3, 2, 2, 2, 567, 569, 3, 2, 2, 2, 568, 570, 5, 15, 8, 2, 569, 568, 3, 2, 2, 2, 569, 570, 3, 2, 2, 2, 570, 575, 3, 2, 2, 2, 571, 572, 5, 13, 7, 2, 572, 573, 5, 15, 8, 2, 573, 575, 3, 2, 2, 2, 574, 561, 3, 2, 2, 2, 574, 571, 3, 2, 2, 2, 575, 20, 3, 2, 2, 2, 576, 577, 7, 49, 2, 2, 577, 578, 7, 44, 2, 2, 578, 582, 3, 2, 2, 2, 579, 581, 11, 2, 2, 2, 580, 579, 3, 2, 2, 2, 581, 584, 3, 2, 2, 2, 582, 583, 3, 2, 2, 2, 582, 580, 3, 2, 2, 2, 583, 585, 3, 2, 2, 2, 584, 582, 3, 2, 2, 2, 585, 586, 7, 44, 2, 2, 586, 587, 7, 49, 2, 2, 587, 22, 3, 2, 2, 2, 588, 589, 7, 47, 2, 2, 589, 590, 7, 47, 2, 2, 590, 594, 3, 2, 2, 2, 591, 593, 10, 9, 2, 2, 592, 591, 3, 2, 2, 2, 593, 596, 3, 2, 2, 2, 594, 592, 3, 2, 2, 2, 594, 595, 3, 2, 2, 2, 595, 24, 3, 2, 2, 2, 596, 594, 3, 2, 2, 2, 597, 599, 9, 10, 2, 2, 598, 597, 3, 2, 2, 2, 599, 600, 3, 2, 2, 2, 600, 598, 3, 2, 2, 2, 600, 601, 3, 2, 2, 2, 601, 602, 3, 2, 2, 2, 602, 603, 8, 13, 2, 2, 603, 26, 3, 2, 2, 2, 604, 605, 7, 48, 2, 2, 605, 28, 3, 2, 2, 2, 606, 607, 7, 45, 2, 2, 607, 30, 3, 2, 2, 2, 608, 615, 7, 47, 2, 2, 609, 610, 9, 11, 2, 2, 610, 611, 9, 12, 2, 2, 611, 612, 9, 13, 2, 2, 612, 613, 9, 14, 2, 2, 613, 615, 9, 15, 2, 2, 614, 608, 3, 2, 2, 2, 614, 609, 3, 2, 2, 2, 615, 32, 3, 2, 2, 2, 616, 617, 7, 44, 2, 2, 617, 34, 3, 2, 2, 2, 618, 619, 7, 49, 2, 2, 619, 36, 3, 2, 2, 2, 620, 621, 7, 39, 2, 2, 621, 38, 3, 2, 2, 2, 622, 623, 7, 63, 2, 2, 623, 624, 7, 63, 2, 2, 624, 40, 3, 2, 2, 2, 625, 626, 7, 63, 2, 2, 626, 42, 3, 2, 2, 2, 627, 628, 7, 35, 2, 2, 628, 632, 7, 63, 2, 2, 629, 630, 7, 62, 2, 2, 630, 632, 7, 64, 2, 2, 631, 627, 3, 2, 2, 2, 631, 629, 3, 2, 2, 2, 632, 44, 3, 2, 2, 2, 633, 634, 7, 62, 2, 2, 634, 46, 3, 2, 2, 2, 635, 636, 7, 62, 2, 2, 636, 637, 7, 63, 2, 2, 637, 48, 3, 2, 2, 2, 638, 639, 7, 64, 2, 2, 639, 50, 3, 2, 2, 2, 640, 641, 7, 64, 2, 2, 641, 642, 7, 63, 2, 2, 642, 52, 3, 2, 2, 2, 643, 644, 7, 126, 2, 2, 644, 645, 7, 126, 2, 2, 645, 54, 3, 2, 2, 2, 646, 647, 7, 42, 2, 2, 647, 56, 3, 2, 2, 2, 648, 649, 7, 43, 2, 2, 649, 58, 3, 2, 2, 2, 650, 651, 7, 125, 2, 2, 651, 60, 3, 2, 2, 2, 652, 653, 7, 127, 2, 2, 653, 62, 3, 2, 2, 2, 654, 655, 7, 46, 2, 2, 655, 64, 3, 2, 2, 2, 656, 657, 7, 60, 2, 2, 657, 66, 3, 2, 2, 2, 658, 659, 7, 93, 2, 2, 659, 68, 3, 2, 2, 2, 660, 661, 7, 95, 2, 2, 661, 70, 3, 2, 2, 2, 662, 663, 7, 95, 2, 2, 663, 664, 7, 107, 2, 2, 664, 72, 3, 2, 2, 2, 665, 666, 7, 61, 2, 2, 666, 74, 3, 2, 2, 2, 667, 668, 7, 35, 2, 2, 668, 76, 3, 2, 2, 2, 669, 670, 9, 16, 2, 2, 670, 671, 9, 17, 2, 2, 671, 672, 9, 18, 2, 2, 672, 673, 9, 12, 2, 2, 673, 674, 9, 15, 2, 2, 674, 675, 9, 7, 2, 2, 675, 78, 3, 2, 2, 2, 676, 677, 9, 16, 2, 2, 677, 678, 9, 19, 2, 2, 678, 679, 9, 19, 2, 2, 679, 80, 3, 2, 2, 2, 680, 681, 9, 16, 2, 2, 681, 682, 9, 19, 2, 2, 682, 683, 9, 20, 2, 2, 683, 684, 9, 7, 2, 2, 684, 685, 9, 21, 2, 2, 685, 82, 3, 2, 2, 2, 686, 687, 9, 16, 2, 2, 687, 688, 9, 13, 2, 2, 688, 689, 9, 16, 2, 2, 689, 690, 9, 19, 2, 2, 690, 691, 9, 22, 2, 2, 691, 692, 9, 23, 2, 2, 692, 693, 9, 7, 2, 2, 693, 84, 3, 2, 2, 2, 694, 695, 9, 16, 2, 2, 695, 696, 9, 13, 2, 2, 696, 697, 9, 17, 2, 2, 697, 86, 3, 2, 2, 2, 698, 699, 9, 16, 2, 2, 699, 700, 9, 13, 2, 2, 700, 701, 9, 22, 2, 2, 701, 88, 3, 2, 2, 2, 702, 703, 9, 16, 2, 2, 703, 704, 9, 21, 2, 2, 704, 705, 9, 21, 2, 2, 705, 706, 9, 16, 2, 2, 706, 707, 9, 22, 2, 2, 707, 90, 3, 2, 2, 2, 708, 709, 9, 16, 2, 2, 709, 710, 9, 15, 2, 2, 710, 92, 3, 2, 2, 2, 711, 712, 9, 16, 2, 2, 712, 713, 9, 15, 2, 2, 713, 714, 9, 24, 2, 2, 714, 94, 3, 2, 2, 2, 715, 716, 9, 16, 2, 2, 716, 717, 9, 20, 2, 2, 717, 96, 3, 2, 2, 2, 718, 719, 9, 25, 2, 2, 719, 720, 9, 7, 2, 2, 720, 721, 9, 26, 2, 2, 721, 722, 9, 12, 2, 2, 722, 723, 9, 13, 2, 2, 723, 98, 3, 2, 2, 2, 724, 725, 9, 25, 2, 2, 725, 726, 9, 7, 2, 2, 726, 727, 9, 20, 2, 2, 727, 728, 9, 27, 2, 2, 728, 729, 9, 7, 2, 2, 729, 730, 9, 7, 2, 2, 730, 731, 9, 13, 2, 2, 731, 100, 3, 2, 2, 2, 732, 733, 9, 25, 2, 2, 733, 734, 9, 12, 2, 2, 734, 735, 9, 13, 2, 2, 735, 736, 9, 16, 2, 2, 736, 737, 9, 21, 2, 2, 737, 738, 9, 22, 2, 2, 738, 102, 3, 2, 2, 2, 739, 740, 9, 25, 2, 2, 740, 741, 9, 28, 2, 2, 741, 742, 9, 28, 2, 2, 742, 743, 9, 19, 2, 2, 743, 744, 9, 7, 2, 2, 744, 745, 9, 16, 2, 2, 745, 746, 9, 13, 2, 2, 746, 104, 3, 2, 2, 2, 747, 748, 9, 25, 2, 2, 748, 749, 9, 21, 2, 2, 749, 750, 9, 7, 2, 2, 750, 751, 9, 16, 2, 2, 751, 752, 9, 29, 2, 2, 752, 106, 3, 2, 2, 2, 753, 754, 9, 25, 2, 2, 754, 755, 9, 14, 2, 2, 755, 756, 9, 24, 2, 2, 756, 757, 9, 29, 2, 2, 757, 758, 9, 7, 2, 2, 758, 759, 9, 20, 2, 2, 759, 108, 3, 2, 2, 2, 760, 761, 9, 25, 2, 2, 761, 762, 9, 14, 2, 2, 762, 763, 9, 12, 2, 2, 763, 764, 9, 19, 2, 2, 764, 765, 9, 17, 2, 2, 765, 110, 3, 2, 2, 2, 766, 767, 9, 25, 2, 2, 767, 768, 9, 22, 2, 2, 768, 112, 3, 2, 2, 2, 769, 770, 9, 24, 2, 2, 770, 771, 9, 16, 2, 2, 771, 772, 9, 19, 2, 2, 772, 773, 9, 19, 2, 2, 773, 114, 3, 2, 2, 2, 774, 775, 9, 24, 2, 2, 775, 776, 9, 16, 2, 2, 776, 777, 9, 15, 2, 2, 777, 778, 9, 7, 2, 2, 778, 116, 3, 2, 2, 2, 779, 780, 9, 24, 2, 2, 780, 781, 9, 16, 2, 2, 781, 782, 9, 15, 2, 2, 782, 783, 9, 20, 2, 2, 783, 118, 3, 2, 2, 2, 784, 785, 9, 24, 2, 2, 785, 786, 9, 19, 2, 2, 786, 787, 9, 14, 2, 2, 787, 788, 9, 15, 2, 2, 788, 789, 9, 20, 2, 2, 789, 790, 9, 7, 2, 2, 790, 791, 9, 21, 2, 2, 791, 120, 3, 2, 2, 2, 792, 793, 9, 24, 2, 2, 793, 794, 9, 28, 2, 2, 794, 795, 9, 19, 2, 2, 795, 796, 9, 19, 2, 2, 796, 797, 9, 16, 2, 2, 797, 798, 9, 20, 2, 2, 798, 799, 9, 7, 2, 2, 799, 122, 3, 2, 2, 2, 800, 801, 9, 24, 2, 2, 801, 802, 9, 28, 2, 2, 802, 803, 9, 19, 2, 2, 803, 804, 9, 19, 2, 2, 804, 805, 9, 7, 2, 2, 805, 806, 9, 24, 2, 2, 806, 807, 9, 20, 2, 2, 807, 808, 9, 12, 2, 2, 808, 809, 9, 28, 2, 2, 809, 810, 9, 13, 2, 2, 810, 124, 3, 2, 2, 2, 811, 812, 9, 24, 2, 2, 812, 813, 9, 28, 2, 2, 813, 814, 9, 11, 2, 2, 814, 815, 9, 11, 2, 2, 815, 816, 9, 12, 2, 2, 816, 817, 9, 20, 2, 2, 817, 126, 3, 2, 2, 2, 818, 819, 9, 24, 2, 2, 819, 820, 9, 28, 2, 2, 820, 821, 9, 11, 2, 2, 821, 822, 9, 11, 2, 2, 822, 823, 9, 12, 2, 2, 823, 824, 9, 20, 2, 2, 824, 825, 9, 20, 2, 2, 825, 826, 9, 7, 2, 2, 826, 827, 9, 17, 2, 2, 827, 128, 3, 2, 2, 2, 828, 829, 9, 24, 2, 2, 829, 830, 9, 28, 2, 2, 830, 831, 9, 13, 2, 2, 831, 832, 9, 13, 2, 2, 832, 833, 9, 7, 2, 2, 833, 834, 9, 24, 2, 2, 834, 835, 9, 20, 2, 2, 835, 130, 3, 2, 2, 2, 836, 837, 9, 24, 2, 2, 837, 838, 9, 28, 2, 2, 838, 839, 9, 13, 2, 2, 839, 840, 9, 20, 2, 2, 840, 841, 9, 12, 2, 2, 841, 842, 9, 13, 2, 2, 842, 843, 9, 14, 2, 2, 843, 844, 9, 7, 2, 2, 844, 132, 3, 2, 2, 2, 845, 846, 9, 24, 2, 2, 846, 847, 9, 28, 2, 2, 847, 848, 9, 21, 2, 2, 848, 849, 9, 21, 2, 2, 849, 850, 9, 7, 2, 2, 850, 851, 9, 19, 2, 2, 851, 852, 9, 16, 2, 2, 852, 853, 9, 20, 2, 2, 853, 854, 9, 7, 2, 2, 854, 855, 9, 17, 2, 2, 855, 134, 3, 2, 2, 2, 856, 857, 9, 24, 2, 2, 857, 858, 9, 28, 2, 2, 858, 859, 9, 18, 2, 2, 859, 860, 9, 7, 2, 2, 860, 861, 9, 21, 2, 2, 861, 136, 3, 2, 2, 2, 862, 863, 9, 24, 2, 2, 863, 864, 9, 21, 2, 2, 864, 865, 9, 7, 2, 2, 865, 866, 9, 16, 2, 2, 866, 867, 9, 20, 2, 2, 867, 868, 9, 7, 2, 2, 868, 138, 3, 2, 2, 2, 869, 870, 9, 24, 2, 2, 870, 871, 9, 14, 2, 2, 871, 872, 9, 21, 2, 2, 872, 873, 9, 21, 2, 2, 873, 874, 9, 7, 2, 2, 874, 875, 9, 13, 2, 2, 875, 876, 9, 20, 2, 2, 876, 140, 3, 2, 2, 2, 877, 878, 9, 17, 2, 2, 878, 879, 9, 16, 2, 2, 879, 880, 9, 20, 2, 2, 880, 881, 9, 16, 2, 2, 881, 882, 9, 25, 2, 2, 882, 883, 9, 16, 2, 2, 883, 884, 9, 15, 2, 2, 884, 885, 9, 7, 2, 2, 885, 142, 3, 2, 2, 2, 886, 887, 9, 17, 2, 2, 887, 888, 9, 16, 2, 2, 888, 889, 9, 20, 2, 2, 889, 890, 9, 16, 2, 2, 890, 891, 9, 15, 2, 2, 891, 892, 9, 7, 2, 2, 892, 893, 9, 20, 2, 2, 893, 144, 3, 2, 2, 2, 894, 895, 9, 17, 2, 2, 895, 896, 9, 16, 2, 2, 896, 897, 9, 20, 2, 2, 897, 898, 9, 16, 2, 2, 898, 899, 9, 15, 2, 2, 899, 900, 9, 20, 2, 2, 900, 901, 9, 28, 2, 2, 901, 902, 9, 21, 2, 2, 902, 903, 9, 7, 2, 2, 903, 146, 3, 2, 2, 2, 904, 905, 9, 17, 2, 2, 905, 906, 9, 7, 2, 2, 906, 907, 9, 24, 2, 2, 907, 908, 9, 19, 2, 2, 908, 909, 9, 16, 2, 2, 909, 910, 9, 21, 2, 2, 910, 911, 9, 7, 2, 2, 911, 148, 3, 2, 2, 2, 912, 913, 9, 17, 2, 2, 913, 914, 9, 7, 2, 2, 914, 915, 9, 24, 2, 2, 915, 916, 9, 21, 2, 2, 916, 917, 9, 7, 2, 2, 917, 918, 9, 11, 2, 2, 918, 919, 9, 7, 2, 2, 919, 920, 9, 13, 2, 2, 920, 921, 9, 20, 2, 2, 921, 150, 3, 2, 2, 2, 922, 923, 9, 17, 2, 2, 923, 924, 9, 7, 2, 2, 924, 925, 9, 19, 2, 2, 925, 926, 9, 7, 2, 2, 926, 927, 9, 20, 2, 2, 927, 928, 9, 7, 2, 2, 928, 152, 3, 2, 2, 2, 929, 930, 9, 17, 2, 2, 930, 931, 9, 7, 2, 2, 931, 932, 9, 21, 2, 2, 932, 933, 9, 12, 2, 2, 933, 934, 9, 18, 2, 2, 934, 935, 9, 7, 2, 2, 935, 936, 9, 17, 2, 2, 936, 154, 3, 2, 2, 2, 937, 938, 9, 17, 2, 2, 938, 939, 9, 7, 2, 2, 939, 940, 9, 15, 2, 2, 940, 941, 9, 24, 2, 2, 941, 156, 3, 2, 2, 2, 942, 943, 9, 17, 2, 2, 943, 944, 9, 7, 2, 2, 944, 945, 9, 15, 2, 2, 945, 946, 9, 24, 2, 2, 946, 947, 9, 21, 2, 2, 947, 948, 9, 12, 2, 2, 948, 949, 9, 25, 2, 2, 949, 950, 9, 7, 2, 2, 950, 158, 3, 2, 2, 2, 951, 952, 9, 17, 2, 2, 952, 953, 9, 12, 2, 2, 953, 954, 9, 15, 2, 2, 954, 955, 9, 20, 2, 2, 955, 956, 9, 12, 2, 2, 956, 957, 9, 13, 2, 2, 957, 958, 9, 24, 2, 2, 958, 959, 9, 20, 2, 2, 959, 160, 3, 2, 2, 2, 960, 961, 9, 17, 2, 2, 961, 962, 9, 28, 2, 2, 962, 162, 3, 2, 2, 2, 963, 964, 9, 17, 2, 2, 964, 965, 9, 21, 2, 2, 965, 966, 9, 28, 2, 2, 966, 967, 9, 30, 2, 2, 967, 164, 3, 2, 2, 2, 968, 969, 9, 7, 2, 2, 969, 970, 9, 16, 2, 2, 970, 971, 9, 24, 2, 2, 971, 972, 9, 31, 2, 2, 972, 166, 3, 2, 2, 2, 973, 974, 9, 7, 2, 2, 974, 975, 9, 19, 2, 2, 975, 976, 9, 7, 2, 2, 976, 977, 9, 11, 2, 2, 977, 978, 9, 7, 2, 2, 978, 979, 9, 13, 2, 2, 979, 980, 9, 20, 2, 2, 980, 168, 3, 2, 2, 2, 981, 982, 9, 7, 2, 2, 982, 983, 9, 19, 2, 2, 983, 984, 9, 15, 2, 2, 984, 985, 9, 7, 2, 2, 985, 170, 3, 2, 2, 2, 986, 987, 9, 7, 2, 2, 987, 988, 9, 13, 2, 2, 988, 989, 9, 17, 2, 2, 989, 172, 3, 2, 2, 2, 990, 991, 9, 7, 2, 2, 991, 992, 9, 18, 2, 2, 992, 993, 9, 7, 2, 2, 993, 994, 9, 21, 2, 2, 994, 995, 9, 22, 2, 2, 995, 174, 3, 2, 2, 2, 996, 997, 9, 7, 2, 2, 997, 998, 9, 32, 2, 2, 998, 999, 9, 24, 2, 2, 999, 1000, 9, 7, 2, 2, 1000, 1001, 9, 30, 2, 2, 1001, 1002, 9, 20, 2, 2, 1002, 176, 3, 2, 2, 2, 1003, 1004, 9, 7, 2, 2, 1004, 1005, 9, 32, 2, 2, 1005, 1006, 9, 24, 2, 2, 1006, 1007, 9, 19, 2, 2, 1007, 1008, 9, 14, 2, 2, 1008, 1009, 9, 17, 2, 2, 1009, 1010, 9, 7, 2, 2, 1010, 178, 3, 2, 2, 2, 1011, 1012, 9, 7, 2, 2, 1012, 1013, 9, 32, 2, 2, 1013, 1014, 9, 7, 2, 2, 1014, 1015, 9, 24, 2, 2, 1015, 1016, 9, 14, 2, 2, 1016, 1017, 9, 20, 2, 2, 1017, 1018, 9, 7, 2, 2, 1018, 180, 3, 2, 2, 2, 1019, 1020, 9, 7, 2, 2, 1020, 1021, 9, 32, 2, 2, 1021, 1022, 9, 12, 2, 2, 1022, 1023, 9, 15, 2, 2, 1023, 1024, 9, 20, 2, 2, 1024, 1025, 9, 15, 2, 2, 1025, 182, 3, 2, 2, 2, 1026, 1027, 9, 7, 2, 2, 1027, 1028, 9, 32, 2, 2, 1028, 1029, 9, 30, 2, 2, 1029, 1030, 9, 19, 2, 2, 1030, 1031, 9, 16, 2, 2, 1031, 1032, 9, 12, 2, 2, 1032, 1033, 9, 13, 2, 2, 1033, 184, 3, 2, 2, 2, 1034, 1035, 9, 33, 2, 2, 1035, 1036, 9, 16, 2, 2, 1036, 1037, 9, 19, 2, 2, 1037, 1038, 9, 15, 2, 2, 1038, 1039, 9, 7, 2, 2, 1039, 186, 3, 2, 2, 2, 1040, 1041, 9, 33, 2, 2, 1041, 1042, 9, 7, 2, 2, 1042, 1043, 9, 20, 2, 2, 1043, 1044, 9, 24, 2, 2, 1044, 1045, 9, 31, 2, 2, 1045, 188, 3, 2, 2, 2, 1046, 1047, 9, 33, 2, 2, 1047, 1048, 9, 12, 2, 2, 1048, 1049, 9, 19, 2, 2, 1049, 1050, 9, 20, 2, 2, 1050, 1051, 9, 7, 2, 2, 1051, 1052, 9, 21, 2, 2, 1052, 190, 3, 2, 2, 2, 1053, 1054, 9, 33, 2, 2, 1054, 1055, 9, 12, 2, 2, 1055, 1056, 9, 21, 2, 2, 1056, 1057, 9, 15, 2, 2, 1057, 1058, 9, 20, 2, 2, 1058, 192, 3, 2, 2, 2, 1059, 1060, 9, 33, 2, 2, 1060, 1061, 9, 19, 2, 2, 1061, 1062, 9, 16, 2, 2, 1062, 1063, 9, 20, 2, 2, 1063, 1064, 9, 20, 2, 2, 1064, 1065, 9, 7, 2, 2, 1065, 1066, 9, 13, 2, 2, 1066, 194, 3, 2, 2, 2, 1067, 1068, 9, 33, 2, 2, 1068, 1069, 9, 19, 2, 2, 1069, 1070, 9, 14, 2, 2, 1070, 1071, 9, 15, 2, 2, 1071, 1072, 9, 31, 2, 2, 1072, 196, 3, 2, 2, 2, 1073, 1074, 9, 33, 2, 2, 1074, 1075, 9, 28, 2, 2, 1075, 1076, 9, 19, 2, 2, 1076, 1077, 9, 19, 2, 2, 1077, 1078, 9, 28, 2, 2, 1078, 1079, 9, 27, 2, 2, 1079, 1080, 9, 12, 2, 2, 1080, 1081, 9, 13, 2, 2, 1081, 1082, 9, 26, 2, 2, 1082, 198, 3, 2, 2, 2, 1083, 1084, 9, 33, 2, 2, 1084, 1085, 9, 28, 2, 2, 1085, 1086, 9, 21, 2, 2, 1086, 200, 3, 2, 2, 2, 1087, 1088, 9, 33, 2, 2, 1088, 1089, 9, 28, 2, 2, 1089, 1090, 9, 21, 2, 2, 1090, 1091, 9, 24, 2, 2, 1091, 1092, 9, 7, 2, 2, 1092, 202, 3, 2, 2, 2, 1093, 1094, 9, 33, 2, 2, 1094, 1095, 9, 21, 2, 2, 1095, 1096, 9, 28, 2, 2, 1096, 1097, 9, 11, 2, 2, 1097, 204, 3, 2, 2, 2, 1098, 1099, 9, 33, 2, 2, 1099, 1100, 9, 20, 2, 2, 1100, 1101, 9, 15, 2, 2, 1101, 206, 3, 2, 2, 2, 1102, 1103, 9, 33, 2, 2, 1103, 1104, 9, 14, 2, 2, 1104, 1105, 9, 13, 2, 2, 1105, 1106, 9, 24, 2, 2, 1106, 1107, 9, 20, 2, 2, 1107, 1108, 9, 12, 2, 2, 1108, 1109, 9, 28, 2, 2, 1109, 1110, 9, 13, 2, 2, 1110, 208, 3, 2, 2, 2, 1111, 1112, 9, 26, 2, 2, 1112, 1113, 9, 28, 2, 2, 1113, 1114, 9, 19, 2, 2, 1114, 1115, 9, 16, 2, 2, 1115, 1116, 9, 13, 2, 2, 1116, 1117, 9, 26, 2, 2, 1117, 210, 3, 2, 2, 2, 1118, 1119, 9, 26, 2, 2, 1119, 1120, 9, 21, 2, 2, 1120, 1121, 9, 16, 2, 2, 1121, 1122, 9, 13, 2, 2, 1122, 1123, 9, 20, 2, 2, 1123, 212, 3, 2, 2, 2, 1124, 1125, 9, 26, 2, 2, 1125, 1126, 9, 21, 2, 2, 1126, 1127, 9, 28, 2, 2, 1127, 1128, 9, 14, 2, 2, 1128, 1129, 9, 30, 2, 2, 1129, 214, 3, 2, 2, 2, 1130, 1131, 9, 26, 2, 2, 1131, 1132, 9, 21, 2, 2, 1132, 1133, 9, 28, 2, 2, 1133, 1134, 9, 14, 2, 2, 1134, 1135, 9, 30, 2, 2, 1135, 1136, 9, 15, 2, 2, 1136, 216, 3, 2, 2, 2, 1137, 1138, 9, 26, 2, 2, 1138, 1139, 9, 15, 2, 2, 1139, 1140, 9, 12, 2, 2, 1140, 218, 3, 2, 2, 2, 1141, 1142, 9, 31, 2, 2, 1142, 1143, 9, 16, 2, 2, 1143, 1144, 9, 15, 2, 2, 1144, 1145, 9, 31, 2, 2, 1145, 220, 3, 2, 2, 2, 1146, 1147, 9, 31, 2, 2, 1147, 1148, 9, 16, 2, 2, 1148, 1149, 9, 18, 2, 2, 1149, 1150, 9, 12, 2, 2, 1150, 1151, 9, 13, 2, 2, 1151, 1152, 9, 26, 2, 2, 1152, 222, 3, 2, 2, 2, 1153, 1154, 9, 12, 2, 2, 1154, 1155, 9, 33, 2, 2, 1155, 224, 3, 2, 2, 2, 1156, 1157, 9, 12, 2, 2, 1157, 1158, 9, 26, 2, 2, 1158, 1159, 9, 13, 2, 2, 1159, 1160, 9, 28, 2, 2, 1160, 1161, 9, 21, 2, 2, 1161, 1162, 9, 7, 2, 2, 1162, 226, 3, 2, 2, 2, 1163, 1164, 9, 12, 2, 2, 1164, 1165, 9, 19, 2, 2, 1165, 1166, 9, 12, 2, 2, 1166, 1167, 9, 29, 2, 2, 1167, 1168, 9, 7, 2, 2, 1168, 228, 3, 2, 2, 2, 1169, 1170, 9, 12, 2, 2, 1170, 1171, 9, 13, 2, 2, 1171, 230, 3, 2, 2, 2, 1172, 1173, 9, 12, 2, 2, 1173, 1174, 9, 13, 2, 2, 1174, 1175, 9, 24, 2, 2, 1175, 1176, 9, 19, 2, 2, 1176, 1177, 9, 14, 2, 2, 1177, 1178, 9, 17, 2, 2, 1178, 1179, 9, 7, 2, 2, 1179, 232, 3, 2, 2, 2, 1180, 1181, 9, 12, 2, 2, 1181, 1182, 9, 13, 2, 2, 1182, 1183, 9, 24, 2, 2, 1183, 1184, 9, 21, 2, 2, 1184, 1185, 9, 7, 2, 2, 1185, 1186, 9, 11, 2, 2, 1186, 1187, 9, 7, 2, 2, 1187, 1188, 9, 13, 2, 2, 1188, 1189, 9, 20, 2, 2, 1189, 234, 3, 2, 2, 2, 1190, 1191, 9, 12, 2, 2, 1191, 1192, 9, 13, 2, 2, 1192, 1193, 9, 17, 2, 2, 1193, 1194, 9, 7, 2, 2, 1194, 1195, 9, 32, 2, 2, 1195, 236, 3, 2, 2, 2, 1196, 1197, 9, 12, 2, 2, 1197, 1198, 9, 13, 2, 2, 1198, 1199, 9, 33, 2, 2, 1199, 1200, 9, 7, 2, 2, 1200, 1201, 9, 21, 2, 2, 1201, 238, 3, 2, 2, 2, 1202, 1203, 9, 12, 2, 2, 1203, 1204, 9, 13, 2, 2, 1204, 1205, 9, 19, 2, 2, 1205, 1206, 9, 12, 2, 2, 1206, 1207, 9, 13, 2, 2, 1207, 1208, 9, 7, 2, 2, 1208, 240, 3, 2, 2, 2, 1209, 1210, 9, 12, 2, 2, 1210, 1211, 9, 13, 2, 2, 1211, 1212, 9, 13, 2, 2, 1212, 1213, 9, 7, 2, 2, 1213, 1214, 9, 21, 2, 2, 1214, 242, 3, 2, 2, 2, 1215, 1216, 9, 12, 2, 2, 1216, 1217, 9, 13, 2, 2, 1217, 1218, 9, 15, 2, 2, 1218, 1219, 9, 7, 2, 2, 1219, 1220, 9, 21, 2, 2, 1220, 1221, 9, 20, 2, 2, 1221, 244, 3, 2, 2, 2, 1222, 1223, 9, 12, 2, 2, 1223, 1224, 9, 13, 2, 2, 1224, 1225, 9, 20, 2, 2, 1225, 1226, 9, 7, 2, 2, 1226, 1227, 9, 21, 2, 2, 1227, 1228, 9, 15, 2, 2, 1228, 1229, 9, 7, 2, 2, 1229, 1230, 9, 24, 2, 2, 1230, 1231, 9, 20, 2, 2, 1231, 246, 3, 2, 2, 2, 1232, 1233, 9, 12, 2, 2, 1233, 1234, 9, 13, 2, 2, 1234, 1235, 9, 20, 2, 2, 1235, 1236, 9, 28, 2, 2, 1236, 248, 3, 2, 2, 2, 1237, 1238, 9, 12, 2, 2, 1238, 1239, 9, 15, 2, 2, 1239, 250, 3, 2, 2, 2, 1240, 1241, 9, 12, 2, 2, 1241, 1242, 9, 15, 2, 2, 1242, 1243, 9, 28, 2, 2, 1243, 1244, 9, 19, 2, 2, 1244, 1245, 9, 16, 2, 2, 1245, 1246, 9, 20, 2, 2, 1246, 1247, 9, 12, 2, 2, 1247, 1248, 9, 28, 2, 2, 1248, 1249, 9, 13, 2, 2, 1249, 252, 3, 2, 2, 2, 1250, 1251, 9, 34, 2, 2, 1251, 1252, 9, 16, 2, 2, 1252, 1253, 9, 18, 2, 2, 1253, 1254, 9, 16, 2, 2, 1254, 1255, 9, 15, 2, 2, 1255, 1256, 9, 24, 2, 2, 1256, 1257, 9, 21, 2, 2, 1257, 1258, 9, 12, 2, 2, 1258, 1259, 9, 30, 2, 2, 1259, 1260, 9, 20, 2, 2, 1260, 254, 3, 2, 2, 2, 1261, 1262, 9, 34, 2, 2, 1262, 1263, 9, 28, 2, 2, 1263, 1264, 9, 12, 2, 2, 1264, 1265, 9, 13, 2, 2, 1265, 256, 3, 2, 2, 2, 1266, 1267, 9, 29, 2, 2, 1267, 1268, 9, 7, 2, 2, 1268, 1269, 9, 22, 2, 2, 1269, 258, 3, 2, 2, 2, 1270, 1271, 9, 29, 2, 2, 1271, 1272, 9, 7, 2, 2, 1272, 1273, 9, 22, 2, 2, 1273, 1274, 9, 15, 2, 2, 1274, 260, 3, 2, 2, 2, 1275, 1276, 9, 29, 2, 2, 1276, 1277, 9, 7, 2, 2, 1277, 1278, 9, 22, 2, 2, 1278, 1279, 9, 15, 2, 2, 1279, 1280, 9, 30, 2, 2, 1280, 1281, 9, 16, 2, 2, 1281, 1282, 9, 24, 2, 2, 1282, 1283, 9, 7, 2, 2, 1283, 262, 3, 2, 2, 2, 1284, 1285, 9, 29, 2, 2, 1285, 1286, 9, 13, 2, 2, 1286, 1287, 9, 28, 2, 2, 1287, 1288, 9, 27, 2, 2, 1288, 1289, 9, 13, 2, 2, 1289, 264, 3, 2, 2, 2, 1290, 1291, 9, 19, 2, 2, 1291, 1292, 9, 16, 2, 2, 1292, 1293, 9, 13, 2, 2, 1293, 1294, 9, 26, 2, 2, 1294, 1295, 9, 14, 2, 2, 1295, 1296, 9, 16, 2, 2, 1296, 1297, 9, 26, 2, 2, 1297, 1298, 9, 7, 2, 2, 1298, 266, 3, 2, 2, 2, 1299, 1300, 9, 19, 2, 2, 1300, 1301, 9, 16, 2, 2, 1301, 1302, 9, 15, 2, 2, 1302, 1303, 9, 20, 2, 2, 1303, 268, 3, 2, 2, 2, 1304, 1305, 9, 19, 2, 2, 1305, 1306, 9, 7, 2, 2, 1306, 1307, 9, 33, 2, 2, 1307, 1308, 9, 20, 2, 2, 1308, 270, 3, 2, 2, 2, 1309, 1310, 9, 19, 2, 2, 1310, 1311, 9, 7, 2, 2, 1311, 1312, 9, 20, 2, 2, 1312, 272, 3, 2, 2, 2, 1313, 1314, 9, 19, 2, 2, 1314, 1315, 9, 7, 2, 2, 1315, 1316, 9, 20, 2, 2, 1316, 1317, 9, 20, 2, 2, 1317, 1318, 9, 12, 2, 2, 1318, 1319, 9, 13, 2, 2, 1319, 1320, 9, 26, 2, 2, 1320, 274, 3, 2, 2, 2, 1321, 1322, 9, 19, 2, 2, 1322, 1323, 9, 7, 2, 2, 1323, 1324, 9, 18, 2, 2, 1324, 1325, 9, 7, 2, 2, 1325, 1326, 9, 19, 2, 2, 1326, 276, 3, 2, 2, 2, 1327, 1328, 9, 19, 2, 2, 1328, 1329, 9, 12, 2, 2, 1329, 1330, 9, 29, 2, 2, 1330, 1331, 9, 7, 2, 2, 1331, 278, 3, 2, 2, 2, 1332, 1333, 9, 19, 2, 2, 1333, 1334, 9, 12, 2, 2, 1334, 1335, 9, 11, 2, 2, 1335, 1336, 9, 12, 2, 2, 1336, 1337, 9, 20, 2, 2, 1337, 280, 3, 2, 2, 2, 1338, 1339, 9, 19, 2, 2, 1339, 1340, 9, 15, 2, 2, 1340, 1341, 9, 11, 2, 2, 1341, 282, 3, 2, 2, 2, 1342, 1343, 9, 11, 2, 2, 1343, 1344, 9, 16, 2, 2, 1344, 1345, 9, 30, 2, 2, 1345, 284, 3, 2, 2, 2, 1346, 1347, 9, 11, 2, 2, 1347, 1348, 9, 16, 2, 2, 1348, 1349, 9, 30, 2, 2, 1349, 1350, 9, 30, 2, 2, 1350, 1351, 9, 12, 2, 2, 1351, 1352, 9, 13, 2, 2, 1352, 1353, 9, 26, 2, 2, 1353, 286, 3, 2, 2, 2, 1354, 1355, 9, 11, 2, 2, 1355, 1356, 9, 16, 2, 2, 1356, 1357, 9, 20, 2, 2, 1357, 1358, 9, 24, 2, 2, 1358, 1359, 9, 31, 2, 2, 1359, 1360, 9, 7, 2, 2, 1360, 1361, 9, 17, 2, 2, 1361, 288, 3, 2, 2, 2, 1362, 1363, 9, 11, 2, 2, 1363, 1364, 9, 16, 2, 2, 1364, 1365, 9, 20, 2, 2, 1365, 1366, 9, 7, 2, 2, 1366, 1367, 9, 21, 2, 2, 1367, 1368, 9, 12, 2, 2, 1368, 1369, 9, 16, 2, 2, 1369, 1370, 9, 19, 2, 2, 1370, 1371, 9, 12, 2, 2, 1371, 1372, 9, 23, 2, 2, 1372, 1373, 9, 7, 2, 2, 1373, 1374, 9, 17, 2, 2, 1374, 290, 3, 2, 2, 2, 1375, 1376, 9, 11, 2, 2, 1376, 1377, 9, 7, 2, 2, 1377, 1378, 9, 21, 2, 2, 1378, 1379, 9, 26, 2, 2, 1379, 1380, 9, 7, 2, 2, 1380, 292, 3, 2, 2, 2, 1381, 1382, 9, 11, 2, 2, 1382, 1383, 9, 12, 2, 2, 1383, 1384, 9, 15, 2, 2, 1384, 1385, 9, 15, 2, 2, 1385, 1386, 9, 12, 2, 2, 1386, 1387, 9, 13, 2, 2, 1387, 1388, 9, 26, 2, 2, 1388, 294, 3, 2, 2, 2, 1389, 1390, 9, 13, 2, 2, 1390, 1391, 9, 16, 2, 2, 1391, 1392, 9, 11, 2, 2, 1392, 1393, 9, 7, 2, 2, 1393, 1394, 9, 15, 2, 2, 1394, 1395, 9, 30, 2, 2, 1395, 1396, 9, 16, 2, 2, 1396, 1397, 9, 24, 2, 2, 1397, 1398, 9, 7, 2, 2, 1398, 296, 3, 2, 2, 2, 1399, 1400, 9, 13, 2, 2, 1400, 1401, 9, 7, 2, 2, 1401, 1402, 9, 15, 2, 2, 1402, 1403, 9, 20, 2, 2, 1403, 298, 3, 2, 2, 2, 1404, 1405, 9, 13, 2, 2, 1405, 1406, 9, 19, 2, 2, 1406, 300, 3, 2, 2, 2, 1407, 1408, 9, 13, 2, 2, 1408, 1409, 9, 28, 2, 2, 1409, 302, 3, 2, 2, 2, 1410, 1411, 9, 13, 2, 2, 1411, 1412, 9, 28, 2, 2, 1412, 1413, 9, 20, 2, 2, 1413, 304, 3, 2, 2, 2, 1414, 1415, 9, 13, 2, 2, 1415, 1416, 9, 20, 2, 2, 1416, 1417, 9, 31, 2, 2, 1417, 1418, 9, 35, 2, 2, 1418, 1419, 9, 18, 2, 2, 1419, 1420, 9, 16, 2, 2, 1420, 1421, 9, 19, 2, 2, 1421, 1422, 9, 14, 2, 2, 1422, 1423, 9, 7, 2, 2, 1423, 306, 3, 2, 2, 2, 1424, 1425, 9, 13, 2, 2, 1425, 1426, 9, 14, 2, 2, 1426, 1427, 9, 19, 2, 2, 1427, 1428, 9, 19, 2, 2, 1428, 308, 3, 2, 2, 2, 1429, 1430, 9, 13, 2, 2, 1430, 1431, 9, 14, 2, 2, 1431, 1432, 9, 19, 2, 2, 1432, 1433, 9, 19, 2, 2, 1433, 1434, 9, 15, 2, 2, 1434, 310, 3, 2, 2, 2, 1435, 1436, 9, 13, 2, 2, 1436, 1437, 9, 36, 2, 2, 1437, 1438, 9, 11, 2, 2, 1438, 1439, 9, 25, 2, 2, 1439, 1440, 9, 7, 2, 2, 1440, 1441, 9, 21, 2, 2, 1441, 312, 3, 2, 2, 2, 1442, 1443, 9, 28, 2, 2, 1443, 1444, 9, 25, 2, 2, 1444, 1445, 9, 34, 2, 2, 1445, 1446, 9, 7, 2, 2, 1446, 1447, 9, 24, 2, 2, 1447, 1448, 9, 20, 2, 2, 1448, 314, 3, 2, 2, 2, 1449, 1450, 9, 28, 2, 2, 1450, 1451, 9, 33, 2, 2, 1451, 1452, 9, 33, 2, 2, 1452, 1453, 9, 15, 2, 2, 1453, 1454, 9, 7, 2, 2, 1454, 1455, 9, 20, 2, 2, 1455, 316, 3, 2, 2, 2, 1456, 1457, 9, 28, 2, 2, 1457, 1458, 9, 13, 2, 2, 1458, 318, 3, 2, 2, 2, 1459, 1460, 9, 28, 2, 2, 1460, 1461, 9, 30, 2, 2, 1461, 1462, 9, 20, 2, 2, 1462, 1463, 9, 12, 2, 2, 1463, 1464, 9, 28, 2, 2, 1464, 1465, 9, 13, 2, 2, 1465, 320, 3, 2, 2, 2, 1466, 1467, 9, 28, 2, 2, 1467, 1468, 9, 30, 2, 2, 1468, 1469, 9, 20, 2, 2, 1469, 1470, 9, 12, 2, 2, 1470, 1471, 9, 28, 2, 2, 1471, 1472, 9, 13, 2, 2, 1472, 1473, 9, 15, 2, 2, 1473, 322, 3, 2, 2, 2, 1474, 1475, 9, 28, 2, 2, 1475, 1476, 9, 21, 2, 2, 1476, 324, 3, 2, 2, 2, 1477, 1478, 9, 28, 2, 2, 1478, 1479, 9, 21, 2, 2, 1479, 1480, 9, 17, 2, 2, 1480, 1481, 9, 7, 2, 2, 1481, 1482, 9, 21, 2, 2, 1482, 326, 3, 2, 2, 2, 1483, 1484, 9, 28, 2, 2, 1484, 1485, 9, 20, 2, 2, 1485, 1486, 9, 31, 2, 2, 1486, 1487, 9, 7, 2, 2, 1487, 1488, 9, 21, 2, 2, 1488, 1489, 9, 15, 2, 2, 1489, 328, 3, 2, 2, 2, 1490, 1491, 9, 28, 2, 2, 1491, 1492, 9, 14, 2, 2, 1492, 1493, 9, 20, 2, 2, 1493, 1494, 9, 7, 2, 2, 1494, 1495, 9, 21, 2, 2, 1495, 330, 3, 2, 2, 2, 1496, 1497, 9, 28, 2, 2, 1497, 1498, 9, 18, 2, 2, 1498, 1499, 9, 7, 2, 2, 1499, 1500, 9, 21, 2, 2, 1500, 332, 3, 2, 2, 2, 1501, 1502, 9, 30, 2, 2, 1502, 1503, 9, 16, 2, 2, 1503, 1504, 9, 21, 2, 2, 1504, 1505, 9, 15, 2, 2, 1505, 1506, 9, 7, 2, 2, 1506, 334, 3, 2, 2, 2, 1507, 1508, 9, 30, 2, 2, 1508, 1509, 9, 16, 2, 2, 1509, 1510, 9, 21, 2, 2, 1510, 1511, 9, 20, 2, 2, 1511, 1512, 9, 12, 2, 2, 1512, 1513, 9, 20, 2, 2, 1513, 1514, 9, 12, 2, 2, 1514, 1515, 9, 28, 2, 2, 1515, 1516, 9, 13, 2, 2, 1516, 336, 3, 2, 2, 2, 1517, 1518, 9, 30, 2, 2, 1518, 1519, 9, 16, 2, 2, 1519, 1520, 9, 15, 2, 2, 1520, 1521, 9, 15, 2, 2, 1521, 1522, 9, 27, 2, 2, 1522, 1523, 9, 28, 2, 2, 1523, 1524, 9, 21, 2, 2, 1524, 1525, 9, 17, 2, 2, 1525, 338, 3, 2, 2, 2, 1526, 1527, 9, 30, 2, 2, 1527, 1528, 9, 16, 2, 2, 1528, 1529, 9, 20, 2, 2, 1529, 1530, 9, 31, 2, 2, 1530, 340, 3, 2, 2, 2, 1531, 1532, 9, 30, 2, 2, 1532, 1533, 9, 28, 2, 2, 1533, 1534, 9, 28, 2, 2, 1534, 1535, 9, 19, 2, 2, 1535, 342, 3, 2, 2, 2, 1536, 1537, 9, 30, 2, 2, 1537, 1538, 9, 21, 2, 2, 1538, 1539, 9, 7, 2, 2, 1539, 1540, 9, 24, 2, 2, 1540, 1541, 9, 7, 2, 2, 1541, 1542, 9, 17, 2, 2, 1542, 1543, 9, 12, 2, 2, 1543, 1544, 9, 13, 2, 2, 1544, 1545, 9, 26, 2, 2, 1545, 344, 3, 2, 2, 2, 1546, 1547, 9, 30, 2, 2, 1547, 1548, 9, 21, 2, 2, 1548, 1549, 9, 7, 2, 2, 1549, 1550, 9, 30, 2, 2, 1550, 1551, 9, 16, 2, 2, 1551, 1552, 9, 21, 2, 2, 1552, 1553, 9, 7, 2, 2, 1553, 346, 3, 2, 2, 2, 1554, 1555, 9, 30, 2, 2, 1555, 1556, 9, 21, 2, 2, 1556, 1557, 9, 12, 2, 2, 1557, 1558, 9, 11, 2, 2, 1558, 1559, 9, 16, 2, 2, 1559, 1560, 9, 21, 2, 2, 1560, 1561, 9, 22, 2, 2, 1561, 348, 3, 2, 2, 2, 1562, 1563, 9, 30, 2, 2, 1563, 1564, 9, 21, 2, 2, 1564, 1565, 9, 12, 2, 2, 1565, 1566, 9, 18, 2, 2, 1566, 1567, 9, 16, 2, 2, 1567, 1568, 9, 20, 2, 2, 1568, 1569, 9, 7, 2, 2, 1569, 350, 3, 2, 2, 2, 1570, 1571, 9, 30, 2, 2, 1571, 1572, 9, 21, 2, 2, 1572, 1573, 9, 12, 2, 2, 1573, 1574, 9, 18, 2, 2, 1574, 1575, 9, 12, 2, 2, 1575, 1576, 9, 19, 2, 2, 1576, 1577, 9, 7, 2, 2, 1577, 1578, 9, 26, 2, 2, 1578, 1579, 9, 7, 2, 2, 1579, 352, 3, 2, 2, 2, 1580, 1581, 9, 30, 2, 2, 1581, 1582, 9, 21, 2, 2, 1582, 1583, 9, 28, 2, 2, 1583, 1584, 9, 24, 2, 2, 1584, 1585, 9, 7, 2, 2, 1585, 1586, 9, 17, 2, 2, 1586, 1587, 9, 14, 2, 2, 1587, 1588, 9, 21, 2, 2, 1588, 1589, 9, 7, 2, 2, 1589, 354, 3, 2, 2, 2, 1590, 1591, 9, 30, 2, 2, 1591, 1592, 9, 21, 2, 2, 1592, 1593, 9, 28, 2, 2, 1593, 1594, 9, 25, 2, 2, 1594, 1595, 9, 7, 2, 2, 1595, 356, 3, 2, 2, 2, 1596, 1597, 9, 30, 2, 2, 1597, 1598, 9, 14, 2, 2, 1598, 1599, 9, 25, 2, 2, 1599, 1600, 9, 19, 2, 2, 1600, 1601, 9, 12, 2, 2, 1601, 1602, 9, 24, 2, 2, 1602, 358, 3, 2, 2, 2, 1603, 1604, 9, 21, 2, 2, 1604, 1605, 9, 16, 2, 2, 1605, 1606, 9, 13, 2, 2, 1606, 1607, 9, 26, 2, 2, 1607, 1608, 9, 7, 2, 2, 1608, 360, 3, 2, 2, 2, 1609, 1610, 9, 21, 2, 2, 1610, 1611, 9, 16, 2, 2, 1611, 1612, 9, 27, 2, 2, 1612, 362, 3, 2, 2, 2, 1613, 1614, 9, 21, 2, 2, 1614, 1615, 9, 7, 2, 2, 1615, 1616, 9, 16, 2, 2, 1616, 1617, 9, 17, 2, 2, 1617, 364, 3, 2, 2, 2, 1618, 1619, 9, 21, 2, 2, 1619, 1620, 9, 7, 2, 2, 1620, 1621, 9, 16, 2, 2, 1621, 1622, 9, 19, 2, 2, 1622, 1623, 9, 11, 2, 2, 1623, 366, 3, 2, 2, 2, 1624, 1625, 9, 21, 2, 2, 1625, 1626, 9, 7, 2, 2, 1626, 1627, 9, 17, 2, 2, 1627, 1628, 9, 14, 2, 2, 1628, 1629, 9, 24, 2, 2, 1629, 1630, 9, 7, 2, 2, 1630, 368, 3, 2, 2, 2, 1631, 1632, 9, 21, 2, 2, 1632, 1633, 9, 7, 2, 2, 1633, 1634, 9, 13, 2, 2, 1634, 1635, 9, 16, 2, 2, 1635, 1636, 9, 11, 2, 2, 1636, 1637, 9, 7, 2, 2, 1637, 370, 3, 2, 2, 2, 1638, 1639, 9, 21, 2, 2, 1639, 1640, 9, 7, 2, 2, 1640, 1641, 9, 30, 2, 2, 1641, 1642, 9, 19, 2, 2, 1642, 1643, 9, 16, 2, 2, 1643, 1644, 9, 24, 2, 2, 1644, 1645, 9, 7, 2, 2, 1645, 372, 3, 2, 2, 2, 1646, 1647, 9, 21, 2, 2, 1647, 1648, 9, 7, 2, 2, 1648, 1649, 9, 15, 2, 2, 1649, 1650, 9, 30, 2, 2, 1650, 1651, 9, 7, 2, 2, 1651, 1652, 9, 24, 2, 2, 1652, 1653, 9, 20, 2, 2, 1653, 374, 3, 2, 2, 2, 1654, 1655, 9, 21, 2, 2, 1655, 1656, 9, 7, 2, 2, 1656, 1657, 9, 20, 2, 2, 1657, 1658, 9, 14, 2, 2, 1658, 1659, 9, 21, 2, 2, 1659, 1660, 9, 13, 2, 2, 1660, 376, 3, 2, 2, 2, 1661, 1662, 9, 21, 2, 2, 1662, 1663, 9, 7, 2, 2, 1663, 1664, 9, 20, 2, 2, 1664, 1665, 9, 14, 2, 2, 1665, 1666, 9, 21, 2, 2, 1666, 1667, 9, 13, 2, 2, 1667, 1668, 9, 12, 2, 2, 1668, 1669, 9, 13, 2, 2, 1669, 1670, 9, 26, 2, 2, 1670, 378, 3, 2, 2, 2, 1671, 1672, 9, 21, 2, 2, 1672, 1673, 9, 7, 2, 2, 1673, 1674, 9, 18, 2, 2, 1674, 1675, 9, 28, 2, 2, 1675, 1676, 9, 29, 2, 2, 1676, 1677, 9, 7, 2, 2, 1677, 380, 3, 2, 2, 2, 1678, 1679, 9, 21, 2, 2, 1679, 1680, 9, 12, 2, 2, 1680, 1681, 9, 26, 2, 2, 1681, 1682, 9, 31, 2, 2, 1682, 1683, 9, 20, 2, 2, 1683, 382, 3, 2, 2, 2, 1684, 1685, 9, 21, 2, 2, 1685, 1686, 9, 28, 2, 2, 1686, 1687, 9, 19, 2, 2, 1687, 1688, 9, 7, 2, 2, 1688, 384, 3, 2, 2, 2, 1689, 1690, 9, 21, 2, 2, 1690, 1691, 9, 28, 2, 2, 1691, 1692, 9, 19, 2, 2, 1692, 1693, 9, 19, 2, 2, 1693, 1694, 9, 25, 2, 2, 1694, 1695, 9, 16, 2, 2, 1695, 1696, 9, 24, 2, 2, 1696, 1697, 9, 29, 2, 2, 1697, 386, 3, 2, 2, 2, 1698, 1699, 9, 21, 2, 2, 1699, 1700, 9, 28, 2, 2, 1700, 1701, 9, 27, 2, 2, 1701, 388, 3, 2, 2, 2, 1702, 1703, 9, 21, 2, 2, 1703, 1704, 9, 28, 2, 2, 1704, 1705, 9, 27, 2, 2, 1705, 1706, 9, 15, 2, 2, 1706, 390, 3, 2, 2, 2, 1707, 1708, 9, 15, 2, 2, 1708, 1709, 9, 16, 2, 2, 1709, 1710, 9, 20, 2, 2, 1710, 1711, 9, 12, 2, 2, 1711, 1712, 9, 15, 2, 2, 1712, 1713, 9, 33, 2, 2, 1713, 1714, 9, 12, 2, 2, 1714, 1715, 9, 7, 2, 2, 1715, 1716, 9, 15, 2, 2, 1716, 392, 3, 2, 2, 2, 1717, 1718, 9, 15, 2, 2, 1718, 1719, 9, 16, 2, 2, 1719, 1720, 9, 18, 2, 2, 1720, 1721, 9, 7, 2, 2, 1721, 1722, 9, 30, 2, 2, 1722, 1723, 9, 28, 2, 2, 1723, 1724, 9, 12, 2, 2, 1724, 1725, 9, 13, 2, 2, 1725, 1726, 9, 20, 2, 2, 1726, 394, 3, 2, 2, 2, 1727, 1728, 9, 15, 2, 2, 1728, 1729, 9, 24, 2, 2, 1729, 1730, 9, 31, 2, 2, 1730, 1731, 9, 7, 2, 2, 1731, 1732, 9, 11, 2, 2, 1732, 1733, 9, 16, 2, 2, 1733, 396, 3, 2, 2, 2, 1734, 1735, 9, 15, 2, 2, 1735, 1736, 9, 24, 2, 2, 1736, 1737, 9, 28, 2, 2, 1737, 1738, 9, 30, 2, 2, 1738, 1739, 9, 7, 2, 2, 1739, 398, 3, 2, 2, 2, 1740, 1741, 9, 15, 2, 2, 1741, 1742, 9, 7, 2, 2, 1742, 1743, 9, 19, 2, 2, 1743, 1744, 9, 7, 2, 2, 1744, 1745, 9, 24, 2, 2, 1745, 1746, 9, 20, 2, 2, 1746, 400, 3, 2, 2, 2, 1747, 1748, 9, 15, 2, 2, 1748, 1749, 9, 7, 2, 2, 1749, 1750, 9, 19, 2, 2, 1750, 1751, 9, 33, 2, 2, 1751, 402, 3, 2, 2, 2, 1752, 1753, 9, 15, 2, 2, 1753, 1754, 9, 7, 2, 2, 1754, 1755, 9, 20, 2, 2, 1755, 404, 3, 2, 2, 2, 1756, 1757, 9, 15, 2, 2, 1757, 1758, 9, 31, 2, 2, 1758, 1759, 9, 28, 2, 2, 1759, 1760, 9, 27, 2, 2, 1760, 406, 3, 2, 2, 2, 1761, 1762, 9, 15, 2, 2, 1762, 1763, 9, 28, 2, 2, 1763, 1764, 9, 11, 2, 2, 1764, 1765, 9, 7, 2, 2, 1765, 408, 3, 2, 2, 2, 1766, 1767, 9, 15, 2, 2, 1767, 1768, 9, 20, 2, 2, 1768, 1769, 9, 16, 2, 2, 1769, 1770, 9, 21, 2, 2, 1770, 1771, 9, 20, 2, 2, 1771, 410, 3, 2, 2, 2, 1772, 1773, 9, 15, 2, 2, 1773, 1774, 9, 20, 2, 2, 1774, 1775, 9, 16, 2, 2, 1775, 1776, 9, 20, 2, 2, 1776, 1777, 9, 12, 2, 2, 1777, 1778, 9, 15, 2, 2, 1778, 1779, 9, 20, 2, 2, 1779, 1780, 9, 12, 2, 2, 1780, 1781, 9, 24, 2, 2, 1781, 1782, 9, 15, 2, 2, 1782, 412, 3, 2, 2, 2, 1783, 1784, 9, 15, 2, 2, 1784, 1785, 9, 20, 2, 2, 1785, 1786, 9, 21, 2, 2, 1786, 1787, 9, 12, 2, 2, 1787, 1788, 9, 13, 2, 2, 1788, 1789, 9, 26, 2, 2, 1789, 414, 3, 2, 2, 2, 1790, 1791, 9, 15, 2, 2, 1791, 1792, 9, 22, 2, 2, 1792, 1793, 9, 15, 2, 2, 1793, 1794, 9, 20, 2, 2, 1794, 1795, 9, 7, 2, 2, 1795, 1796, 9, 11, 2, 2, 1796, 416, 3, 2, 2, 2, 1797, 1798, 9, 20, 2, 2, 1798, 1799, 9, 31, 2, 2, 1799, 1800, 9, 7, 2, 2, 1800, 1801, 9, 13, 2, 2, 1801, 418, 3, 2, 2, 2, 1802, 1803, 9, 20, 2, 2, 1803, 1804, 9, 12, 2, 2, 1804, 1805, 9, 7, 2, 2, 1805, 1806, 9, 15, 2, 2, 1806, 420, 3, 2, 2, 2, 1807, 1808, 9, 20, 2, 2, 1808, 1809, 9, 28, 2, 2, 1809, 422, 3, 2, 2, 2, 1810, 1811, 9, 20, 2, 2, 1811, 1812, 9, 21, 2, 2, 1812, 1813, 9, 16, 2, 2, 1813, 1814, 9, 13, 2, 2, 1814, 424, 3, 2, 2, 2, 1815, 1816, 9, 20, 2, 2, 1816, 1817, 9, 21, 2, 2, 1817, 1818, 9, 16, 2, 2, 1818, 1819, 9, 13, 2, 2, 1819, 1820, 9, 15, 2, 2, 1820, 1821, 9, 16, 2, 2, 1821, 1822, 9, 24, 2, 2, 1822, 1823, 9, 20, 2, 2, 1823, 1824, 9, 12, 2, 2, 1824, 1825, 9, 28, 2, 2, 1825, 1826, 9, 13, 2, 2, 1826, 426, 3, 2, 2, 2, 1827, 1828, 9, 20, 2, 2, 1828, 1829, 9, 21, 2, 2, 1829, 1830, 9, 12, 2, 2, 1830, 1831, 9, 26, 2, 2, 1831, 1832, 9, 26, 2, 2, 1832, 1833, 9, 7, 2, 2, 1833, 1834, 9, 21, 2, 2, 1834, 428, 3, 2, 2, 2, 1835, 1836, 9, 20, 2, 2, 1836, 1837, 9, 21, 2, 2, 1837, 1838, 9, 14, 2, 2, 1838, 1839, 9, 7, 2, 2, 1839, 430, 3, 2, 2, 2, 1840, 1841, 9, 20, 2, 2, 1841, 1842, 9, 21, 2, 2, 1842, 1843, 9, 14, 2, 2, 1843, 1844, 9, 13, 2, 2, 1844, 1845, 9, 24, 2, 2, 1845, 1846, 9, 16, 2, 2, 1846, 1847, 9, 20, 2, 2, 1847, 1848, 9, 7, 2, 2, 1848, 432, 3, 2, 2, 2, 1849, 1850, 9, 14, 2, 2, 1850, 1851, 9, 13, 2, 2, 1851, 1852, 9, 25, 2, 2, 1852, 1853, 9, 28, 2, 2, 1853, 1854, 9, 14, 2, 2, 1854, 1855, 9, 13, 2, 2, 1855, 1856, 9, 17, 2, 2, 1856, 1857, 9, 7, 2, 2, 1857, 1858, 9, 17, 2, 2, 1858, 434, 3, 2, 2, 2, 1859, 1860, 9, 14, 2, 2, 1860, 1861, 9, 13, 2, 2, 1861, 1862, 9, 17, 2, 2, 1862, 1863, 9, 7, 2, 2, 1863, 1864, 9, 21, 2, 2, 1864, 436, 3, 2, 2, 2, 1865, 1866, 9, 14, 2, 2, 1866, 1867, 9, 13, 2, 2, 1867, 1868, 9, 12, 2, 2, 1868, 1869, 9, 28, 2, 2, 1869, 1870, 9, 13, 2, 2, 1870, 438, 3, 2, 2, 2, 1871, 1872, 9, 14, 2, 2, 1872, 1873, 9, 13, 2, 2, 1873, 1874, 9, 12, 2, 2, 1874, 1875, 9, 37, 2, 2, 1875, 1876, 9, 14, 2, 2, 1876, 1877, 9, 7, 2, 2, 1877, 440, 3, 2, 2, 2, 1878, 1879, 9, 14, 2, 2, 1879, 1880, 9, 13, 2, 2, 1880, 1881, 9, 29, 2, 2, 1881, 1882, 9, 13, 2, 2, 1882, 1883, 9, 28, 2, 2, 1883, 1884, 9, 27, 2, 2, 1884, 1885, 9, 13, 2, 2, 1885, 442, 3, 2, 2, 2, 1886, 1887, 9, 14, 2, 2, 1887, 1888, 9, 13, 2, 2, 1888, 1889, 9, 13, 2, 2, 1889, 1890, 9, 7, 2, 2, 1890, 1891, 9, 15, 2, 2, 1891, 1892, 9, 20, 2, 2, 1892, 444, 3, 2, 2, 2, 1893, 1894, 9, 14, 2, 2, 1894, 1895, 9, 13, 2, 2, 1895, 1896, 9, 15, 2, 2, 1896, 1897, 9, 7, 2, 2, 1897, 1898, 9, 20, 2, 2, 1898, 446, 3, 2, 2, 2, 1899, 1900, 9, 14, 2, 2, 1900, 1901, 9, 30, 2, 2, 1901, 1902, 9, 17, 2, 2, 1902, 1903, 9, 16, 2, 2, 1903, 1904, 9, 20, 2, 2, 1904, 1905, 9, 7, 2, 2, 1905, 448, 3, 2, 2, 2, 1906, 1907, 9, 14, 2, 2, 1907, 1908, 9, 30, 2, 2, 1908, 1909, 9, 15, 2, 2, 1909, 1910, 9, 7, 2, 2, 1910, 1911, 9, 21, 2, 2, 1911, 1912, 9, 20, 2, 2, 1912, 450, 3, 2, 2, 2, 1913, 1914, 9, 14, 2, 2, 1914, 1915, 9, 15, 2, 2, 1915, 1916, 9, 7, 2, 2, 1916, 452, 3, 2, 2, 2, 1917, 1918, 9, 14, 2, 2, 1918, 1919, 9, 15, 2, 2, 1919, 1920, 9, 7, 2, 2, 1920, 1921, 9, 21, 2, 2, 1921, 454, 3, 2, 2, 2, 1922, 1923, 9, 14, 2, 2, 1923, 1924, 9, 15, 2, 2, 1924, 1925, 9, 12, 2, 2, 1925, 1926, 9, 13, 2, 2, 1926, 1927, 9, 26, 2, 2, 1927, 456, 3, 2, 2, 2, 1928, 1929, 9, 18, 2, 2, 1929, 1930, 9, 16, 2, 2, 1930, 1931, 9, 19, 2, 2, 1931, 1932, 9, 12, 2, 2, 1932, 1933, 9, 17, 2, 2, 1933, 1934, 9, 16, 2, 2, 1934, 1935, 9, 20, 2, 2, 1935, 1936, 9, 7, 2, 2, 1936, 458, 3, 2, 2, 2, 1937, 1938, 9, 18, 2, 2, 1938, 1939, 9, 16, 2, 2, 1939, 1940, 9, 19, 2, 2, 1940, 1941, 9, 14, 2, 2, 1941, 1942, 9, 7, 2, 2, 1942, 460, 3, 2, 2, 2, 1943, 1944, 9, 18, 2, 2, 1944, 1945, 9, 16, 2, 2, 1945, 1946, 9, 19, 2, 2, 1946, 1947, 9, 14, 2, 2, 1947, 1948, 9, 7, 2, 2, 1948, 1949, 9, 17, 2, 2, 1949, 462, 3, 2, 2, 2, 1950, 1951, 9, 18, 2, 2, 1951, 1952, 9, 16, 2, 2, 1952, 1953, 9, 19, 2, 2, 1953, 1954, 9, 14, 2, 2, 1954, 1955, 9, 7, 2, 2, 1955, 1956, 9, 15, 2, 2, 1956, 464, 3, 2, 2, 2, 1957, 1958, 9, 18, 2, 2, 1958, 1959, 9, 12, 2, 2, 1959, 1960, 9, 16, 2, 2, 1960, 466, 3, 2, 2, 2, 1961, 1962, 9, 18, 2, 2, 1962, 1963, 9, 12, 2, 2, 1963, 1964, 9, 7, 2, 2, 1964, 1965, 9, 27, 2, 2, 1965, 468, 3, 2, 2, 2, 1966, 1967, 9, 27, 2, 2, 1967, 1968, 9, 31, 2, 2, 1968, 1969, 9, 7, 2, 2, 1969, 1970, 9, 13, 2, 2, 1970, 470, 3, 2, 2, 2, 1971, 1972, 9, 27, 2, 2, 1972, 1973, 9, 31, 2, 2, 1973, 1974, 9, 7, 2, 2, 1974, 1975, 9, 21, 2, 2, 1975, 1976, 9, 7, 2, 2, 1976, 472, 3, 2, 2, 2, 1977, 1978, 9, 27, 2, 2, 1978, 1979, 9, 31, 2, 2, 1979, 1980, 9, 12, 2, 2, 1980, 1981, 9, 19, 2, 2, 1981, 1982, 9, 7, 2, 2, 1982, 474, 3, 2, 2, 2, 1983, 1984, 9, 27, 2, 2, 1984, 1985, 9, 12, 2, 2, 1985, 1986, 9, 13, 2, 2, 1986, 1987, 9, 17, 2, 2, 1987, 1988, 9, 28, 2, 2, 1988, 1989, 9, 27, 2, 2, 1989, 476, 3, 2, 2, 2, 1990, 1991, 9, 27, 2, 2, 1991, 1992, 9, 12, 2, 2, 1992, 1993, 9, 20, 2, 2, 1993, 1994, 9, 31, 2, 2, 1994, 478, 3, 2, 2, 2, 1995, 1996, 9, 27, 2, 2, 1996, 1997, 9, 12, 2, 2, 1997, 1998, 9, 20, 2, 2, 1998, 1999, 9, 31, 2, 2, 1999, 2000, 9, 12, 2, 2, 2000, 2001, 9, 13, 2, 2, 2001, 480, 3, 2, 2, 2, 2002, 2003, 9, 27, 2, 2, 2003, 2004, 9, 28, 2, 2, 2004, 2005, 9, 21, 2, 2, 2005, 2006, 9, 29, 2, 2, 2006, 482, 3, 2, 2, 2, 2007, 2008, 9, 32, 2, 2, 2008, 2009, 9, 28, 2, 2, 2009, 2010, 9, 21, 2, 2, 2010, 484, 3, 2, 2, 2, 2011, 2012, 7, 98, 2, 2, 2012, 2015, 7, 98, 2, 2, 2013, 2015, 10, 38, 2, 2, 2014, 2011, 3, 2, 2, 2, 2014, 2013, 3, 2, 2, 2, 2015, 486, 3, 2, 2, 2, 2016, 2017, 9, 39, 2, 2, 2017, 488, 3, 2, 2, 2, 2018, 2019, 9, 40, 2, 2, 2019, 490, 3, 2, 2, 2, 2020, 2022, 7, 98, 2, 2, 2021, 2023, 5, 485, 243, 2, 2022, 2021, 3, 2, 2, 2, 2023, 2024, 3, 2, 2, 2, 2024, 2022, 3, 2, 2, 2, 2024, 2025, 3, 2, 2, 2, 2025, 2026, 3, 2, 2, 2, 2026, 2027, 7, 98, 2, 2, 2027, 2028, 7, 107, 2, 2, 2028, 492, 3, 2, 2, 2, 2029, 2031, 7, 98, 2, 2, 2030, 2032, 5, 485, 243, 2, 2031, 2030, 3, 2, 2, 2, 2032, 2033, 3, 2, 2, 2, 2033, 2031, 3, 2, 2, 2, 2033, 2034, 3, 2, 2, 2, 2034, 2035, 3, 2, 2, 2, 2035, 2036, 7, 98, 2, 2, 2036, 2045, 3, 2, 2, 2, 2037, 2041, 5, 487, 244, 2, 2038, 2040, 5, 489, 245, 2, 2039, 2038, 3, 2, 2, 2, 2040, 2043, 3, 2, 2, 2, 2041, 2039, 3, 2, 2, 2, 2041, 2042, 3, 2, 2, 2, 2042, 2045, 3, 2, 2, 2, 2043, 2041, 3, 2, 2, 2, 2044, 2029, 3, 2, 2, 2, 2044, 2037, 3, 2, 2, 2, 2045, 494, 3, 2, 2, 2, 2046, 2047, 7, 38, 2, 2, 2047, 2051, 5, 487, 244, 2, 2048, 2050, 5, 489, 245, 2, 2049, 2048, 3, 2, 2, 2, 2050, 2053, 3, 2, 2, 2, 2051, 2049, 3, 2, 2, 2, 2051, 2052, 3, 2, 2, 2, 2052, 496, 3, 2, 2, 2, 2053, 2051, 3, 2, 2, 2, 2054, 2055, 7, 38, 2, 2, 2055, 2059, 9, 41, 2, 2, 2056, 2058, 9, 6, 2, 2, 2057, 2056, 3, 2, 2, 2, 2058, 2061, 3, 2, 2, 2, 2059, 2057, 3, 2, 2, 2, 2059, 2060, 3, 2, 2, 2, 2060, 498, 3, 2, 2, 2, 2061, 2059, 3, 2, 2, 2, 2062, 2063, 7, 65, 2, 2, 2063, 500, 3, 2, 2, 2, 28, 2, 508, 515, 521, 529, 533, 536, 545, 548, 552, 557, 566, 569, 574, 582, 594, 600, 614, 631, 2014, 2024, 2033, 2041, 2044, 2051, 2059, 3, 8, 2, 2] \ No newline at end of file diff --git a/reverse_engineering/antlr/parser/n1qlLexer.js b/reverse_engineering/antlr/parser/n1qlLexer.js new file mode 100644 index 0000000..f870728 --- /dev/null +++ b/reverse_engineering/antlr/parser/n1qlLexer.js @@ -0,0 +1,2304 @@ +// Generated from grammars/n1ql.g4 by ANTLR 4.9.2 +// jshint ignore: start +const antlr4 = require('antlr4'); + +const serializedATN = [ + '\u0003\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786', + '\u5964\u0002\u00f2\u0810\b\u0001\u0004\u0002\t\u0002\u0004\u0003\t\u0003', + '\u0004\u0004\t\u0004\u0004\u0005\t\u0005\u0004\u0006\t\u0006\u0004\u0007', + '\t\u0007\u0004\b\t\b\u0004\t\t\t\u0004\n\t\n\u0004\u000b\t\u000b\u0004', + '\f\t\f\u0004\r\t\r\u0004\u000e\t\u000e\u0004\u000f\t\u000f\u0004\u0010', + '\t\u0010\u0004\u0011\t\u0011\u0004\u0012\t\u0012\u0004\u0013\t\u0013', + '\u0004\u0014\t\u0014\u0004\u0015\t\u0015\u0004\u0016\t\u0016\u0004\u0017', + '\t\u0017\u0004\u0018\t\u0018\u0004\u0019\t\u0019\u0004\u001a\t\u001a', + '\u0004\u001b\t\u001b\u0004\u001c\t\u001c\u0004\u001d\t\u001d\u0004\u001e', + '\t\u001e\u0004\u001f\t\u001f\u0004 \t \u0004!\t!\u0004"\t"\u0004#', + "\t#\u0004$\t$\u0004%\t%\u0004&\t&\u0004'\t'\u0004(\t(\u0004)\t)\u0004", + '*\t*\u0004+\t+\u0004,\t,\u0004-\t-\u0004.\t.\u0004/\t/\u00040\t0\u0004', + '1\t1\u00042\t2\u00043\t3\u00044\t4\u00045\t5\u00046\t6\u00047\t7\u0004', + '8\t8\u00049\t9\u0004:\t:\u0004;\t;\u0004<\t<\u0004=\t=\u0004>\t>\u0004', + '?\t?\u0004@\t@\u0004A\tA\u0004B\tB\u0004C\tC\u0004D\tD\u0004E\tE\u0004', + 'F\tF\u0004G\tG\u0004H\tH\u0004I\tI\u0004J\tJ\u0004K\tK\u0004L\tL\u0004', + 'M\tM\u0004N\tN\u0004O\tO\u0004P\tP\u0004Q\tQ\u0004R\tR\u0004S\tS\u0004', + 'T\tT\u0004U\tU\u0004V\tV\u0004W\tW\u0004X\tX\u0004Y\tY\u0004Z\tZ\u0004', + '[\t[\u0004\\\t\\\u0004]\t]\u0004^\t^\u0004_\t_\u0004`\t`\u0004a\ta\u0004', + 'b\tb\u0004c\tc\u0004d\td\u0004e\te\u0004f\tf\u0004g\tg\u0004h\th\u0004', + 'i\ti\u0004j\tj\u0004k\tk\u0004l\tl\u0004m\tm\u0004n\tn\u0004o\to\u0004', + 'p\tp\u0004q\tq\u0004r\tr\u0004s\ts\u0004t\tt\u0004u\tu\u0004v\tv\u0004', + 'w\tw\u0004x\tx\u0004y\ty\u0004z\tz\u0004{\t{\u0004|\t|\u0004}\t}\u0004', + '~\t~\u0004\u007f\t\u007f\u0004\u0080\t\u0080\u0004\u0081\t\u0081\u0004', + '\u0082\t\u0082\u0004\u0083\t\u0083\u0004\u0084\t\u0084\u0004\u0085\t', + '\u0085\u0004\u0086\t\u0086\u0004\u0087\t\u0087\u0004\u0088\t\u0088\u0004', + '\u0089\t\u0089\u0004\u008a\t\u008a\u0004\u008b\t\u008b\u0004\u008c\t', + '\u008c\u0004\u008d\t\u008d\u0004\u008e\t\u008e\u0004\u008f\t\u008f\u0004', + '\u0090\t\u0090\u0004\u0091\t\u0091\u0004\u0092\t\u0092\u0004\u0093\t', + '\u0093\u0004\u0094\t\u0094\u0004\u0095\t\u0095\u0004\u0096\t\u0096\u0004', + '\u0097\t\u0097\u0004\u0098\t\u0098\u0004\u0099\t\u0099\u0004\u009a\t', + '\u009a\u0004\u009b\t\u009b\u0004\u009c\t\u009c\u0004\u009d\t\u009d\u0004', + '\u009e\t\u009e\u0004\u009f\t\u009f\u0004\u00a0\t\u00a0\u0004\u00a1\t', + '\u00a1\u0004\u00a2\t\u00a2\u0004\u00a3\t\u00a3\u0004\u00a4\t\u00a4\u0004', + '\u00a5\t\u00a5\u0004\u00a6\t\u00a6\u0004\u00a7\t\u00a7\u0004\u00a8\t', + '\u00a8\u0004\u00a9\t\u00a9\u0004\u00aa\t\u00aa\u0004\u00ab\t\u00ab\u0004', + '\u00ac\t\u00ac\u0004\u00ad\t\u00ad\u0004\u00ae\t\u00ae\u0004\u00af\t', + '\u00af\u0004\u00b0\t\u00b0\u0004\u00b1\t\u00b1\u0004\u00b2\t\u00b2\u0004', + '\u00b3\t\u00b3\u0004\u00b4\t\u00b4\u0004\u00b5\t\u00b5\u0004\u00b6\t', + '\u00b6\u0004\u00b7\t\u00b7\u0004\u00b8\t\u00b8\u0004\u00b9\t\u00b9\u0004', + '\u00ba\t\u00ba\u0004\u00bb\t\u00bb\u0004\u00bc\t\u00bc\u0004\u00bd\t', + '\u00bd\u0004\u00be\t\u00be\u0004\u00bf\t\u00bf\u0004\u00c0\t\u00c0\u0004', + '\u00c1\t\u00c1\u0004\u00c2\t\u00c2\u0004\u00c3\t\u00c3\u0004\u00c4\t', + '\u00c4\u0004\u00c5\t\u00c5\u0004\u00c6\t\u00c6\u0004\u00c7\t\u00c7\u0004', + '\u00c8\t\u00c8\u0004\u00c9\t\u00c9\u0004\u00ca\t\u00ca\u0004\u00cb\t', + '\u00cb\u0004\u00cc\t\u00cc\u0004\u00cd\t\u00cd\u0004\u00ce\t\u00ce\u0004', + '\u00cf\t\u00cf\u0004\u00d0\t\u00d0\u0004\u00d1\t\u00d1\u0004\u00d2\t', + '\u00d2\u0004\u00d3\t\u00d3\u0004\u00d4\t\u00d4\u0004\u00d5\t\u00d5\u0004', + '\u00d6\t\u00d6\u0004\u00d7\t\u00d7\u0004\u00d8\t\u00d8\u0004\u00d9\t', + '\u00d9\u0004\u00da\t\u00da\u0004\u00db\t\u00db\u0004\u00dc\t\u00dc\u0004', + '\u00dd\t\u00dd\u0004\u00de\t\u00de\u0004\u00df\t\u00df\u0004\u00e0\t', + '\u00e0\u0004\u00e1\t\u00e1\u0004\u00e2\t\u00e2\u0004\u00e3\t\u00e3\u0004', + '\u00e4\t\u00e4\u0004\u00e5\t\u00e5\u0004\u00e6\t\u00e6\u0004\u00e7\t', + '\u00e7\u0004\u00e8\t\u00e8\u0004\u00e9\t\u00e9\u0004\u00ea\t\u00ea\u0004', + '\u00eb\t\u00eb\u0004\u00ec\t\u00ec\u0004\u00ed\t\u00ed\u0004\u00ee\t', + '\u00ee\u0004\u00ef\t\u00ef\u0004\u00f0\t\u00f0\u0004\u00f1\t\u00f1\u0004', + '\u00f2\t\u00f2\u0004\u00f3\t\u00f3\u0004\u00f4\t\u00f4\u0004\u00f5\t', + '\u00f5\u0004\u00f6\t\u00f6\u0004\u00f7\t\u00f7\u0004\u00f8\t\u00f8\u0004', + '\u00f9\t\u00f9\u0004\u00fa\t\u00fa\u0003\u0002\u0003\u0002\u0003\u0002', + '\u0003\u0002\u0003\u0002\u0003\u0002\u0003\u0002\u0005\u0002\u01fd\n', + '\u0002\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0005', + '\u0003\u0204\n\u0003\u0003\u0004\u0003\u0004\u0007\u0004\u0208\n\u0004', + '\f\u0004\u000e\u0004\u020b\u000b\u0004\u0003\u0004\u0003\u0004\u0003', + '\u0004\u0007\u0004\u0210\n\u0004\f\u0004\u000e\u0004\u0213\u000b\u0004', + '\u0003\u0004\u0005\u0004\u0216\n\u0004\u0003\u0005\u0005\u0005\u0219', + '\n\u0005\u0003\u0006\u0003\u0006\u0003\u0007\u0003\u0007\u0003\u0007', + '\u0007\u0007\u0220\n\u0007\f\u0007\u000e\u0007\u0223\u000b\u0007\u0005', + '\u0007\u0225\n\u0007\u0003\b\u0003\b\u0005\b\u0229\n\b\u0003\b\u0006', + '\b\u022c\n\b\r\b\u000e\b\u022d\u0003\t\u0003\t\u0003\n\u0003\n\u0003', + '\n\u0006\n\u0235\n\n\r\n\u000e\n\u0236\u0003\n\u0005\n\u023a\n\n\u0003', + '\n\u0003\n\u0003\n\u0005\n\u023f\n\n\u0003\u000b\u0003\u000b\u0003\u000b', + '\u0003\u000b\u0007\u000b\u0245\n\u000b\f\u000b\u000e\u000b\u0248\u000b', + '\u000b\u0003\u000b\u0003\u000b\u0003\u000b\u0003\f\u0003\f\u0003\f\u0003', + '\f\u0007\f\u0251\n\f\f\f\u000e\f\u0254\u000b\f\u0003\r\u0006\r\u0257', + '\n\r\r\r\u000e\r\u0258\u0003\r\u0003\r\u0003\u000e\u0003\u000e\u0003', + '\u000f\u0003\u000f\u0003\u0010\u0003\u0010\u0003\u0010\u0003\u0010\u0003', + '\u0010\u0003\u0010\u0005\u0010\u0267\n\u0010\u0003\u0011\u0003\u0011', + '\u0003\u0012\u0003\u0012\u0003\u0013\u0003\u0013\u0003\u0014\u0003\u0014', + '\u0003\u0014\u0003\u0015\u0003\u0015\u0003\u0016\u0003\u0016\u0003\u0016', + '\u0003\u0016\u0005\u0016\u0278\n\u0016\u0003\u0017\u0003\u0017\u0003', + '\u0018\u0003\u0018\u0003\u0018\u0003\u0019\u0003\u0019\u0003\u001a\u0003', + '\u001a\u0003\u001a\u0003\u001b\u0003\u001b\u0003\u001b\u0003\u001c\u0003', + '\u001c\u0003\u001d\u0003\u001d\u0003\u001e\u0003\u001e\u0003\u001f\u0003', + '\u001f\u0003 \u0003 \u0003!\u0003!\u0003"\u0003"\u0003#\u0003#\u0003', + "$\u0003$\u0003$\u0003%\u0003%\u0003&\u0003&\u0003'\u0003'\u0003'", + "\u0003'\u0003'\u0003'\u0003'\u0003(\u0003(\u0003(\u0003(\u0003)", + '\u0003)\u0003)\u0003)\u0003)\u0003)\u0003*\u0003*\u0003*\u0003*\u0003', + '*\u0003*\u0003*\u0003*\u0003+\u0003+\u0003+\u0003+\u0003,\u0003,\u0003', + ',\u0003,\u0003-\u0003-\u0003-\u0003-\u0003-\u0003-\u0003.\u0003.\u0003', + '.\u0003/\u0003/\u0003/\u0003/\u00030\u00030\u00030\u00031\u00031\u0003', + '1\u00031\u00031\u00031\u00032\u00032\u00032\u00032\u00032\u00032\u0003', + '2\u00032\u00033\u00033\u00033\u00033\u00033\u00033\u00033\u00034\u0003', + '4\u00034\u00034\u00034\u00034\u00034\u00034\u00035\u00035\u00035\u0003', + '5\u00035\u00035\u00036\u00036\u00036\u00036\u00036\u00036\u00036\u0003', + '7\u00037\u00037\u00037\u00037\u00037\u00038\u00038\u00038\u00039\u0003', + '9\u00039\u00039\u00039\u0003:\u0003:\u0003:\u0003:\u0003:\u0003;\u0003', + ';\u0003;\u0003;\u0003;\u0003<\u0003<\u0003<\u0003<\u0003<\u0003<\u0003', + '<\u0003<\u0003=\u0003=\u0003=\u0003=\u0003=\u0003=\u0003=\u0003=\u0003', + '>\u0003>\u0003>\u0003>\u0003>\u0003>\u0003>\u0003>\u0003>\u0003>\u0003', + '>\u0003?\u0003?\u0003?\u0003?\u0003?\u0003?\u0003?\u0003@\u0003@\u0003', + '@\u0003@\u0003@\u0003@\u0003@\u0003@\u0003@\u0003@\u0003A\u0003A\u0003', + 'A\u0003A\u0003A\u0003A\u0003A\u0003A\u0003B\u0003B\u0003B\u0003B\u0003', + 'B\u0003B\u0003B\u0003B\u0003B\u0003C\u0003C\u0003C\u0003C\u0003C\u0003', + 'C\u0003C\u0003C\u0003C\u0003C\u0003C\u0003D\u0003D\u0003D\u0003D\u0003', + 'D\u0003D\u0003E\u0003E\u0003E\u0003E\u0003E\u0003E\u0003E\u0003F\u0003', + 'F\u0003F\u0003F\u0003F\u0003F\u0003F\u0003F\u0003G\u0003G\u0003G\u0003', + 'G\u0003G\u0003G\u0003G\u0003G\u0003G\u0003H\u0003H\u0003H\u0003H\u0003', + 'H\u0003H\u0003H\u0003H\u0003I\u0003I\u0003I\u0003I\u0003I\u0003I\u0003', + 'I\u0003I\u0003I\u0003I\u0003J\u0003J\u0003J\u0003J\u0003J\u0003J\u0003', + 'J\u0003J\u0003K\u0003K\u0003K\u0003K\u0003K\u0003K\u0003K\u0003K\u0003', + 'K\u0003K\u0003L\u0003L\u0003L\u0003L\u0003L\u0003L\u0003L\u0003M\u0003', + 'M\u0003M\u0003M\u0003M\u0003M\u0003M\u0003M\u0003N\u0003N\u0003N\u0003', + 'N\u0003N\u0003O\u0003O\u0003O\u0003O\u0003O\u0003O\u0003O\u0003O\u0003', + 'O\u0003P\u0003P\u0003P\u0003P\u0003P\u0003P\u0003P\u0003P\u0003P\u0003', + 'Q\u0003Q\u0003Q\u0003R\u0003R\u0003R\u0003R\u0003R\u0003S\u0003S\u0003', + 'S\u0003S\u0003S\u0003T\u0003T\u0003T\u0003T\u0003T\u0003T\u0003T\u0003', + 'T\u0003U\u0003U\u0003U\u0003U\u0003U\u0003V\u0003V\u0003V\u0003V\u0003', + 'W\u0003W\u0003W\u0003W\u0003W\u0003W\u0003X\u0003X\u0003X\u0003X\u0003', + 'X\u0003X\u0003X\u0003Y\u0003Y\u0003Y\u0003Y\u0003Y\u0003Y\u0003Y\u0003', + 'Y\u0003Z\u0003Z\u0003Z\u0003Z\u0003Z\u0003Z\u0003Z\u0003Z\u0003[\u0003', + '[\u0003[\u0003[\u0003[\u0003[\u0003[\u0003\\\u0003\\\u0003\\\u0003\\', + '\u0003\\\u0003\\\u0003\\\u0003\\\u0003]\u0003]\u0003]\u0003]\u0003]', + '\u0003]\u0003^\u0003^\u0003^\u0003^\u0003^\u0003^\u0003_\u0003_\u0003', + '_\u0003_\u0003_\u0003_\u0003_\u0003`\u0003`\u0003`\u0003`\u0003`\u0003', + '`\u0003a\u0003a\u0003a\u0003a\u0003a\u0003a\u0003a\u0003a\u0003b\u0003', + 'b\u0003b\u0003b\u0003b\u0003b\u0003c\u0003c\u0003c\u0003c\u0003c\u0003', + 'c\u0003c\u0003c\u0003c\u0003c\u0003d\u0003d\u0003d\u0003d\u0003e\u0003', + 'e\u0003e\u0003e\u0003e\u0003e\u0003f\u0003f\u0003f\u0003f\u0003f\u0003', + 'g\u0003g\u0003g\u0003g\u0003h\u0003h\u0003h\u0003h\u0003h\u0003h\u0003', + 'h\u0003h\u0003h\u0003i\u0003i\u0003i\u0003i\u0003i\u0003i\u0003i\u0003', + 'j\u0003j\u0003j\u0003j\u0003j\u0003j\u0003k\u0003k\u0003k\u0003k\u0003', + 'k\u0003k\u0003l\u0003l\u0003l\u0003l\u0003l\u0003l\u0003l\u0003m\u0003', + 'm\u0003m\u0003m\u0003n\u0003n\u0003n\u0003n\u0003n\u0003o\u0003o\u0003', + 'o\u0003o\u0003o\u0003o\u0003o\u0003p\u0003p\u0003p\u0003q\u0003q\u0003', + 'q\u0003q\u0003q\u0003q\u0003q\u0003r\u0003r\u0003r\u0003r\u0003r\u0003', + 'r\u0003s\u0003s\u0003s\u0003t\u0003t\u0003t\u0003t\u0003t\u0003t\u0003', + 't\u0003t\u0003u\u0003u\u0003u\u0003u\u0003u\u0003u\u0003u\u0003u\u0003', + 'u\u0003u\u0003v\u0003v\u0003v\u0003v\u0003v\u0003v\u0003w\u0003w\u0003', + 'w\u0003w\u0003w\u0003w\u0003x\u0003x\u0003x\u0003x\u0003x\u0003x\u0003', + 'x\u0003y\u0003y\u0003y\u0003y\u0003y\u0003y\u0003z\u0003z\u0003z\u0003', + 'z\u0003z\u0003z\u0003z\u0003{\u0003{\u0003{\u0003{\u0003{\u0003{\u0003', + '{\u0003{\u0003{\u0003{\u0003|\u0003|\u0003|\u0003|\u0003|\u0003}\u0003', + '}\u0003}\u0003~\u0003~\u0003~\u0003~\u0003~\u0003~\u0003~\u0003~\u0003', + '~\u0003~\u0003\u007f\u0003\u007f\u0003\u007f\u0003\u007f\u0003\u007f', + '\u0003\u007f\u0003\u007f\u0003\u007f\u0003\u007f\u0003\u007f\u0003\u007f', + '\u0003\u0080\u0003\u0080\u0003\u0080\u0003\u0080\u0003\u0080\u0003\u0081', + '\u0003\u0081\u0003\u0081\u0003\u0081\u0003\u0082\u0003\u0082\u0003\u0082', + '\u0003\u0082\u0003\u0082\u0003\u0083\u0003\u0083\u0003\u0083\u0003\u0083', + '\u0003\u0083\u0003\u0083\u0003\u0083\u0003\u0083\u0003\u0083\u0003\u0084', + '\u0003\u0084\u0003\u0084\u0003\u0084\u0003\u0084\u0003\u0084\u0003\u0085', + '\u0003\u0085\u0003\u0085\u0003\u0085\u0003\u0085\u0003\u0085\u0003\u0085', + '\u0003\u0085\u0003\u0085\u0003\u0086\u0003\u0086\u0003\u0086\u0003\u0086', + '\u0003\u0086\u0003\u0087\u0003\u0087\u0003\u0087\u0003\u0087\u0003\u0087', + '\u0003\u0088\u0003\u0088\u0003\u0088\u0003\u0088\u0003\u0089\u0003\u0089', + '\u0003\u0089\u0003\u0089\u0003\u0089\u0003\u0089\u0003\u0089\u0003\u0089', + '\u0003\u008a\u0003\u008a\u0003\u008a\u0003\u008a\u0003\u008a\u0003\u008a', + '\u0003\u008b\u0003\u008b\u0003\u008b\u0003\u008b\u0003\u008b\u0003\u008c', + '\u0003\u008c\u0003\u008c\u0003\u008c\u0003\u008c\u0003\u008c\u0003\u008d', + '\u0003\u008d\u0003\u008d\u0003\u008d\u0003\u008e\u0003\u008e\u0003\u008e', + '\u0003\u008e\u0003\u008f\u0003\u008f\u0003\u008f\u0003\u008f\u0003\u008f', + '\u0003\u008f\u0003\u008f\u0003\u008f\u0003\u0090\u0003\u0090\u0003\u0090', + '\u0003\u0090\u0003\u0090\u0003\u0090\u0003\u0090\u0003\u0090\u0003\u0091', + '\u0003\u0091\u0003\u0091\u0003\u0091\u0003\u0091\u0003\u0091\u0003\u0091', + '\u0003\u0091\u0003\u0091\u0003\u0091\u0003\u0091\u0003\u0091\u0003\u0091', + '\u0003\u0092\u0003\u0092\u0003\u0092\u0003\u0092\u0003\u0092\u0003\u0092', + '\u0003\u0093\u0003\u0093\u0003\u0093\u0003\u0093\u0003\u0093\u0003\u0093', + '\u0003\u0093\u0003\u0093\u0003\u0094\u0003\u0094\u0003\u0094\u0003\u0094', + '\u0003\u0094\u0003\u0094\u0003\u0094\u0003\u0094\u0003\u0094\u0003\u0094', + '\u0003\u0095\u0003\u0095\u0003\u0095\u0003\u0095\u0003\u0095\u0003\u0096', + '\u0003\u0096\u0003\u0096\u0003\u0097\u0003\u0097\u0003\u0097\u0003\u0098', + '\u0003\u0098\u0003\u0098\u0003\u0098\u0003\u0099\u0003\u0099\u0003\u0099', + '\u0003\u0099\u0003\u0099\u0003\u0099\u0003\u0099\u0003\u0099\u0003\u0099', + '\u0003\u0099\u0003\u009a\u0003\u009a\u0003\u009a\u0003\u009a\u0003\u009a', + '\u0003\u009b\u0003\u009b\u0003\u009b\u0003\u009b\u0003\u009b\u0003\u009b', + '\u0003\u009c\u0003\u009c\u0003\u009c\u0003\u009c\u0003\u009c\u0003\u009c', + '\u0003\u009c\u0003\u009d\u0003\u009d\u0003\u009d\u0003\u009d\u0003\u009d', + '\u0003\u009d\u0003\u009d\u0003\u009e\u0003\u009e\u0003\u009e\u0003\u009e', + '\u0003\u009e\u0003\u009e\u0003\u009e\u0003\u009f\u0003\u009f\u0003\u009f', + '\u0003\u00a0\u0003\u00a0\u0003\u00a0\u0003\u00a0\u0003\u00a0\u0003\u00a0', + '\u0003\u00a0\u0003\u00a1\u0003\u00a1\u0003\u00a1\u0003\u00a1\u0003\u00a1', + '\u0003\u00a1\u0003\u00a1\u0003\u00a1\u0003\u00a2\u0003\u00a2\u0003\u00a2', + '\u0003\u00a3\u0003\u00a3\u0003\u00a3\u0003\u00a3\u0003\u00a3\u0003\u00a3', + '\u0003\u00a4\u0003\u00a4\u0003\u00a4\u0003\u00a4\u0003\u00a4\u0003\u00a4', + '\u0003\u00a4\u0003\u00a5\u0003\u00a5\u0003\u00a5\u0003\u00a5\u0003\u00a5', + '\u0003\u00a5\u0003\u00a6\u0003\u00a6\u0003\u00a6\u0003\u00a6\u0003\u00a6', + '\u0003\u00a7\u0003\u00a7\u0003\u00a7\u0003\u00a7\u0003\u00a7\u0003\u00a7', + '\u0003\u00a8\u0003\u00a8\u0003\u00a8\u0003\u00a8\u0003\u00a8\u0003\u00a8', + '\u0003\u00a8\u0003\u00a8\u0003\u00a8\u0003\u00a8\u0003\u00a9\u0003\u00a9', + '\u0003\u00a9\u0003\u00a9\u0003\u00a9\u0003\u00a9\u0003\u00a9\u0003\u00a9', + '\u0003\u00a9\u0003\u00aa\u0003\u00aa\u0003\u00aa\u0003\u00aa\u0003\u00aa', + '\u0003\u00ab\u0003\u00ab\u0003\u00ab\u0003\u00ab\u0003\u00ab\u0003\u00ac', + '\u0003\u00ac\u0003\u00ac\u0003\u00ac\u0003\u00ac\u0003\u00ac\u0003\u00ac', + '\u0003\u00ac\u0003\u00ac\u0003\u00ac\u0003\u00ad\u0003\u00ad\u0003\u00ad', + '\u0003\u00ad\u0003\u00ad\u0003\u00ad\u0003\u00ad\u0003\u00ad\u0003\u00ae', + '\u0003\u00ae\u0003\u00ae\u0003\u00ae\u0003\u00ae\u0003\u00ae\u0003\u00ae', + '\u0003\u00ae\u0003\u00af\u0003\u00af\u0003\u00af\u0003\u00af\u0003\u00af', + '\u0003\u00af\u0003\u00af\u0003\u00af\u0003\u00b0\u0003\u00b0\u0003\u00b0', + '\u0003\u00b0\u0003\u00b0\u0003\u00b0\u0003\u00b0\u0003\u00b0\u0003\u00b0', + '\u0003\u00b0\u0003\u00b1\u0003\u00b1\u0003\u00b1\u0003\u00b1\u0003\u00b1', + '\u0003\u00b1\u0003\u00b1\u0003\u00b1\u0003\u00b1\u0003\u00b1\u0003\u00b2', + '\u0003\u00b2\u0003\u00b2\u0003\u00b2\u0003\u00b2\u0003\u00b2\u0003\u00b3', + '\u0003\u00b3\u0003\u00b3\u0003\u00b3\u0003\u00b3\u0003\u00b3\u0003\u00b3', + '\u0003\u00b4\u0003\u00b4\u0003\u00b4\u0003\u00b4\u0003\u00b4\u0003\u00b4', + '\u0003\u00b5\u0003\u00b5\u0003\u00b5\u0003\u00b5\u0003\u00b6\u0003\u00b6', + '\u0003\u00b6\u0003\u00b6\u0003\u00b6\u0003\u00b7\u0003\u00b7\u0003\u00b7', + '\u0003\u00b7\u0003\u00b7\u0003\u00b7\u0003\u00b8\u0003\u00b8\u0003\u00b8', + '\u0003\u00b8\u0003\u00b8\u0003\u00b8\u0003\u00b8\u0003\u00b9\u0003\u00b9', + '\u0003\u00b9\u0003\u00b9\u0003\u00b9\u0003\u00b9\u0003\u00b9\u0003\u00ba', + '\u0003\u00ba\u0003\u00ba\u0003\u00ba\u0003\u00ba\u0003\u00ba\u0003\u00ba', + '\u0003\u00ba\u0003\u00bb\u0003\u00bb\u0003\u00bb\u0003\u00bb\u0003\u00bb', + '\u0003\u00bb\u0003\u00bb\u0003\u00bb\u0003\u00bc\u0003\u00bc\u0003\u00bc', + '\u0003\u00bc\u0003\u00bc\u0003\u00bc\u0003\u00bc\u0003\u00bd\u0003\u00bd', + '\u0003\u00bd\u0003\u00bd\u0003\u00bd\u0003\u00bd\u0003\u00bd\u0003\u00bd', + '\u0003\u00bd\u0003\u00bd\u0003\u00be\u0003\u00be\u0003\u00be\u0003\u00be', + '\u0003\u00be\u0003\u00be\u0003\u00be\u0003\u00bf\u0003\u00bf\u0003\u00bf', + '\u0003\u00bf\u0003\u00bf\u0003\u00bf\u0003\u00c0\u0003\u00c0\u0003\u00c0', + '\u0003\u00c0\u0003\u00c0\u0003\u00c1\u0003\u00c1\u0003\u00c1\u0003\u00c1', + '\u0003\u00c1\u0003\u00c1\u0003\u00c1\u0003\u00c1\u0003\u00c1\u0003\u00c2', + '\u0003\u00c2\u0003\u00c2\u0003\u00c2\u0003\u00c3\u0003\u00c3\u0003\u00c3', + '\u0003\u00c3\u0003\u00c3\u0003\u00c4\u0003\u00c4\u0003\u00c4\u0003\u00c4', + '\u0003\u00c4\u0003\u00c4\u0003\u00c4\u0003\u00c4\u0003\u00c4\u0003\u00c4', + '\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5', + '\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c6\u0003\u00c6', + '\u0003\u00c6\u0003\u00c6\u0003\u00c6\u0003\u00c6\u0003\u00c6\u0003\u00c7', + '\u0003\u00c7\u0003\u00c7\u0003\u00c7\u0003\u00c7\u0003\u00c7\u0003\u00c8', + '\u0003\u00c8\u0003\u00c8\u0003\u00c8\u0003\u00c8\u0003\u00c8\u0003\u00c8', + '\u0003\u00c9\u0003\u00c9\u0003\u00c9\u0003\u00c9\u0003\u00c9\u0003\u00ca', + '\u0003\u00ca\u0003\u00ca\u0003\u00ca\u0003\u00cb\u0003\u00cb\u0003\u00cb', + '\u0003\u00cb\u0003\u00cb\u0003\u00cc\u0003\u00cc\u0003\u00cc\u0003\u00cc', + '\u0003\u00cc\u0003\u00cd\u0003\u00cd\u0003\u00cd\u0003\u00cd\u0003\u00cd', + '\u0003\u00cd\u0003\u00ce\u0003\u00ce\u0003\u00ce\u0003\u00ce\u0003\u00ce', + '\u0003\u00ce\u0003\u00ce\u0003\u00ce\u0003\u00ce\u0003\u00ce\u0003\u00ce', + '\u0003\u00cf\u0003\u00cf\u0003\u00cf\u0003\u00cf\u0003\u00cf\u0003\u00cf', + '\u0003\u00cf\u0003\u00d0\u0003\u00d0\u0003\u00d0\u0003\u00d0\u0003\u00d0', + '\u0003\u00d0\u0003\u00d0\u0003\u00d1\u0003\u00d1\u0003\u00d1\u0003\u00d1', + '\u0003\u00d1\u0003\u00d2\u0003\u00d2\u0003\u00d2\u0003\u00d2\u0003\u00d2', + '\u0003\u00d3\u0003\u00d3\u0003\u00d3\u0003\u00d4\u0003\u00d4\u0003\u00d4', + '\u0003\u00d4\u0003\u00d4\u0003\u00d5\u0003\u00d5\u0003\u00d5\u0003\u00d5', + '\u0003\u00d5\u0003\u00d5\u0003\u00d5\u0003\u00d5\u0003\u00d5\u0003\u00d5', + '\u0003\u00d5\u0003\u00d5\u0003\u00d6\u0003\u00d6\u0003\u00d6\u0003\u00d6', + '\u0003\u00d6\u0003\u00d6\u0003\u00d6\u0003\u00d6\u0003\u00d7\u0003\u00d7', + '\u0003\u00d7\u0003\u00d7\u0003\u00d7\u0003\u00d8\u0003\u00d8\u0003\u00d8', + '\u0003\u00d8\u0003\u00d8\u0003\u00d8\u0003\u00d8\u0003\u00d8\u0003\u00d8', + '\u0003\u00d9\u0003\u00d9\u0003\u00d9\u0003\u00d9\u0003\u00d9\u0003\u00d9', + '\u0003\u00d9\u0003\u00d9\u0003\u00d9\u0003\u00d9\u0003\u00da\u0003\u00da', + '\u0003\u00da\u0003\u00da\u0003\u00da\u0003\u00da\u0003\u00db\u0003\u00db', + '\u0003\u00db\u0003\u00db\u0003\u00db\u0003\u00db\u0003\u00dc\u0003\u00dc', + '\u0003\u00dc\u0003\u00dc\u0003\u00dc\u0003\u00dc\u0003\u00dc\u0003\u00dd', + '\u0003\u00dd\u0003\u00dd\u0003\u00dd\u0003\u00dd\u0003\u00dd\u0003\u00dd', + '\u0003\u00dd\u0003\u00de\u0003\u00de\u0003\u00de\u0003\u00de\u0003\u00de', + '\u0003\u00de\u0003\u00de\u0003\u00df\u0003\u00df\u0003\u00df\u0003\u00df', + '\u0003\u00df\u0003\u00df\u0003\u00e0\u0003\u00e0\u0003\u00e0\u0003\u00e0', + '\u0003\u00e0\u0003\u00e0\u0003\u00e0\u0003\u00e1\u0003\u00e1\u0003\u00e1', + '\u0003\u00e1\u0003\u00e1\u0003\u00e1\u0003\u00e1\u0003\u00e2\u0003\u00e2', + '\u0003\u00e2\u0003\u00e2\u0003\u00e3\u0003\u00e3\u0003\u00e3\u0003\u00e3', + '\u0003\u00e3\u0003\u00e4\u0003\u00e4\u0003\u00e4\u0003\u00e4\u0003\u00e4', + '\u0003\u00e4\u0003\u00e5\u0003\u00e5\u0003\u00e5\u0003\u00e5\u0003\u00e5', + '\u0003\u00e5\u0003\u00e5\u0003\u00e5\u0003\u00e5\u0003\u00e6\u0003\u00e6', + '\u0003\u00e6\u0003\u00e6\u0003\u00e6\u0003\u00e6\u0003\u00e7\u0003\u00e7', + '\u0003\u00e7\u0003\u00e7\u0003\u00e7\u0003\u00e7\u0003\u00e7\u0003\u00e8', + '\u0003\u00e8\u0003\u00e8\u0003\u00e8\u0003\u00e8\u0003\u00e8\u0003\u00e8', + '\u0003\u00e9\u0003\u00e9\u0003\u00e9\u0003\u00e9\u0003\u00ea\u0003\u00ea', + '\u0003\u00ea\u0003\u00ea\u0003\u00ea\u0003\u00eb\u0003\u00eb\u0003\u00eb', + '\u0003\u00eb\u0003\u00eb\u0003\u00ec\u0003\u00ec\u0003\u00ec\u0003\u00ec', + '\u0003\u00ec\u0003\u00ec\u0003\u00ed\u0003\u00ed\u0003\u00ed\u0003\u00ed', + '\u0003\u00ed\u0003\u00ed\u0003\u00ee\u0003\u00ee\u0003\u00ee\u0003\u00ee', + '\u0003\u00ee\u0003\u00ee\u0003\u00ee\u0003\u00ef\u0003\u00ef\u0003\u00ef', + '\u0003\u00ef\u0003\u00ef\u0003\u00f0\u0003\u00f0\u0003\u00f0\u0003\u00f0', + '\u0003\u00f0\u0003\u00f0\u0003\u00f0\u0003\u00f1\u0003\u00f1\u0003\u00f1', + '\u0003\u00f1\u0003\u00f1\u0003\u00f2\u0003\u00f2\u0003\u00f2\u0003\u00f2', + '\u0003\u00f3\u0003\u00f3\u0003\u00f3\u0005\u00f3\u07df\n\u00f3\u0003', + '\u00f4\u0003\u00f4\u0003\u00f5\u0003\u00f5\u0003\u00f6\u0003\u00f6\u0006', + '\u00f6\u07e7\n\u00f6\r\u00f6\u000e\u00f6\u07e8\u0003\u00f6\u0003\u00f6', + '\u0003\u00f6\u0003\u00f7\u0003\u00f7\u0006\u00f7\u07f0\n\u00f7\r\u00f7', + '\u000e\u00f7\u07f1\u0003\u00f7\u0003\u00f7\u0003\u00f7\u0003\u00f7\u0007', + '\u00f7\u07f8\n\u00f7\f\u00f7\u000e\u00f7\u07fb\u000b\u00f7\u0005\u00f7', + '\u07fd\n\u00f7\u0003\u00f8\u0003\u00f8\u0003\u00f8\u0007\u00f8\u0802', + '\n\u00f8\f\u00f8\u000e\u00f8\u0805\u000b\u00f8\u0003\u00f9\u0003\u00f9', + '\u0003\u00f9\u0007\u00f9\u080a\n\u00f9\f\u00f9\u000e\u00f9\u080d\u000b', + '\u00f9\u0003\u00fa\u0003\u00fa\u0003\u0246\u0002\u00fb\u0003\u0002\u0005', + '\u0002\u0007\u0003\t\u0002\u000b\u0002\r\u0002\u000f\u0002\u0011\u0004', + '\u0013\u0005\u0015\u0006\u0017\u0007\u0019\b\u001b\t\u001d\n\u001f\u000b', + "!\f#\r%\u000e'\u000f)\u0010+\u0011-\u0012/\u00131\u00143\u00155\u0016", + '7\u00179\u0018;\u0019=\u001a?\u001bA\u001cC\u001dE\u001eG\u001fI K!', + 'M"O#Q$S%U&W\'Y([)]*_+a,c-e.g/i0k1m2o3q4s5u6w7y8{9}:\u007f;\u0081<\u0083', + '=\u0085>\u0087?\u0089@\u008bA\u008dB\u008fC\u0091D\u0093E\u0095F\u0097', + 'G\u0099H\u009bI\u009dJ\u009fK\u00a1L\u00a3M\u00a5N\u00a7O\u00a9P\u00ab', + 'Q\u00adR\u00afS\u00b1T\u00b3U\u00b5V\u00b7W\u00b9X\u00bbY\u00bdZ\u00bf', + '[\u00c1\\\u00c3]\u00c5^\u00c7_\u00c9`\u00cba\u00cdb\u00cfc\u00d1d\u00d3', + 'e\u00d5f\u00d7g\u00d9h\u00dbi\u00ddj\u00dfk\u00e1l\u00e3m\u00e5n\u00e7', + 'o\u00e9p\u00ebq\u00edr\u00efs\u00f1t\u00f3u\u00f5v\u00f7w\u00f9x\u00fb', + 'y\u00fdz\u00ff{\u0101|\u0103}\u0105~\u0107\u007f\u0109\u0080\u010b\u0081', + '\u010d\u0082\u010f\u0083\u0111\u0084\u0113\u0085\u0115\u0086\u0117\u0087', + '\u0119\u0088\u011b\u0089\u011d\u008a\u011f\u008b\u0121\u008c\u0123\u008d', + '\u0125\u008e\u0127\u008f\u0129\u0090\u012b\u0091\u012d\u0092\u012f\u0093', + '\u0131\u0094\u0133\u0095\u0135\u0096\u0137\u0097\u0139\u0098\u013b\u0099', + '\u013d\u009a\u013f\u009b\u0141\u009c\u0143\u009d\u0145\u009e\u0147\u009f', + '\u0149\u00a0\u014b\u00a1\u014d\u00a2\u014f\u00a3\u0151\u00a4\u0153\u00a5', + '\u0155\u00a6\u0157\u00a7\u0159\u00a8\u015b\u00a9\u015d\u00aa\u015f\u00ab', + '\u0161\u00ac\u0163\u00ad\u0165\u00ae\u0167\u00af\u0169\u00b0\u016b\u00b1', + '\u016d\u00b2\u016f\u00b3\u0171\u00b4\u0173\u00b5\u0175\u00b6\u0177\u00b7', + '\u0179\u00b8\u017b\u00b9\u017d\u00ba\u017f\u00bb\u0181\u00bc\u0183\u00bd', + '\u0185\u00be\u0187\u00bf\u0189\u00c0\u018b\u00c1\u018d\u00c2\u018f\u00c3', + '\u0191\u00c4\u0193\u00c5\u0195\u00c6\u0197\u00c7\u0199\u00c8\u019b\u00c9', + '\u019d\u00ca\u019f\u00cb\u01a1\u00cc\u01a3\u00cd\u01a5\u00ce\u01a7\u00cf', + '\u01a9\u00d0\u01ab\u00d1\u01ad\u00d2\u01af\u00d3\u01b1\u00d4\u01b3\u00d5', + '\u01b5\u00d6\u01b7\u00d7\u01b9\u00d8\u01bb\u00d9\u01bd\u00da\u01bf\u00db', + '\u01c1\u00dc\u01c3\u00dd\u01c5\u00de\u01c7\u00df\u01c9\u00e0\u01cb\u00e1', + '\u01cd\u00e2\u01cf\u00e3\u01d1\u00e4\u01d3\u00e5\u01d5\u00e6\u01d7\u00e7', + '\u01d9\u00e8\u01db\u00e9\u01dd\u00ea\u01df\u00eb\u01e1\u00ec\u01e3\u00ed', + '\u01e5\u0002\u01e7\u0002\u01e9\u0002\u01eb\u00ee\u01ed\u00ef\u01ef\u00f0', + '\u01f1\u00f1\u01f3\u00f2\u0003\u0002*\u0003\u0002))\u0006\u0002\f\f', + '\u000f\u000f))^^\u0003\u0002$$\u0004\u0002$$^^\u0003\u00022;\u0004\u0002', + 'GGgg\u0004\u0002--//\u0004\u0002\f\f\u000f\u000f\u0005\u0002\u000b\f', + '\u000e\u000f""\u0004\u0002OOoo\u0004\u0002KKkk\u0004\u0002PPpp\u0004', + '\u0002WWww\u0004\u0002UUuu\u0004\u0002CCcc\u0004\u0002FFff\u0004\u0002', + 'XXxx\u0004\u0002NNnn\u0004\u0002VVvv\u0004\u0002TTtt\u0004\u0002[[{', + '{\u0004\u0002\\\\||\u0004\u0002EEee\u0004\u0002DDdd\u0004\u0002IIii', + '\u0004\u0002YYyy\u0004\u0002QQqq\u0004\u0002MMmm\u0004\u0002RRrr\u0004', + '\u0002JJjj\u0004\u0002ZZzz\u0004\u0002HHhh\u0004\u0002LLll\u0003\u0002', + 'aa\u0004\u0002PPww\u0004\u0002SSss\u0003\u0002bb\u0005\u0002C\\aac|', + '\u0006\u00022;C\\aac|\u0003\u00023;\u0002\u0821\u0002\u0007\u0003\u0002', + '\u0002\u0002\u0002\u0011\u0003\u0002\u0002\u0002\u0002\u0013\u0003\u0002', + '\u0002\u0002\u0002\u0015\u0003\u0002\u0002\u0002\u0002\u0017\u0003\u0002', + '\u0002\u0002\u0002\u0019\u0003\u0002\u0002\u0002\u0002\u001b\u0003\u0002', + '\u0002\u0002\u0002\u001d\u0003\u0002\u0002\u0002\u0002\u001f\u0003\u0002', + '\u0002\u0002\u0002!\u0003\u0002\u0002\u0002\u0002#\u0003\u0002\u0002', + "\u0002\u0002%\u0003\u0002\u0002\u0002\u0002'\u0003\u0002\u0002\u0002", + '\u0002)\u0003\u0002\u0002\u0002\u0002+\u0003\u0002\u0002\u0002\u0002', + '-\u0003\u0002\u0002\u0002\u0002/\u0003\u0002\u0002\u0002\u00021\u0003', + '\u0002\u0002\u0002\u00023\u0003\u0002\u0002\u0002\u00025\u0003\u0002', + '\u0002\u0002\u00027\u0003\u0002\u0002\u0002\u00029\u0003\u0002\u0002', + '\u0002\u0002;\u0003\u0002\u0002\u0002\u0002=\u0003\u0002\u0002\u0002', + '\u0002?\u0003\u0002\u0002\u0002\u0002A\u0003\u0002\u0002\u0002\u0002', + 'C\u0003\u0002\u0002\u0002\u0002E\u0003\u0002\u0002\u0002\u0002G\u0003', + '\u0002\u0002\u0002\u0002I\u0003\u0002\u0002\u0002\u0002K\u0003\u0002', + '\u0002\u0002\u0002M\u0003\u0002\u0002\u0002\u0002O\u0003\u0002\u0002', + '\u0002\u0002Q\u0003\u0002\u0002\u0002\u0002S\u0003\u0002\u0002\u0002', + '\u0002U\u0003\u0002\u0002\u0002\u0002W\u0003\u0002\u0002\u0002\u0002', + 'Y\u0003\u0002\u0002\u0002\u0002[\u0003\u0002\u0002\u0002\u0002]\u0003', + '\u0002\u0002\u0002\u0002_\u0003\u0002\u0002\u0002\u0002a\u0003\u0002', + '\u0002\u0002\u0002c\u0003\u0002\u0002\u0002\u0002e\u0003\u0002\u0002', + '\u0002\u0002g\u0003\u0002\u0002\u0002\u0002i\u0003\u0002\u0002\u0002', + '\u0002k\u0003\u0002\u0002\u0002\u0002m\u0003\u0002\u0002\u0002\u0002', + 'o\u0003\u0002\u0002\u0002\u0002q\u0003\u0002\u0002\u0002\u0002s\u0003', + '\u0002\u0002\u0002\u0002u\u0003\u0002\u0002\u0002\u0002w\u0003\u0002', + '\u0002\u0002\u0002y\u0003\u0002\u0002\u0002\u0002{\u0003\u0002\u0002', + '\u0002\u0002}\u0003\u0002\u0002\u0002\u0002\u007f\u0003\u0002\u0002', + '\u0002\u0002\u0081\u0003\u0002\u0002\u0002\u0002\u0083\u0003\u0002\u0002', + '\u0002\u0002\u0085\u0003\u0002\u0002\u0002\u0002\u0087\u0003\u0002\u0002', + '\u0002\u0002\u0089\u0003\u0002\u0002\u0002\u0002\u008b\u0003\u0002\u0002', + '\u0002\u0002\u008d\u0003\u0002\u0002\u0002\u0002\u008f\u0003\u0002\u0002', + '\u0002\u0002\u0091\u0003\u0002\u0002\u0002\u0002\u0093\u0003\u0002\u0002', + '\u0002\u0002\u0095\u0003\u0002\u0002\u0002\u0002\u0097\u0003\u0002\u0002', + '\u0002\u0002\u0099\u0003\u0002\u0002\u0002\u0002\u009b\u0003\u0002\u0002', + '\u0002\u0002\u009d\u0003\u0002\u0002\u0002\u0002\u009f\u0003\u0002\u0002', + '\u0002\u0002\u00a1\u0003\u0002\u0002\u0002\u0002\u00a3\u0003\u0002\u0002', + '\u0002\u0002\u00a5\u0003\u0002\u0002\u0002\u0002\u00a7\u0003\u0002\u0002', + '\u0002\u0002\u00a9\u0003\u0002\u0002\u0002\u0002\u00ab\u0003\u0002\u0002', + '\u0002\u0002\u00ad\u0003\u0002\u0002\u0002\u0002\u00af\u0003\u0002\u0002', + '\u0002\u0002\u00b1\u0003\u0002\u0002\u0002\u0002\u00b3\u0003\u0002\u0002', + '\u0002\u0002\u00b5\u0003\u0002\u0002\u0002\u0002\u00b7\u0003\u0002\u0002', + '\u0002\u0002\u00b9\u0003\u0002\u0002\u0002\u0002\u00bb\u0003\u0002\u0002', + '\u0002\u0002\u00bd\u0003\u0002\u0002\u0002\u0002\u00bf\u0003\u0002\u0002', + '\u0002\u0002\u00c1\u0003\u0002\u0002\u0002\u0002\u00c3\u0003\u0002\u0002', + '\u0002\u0002\u00c5\u0003\u0002\u0002\u0002\u0002\u00c7\u0003\u0002\u0002', + '\u0002\u0002\u00c9\u0003\u0002\u0002\u0002\u0002\u00cb\u0003\u0002\u0002', + '\u0002\u0002\u00cd\u0003\u0002\u0002\u0002\u0002\u00cf\u0003\u0002\u0002', + '\u0002\u0002\u00d1\u0003\u0002\u0002\u0002\u0002\u00d3\u0003\u0002\u0002', + '\u0002\u0002\u00d5\u0003\u0002\u0002\u0002\u0002\u00d7\u0003\u0002\u0002', + '\u0002\u0002\u00d9\u0003\u0002\u0002\u0002\u0002\u00db\u0003\u0002\u0002', + '\u0002\u0002\u00dd\u0003\u0002\u0002\u0002\u0002\u00df\u0003\u0002\u0002', + '\u0002\u0002\u00e1\u0003\u0002\u0002\u0002\u0002\u00e3\u0003\u0002\u0002', + '\u0002\u0002\u00e5\u0003\u0002\u0002\u0002\u0002\u00e7\u0003\u0002\u0002', + '\u0002\u0002\u00e9\u0003\u0002\u0002\u0002\u0002\u00eb\u0003\u0002\u0002', + '\u0002\u0002\u00ed\u0003\u0002\u0002\u0002\u0002\u00ef\u0003\u0002\u0002', + '\u0002\u0002\u00f1\u0003\u0002\u0002\u0002\u0002\u00f3\u0003\u0002\u0002', + '\u0002\u0002\u00f5\u0003\u0002\u0002\u0002\u0002\u00f7\u0003\u0002\u0002', + '\u0002\u0002\u00f9\u0003\u0002\u0002\u0002\u0002\u00fb\u0003\u0002\u0002', + '\u0002\u0002\u00fd\u0003\u0002\u0002\u0002\u0002\u00ff\u0003\u0002\u0002', + '\u0002\u0002\u0101\u0003\u0002\u0002\u0002\u0002\u0103\u0003\u0002\u0002', + '\u0002\u0002\u0105\u0003\u0002\u0002\u0002\u0002\u0107\u0003\u0002\u0002', + '\u0002\u0002\u0109\u0003\u0002\u0002\u0002\u0002\u010b\u0003\u0002\u0002', + '\u0002\u0002\u010d\u0003\u0002\u0002\u0002\u0002\u010f\u0003\u0002\u0002', + '\u0002\u0002\u0111\u0003\u0002\u0002\u0002\u0002\u0113\u0003\u0002\u0002', + '\u0002\u0002\u0115\u0003\u0002\u0002\u0002\u0002\u0117\u0003\u0002\u0002', + '\u0002\u0002\u0119\u0003\u0002\u0002\u0002\u0002\u011b\u0003\u0002\u0002', + '\u0002\u0002\u011d\u0003\u0002\u0002\u0002\u0002\u011f\u0003\u0002\u0002', + '\u0002\u0002\u0121\u0003\u0002\u0002\u0002\u0002\u0123\u0003\u0002\u0002', + '\u0002\u0002\u0125\u0003\u0002\u0002\u0002\u0002\u0127\u0003\u0002\u0002', + '\u0002\u0002\u0129\u0003\u0002\u0002\u0002\u0002\u012b\u0003\u0002\u0002', + '\u0002\u0002\u012d\u0003\u0002\u0002\u0002\u0002\u012f\u0003\u0002\u0002', + '\u0002\u0002\u0131\u0003\u0002\u0002\u0002\u0002\u0133\u0003\u0002\u0002', + '\u0002\u0002\u0135\u0003\u0002\u0002\u0002\u0002\u0137\u0003\u0002\u0002', + '\u0002\u0002\u0139\u0003\u0002\u0002\u0002\u0002\u013b\u0003\u0002\u0002', + '\u0002\u0002\u013d\u0003\u0002\u0002\u0002\u0002\u013f\u0003\u0002\u0002', + '\u0002\u0002\u0141\u0003\u0002\u0002\u0002\u0002\u0143\u0003\u0002\u0002', + '\u0002\u0002\u0145\u0003\u0002\u0002\u0002\u0002\u0147\u0003\u0002\u0002', + '\u0002\u0002\u0149\u0003\u0002\u0002\u0002\u0002\u014b\u0003\u0002\u0002', + '\u0002\u0002\u014d\u0003\u0002\u0002\u0002\u0002\u014f\u0003\u0002\u0002', + '\u0002\u0002\u0151\u0003\u0002\u0002\u0002\u0002\u0153\u0003\u0002\u0002', + '\u0002\u0002\u0155\u0003\u0002\u0002\u0002\u0002\u0157\u0003\u0002\u0002', + '\u0002\u0002\u0159\u0003\u0002\u0002\u0002\u0002\u015b\u0003\u0002\u0002', + '\u0002\u0002\u015d\u0003\u0002\u0002\u0002\u0002\u015f\u0003\u0002\u0002', + '\u0002\u0002\u0161\u0003\u0002\u0002\u0002\u0002\u0163\u0003\u0002\u0002', + '\u0002\u0002\u0165\u0003\u0002\u0002\u0002\u0002\u0167\u0003\u0002\u0002', + '\u0002\u0002\u0169\u0003\u0002\u0002\u0002\u0002\u016b\u0003\u0002\u0002', + '\u0002\u0002\u016d\u0003\u0002\u0002\u0002\u0002\u016f\u0003\u0002\u0002', + '\u0002\u0002\u0171\u0003\u0002\u0002\u0002\u0002\u0173\u0003\u0002\u0002', + '\u0002\u0002\u0175\u0003\u0002\u0002\u0002\u0002\u0177\u0003\u0002\u0002', + '\u0002\u0002\u0179\u0003\u0002\u0002\u0002\u0002\u017b\u0003\u0002\u0002', + '\u0002\u0002\u017d\u0003\u0002\u0002\u0002\u0002\u017f\u0003\u0002\u0002', + '\u0002\u0002\u0181\u0003\u0002\u0002\u0002\u0002\u0183\u0003\u0002\u0002', + '\u0002\u0002\u0185\u0003\u0002\u0002\u0002\u0002\u0187\u0003\u0002\u0002', + '\u0002\u0002\u0189\u0003\u0002\u0002\u0002\u0002\u018b\u0003\u0002\u0002', + '\u0002\u0002\u018d\u0003\u0002\u0002\u0002\u0002\u018f\u0003\u0002\u0002', + '\u0002\u0002\u0191\u0003\u0002\u0002\u0002\u0002\u0193\u0003\u0002\u0002', + '\u0002\u0002\u0195\u0003\u0002\u0002\u0002\u0002\u0197\u0003\u0002\u0002', + '\u0002\u0002\u0199\u0003\u0002\u0002\u0002\u0002\u019b\u0003\u0002\u0002', + '\u0002\u0002\u019d\u0003\u0002\u0002\u0002\u0002\u019f\u0003\u0002\u0002', + '\u0002\u0002\u01a1\u0003\u0002\u0002\u0002\u0002\u01a3\u0003\u0002\u0002', + '\u0002\u0002\u01a5\u0003\u0002\u0002\u0002\u0002\u01a7\u0003\u0002\u0002', + '\u0002\u0002\u01a9\u0003\u0002\u0002\u0002\u0002\u01ab\u0003\u0002\u0002', + '\u0002\u0002\u01ad\u0003\u0002\u0002\u0002\u0002\u01af\u0003\u0002\u0002', + '\u0002\u0002\u01b1\u0003\u0002\u0002\u0002\u0002\u01b3\u0003\u0002\u0002', + '\u0002\u0002\u01b5\u0003\u0002\u0002\u0002\u0002\u01b7\u0003\u0002\u0002', + '\u0002\u0002\u01b9\u0003\u0002\u0002\u0002\u0002\u01bb\u0003\u0002\u0002', + '\u0002\u0002\u01bd\u0003\u0002\u0002\u0002\u0002\u01bf\u0003\u0002\u0002', + '\u0002\u0002\u01c1\u0003\u0002\u0002\u0002\u0002\u01c3\u0003\u0002\u0002', + '\u0002\u0002\u01c5\u0003\u0002\u0002\u0002\u0002\u01c7\u0003\u0002\u0002', + '\u0002\u0002\u01c9\u0003\u0002\u0002\u0002\u0002\u01cb\u0003\u0002\u0002', + '\u0002\u0002\u01cd\u0003\u0002\u0002\u0002\u0002\u01cf\u0003\u0002\u0002', + '\u0002\u0002\u01d1\u0003\u0002\u0002\u0002\u0002\u01d3\u0003\u0002\u0002', + '\u0002\u0002\u01d5\u0003\u0002\u0002\u0002\u0002\u01d7\u0003\u0002\u0002', + '\u0002\u0002\u01d9\u0003\u0002\u0002\u0002\u0002\u01db\u0003\u0002\u0002', + '\u0002\u0002\u01dd\u0003\u0002\u0002\u0002\u0002\u01df\u0003\u0002\u0002', + '\u0002\u0002\u01e1\u0003\u0002\u0002\u0002\u0002\u01e3\u0003\u0002\u0002', + '\u0002\u0002\u01eb\u0003\u0002\u0002\u0002\u0002\u01ed\u0003\u0002\u0002', + '\u0002\u0002\u01ef\u0003\u0002\u0002\u0002\u0002\u01f1\u0003\u0002\u0002', + '\u0002\u0002\u01f3\u0003\u0002\u0002\u0002\u0003\u01fc\u0003\u0002\u0002', + '\u0002\u0005\u0203\u0003\u0002\u0002\u0002\u0007\u0215\u0003\u0002\u0002', + '\u0002\t\u0218\u0003\u0002\u0002\u0002\u000b\u021a\u0003\u0002\u0002', + '\u0002\r\u0224\u0003\u0002\u0002\u0002\u000f\u0226\u0003\u0002\u0002', + '\u0002\u0011\u022f\u0003\u0002\u0002\u0002\u0013\u023e\u0003\u0002\u0002', + '\u0002\u0015\u0240\u0003\u0002\u0002\u0002\u0017\u024c\u0003\u0002\u0002', + '\u0002\u0019\u0256\u0003\u0002\u0002\u0002\u001b\u025c\u0003\u0002\u0002', + '\u0002\u001d\u025e\u0003\u0002\u0002\u0002\u001f\u0266\u0003\u0002\u0002', + '\u0002!\u0268\u0003\u0002\u0002\u0002#\u026a\u0003\u0002\u0002\u0002', + "%\u026c\u0003\u0002\u0002\u0002'\u026e\u0003\u0002\u0002\u0002)\u0271", + '\u0003\u0002\u0002\u0002+\u0277\u0003\u0002\u0002\u0002-\u0279\u0003', + '\u0002\u0002\u0002/\u027b\u0003\u0002\u0002\u00021\u027e\u0003\u0002', + '\u0002\u00023\u0280\u0003\u0002\u0002\u00025\u0283\u0003\u0002\u0002', + '\u00027\u0286\u0003\u0002\u0002\u00029\u0288\u0003\u0002\u0002\u0002', + ';\u028a\u0003\u0002\u0002\u0002=\u028c\u0003\u0002\u0002\u0002?\u028e', + '\u0003\u0002\u0002\u0002A\u0290\u0003\u0002\u0002\u0002C\u0292\u0003', + '\u0002\u0002\u0002E\u0294\u0003\u0002\u0002\u0002G\u0296\u0003\u0002', + '\u0002\u0002I\u0299\u0003\u0002\u0002\u0002K\u029b\u0003\u0002\u0002', + '\u0002M\u029d\u0003\u0002\u0002\u0002O\u02a4\u0003\u0002\u0002\u0002', + 'Q\u02a8\u0003\u0002\u0002\u0002S\u02ae\u0003\u0002\u0002\u0002U\u02b6', + '\u0003\u0002\u0002\u0002W\u02ba\u0003\u0002\u0002\u0002Y\u02be\u0003', + '\u0002\u0002\u0002[\u02c4\u0003\u0002\u0002\u0002]\u02c7\u0003\u0002', + '\u0002\u0002_\u02cb\u0003\u0002\u0002\u0002a\u02ce\u0003\u0002\u0002', + '\u0002c\u02d4\u0003\u0002\u0002\u0002e\u02dc\u0003\u0002\u0002\u0002', + 'g\u02e3\u0003\u0002\u0002\u0002i\u02eb\u0003\u0002\u0002\u0002k\u02f1', + '\u0003\u0002\u0002\u0002m\u02f8\u0003\u0002\u0002\u0002o\u02fe\u0003', + '\u0002\u0002\u0002q\u0301\u0003\u0002\u0002\u0002s\u0306\u0003\u0002', + '\u0002\u0002u\u030b\u0003\u0002\u0002\u0002w\u0310\u0003\u0002\u0002', + '\u0002y\u0318\u0003\u0002\u0002\u0002{\u0320\u0003\u0002\u0002\u0002', + '}\u032b\u0003\u0002\u0002\u0002\u007f\u0332\u0003\u0002\u0002\u0002', + '\u0081\u033c\u0003\u0002\u0002\u0002\u0083\u0344\u0003\u0002\u0002\u0002', + '\u0085\u034d\u0003\u0002\u0002\u0002\u0087\u0358\u0003\u0002\u0002\u0002', + '\u0089\u035e\u0003\u0002\u0002\u0002\u008b\u0365\u0003\u0002\u0002\u0002', + '\u008d\u036d\u0003\u0002\u0002\u0002\u008f\u0376\u0003\u0002\u0002\u0002', + '\u0091\u037e\u0003\u0002\u0002\u0002\u0093\u0388\u0003\u0002\u0002\u0002', + '\u0095\u0390\u0003\u0002\u0002\u0002\u0097\u039a\u0003\u0002\u0002\u0002', + '\u0099\u03a1\u0003\u0002\u0002\u0002\u009b\u03a9\u0003\u0002\u0002\u0002', + '\u009d\u03ae\u0003\u0002\u0002\u0002\u009f\u03b7\u0003\u0002\u0002\u0002', + '\u00a1\u03c0\u0003\u0002\u0002\u0002\u00a3\u03c3\u0003\u0002\u0002\u0002', + '\u00a5\u03c8\u0003\u0002\u0002\u0002\u00a7\u03cd\u0003\u0002\u0002\u0002', + '\u00a9\u03d5\u0003\u0002\u0002\u0002\u00ab\u03da\u0003\u0002\u0002\u0002', + '\u00ad\u03de\u0003\u0002\u0002\u0002\u00af\u03e4\u0003\u0002\u0002\u0002', + '\u00b1\u03eb\u0003\u0002\u0002\u0002\u00b3\u03f3\u0003\u0002\u0002\u0002', + '\u00b5\u03fb\u0003\u0002\u0002\u0002\u00b7\u0402\u0003\u0002\u0002\u0002', + '\u00b9\u040a\u0003\u0002\u0002\u0002\u00bb\u0410\u0003\u0002\u0002\u0002', + '\u00bd\u0416\u0003\u0002\u0002\u0002\u00bf\u041d\u0003\u0002\u0002\u0002', + '\u00c1\u0423\u0003\u0002\u0002\u0002\u00c3\u042b\u0003\u0002\u0002\u0002', + '\u00c5\u0431\u0003\u0002\u0002\u0002\u00c7\u043b\u0003\u0002\u0002\u0002', + '\u00c9\u043f\u0003\u0002\u0002\u0002\u00cb\u0445\u0003\u0002\u0002\u0002', + '\u00cd\u044a\u0003\u0002\u0002\u0002\u00cf\u044e\u0003\u0002\u0002\u0002', + '\u00d1\u0457\u0003\u0002\u0002\u0002\u00d3\u045e\u0003\u0002\u0002\u0002', + '\u00d5\u0464\u0003\u0002\u0002\u0002\u00d7\u046a\u0003\u0002\u0002\u0002', + '\u00d9\u0471\u0003\u0002\u0002\u0002\u00db\u0475\u0003\u0002\u0002\u0002', + '\u00dd\u047a\u0003\u0002\u0002\u0002\u00df\u0481\u0003\u0002\u0002\u0002', + '\u00e1\u0484\u0003\u0002\u0002\u0002\u00e3\u048b\u0003\u0002\u0002\u0002', + '\u00e5\u0491\u0003\u0002\u0002\u0002\u00e7\u0494\u0003\u0002\u0002\u0002', + '\u00e9\u049c\u0003\u0002\u0002\u0002\u00eb\u04a6\u0003\u0002\u0002\u0002', + '\u00ed\u04ac\u0003\u0002\u0002\u0002\u00ef\u04b2\u0003\u0002\u0002\u0002', + '\u00f1\u04b9\u0003\u0002\u0002\u0002\u00f3\u04bf\u0003\u0002\u0002\u0002', + '\u00f5\u04c6\u0003\u0002\u0002\u0002\u00f7\u04d0\u0003\u0002\u0002\u0002', + '\u00f9\u04d5\u0003\u0002\u0002\u0002\u00fb\u04d8\u0003\u0002\u0002\u0002', + '\u00fd\u04e2\u0003\u0002\u0002\u0002\u00ff\u04ed\u0003\u0002\u0002\u0002', + '\u0101\u04f2\u0003\u0002\u0002\u0002\u0103\u04f6\u0003\u0002\u0002\u0002', + '\u0105\u04fb\u0003\u0002\u0002\u0002\u0107\u0504\u0003\u0002\u0002\u0002', + '\u0109\u050a\u0003\u0002\u0002\u0002\u010b\u0513\u0003\u0002\u0002\u0002', + '\u010d\u0518\u0003\u0002\u0002\u0002\u010f\u051d\u0003\u0002\u0002\u0002', + '\u0111\u0521\u0003\u0002\u0002\u0002\u0113\u0529\u0003\u0002\u0002\u0002', + '\u0115\u052f\u0003\u0002\u0002\u0002\u0117\u0534\u0003\u0002\u0002\u0002', + '\u0119\u053a\u0003\u0002\u0002\u0002\u011b\u053e\u0003\u0002\u0002\u0002', + '\u011d\u0542\u0003\u0002\u0002\u0002\u011f\u054a\u0003\u0002\u0002\u0002', + '\u0121\u0552\u0003\u0002\u0002\u0002\u0123\u055f\u0003\u0002\u0002\u0002', + '\u0125\u0565\u0003\u0002\u0002\u0002\u0127\u056d\u0003\u0002\u0002\u0002', + '\u0129\u0577\u0003\u0002\u0002\u0002\u012b\u057c\u0003\u0002\u0002\u0002', + '\u012d\u057f\u0003\u0002\u0002\u0002\u012f\u0582\u0003\u0002\u0002\u0002', + '\u0131\u0586\u0003\u0002\u0002\u0002\u0133\u0590\u0003\u0002\u0002\u0002', + '\u0135\u0595\u0003\u0002\u0002\u0002\u0137\u059b\u0003\u0002\u0002\u0002', + '\u0139\u05a2\u0003\u0002\u0002\u0002\u013b\u05a9\u0003\u0002\u0002\u0002', + '\u013d\u05b0\u0003\u0002\u0002\u0002\u013f\u05b3\u0003\u0002\u0002\u0002', + '\u0141\u05ba\u0003\u0002\u0002\u0002\u0143\u05c2\u0003\u0002\u0002\u0002', + '\u0145\u05c5\u0003\u0002\u0002\u0002\u0147\u05cb\u0003\u0002\u0002\u0002', + '\u0149\u05d2\u0003\u0002\u0002\u0002\u014b\u05d8\u0003\u0002\u0002\u0002', + '\u014d\u05dd\u0003\u0002\u0002\u0002\u014f\u05e3\u0003\u0002\u0002\u0002', + '\u0151\u05ed\u0003\u0002\u0002\u0002\u0153\u05f6\u0003\u0002\u0002\u0002', + '\u0155\u05fb\u0003\u0002\u0002\u0002\u0157\u0600\u0003\u0002\u0002\u0002', + '\u0159\u060a\u0003\u0002\u0002\u0002\u015b\u0612\u0003\u0002\u0002\u0002', + '\u015d\u061a\u0003\u0002\u0002\u0002\u015f\u0622\u0003\u0002\u0002\u0002', + '\u0161\u062c\u0003\u0002\u0002\u0002\u0163\u0636\u0003\u0002\u0002\u0002', + '\u0165\u063c\u0003\u0002\u0002\u0002\u0167\u0643\u0003\u0002\u0002\u0002', + '\u0169\u0649\u0003\u0002\u0002\u0002\u016b\u064d\u0003\u0002\u0002\u0002', + '\u016d\u0652\u0003\u0002\u0002\u0002\u016f\u0658\u0003\u0002\u0002\u0002', + '\u0171\u065f\u0003\u0002\u0002\u0002\u0173\u0666\u0003\u0002\u0002\u0002', + '\u0175\u066e\u0003\u0002\u0002\u0002\u0177\u0676\u0003\u0002\u0002\u0002', + '\u0179\u067d\u0003\u0002\u0002\u0002\u017b\u0687\u0003\u0002\u0002\u0002', + '\u017d\u068e\u0003\u0002\u0002\u0002\u017f\u0694\u0003\u0002\u0002\u0002', + '\u0181\u0699\u0003\u0002\u0002\u0002\u0183\u06a2\u0003\u0002\u0002\u0002', + '\u0185\u06a6\u0003\u0002\u0002\u0002\u0187\u06ab\u0003\u0002\u0002\u0002', + '\u0189\u06b5\u0003\u0002\u0002\u0002\u018b\u06bf\u0003\u0002\u0002\u0002', + '\u018d\u06c6\u0003\u0002\u0002\u0002\u018f\u06cc\u0003\u0002\u0002\u0002', + '\u0191\u06d3\u0003\u0002\u0002\u0002\u0193\u06d8\u0003\u0002\u0002\u0002', + '\u0195\u06dc\u0003\u0002\u0002\u0002\u0197\u06e1\u0003\u0002\u0002\u0002', + '\u0199\u06e6\u0003\u0002\u0002\u0002\u019b\u06ec\u0003\u0002\u0002\u0002', + '\u019d\u06f7\u0003\u0002\u0002\u0002\u019f\u06fe\u0003\u0002\u0002\u0002', + '\u01a1\u0705\u0003\u0002\u0002\u0002\u01a3\u070a\u0003\u0002\u0002\u0002', + '\u01a5\u070f\u0003\u0002\u0002\u0002\u01a7\u0712\u0003\u0002\u0002\u0002', + '\u01a9\u0717\u0003\u0002\u0002\u0002\u01ab\u0723\u0003\u0002\u0002\u0002', + '\u01ad\u072b\u0003\u0002\u0002\u0002\u01af\u0730\u0003\u0002\u0002\u0002', + '\u01b1\u0739\u0003\u0002\u0002\u0002\u01b3\u0743\u0003\u0002\u0002\u0002', + '\u01b5\u0749\u0003\u0002\u0002\u0002\u01b7\u074f\u0003\u0002\u0002\u0002', + '\u01b9\u0756\u0003\u0002\u0002\u0002\u01bb\u075e\u0003\u0002\u0002\u0002', + '\u01bd\u0765\u0003\u0002\u0002\u0002\u01bf\u076b\u0003\u0002\u0002\u0002', + '\u01c1\u0772\u0003\u0002\u0002\u0002\u01c3\u0779\u0003\u0002\u0002\u0002', + '\u01c5\u077d\u0003\u0002\u0002\u0002\u01c7\u0782\u0003\u0002\u0002\u0002', + '\u01c9\u0788\u0003\u0002\u0002\u0002\u01cb\u0791\u0003\u0002\u0002\u0002', + '\u01cd\u0797\u0003\u0002\u0002\u0002\u01cf\u079e\u0003\u0002\u0002\u0002', + '\u01d1\u07a5\u0003\u0002\u0002\u0002\u01d3\u07a9\u0003\u0002\u0002\u0002', + '\u01d5\u07ae\u0003\u0002\u0002\u0002\u01d7\u07b3\u0003\u0002\u0002\u0002', + '\u01d9\u07b9\u0003\u0002\u0002\u0002\u01db\u07bf\u0003\u0002\u0002\u0002', + '\u01dd\u07c6\u0003\u0002\u0002\u0002\u01df\u07cb\u0003\u0002\u0002\u0002', + '\u01e1\u07d2\u0003\u0002\u0002\u0002\u01e3\u07d7\u0003\u0002\u0002\u0002', + '\u01e5\u07de\u0003\u0002\u0002\u0002\u01e7\u07e0\u0003\u0002\u0002\u0002', + '\u01e9\u07e2\u0003\u0002\u0002\u0002\u01eb\u07e4\u0003\u0002\u0002\u0002', + '\u01ed\u07fc\u0003\u0002\u0002\u0002\u01ef\u07fe\u0003\u0002\u0002\u0002', + '\u01f1\u0806\u0003\u0002\u0002\u0002\u01f3\u080e\u0003\u0002\u0002\u0002', + '\u01f5\u01f6\u0007)\u0002\u0002\u01f6\u01fd\u0007)\u0002\u0002\u01f7', + '\u01f8\u0007^\u0002\u0002\u01f8\u01fd\u0007)\u0002\u0002\u01f9\u01fa', + '\u0007^\u0002\u0002\u01fa\u01fd\n\u0002\u0002\u0002\u01fb\u01fd\n\u0003', + '\u0002\u0002\u01fc\u01f5\u0003\u0002\u0002\u0002\u01fc\u01f7\u0003\u0002', + '\u0002\u0002\u01fc\u01f9\u0003\u0002\u0002\u0002\u01fc\u01fb\u0003\u0002', + '\u0002\u0002\u01fd\u0004\u0003\u0002\u0002\u0002\u01fe\u01ff\u0007^', + '\u0002\u0002\u01ff\u0204\u0007$\u0002\u0002\u0200\u0201\u0007^\u0002', + '\u0002\u0201\u0204\n\u0004\u0002\u0002\u0202\u0204\n\u0005\u0002\u0002', + '\u0203\u01fe\u0003\u0002\u0002\u0002\u0203\u0200\u0003\u0002\u0002\u0002', + '\u0203\u0202\u0003\u0002\u0002\u0002\u0204\u0006\u0003\u0002\u0002\u0002', + '\u0205\u0209\u0007)\u0002\u0002\u0206\u0208\u0005\u0003\u0002\u0002', + '\u0207\u0206\u0003\u0002\u0002\u0002\u0208\u020b\u0003\u0002\u0002\u0002', + '\u0209\u0207\u0003\u0002\u0002\u0002\u0209\u020a\u0003\u0002\u0002\u0002', + '\u020a\u020c\u0003\u0002\u0002\u0002\u020b\u0209\u0003\u0002\u0002\u0002', + '\u020c\u0216\u0007)\u0002\u0002\u020d\u0211\u0007$\u0002\u0002\u020e', + '\u0210\u0005\u0005\u0003\u0002\u020f\u020e\u0003\u0002\u0002\u0002\u0210', + '\u0213\u0003\u0002\u0002\u0002\u0211\u020f\u0003\u0002\u0002\u0002\u0211', + '\u0212\u0003\u0002\u0002\u0002\u0212\u0214\u0003\u0002\u0002\u0002\u0213', + '\u0211\u0003\u0002\u0002\u0002\u0214\u0216\u0007$\u0002\u0002\u0215', + '\u0205\u0003\u0002\u0002\u0002\u0215\u020d\u0003\u0002\u0002\u0002\u0216', + '\b\u0003\u0002\u0002\u0002\u0217\u0219\u00042;\u0002\u0218\u0217\u0003', + '\u0002\u0002\u0002\u0219\n\u0003\u0002\u0002\u0002\u021a\u021b\t\u0006', + '\u0002\u0002\u021b\f\u0003\u0002\u0002\u0002\u021c\u0225\u00072\u0002', + '\u0002\u021d\u0221\u0005\t\u0005\u0002\u021e\u0220\u0005\u000b\u0006', + '\u0002\u021f\u021e\u0003\u0002\u0002\u0002\u0220\u0223\u0003\u0002\u0002', + '\u0002\u0221\u021f\u0003\u0002\u0002\u0002\u0221\u0222\u0003\u0002\u0002', + '\u0002\u0222\u0225\u0003\u0002\u0002\u0002\u0223\u0221\u0003\u0002\u0002', + '\u0002\u0224\u021c\u0003\u0002\u0002\u0002\u0224\u021d\u0003\u0002\u0002', + '\u0002\u0225\u000e\u0003\u0002\u0002\u0002\u0226\u0228\t\u0007\u0002', + '\u0002\u0227\u0229\t\b\u0002\u0002\u0228\u0227\u0003\u0002\u0002\u0002', + '\u0228\u0229\u0003\u0002\u0002\u0002\u0229\u022b\u0003\u0002\u0002\u0002', + '\u022a\u022c\u0005\u000b\u0006\u0002\u022b\u022a\u0003\u0002\u0002\u0002', + '\u022c\u022d\u0003\u0002\u0002\u0002\u022d\u022b\u0003\u0002\u0002\u0002', + '\u022d\u022e\u0003\u0002\u0002\u0002\u022e\u0010\u0003\u0002\u0002\u0002', + '\u022f\u0230\u0005\r\u0007\u0002\u0230\u0012\u0003\u0002\u0002\u0002', + '\u0231\u0232\u0005\r\u0007\u0002\u0232\u0234\u00070\u0002\u0002\u0233', + '\u0235\u0005\u000b\u0006\u0002\u0234\u0233\u0003\u0002\u0002\u0002\u0235', + '\u0236\u0003\u0002\u0002\u0002\u0236\u0234\u0003\u0002\u0002\u0002\u0236', + '\u0237\u0003\u0002\u0002\u0002\u0237\u0239\u0003\u0002\u0002\u0002\u0238', + '\u023a\u0005\u000f\b\u0002\u0239\u0238\u0003\u0002\u0002\u0002\u0239', + '\u023a\u0003\u0002\u0002\u0002\u023a\u023f\u0003\u0002\u0002\u0002\u023b', + '\u023c\u0005\r\u0007\u0002\u023c\u023d\u0005\u000f\b\u0002\u023d\u023f', + '\u0003\u0002\u0002\u0002\u023e\u0231\u0003\u0002\u0002\u0002\u023e\u023b', + '\u0003\u0002\u0002\u0002\u023f\u0014\u0003\u0002\u0002\u0002\u0240\u0241', + '\u00071\u0002\u0002\u0241\u0242\u0007,\u0002\u0002\u0242\u0246\u0003', + '\u0002\u0002\u0002\u0243\u0245\u000b\u0002\u0002\u0002\u0244\u0243\u0003', + '\u0002\u0002\u0002\u0245\u0248\u0003\u0002\u0002\u0002\u0246\u0247\u0003', + '\u0002\u0002\u0002\u0246\u0244\u0003\u0002\u0002\u0002\u0247\u0249\u0003', + '\u0002\u0002\u0002\u0248\u0246\u0003\u0002\u0002\u0002\u0249\u024a\u0007', + ',\u0002\u0002\u024a\u024b\u00071\u0002\u0002\u024b\u0016\u0003\u0002', + '\u0002\u0002\u024c\u024d\u0007/\u0002\u0002\u024d\u024e\u0007/\u0002', + '\u0002\u024e\u0252\u0003\u0002\u0002\u0002\u024f\u0251\n\t\u0002\u0002', + '\u0250\u024f\u0003\u0002\u0002\u0002\u0251\u0254\u0003\u0002\u0002\u0002', + '\u0252\u0250\u0003\u0002\u0002\u0002\u0252\u0253\u0003\u0002\u0002\u0002', + '\u0253\u0018\u0003\u0002\u0002\u0002\u0254\u0252\u0003\u0002\u0002\u0002', + '\u0255\u0257\t\n\u0002\u0002\u0256\u0255\u0003\u0002\u0002\u0002\u0257', + '\u0258\u0003\u0002\u0002\u0002\u0258\u0256\u0003\u0002\u0002\u0002\u0258', + '\u0259\u0003\u0002\u0002\u0002\u0259\u025a\u0003\u0002\u0002\u0002\u025a', + '\u025b\b\r\u0002\u0002\u025b\u001a\u0003\u0002\u0002\u0002\u025c\u025d', + '\u00070\u0002\u0002\u025d\u001c\u0003\u0002\u0002\u0002\u025e\u025f', + '\u0007-\u0002\u0002\u025f\u001e\u0003\u0002\u0002\u0002\u0260\u0267', + '\u0007/\u0002\u0002\u0261\u0262\t\u000b\u0002\u0002\u0262\u0263\t\f', + '\u0002\u0002\u0263\u0264\t\r\u0002\u0002\u0264\u0265\t\u000e\u0002\u0002', + '\u0265\u0267\t\u000f\u0002\u0002\u0266\u0260\u0003\u0002\u0002\u0002', + '\u0266\u0261\u0003\u0002\u0002\u0002\u0267 \u0003\u0002\u0002\u0002', + '\u0268\u0269\u0007,\u0002\u0002\u0269"\u0003\u0002\u0002\u0002\u026a', + '\u026b\u00071\u0002\u0002\u026b$\u0003\u0002\u0002\u0002\u026c\u026d', + "\u0007'\u0002\u0002\u026d&\u0003\u0002\u0002\u0002\u026e\u026f\u0007", + '?\u0002\u0002\u026f\u0270\u0007?\u0002\u0002\u0270(\u0003\u0002\u0002', + '\u0002\u0271\u0272\u0007?\u0002\u0002\u0272*\u0003\u0002\u0002\u0002', + '\u0273\u0274\u0007#\u0002\u0002\u0274\u0278\u0007?\u0002\u0002\u0275', + '\u0276\u0007>\u0002\u0002\u0276\u0278\u0007@\u0002\u0002\u0277\u0273', + '\u0003\u0002\u0002\u0002\u0277\u0275\u0003\u0002\u0002\u0002\u0278,', + '\u0003\u0002\u0002\u0002\u0279\u027a\u0007>\u0002\u0002\u027a.\u0003', + '\u0002\u0002\u0002\u027b\u027c\u0007>\u0002\u0002\u027c\u027d\u0007', + '?\u0002\u0002\u027d0\u0003\u0002\u0002\u0002\u027e\u027f\u0007@\u0002', + '\u0002\u027f2\u0003\u0002\u0002\u0002\u0280\u0281\u0007@\u0002\u0002', + '\u0281\u0282\u0007?\u0002\u0002\u02824\u0003\u0002\u0002\u0002\u0283', + '\u0284\u0007~\u0002\u0002\u0284\u0285\u0007~\u0002\u0002\u02856\u0003', + '\u0002\u0002\u0002\u0286\u0287\u0007*\u0002\u0002\u02878\u0003\u0002', + '\u0002\u0002\u0288\u0289\u0007+\u0002\u0002\u0289:\u0003\u0002\u0002', + '\u0002\u028a\u028b\u0007}\u0002\u0002\u028b<\u0003\u0002\u0002\u0002', + '\u028c\u028d\u0007\u007f\u0002\u0002\u028d>\u0003\u0002\u0002\u0002', + '\u028e\u028f\u0007.\u0002\u0002\u028f@\u0003\u0002\u0002\u0002\u0290', + '\u0291\u0007<\u0002\u0002\u0291B\u0003\u0002\u0002\u0002\u0292\u0293', + '\u0007]\u0002\u0002\u0293D\u0003\u0002\u0002\u0002\u0294\u0295\u0007', + '_\u0002\u0002\u0295F\u0003\u0002\u0002\u0002\u0296\u0297\u0007_\u0002', + '\u0002\u0297\u0298\u0007k\u0002\u0002\u0298H\u0003\u0002\u0002\u0002', + '\u0299\u029a\u0007=\u0002\u0002\u029aJ\u0003\u0002\u0002\u0002\u029b', + '\u029c\u0007#\u0002\u0002\u029cL\u0003\u0002\u0002\u0002\u029d\u029e', + '\t\u0010\u0002\u0002\u029e\u029f\t\u0011\u0002\u0002\u029f\u02a0\t\u0012', + '\u0002\u0002\u02a0\u02a1\t\f\u0002\u0002\u02a1\u02a2\t\u000f\u0002\u0002', + '\u02a2\u02a3\t\u0007\u0002\u0002\u02a3N\u0003\u0002\u0002\u0002\u02a4', + '\u02a5\t\u0010\u0002\u0002\u02a5\u02a6\t\u0013\u0002\u0002\u02a6\u02a7', + '\t\u0013\u0002\u0002\u02a7P\u0003\u0002\u0002\u0002\u02a8\u02a9\t\u0010', + '\u0002\u0002\u02a9\u02aa\t\u0013\u0002\u0002\u02aa\u02ab\t\u0014\u0002', + '\u0002\u02ab\u02ac\t\u0007\u0002\u0002\u02ac\u02ad\t\u0015\u0002\u0002', + '\u02adR\u0003\u0002\u0002\u0002\u02ae\u02af\t\u0010\u0002\u0002\u02af', + '\u02b0\t\r\u0002\u0002\u02b0\u02b1\t\u0010\u0002\u0002\u02b1\u02b2\t', + '\u0013\u0002\u0002\u02b2\u02b3\t\u0016\u0002\u0002\u02b3\u02b4\t\u0017', + '\u0002\u0002\u02b4\u02b5\t\u0007\u0002\u0002\u02b5T\u0003\u0002\u0002', + '\u0002\u02b6\u02b7\t\u0010\u0002\u0002\u02b7\u02b8\t\r\u0002\u0002\u02b8', + '\u02b9\t\u0011\u0002\u0002\u02b9V\u0003\u0002\u0002\u0002\u02ba\u02bb', + '\t\u0010\u0002\u0002\u02bb\u02bc\t\r\u0002\u0002\u02bc\u02bd\t\u0016', + '\u0002\u0002\u02bdX\u0003\u0002\u0002\u0002\u02be\u02bf\t\u0010\u0002', + '\u0002\u02bf\u02c0\t\u0015\u0002\u0002\u02c0\u02c1\t\u0015\u0002\u0002', + '\u02c1\u02c2\t\u0010\u0002\u0002\u02c2\u02c3\t\u0016\u0002\u0002\u02c3', + 'Z\u0003\u0002\u0002\u0002\u02c4\u02c5\t\u0010\u0002\u0002\u02c5\u02c6', + '\t\u000f\u0002\u0002\u02c6\\\u0003\u0002\u0002\u0002\u02c7\u02c8\t\u0010', + '\u0002\u0002\u02c8\u02c9\t\u000f\u0002\u0002\u02c9\u02ca\t\u0018\u0002', + '\u0002\u02ca^\u0003\u0002\u0002\u0002\u02cb\u02cc\t\u0010\u0002\u0002', + '\u02cc\u02cd\t\u0014\u0002\u0002\u02cd`\u0003\u0002\u0002\u0002\u02ce', + '\u02cf\t\u0019\u0002\u0002\u02cf\u02d0\t\u0007\u0002\u0002\u02d0\u02d1', + '\t\u001a\u0002\u0002\u02d1\u02d2\t\f\u0002\u0002\u02d2\u02d3\t\r\u0002', + '\u0002\u02d3b\u0003\u0002\u0002\u0002\u02d4\u02d5\t\u0019\u0002\u0002', + '\u02d5\u02d6\t\u0007\u0002\u0002\u02d6\u02d7\t\u0014\u0002\u0002\u02d7', + '\u02d8\t\u001b\u0002\u0002\u02d8\u02d9\t\u0007\u0002\u0002\u02d9\u02da', + '\t\u0007\u0002\u0002\u02da\u02db\t\r\u0002\u0002\u02dbd\u0003\u0002', + '\u0002\u0002\u02dc\u02dd\t\u0019\u0002\u0002\u02dd\u02de\t\f\u0002\u0002', + '\u02de\u02df\t\r\u0002\u0002\u02df\u02e0\t\u0010\u0002\u0002\u02e0\u02e1', + '\t\u0015\u0002\u0002\u02e1\u02e2\t\u0016\u0002\u0002\u02e2f\u0003\u0002', + '\u0002\u0002\u02e3\u02e4\t\u0019\u0002\u0002\u02e4\u02e5\t\u001c\u0002', + '\u0002\u02e5\u02e6\t\u001c\u0002\u0002\u02e6\u02e7\t\u0013\u0002\u0002', + '\u02e7\u02e8\t\u0007\u0002\u0002\u02e8\u02e9\t\u0010\u0002\u0002\u02e9', + '\u02ea\t\r\u0002\u0002\u02eah\u0003\u0002\u0002\u0002\u02eb\u02ec\t', + '\u0019\u0002\u0002\u02ec\u02ed\t\u0015\u0002\u0002\u02ed\u02ee\t\u0007', + '\u0002\u0002\u02ee\u02ef\t\u0010\u0002\u0002\u02ef\u02f0\t\u001d\u0002', + '\u0002\u02f0j\u0003\u0002\u0002\u0002\u02f1\u02f2\t\u0019\u0002\u0002', + '\u02f2\u02f3\t\u000e\u0002\u0002\u02f3\u02f4\t\u0018\u0002\u0002\u02f4', + '\u02f5\t\u001d\u0002\u0002\u02f5\u02f6\t\u0007\u0002\u0002\u02f6\u02f7', + '\t\u0014\u0002\u0002\u02f7l\u0003\u0002\u0002\u0002\u02f8\u02f9\t\u0019', + '\u0002\u0002\u02f9\u02fa\t\u000e\u0002\u0002\u02fa\u02fb\t\f\u0002\u0002', + '\u02fb\u02fc\t\u0013\u0002\u0002\u02fc\u02fd\t\u0011\u0002\u0002\u02fd', + 'n\u0003\u0002\u0002\u0002\u02fe\u02ff\t\u0019\u0002\u0002\u02ff\u0300', + '\t\u0016\u0002\u0002\u0300p\u0003\u0002\u0002\u0002\u0301\u0302\t\u0018', + '\u0002\u0002\u0302\u0303\t\u0010\u0002\u0002\u0303\u0304\t\u0013\u0002', + '\u0002\u0304\u0305\t\u0013\u0002\u0002\u0305r\u0003\u0002\u0002\u0002', + '\u0306\u0307\t\u0018\u0002\u0002\u0307\u0308\t\u0010\u0002\u0002\u0308', + '\u0309\t\u000f\u0002\u0002\u0309\u030a\t\u0007\u0002\u0002\u030at\u0003', + '\u0002\u0002\u0002\u030b\u030c\t\u0018\u0002\u0002\u030c\u030d\t\u0010', + '\u0002\u0002\u030d\u030e\t\u000f\u0002\u0002\u030e\u030f\t\u0014\u0002', + '\u0002\u030fv\u0003\u0002\u0002\u0002\u0310\u0311\t\u0018\u0002\u0002', + '\u0311\u0312\t\u0013\u0002\u0002\u0312\u0313\t\u000e\u0002\u0002\u0313', + '\u0314\t\u000f\u0002\u0002\u0314\u0315\t\u0014\u0002\u0002\u0315\u0316', + '\t\u0007\u0002\u0002\u0316\u0317\t\u0015\u0002\u0002\u0317x\u0003\u0002', + '\u0002\u0002\u0318\u0319\t\u0018\u0002\u0002\u0319\u031a\t\u001c\u0002', + '\u0002\u031a\u031b\t\u0013\u0002\u0002\u031b\u031c\t\u0013\u0002\u0002', + '\u031c\u031d\t\u0010\u0002\u0002\u031d\u031e\t\u0014\u0002\u0002\u031e', + '\u031f\t\u0007\u0002\u0002\u031fz\u0003\u0002\u0002\u0002\u0320\u0321', + '\t\u0018\u0002\u0002\u0321\u0322\t\u001c\u0002\u0002\u0322\u0323\t\u0013', + '\u0002\u0002\u0323\u0324\t\u0013\u0002\u0002\u0324\u0325\t\u0007\u0002', + '\u0002\u0325\u0326\t\u0018\u0002\u0002\u0326\u0327\t\u0014\u0002\u0002', + '\u0327\u0328\t\f\u0002\u0002\u0328\u0329\t\u001c\u0002\u0002\u0329\u032a', + '\t\r\u0002\u0002\u032a|\u0003\u0002\u0002\u0002\u032b\u032c\t\u0018', + '\u0002\u0002\u032c\u032d\t\u001c\u0002\u0002\u032d\u032e\t\u000b\u0002', + '\u0002\u032e\u032f\t\u000b\u0002\u0002\u032f\u0330\t\f\u0002\u0002\u0330', + '\u0331\t\u0014\u0002\u0002\u0331~\u0003\u0002\u0002\u0002\u0332\u0333', + '\t\u0018\u0002\u0002\u0333\u0334\t\u001c\u0002\u0002\u0334\u0335\t\u000b', + '\u0002\u0002\u0335\u0336\t\u000b\u0002\u0002\u0336\u0337\t\f\u0002\u0002', + '\u0337\u0338\t\u0014\u0002\u0002\u0338\u0339\t\u0014\u0002\u0002\u0339', + '\u033a\t\u0007\u0002\u0002\u033a\u033b\t\u0011\u0002\u0002\u033b\u0080', + '\u0003\u0002\u0002\u0002\u033c\u033d\t\u0018\u0002\u0002\u033d\u033e', + '\t\u001c\u0002\u0002\u033e\u033f\t\r\u0002\u0002\u033f\u0340\t\r\u0002', + '\u0002\u0340\u0341\t\u0007\u0002\u0002\u0341\u0342\t\u0018\u0002\u0002', + '\u0342\u0343\t\u0014\u0002\u0002\u0343\u0082\u0003\u0002\u0002\u0002', + '\u0344\u0345\t\u0018\u0002\u0002\u0345\u0346\t\u001c\u0002\u0002\u0346', + '\u0347\t\r\u0002\u0002\u0347\u0348\t\u0014\u0002\u0002\u0348\u0349\t', + '\f\u0002\u0002\u0349\u034a\t\r\u0002\u0002\u034a\u034b\t\u000e\u0002', + '\u0002\u034b\u034c\t\u0007\u0002\u0002\u034c\u0084\u0003\u0002\u0002', + '\u0002\u034d\u034e\t\u0018\u0002\u0002\u034e\u034f\t\u001c\u0002\u0002', + '\u034f\u0350\t\u0015\u0002\u0002\u0350\u0351\t\u0015\u0002\u0002\u0351', + '\u0352\t\u0007\u0002\u0002\u0352\u0353\t\u0013\u0002\u0002\u0353\u0354', + '\t\u0010\u0002\u0002\u0354\u0355\t\u0014\u0002\u0002\u0355\u0356\t\u0007', + '\u0002\u0002\u0356\u0357\t\u0011\u0002\u0002\u0357\u0086\u0003\u0002', + '\u0002\u0002\u0358\u0359\t\u0018\u0002\u0002\u0359\u035a\t\u001c\u0002', + '\u0002\u035a\u035b\t\u0012\u0002\u0002\u035b\u035c\t\u0007\u0002\u0002', + '\u035c\u035d\t\u0015\u0002\u0002\u035d\u0088\u0003\u0002\u0002\u0002', + '\u035e\u035f\t\u0018\u0002\u0002\u035f\u0360\t\u0015\u0002\u0002\u0360', + '\u0361\t\u0007\u0002\u0002\u0361\u0362\t\u0010\u0002\u0002\u0362\u0363', + '\t\u0014\u0002\u0002\u0363\u0364\t\u0007\u0002\u0002\u0364\u008a\u0003', + '\u0002\u0002\u0002\u0365\u0366\t\u0018\u0002\u0002\u0366\u0367\t\u000e', + '\u0002\u0002\u0367\u0368\t\u0015\u0002\u0002\u0368\u0369\t\u0015\u0002', + '\u0002\u0369\u036a\t\u0007\u0002\u0002\u036a\u036b\t\r\u0002\u0002\u036b', + '\u036c\t\u0014\u0002\u0002\u036c\u008c\u0003\u0002\u0002\u0002\u036d', + '\u036e\t\u0011\u0002\u0002\u036e\u036f\t\u0010\u0002\u0002\u036f\u0370', + '\t\u0014\u0002\u0002\u0370\u0371\t\u0010\u0002\u0002\u0371\u0372\t\u0019', + '\u0002\u0002\u0372\u0373\t\u0010\u0002\u0002\u0373\u0374\t\u000f\u0002', + '\u0002\u0374\u0375\t\u0007\u0002\u0002\u0375\u008e\u0003\u0002\u0002', + '\u0002\u0376\u0377\t\u0011\u0002\u0002\u0377\u0378\t\u0010\u0002\u0002', + '\u0378\u0379\t\u0014\u0002\u0002\u0379\u037a\t\u0010\u0002\u0002\u037a', + '\u037b\t\u000f\u0002\u0002\u037b\u037c\t\u0007\u0002\u0002\u037c\u037d', + '\t\u0014\u0002\u0002\u037d\u0090\u0003\u0002\u0002\u0002\u037e\u037f', + '\t\u0011\u0002\u0002\u037f\u0380\t\u0010\u0002\u0002\u0380\u0381\t\u0014', + '\u0002\u0002\u0381\u0382\t\u0010\u0002\u0002\u0382\u0383\t\u000f\u0002', + '\u0002\u0383\u0384\t\u0014\u0002\u0002\u0384\u0385\t\u001c\u0002\u0002', + '\u0385\u0386\t\u0015\u0002\u0002\u0386\u0387\t\u0007\u0002\u0002\u0387', + '\u0092\u0003\u0002\u0002\u0002\u0388\u0389\t\u0011\u0002\u0002\u0389', + '\u038a\t\u0007\u0002\u0002\u038a\u038b\t\u0018\u0002\u0002\u038b\u038c', + '\t\u0013\u0002\u0002\u038c\u038d\t\u0010\u0002\u0002\u038d\u038e\t\u0015', + '\u0002\u0002\u038e\u038f\t\u0007\u0002\u0002\u038f\u0094\u0003\u0002', + '\u0002\u0002\u0390\u0391\t\u0011\u0002\u0002\u0391\u0392\t\u0007\u0002', + '\u0002\u0392\u0393\t\u0018\u0002\u0002\u0393\u0394\t\u0015\u0002\u0002', + '\u0394\u0395\t\u0007\u0002\u0002\u0395\u0396\t\u000b\u0002\u0002\u0396', + '\u0397\t\u0007\u0002\u0002\u0397\u0398\t\r\u0002\u0002\u0398\u0399\t', + '\u0014\u0002\u0002\u0399\u0096\u0003\u0002\u0002\u0002\u039a\u039b\t', + '\u0011\u0002\u0002\u039b\u039c\t\u0007\u0002\u0002\u039c\u039d\t\u0013', + '\u0002\u0002\u039d\u039e\t\u0007\u0002\u0002\u039e\u039f\t\u0014\u0002', + '\u0002\u039f\u03a0\t\u0007\u0002\u0002\u03a0\u0098\u0003\u0002\u0002', + '\u0002\u03a1\u03a2\t\u0011\u0002\u0002\u03a2\u03a3\t\u0007\u0002\u0002', + '\u03a3\u03a4\t\u0015\u0002\u0002\u03a4\u03a5\t\f\u0002\u0002\u03a5\u03a6', + '\t\u0012\u0002\u0002\u03a6\u03a7\t\u0007\u0002\u0002\u03a7\u03a8\t\u0011', + '\u0002\u0002\u03a8\u009a\u0003\u0002\u0002\u0002\u03a9\u03aa\t\u0011', + '\u0002\u0002\u03aa\u03ab\t\u0007\u0002\u0002\u03ab\u03ac\t\u000f\u0002', + '\u0002\u03ac\u03ad\t\u0018\u0002\u0002\u03ad\u009c\u0003\u0002\u0002', + '\u0002\u03ae\u03af\t\u0011\u0002\u0002\u03af\u03b0\t\u0007\u0002\u0002', + '\u03b0\u03b1\t\u000f\u0002\u0002\u03b1\u03b2\t\u0018\u0002\u0002\u03b2', + '\u03b3\t\u0015\u0002\u0002\u03b3\u03b4\t\f\u0002\u0002\u03b4\u03b5\t', + '\u0019\u0002\u0002\u03b5\u03b6\t\u0007\u0002\u0002\u03b6\u009e\u0003', + '\u0002\u0002\u0002\u03b7\u03b8\t\u0011\u0002\u0002\u03b8\u03b9\t\f\u0002', + '\u0002\u03b9\u03ba\t\u000f\u0002\u0002\u03ba\u03bb\t\u0014\u0002\u0002', + '\u03bb\u03bc\t\f\u0002\u0002\u03bc\u03bd\t\r\u0002\u0002\u03bd\u03be', + '\t\u0018\u0002\u0002\u03be\u03bf\t\u0014\u0002\u0002\u03bf\u00a0\u0003', + '\u0002\u0002\u0002\u03c0\u03c1\t\u0011\u0002\u0002\u03c1\u03c2\t\u001c', + '\u0002\u0002\u03c2\u00a2\u0003\u0002\u0002\u0002\u03c3\u03c4\t\u0011', + '\u0002\u0002\u03c4\u03c5\t\u0015\u0002\u0002\u03c5\u03c6\t\u001c\u0002', + '\u0002\u03c6\u03c7\t\u001e\u0002\u0002\u03c7\u00a4\u0003\u0002\u0002', + '\u0002\u03c8\u03c9\t\u0007\u0002\u0002\u03c9\u03ca\t\u0010\u0002\u0002', + '\u03ca\u03cb\t\u0018\u0002\u0002\u03cb\u03cc\t\u001f\u0002\u0002\u03cc', + '\u00a6\u0003\u0002\u0002\u0002\u03cd\u03ce\t\u0007\u0002\u0002\u03ce', + '\u03cf\t\u0013\u0002\u0002\u03cf\u03d0\t\u0007\u0002\u0002\u03d0\u03d1', + '\t\u000b\u0002\u0002\u03d1\u03d2\t\u0007\u0002\u0002\u03d2\u03d3\t\r', + '\u0002\u0002\u03d3\u03d4\t\u0014\u0002\u0002\u03d4\u00a8\u0003\u0002', + '\u0002\u0002\u03d5\u03d6\t\u0007\u0002\u0002\u03d6\u03d7\t\u0013\u0002', + '\u0002\u03d7\u03d8\t\u000f\u0002\u0002\u03d8\u03d9\t\u0007\u0002\u0002', + '\u03d9\u00aa\u0003\u0002\u0002\u0002\u03da\u03db\t\u0007\u0002\u0002', + '\u03db\u03dc\t\r\u0002\u0002\u03dc\u03dd\t\u0011\u0002\u0002\u03dd\u00ac', + '\u0003\u0002\u0002\u0002\u03de\u03df\t\u0007\u0002\u0002\u03df\u03e0', + '\t\u0012\u0002\u0002\u03e0\u03e1\t\u0007\u0002\u0002\u03e1\u03e2\t\u0015', + '\u0002\u0002\u03e2\u03e3\t\u0016\u0002\u0002\u03e3\u00ae\u0003\u0002', + '\u0002\u0002\u03e4\u03e5\t\u0007\u0002\u0002\u03e5\u03e6\t \u0002\u0002', + '\u03e6\u03e7\t\u0018\u0002\u0002\u03e7\u03e8\t\u0007\u0002\u0002\u03e8', + '\u03e9\t\u001e\u0002\u0002\u03e9\u03ea\t\u0014\u0002\u0002\u03ea\u00b0', + '\u0003\u0002\u0002\u0002\u03eb\u03ec\t\u0007\u0002\u0002\u03ec\u03ed', + '\t \u0002\u0002\u03ed\u03ee\t\u0018\u0002\u0002\u03ee\u03ef\t\u0013', + '\u0002\u0002\u03ef\u03f0\t\u000e\u0002\u0002\u03f0\u03f1\t\u0011\u0002', + '\u0002\u03f1\u03f2\t\u0007\u0002\u0002\u03f2\u00b2\u0003\u0002\u0002', + '\u0002\u03f3\u03f4\t\u0007\u0002\u0002\u03f4\u03f5\t \u0002\u0002\u03f5', + '\u03f6\t\u0007\u0002\u0002\u03f6\u03f7\t\u0018\u0002\u0002\u03f7\u03f8', + '\t\u000e\u0002\u0002\u03f8\u03f9\t\u0014\u0002\u0002\u03f9\u03fa\t\u0007', + '\u0002\u0002\u03fa\u00b4\u0003\u0002\u0002\u0002\u03fb\u03fc\t\u0007', + '\u0002\u0002\u03fc\u03fd\t \u0002\u0002\u03fd\u03fe\t\f\u0002\u0002', + '\u03fe\u03ff\t\u000f\u0002\u0002\u03ff\u0400\t\u0014\u0002\u0002\u0400', + '\u0401\t\u000f\u0002\u0002\u0401\u00b6\u0003\u0002\u0002\u0002\u0402', + '\u0403\t\u0007\u0002\u0002\u0403\u0404\t \u0002\u0002\u0404\u0405\t', + '\u001e\u0002\u0002\u0405\u0406\t\u0013\u0002\u0002\u0406\u0407\t\u0010', + '\u0002\u0002\u0407\u0408\t\f\u0002\u0002\u0408\u0409\t\r\u0002\u0002', + '\u0409\u00b8\u0003\u0002\u0002\u0002\u040a\u040b\t!\u0002\u0002\u040b', + '\u040c\t\u0010\u0002\u0002\u040c\u040d\t\u0013\u0002\u0002\u040d\u040e', + '\t\u000f\u0002\u0002\u040e\u040f\t\u0007\u0002\u0002\u040f\u00ba\u0003', + '\u0002\u0002\u0002\u0410\u0411\t!\u0002\u0002\u0411\u0412\t\u0007\u0002', + '\u0002\u0412\u0413\t\u0014\u0002\u0002\u0413\u0414\t\u0018\u0002\u0002', + '\u0414\u0415\t\u001f\u0002\u0002\u0415\u00bc\u0003\u0002\u0002\u0002', + '\u0416\u0417\t!\u0002\u0002\u0417\u0418\t\f\u0002\u0002\u0418\u0419', + '\t\u0013\u0002\u0002\u0419\u041a\t\u0014\u0002\u0002\u041a\u041b\t\u0007', + '\u0002\u0002\u041b\u041c\t\u0015\u0002\u0002\u041c\u00be\u0003\u0002', + '\u0002\u0002\u041d\u041e\t!\u0002\u0002\u041e\u041f\t\f\u0002\u0002', + '\u041f\u0420\t\u0015\u0002\u0002\u0420\u0421\t\u000f\u0002\u0002\u0421', + '\u0422\t\u0014\u0002\u0002\u0422\u00c0\u0003\u0002\u0002\u0002\u0423', + '\u0424\t!\u0002\u0002\u0424\u0425\t\u0013\u0002\u0002\u0425\u0426\t', + '\u0010\u0002\u0002\u0426\u0427\t\u0014\u0002\u0002\u0427\u0428\t\u0014', + '\u0002\u0002\u0428\u0429\t\u0007\u0002\u0002\u0429\u042a\t\r\u0002\u0002', + '\u042a\u00c2\u0003\u0002\u0002\u0002\u042b\u042c\t!\u0002\u0002\u042c', + '\u042d\t\u0013\u0002\u0002\u042d\u042e\t\u000e\u0002\u0002\u042e\u042f', + '\t\u000f\u0002\u0002\u042f\u0430\t\u001f\u0002\u0002\u0430\u00c4\u0003', + '\u0002\u0002\u0002\u0431\u0432\t!\u0002\u0002\u0432\u0433\t\u001c\u0002', + '\u0002\u0433\u0434\t\u0013\u0002\u0002\u0434\u0435\t\u0013\u0002\u0002', + '\u0435\u0436\t\u001c\u0002\u0002\u0436\u0437\t\u001b\u0002\u0002\u0437', + '\u0438\t\f\u0002\u0002\u0438\u0439\t\r\u0002\u0002\u0439\u043a\t\u001a', + '\u0002\u0002\u043a\u00c6\u0003\u0002\u0002\u0002\u043b\u043c\t!\u0002', + '\u0002\u043c\u043d\t\u001c\u0002\u0002\u043d\u043e\t\u0015\u0002\u0002', + '\u043e\u00c8\u0003\u0002\u0002\u0002\u043f\u0440\t!\u0002\u0002\u0440', + '\u0441\t\u001c\u0002\u0002\u0441\u0442\t\u0015\u0002\u0002\u0442\u0443', + '\t\u0018\u0002\u0002\u0443\u0444\t\u0007\u0002\u0002\u0444\u00ca\u0003', + '\u0002\u0002\u0002\u0445\u0446\t!\u0002\u0002\u0446\u0447\t\u0015\u0002', + '\u0002\u0447\u0448\t\u001c\u0002\u0002\u0448\u0449\t\u000b\u0002\u0002', + '\u0449\u00cc\u0003\u0002\u0002\u0002\u044a\u044b\t!\u0002\u0002\u044b', + '\u044c\t\u0014\u0002\u0002\u044c\u044d\t\u000f\u0002\u0002\u044d\u00ce', + '\u0003\u0002\u0002\u0002\u044e\u044f\t!\u0002\u0002\u044f\u0450\t\u000e', + '\u0002\u0002\u0450\u0451\t\r\u0002\u0002\u0451\u0452\t\u0018\u0002\u0002', + '\u0452\u0453\t\u0014\u0002\u0002\u0453\u0454\t\f\u0002\u0002\u0454\u0455', + '\t\u001c\u0002\u0002\u0455\u0456\t\r\u0002\u0002\u0456\u00d0\u0003\u0002', + '\u0002\u0002\u0457\u0458\t\u001a\u0002\u0002\u0458\u0459\t\u001c\u0002', + '\u0002\u0459\u045a\t\u0013\u0002\u0002\u045a\u045b\t\u0010\u0002\u0002', + '\u045b\u045c\t\r\u0002\u0002\u045c\u045d\t\u001a\u0002\u0002\u045d\u00d2', + '\u0003\u0002\u0002\u0002\u045e\u045f\t\u001a\u0002\u0002\u045f\u0460', + '\t\u0015\u0002\u0002\u0460\u0461\t\u0010\u0002\u0002\u0461\u0462\t\r', + '\u0002\u0002\u0462\u0463\t\u0014\u0002\u0002\u0463\u00d4\u0003\u0002', + '\u0002\u0002\u0464\u0465\t\u001a\u0002\u0002\u0465\u0466\t\u0015\u0002', + '\u0002\u0466\u0467\t\u001c\u0002\u0002\u0467\u0468\t\u000e\u0002\u0002', + '\u0468\u0469\t\u001e\u0002\u0002\u0469\u00d6\u0003\u0002\u0002\u0002', + '\u046a\u046b\t\u001a\u0002\u0002\u046b\u046c\t\u0015\u0002\u0002\u046c', + '\u046d\t\u001c\u0002\u0002\u046d\u046e\t\u000e\u0002\u0002\u046e\u046f', + '\t\u001e\u0002\u0002\u046f\u0470\t\u000f\u0002\u0002\u0470\u00d8\u0003', + '\u0002\u0002\u0002\u0471\u0472\t\u001a\u0002\u0002\u0472\u0473\t\u000f', + '\u0002\u0002\u0473\u0474\t\f\u0002\u0002\u0474\u00da\u0003\u0002\u0002', + '\u0002\u0475\u0476\t\u001f\u0002\u0002\u0476\u0477\t\u0010\u0002\u0002', + '\u0477\u0478\t\u000f\u0002\u0002\u0478\u0479\t\u001f\u0002\u0002\u0479', + '\u00dc\u0003\u0002\u0002\u0002\u047a\u047b\t\u001f\u0002\u0002\u047b', + '\u047c\t\u0010\u0002\u0002\u047c\u047d\t\u0012\u0002\u0002\u047d\u047e', + '\t\f\u0002\u0002\u047e\u047f\t\r\u0002\u0002\u047f\u0480\t\u001a\u0002', + '\u0002\u0480\u00de\u0003\u0002\u0002\u0002\u0481\u0482\t\f\u0002\u0002', + '\u0482\u0483\t!\u0002\u0002\u0483\u00e0\u0003\u0002\u0002\u0002\u0484', + '\u0485\t\f\u0002\u0002\u0485\u0486\t\u001a\u0002\u0002\u0486\u0487\t', + '\r\u0002\u0002\u0487\u0488\t\u001c\u0002\u0002\u0488\u0489\t\u0015\u0002', + '\u0002\u0489\u048a\t\u0007\u0002\u0002\u048a\u00e2\u0003\u0002\u0002', + '\u0002\u048b\u048c\t\f\u0002\u0002\u048c\u048d\t\u0013\u0002\u0002\u048d', + '\u048e\t\f\u0002\u0002\u048e\u048f\t\u001d\u0002\u0002\u048f\u0490\t', + '\u0007\u0002\u0002\u0490\u00e4\u0003\u0002\u0002\u0002\u0491\u0492\t', + '\f\u0002\u0002\u0492\u0493\t\r\u0002\u0002\u0493\u00e6\u0003\u0002\u0002', + '\u0002\u0494\u0495\t\f\u0002\u0002\u0495\u0496\t\r\u0002\u0002\u0496', + '\u0497\t\u0018\u0002\u0002\u0497\u0498\t\u0013\u0002\u0002\u0498\u0499', + '\t\u000e\u0002\u0002\u0499\u049a\t\u0011\u0002\u0002\u049a\u049b\t\u0007', + '\u0002\u0002\u049b\u00e8\u0003\u0002\u0002\u0002\u049c\u049d\t\f\u0002', + '\u0002\u049d\u049e\t\r\u0002\u0002\u049e\u049f\t\u0018\u0002\u0002\u049f', + '\u04a0\t\u0015\u0002\u0002\u04a0\u04a1\t\u0007\u0002\u0002\u04a1\u04a2', + '\t\u000b\u0002\u0002\u04a2\u04a3\t\u0007\u0002\u0002\u04a3\u04a4\t\r', + '\u0002\u0002\u04a4\u04a5\t\u0014\u0002\u0002\u04a5\u00ea\u0003\u0002', + '\u0002\u0002\u04a6\u04a7\t\f\u0002\u0002\u04a7\u04a8\t\r\u0002\u0002', + '\u04a8\u04a9\t\u0011\u0002\u0002\u04a9\u04aa\t\u0007\u0002\u0002\u04aa', + '\u04ab\t \u0002\u0002\u04ab\u00ec\u0003\u0002\u0002\u0002\u04ac\u04ad', + '\t\f\u0002\u0002\u04ad\u04ae\t\r\u0002\u0002\u04ae\u04af\t!\u0002\u0002', + '\u04af\u04b0\t\u0007\u0002\u0002\u04b0\u04b1\t\u0015\u0002\u0002\u04b1', + '\u00ee\u0003\u0002\u0002\u0002\u04b2\u04b3\t\f\u0002\u0002\u04b3\u04b4', + '\t\r\u0002\u0002\u04b4\u04b5\t\u0013\u0002\u0002\u04b5\u04b6\t\f\u0002', + '\u0002\u04b6\u04b7\t\r\u0002\u0002\u04b7\u04b8\t\u0007\u0002\u0002\u04b8', + '\u00f0\u0003\u0002\u0002\u0002\u04b9\u04ba\t\f\u0002\u0002\u04ba\u04bb', + '\t\r\u0002\u0002\u04bb\u04bc\t\r\u0002\u0002\u04bc\u04bd\t\u0007\u0002', + '\u0002\u04bd\u04be\t\u0015\u0002\u0002\u04be\u00f2\u0003\u0002\u0002', + '\u0002\u04bf\u04c0\t\f\u0002\u0002\u04c0\u04c1\t\r\u0002\u0002\u04c1', + '\u04c2\t\u000f\u0002\u0002\u04c2\u04c3\t\u0007\u0002\u0002\u04c3\u04c4', + '\t\u0015\u0002\u0002\u04c4\u04c5\t\u0014\u0002\u0002\u04c5\u00f4\u0003', + '\u0002\u0002\u0002\u04c6\u04c7\t\f\u0002\u0002\u04c7\u04c8\t\r\u0002', + '\u0002\u04c8\u04c9\t\u0014\u0002\u0002\u04c9\u04ca\t\u0007\u0002\u0002', + '\u04ca\u04cb\t\u0015\u0002\u0002\u04cb\u04cc\t\u000f\u0002\u0002\u04cc', + '\u04cd\t\u0007\u0002\u0002\u04cd\u04ce\t\u0018\u0002\u0002\u04ce\u04cf', + '\t\u0014\u0002\u0002\u04cf\u00f6\u0003\u0002\u0002\u0002\u04d0\u04d1', + '\t\f\u0002\u0002\u04d1\u04d2\t\r\u0002\u0002\u04d2\u04d3\t\u0014\u0002', + '\u0002\u04d3\u04d4\t\u001c\u0002\u0002\u04d4\u00f8\u0003\u0002\u0002', + '\u0002\u04d5\u04d6\t\f\u0002\u0002\u04d6\u04d7\t\u000f\u0002\u0002\u04d7', + '\u00fa\u0003\u0002\u0002\u0002\u04d8\u04d9\t\f\u0002\u0002\u04d9\u04da', + '\t\u000f\u0002\u0002\u04da\u04db\t\u001c\u0002\u0002\u04db\u04dc\t\u0013', + '\u0002\u0002\u04dc\u04dd\t\u0010\u0002\u0002\u04dd\u04de\t\u0014\u0002', + '\u0002\u04de\u04df\t\f\u0002\u0002\u04df\u04e0\t\u001c\u0002\u0002\u04e0', + '\u04e1\t\r\u0002\u0002\u04e1\u00fc\u0003\u0002\u0002\u0002\u04e2\u04e3', + '\t"\u0002\u0002\u04e3\u04e4\t\u0010\u0002\u0002\u04e4\u04e5\t\u0012', + '\u0002\u0002\u04e5\u04e6\t\u0010\u0002\u0002\u04e6\u04e7\t\u000f\u0002', + '\u0002\u04e7\u04e8\t\u0018\u0002\u0002\u04e8\u04e9\t\u0015\u0002\u0002', + '\u04e9\u04ea\t\f\u0002\u0002\u04ea\u04eb\t\u001e\u0002\u0002\u04eb\u04ec', + '\t\u0014\u0002\u0002\u04ec\u00fe\u0003\u0002\u0002\u0002\u04ed\u04ee', + '\t"\u0002\u0002\u04ee\u04ef\t\u001c\u0002\u0002\u04ef\u04f0\t\f\u0002', + '\u0002\u04f0\u04f1\t\r\u0002\u0002\u04f1\u0100\u0003\u0002\u0002\u0002', + '\u04f2\u04f3\t\u001d\u0002\u0002\u04f3\u04f4\t\u0007\u0002\u0002\u04f4', + '\u04f5\t\u0016\u0002\u0002\u04f5\u0102\u0003\u0002\u0002\u0002\u04f6', + '\u04f7\t\u001d\u0002\u0002\u04f7\u04f8\t\u0007\u0002\u0002\u04f8\u04f9', + '\t\u0016\u0002\u0002\u04f9\u04fa\t\u000f\u0002\u0002\u04fa\u0104\u0003', + '\u0002\u0002\u0002\u04fb\u04fc\t\u001d\u0002\u0002\u04fc\u04fd\t\u0007', + '\u0002\u0002\u04fd\u04fe\t\u0016\u0002\u0002\u04fe\u04ff\t\u000f\u0002', + '\u0002\u04ff\u0500\t\u001e\u0002\u0002\u0500\u0501\t\u0010\u0002\u0002', + '\u0501\u0502\t\u0018\u0002\u0002\u0502\u0503\t\u0007\u0002\u0002\u0503', + '\u0106\u0003\u0002\u0002\u0002\u0504\u0505\t\u001d\u0002\u0002\u0505', + '\u0506\t\r\u0002\u0002\u0506\u0507\t\u001c\u0002\u0002\u0507\u0508\t', + '\u001b\u0002\u0002\u0508\u0509\t\r\u0002\u0002\u0509\u0108\u0003\u0002', + '\u0002\u0002\u050a\u050b\t\u0013\u0002\u0002\u050b\u050c\t\u0010\u0002', + '\u0002\u050c\u050d\t\r\u0002\u0002\u050d\u050e\t\u001a\u0002\u0002\u050e', + '\u050f\t\u000e\u0002\u0002\u050f\u0510\t\u0010\u0002\u0002\u0510\u0511', + '\t\u001a\u0002\u0002\u0511\u0512\t\u0007\u0002\u0002\u0512\u010a\u0003', + '\u0002\u0002\u0002\u0513\u0514\t\u0013\u0002\u0002\u0514\u0515\t\u0010', + '\u0002\u0002\u0515\u0516\t\u000f\u0002\u0002\u0516\u0517\t\u0014\u0002', + '\u0002\u0517\u010c\u0003\u0002\u0002\u0002\u0518\u0519\t\u0013\u0002', + '\u0002\u0519\u051a\t\u0007\u0002\u0002\u051a\u051b\t!\u0002\u0002\u051b', + '\u051c\t\u0014\u0002\u0002\u051c\u010e\u0003\u0002\u0002\u0002\u051d', + '\u051e\t\u0013\u0002\u0002\u051e\u051f\t\u0007\u0002\u0002\u051f\u0520', + '\t\u0014\u0002\u0002\u0520\u0110\u0003\u0002\u0002\u0002\u0521\u0522', + '\t\u0013\u0002\u0002\u0522\u0523\t\u0007\u0002\u0002\u0523\u0524\t\u0014', + '\u0002\u0002\u0524\u0525\t\u0014\u0002\u0002\u0525\u0526\t\f\u0002\u0002', + '\u0526\u0527\t\r\u0002\u0002\u0527\u0528\t\u001a\u0002\u0002\u0528\u0112', + '\u0003\u0002\u0002\u0002\u0529\u052a\t\u0013\u0002\u0002\u052a\u052b', + '\t\u0007\u0002\u0002\u052b\u052c\t\u0012\u0002\u0002\u052c\u052d\t\u0007', + '\u0002\u0002\u052d\u052e\t\u0013\u0002\u0002\u052e\u0114\u0003\u0002', + '\u0002\u0002\u052f\u0530\t\u0013\u0002\u0002\u0530\u0531\t\f\u0002\u0002', + '\u0531\u0532\t\u001d\u0002\u0002\u0532\u0533\t\u0007\u0002\u0002\u0533', + '\u0116\u0003\u0002\u0002\u0002\u0534\u0535\t\u0013\u0002\u0002\u0535', + '\u0536\t\f\u0002\u0002\u0536\u0537\t\u000b\u0002\u0002\u0537\u0538\t', + '\f\u0002\u0002\u0538\u0539\t\u0014\u0002\u0002\u0539\u0118\u0003\u0002', + '\u0002\u0002\u053a\u053b\t\u0013\u0002\u0002\u053b\u053c\t\u000f\u0002', + '\u0002\u053c\u053d\t\u000b\u0002\u0002\u053d\u011a\u0003\u0002\u0002', + '\u0002\u053e\u053f\t\u000b\u0002\u0002\u053f\u0540\t\u0010\u0002\u0002', + '\u0540\u0541\t\u001e\u0002\u0002\u0541\u011c\u0003\u0002\u0002\u0002', + '\u0542\u0543\t\u000b\u0002\u0002\u0543\u0544\t\u0010\u0002\u0002\u0544', + '\u0545\t\u001e\u0002\u0002\u0545\u0546\t\u001e\u0002\u0002\u0546\u0547', + '\t\f\u0002\u0002\u0547\u0548\t\r\u0002\u0002\u0548\u0549\t\u001a\u0002', + '\u0002\u0549\u011e\u0003\u0002\u0002\u0002\u054a\u054b\t\u000b\u0002', + '\u0002\u054b\u054c\t\u0010\u0002\u0002\u054c\u054d\t\u0014\u0002\u0002', + '\u054d\u054e\t\u0018\u0002\u0002\u054e\u054f\t\u001f\u0002\u0002\u054f', + '\u0550\t\u0007\u0002\u0002\u0550\u0551\t\u0011\u0002\u0002\u0551\u0120', + '\u0003\u0002\u0002\u0002\u0552\u0553\t\u000b\u0002\u0002\u0553\u0554', + '\t\u0010\u0002\u0002\u0554\u0555\t\u0014\u0002\u0002\u0555\u0556\t\u0007', + '\u0002\u0002\u0556\u0557\t\u0015\u0002\u0002\u0557\u0558\t\f\u0002\u0002', + '\u0558\u0559\t\u0010\u0002\u0002\u0559\u055a\t\u0013\u0002\u0002\u055a', + '\u055b\t\f\u0002\u0002\u055b\u055c\t\u0017\u0002\u0002\u055c\u055d\t', + '\u0007\u0002\u0002\u055d\u055e\t\u0011\u0002\u0002\u055e\u0122\u0003', + '\u0002\u0002\u0002\u055f\u0560\t\u000b\u0002\u0002\u0560\u0561\t\u0007', + '\u0002\u0002\u0561\u0562\t\u0015\u0002\u0002\u0562\u0563\t\u001a\u0002', + '\u0002\u0563\u0564\t\u0007\u0002\u0002\u0564\u0124\u0003\u0002\u0002', + '\u0002\u0565\u0566\t\u000b\u0002\u0002\u0566\u0567\t\f\u0002\u0002\u0567', + '\u0568\t\u000f\u0002\u0002\u0568\u0569\t\u000f\u0002\u0002\u0569\u056a', + '\t\f\u0002\u0002\u056a\u056b\t\r\u0002\u0002\u056b\u056c\t\u001a\u0002', + '\u0002\u056c\u0126\u0003\u0002\u0002\u0002\u056d\u056e\t\r\u0002\u0002', + '\u056e\u056f\t\u0010\u0002\u0002\u056f\u0570\t\u000b\u0002\u0002\u0570', + '\u0571\t\u0007\u0002\u0002\u0571\u0572\t\u000f\u0002\u0002\u0572\u0573', + '\t\u001e\u0002\u0002\u0573\u0574\t\u0010\u0002\u0002\u0574\u0575\t\u0018', + '\u0002\u0002\u0575\u0576\t\u0007\u0002\u0002\u0576\u0128\u0003\u0002', + '\u0002\u0002\u0577\u0578\t\r\u0002\u0002\u0578\u0579\t\u0007\u0002\u0002', + '\u0579\u057a\t\u000f\u0002\u0002\u057a\u057b\t\u0014\u0002\u0002\u057b', + '\u012a\u0003\u0002\u0002\u0002\u057c\u057d\t\r\u0002\u0002\u057d\u057e', + '\t\u0013\u0002\u0002\u057e\u012c\u0003\u0002\u0002\u0002\u057f\u0580', + '\t\r\u0002\u0002\u0580\u0581\t\u001c\u0002\u0002\u0581\u012e\u0003\u0002', + '\u0002\u0002\u0582\u0583\t\r\u0002\u0002\u0583\u0584\t\u001c\u0002\u0002', + '\u0584\u0585\t\u0014\u0002\u0002\u0585\u0130\u0003\u0002\u0002\u0002', + '\u0586\u0587\t\r\u0002\u0002\u0587\u0588\t\u0014\u0002\u0002\u0588\u0589', + '\t\u001f\u0002\u0002\u0589\u058a\t#\u0002\u0002\u058a\u058b\t\u0012', + '\u0002\u0002\u058b\u058c\t\u0010\u0002\u0002\u058c\u058d\t\u0013\u0002', + '\u0002\u058d\u058e\t\u000e\u0002\u0002\u058e\u058f\t\u0007\u0002\u0002', + '\u058f\u0132\u0003\u0002\u0002\u0002\u0590\u0591\t\r\u0002\u0002\u0591', + '\u0592\t\u000e\u0002\u0002\u0592\u0593\t\u0013\u0002\u0002\u0593\u0594', + '\t\u0013\u0002\u0002\u0594\u0134\u0003\u0002\u0002\u0002\u0595\u0596', + '\t\r\u0002\u0002\u0596\u0597\t\u000e\u0002\u0002\u0597\u0598\t\u0013', + '\u0002\u0002\u0598\u0599\t\u0013\u0002\u0002\u0599\u059a\t\u000f\u0002', + '\u0002\u059a\u0136\u0003\u0002\u0002\u0002\u059b\u059c\t\r\u0002\u0002', + '\u059c\u059d\t$\u0002\u0002\u059d\u059e\t\u000b\u0002\u0002\u059e\u059f', + '\t\u0019\u0002\u0002\u059f\u05a0\t\u0007\u0002\u0002\u05a0\u05a1\t\u0015', + '\u0002\u0002\u05a1\u0138\u0003\u0002\u0002\u0002\u05a2\u05a3\t\u001c', + '\u0002\u0002\u05a3\u05a4\t\u0019\u0002\u0002\u05a4\u05a5\t"\u0002\u0002', + '\u05a5\u05a6\t\u0007\u0002\u0002\u05a6\u05a7\t\u0018\u0002\u0002\u05a7', + '\u05a8\t\u0014\u0002\u0002\u05a8\u013a\u0003\u0002\u0002\u0002\u05a9', + '\u05aa\t\u001c\u0002\u0002\u05aa\u05ab\t!\u0002\u0002\u05ab\u05ac\t', + '!\u0002\u0002\u05ac\u05ad\t\u000f\u0002\u0002\u05ad\u05ae\t\u0007\u0002', + '\u0002\u05ae\u05af\t\u0014\u0002\u0002\u05af\u013c\u0003\u0002\u0002', + '\u0002\u05b0\u05b1\t\u001c\u0002\u0002\u05b1\u05b2\t\r\u0002\u0002\u05b2', + '\u013e\u0003\u0002\u0002\u0002\u05b3\u05b4\t\u001c\u0002\u0002\u05b4', + '\u05b5\t\u001e\u0002\u0002\u05b5\u05b6\t\u0014\u0002\u0002\u05b6\u05b7', + '\t\f\u0002\u0002\u05b7\u05b8\t\u001c\u0002\u0002\u05b8\u05b9\t\r\u0002', + '\u0002\u05b9\u0140\u0003\u0002\u0002\u0002\u05ba\u05bb\t\u001c\u0002', + '\u0002\u05bb\u05bc\t\u001e\u0002\u0002\u05bc\u05bd\t\u0014\u0002\u0002', + '\u05bd\u05be\t\f\u0002\u0002\u05be\u05bf\t\u001c\u0002\u0002\u05bf\u05c0', + '\t\r\u0002\u0002\u05c0\u05c1\t\u000f\u0002\u0002\u05c1\u0142\u0003\u0002', + '\u0002\u0002\u05c2\u05c3\t\u001c\u0002\u0002\u05c3\u05c4\t\u0015\u0002', + '\u0002\u05c4\u0144\u0003\u0002\u0002\u0002\u05c5\u05c6\t\u001c\u0002', + '\u0002\u05c6\u05c7\t\u0015\u0002\u0002\u05c7\u05c8\t\u0011\u0002\u0002', + '\u05c8\u05c9\t\u0007\u0002\u0002\u05c9\u05ca\t\u0015\u0002\u0002\u05ca', + '\u0146\u0003\u0002\u0002\u0002\u05cb\u05cc\t\u001c\u0002\u0002\u05cc', + '\u05cd\t\u0014\u0002\u0002\u05cd\u05ce\t\u001f\u0002\u0002\u05ce\u05cf', + '\t\u0007\u0002\u0002\u05cf\u05d0\t\u0015\u0002\u0002\u05d0\u05d1\t\u000f', + '\u0002\u0002\u05d1\u0148\u0003\u0002\u0002\u0002\u05d2\u05d3\t\u001c', + '\u0002\u0002\u05d3\u05d4\t\u000e\u0002\u0002\u05d4\u05d5\t\u0014\u0002', + '\u0002\u05d5\u05d6\t\u0007\u0002\u0002\u05d6\u05d7\t\u0015\u0002\u0002', + '\u05d7\u014a\u0003\u0002\u0002\u0002\u05d8\u05d9\t\u001c\u0002\u0002', + '\u05d9\u05da\t\u0012\u0002\u0002\u05da\u05db\t\u0007\u0002\u0002\u05db', + '\u05dc\t\u0015\u0002\u0002\u05dc\u014c\u0003\u0002\u0002\u0002\u05dd', + '\u05de\t\u001e\u0002\u0002\u05de\u05df\t\u0010\u0002\u0002\u05df\u05e0', + '\t\u0015\u0002\u0002\u05e0\u05e1\t\u000f\u0002\u0002\u05e1\u05e2\t\u0007', + '\u0002\u0002\u05e2\u014e\u0003\u0002\u0002\u0002\u05e3\u05e4\t\u001e', + '\u0002\u0002\u05e4\u05e5\t\u0010\u0002\u0002\u05e5\u05e6\t\u0015\u0002', + '\u0002\u05e6\u05e7\t\u0014\u0002\u0002\u05e7\u05e8\t\f\u0002\u0002\u05e8', + '\u05e9\t\u0014\u0002\u0002\u05e9\u05ea\t\f\u0002\u0002\u05ea\u05eb\t', + '\u001c\u0002\u0002\u05eb\u05ec\t\r\u0002\u0002\u05ec\u0150\u0003\u0002', + '\u0002\u0002\u05ed\u05ee\t\u001e\u0002\u0002\u05ee\u05ef\t\u0010\u0002', + '\u0002\u05ef\u05f0\t\u000f\u0002\u0002\u05f0\u05f1\t\u000f\u0002\u0002', + '\u05f1\u05f2\t\u001b\u0002\u0002\u05f2\u05f3\t\u001c\u0002\u0002\u05f3', + '\u05f4\t\u0015\u0002\u0002\u05f4\u05f5\t\u0011\u0002\u0002\u05f5\u0152', + '\u0003\u0002\u0002\u0002\u05f6\u05f7\t\u001e\u0002\u0002\u05f7\u05f8', + '\t\u0010\u0002\u0002\u05f8\u05f9\t\u0014\u0002\u0002\u05f9\u05fa\t\u001f', + '\u0002\u0002\u05fa\u0154\u0003\u0002\u0002\u0002\u05fb\u05fc\t\u001e', + '\u0002\u0002\u05fc\u05fd\t\u001c\u0002\u0002\u05fd\u05fe\t\u001c\u0002', + '\u0002\u05fe\u05ff\t\u0013\u0002\u0002\u05ff\u0156\u0003\u0002\u0002', + '\u0002\u0600\u0601\t\u001e\u0002\u0002\u0601\u0602\t\u0015\u0002\u0002', + '\u0602\u0603\t\u0007\u0002\u0002\u0603\u0604\t\u0018\u0002\u0002\u0604', + '\u0605\t\u0007\u0002\u0002\u0605\u0606\t\u0011\u0002\u0002\u0606\u0607', + '\t\f\u0002\u0002\u0607\u0608\t\r\u0002\u0002\u0608\u0609\t\u001a\u0002', + '\u0002\u0609\u0158\u0003\u0002\u0002\u0002\u060a\u060b\t\u001e\u0002', + '\u0002\u060b\u060c\t\u0015\u0002\u0002\u060c\u060d\t\u0007\u0002\u0002', + '\u060d\u060e\t\u001e\u0002\u0002\u060e\u060f\t\u0010\u0002\u0002\u060f', + '\u0610\t\u0015\u0002\u0002\u0610\u0611\t\u0007\u0002\u0002\u0611\u015a', + '\u0003\u0002\u0002\u0002\u0612\u0613\t\u001e\u0002\u0002\u0613\u0614', + '\t\u0015\u0002\u0002\u0614\u0615\t\f\u0002\u0002\u0615\u0616\t\u000b', + '\u0002\u0002\u0616\u0617\t\u0010\u0002\u0002\u0617\u0618\t\u0015\u0002', + '\u0002\u0618\u0619\t\u0016\u0002\u0002\u0619\u015c\u0003\u0002\u0002', + '\u0002\u061a\u061b\t\u001e\u0002\u0002\u061b\u061c\t\u0015\u0002\u0002', + '\u061c\u061d\t\f\u0002\u0002\u061d\u061e\t\u0012\u0002\u0002\u061e\u061f', + '\t\u0010\u0002\u0002\u061f\u0620\t\u0014\u0002\u0002\u0620\u0621\t\u0007', + '\u0002\u0002\u0621\u015e\u0003\u0002\u0002\u0002\u0622\u0623\t\u001e', + '\u0002\u0002\u0623\u0624\t\u0015\u0002\u0002\u0624\u0625\t\f\u0002\u0002', + '\u0625\u0626\t\u0012\u0002\u0002\u0626\u0627\t\f\u0002\u0002\u0627\u0628', + '\t\u0013\u0002\u0002\u0628\u0629\t\u0007\u0002\u0002\u0629\u062a\t\u001a', + '\u0002\u0002\u062a\u062b\t\u0007\u0002\u0002\u062b\u0160\u0003\u0002', + '\u0002\u0002\u062c\u062d\t\u001e\u0002\u0002\u062d\u062e\t\u0015\u0002', + '\u0002\u062e\u062f\t\u001c\u0002\u0002\u062f\u0630\t\u0018\u0002\u0002', + '\u0630\u0631\t\u0007\u0002\u0002\u0631\u0632\t\u0011\u0002\u0002\u0632', + '\u0633\t\u000e\u0002\u0002\u0633\u0634\t\u0015\u0002\u0002\u0634\u0635', + '\t\u0007\u0002\u0002\u0635\u0162\u0003\u0002\u0002\u0002\u0636\u0637', + '\t\u001e\u0002\u0002\u0637\u0638\t\u0015\u0002\u0002\u0638\u0639\t\u001c', + '\u0002\u0002\u0639\u063a\t\u0019\u0002\u0002\u063a\u063b\t\u0007\u0002', + '\u0002\u063b\u0164\u0003\u0002\u0002\u0002\u063c\u063d\t\u001e\u0002', + '\u0002\u063d\u063e\t\u000e\u0002\u0002\u063e\u063f\t\u0019\u0002\u0002', + '\u063f\u0640\t\u0013\u0002\u0002\u0640\u0641\t\f\u0002\u0002\u0641\u0642', + '\t\u0018\u0002\u0002\u0642\u0166\u0003\u0002\u0002\u0002\u0643\u0644', + '\t\u0015\u0002\u0002\u0644\u0645\t\u0010\u0002\u0002\u0645\u0646\t\r', + '\u0002\u0002\u0646\u0647\t\u001a\u0002\u0002\u0647\u0648\t\u0007\u0002', + '\u0002\u0648\u0168\u0003\u0002\u0002\u0002\u0649\u064a\t\u0015\u0002', + '\u0002\u064a\u064b\t\u0010\u0002\u0002\u064b\u064c\t\u001b\u0002\u0002', + '\u064c\u016a\u0003\u0002\u0002\u0002\u064d\u064e\t\u0015\u0002\u0002', + '\u064e\u064f\t\u0007\u0002\u0002\u064f\u0650\t\u0010\u0002\u0002\u0650', + '\u0651\t\u0011\u0002\u0002\u0651\u016c\u0003\u0002\u0002\u0002\u0652', + '\u0653\t\u0015\u0002\u0002\u0653\u0654\t\u0007\u0002\u0002\u0654\u0655', + '\t\u0010\u0002\u0002\u0655\u0656\t\u0013\u0002\u0002\u0656\u0657\t\u000b', + '\u0002\u0002\u0657\u016e\u0003\u0002\u0002\u0002\u0658\u0659\t\u0015', + '\u0002\u0002\u0659\u065a\t\u0007\u0002\u0002\u065a\u065b\t\u0011\u0002', + '\u0002\u065b\u065c\t\u000e\u0002\u0002\u065c\u065d\t\u0018\u0002\u0002', + '\u065d\u065e\t\u0007\u0002\u0002\u065e\u0170\u0003\u0002\u0002\u0002', + '\u065f\u0660\t\u0015\u0002\u0002\u0660\u0661\t\u0007\u0002\u0002\u0661', + '\u0662\t\r\u0002\u0002\u0662\u0663\t\u0010\u0002\u0002\u0663\u0664\t', + '\u000b\u0002\u0002\u0664\u0665\t\u0007\u0002\u0002\u0665\u0172\u0003', + '\u0002\u0002\u0002\u0666\u0667\t\u0015\u0002\u0002\u0667\u0668\t\u0007', + '\u0002\u0002\u0668\u0669\t\u001e\u0002\u0002\u0669\u066a\t\u0013\u0002', + '\u0002\u066a\u066b\t\u0010\u0002\u0002\u066b\u066c\t\u0018\u0002\u0002', + '\u066c\u066d\t\u0007\u0002\u0002\u066d\u0174\u0003\u0002\u0002\u0002', + '\u066e\u066f\t\u0015\u0002\u0002\u066f\u0670\t\u0007\u0002\u0002\u0670', + '\u0671\t\u000f\u0002\u0002\u0671\u0672\t\u001e\u0002\u0002\u0672\u0673', + '\t\u0007\u0002\u0002\u0673\u0674\t\u0018\u0002\u0002\u0674\u0675\t\u0014', + '\u0002\u0002\u0675\u0176\u0003\u0002\u0002\u0002\u0676\u0677\t\u0015', + '\u0002\u0002\u0677\u0678\t\u0007\u0002\u0002\u0678\u0679\t\u0014\u0002', + '\u0002\u0679\u067a\t\u000e\u0002\u0002\u067a\u067b\t\u0015\u0002\u0002', + '\u067b\u067c\t\r\u0002\u0002\u067c\u0178\u0003\u0002\u0002\u0002\u067d', + '\u067e\t\u0015\u0002\u0002\u067e\u067f\t\u0007\u0002\u0002\u067f\u0680', + '\t\u0014\u0002\u0002\u0680\u0681\t\u000e\u0002\u0002\u0681\u0682\t\u0015', + '\u0002\u0002\u0682\u0683\t\r\u0002\u0002\u0683\u0684\t\f\u0002\u0002', + '\u0684\u0685\t\r\u0002\u0002\u0685\u0686\t\u001a\u0002\u0002\u0686\u017a', + '\u0003\u0002\u0002\u0002\u0687\u0688\t\u0015\u0002\u0002\u0688\u0689', + '\t\u0007\u0002\u0002\u0689\u068a\t\u0012\u0002\u0002\u068a\u068b\t\u001c', + '\u0002\u0002\u068b\u068c\t\u001d\u0002\u0002\u068c\u068d\t\u0007\u0002', + '\u0002\u068d\u017c\u0003\u0002\u0002\u0002\u068e\u068f\t\u0015\u0002', + '\u0002\u068f\u0690\t\f\u0002\u0002\u0690\u0691\t\u001a\u0002\u0002\u0691', + '\u0692\t\u001f\u0002\u0002\u0692\u0693\t\u0014\u0002\u0002\u0693\u017e', + '\u0003\u0002\u0002\u0002\u0694\u0695\t\u0015\u0002\u0002\u0695\u0696', + '\t\u001c\u0002\u0002\u0696\u0697\t\u0013\u0002\u0002\u0697\u0698\t\u0007', + '\u0002\u0002\u0698\u0180\u0003\u0002\u0002\u0002\u0699\u069a\t\u0015', + '\u0002\u0002\u069a\u069b\t\u001c\u0002\u0002\u069b\u069c\t\u0013\u0002', + '\u0002\u069c\u069d\t\u0013\u0002\u0002\u069d\u069e\t\u0019\u0002\u0002', + '\u069e\u069f\t\u0010\u0002\u0002\u069f\u06a0\t\u0018\u0002\u0002\u06a0', + '\u06a1\t\u001d\u0002\u0002\u06a1\u0182\u0003\u0002\u0002\u0002\u06a2', + '\u06a3\t\u0015\u0002\u0002\u06a3\u06a4\t\u001c\u0002\u0002\u06a4\u06a5', + '\t\u001b\u0002\u0002\u06a5\u0184\u0003\u0002\u0002\u0002\u06a6\u06a7', + '\t\u0015\u0002\u0002\u06a7\u06a8\t\u001c\u0002\u0002\u06a8\u06a9\t\u001b', + '\u0002\u0002\u06a9\u06aa\t\u000f\u0002\u0002\u06aa\u0186\u0003\u0002', + '\u0002\u0002\u06ab\u06ac\t\u000f\u0002\u0002\u06ac\u06ad\t\u0010\u0002', + '\u0002\u06ad\u06ae\t\u0014\u0002\u0002\u06ae\u06af\t\f\u0002\u0002\u06af', + '\u06b0\t\u000f\u0002\u0002\u06b0\u06b1\t!\u0002\u0002\u06b1\u06b2\t', + '\f\u0002\u0002\u06b2\u06b3\t\u0007\u0002\u0002\u06b3\u06b4\t\u000f\u0002', + '\u0002\u06b4\u0188\u0003\u0002\u0002\u0002\u06b5\u06b6\t\u000f\u0002', + '\u0002\u06b6\u06b7\t\u0010\u0002\u0002\u06b7\u06b8\t\u0012\u0002\u0002', + '\u06b8\u06b9\t\u0007\u0002\u0002\u06b9\u06ba\t\u001e\u0002\u0002\u06ba', + '\u06bb\t\u001c\u0002\u0002\u06bb\u06bc\t\f\u0002\u0002\u06bc\u06bd\t', + '\r\u0002\u0002\u06bd\u06be\t\u0014\u0002\u0002\u06be\u018a\u0003\u0002', + '\u0002\u0002\u06bf\u06c0\t\u000f\u0002\u0002\u06c0\u06c1\t\u0018\u0002', + '\u0002\u06c1\u06c2\t\u001f\u0002\u0002\u06c2\u06c3\t\u0007\u0002\u0002', + '\u06c3\u06c4\t\u000b\u0002\u0002\u06c4\u06c5\t\u0010\u0002\u0002\u06c5', + '\u018c\u0003\u0002\u0002\u0002\u06c6\u06c7\t\u000f\u0002\u0002\u06c7', + '\u06c8\t\u0018\u0002\u0002\u06c8\u06c9\t\u001c\u0002\u0002\u06c9\u06ca', + '\t\u001e\u0002\u0002\u06ca\u06cb\t\u0007\u0002\u0002\u06cb\u018e\u0003', + '\u0002\u0002\u0002\u06cc\u06cd\t\u000f\u0002\u0002\u06cd\u06ce\t\u0007', + '\u0002\u0002\u06ce\u06cf\t\u0013\u0002\u0002\u06cf\u06d0\t\u0007\u0002', + '\u0002\u06d0\u06d1\t\u0018\u0002\u0002\u06d1\u06d2\t\u0014\u0002\u0002', + '\u06d2\u0190\u0003\u0002\u0002\u0002\u06d3\u06d4\t\u000f\u0002\u0002', + '\u06d4\u06d5\t\u0007\u0002\u0002\u06d5\u06d6\t\u0013\u0002\u0002\u06d6', + '\u06d7\t!\u0002\u0002\u06d7\u0192\u0003\u0002\u0002\u0002\u06d8\u06d9', + '\t\u000f\u0002\u0002\u06d9\u06da\t\u0007\u0002\u0002\u06da\u06db\t\u0014', + '\u0002\u0002\u06db\u0194\u0003\u0002\u0002\u0002\u06dc\u06dd\t\u000f', + '\u0002\u0002\u06dd\u06de\t\u001f\u0002\u0002\u06de\u06df\t\u001c\u0002', + '\u0002\u06df\u06e0\t\u001b\u0002\u0002\u06e0\u0196\u0003\u0002\u0002', + '\u0002\u06e1\u06e2\t\u000f\u0002\u0002\u06e2\u06e3\t\u001c\u0002\u0002', + '\u06e3\u06e4\t\u000b\u0002\u0002\u06e4\u06e5\t\u0007\u0002\u0002\u06e5', + '\u0198\u0003\u0002\u0002\u0002\u06e6\u06e7\t\u000f\u0002\u0002\u06e7', + '\u06e8\t\u0014\u0002\u0002\u06e8\u06e9\t\u0010\u0002\u0002\u06e9\u06ea', + '\t\u0015\u0002\u0002\u06ea\u06eb\t\u0014\u0002\u0002\u06eb\u019a\u0003', + '\u0002\u0002\u0002\u06ec\u06ed\t\u000f\u0002\u0002\u06ed\u06ee\t\u0014', + '\u0002\u0002\u06ee\u06ef\t\u0010\u0002\u0002\u06ef\u06f0\t\u0014\u0002', + '\u0002\u06f0\u06f1\t\f\u0002\u0002\u06f1\u06f2\t\u000f\u0002\u0002\u06f2', + '\u06f3\t\u0014\u0002\u0002\u06f3\u06f4\t\f\u0002\u0002\u06f4\u06f5\t', + '\u0018\u0002\u0002\u06f5\u06f6\t\u000f\u0002\u0002\u06f6\u019c\u0003', + '\u0002\u0002\u0002\u06f7\u06f8\t\u000f\u0002\u0002\u06f8\u06f9\t\u0014', + '\u0002\u0002\u06f9\u06fa\t\u0015\u0002\u0002\u06fa\u06fb\t\f\u0002\u0002', + '\u06fb\u06fc\t\r\u0002\u0002\u06fc\u06fd\t\u001a\u0002\u0002\u06fd\u019e', + '\u0003\u0002\u0002\u0002\u06fe\u06ff\t\u000f\u0002\u0002\u06ff\u0700', + '\t\u0016\u0002\u0002\u0700\u0701\t\u000f\u0002\u0002\u0701\u0702\t\u0014', + '\u0002\u0002\u0702\u0703\t\u0007\u0002\u0002\u0703\u0704\t\u000b\u0002', + '\u0002\u0704\u01a0\u0003\u0002\u0002\u0002\u0705\u0706\t\u0014\u0002', + '\u0002\u0706\u0707\t\u001f\u0002\u0002\u0707\u0708\t\u0007\u0002\u0002', + '\u0708\u0709\t\r\u0002\u0002\u0709\u01a2\u0003\u0002\u0002\u0002\u070a', + '\u070b\t\u0014\u0002\u0002\u070b\u070c\t\f\u0002\u0002\u070c\u070d\t', + '\u0007\u0002\u0002\u070d\u070e\t\u000f\u0002\u0002\u070e\u01a4\u0003', + '\u0002\u0002\u0002\u070f\u0710\t\u0014\u0002\u0002\u0710\u0711\t\u001c', + '\u0002\u0002\u0711\u01a6\u0003\u0002\u0002\u0002\u0712\u0713\t\u0014', + '\u0002\u0002\u0713\u0714\t\u0015\u0002\u0002\u0714\u0715\t\u0010\u0002', + '\u0002\u0715\u0716\t\r\u0002\u0002\u0716\u01a8\u0003\u0002\u0002\u0002', + '\u0717\u0718\t\u0014\u0002\u0002\u0718\u0719\t\u0015\u0002\u0002\u0719', + '\u071a\t\u0010\u0002\u0002\u071a\u071b\t\r\u0002\u0002\u071b\u071c\t', + '\u000f\u0002\u0002\u071c\u071d\t\u0010\u0002\u0002\u071d\u071e\t\u0018', + '\u0002\u0002\u071e\u071f\t\u0014\u0002\u0002\u071f\u0720\t\f\u0002\u0002', + '\u0720\u0721\t\u001c\u0002\u0002\u0721\u0722\t\r\u0002\u0002\u0722\u01aa', + '\u0003\u0002\u0002\u0002\u0723\u0724\t\u0014\u0002\u0002\u0724\u0725', + '\t\u0015\u0002\u0002\u0725\u0726\t\f\u0002\u0002\u0726\u0727\t\u001a', + '\u0002\u0002\u0727\u0728\t\u001a\u0002\u0002\u0728\u0729\t\u0007\u0002', + '\u0002\u0729\u072a\t\u0015\u0002\u0002\u072a\u01ac\u0003\u0002\u0002', + '\u0002\u072b\u072c\t\u0014\u0002\u0002\u072c\u072d\t\u0015\u0002\u0002', + '\u072d\u072e\t\u000e\u0002\u0002\u072e\u072f\t\u0007\u0002\u0002\u072f', + '\u01ae\u0003\u0002\u0002\u0002\u0730\u0731\t\u0014\u0002\u0002\u0731', + '\u0732\t\u0015\u0002\u0002\u0732\u0733\t\u000e\u0002\u0002\u0733\u0734', + '\t\r\u0002\u0002\u0734\u0735\t\u0018\u0002\u0002\u0735\u0736\t\u0010', + '\u0002\u0002\u0736\u0737\t\u0014\u0002\u0002\u0737\u0738\t\u0007\u0002', + '\u0002\u0738\u01b0\u0003\u0002\u0002\u0002\u0739\u073a\t\u000e\u0002', + '\u0002\u073a\u073b\t\r\u0002\u0002\u073b\u073c\t\u0019\u0002\u0002\u073c', + '\u073d\t\u001c\u0002\u0002\u073d\u073e\t\u000e\u0002\u0002\u073e\u073f', + '\t\r\u0002\u0002\u073f\u0740\t\u0011\u0002\u0002\u0740\u0741\t\u0007', + '\u0002\u0002\u0741\u0742\t\u0011\u0002\u0002\u0742\u01b2\u0003\u0002', + '\u0002\u0002\u0743\u0744\t\u000e\u0002\u0002\u0744\u0745\t\r\u0002\u0002', + '\u0745\u0746\t\u0011\u0002\u0002\u0746\u0747\t\u0007\u0002\u0002\u0747', + '\u0748\t\u0015\u0002\u0002\u0748\u01b4\u0003\u0002\u0002\u0002\u0749', + '\u074a\t\u000e\u0002\u0002\u074a\u074b\t\r\u0002\u0002\u074b\u074c\t', + '\f\u0002\u0002\u074c\u074d\t\u001c\u0002\u0002\u074d\u074e\t\r\u0002', + '\u0002\u074e\u01b6\u0003\u0002\u0002\u0002\u074f\u0750\t\u000e\u0002', + '\u0002\u0750\u0751\t\r\u0002\u0002\u0751\u0752\t\f\u0002\u0002\u0752', + '\u0753\t%\u0002\u0002\u0753\u0754\t\u000e\u0002\u0002\u0754\u0755\t', + '\u0007\u0002\u0002\u0755\u01b8\u0003\u0002\u0002\u0002\u0756\u0757\t', + '\u000e\u0002\u0002\u0757\u0758\t\r\u0002\u0002\u0758\u0759\t\u001d\u0002', + '\u0002\u0759\u075a\t\r\u0002\u0002\u075a\u075b\t\u001c\u0002\u0002\u075b', + '\u075c\t\u001b\u0002\u0002\u075c\u075d\t\r\u0002\u0002\u075d\u01ba\u0003', + '\u0002\u0002\u0002\u075e\u075f\t\u000e\u0002\u0002\u075f\u0760\t\r\u0002', + '\u0002\u0760\u0761\t\r\u0002\u0002\u0761\u0762\t\u0007\u0002\u0002\u0762', + '\u0763\t\u000f\u0002\u0002\u0763\u0764\t\u0014\u0002\u0002\u0764\u01bc', + '\u0003\u0002\u0002\u0002\u0765\u0766\t\u000e\u0002\u0002\u0766\u0767', + '\t\r\u0002\u0002\u0767\u0768\t\u000f\u0002\u0002\u0768\u0769\t\u0007', + '\u0002\u0002\u0769\u076a\t\u0014\u0002\u0002\u076a\u01be\u0003\u0002', + '\u0002\u0002\u076b\u076c\t\u000e\u0002\u0002\u076c\u076d\t\u001e\u0002', + '\u0002\u076d\u076e\t\u0011\u0002\u0002\u076e\u076f\t\u0010\u0002\u0002', + '\u076f\u0770\t\u0014\u0002\u0002\u0770\u0771\t\u0007\u0002\u0002\u0771', + '\u01c0\u0003\u0002\u0002\u0002\u0772\u0773\t\u000e\u0002\u0002\u0773', + '\u0774\t\u001e\u0002\u0002\u0774\u0775\t\u000f\u0002\u0002\u0775\u0776', + '\t\u0007\u0002\u0002\u0776\u0777\t\u0015\u0002\u0002\u0777\u0778\t\u0014', + '\u0002\u0002\u0778\u01c2\u0003\u0002\u0002\u0002\u0779\u077a\t\u000e', + '\u0002\u0002\u077a\u077b\t\u000f\u0002\u0002\u077b\u077c\t\u0007\u0002', + '\u0002\u077c\u01c4\u0003\u0002\u0002\u0002\u077d\u077e\t\u000e\u0002', + '\u0002\u077e\u077f\t\u000f\u0002\u0002\u077f\u0780\t\u0007\u0002\u0002', + '\u0780\u0781\t\u0015\u0002\u0002\u0781\u01c6\u0003\u0002\u0002\u0002', + '\u0782\u0783\t\u000e\u0002\u0002\u0783\u0784\t\u000f\u0002\u0002\u0784', + '\u0785\t\f\u0002\u0002\u0785\u0786\t\r\u0002\u0002\u0786\u0787\t\u001a', + '\u0002\u0002\u0787\u01c8\u0003\u0002\u0002\u0002\u0788\u0789\t\u0012', + '\u0002\u0002\u0789\u078a\t\u0010\u0002\u0002\u078a\u078b\t\u0013\u0002', + '\u0002\u078b\u078c\t\f\u0002\u0002\u078c\u078d\t\u0011\u0002\u0002\u078d', + '\u078e\t\u0010\u0002\u0002\u078e\u078f\t\u0014\u0002\u0002\u078f\u0790', + '\t\u0007\u0002\u0002\u0790\u01ca\u0003\u0002\u0002\u0002\u0791\u0792', + '\t\u0012\u0002\u0002\u0792\u0793\t\u0010\u0002\u0002\u0793\u0794\t\u0013', + '\u0002\u0002\u0794\u0795\t\u000e\u0002\u0002\u0795\u0796\t\u0007\u0002', + '\u0002\u0796\u01cc\u0003\u0002\u0002\u0002\u0797\u0798\t\u0012\u0002', + '\u0002\u0798\u0799\t\u0010\u0002\u0002\u0799\u079a\t\u0013\u0002\u0002', + '\u079a\u079b\t\u000e\u0002\u0002\u079b\u079c\t\u0007\u0002\u0002\u079c', + '\u079d\t\u0011\u0002\u0002\u079d\u01ce\u0003\u0002\u0002\u0002\u079e', + '\u079f\t\u0012\u0002\u0002\u079f\u07a0\t\u0010\u0002\u0002\u07a0\u07a1', + '\t\u0013\u0002\u0002\u07a1\u07a2\t\u000e\u0002\u0002\u07a2\u07a3\t\u0007', + '\u0002\u0002\u07a3\u07a4\t\u000f\u0002\u0002\u07a4\u01d0\u0003\u0002', + '\u0002\u0002\u07a5\u07a6\t\u0012\u0002\u0002\u07a6\u07a7\t\f\u0002\u0002', + '\u07a7\u07a8\t\u0010\u0002\u0002\u07a8\u01d2\u0003\u0002\u0002\u0002', + '\u07a9\u07aa\t\u0012\u0002\u0002\u07aa\u07ab\t\f\u0002\u0002\u07ab\u07ac', + '\t\u0007\u0002\u0002\u07ac\u07ad\t\u001b\u0002\u0002\u07ad\u01d4\u0003', + '\u0002\u0002\u0002\u07ae\u07af\t\u001b\u0002\u0002\u07af\u07b0\t\u001f', + '\u0002\u0002\u07b0\u07b1\t\u0007\u0002\u0002\u07b1\u07b2\t\r\u0002\u0002', + '\u07b2\u01d6\u0003\u0002\u0002\u0002\u07b3\u07b4\t\u001b\u0002\u0002', + '\u07b4\u07b5\t\u001f\u0002\u0002\u07b5\u07b6\t\u0007\u0002\u0002\u07b6', + '\u07b7\t\u0015\u0002\u0002\u07b7\u07b8\t\u0007\u0002\u0002\u07b8\u01d8', + '\u0003\u0002\u0002\u0002\u07b9\u07ba\t\u001b\u0002\u0002\u07ba\u07bb', + '\t\u001f\u0002\u0002\u07bb\u07bc\t\f\u0002\u0002\u07bc\u07bd\t\u0013', + '\u0002\u0002\u07bd\u07be\t\u0007\u0002\u0002\u07be\u01da\u0003\u0002', + '\u0002\u0002\u07bf\u07c0\t\u001b\u0002\u0002\u07c0\u07c1\t\f\u0002\u0002', + '\u07c1\u07c2\t\r\u0002\u0002\u07c2\u07c3\t\u0011\u0002\u0002\u07c3\u07c4', + '\t\u001c\u0002\u0002\u07c4\u07c5\t\u001b\u0002\u0002\u07c5\u01dc\u0003', + '\u0002\u0002\u0002\u07c6\u07c7\t\u001b\u0002\u0002\u07c7\u07c8\t\f\u0002', + '\u0002\u07c8\u07c9\t\u0014\u0002\u0002\u07c9\u07ca\t\u001f\u0002\u0002', + '\u07ca\u01de\u0003\u0002\u0002\u0002\u07cb\u07cc\t\u001b\u0002\u0002', + '\u07cc\u07cd\t\f\u0002\u0002\u07cd\u07ce\t\u0014\u0002\u0002\u07ce\u07cf', + '\t\u001f\u0002\u0002\u07cf\u07d0\t\f\u0002\u0002\u07d0\u07d1\t\r\u0002', + '\u0002\u07d1\u01e0\u0003\u0002\u0002\u0002\u07d2\u07d3\t\u001b\u0002', + '\u0002\u07d3\u07d4\t\u001c\u0002\u0002\u07d4\u07d5\t\u0015\u0002\u0002', + '\u07d5\u07d6\t\u001d\u0002\u0002\u07d6\u01e2\u0003\u0002\u0002\u0002', + '\u07d7\u07d8\t \u0002\u0002\u07d8\u07d9\t\u001c\u0002\u0002\u07d9\u07da', + '\t\u0015\u0002\u0002\u07da\u01e4\u0003\u0002\u0002\u0002\u07db\u07dc', + '\u0007b\u0002\u0002\u07dc\u07df\u0007b\u0002\u0002\u07dd\u07df\n&\u0002', + '\u0002\u07de\u07db\u0003\u0002\u0002\u0002\u07de\u07dd\u0003\u0002\u0002', + "\u0002\u07df\u01e6\u0003\u0002\u0002\u0002\u07e0\u07e1\t'\u0002\u0002", + '\u07e1\u01e8\u0003\u0002\u0002\u0002\u07e2\u07e3\t(\u0002\u0002\u07e3', + '\u01ea\u0003\u0002\u0002\u0002\u07e4\u07e6\u0007b\u0002\u0002\u07e5', + '\u07e7\u0005\u01e5\u00f3\u0002\u07e6\u07e5\u0003\u0002\u0002\u0002\u07e7', + '\u07e8\u0003\u0002\u0002\u0002\u07e8\u07e6\u0003\u0002\u0002\u0002\u07e8', + '\u07e9\u0003\u0002\u0002\u0002\u07e9\u07ea\u0003\u0002\u0002\u0002\u07ea', + '\u07eb\u0007b\u0002\u0002\u07eb\u07ec\u0007k\u0002\u0002\u07ec\u01ec', + '\u0003\u0002\u0002\u0002\u07ed\u07ef\u0007b\u0002\u0002\u07ee\u07f0', + '\u0005\u01e5\u00f3\u0002\u07ef\u07ee\u0003\u0002\u0002\u0002\u07f0\u07f1', + '\u0003\u0002\u0002\u0002\u07f1\u07ef\u0003\u0002\u0002\u0002\u07f1\u07f2', + '\u0003\u0002\u0002\u0002\u07f2\u07f3\u0003\u0002\u0002\u0002\u07f3\u07f4', + '\u0007b\u0002\u0002\u07f4\u07fd\u0003\u0002\u0002\u0002\u07f5\u07f9', + '\u0005\u01e7\u00f4\u0002\u07f6\u07f8\u0005\u01e9\u00f5\u0002\u07f7\u07f6', + '\u0003\u0002\u0002\u0002\u07f8\u07fb\u0003\u0002\u0002\u0002\u07f9\u07f7', + '\u0003\u0002\u0002\u0002\u07f9\u07fa\u0003\u0002\u0002\u0002\u07fa\u07fd', + '\u0003\u0002\u0002\u0002\u07fb\u07f9\u0003\u0002\u0002\u0002\u07fc\u07ed', + '\u0003\u0002\u0002\u0002\u07fc\u07f5\u0003\u0002\u0002\u0002\u07fd\u01ee', + '\u0003\u0002\u0002\u0002\u07fe\u07ff\u0007&\u0002\u0002\u07ff\u0803', + '\u0005\u01e7\u00f4\u0002\u0800\u0802\u0005\u01e9\u00f5\u0002\u0801\u0800', + '\u0003\u0002\u0002\u0002\u0802\u0805\u0003\u0002\u0002\u0002\u0803\u0801', + '\u0003\u0002\u0002\u0002\u0803\u0804\u0003\u0002\u0002\u0002\u0804\u01f0', + '\u0003\u0002\u0002\u0002\u0805\u0803\u0003\u0002\u0002\u0002\u0806\u0807', + '\u0007&\u0002\u0002\u0807\u080b\t)\u0002\u0002\u0808\u080a\t\u0006\u0002', + '\u0002\u0809\u0808\u0003\u0002\u0002\u0002\u080a\u080d\u0003\u0002\u0002', + '\u0002\u080b\u0809\u0003\u0002\u0002\u0002\u080b\u080c\u0003\u0002\u0002', + '\u0002\u080c\u01f2\u0003\u0002\u0002\u0002\u080d\u080b\u0003\u0002\u0002', + '\u0002\u080e\u080f\u0007A\u0002\u0002\u080f\u01f4\u0003\u0002\u0002', + '\u0002\u001c\u0002\u01fc\u0203\u0209\u0211\u0215\u0218\u0221\u0224\u0228', + '\u022d\u0236\u0239\u023e\u0246\u0252\u0258\u0266\u0277\u07de\u07e8\u07f1', + '\u07f9\u07fc\u0803\u080b\u0003\b\u0002\u0002', +].join(''); + +const atn = new antlr4.atn.ATNDeserializer().deserialize(serializedATN); + +const decisionsToDFA = atn.decisionToState.map((ds, index) => new antlr4.dfa.DFA(ds, index)); + +class n1qlLexer extends antlr4.Lexer { + static grammarFileName = 'n1ql.g4'; + static channelNames = ['DEFAULT_TOKEN_CHANNEL', 'HIDDEN']; + static modeNames = ['DEFAULT_MODE']; + static literalNames = [ + null, + null, + null, + null, + null, + null, + null, + "'.'", + "'+'", + null, + "'*'", + "'/'", + "'%'", + "'=='", + "'='", + null, + "'<'", + "'<='", + "'>'", + "'>='", + "'||'", + "'('", + "')'", + "'{'", + "'}'", + "','", + "':'", + "'['", + "']'", + "']i'", + "';'", + "'!'", + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + "'?'", + ]; + static symbolicNames = [ + null, + 'STR', + 'INT', + 'NUM', + 'BLOCK_COMMENT', + 'LINE_COMMENT', + 'WHITESPACE', + 'DOT', + 'PLUS', + 'MINUS', + 'STAR', + 'DIV', + 'MOD', + 'DEQ', + 'EQ', + 'NE', + 'LT', + 'LE', + 'GT', + 'GE', + 'CONCAT', + 'LPAREN', + 'RPAREN', + 'LBRACE', + 'RBRACE', + 'COMMA', + 'COLON', + 'LBRACKET', + 'RBRACKET', + 'RBRACKET_ICASE', + 'SEMI', + 'NOT_A_TOKEN', + 'ADVISE', + 'ALL', + 'ALTER', + 'ANALYZE', + 'AND', + 'ANY', + 'ARRAY', + 'AS', + 'ASC', + 'AT', + 'BEGIN', + 'BETWEEN', + 'BINARY', + 'BOOLEAN', + 'BREAK', + 'BUCKET', + 'BUILD', + 'BY', + 'CALL', + 'CASE', + 'CAST', + 'CLUSTER', + 'COLLATE', + 'COLLECTION', + 'COMMIT', + 'COMMITTED', + 'CONNECT', + 'CONTINUE', + 'CORRELATED', + 'COVER', + 'CREATE', + 'CURRENT', + 'DATABASE', + 'DATASET', + 'DATASTORE', + 'DECLARE', + 'DECREMENT', + 'DELETE_', + 'DERIVED', + 'DESC', + 'DESCRIBE', + 'DISTINCT', + 'DO', + 'DROP', + 'EACH', + 'ELEMENT', + 'ELSE', + 'END', + 'EVERY', + 'EXCEPT', + 'EXCLUDE', + 'EXECUTE', + 'EXISTS', + 'EXPLAIN', + 'FALSE', + 'FETCH', + 'FILTER', + 'FIRST', + 'FLATTEN', + 'FLUSH', + 'FOLLOWING', + 'FOR', + 'FORCE', + 'FROM', + 'FTS', + 'FUNCTION', + 'GOLANG', + 'GRANT', + 'GROUP', + 'GROUPS', + 'GSI', + 'HASH', + 'HAVING', + 'IF', + 'IGNORE', + 'ILIKE', + 'IN', + 'INCLUDE', + 'INCREMENT', + 'INDEX', + 'INFER', + 'INLINE', + 'INNER', + 'INSERT', + 'INTERSECT', + 'INTO', + 'IS', + 'ISOLATION', + 'JAVASCRIPT', + 'JOIN', + 'KEY', + 'KEYS', + 'KEYSPACE', + 'KNOWN', + 'LANGUAGE', + 'LAST', + 'LEFT', + 'LET_', + 'LETTING', + 'LEVEL', + 'LIKE', + 'LIMIT', + 'LSM', + 'MAP', + 'MAPPING', + 'MATCHED', + 'MATERIALIZED', + 'MERGE', + 'MISSING', + 'NAMESPACE', + 'NEST', + 'NL', + 'NO', + 'NOT', + 'NTH_VALUE', + 'NULL', + 'NULLS', + 'NUMBER', + 'OBJECT', + 'OFFSET', + 'ON', + 'OPTION', + 'OPTIONS', + 'OR', + 'ORDER', + 'OTHERS', + 'OUTER', + 'OVER', + 'PARSE', + 'PARTITION', + 'PASSWORD', + 'PATH', + 'POOL', + 'PRECEDING', + 'PREPARE', + 'PRIMARY', + 'PRIVATE', + 'PRIVILEGE', + 'PROCEDURE', + 'PROBE', + 'PUBLIC', + 'RANGE', + 'RAW', + 'READ', + 'REALM', + 'REDUCE', + 'RENAME', + 'REPLACE', + 'RESPECT', + 'RETURN', + 'RETURNING', + 'REVOKE', + 'RIGHT', + 'ROLE', + 'ROLLBACK', + 'ROW', + 'ROWS', + 'SATISFIES', + 'SAVEPOINT', + 'SCHEMA', + 'SCOPE', + 'SELECT', + 'SELF', + 'SET', + 'SHOW', + 'SOME', + 'START', + 'STATISTICS', + 'STRING', + 'SYSTEM', + 'THEN', + 'TIES', + 'TO', + 'TRAN', + 'TRANSACTION', + 'TRIGGER', + 'TRUE', + 'TRUNCATE', + 'UNBOUNDED', + 'UNDER', + 'UNION', + 'UNIQUE', + 'UNKNOWN', + 'UNNEST', + 'UNSET', + 'UPDATE', + 'UPSERT', + 'USE', + 'USER', + 'USING', + 'VALIDATE', + 'VALUE', + 'VALUED', + 'VALUES', + 'VIA', + 'VIEW', + 'WHEN', + 'WHERE', + 'WHILE', + 'WINDOW', + 'WITH', + 'WITHIN', + 'WORK', + 'XOR', + 'IDENT_ICASE', + 'IDENT', + 'NAMED_PARAM', + 'POSITIONAL_PARAM', + 'NEXT_PARAM', + ]; + static ruleNames = [ + 'SingleStringCharacter', + 'DoubleStringCharacter', + 'STR', + 'NumStart', + 'Digit', + 'Int', + 'Exponent', + 'INT', + 'NUM', + 'BLOCK_COMMENT', + 'LINE_COMMENT', + 'WHITESPACE', + 'DOT', + 'PLUS', + 'MINUS', + 'STAR', + 'DIV', + 'MOD', + 'DEQ', + 'EQ', + 'NE', + 'LT', + 'LE', + 'GT', + 'GE', + 'CONCAT', + 'LPAREN', + 'RPAREN', + 'LBRACE', + 'RBRACE', + 'COMMA', + 'COLON', + 'LBRACKET', + 'RBRACKET', + 'RBRACKET_ICASE', + 'SEMI', + 'NOT_A_TOKEN', + 'ADVISE', + 'ALL', + 'ALTER', + 'ANALYZE', + 'AND', + 'ANY', + 'ARRAY', + 'AS', + 'ASC', + 'AT', + 'BEGIN', + 'BETWEEN', + 'BINARY', + 'BOOLEAN', + 'BREAK', + 'BUCKET', + 'BUILD', + 'BY', + 'CALL', + 'CASE', + 'CAST', + 'CLUSTER', + 'COLLATE', + 'COLLECTION', + 'COMMIT', + 'COMMITTED', + 'CONNECT', + 'CONTINUE', + 'CORRELATED', + 'COVER', + 'CREATE', + 'CURRENT', + 'DATABASE', + 'DATASET', + 'DATASTORE', + 'DECLARE', + 'DECREMENT', + 'DELETE_', + 'DERIVED', + 'DESC', + 'DESCRIBE', + 'DISTINCT', + 'DO', + 'DROP', + 'EACH', + 'ELEMENT', + 'ELSE', + 'END', + 'EVERY', + 'EXCEPT', + 'EXCLUDE', + 'EXECUTE', + 'EXISTS', + 'EXPLAIN', + 'FALSE', + 'FETCH', + 'FILTER', + 'FIRST', + 'FLATTEN', + 'FLUSH', + 'FOLLOWING', + 'FOR', + 'FORCE', + 'FROM', + 'FTS', + 'FUNCTION', + 'GOLANG', + 'GRANT', + 'GROUP', + 'GROUPS', + 'GSI', + 'HASH', + 'HAVING', + 'IF', + 'IGNORE', + 'ILIKE', + 'IN', + 'INCLUDE', + 'INCREMENT', + 'INDEX', + 'INFER', + 'INLINE', + 'INNER', + 'INSERT', + 'INTERSECT', + 'INTO', + 'IS', + 'ISOLATION', + 'JAVASCRIPT', + 'JOIN', + 'KEY', + 'KEYS', + 'KEYSPACE', + 'KNOWN', + 'LANGUAGE', + 'LAST', + 'LEFT', + 'LET_', + 'LETTING', + 'LEVEL', + 'LIKE', + 'LIMIT', + 'LSM', + 'MAP', + 'MAPPING', + 'MATCHED', + 'MATERIALIZED', + 'MERGE', + 'MISSING', + 'NAMESPACE', + 'NEST', + 'NL', + 'NO', + 'NOT', + 'NTH_VALUE', + 'NULL', + 'NULLS', + 'NUMBER', + 'OBJECT', + 'OFFSET', + 'ON', + 'OPTION', + 'OPTIONS', + 'OR', + 'ORDER', + 'OTHERS', + 'OUTER', + 'OVER', + 'PARSE', + 'PARTITION', + 'PASSWORD', + 'PATH', + 'POOL', + 'PRECEDING', + 'PREPARE', + 'PRIMARY', + 'PRIVATE', + 'PRIVILEGE', + 'PROCEDURE', + 'PROBE', + 'PUBLIC', + 'RANGE', + 'RAW', + 'READ', + 'REALM', + 'REDUCE', + 'RENAME', + 'REPLACE', + 'RESPECT', + 'RETURN', + 'RETURNING', + 'REVOKE', + 'RIGHT', + 'ROLE', + 'ROLLBACK', + 'ROW', + 'ROWS', + 'SATISFIES', + 'SAVEPOINT', + 'SCHEMA', + 'SCOPE', + 'SELECT', + 'SELF', + 'SET', + 'SHOW', + 'SOME', + 'START', + 'STATISTICS', + 'STRING', + 'SYSTEM', + 'THEN', + 'TIES', + 'TO', + 'TRAN', + 'TRANSACTION', + 'TRIGGER', + 'TRUE', + 'TRUNCATE', + 'UNBOUNDED', + 'UNDER', + 'UNION', + 'UNIQUE', + 'UNKNOWN', + 'UNNEST', + 'UNSET', + 'UPDATE', + 'UPSERT', + 'USE', + 'USER', + 'USING', + 'VALIDATE', + 'VALUE', + 'VALUED', + 'VALUES', + 'VIA', + 'VIEW', + 'WHEN', + 'WHERE', + 'WHILE', + 'WINDOW', + 'WITH', + 'WITHIN', + 'WORK', + 'XOR', + 'IdentChar', + 'IdentFirstChar', + 'IdentLaterChar', + 'IDENT_ICASE', + 'IDENT', + 'NAMED_PARAM', + 'POSITIONAL_PARAM', + 'NEXT_PARAM', + ]; + + constructor(input) { + super(input); + this._interp = new antlr4.atn.LexerATNSimulator(this, atn, decisionsToDFA, new antlr4.PredictionContextCache()); + } + + get atn() { + return atn; + } +} + +n1qlLexer.EOF = antlr4.Token.EOF; +n1qlLexer.STR = 1; +n1qlLexer.INT = 2; +n1qlLexer.NUM = 3; +n1qlLexer.BLOCK_COMMENT = 4; +n1qlLexer.LINE_COMMENT = 5; +n1qlLexer.WHITESPACE = 6; +n1qlLexer.DOT = 7; +n1qlLexer.PLUS = 8; +n1qlLexer.MINUS = 9; +n1qlLexer.STAR = 10; +n1qlLexer.DIV = 11; +n1qlLexer.MOD = 12; +n1qlLexer.DEQ = 13; +n1qlLexer.EQ = 14; +n1qlLexer.NE = 15; +n1qlLexer.LT = 16; +n1qlLexer.LE = 17; +n1qlLexer.GT = 18; +n1qlLexer.GE = 19; +n1qlLexer.CONCAT = 20; +n1qlLexer.LPAREN = 21; +n1qlLexer.RPAREN = 22; +n1qlLexer.LBRACE = 23; +n1qlLexer.RBRACE = 24; +n1qlLexer.COMMA = 25; +n1qlLexer.COLON = 26; +n1qlLexer.LBRACKET = 27; +n1qlLexer.RBRACKET = 28; +n1qlLexer.RBRACKET_ICASE = 29; +n1qlLexer.SEMI = 30; +n1qlLexer.NOT_A_TOKEN = 31; +n1qlLexer.ADVISE = 32; +n1qlLexer.ALL = 33; +n1qlLexer.ALTER = 34; +n1qlLexer.ANALYZE = 35; +n1qlLexer.AND = 36; +n1qlLexer.ANY = 37; +n1qlLexer.ARRAY = 38; +n1qlLexer.AS = 39; +n1qlLexer.ASC = 40; +n1qlLexer.AT = 41; +n1qlLexer.BEGIN = 42; +n1qlLexer.BETWEEN = 43; +n1qlLexer.BINARY = 44; +n1qlLexer.BOOLEAN = 45; +n1qlLexer.BREAK = 46; +n1qlLexer.BUCKET = 47; +n1qlLexer.BUILD = 48; +n1qlLexer.BY = 49; +n1qlLexer.CALL = 50; +n1qlLexer.CASE = 51; +n1qlLexer.CAST = 52; +n1qlLexer.CLUSTER = 53; +n1qlLexer.COLLATE = 54; +n1qlLexer.COLLECTION = 55; +n1qlLexer.COMMIT = 56; +n1qlLexer.COMMITTED = 57; +n1qlLexer.CONNECT = 58; +n1qlLexer.CONTINUE = 59; +n1qlLexer.CORRELATED = 60; +n1qlLexer.COVER = 61; +n1qlLexer.CREATE = 62; +n1qlLexer.CURRENT = 63; +n1qlLexer.DATABASE = 64; +n1qlLexer.DATASET = 65; +n1qlLexer.DATASTORE = 66; +n1qlLexer.DECLARE = 67; +n1qlLexer.DECREMENT = 68; +n1qlLexer.DELETE_ = 69; +n1qlLexer.DERIVED = 70; +n1qlLexer.DESC = 71; +n1qlLexer.DESCRIBE = 72; +n1qlLexer.DISTINCT = 73; +n1qlLexer.DO = 74; +n1qlLexer.DROP = 75; +n1qlLexer.EACH = 76; +n1qlLexer.ELEMENT = 77; +n1qlLexer.ELSE = 78; +n1qlLexer.END = 79; +n1qlLexer.EVERY = 80; +n1qlLexer.EXCEPT = 81; +n1qlLexer.EXCLUDE = 82; +n1qlLexer.EXECUTE = 83; +n1qlLexer.EXISTS = 84; +n1qlLexer.EXPLAIN = 85; +n1qlLexer.FALSE = 86; +n1qlLexer.FETCH = 87; +n1qlLexer.FILTER = 88; +n1qlLexer.FIRST = 89; +n1qlLexer.FLATTEN = 90; +n1qlLexer.FLUSH = 91; +n1qlLexer.FOLLOWING = 92; +n1qlLexer.FOR = 93; +n1qlLexer.FORCE = 94; +n1qlLexer.FROM = 95; +n1qlLexer.FTS = 96; +n1qlLexer.FUNCTION = 97; +n1qlLexer.GOLANG = 98; +n1qlLexer.GRANT = 99; +n1qlLexer.GROUP = 100; +n1qlLexer.GROUPS = 101; +n1qlLexer.GSI = 102; +n1qlLexer.HASH = 103; +n1qlLexer.HAVING = 104; +n1qlLexer.IF = 105; +n1qlLexer.IGNORE = 106; +n1qlLexer.ILIKE = 107; +n1qlLexer.IN = 108; +n1qlLexer.INCLUDE = 109; +n1qlLexer.INCREMENT = 110; +n1qlLexer.INDEX = 111; +n1qlLexer.INFER = 112; +n1qlLexer.INLINE = 113; +n1qlLexer.INNER = 114; +n1qlLexer.INSERT = 115; +n1qlLexer.INTERSECT = 116; +n1qlLexer.INTO = 117; +n1qlLexer.IS = 118; +n1qlLexer.ISOLATION = 119; +n1qlLexer.JAVASCRIPT = 120; +n1qlLexer.JOIN = 121; +n1qlLexer.KEY = 122; +n1qlLexer.KEYS = 123; +n1qlLexer.KEYSPACE = 124; +n1qlLexer.KNOWN = 125; +n1qlLexer.LANGUAGE = 126; +n1qlLexer.LAST = 127; +n1qlLexer.LEFT = 128; +n1qlLexer.LET_ = 129; +n1qlLexer.LETTING = 130; +n1qlLexer.LEVEL = 131; +n1qlLexer.LIKE = 132; +n1qlLexer.LIMIT = 133; +n1qlLexer.LSM = 134; +n1qlLexer.MAP = 135; +n1qlLexer.MAPPING = 136; +n1qlLexer.MATCHED = 137; +n1qlLexer.MATERIALIZED = 138; +n1qlLexer.MERGE = 139; +n1qlLexer.MISSING = 140; +n1qlLexer.NAMESPACE = 141; +n1qlLexer.NEST = 142; +n1qlLexer.NL = 143; +n1qlLexer.NO = 144; +n1qlLexer.NOT = 145; +n1qlLexer.NTH_VALUE = 146; +n1qlLexer.NULL = 147; +n1qlLexer.NULLS = 148; +n1qlLexer.NUMBER = 149; +n1qlLexer.OBJECT = 150; +n1qlLexer.OFFSET = 151; +n1qlLexer.ON = 152; +n1qlLexer.OPTION = 153; +n1qlLexer.OPTIONS = 154; +n1qlLexer.OR = 155; +n1qlLexer.ORDER = 156; +n1qlLexer.OTHERS = 157; +n1qlLexer.OUTER = 158; +n1qlLexer.OVER = 159; +n1qlLexer.PARSE = 160; +n1qlLexer.PARTITION = 161; +n1qlLexer.PASSWORD = 162; +n1qlLexer.PATH = 163; +n1qlLexer.POOL = 164; +n1qlLexer.PRECEDING = 165; +n1qlLexer.PREPARE = 166; +n1qlLexer.PRIMARY = 167; +n1qlLexer.PRIVATE = 168; +n1qlLexer.PRIVILEGE = 169; +n1qlLexer.PROCEDURE = 170; +n1qlLexer.PROBE = 171; +n1qlLexer.PUBLIC = 172; +n1qlLexer.RANGE = 173; +n1qlLexer.RAW = 174; +n1qlLexer.READ = 175; +n1qlLexer.REALM = 176; +n1qlLexer.REDUCE = 177; +n1qlLexer.RENAME = 178; +n1qlLexer.REPLACE = 179; +n1qlLexer.RESPECT = 180; +n1qlLexer.RETURN = 181; +n1qlLexer.RETURNING = 182; +n1qlLexer.REVOKE = 183; +n1qlLexer.RIGHT = 184; +n1qlLexer.ROLE = 185; +n1qlLexer.ROLLBACK = 186; +n1qlLexer.ROW = 187; +n1qlLexer.ROWS = 188; +n1qlLexer.SATISFIES = 189; +n1qlLexer.SAVEPOINT = 190; +n1qlLexer.SCHEMA = 191; +n1qlLexer.SCOPE = 192; +n1qlLexer.SELECT = 193; +n1qlLexer.SELF = 194; +n1qlLexer.SET = 195; +n1qlLexer.SHOW = 196; +n1qlLexer.SOME = 197; +n1qlLexer.START = 198; +n1qlLexer.STATISTICS = 199; +n1qlLexer.STRING = 200; +n1qlLexer.SYSTEM = 201; +n1qlLexer.THEN = 202; +n1qlLexer.TIES = 203; +n1qlLexer.TO = 204; +n1qlLexer.TRAN = 205; +n1qlLexer.TRANSACTION = 206; +n1qlLexer.TRIGGER = 207; +n1qlLexer.TRUE = 208; +n1qlLexer.TRUNCATE = 209; +n1qlLexer.UNBOUNDED = 210; +n1qlLexer.UNDER = 211; +n1qlLexer.UNION = 212; +n1qlLexer.UNIQUE = 213; +n1qlLexer.UNKNOWN = 214; +n1qlLexer.UNNEST = 215; +n1qlLexer.UNSET = 216; +n1qlLexer.UPDATE = 217; +n1qlLexer.UPSERT = 218; +n1qlLexer.USE = 219; +n1qlLexer.USER = 220; +n1qlLexer.USING = 221; +n1qlLexer.VALIDATE = 222; +n1qlLexer.VALUE = 223; +n1qlLexer.VALUED = 224; +n1qlLexer.VALUES = 225; +n1qlLexer.VIA = 226; +n1qlLexer.VIEW = 227; +n1qlLexer.WHEN = 228; +n1qlLexer.WHERE = 229; +n1qlLexer.WHILE = 230; +n1qlLexer.WINDOW = 231; +n1qlLexer.WITH = 232; +n1qlLexer.WITHIN = 233; +n1qlLexer.WORK = 234; +n1qlLexer.XOR = 235; +n1qlLexer.IDENT_ICASE = 236; +n1qlLexer.IDENT = 237; +n1qlLexer.NAMED_PARAM = 238; +n1qlLexer.POSITIONAL_PARAM = 239; +n1qlLexer.NEXT_PARAM = 240; + +module.exports = n1qlLexer; diff --git a/reverse_engineering/antlr/parser/n1qlLexer.tokens b/reverse_engineering/antlr/parser/n1qlLexer.tokens new file mode 100644 index 0000000..3d957ca --- /dev/null +++ b/reverse_engineering/antlr/parser/n1qlLexer.tokens @@ -0,0 +1,264 @@ +STR=1 +INT=2 +NUM=3 +BLOCK_COMMENT=4 +LINE_COMMENT=5 +WHITESPACE=6 +DOT=7 +PLUS=8 +MINUS=9 +STAR=10 +DIV=11 +MOD=12 +DEQ=13 +EQ=14 +NE=15 +LT=16 +LE=17 +GT=18 +GE=19 +CONCAT=20 +LPAREN=21 +RPAREN=22 +LBRACE=23 +RBRACE=24 +COMMA=25 +COLON=26 +LBRACKET=27 +RBRACKET=28 +RBRACKET_ICASE=29 +SEMI=30 +NOT_A_TOKEN=31 +ADVISE=32 +ALL=33 +ALTER=34 +ANALYZE=35 +AND=36 +ANY=37 +ARRAY=38 +AS=39 +ASC=40 +AT=41 +BEGIN=42 +BETWEEN=43 +BINARY=44 +BOOLEAN=45 +BREAK=46 +BUCKET=47 +BUILD=48 +BY=49 +CALL=50 +CASE=51 +CAST=52 +CLUSTER=53 +COLLATE=54 +COLLECTION=55 +COMMIT=56 +COMMITTED=57 +CONNECT=58 +CONTINUE=59 +CORRELATED=60 +COVER=61 +CREATE=62 +CURRENT=63 +DATABASE=64 +DATASET=65 +DATASTORE=66 +DECLARE=67 +DECREMENT=68 +DELETE_=69 +DERIVED=70 +DESC=71 +DESCRIBE=72 +DISTINCT=73 +DO=74 +DROP=75 +EACH=76 +ELEMENT=77 +ELSE=78 +END=79 +EVERY=80 +EXCEPT=81 +EXCLUDE=82 +EXECUTE=83 +EXISTS=84 +EXPLAIN=85 +FALSE=86 +FETCH=87 +FILTER=88 +FIRST=89 +FLATTEN=90 +FLUSH=91 +FOLLOWING=92 +FOR=93 +FORCE=94 +FROM=95 +FTS=96 +FUNCTION=97 +GOLANG=98 +GRANT=99 +GROUP=100 +GROUPS=101 +GSI=102 +HASH=103 +HAVING=104 +IF=105 +IGNORE=106 +ILIKE=107 +IN=108 +INCLUDE=109 +INCREMENT=110 +INDEX=111 +INFER=112 +INLINE=113 +INNER=114 +INSERT=115 +INTERSECT=116 +INTO=117 +IS=118 +ISOLATION=119 +JAVASCRIPT=120 +JOIN=121 +KEY=122 +KEYS=123 +KEYSPACE=124 +KNOWN=125 +LANGUAGE=126 +LAST=127 +LEFT=128 +LET_=129 +LETTING=130 +LEVEL=131 +LIKE=132 +LIMIT=133 +LSM=134 +MAP=135 +MAPPING=136 +MATCHED=137 +MATERIALIZED=138 +MERGE=139 +MISSING=140 +NAMESPACE=141 +NEST=142 +NL=143 +NO=144 +NOT=145 +NTH_VALUE=146 +NULL=147 +NULLS=148 +NUMBER=149 +OBJECT=150 +OFFSET=151 +ON=152 +OPTION=153 +OPTIONS=154 +OR=155 +ORDER=156 +OTHERS=157 +OUTER=158 +OVER=159 +PARSE=160 +PARTITION=161 +PASSWORD=162 +PATH=163 +POOL=164 +PRECEDING=165 +PREPARE=166 +PRIMARY=167 +PRIVATE=168 +PRIVILEGE=169 +PROCEDURE=170 +PROBE=171 +PUBLIC=172 +RANGE=173 +RAW=174 +READ=175 +REALM=176 +REDUCE=177 +RENAME=178 +REPLACE=179 +RESPECT=180 +RETURN=181 +RETURNING=182 +REVOKE=183 +RIGHT=184 +ROLE=185 +ROLLBACK=186 +ROW=187 +ROWS=188 +SATISFIES=189 +SAVEPOINT=190 +SCHEMA=191 +SCOPE=192 +SELECT=193 +SELF=194 +SET=195 +SHOW=196 +SOME=197 +START=198 +STATISTICS=199 +STRING=200 +SYSTEM=201 +THEN=202 +TIES=203 +TO=204 +TRAN=205 +TRANSACTION=206 +TRIGGER=207 +TRUE=208 +TRUNCATE=209 +UNBOUNDED=210 +UNDER=211 +UNION=212 +UNIQUE=213 +UNKNOWN=214 +UNNEST=215 +UNSET=216 +UPDATE=217 +UPSERT=218 +USE=219 +USER=220 +USING=221 +VALIDATE=222 +VALUE=223 +VALUED=224 +VALUES=225 +VIA=226 +VIEW=227 +WHEN=228 +WHERE=229 +WHILE=230 +WINDOW=231 +WITH=232 +WITHIN=233 +WORK=234 +XOR=235 +IDENT_ICASE=236 +IDENT=237 +NAMED_PARAM=238 +POSITIONAL_PARAM=239 +NEXT_PARAM=240 +'.'=7 +'+'=8 +'*'=10 +'/'=11 +'%'=12 +'=='=13 +'='=14 +'<'=16 +'<='=17 +'>'=18 +'>='=19 +'||'=20 +'('=21 +')'=22 +'{'=23 +'}'=24 +','=25 +':'=26 +'['=27 +']'=28 +']i'=29 +';'=30 +'!'=31 +'?'=240 diff --git a/reverse_engineering/antlr/parser/n1qlParser.js b/reverse_engineering/antlr/parser/n1qlParser.js new file mode 100644 index 0000000..63be8a5 --- /dev/null +++ b/reverse_engineering/antlr/parser/n1qlParser.js @@ -0,0 +1,25232 @@ +// Generated from grammars/n1ql.g4 by ANTLR 4.9.2 +// jshint ignore: start +const antlr4 = require('antlr4'); +const n1qlVisitor = require('./n1qlVisitor'); + +const serializedATN = [ + '\u0003\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786', + '\u5964\u0003\u00f2\u0ae5\u0004\u0002\t\u0002\u0004\u0003\t\u0003\u0004', + '\u0004\t\u0004\u0004\u0005\t\u0005\u0004\u0006\t\u0006\u0004\u0007\t', + '\u0007\u0004\b\t\b\u0004\t\t\t\u0004\n\t\n\u0004\u000b\t\u000b\u0004', + '\f\t\f\u0004\r\t\r\u0004\u000e\t\u000e\u0004\u000f\t\u000f\u0004\u0010', + '\t\u0010\u0004\u0011\t\u0011\u0004\u0012\t\u0012\u0004\u0013\t\u0013', + '\u0004\u0014\t\u0014\u0004\u0015\t\u0015\u0004\u0016\t\u0016\u0004\u0017', + '\t\u0017\u0004\u0018\t\u0018\u0004\u0019\t\u0019\u0004\u001a\t\u001a', + '\u0004\u001b\t\u001b\u0004\u001c\t\u001c\u0004\u001d\t\u001d\u0004\u001e', + '\t\u001e\u0004\u001f\t\u001f\u0004 \t \u0004!\t!\u0004"\t"\u0004#', + "\t#\u0004$\t$\u0004%\t%\u0004&\t&\u0004'\t'\u0004(\t(\u0004)\t)\u0004", + '*\t*\u0004+\t+\u0004,\t,\u0004-\t-\u0004.\t.\u0004/\t/\u00040\t0\u0004', + '1\t1\u00042\t2\u00043\t3\u00044\t4\u00045\t5\u00046\t6\u00047\t7\u0004', + '8\t8\u00049\t9\u0004:\t:\u0004;\t;\u0004<\t<\u0004=\t=\u0004>\t>\u0004', + '?\t?\u0004@\t@\u0004A\tA\u0004B\tB\u0004C\tC\u0004D\tD\u0004E\tE\u0004', + 'F\tF\u0004G\tG\u0004H\tH\u0004I\tI\u0004J\tJ\u0004K\tK\u0004L\tL\u0004', + 'M\tM\u0004N\tN\u0004O\tO\u0004P\tP\u0004Q\tQ\u0004R\tR\u0004S\tS\u0004', + 'T\tT\u0004U\tU\u0004V\tV\u0004W\tW\u0004X\tX\u0004Y\tY\u0004Z\tZ\u0004', + '[\t[\u0004\\\t\\\u0004]\t]\u0004^\t^\u0004_\t_\u0004`\t`\u0004a\ta\u0004', + 'b\tb\u0004c\tc\u0004d\td\u0004e\te\u0004f\tf\u0004g\tg\u0004h\th\u0004', + 'i\ti\u0004j\tj\u0004k\tk\u0004l\tl\u0004m\tm\u0004n\tn\u0004o\to\u0004', + 'p\tp\u0004q\tq\u0004r\tr\u0004s\ts\u0004t\tt\u0004u\tu\u0004v\tv\u0004', + 'w\tw\u0004x\tx\u0004y\ty\u0004z\tz\u0004{\t{\u0004|\t|\u0004}\t}\u0004', + '~\t~\u0004\u007f\t\u007f\u0004\u0080\t\u0080\u0004\u0081\t\u0081\u0004', + '\u0082\t\u0082\u0004\u0083\t\u0083\u0004\u0084\t\u0084\u0004\u0085\t', + '\u0085\u0004\u0086\t\u0086\u0004\u0087\t\u0087\u0004\u0088\t\u0088\u0004', + '\u0089\t\u0089\u0004\u008a\t\u008a\u0004\u008b\t\u008b\u0004\u008c\t', + '\u008c\u0004\u008d\t\u008d\u0004\u008e\t\u008e\u0004\u008f\t\u008f\u0004', + '\u0090\t\u0090\u0004\u0091\t\u0091\u0004\u0092\t\u0092\u0004\u0093\t', + '\u0093\u0004\u0094\t\u0094\u0004\u0095\t\u0095\u0004\u0096\t\u0096\u0004', + '\u0097\t\u0097\u0004\u0098\t\u0098\u0004\u0099\t\u0099\u0004\u009a\t', + '\u009a\u0004\u009b\t\u009b\u0004\u009c\t\u009c\u0004\u009d\t\u009d\u0004', + '\u009e\t\u009e\u0004\u009f\t\u009f\u0004\u00a0\t\u00a0\u0004\u00a1\t', + '\u00a1\u0004\u00a2\t\u00a2\u0004\u00a3\t\u00a3\u0004\u00a4\t\u00a4\u0004', + '\u00a5\t\u00a5\u0004\u00a6\t\u00a6\u0004\u00a7\t\u00a7\u0004\u00a8\t', + '\u00a8\u0004\u00a9\t\u00a9\u0004\u00aa\t\u00aa\u0004\u00ab\t\u00ab\u0004', + '\u00ac\t\u00ac\u0004\u00ad\t\u00ad\u0004\u00ae\t\u00ae\u0004\u00af\t', + '\u00af\u0004\u00b0\t\u00b0\u0004\u00b1\t\u00b1\u0004\u00b2\t\u00b2\u0004', + '\u00b3\t\u00b3\u0004\u00b4\t\u00b4\u0004\u00b5\t\u00b5\u0004\u00b6\t', + '\u00b6\u0004\u00b7\t\u00b7\u0004\u00b8\t\u00b8\u0004\u00b9\t\u00b9\u0004', + '\u00ba\t\u00ba\u0004\u00bb\t\u00bb\u0004\u00bc\t\u00bc\u0004\u00bd\t', + '\u00bd\u0004\u00be\t\u00be\u0004\u00bf\t\u00bf\u0004\u00c0\t\u00c0\u0004', + '\u00c1\t\u00c1\u0004\u00c2\t\u00c2\u0004\u00c3\t\u00c3\u0004\u00c4\t', + '\u00c4\u0004\u00c5\t\u00c5\u0004\u00c6\t\u00c6\u0004\u00c7\t\u00c7\u0004', + '\u00c8\t\u00c8\u0004\u00c9\t\u00c9\u0004\u00ca\t\u00ca\u0004\u00cb\t', + '\u00cb\u0004\u00cc\t\u00cc\u0004\u00cd\t\u00cd\u0004\u00ce\t\u00ce\u0004', + '\u00cf\t\u00cf\u0004\u00d0\t\u00d0\u0004\u00d1\t\u00d1\u0004\u00d2\t', + '\u00d2\u0004\u00d3\t\u00d3\u0004\u00d4\t\u00d4\u0004\u00d5\t\u00d5\u0004', + '\u00d6\t\u00d6\u0004\u00d7\t\u00d7\u0004\u00d8\t\u00d8\u0004\u00d9\t', + '\u00d9\u0004\u00da\t\u00da\u0004\u00db\t\u00db\u0004\u00dc\t\u00dc\u0004', + '\u00dd\t\u00dd\u0004\u00de\t\u00de\u0004\u00df\t\u00df\u0004\u00e0\t', + '\u00e0\u0004\u00e1\t\u00e1\u0004\u00e2\t\u00e2\u0004\u00e3\t\u00e3\u0004', + '\u00e4\t\u00e4\u0004\u00e5\t\u00e5\u0004\u00e6\t\u00e6\u0004\u00e7\t', + '\u00e7\u0004\u00e8\t\u00e8\u0004\u00e9\t\u00e9\u0004\u00ea\t\u00ea\u0004', + '\u00eb\t\u00eb\u0004\u00ec\t\u00ec\u0004\u00ed\t\u00ed\u0004\u00ee\t', + '\u00ee\u0004\u00ef\t\u00ef\u0004\u00f0\t\u00f0\u0004\u00f1\t\u00f1\u0004', + '\u00f2\t\u00f2\u0004\u00f3\t\u00f3\u0004\u00f4\t\u00f4\u0004\u00f5\t', + '\u00f5\u0004\u00f6\t\u00f6\u0004\u00f7\t\u00f7\u0004\u00f8\t\u00f8\u0004', + '\u00f9\t\u00f9\u0004\u00fa\t\u00fa\u0004\u00fb\t\u00fb\u0004\u00fc\t', + '\u00fc\u0004\u00fd\t\u00fd\u0004\u00fe\t\u00fe\u0004\u00ff\t\u00ff\u0004', + '\u0100\t\u0100\u0004\u0101\t\u0101\u0004\u0102\t\u0102\u0004\u0103\t', + '\u0103\u0004\u0104\t\u0104\u0004\u0105\t\u0105\u0004\u0106\t\u0106\u0003', + '\u0002\u0003\u0002\u0007\u0002\u020f\n\u0002\f\u0002\u000e\u0002\u0212', + '\u000b\u0002\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0005\u0003', + '\u0218\n\u0003\u0003\u0004\u0003\u0004\u0003\u0004\u0007\u0004\u021d', + '\n\u0004\f\u0004\u000e\u0004\u0220\u000b\u0004\u0003\u0005\u0003\u0005', + '\u0003\u0005\u0003\u0005\u0003\u0005\u0005\u0005\u0227\n\u0005\u0003', + '\u0006\u0003\u0006\u0003\u0006\u0003\u0006\u0003\u0006\u0003\u0006\u0003', + '\u0006\u0003\u0006\u0005\u0006\u0231\n\u0006\u0003\u0007\u0003\u0007', + '\u0003\u0007\u0003\u0007\u0003\b\u0003\b\u0005\b\u0239\n\b\u0003\t\u0003', + '\t\u0003\t\u0003\n\u0003\n\u0003\n\u0003\n\u0003\n\u0003\u000b\u0003', + '\u000b\u0005\u000b\u0245\n\u000b\u0003\f\u0003\f\u0003\f\u0003\f\u0003', + '\f\u0005\f\u024c\n\f\u0003\r\u0003\r\u0003\u000e\u0003\u000e\u0003\u000e', + '\u0003\u000e\u0003\u000f\u0003\u000f\u0003\u000f\u0005\u000f\u0257\n', + '\u000f\u0003\u0010\u0003\u0010\u0003\u0010\u0003\u0010\u0003\u0010\u0003', + '\u0010\u0003\u0011\u0003\u0011\u0003\u0011\u0005\u0011\u0262\n\u0011', + '\u0003\u0012\u0003\u0012\u0003\u0013\u0003\u0013\u0005\u0013\u0268\n', + '\u0013\u0003\u0014\u0003\u0014\u0003\u0014\u0003\u0015\u0003\u0015\u0003', + '\u0016\u0003\u0016\u0003\u0016\u0003\u0016\u0003\u0016\u0005\u0016\u0274', + '\n\u0016\u0003\u0017\u0003\u0017\u0003\u0017\u0005\u0017\u0279\n\u0017', + '\u0003\u0018\u0003\u0018\u0005\u0018\u027d\n\u0018\u0003\u0019\u0003', + '\u0019\u0003\u0019\u0003\u0019\u0003\u0019\u0005\u0019\u0284\n\u0019', + '\u0003\u001a\u0003\u001a\u0005\u001a\u0288\n\u001a\u0003\u001b\u0003', + '\u001b\u0003\u001b\u0005\u001b\u028d\n\u001b\u0003\u001c\u0003\u001c', + '\u0003\u001c\u0005\u001c\u0292\n\u001c\u0003\u001d\u0003\u001d\u0003', + '\u001d\u0003\u001d\u0003\u001d\u0005\u001d\u0299\n\u001d\u0003\u001e', + '\u0003\u001e\u0003\u001e\u0003\u001e\u0003\u001e\u0003\u001e\u0003\u001e', + '\u0003\u001e\u0003\u001e\u0003\u001e\u0003\u001e\u0003\u001e\u0003\u001e', + '\u0005\u001e\u02a8\n\u001e\u0003\u001f\u0003\u001f\u0003\u001f\u0003', + '\u001f\u0003\u001f\u0003\u001f\u0003\u001f\u0003\u001f\u0003\u001f\u0003', + '\u001f\u0003\u001f\u0003\u001f\u0003\u001f\u0003\u001f\u0003\u001f\u0003', + '\u001f\u0003\u001f\u0003\u001f\u0003\u001f\u0003\u001f\u0003\u001f\u0003', + '\u001f\u0003\u001f\u0003\u001f\u0003\u001f\u0003\u001f\u0003\u001f\u0003', + '\u001f\u0003\u001f\u0005\u001f\u02c7\n\u001f\u0003\u001f\u0003\u001f', + '\u0003\u001f\u0003\u001f\u0003\u001f\u0003\u001f\u0003\u001f\u0003\u001f', + '\u0003\u001f\u0003\u001f\u0003\u001f\u0003\u001f\u0003\u001f\u0003\u001f', + '\u0003\u001f\u0003\u001f\u0003\u001f\u0003\u001f\u0003\u001f\u0003\u001f', + '\u0003\u001f\u0007\u001f\u02de\n\u001f\f\u001f\u000e\u001f\u02e1\u000b', + '\u001f\u0003 \u0003 \u0005 \u02e5\n \u0003!\u0003!\u0005!\u02e9\n!\u0003', + '"\u0003"\u0003"\u0003"\u0003"\u0003"\u0003"\u0003"\u0003#\u0003', + '#\u0003#\u0003#\u0003#\u0003#\u0003#\u0003#\u0003$\u0003$\u0003$\u0003', + '%\u0003%\u0003%\u0003%\u0003%\u0003%\u0003%\u0003%\u0005%\u0306\n%\u0003', + "&\u0003&\u0003&\u0005&\u030b\n&\u0003'\u0003'\u0003(\u0003(\u0003", + '(\u0003(\u0003(\u0003(\u0007(\u0315\n(\f(\u000e(\u0318\u000b(\u0003', + ')\u0003)\u0003)\u0003)\u0003)\u0003)\u0003)\u0003)\u0005)\u0322\n)\u0003', + '*\u0003*\u0005*\u0326\n*\u0003+\u0003+\u0003+\u0005+\u032b\n+\u0003', + ',\u0003,\u0003-\u0003-\u0005-\u0331\n-\u0003.\u0003.\u0003.\u0003/\u0003', + '/\u0003/\u0003/\u0003/\u0003/\u0003/\u0003/\u0003/\u0003/\u0005/\u0340', + '\n/\u0003/\u0003/\u0003/\u0003/\u0003/\u0003/\u0003/\u0003/\u0003/\u0003', + '/\u0003/\u0003/\u0003/\u0003/\u0003/\u0003/\u0003/\u0003/\u0003/\u0003', + '/\u0003/\u0003/\u0003/\u0003/\u0003/\u0003/\u0003/\u0003/\u0003/\u0003', + '/\u0003/\u0003/\u0003/\u0003/\u0003/\u0003/\u0003/\u0003/\u0003/\u0003', + '/\u0003/\u0003/\u0003/\u0003/\u0003/\u0003/\u0003/\u0003/\u0007/\u0372', + '\n/\f/\u000e/\u0375\u000b/\u00030\u00030\u00030\u00030\u00030\u0005', + '0\u037c\n0\u00031\u00031\u00032\u00032\u00032\u00032\u00033\u00033\u0003', + '3\u00033\u00033\u00033\u00033\u00033\u00033\u00033\u00053\u038e\n3\u0003', + '4\u00034\u00034\u00054\u0393\n4\u00035\u00035\u00035\u00036\u00036\u0003', + '7\u00037\u00038\u00038\u00039\u00039\u00039\u00059\u03a1\n9\u0003:\u0003', + ':\u0003:\u0003:\u0003:\u0003:\u0003:\u0003:\u0003:\u0003:\u0003:\u0003', + ':\u0003:\u0003:\u0003:\u0005:\u03b2\n:\u0003;\u0003;\u0003;\u0003;\u0003', + '<\u0003<\u0003<\u0003<\u0003<\u0003=\u0003=\u0003=\u0003=\u0003=\u0003', + '=\u0005=\u03c3\n=\u0003>\u0003>\u0005>\u03c7\n>\u0003?\u0003?\u0003', + '?\u0003?\u0003?\u0003?\u0007?\u03cf\n?\f?\u000e?\u03d2\u000b?\u0003', + '@\u0003@\u0003@\u0003A\u0003A\u0003B\u0003B\u0003C\u0003C\u0003C\u0003', + 'C\u0005C\u03df\nC\u0003D\u0003D\u0005D\u03e3\nD\u0003E\u0003E\u0003', + 'E\u0003E\u0003E\u0003F\u0003F\u0003F\u0003F\u0003F\u0003G\u0003G\u0005', + 'G\u03f1\nG\u0003H\u0003H\u0003H\u0003I\u0003I\u0003I\u0003I\u0003I\u0003', + 'I\u0007I\u03fc\nI\fI\u000eI\u03ff\u000bI\u0003J\u0003J\u0003J\u0003', + 'J\u0003K\u0003K\u0003K\u0005K\u0408\nK\u0003L\u0003L\u0003L\u0003L\u0003', + 'L\u0003L\u0007L\u0410\nL\fL\u000eL\u0413\u000bL\u0003M\u0003M\u0003', + 'M\u0003M\u0003N\u0003N\u0005N\u041b\nN\u0003O\u0003O\u0003O\u0003P\u0003', + 'P\u0005P\u0422\nP\u0003Q\u0003Q\u0003Q\u0003Q\u0003Q\u0003Q\u0003Q\u0005', + 'Q\u042b\nQ\u0003R\u0003R\u0003R\u0003R\u0003R\u0003R\u0007R\u0433\n', + 'R\fR\u000eR\u0436\u000bR\u0003S\u0003S\u0003S\u0003T\u0003T\u0005T\u043d', + '\nT\u0003U\u0003U\u0003U\u0003V\u0003V\u0005V\u0444\nV\u0003W\u0003', + 'W\u0003W\u0003X\u0003X\u0005X\u044b\nX\u0003Y\u0003Y\u0003Y\u0003Y\u0003', + 'Z\u0003Z\u0003Z\u0003Z\u0003Z\u0003Z\u0007Z\u0457\nZ\fZ\u000eZ\u045a', + '\u000bZ\u0003[\u0003[\u0003[\u0003[\u0003\\\u0003\\\u0005\\\u0462\n', + '\\\u0003]\u0003]\u0003^\u0003^\u0003^\u0003^\u0005^\u046a\n^\u0003_', + '\u0003_\u0003`\u0003`\u0003a\u0003a\u0005a\u0472\na\u0003b\u0003b\u0003', + 'b\u0003c\u0003c\u0005c\u0479\nc\u0003d\u0003d\u0003d\u0003e\u0003e\u0003', + 'e\u0003e\u0003e\u0003e\u0003e\u0003e\u0003e\u0003e\u0003e\u0003e\u0003', + 'e\u0003e\u0003e\u0003e\u0005e\u048e\ne\u0003f\u0003f\u0003f\u0003f\u0003', + 'f\u0003f\u0003f\u0003f\u0003f\u0003f\u0003f\u0003f\u0003f\u0005f\u049d', + '\nf\u0003g\u0003g\u0003g\u0003g\u0005g\u04a3\ng\u0003h\u0003h\u0003', + 'h\u0003h\u0003h\u0003h\u0003h\u0003h\u0003h\u0003h\u0003h\u0003h\u0003', + 'h\u0003h\u0003h\u0003h\u0003h\u0005h\u04b6\nh\u0003i\u0003i\u0003i\u0003', + 'j\u0003j\u0003j\u0003j\u0003j\u0003j\u0007j\u04c1\nj\fj\u000ej\u04c4', + '\u000bj\u0003k\u0003k\u0003k\u0003k\u0005k\u04ca\nk\u0003l\u0003l\u0003', + 'l\u0005l\u04cf\nl\u0003m\u0003m\u0003m\u0003m\u0003m\u0003m\u0003n\u0003', + 'n\u0003n\u0003n\u0003n\u0003n\u0003n\u0003n\u0003o\u0003o\u0005o\u04e1', + '\no\u0003p\u0003p\u0003p\u0003q\u0003q\u0003q\u0003q\u0005q\u04ea\n', + 'q\u0003r\u0003r\u0003r\u0003s\u0003s\u0003s\u0003t\u0003t\u0003t\u0003', + 'u\u0003u\u0003u\u0003u\u0003u\u0003u\u0003u\u0003u\u0003u\u0003u\u0003', + 'u\u0003u\u0003u\u0003u\u0003u\u0005u\u0504\nu\u0003v\u0003v\u0003v\u0003', + 'v\u0003v\u0003v\u0003v\u0003v\u0003v\u0003v\u0003v\u0003v\u0003v\u0003', + 'v\u0003v\u0003v\u0005v\u0516\nv\u0003w\u0003w\u0003w\u0003w\u0003w\u0003', + 'w\u0003w\u0003w\u0003x\u0003x\u0003x\u0003x\u0003x\u0003x\u0003x\u0003', + 'x\u0003x\u0003x\u0003x\u0003x\u0003x\u0003x\u0003x\u0003x\u0003x\u0003', + 'x\u0003x\u0003x\u0003x\u0003x\u0003x\u0003x\u0003x\u0005x\u0539\nx\u0003', + 'y\u0003y\u0003y\u0003z\u0003z\u0003z\u0003z\u0003z\u0003z\u0007z\u0544', + '\nz\fz\u000ez\u0547\u000bz\u0003{\u0003{\u0003{\u0003{\u0003{\u0003', + '{\u0003{\u0003{\u0003{\u0003{\u0003{\u0005{\u0554\n{\u0003|\u0003|\u0003', + '|\u0003|\u0003|\u0003}\u0003}\u0005}\u055d\n}\u0003~\u0003~\u0003~\u0003', + '~\u0003\u007f\u0003\u007f\u0003\u007f\u0003\u007f\u0003\u007f\u0003', + '\u007f\u0003\u007f\u0007\u007f\u056a\n\u007f\f\u007f\u000e\u007f\u056d', + '\u000b\u007f\u0003\u0080\u0003\u0080\u0003\u0080\u0003\u0080\u0003\u0080', + '\u0003\u0080\u0007\u0080\u0575\n\u0080\f\u0080\u000e\u0080\u0578\u000b', + '\u0080\u0003\u0081\u0003\u0081\u0003\u0081\u0003\u0081\u0003\u0081\u0003', + '\u0081\u0003\u0081\u0003\u0081\u0003\u0081\u0003\u0081\u0003\u0081\u0003', + '\u0081\u0003\u0081\u0003\u0081\u0003\u0081\u0003\u0081\u0003\u0081\u0003', + '\u0081\u0003\u0081\u0003\u0081\u0005\u0081\u058e\n\u0081\u0003\u0082', + '\u0003\u0082\u0003\u0083\u0003\u0083\u0003\u0083\u0005\u0083\u0595\n', + '\u0083\u0003\u0084\u0003\u0084\u0003\u0084\u0003\u0085\u0003\u0085\u0003', + '\u0085\u0003\u0085\u0003\u0085\u0003\u0085\u0007\u0085\u05a0\n\u0085', + '\f\u0085\u000e\u0085\u05a3\u000b\u0085\u0003\u0086\u0003\u0086\u0003', + '\u0086\u0003\u0087\u0003\u0087\u0003\u0087\u0003\u0087\u0003\u0087\u0003', + '\u0087\u0003\u0087\u0003\u0087\u0003\u0087\u0003\u0087\u0003\u0087\u0003', + '\u0087\u0003\u0087\u0003\u0088\u0003\u0088\u0003\u0089\u0003\u0089\u0005', + '\u0089\u05b9\n\u0089\u0003\u008a\u0003\u008a\u0003\u008a\u0003\u008a', + '\u0003\u008a\u0003\u008a\u0003\u008a\u0003\u008a\u0003\u008a\u0003\u008a', + '\u0003\u008a\u0003\u008a\u0003\u008a\u0003\u008a\u0003\u008a\u0003\u008a', + '\u0003\u008a\u0003\u008a\u0003\u008a\u0003\u008a\u0003\u008a\u0005\u008a', + '\u05d0\n\u008a\u0003\u008b\u0003\u008b\u0003\u008b\u0003\u008b\u0003', + '\u008b\u0003\u008b\u0003\u008b\u0003\u008b\u0003\u008b\u0003\u008b\u0003', + '\u008b\u0003\u008b\u0003\u008b\u0003\u008b\u0005\u008b\u05e0\n\u008b', + '\u0003\u008c\u0003\u008c\u0003\u008c\u0003\u008c\u0003\u008c\u0003\u008c', + '\u0003\u008c\u0005\u008c\u05e9\n\u008c\u0003\u008d\u0003\u008d\u0003', + '\u008d\u0003\u008d\u0003\u008d\u0003\u008d\u0003\u008d\u0003\u008d\u0003', + '\u008d\u0003\u008d\u0005\u008d\u05f5\n\u008d\u0003\u008e\u0003\u008e', + '\u0003\u008f\u0003\u008f\u0003\u008f\u0003\u008f\u0003\u008f\u0003\u008f', + '\u0003\u008f\u0003\u008f\u0003\u008f\u0003\u008f\u0003\u008f\u0003\u008f', + '\u0003\u008f\u0003\u008f\u0005\u008f\u0607\n\u008f\u0003\u0090\u0003', + '\u0090\u0003\u0090\u0003\u0090\u0003\u0090\u0003\u0090\u0003\u0090\u0003', + '\u0090\u0003\u0090\u0003\u0090\u0003\u0090\u0003\u0090\u0005\u0090\u0615', + '\n\u0090\u0003\u0091\u0003\u0091\u0003\u0091\u0003\u0091\u0003\u0091', + '\u0003\u0091\u0007\u0091\u061d\n\u0091\f\u0091\u000e\u0091\u0620\u000b', + '\u0091\u0003\u0092\u0003\u0092\u0003\u0093\u0003\u0093\u0003\u0093\u0003', + '\u0093\u0003\u0093\u0003\u0093\u0007\u0093\u062a\n\u0093\f\u0093\u000e', + '\u0093\u062d\u000b\u0093\u0003\u0094\u0003\u0094\u0003\u0094\u0003\u0094', + '\u0003\u0094\u0003\u0094\u0003\u0094\u0003\u0094\u0003\u0094\u0003\u0094', + '\u0003\u0094\u0003\u0094\u0003\u0094\u0003\u0094\u0003\u0094\u0003\u0094', + '\u0003\u0094\u0003\u0094\u0003\u0094\u0003\u0094\u0003\u0094\u0003\u0094', + '\u0003\u0094\u0003\u0094\u0003\u0094\u0003\u0094\u0005\u0094\u0649\n', + '\u0094\u0003\u0095\u0003\u0095\u0003\u0095\u0003\u0095\u0003\u0095\u0003', + '\u0095\u0007\u0095\u0651\n\u0095\f\u0095\u000e\u0095\u0654\u000b\u0095', + '\u0003\u0096\u0003\u0096\u0003\u0096\u0003\u0096\u0005\u0096\u065a\n', + '\u0096\u0003\u0097\u0003\u0097\u0003\u0097\u0003\u0097\u0003\u0097\u0003', + '\u0097\u0003\u0097\u0003\u0097\u0003\u0097\u0003\u0097\u0003\u0097\u0003', + '\u0097\u0005\u0097\u0668\n\u0097\u0003\u0098\u0003\u0098\u0003\u0098', + '\u0003\u0098\u0005\u0098\u066e\n\u0098\u0003\u0099\u0003\u0099\u0003', + '\u0099\u0003\u0099\u0005\u0099\u0674\n\u0099\u0003\u009a\u0003\u009a', + '\u0003\u009a\u0003\u009a\u0005\u009a\u067a\n\u009a\u0003\u009b\u0003', + '\u009b\u0003\u009b\u0003\u009b\u0005\u009b\u0680\n\u009b\u0003\u009c', + '\u0003\u009c\u0003\u009c\u0003\u009c\u0003\u009d\u0003\u009d\u0003\u009e', + '\u0003\u009e\u0003\u009e\u0003\u009e\u0003\u009e\u0003\u009e\u0003\u009e', + '\u0003\u009e\u0003\u009e\u0003\u009e\u0003\u009e\u0003\u009e\u0003\u009e', + '\u0005\u009e\u0695\n\u009e\u0003\u009f\u0003\u009f\u0003\u009f\u0003', + '\u009f\u0003\u009f\u0003\u009f\u0003\u009f\u0003\u009f\u0003\u009f\u0003', + '\u009f\u0005\u009f\u06a1\n\u009f\u0003\u00a0\u0003\u00a0\u0005\u00a0', + '\u06a5\n\u00a0\u0003\u00a1\u0003\u00a1\u0003\u00a2\u0003\u00a2\u0005', + '\u00a2\u06ab\n\u00a2\u0003\u00a3\u0003\u00a3\u0003\u00a3\u0003\u00a3', + '\u0003\u00a3\u0003\u00a3\u0003\u00a3\u0003\u00a3\u0003\u00a3\u0003\u00a3', + '\u0005\u00a3\u06b7\n\u00a3\u0003\u00a4\u0003\u00a4\u0003\u00a4\u0003', + '\u00a4\u0003\u00a4\u0003\u00a4\u0003\u00a4\u0003\u00a4\u0005\u00a4\u06c1', + '\n\u00a4\u0003\u00a5\u0003\u00a5\u0003\u00a5\u0003\u00a5\u0003\u00a5', + '\u0003\u00a5\u0003\u00a5\u0003\u00a5\u0003\u00a5\u0005\u00a5\u06cc\n', + '\u00a5\u0003\u00a6\u0003\u00a6\u0003\u00a6\u0003\u00a6\u0003\u00a6\u0003', + '\u00a6\u0003\u00a6\u0003\u00a6\u0005\u00a6\u06d6\n\u00a6\u0003\u00a7', + '\u0003\u00a7\u0005\u00a7\u06da\n\u00a7\u0003\u00a8\u0003\u00a8\u0003', + '\u00a8\u0003\u00a8\u0003\u00a8\u0003\u00a8\u0005\u00a8\u06e2\n\u00a8', + '\u0003\u00a9\u0003\u00a9\u0005\u00a9\u06e6\n\u00a9\u0003\u00aa\u0003', + '\u00aa\u0003\u00aa\u0003\u00ab\u0003\u00ab\u0003\u00ab\u0003\u00ab\u0003', + '\u00ab\u0003\u00ab\u0007\u00ab\u06f1\n\u00ab\f\u00ab\u000e\u00ab\u06f4', + '\u000b\u00ab\u0003\u00ac\u0003\u00ac\u0003\u00ac\u0003\u00ad\u0003\u00ad', + '\u0003\u00ad\u0003\u00ad\u0003\u00ad\u0003\u00ad\u0003\u00ad\u0003\u00ad', + '\u0003\u00ad\u0003\u00ad\u0005\u00ad\u0703\n\u00ad\u0003\u00ae\u0003', + '\u00ae\u0003\u00af\u0003\u00af\u0003\u00b0\u0003\u00b0\u0003\u00b0\u0005', + '\u00b0\u070c\n\u00b0\u0003\u00b1\u0003\u00b1\u0003\u00b1\u0003\u00b1', + '\u0003\u00b1\u0005\u00b1\u0713\n\u00b1\u0003\u00b2\u0003\u00b2\u0003', + '\u00b3\u0003\u00b3\u0003\u00b3\u0003\u00b3\u0003\u00b3\u0003\u00b3\u0003', + '\u00b3\u0003\u00b3\u0003\u00b3\u0003\u00b3\u0003\u00b3\u0003\u00b3\u0003', + '\u00b3\u0003\u00b3\u0003\u00b3\u0003\u00b3\u0003\u00b3\u0003\u00b3\u0003', + '\u00b3\u0003\u00b3\u0003\u00b3\u0005\u00b3\u072c\n\u00b3\u0003\u00b4', + '\u0003\u00b4\u0003\u00b4\u0003\u00b4\u0003\u00b4\u0003\u00b4\u0003\u00b4', + '\u0003\u00b4\u0003\u00b4\u0003\u00b4\u0003\u00b4\u0003\u00b4\u0003\u00b4', + '\u0003\u00b4\u0003\u00b4\u0003\u00b4\u0005\u00b4\u073e\n\u00b4\u0003', + '\u00b5\u0003\u00b5\u0003\u00b5\u0003\u00b5\u0003\u00b5\u0003\u00b5\u0003', + '\u00b5\u0003\u00b5\u0003\u00b5\u0003\u00b6\u0003\u00b6\u0003\u00b6\u0003', + '\u00b6\u0003\u00b6\u0003\u00b6\u0003\u00b6\u0003\u00b6\u0003\u00b6\u0003', + '\u00b7\u0003\u00b7\u0003\u00b7\u0005\u00b7\u0755\n\u00b7\u0003\u00b8', + '\u0003\u00b8\u0005\u00b8\u0759\n\u00b8\u0003\u00b9\u0003\u00b9\u0003', + '\u00ba\u0003\u00ba\u0003\u00ba\u0003\u00ba\u0003\u00ba\u0003\u00ba\u0003', + '\u00ba\u0003\u00ba\u0003\u00ba\u0003\u00ba\u0005\u00ba\u0767\n\u00ba', + '\u0003\u00bb\u0003\u00bb\u0003\u00bb\u0003\u00bb\u0003\u00bb\u0005\u00bb', + '\u076e\n\u00bb\u0003\u00bc\u0003\u00bc\u0003\u00bc\u0003\u00bc\u0003', + '\u00bc\u0003\u00bc\u0007\u00bc\u0776\n\u00bc\f\u00bc\u000e\u00bc\u0779', + '\u000b\u00bc\u0003\u00bd\u0003\u00bd\u0003\u00bd\u0003\u00bd\u0003\u00bd', + '\u0003\u00bd\u0003\u00bd\u0003\u00bd\u0003\u00bd\u0003\u00bd\u0003\u00bd', + '\u0003\u00bd\u0003\u00bd\u0003\u00bd\u0003\u00bd\u0003\u00bd\u0003\u00bd', + '\u0003\u00bd\u0003\u00bd\u0003\u00bd\u0005\u00bd\u078f\n\u00bd\u0003', + '\u00be\u0003\u00be\u0003\u00be\u0003\u00be\u0003\u00bf\u0003\u00bf\u0003', + '\u00bf\u0003\u00bf\u0003\u00bf\u0003\u00bf\u0003\u00bf\u0003\u00c0\u0003', + '\u00c0\u0003\u00c0\u0003\u00c0\u0003\u00c0\u0003\u00c0\u0003\u00c0\u0003', + '\u00c0\u0003\u00c0\u0003\u00c0\u0003\u00c0\u0003\u00c0\u0003\u00c0\u0003', + '\u00c0\u0003\u00c0\u0003\u00c0\u0003\u00c0\u0003\u00c0\u0003\u00c0\u0003', + '\u00c0\u0003\u00c0\u0003\u00c0\u0003\u00c0\u0003\u00c0\u0003\u00c0\u0003', + '\u00c0\u0003\u00c0\u0003\u00c0\u0003\u00c0\u0003\u00c0\u0003\u00c0\u0003', + '\u00c0\u0003\u00c0\u0003\u00c0\u0003\u00c0\u0003\u00c0\u0003\u00c0\u0003', + '\u00c0\u0003\u00c0\u0003\u00c0\u0003\u00c0\u0003\u00c0\u0003\u00c0\u0003', + '\u00c0\u0003\u00c0\u0003\u00c0\u0003\u00c0\u0003\u00c0\u0003\u00c0\u0003', + '\u00c0\u0003\u00c0\u0003\u00c0\u0003\u00c0\u0003\u00c0\u0003\u00c0\u0003', + '\u00c0\u0003\u00c0\u0003\u00c0\u0003\u00c0\u0003\u00c0\u0003\u00c0\u0003', + '\u00c0\u0003\u00c0\u0003\u00c0\u0003\u00c0\u0003\u00c0\u0003\u00c0\u0003', + '\u00c0\u0003\u00c0\u0003\u00c0\u0003\u00c0\u0003\u00c0\u0003\u00c0\u0003', + '\u00c0\u0003\u00c0\u0003\u00c0\u0003\u00c0\u0003\u00c0\u0003\u00c0\u0003', + '\u00c0\u0003\u00c0\u0003\u00c0\u0003\u00c0\u0003\u00c0\u0003\u00c0\u0003', + '\u00c0\u0003\u00c0\u0003\u00c0\u0003\u00c0\u0003\u00c0\u0003\u00c0\u0003', + '\u00c0\u0003\u00c0\u0003\u00c0\u0003\u00c0\u0003\u00c0\u0003\u00c0\u0003', + '\u00c0\u0003\u00c0\u0003\u00c0\u0003\u00c0\u0003\u00c0\u0003\u00c0\u0003', + '\u00c0\u0003\u00c0\u0003\u00c0\u0003\u00c0\u0003\u00c0\u0003\u00c0\u0003', + '\u00c0\u0003\u00c0\u0003\u00c0\u0003\u00c0\u0003\u00c0\u0003\u00c0\u0003', + '\u00c0\u0003\u00c0\u0003\u00c0\u0003\u00c0\u0003\u00c0\u0003\u00c0\u0003', + '\u00c0\u0005\u00c0\u0816\n\u00c0\u0003\u00c1\u0003\u00c1\u0005\u00c1', + '\u081a\n\u00c1\u0003\u00c2\u0003\u00c2\u0003\u00c2\u0003\u00c2\u0003', + '\u00c2\u0003\u00c2\u0007\u00c2\u0822\n\u00c2\f\u00c2\u000e\u00c2\u0825', + '\u000b\u00c2\u0003\u00c3\u0003\u00c3\u0003\u00c4\u0003\u00c4\u0003\u00c4', + '\u0003\u00c4\u0003\u00c4\u0003\u00c4\u0003\u00c4\u0003\u00c4\u0003\u00c4', + '\u0003\u00c4\u0003\u00c4\u0003\u00c4\u0003\u00c4\u0003\u00c4\u0003\u00c4', + '\u0003\u00c4\u0003\u00c4\u0003\u00c4\u0003\u00c4\u0003\u00c4\u0003\u00c4', + '\u0003\u00c4\u0003\u00c4\u0003\u00c4\u0003\u00c4\u0003\u00c4\u0007\u00c4', + '\u0843\n\u00c4\f\u00c4\u000e\u00c4\u0846\u000b\u00c4\u0003\u00c5\u0003', + '\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0005\u00c5\u084e', + '\n\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5', + '\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5', + '\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5', + '\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5', + '\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5', + '\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5', + '\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5', + '\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5', + '\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5', + '\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5', + '\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5', + '\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5', + '\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5', + '\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5', + '\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5', + '\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5', + '\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5', + '\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5', + '\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5', + '\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5', + '\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5', + '\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5', + '\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0003\u00c5', + '\u0003\u00c5\u0003\u00c5\u0003\u00c5\u0007\u00c5\u08dc\n\u00c5\f\u00c5', + '\u000e\u00c5\u08df\u000b\u00c5\u0003\u00c6\u0003\u00c6\u0003\u00c7\u0003', + '\u00c7\u0003\u00c7\u0003\u00c7\u0003\u00c7\u0003\u00c7\u0003\u00c7\u0003', + '\u00c7\u0003\u00c7\u0003\u00c7\u0003\u00c7\u0003\u00c7\u0003\u00c7\u0003', + '\u00c7\u0003\u00c7\u0003\u00c7\u0005\u00c7\u08f3\n\u00c7\u0003\u00c8', + '\u0003\u00c8\u0003\u00c8\u0003\u00c8\u0003\u00c8\u0003\u00c8\u0003\u00c8', + '\u0003\u00c8\u0003\u00c8\u0003\u00c8\u0003\u00c8\u0003\u00c8\u0003\u00c8', + '\u0003\u00c8\u0003\u00c8\u0003\u00c8\u0003\u00c8\u0003\u00c8\u0003\u00c8', + '\u0003\u00c8\u0003\u00c8\u0003\u00c8\u0003\u00c8\u0003\u00c8\u0003\u00c8', + '\u0003\u00c8\u0003\u00c8\u0003\u00c8\u0003\u00c8\u0003\u00c8\u0003\u00c8', + '\u0003\u00c8\u0003\u00c8\u0003\u00c8\u0003\u00c8\u0003\u00c8\u0003\u00c8', + '\u0003\u00c8\u0003\u00c8\u0003\u00c8\u0003\u00c8\u0003\u00c8\u0003\u00c8', + '\u0003\u00c8\u0003\u00c8\u0003\u00c8\u0003\u00c8\u0003\u00c8\u0003\u00c8', + '\u0003\u00c8\u0003\u00c8\u0003\u00c8\u0003\u00c8\u0003\u00c8\u0003\u00c8', + '\u0003\u00c8\u0003\u00c8\u0003\u00c8\u0003\u00c8\u0003\u00c8\u0003\u00c8', + '\u0007\u00c8\u0932\n\u00c8\f\u00c8\u000e\u00c8\u0935\u000b\u00c8\u0003', + '\u00c9\u0003\u00c9\u0003\u00ca\u0003\u00ca\u0005\u00ca\u093b\n\u00ca', + '\u0003\u00cb\u0003\u00cb\u0003\u00cb\u0003\u00cb\u0003\u00cc\u0003\u00cc', + '\u0005\u00cc\u0943\n\u00cc\u0003\u00cd\u0003\u00cd\u0003\u00cd\u0003', + '\u00cd\u0003\u00cd\u0003\u00cd\u0007\u00cd\u094b\n\u00cd\f\u00cd\u000e', + '\u00cd\u094e\u000b\u00cd\u0003\u00ce\u0003\u00ce\u0003\u00ce\u0003\u00ce', + '\u0003\u00ce\u0005\u00ce\u0955\n\u00ce\u0003\u00cf\u0003\u00cf\u0003', + '\u00cf\u0003\u00cf\u0003\u00d0\u0003\u00d0\u0005\u00d0\u095d\n\u00d0', + '\u0003\u00d1\u0003\u00d1\u0003\u00d1\u0003\u00d1\u0003\u00d1\u0003\u00d1', + '\u0007\u00d1\u0965\n\u00d1\f\u00d1\u000e\u00d1\u0968\u000b\u00d1\u0003', + '\u00d2\u0003\u00d2\u0003\u00d3\u0003\u00d3\u0003\u00d3\u0003\u00d3\u0003', + '\u00d4\u0003\u00d4\u0005\u00d4\u0972\n\u00d4\u0003\u00d5\u0003\u00d5', + '\u0003\u00d5\u0003\u00d5\u0003\u00d6\u0003\u00d6\u0003\u00d6\u0003\u00d6', + '\u0003\u00d6\u0003\u00d6\u0003\u00d6\u0003\u00d6\u0003\u00d6\u0003\u00d6', + '\u0003\u00d6\u0003\u00d6\u0007\u00d6\u0984\n\u00d6\f\u00d6\u000e\u00d6', + '\u0987\u000b\u00d6\u0003\u00d7\u0003\u00d7\u0003\u00d7\u0003\u00d8\u0003', + '\u00d8\u0003\u00d8\u0005\u00d8\u098f\n\u00d8\u0003\u00d9\u0003\u00d9', + '\u0003\u00d9\u0003\u00d9\u0003\u00d9\u0003\u00d9\u0003\u00d9\u0003\u00d9', + '\u0003\u00d9\u0003\u00d9\u0003\u00d9\u0003\u00d9\u0003\u00d9\u0003\u00d9', + '\u0003\u00d9\u0003\u00d9\u0003\u00d9\u0003\u00d9\u0003\u00d9\u0003\u00d9', + '\u0003\u00d9\u0003\u00d9\u0003\u00d9\u0003\u00d9\u0003\u00d9\u0003\u00d9', + '\u0003\u00d9\u0003\u00d9\u0003\u00d9\u0003\u00d9\u0003\u00d9\u0003\u00d9', + '\u0003\u00d9\u0003\u00d9\u0003\u00d9\u0003\u00d9\u0005\u00d9\u09b5\n', + '\u00d9\u0003\u00da\u0003\u00da\u0003\u00db\u0003\u00db\u0005\u00db\u09bb', + '\n\u00db\u0003\u00dc\u0003\u00dc\u0003\u00dc\u0003\u00dc\u0003\u00dc', + '\u0003\u00dc\u0003\u00dc\u0003\u00dc\u0003\u00dc\u0003\u00dc\u0003\u00dc', + '\u0003\u00dc\u0003\u00dc\u0003\u00dc\u0003\u00dc\u0003\u00dc\u0003\u00dc', + '\u0003\u00dc\u0003\u00dc\u0003\u00dc\u0003\u00dc\u0003\u00dc\u0003\u00dc', + '\u0003\u00dc\u0003\u00dc\u0003\u00dc\u0003\u00dc\u0003\u00dc\u0003\u00dc', + '\u0005\u00dc\u09da\n\u00dc\u0003\u00dd\u0003\u00dd\u0003\u00dd\u0003', + '\u00dd\u0003\u00dd\u0003\u00dd\u0007\u00dd\u09e2\n\u00dd\f\u00dd\u000e', + '\u00dd\u09e5\u000b\u00dd\u0003\u00de\u0003\u00de\u0003\u00de\u0003\u00de', + '\u0003\u00de\u0003\u00de\u0003\u00de\u0003\u00de\u0003\u00de\u0003\u00de', + '\u0003\u00de\u0003\u00de\u0003\u00de\u0003\u00de\u0003\u00de\u0003\u00de', + '\u0003\u00de\u0003\u00de\u0003\u00de\u0003\u00de\u0005\u00de\u09fb\n', + '\u00de\u0003\u00df\u0003\u00df\u0003\u00df\u0003\u00e0\u0003\u00e0\u0003', + '\u00e0\u0003\u00e0\u0003\u00e0\u0003\u00e0\u0003\u00e0\u0003\u00e0\u0003', + '\u00e0\u0003\u00e0\u0003\u00e0\u0003\u00e0\u0003\u00e0\u0003\u00e0\u0003', + '\u00e0\u0003\u00e0\u0003\u00e0\u0003\u00e0\u0003\u00e0\u0003\u00e0\u0003', + '\u00e0\u0003\u00e0\u0003\u00e0\u0005\u00e0\u0a17\n\u00e0\u0003\u00e1', + '\u0003\u00e1\u0003\u00e1\u0003\u00e1\u0003\u00e1\u0003\u00e1\u0003\u00e1', + '\u0003\u00e1\u0003\u00e1\u0005\u00e1\u0a22\n\u00e1\u0003\u00e2\u0003', + '\u00e2\u0003\u00e2\u0003\u00e2\u0003\u00e2\u0003\u00e2\u0003\u00e2\u0003', + '\u00e2\u0003\u00e2\u0005\u00e2\u0a2d\n\u00e2\u0003\u00e3\u0003\u00e3', + '\u0005\u00e3\u0a31\n\u00e3\u0003\u00e4\u0003\u00e4\u0003\u00e4\u0003', + '\u00e4\u0003\u00e4\u0003\u00e4\u0003\u00e4\u0003\u00e4\u0003\u00e4\u0005', + '\u00e4\u0a3c\n\u00e4\u0003\u00e5\u0003\u00e5\u0003\u00e5\u0005\u00e5', + '\u0a41\n\u00e5\u0003\u00e6\u0003\u00e6\u0003\u00e6\u0003\u00e6\u0003', + '\u00e6\u0003\u00e6\u0007\u00e6\u0a49\n\u00e6\f\u00e6\u000e\u00e6\u0a4c', + '\u000b\u00e6\u0003\u00e7\u0003\u00e7\u0003\u00e7\u0003\u00e7\u0003\u00e8', + '\u0003\u00e8\u0003\u00e8\u0003\u00e8\u0003\u00e8\u0003\u00e8\u0003\u00e8', + '\u0003\u00e9\u0003\u00e9\u0005\u00e9\u0a5b\n\u00e9\u0003\u00ea\u0003', + '\u00ea\u0003\u00ea\u0003\u00ea\u0005\u00ea\u0a61\n\u00ea\u0003\u00eb', + '\u0003\u00eb\u0003\u00eb\u0003\u00eb\u0003\u00eb\u0005\u00eb\u0a68\n', + '\u00eb\u0003\u00ec\u0003\u00ec\u0003\u00ed\u0003\u00ed\u0003\u00ed\u0003', + '\u00ed\u0003\u00ed\u0003\u00ed\u0003\u00ed\u0003\u00ed\u0003\u00ed\u0003', + '\u00ed\u0003\u00ed\u0005\u00ed\u0a77\n\u00ed\u0003\u00ee\u0003\u00ee', + '\u0003\u00ee\u0003\u00ee\u0003\u00ee\u0003\u00ee\u0005\u00ee\u0a7f\n', + '\u00ee\u0003\u00ef\u0003\u00ef\u0003\u00ef\u0003\u00ef\u0003\u00ef\u0003', + '\u00ef\u0003\u00ef\u0003\u00ef\u0003\u00ef\u0005\u00ef\u0a8a\n\u00ef', + '\u0003\u00f0\u0003\u00f0\u0003\u00f1\u0003\u00f1\u0005\u00f1\u0a90\n', + '\u00f1\u0003\u00f2\u0003\u00f2\u0003\u00f2\u0003\u00f2\u0005\u00f2\u0a96', + '\n\u00f2\u0003\u00f3\u0003\u00f3\u0003\u00f3\u0005\u00f3\u0a9b\n\u00f3', + '\u0003\u00f4\u0003\u00f4\u0003\u00f5\u0003\u00f5\u0003\u00f5\u0003\u00f5', + '\u0003\u00f5\u0003\u00f5\u0005\u00f5\u0aa5\n\u00f5\u0003\u00f6\u0003', + '\u00f6\u0005\u00f6\u0aa9\n\u00f6\u0003\u00f7\u0003\u00f7\u0003\u00f7', + '\u0003\u00f7\u0005\u00f7\u0aaf\n\u00f7\u0003\u00f8\u0003\u00f8\u0003', + '\u00f8\u0003\u00f8\u0003\u00f9\u0003\u00f9\u0003\u00f9\u0003\u00fa\u0003', + '\u00fa\u0003\u00fa\u0003\u00fa\u0003\u00fb\u0003\u00fb\u0003\u00fc\u0003', + '\u00fc\u0005\u00fc\u0ac0\n\u00fc\u0003\u00fd\u0003\u00fd\u0003\u00fe', + '\u0003\u00fe\u0003\u00fe\u0003\u00fe\u0005\u00fe\u0ac8\n\u00fe\u0003', + '\u00ff\u0003\u00ff\u0003\u0100\u0003\u0100\u0005\u0100\u0ace\n\u0100', + '\u0003\u0101\u0003\u0101\u0003\u0101\u0003\u0101\u0003\u0102\u0003\u0102', + '\u0003\u0102\u0003\u0103\u0003\u0103\u0003\u0103\u0003\u0103\u0003\u0104', + '\u0003\u0104\u0003\u0104\u0003\u0105\u0003\u0105\u0003\u0105\u0003\u0106', + '\u0003\u0106\u0003\u0106\u0003\u0106\u0003\u0106\u0002\u001e\u0006<', + 'N\\|\u0090\u0096\u00a2\u00b2\u00d2\u00f2\u00fc\u00fe\u0108\u0120\u0124', + '\u0128\u0154\u0176\u0182\u0186\u0188\u018e\u0198\u01a0\u01aa\u01b8\u01ca', + '\u0107\u0002\u0004\u0006\b\n\f\u000e\u0010\u0012\u0014\u0016\u0018\u001a', + '\u001c\u001e "$&(*,.02468:<>@BDFHJLNPRTVXZ\\^`bdfhjlnprtvxz|~\u0080', + '\u0082\u0084\u0086\u0088\u008a\u008c\u008e\u0090\u0092\u0094\u0096\u0098', + '\u009a\u009c\u009e\u00a0\u00a2\u00a4\u00a6\u00a8\u00aa\u00ac\u00ae\u00b0', + '\u00b2\u00b4\u00b6\u00b8\u00ba\u00bc\u00be\u00c0\u00c2\u00c4\u00c6\u00c8', + '\u00ca\u00cc\u00ce\u00d0\u00d2\u00d4\u00d6\u00d8\u00da\u00dc\u00de\u00e0', + '\u00e2\u00e4\u00e6\u00e8\u00ea\u00ec\u00ee\u00f0\u00f2\u00f4\u00f6\u00f8', + '\u00fa\u00fc\u00fe\u0100\u0102\u0104\u0106\u0108\u010a\u010c\u010e\u0110', + '\u0112\u0114\u0116\u0118\u011a\u011c\u011e\u0120\u0122\u0124\u0126\u0128', + '\u012a\u012c\u012e\u0130\u0132\u0134\u0136\u0138\u013a\u013c\u013e\u0140', + '\u0142\u0144\u0146\u0148\u014a\u014c\u014e\u0150\u0152\u0154\u0156\u0158', + '\u015a\u015c\u015e\u0160\u0162\u0164\u0166\u0168\u016a\u016c\u016e\u0170', + '\u0172\u0174\u0176\u0178\u017a\u017c\u017e\u0180\u0182\u0184\u0186\u0188', + '\u018a\u018c\u018e\u0190\u0192\u0194\u0196\u0198\u019a\u019c\u019e\u01a0', + '\u01a2\u01a4\u01a6\u01a8\u01aa\u01ac\u01ae\u01b0\u01b2\u01b4\u01b6\u01b8', + '\u01ba\u01bc\u01be\u01c0\u01c2\u01c4\u01c6\u01c8\u01ca\u01cc\u01ce\u01d0', + '\u01d2\u01d4\u01d6\u01d8\u01da\u01dc\u01de\u01e0\u01e2\u01e4\u01e6\u01e8', + '\u01ea\u01ec\u01ee\u01f0\u01f2\u01f4\u01f6\u01f8\u01fa\u01fc\u01fe\u0200', + '\u0202\u0204\u0206\u0208\u020a\u0002\u0015\u0004\u0002))aa\u0005\u0002', + 'OO\u00b0\u00b0\u00e1\u00e1\u0004\u0002\\\\\u00d9\u00d9\u0004\u00022', + '2\u00ad\u00ad\u0004\u0002**II\u0004\u0002[[\u0081\u0081\u0007\u0002', + 'GGuu\u00c3\u00c3\u00db\u00db\u00ef\u00ef\u0004\u0002]]\u00d3\u00d3\u0004', + '\u0002##NN\u0005\u0002**II\u008e\u008e\u0004\u0002\u007f\u007f\u00e2', + '\u00e2\u0007\u0002\u0003\u0005XX\u008e\u008e\u0095\u0095\u00d2\u00d2', + '\u0003\u0002\u00f0\u00f2\u0004\u0002\u00b5\u00b5\u00ef\u00ef\u0005\u0002', + 'gg\u00af\u00af\u00be\u00be\u0004\u0002^^\u00a7\u00a7\u0004\u0002##K', + 'K\u0004\u0002,,\u00c8\u00c8\u0004\u0002\u00cf\u00d0\u00ec\u00ec\u0002', + '\u0b29\u0002\u020c\u0003\u0002\u0002\u0002\u0004\u0217\u0003\u0002\u0002', + '\u0002\u0006\u0219\u0003\u0002\u0002\u0002\b\u0226\u0003\u0002\u0002', + '\u0002\n\u0230\u0003\u0002\u0002\u0002\f\u0232\u0003\u0002\u0002\u0002', + '\u000e\u0238\u0003\u0002\u0002\u0002\u0010\u023a\u0003\u0002\u0002\u0002', + '\u0012\u023d\u0003\u0002\u0002\u0002\u0014\u0244\u0003\u0002\u0002\u0002', + '\u0016\u024b\u0003\u0002\u0002\u0002\u0018\u024d\u0003\u0002\u0002\u0002', + '\u001a\u024f\u0003\u0002\u0002\u0002\u001c\u0256\u0003\u0002\u0002\u0002', + '\u001e\u0258\u0003\u0002\u0002\u0002 \u0261\u0003\u0002\u0002\u0002', + '"\u0263\u0003\u0002\u0002\u0002$\u0267\u0003\u0002\u0002\u0002&\u0269', + '\u0003\u0002\u0002\u0002(\u026c\u0003\u0002\u0002\u0002*\u0273\u0003', + '\u0002\u0002\u0002,\u0278\u0003\u0002\u0002\u0002.\u027c\u0003\u0002', + '\u0002\u00020\u0283\u0003\u0002\u0002\u00022\u0287\u0003\u0002\u0002', + '\u00024\u028c\u0003\u0002\u0002\u00026\u0291\u0003\u0002\u0002\u0002', + '8\u0298\u0003\u0002\u0002\u0002:\u02a7\u0003\u0002\u0002\u0002<\u02c6', + '\u0003\u0002\u0002\u0002>\u02e4\u0003\u0002\u0002\u0002@\u02e8\u0003', + '\u0002\u0002\u0002B\u02ea\u0003\u0002\u0002\u0002D\u02f2\u0003\u0002', + '\u0002\u0002F\u02fa\u0003\u0002\u0002\u0002H\u0305\u0003\u0002\u0002', + '\u0002J\u030a\u0003\u0002\u0002\u0002L\u030c\u0003\u0002\u0002\u0002', + 'N\u030e\u0003\u0002\u0002\u0002P\u0321\u0003\u0002\u0002\u0002R\u0325', + '\u0003\u0002\u0002\u0002T\u032a\u0003\u0002\u0002\u0002V\u032c\u0003', + '\u0002\u0002\u0002X\u0330\u0003\u0002\u0002\u0002Z\u0332\u0003\u0002', + '\u0002\u0002\\\u033f\u0003\u0002\u0002\u0002^\u037b\u0003\u0002\u0002', + '\u0002`\u037d\u0003\u0002\u0002\u0002b\u037f\u0003\u0002\u0002\u0002', + 'd\u038d\u0003\u0002\u0002\u0002f\u0392\u0003\u0002\u0002\u0002h\u0394', + '\u0003\u0002\u0002\u0002j\u0397\u0003\u0002\u0002\u0002l\u0399\u0003', + '\u0002\u0002\u0002n\u039b\u0003\u0002\u0002\u0002p\u03a0\u0003\u0002', + '\u0002\u0002r\u03b1\u0003\u0002\u0002\u0002t\u03b3\u0003\u0002\u0002', + '\u0002v\u03b7\u0003\u0002\u0002\u0002x\u03c2\u0003\u0002\u0002\u0002', + 'z\u03c6\u0003\u0002\u0002\u0002|\u03c8\u0003\u0002\u0002\u0002~\u03d3', + '\u0003\u0002\u0002\u0002\u0080\u03d6\u0003\u0002\u0002\u0002\u0082\u03d8', + '\u0003\u0002\u0002\u0002\u0084\u03de\u0003\u0002\u0002\u0002\u0086\u03e2', + '\u0003\u0002\u0002\u0002\u0088\u03e4\u0003\u0002\u0002\u0002\u008a\u03e9', + '\u0003\u0002\u0002\u0002\u008c\u03f0\u0003\u0002\u0002\u0002\u008e\u03f2', + '\u0003\u0002\u0002\u0002\u0090\u03f5\u0003\u0002\u0002\u0002\u0092\u0400', + '\u0003\u0002\u0002\u0002\u0094\u0407\u0003\u0002\u0002\u0002\u0096\u0409', + '\u0003\u0002\u0002\u0002\u0098\u0414\u0003\u0002\u0002\u0002\u009a\u041a', + '\u0003\u0002\u0002\u0002\u009c\u041c\u0003\u0002\u0002\u0002\u009e\u0421', + '\u0003\u0002\u0002\u0002\u00a0\u042a\u0003\u0002\u0002\u0002\u00a2\u042c', + '\u0003\u0002\u0002\u0002\u00a4\u0437\u0003\u0002\u0002\u0002\u00a6\u043c', + '\u0003\u0002\u0002\u0002\u00a8\u043e\u0003\u0002\u0002\u0002\u00aa\u0443', + '\u0003\u0002\u0002\u0002\u00ac\u0445\u0003\u0002\u0002\u0002\u00ae\u044a', + '\u0003\u0002\u0002\u0002\u00b0\u044c\u0003\u0002\u0002\u0002\u00b2\u0450', + '\u0003\u0002\u0002\u0002\u00b4\u045b\u0003\u0002\u0002\u0002\u00b6\u0461', + '\u0003\u0002\u0002\u0002\u00b8\u0463\u0003\u0002\u0002\u0002\u00ba\u0469', + '\u0003\u0002\u0002\u0002\u00bc\u046b\u0003\u0002\u0002\u0002\u00be\u046d', + '\u0003\u0002\u0002\u0002\u00c0\u0471\u0003\u0002\u0002\u0002\u00c2\u0473', + '\u0003\u0002\u0002\u0002\u00c4\u0478\u0003\u0002\u0002\u0002\u00c6\u047a', + '\u0003\u0002\u0002\u0002\u00c8\u048d\u0003\u0002\u0002\u0002\u00ca\u049c', + '\u0003\u0002\u0002\u0002\u00cc\u04a2\u0003\u0002\u0002\u0002\u00ce\u04b5', + '\u0003\u0002\u0002\u0002\u00d0\u04b7\u0003\u0002\u0002\u0002\u00d2\u04ba', + '\u0003\u0002\u0002\u0002\u00d4\u04c9\u0003\u0002\u0002\u0002\u00d6\u04ce', + '\u0003\u0002\u0002\u0002\u00d8\u04d0\u0003\u0002\u0002\u0002\u00da\u04d6', + '\u0003\u0002\u0002\u0002\u00dc\u04e0\u0003\u0002\u0002\u0002\u00de\u04e2', + '\u0003\u0002\u0002\u0002\u00e0\u04e9\u0003\u0002\u0002\u0002\u00e2\u04eb', + '\u0003\u0002\u0002\u0002\u00e4\u04ee\u0003\u0002\u0002\u0002\u00e6\u04f1', + '\u0003\u0002\u0002\u0002\u00e8\u0503\u0003\u0002\u0002\u0002\u00ea\u0515', + '\u0003\u0002\u0002\u0002\u00ec\u0517\u0003\u0002\u0002\u0002\u00ee\u0538', + '\u0003\u0002\u0002\u0002\u00f0\u053a\u0003\u0002\u0002\u0002\u00f2\u053d', + '\u0003\u0002\u0002\u0002\u00f4\u0553\u0003\u0002\u0002\u0002\u00f6\u0555', + '\u0003\u0002\u0002\u0002\u00f8\u055c\u0003\u0002\u0002\u0002\u00fa\u055e', + '\u0003\u0002\u0002\u0002\u00fc\u0562\u0003\u0002\u0002\u0002\u00fe\u056e', + '\u0003\u0002\u0002\u0002\u0100\u058d\u0003\u0002\u0002\u0002\u0102\u058f', + '\u0003\u0002\u0002\u0002\u0104\u0594\u0003\u0002\u0002\u0002\u0106\u0596', + '\u0003\u0002\u0002\u0002\u0108\u0599\u0003\u0002\u0002\u0002\u010a\u05a4', + '\u0003\u0002\u0002\u0002\u010c\u05a7\u0003\u0002\u0002\u0002\u010e\u05b4', + '\u0003\u0002\u0002\u0002\u0110\u05b8\u0003\u0002\u0002\u0002\u0112\u05cf', + '\u0003\u0002\u0002\u0002\u0114\u05df\u0003\u0002\u0002\u0002\u0116\u05e8', + '\u0003\u0002\u0002\u0002\u0118\u05f4\u0003\u0002\u0002\u0002\u011a\u05f6', + '\u0003\u0002\u0002\u0002\u011c\u0606\u0003\u0002\u0002\u0002\u011e\u0614', + '\u0003\u0002\u0002\u0002\u0120\u0616\u0003\u0002\u0002\u0002\u0122\u0621', + '\u0003\u0002\u0002\u0002\u0124\u0623\u0003\u0002\u0002\u0002\u0126\u0648', + '\u0003\u0002\u0002\u0002\u0128\u064a\u0003\u0002\u0002\u0002\u012a\u0659', + '\u0003\u0002\u0002\u0002\u012c\u0667\u0003\u0002\u0002\u0002\u012e\u0669', + '\u0003\u0002\u0002\u0002\u0130\u066f\u0003\u0002\u0002\u0002\u0132\u0675', + '\u0003\u0002\u0002\u0002\u0134\u067b\u0003\u0002\u0002\u0002\u0136\u0681', + '\u0003\u0002\u0002\u0002\u0138\u0685\u0003\u0002\u0002\u0002\u013a\u0687', + '\u0003\u0002\u0002\u0002\u013c\u0696\u0003\u0002\u0002\u0002\u013e\u06a4', + '\u0003\u0002\u0002\u0002\u0140\u06a6\u0003\u0002\u0002\u0002\u0142\u06aa', + '\u0003\u0002\u0002\u0002\u0144\u06b6\u0003\u0002\u0002\u0002\u0146\u06c0', + '\u0003\u0002\u0002\u0002\u0148\u06cb\u0003\u0002\u0002\u0002\u014a\u06d5', + '\u0003\u0002\u0002\u0002\u014c\u06d9\u0003\u0002\u0002\u0002\u014e\u06e1', + '\u0003\u0002\u0002\u0002\u0150\u06e5\u0003\u0002\u0002\u0002\u0152\u06e7', + '\u0003\u0002\u0002\u0002\u0154\u06ea\u0003\u0002\u0002\u0002\u0156\u06f5', + '\u0003\u0002\u0002\u0002\u0158\u0702\u0003\u0002\u0002\u0002\u015a\u0704', + '\u0003\u0002\u0002\u0002\u015c\u0706\u0003\u0002\u0002\u0002\u015e\u070b', + '\u0003\u0002\u0002\u0002\u0160\u0712\u0003\u0002\u0002\u0002\u0162\u0714', + '\u0003\u0002\u0002\u0002\u0164\u072b\u0003\u0002\u0002\u0002\u0166\u073d', + '\u0003\u0002\u0002\u0002\u0168\u073f\u0003\u0002\u0002\u0002\u016a\u0748', + '\u0003\u0002\u0002\u0002\u016c\u0754\u0003\u0002\u0002\u0002\u016e\u0758', + '\u0003\u0002\u0002\u0002\u0170\u075a\u0003\u0002\u0002\u0002\u0172\u0766', + '\u0003\u0002\u0002\u0002\u0174\u076d\u0003\u0002\u0002\u0002\u0176\u076f', + '\u0003\u0002\u0002\u0002\u0178\u078e\u0003\u0002\u0002\u0002\u017a\u0790', + '\u0003\u0002\u0002\u0002\u017c\u0794\u0003\u0002\u0002\u0002\u017e\u0815', + '\u0003\u0002\u0002\u0002\u0180\u0819\u0003\u0002\u0002\u0002\u0182\u081b', + '\u0003\u0002\u0002\u0002\u0184\u0826\u0003\u0002\u0002\u0002\u0186\u0828', + '\u0003\u0002\u0002\u0002\u0188\u084d\u0003\u0002\u0002\u0002\u018a\u08e0', + '\u0003\u0002\u0002\u0002\u018c\u08f2\u0003\u0002\u0002\u0002\u018e\u08f4', + '\u0003\u0002\u0002\u0002\u0190\u0936\u0003\u0002\u0002\u0002\u0192\u093a', + '\u0003\u0002\u0002\u0002\u0194\u093c\u0003\u0002\u0002\u0002\u0196\u0942', + '\u0003\u0002\u0002\u0002\u0198\u0944\u0003\u0002\u0002\u0002\u019a\u0954', + '\u0003\u0002\u0002\u0002\u019c\u0956\u0003\u0002\u0002\u0002\u019e\u095c', + '\u0003\u0002\u0002\u0002\u01a0\u095e\u0003\u0002\u0002\u0002\u01a2\u0969', + '\u0003\u0002\u0002\u0002\u01a4\u096b\u0003\u0002\u0002\u0002\u01a6\u0971', + '\u0003\u0002\u0002\u0002\u01a8\u0973\u0003\u0002\u0002\u0002\u01aa\u0977', + '\u0003\u0002\u0002\u0002\u01ac\u0988\u0003\u0002\u0002\u0002\u01ae\u098e', + '\u0003\u0002\u0002\u0002\u01b0\u09b4\u0003\u0002\u0002\u0002\u01b2\u09b6', + '\u0003\u0002\u0002\u0002\u01b4\u09ba\u0003\u0002\u0002\u0002\u01b6\u09d9', + '\u0003\u0002\u0002\u0002\u01b8\u09db\u0003\u0002\u0002\u0002\u01ba\u09fa', + '\u0003\u0002\u0002\u0002\u01bc\u09fc\u0003\u0002\u0002\u0002\u01be\u0a16', + '\u0003\u0002\u0002\u0002\u01c0\u0a21\u0003\u0002\u0002\u0002\u01c2\u0a2c', + '\u0003\u0002\u0002\u0002\u01c4\u0a30\u0003\u0002\u0002\u0002\u01c6\u0a3b', + '\u0003\u0002\u0002\u0002\u01c8\u0a40\u0003\u0002\u0002\u0002\u01ca\u0a42', + '\u0003\u0002\u0002\u0002\u01cc\u0a4d\u0003\u0002\u0002\u0002\u01ce\u0a51', + '\u0003\u0002\u0002\u0002\u01d0\u0a5a\u0003\u0002\u0002\u0002\u01d2\u0a60', + '\u0003\u0002\u0002\u0002\u01d4\u0a67\u0003\u0002\u0002\u0002\u01d6\u0a69', + '\u0003\u0002\u0002\u0002\u01d8\u0a76\u0003\u0002\u0002\u0002\u01da\u0a7e', + '\u0003\u0002\u0002\u0002\u01dc\u0a89\u0003\u0002\u0002\u0002\u01de\u0a8b', + '\u0003\u0002\u0002\u0002\u01e0\u0a8f\u0003\u0002\u0002\u0002\u01e2\u0a95', + '\u0003\u0002\u0002\u0002\u01e4\u0a9a\u0003\u0002\u0002\u0002\u01e6\u0a9c', + '\u0003\u0002\u0002\u0002\u01e8\u0aa4\u0003\u0002\u0002\u0002\u01ea\u0aa8', + '\u0003\u0002\u0002\u0002\u01ec\u0aae\u0003\u0002\u0002\u0002\u01ee\u0ab0', + '\u0003\u0002\u0002\u0002\u01f0\u0ab4\u0003\u0002\u0002\u0002\u01f2\u0ab7', + '\u0003\u0002\u0002\u0002\u01f4\u0abb\u0003\u0002\u0002\u0002\u01f6\u0abf', + '\u0003\u0002\u0002\u0002\u01f8\u0ac1\u0003\u0002\u0002\u0002\u01fa\u0ac7', + '\u0003\u0002\u0002\u0002\u01fc\u0ac9\u0003\u0002\u0002\u0002\u01fe\u0acd', + '\u0003\u0002\u0002\u0002\u0200\u0acf\u0003\u0002\u0002\u0002\u0202\u0ad3', + '\u0003\u0002\u0002\u0002\u0204\u0ad6\u0003\u0002\u0002\u0002\u0206\u0ada', + '\u0003\u0002\u0002\u0002\u0208\u0add\u0003\u0002\u0002\u0002\u020a\u0ae0', + '\u0003\u0002\u0002\u0002\u020c\u0210\u0005\u0004\u0003\u0002\u020d\u020f', + '\u0005\u0004\u0003\u0002\u020e\u020d\u0003\u0002\u0002\u0002\u020f\u0212', + '\u0003\u0002\u0002\u0002\u0210\u020e\u0003\u0002\u0002\u0002\u0210\u0211', + '\u0003\u0002\u0002\u0002\u0211\u0003\u0003\u0002\u0002\u0002\u0212\u0210', + '\u0003\u0002\u0002\u0002\u0213\u0214\u0005\b\u0005\u0002\u0214\u0215', + '\u0005\u0006\u0004\u0002\u0215\u0218\u0003\u0002\u0002\u0002\u0216\u0218', + '\u0005\u01c4\u00e3\u0002\u0217\u0213\u0003\u0002\u0002\u0002\u0217\u0216', + '\u0003\u0002\u0002\u0002\u0218\u0005\u0003\u0002\u0002\u0002\u0219\u021e', + '\b\u0004\u0001\u0002\u021a\u021b\f\u0003\u0002\u0002\u021b\u021d\u0007', + ' \u0002\u0002\u021c\u021a\u0003\u0002\u0002\u0002\u021d\u0220\u0003', + '\u0002\u0002\u0002\u021e\u021c\u0003\u0002\u0002\u0002\u021e\u021f\u0003', + '\u0002\u0002\u0002\u021f\u0007\u0003\u0002\u0002\u0002\u0220\u021e\u0003', + '\u0002\u0002\u0002\u0221\u0227\u0005\f\u0007\u0002\u0222\u0227\u0005', + '\u0010\t\u0002\u0223\u0227\u0005\u0012\n\u0002\u0224\u0227\u0005\u001a', + '\u000e\u0002\u0225\u0227\u0005\n\u0006\u0002\u0226\u0221\u0003\u0002', + '\u0002\u0002\u0226\u0222\u0003\u0002\u0002\u0002\u0226\u0223\u0003\u0002', + '\u0002\u0002\u0226\u0224\u0003\u0002\u0002\u0002\u0226\u0225\u0003\u0002', + '\u0002\u0002\u0227\t\u0003\u0002\u0002\u0002\u0228\u0231\u0005(\u0015', + '\u0002\u0229\u0231\u0005*\u0016\u0002\u022a\u0231\u0005,\u0017\u0002', + '\u022b\u0231\u0005\u001e\u0010\u0002\u022c\u0231\u0005\u017e\u00c0\u0002', + '\u022d\u0231\u0005.\u0018\u0002\u022e\u0231\u00056\u001c\u0002\u022f', + '\u0231\u00058\u001d\u0002\u0230\u0228\u0003\u0002\u0002\u0002\u0230', + '\u0229\u0003\u0002\u0002\u0002\u0230\u022a\u0003\u0002\u0002\u0002\u0230', + '\u022b\u0003\u0002\u0002\u0002\u0230\u022c\u0003\u0002\u0002\u0002\u0230', + '\u022d\u0003\u0002\u0002\u0002\u0230\u022e\u0003\u0002\u0002\u0002\u0230', + '\u022f\u0003\u0002\u0002\u0002\u0231\u000b\u0003\u0002\u0002\u0002\u0232', + '\u0233\u0007"\u0002\u0002\u0233\u0234\u0005\u000e\b\u0002\u0234\u0235', + '\u0005\n\u0006\u0002\u0235\r\u0003\u0002\u0002\u0002\u0236\u0239\u0003', + '\u0002\u0002\u0002\u0237\u0239\u0007q\u0002\u0002\u0238\u0236\u0003', + '\u0002\u0002\u0002\u0238\u0237\u0003\u0002\u0002\u0002\u0239\u000f\u0003', + '\u0002\u0002\u0002\u023a\u023b\u0007W\u0002\u0002\u023b\u023c\u0005', + '\n\u0006\u0002\u023c\u0011\u0003\u0002\u0002\u0002\u023d\u023e\u0007', + '\u00a8\u0002\u0002\u023e\u023f\u0005\u0014\u000b\u0002\u023f\u0240\u0005', + '\u0016\f\u0002\u0240\u0241\u0005\n\u0006\u0002\u0241\u0013\u0003\u0002', + '\u0002\u0002\u0242\u0245\u0003\u0002\u0002\u0002\u0243\u0245\u0007`', + '\u0002\u0002\u0244\u0242\u0003\u0002\u0002\u0002\u0244\u0243\u0003\u0002', + '\u0002\u0002\u0245\u0015\u0003\u0002\u0002\u0002\u0246\u024c\u0003\u0002', + '\u0002\u0002\u0247\u0248\u0007\u00ef\u0002\u0002\u0248\u024c\u0005\u0018', + '\r\u0002\u0249\u024a\u0007\u0003\u0002\u0002\u024a\u024c\u0005\u0018', + '\r\u0002\u024b\u0246\u0003\u0002\u0002\u0002\u024b\u0247\u0003\u0002', + '\u0002\u0002\u024b\u0249\u0003\u0002\u0002\u0002\u024c\u0017\u0003\u0002', + '\u0002\u0002\u024d\u024e\t\u0002\u0002\u0002\u024e\u0019\u0003\u0002', + '\u0002\u0002\u024f\u0250\u0007U\u0002\u0002\u0250\u0251\u0005\u0188', + '\u00c5\u0002\u0251\u0252\u0005\u001c\u000f\u0002\u0252\u001b\u0003\u0002', + '\u0002\u0002\u0253\u0257\u0003\u0002\u0002\u0002\u0254\u0255\u0007\u00df', + '\u0002\u0002\u0255\u0257\u0005\u0192\u00ca\u0002\u0256\u0253\u0003\u0002', + '\u0002\u0002\u0256\u0254\u0003\u0002\u0002\u0002\u0257\u001d\u0003\u0002', + '\u0002\u0002\u0258\u0259\u0007r\u0002\u0002\u0259\u025a\u0005 \u0011', + '\u0002\u025a\u025b\u0005\u00caf\u0002\u025b\u025c\u0005"\u0012\u0002', + '\u025c\u025d\u0005$\u0013\u0002\u025d\u001f\u0003\u0002\u0002\u0002', + '\u025e\u0262\u0003\u0002\u0002\u0002\u025f\u0262\u0007~\u0002\u0002', + '\u0260\u0262\u00079\u0002\u0002\u0261\u025e\u0003\u0002\u0002\u0002', + '\u0261\u025f\u0003\u0002\u0002\u0002\u0261\u0260\u0003\u0002\u0002\u0002', + '\u0262!\u0003\u0002\u0002\u0002\u0263\u0264\u0003\u0002\u0002\u0002', + '\u0264#\u0003\u0002\u0002\u0002\u0265\u0268\u0003\u0002\u0002\u0002', + '\u0266\u0268\u0005&\u0014\u0002\u0267\u0265\u0003\u0002\u0002\u0002', + '\u0267\u0266\u0003\u0002\u0002\u0002\u0268%\u0003\u0002\u0002\u0002', + '\u0269\u026a\u0007\u00ea\u0002\u0002\u026a\u026b\u0005\u0188\u00c5\u0002', + "\u026b'\u0003\u0002\u0002\u0002\u026c\u026d\u0005:\u001e\u0002\u026d", + ')\u0003\u0002\u0002\u0002\u026e\u0274\u0005\u00c8e\u0002\u026f\u0274', + '\u0005\u00eav\u0002\u0270\u0274\u0005\u00ecw\u0002\u0271\u0274\u0005', + '\u00eex\u0002\u0272\u0274\u0005\u010c\u0087\u0002\u0273\u026e\u0003', + '\u0002\u0002\u0002\u0273\u026f\u0003\u0002\u0002\u0002\u0273\u0270\u0003', + '\u0002\u0002\u0002\u0273\u0271\u0003\u0002\u0002\u0002\u0273\u0272\u0003', + '\u0002\u0002\u0002\u0274+\u0003\u0002\u0002\u0002\u0275\u0279\u0005', + '0\u0019\u0002\u0276\u0279\u00052\u001a\u0002\u0277\u0279\u00054\u001b', + '\u0002\u0278\u0275\u0003\u0002\u0002\u0002\u0278\u0276\u0003\u0002\u0002', + '\u0002\u0278\u0277\u0003\u0002\u0002\u0002\u0279-\u0003\u0002\u0002', + '\u0002\u027a\u027d\u0005\u011e\u0090\u0002\u027b\u027d\u0005\u012c\u0097', + '\u0002\u027c\u027a\u0003\u0002\u0002\u0002\u027c\u027b\u0003\u0002\u0002', + '\u0002\u027d/\u0003\u0002\u0002\u0002\u027e\u0284\u0005\u013a\u009e', + '\u0002\u027f\u0284\u0005\u013c\u009f\u0002\u0280\u0284\u0005\u0164\u00b3', + '\u0002\u0281\u0284\u0005\u0166\u00b4\u0002\u0282\u0284\u0005\u0168\u00b5', + '\u0002\u0283\u027e\u0003\u0002\u0002\u0002\u0283\u027f\u0003\u0002\u0002', + '\u0002\u0283\u0280\u0003\u0002\u0002\u0002\u0283\u0281\u0003\u0002\u0002', + '\u0002\u0283\u0282\u0003\u0002\u0002\u0002\u02841\u0003\u0002\u0002', + '\u0002\u0285\u0288\u0005\u012e\u0098\u0002\u0286\u0288\u0005\u0130\u0099', + '\u0002\u0287\u0285\u0003\u0002\u0002\u0002\u0287\u0286\u0003\u0002\u0002', + '\u0002\u02883\u0003\u0002\u0002\u0002\u0289\u028d\u0005\u0132\u009a', + '\u0002\u028a\u028d\u0005\u0134\u009b\u0002\u028b\u028d\u0005\u0136\u009c', + '\u0002\u028c\u0289\u0003\u0002\u0002\u0002\u028c\u028a\u0003\u0002\u0002', + '\u0002\u028c\u028b\u0003\u0002\u0002\u0002\u028d5\u0003\u0002\u0002', + '\u0002\u028e\u0292\u0005\u016a\u00b6\u0002\u028f\u0292\u0005\u017a\u00be', + '\u0002\u0290\u0292\u0005\u017c\u00bf\u0002\u0291\u028e\u0003\u0002\u0002', + '\u0002\u0291\u028f\u0003\u0002\u0002\u0002\u0291\u0290\u0003\u0002\u0002', + '\u0002\u02927\u0003\u0002\u0002\u0002\u0293\u0299\u0005\u01ee\u00f8', + '\u0002\u0294\u0299\u0005\u01f0\u00f9\u0002\u0295\u0299\u0005\u01f2\u00fa', + '\u0002\u0296\u0299\u0005\u0206\u0104\u0002\u0297\u0299\u0005\u0204\u0103', + '\u0002\u0298\u0293\u0003\u0002\u0002\u0002\u0298\u0294\u0003\u0002\u0002', + '\u0002\u0298\u0295\u0003\u0002\u0002\u0002\u0298\u0296\u0003\u0002\u0002', + '\u0002\u0298\u0297\u0003\u0002\u0002\u0002\u02999\u0003\u0002\u0002', + '\u0002\u029a\u029b\u0005<\u001f\u0002\u029b\u029c\u0005\u00aeX\u0002', + '\u029c\u02a8\u0003\u0002\u0002\u0002\u029d\u029e\u0005<\u001f\u0002', + '\u029e\u029f\u0005\u00aeX\u0002\u029f\u02a0\u0005\u00c2b\u0002\u02a0', + '\u02a1\u0005\u00c4c\u0002\u02a1\u02a8\u0003\u0002\u0002\u0002\u02a2', + '\u02a3\u0005<\u001f\u0002\u02a3\u02a4\u0005\u00aeX\u0002\u02a4\u02a5', + '\u0005\u00c6d\u0002\u02a5\u02a6\u0005\u00c0a\u0002\u02a6\u02a8\u0003', + '\u0002\u0002\u0002\u02a7\u029a\u0003\u0002\u0002\u0002\u02a7\u029d\u0003', + '\u0002\u0002\u0002\u02a7\u02a2\u0003\u0002\u0002\u0002\u02a8;\u0003', + '\u0002\u0002\u0002\u02a9\u02aa\b\u001f\u0001\u0002\u02aa\u02c7\u0005', + '@!\u0002\u02ab\u02ac\u0005\u01c2\u00e2\u0002\u02ac\u02ad\u0007\u00d6', + '\u0002\u0002\u02ad\u02ae\u0005> \u0002\u02ae\u02c7\u0003\u0002\u0002', + '\u0002\u02af\u02b0\u0005\u01c2\u00e2\u0002\u02b0\u02b1\u0007\u00d6\u0002', + '\u0002\u02b1\u02b2\u0007#\u0002\u0002\u02b2\u02b3\u0005> \u0002\u02b3', + '\u02c7\u0003\u0002\u0002\u0002\u02b4\u02b5\u0005\u01c2\u00e2\u0002\u02b5', + '\u02b6\u0007v\u0002\u0002\u02b6\u02b7\u0005> \u0002\u02b7\u02c7\u0003', + '\u0002\u0002\u0002\u02b8\u02b9\u0005\u01c2\u00e2\u0002\u02b9\u02ba\u0007', + 'v\u0002\u0002\u02ba\u02bb\u0007#\u0002\u0002\u02bb\u02bc\u0005> \u0002', + '\u02bc\u02c7\u0003\u0002\u0002\u0002\u02bd\u02be\u0005\u01c2\u00e2\u0002', + '\u02be\u02bf\u0007S\u0002\u0002\u02bf\u02c0\u0005> \u0002\u02c0\u02c7', + '\u0003\u0002\u0002\u0002\u02c1\u02c2\u0005\u01c2\u00e2\u0002\u02c2\u02c3', + '\u0007S\u0002\u0002\u02c3\u02c4\u0007#\u0002\u0002\u02c4\u02c5\u0005', + '> \u0002\u02c5\u02c7\u0003\u0002\u0002\u0002\u02c6\u02a9\u0003\u0002', + '\u0002\u0002\u02c6\u02ab\u0003\u0002\u0002\u0002\u02c6\u02af\u0003\u0002', + '\u0002\u0002\u02c6\u02b4\u0003\u0002\u0002\u0002\u02c6\u02b8\u0003\u0002', + '\u0002\u0002\u02c6\u02bd\u0003\u0002\u0002\u0002\u02c6\u02c1\u0003\u0002', + '\u0002\u0002\u02c7\u02df\u0003\u0002\u0002\u0002\u02c8\u02c9\f\u000e', + '\u0002\u0002\u02c9\u02ca\u0007\u00d6\u0002\u0002\u02ca\u02de\u0005>', + ' \u0002\u02cb\u02cc\f\r\u0002\u0002\u02cc\u02cd\u0007\u00d6\u0002\u0002', + '\u02cd\u02ce\u0007#\u0002\u0002\u02ce\u02de\u0005> \u0002\u02cf\u02d0', + '\f\f\u0002\u0002\u02d0\u02d1\u0007v\u0002\u0002\u02d1\u02de\u0005> ', + '\u0002\u02d2\u02d3\f\u000b\u0002\u0002\u02d3\u02d4\u0007v\u0002\u0002', + '\u02d4\u02d5\u0007#\u0002\u0002\u02d5\u02de\u0005> \u0002\u02d6\u02d7', + '\f\n\u0002\u0002\u02d7\u02d8\u0007S\u0002\u0002\u02d8\u02de\u0005> ', + '\u0002\u02d9\u02da\f\t\u0002\u0002\u02da\u02db\u0007S\u0002\u0002\u02db', + '\u02dc\u0007#\u0002\u0002\u02dc\u02de\u0005> \u0002\u02dd\u02c8\u0003', + '\u0002\u0002\u0002\u02dd\u02cb\u0003\u0002\u0002\u0002\u02dd\u02cf\u0003', + '\u0002\u0002\u0002\u02dd\u02d2\u0003\u0002\u0002\u0002\u02dd\u02d6\u0003', + '\u0002\u0002\u0002\u02dd\u02d9\u0003\u0002\u0002\u0002\u02de\u02e1\u0003', + '\u0002\u0002\u0002\u02df\u02dd\u0003\u0002\u0002\u0002\u02df\u02e0\u0003', + '\u0002\u0002\u0002\u02e0=\u0003\u0002\u0002\u0002\u02e1\u02df\u0003', + '\u0002\u0002\u0002\u02e2\u02e5\u0005@!\u0002\u02e3\u02e5\u0005\u01c2', + '\u00e2\u0002\u02e4\u02e2\u0003\u0002\u0002\u0002\u02e4\u02e3\u0003\u0002', + '\u0002\u0002\u02e5?\u0003\u0002\u0002\u0002\u02e6\u02e9\u0005B"\u0002', + '\u02e7\u02e9\u0005D#\u0002\u02e8\u02e6\u0003\u0002\u0002\u0002\u02e8', + '\u02e7\u0003\u0002\u0002\u0002\u02e9A\u0003\u0002\u0002\u0002\u02ea', + '\u02eb\u0005\u0094K\u0002\u02eb\u02ec\u0005Z.\u0002\u02ec\u02ed\u0005', + '\u008cG\u0002\u02ed\u02ee\u0005\u009aN\u0002\u02ee\u02ef\u0005\u009e', + 'P\u0002\u02ef\u02f0\u0005\u01c8\u00e5\u0002\u02f0\u02f1\u0005F$\u0002', + '\u02f1C\u0003\u0002\u0002\u0002\u02f2\u02f3\u0005\u0094K\u0002\u02f3', + '\u02f4\u0005F$\u0002\u02f4\u02f5\u0005X-\u0002\u02f5\u02f6\u0005\u008c', + 'G\u0002\u02f6\u02f7\u0005\u009aN\u0002\u02f7\u02f8\u0005\u009eP\u0002', + '\u02f8\u02f9\u0005\u01c8\u00e5\u0002\u02f9E\u0003\u0002\u0002\u0002', + '\u02fa\u02fb\u0007\u00c3\u0002\u0002\u02fb\u02fc\u0005H%\u0002\u02fc', + 'G\u0003\u0002\u0002\u0002\u02fd\u02fe\u0005J&\u0002\u02fe\u02ff\u0005', + 'N(\u0002\u02ff\u0306\u0003\u0002\u0002\u0002\u0300\u0301\u0005J&\u0002', + "\u0301\u0302\u0005L'\u0002\u0302\u0303\u0005\u0188\u00c5\u0002\u0303", + '\u0304\u0005R*\u0002\u0304\u0306\u0003\u0002\u0002\u0002\u0305\u02fd', + '\u0003\u0002\u0002\u0002\u0305\u0300\u0003\u0002\u0002\u0002\u0306I', + '\u0003\u0002\u0002\u0002\u0307\u030b\u0003\u0002\u0002\u0002\u0308\u030b', + '\u0007#\u0002\u0002\u0309\u030b\u0007K\u0002\u0002\u030a\u0307\u0003', + '\u0002\u0002\u0002\u030a\u0308\u0003\u0002\u0002\u0002\u030a\u0309\u0003', + '\u0002\u0002\u0002\u030bK\u0003\u0002\u0002\u0002\u030c\u030d\t\u0003', + '\u0002\u0002\u030dM\u0003\u0002\u0002\u0002\u030e\u030f\b(\u0001\u0002', + '\u030f\u0310\u0005P)\u0002\u0310\u0316\u0003\u0002\u0002\u0002\u0311', + '\u0312\f\u0003\u0002\u0002\u0312\u0313\u0007\u001b\u0002\u0002\u0313', + '\u0315\u0005P)\u0002\u0314\u0311\u0003\u0002\u0002\u0002\u0315\u0318', + '\u0003\u0002\u0002\u0002\u0316\u0314\u0003\u0002\u0002\u0002\u0316\u0317', + '\u0003\u0002\u0002\u0002\u0317O\u0003\u0002\u0002\u0002\u0318\u0316', + '\u0003\u0002\u0002\u0002\u0319\u0322\u0007\f\u0002\u0002\u031a\u031b', + '\u0005\u0188\u00c5\u0002\u031b\u031c\u0007\t\u0002\u0002\u031c\u031d', + '\u0007\f\u0002\u0002\u031d\u0322\u0003\u0002\u0002\u0002\u031e\u031f', + '\u0005\u0188\u00c5\u0002\u031f\u0320\u0005R*\u0002\u0320\u0322\u0003', + '\u0002\u0002\u0002\u0321\u0319\u0003\u0002\u0002\u0002\u0321\u031a\u0003', + '\u0002\u0002\u0002\u0321\u031e\u0003\u0002\u0002\u0002\u0322Q\u0003', + '\u0002\u0002\u0002\u0323\u0326\u0003\u0002\u0002\u0002\u0324\u0326\u0005', + 'T+\u0002\u0325\u0323\u0003\u0002\u0002\u0002\u0325\u0324\u0003\u0002', + '\u0002\u0002\u0326S\u0003\u0002\u0002\u0002\u0327\u032b\u0005V,\u0002', + '\u0328\u0329\u0007)\u0002\u0002\u0329\u032b\u0005V,\u0002\u032a\u0327', + '\u0003\u0002\u0002\u0002\u032a\u0328\u0003\u0002\u0002\u0002\u032bU', + '\u0003\u0002\u0002\u0002\u032c\u032d\u0007\u00ef\u0002\u0002\u032dW', + '\u0003\u0002\u0002\u0002\u032e\u0331\u0003\u0002\u0002\u0002\u032f\u0331', + '\u0005Z.\u0002\u0330\u032e\u0003\u0002\u0002\u0002\u0330\u032f\u0003', + '\u0002\u0002\u0002\u0331Y\u0003\u0002\u0002\u0002\u0332\u0333\u0007', + 'a\u0002\u0002\u0333\u0334\u0005\\/\u0002\u0334[\u0003\u0002\u0002\u0002', + '\u0335\u0336\b/\u0001\u0002\u0336\u0340\u0005^0\u0002\u0337\u0338\u0005', + '^0\u0002\u0338\u0339\u0007\u00ba\u0002\u0002\u0339\u033a\u0005\u0086', + 'D\u0002\u033a\u033b\u0007{\u0002\u0002\u033b\u033c\u0005^0\u0002\u033c', + '\u033d\u0007\u009a\u0002\u0002\u033d\u033e\u0005\u0188\u00c5\u0002\u033e', + '\u0340\u0003\u0002\u0002\u0002\u033f\u0335\u0003\u0002\u0002\u0002\u033f', + '\u0337\u0003\u0002\u0002\u0002\u0340\u0373\u0003\u0002\u0002\u0002\u0341', + '\u0342\f\n\u0002\u0002\u0342\u0343\u0005\u0084C\u0002\u0343\u0344\u0007', + '{\u0002\u0002\u0344\u0345\u0005^0\u0002\u0345\u0346\u0005\u0088E\u0002', + '\u0346\u0372\u0003\u0002\u0002\u0002\u0347\u0348\f\t\u0002\u0002\u0348', + '\u0349\u0005\u0084C\u0002\u0349\u034a\u0007{\u0002\u0002\u034a\u034b', + '\u0005^0\u0002\u034b\u034c\u0005\u008aF\u0002\u034c\u034d\u0007_\u0002', + '\u0002\u034d\u034e\u0007\u00ef\u0002\u0002\u034e\u0372\u0003\u0002\u0002', + '\u0002\u034f\u0350\f\b\u0002\u0002\u0350\u0351\u0005\u0084C\u0002\u0351', + '\u0352\u0007\u0090\u0002\u0002\u0352\u0353\u0005^0\u0002\u0353\u0354', + '\u0005\u0088E\u0002\u0354\u0372\u0003\u0002\u0002\u0002\u0355\u0356', + '\f\u0007\u0002\u0002\u0356\u0357\u0005\u0084C\u0002\u0357\u0358\u0007', + '\u0090\u0002\u0002\u0358\u0359\u0005^0\u0002\u0359\u035a\u0005\u008a', + 'F\u0002\u035a\u035b\u0007_\u0002\u0002\u035b\u035c\u0007\u00ef\u0002', + '\u0002\u035c\u0372\u0003\u0002\u0002\u0002\u035d\u035e\f\u0006\u0002', + '\u0002\u035e\u035f\u0005\u0084C\u0002\u035f\u0360\u0005`1\u0002\u0360', + '\u0361\u0005\u0188\u00c5\u0002\u0361\u0362\u0005R*\u0002\u0362\u0372', + '\u0003\u0002\u0002\u0002\u0363\u0364\f\u0005\u0002\u0002\u0364\u0365', + '\u0005\u0084C\u0002\u0365\u0366\u0007{\u0002\u0002\u0366\u0367\u0005', + '^0\u0002\u0367\u0368\u0007\u009a\u0002\u0002\u0368\u0369\u0005\u0188', + '\u00c5\u0002\u0369\u0372\u0003\u0002\u0002\u0002\u036a\u036b\f\u0004', + '\u0002\u0002\u036b\u036c\u0005\u0084C\u0002\u036c\u036d\u0007\u0090', + '\u0002\u0002\u036d\u036e\u0005^0\u0002\u036e\u036f\u0007\u009a\u0002', + '\u0002\u036f\u0370\u0005\u0188\u00c5\u0002\u0370\u0372\u0003\u0002\u0002', + '\u0002\u0371\u0341\u0003\u0002\u0002\u0002\u0371\u0347\u0003\u0002\u0002', + '\u0002\u0371\u034f\u0003\u0002\u0002\u0002\u0371\u0355\u0003\u0002\u0002', + '\u0002\u0371\u035d\u0003\u0002\u0002\u0002\u0371\u0363\u0003\u0002\u0002', + '\u0002\u0371\u036a\u0003\u0002\u0002\u0002\u0372\u0375\u0003\u0002\u0002', + '\u0002\u0373\u0371\u0003\u0002\u0002\u0002\u0373\u0374\u0003\u0002\u0002', + '\u0002\u0374]\u0003\u0002\u0002\u0002\u0375\u0373\u0003\u0002\u0002', + '\u0002\u0376\u037c\u0005b2\u0002\u0377\u0378\u0005\u0188\u00c5\u0002', + '\u0378\u0379\u0005R*\u0002\u0379\u037a\u0005p9\u0002\u037a\u037c\u0003', + '\u0002\u0002\u0002\u037b\u0376\u0003\u0002\u0002\u0002\u037b\u0377\u0003', + '\u0002\u0002\u0002\u037c_\u0003\u0002\u0002\u0002\u037d\u037e\t\u0004', + '\u0002\u0002\u037ea\u0003\u0002\u0002\u0002\u037f\u0380\u0005d3\u0002', + '\u0380\u0381\u0005R*\u0002\u0381\u0382\u0005p9\u0002\u0382c\u0003\u0002', + '\u0002\u0002\u0383\u0384\u0005f4\u0002\u0384\u0385\u0005n8\u0002\u0385', + '\u038e\u0003\u0002\u0002\u0002\u0386\u0387\u0005f4\u0002\u0387\u0388', + '\u0005j6\u0002\u0388\u0389\u0007\t\u0002\u0002\u0389\u038a\u0005l7\u0002', + '\u038a\u038b\u0007\t\u0002\u0002\u038b\u038c\u0005n8\u0002\u038c\u038e', + '\u0003\u0002\u0002\u0002\u038d\u0383\u0003\u0002\u0002\u0002\u038d\u0386', + '\u0003\u0002\u0002\u0002\u038ee\u0003\u0002\u0002\u0002\u038f\u0393', + '\u0005h5\u0002\u0390\u0391\u0007\u00cb\u0002\u0002\u0391\u0393\u0007', + '\u001c\u0002\u0002\u0392\u038f\u0003\u0002\u0002\u0002\u0392\u0390\u0003', + '\u0002\u0002\u0002\u0393g\u0003\u0002\u0002\u0002\u0394\u0395\u0007', + '\u00ef\u0002\u0002\u0395\u0396\u0007\u001c\u0002\u0002\u0396i\u0003', + '\u0002\u0002\u0002\u0397\u0398\u0007\u00ef\u0002\u0002\u0398k\u0003', + '\u0002\u0002\u0002\u0399\u039a\u0007\u00ef\u0002\u0002\u039am\u0003', + '\u0002\u0002\u0002\u039b\u039c\u0007\u00ef\u0002\u0002\u039co\u0003', + '\u0002\u0002\u0002\u039d\u03a1\u0003\u0002\u0002\u0002\u039e\u039f\u0007', + '\u00dd\u0002\u0002\u039f\u03a1\u0005r:\u0002\u03a0\u039d\u0003\u0002', + '\u0002\u0002\u03a0\u039e\u0003\u0002\u0002\u0002\u03a1q\u0003\u0002', + '\u0002\u0002\u03a2\u03b2\u0005t;\u0002\u03a3\u03b2\u0005v<\u0002\u03a4', + '\u03b2\u0005x=\u0002\u03a5\u03a6\u0005v<\u0002\u03a6\u03a7\u0005x=\u0002', + '\u03a7\u03b2\u0003\u0002\u0002\u0002\u03a8\u03a9\u0005x=\u0002\u03a9', + '\u03aa\u0005v<\u0002\u03aa\u03b2\u0003\u0002\u0002\u0002\u03ab\u03ac', + '\u0005t;\u0002\u03ac\u03ad\u0005x=\u0002\u03ad\u03b2\u0003\u0002\u0002', + '\u0002\u03ae\u03af\u0005x=\u0002\u03af\u03b0\u0005t;\u0002\u03b0\u03b2', + '\u0003\u0002\u0002\u0002\u03b1\u03a2\u0003\u0002\u0002\u0002\u03b1\u03a3', + '\u0003\u0002\u0002\u0002\u03b1\u03a4\u0003\u0002\u0002\u0002\u03b1\u03a5', + '\u0003\u0002\u0002\u0002\u03b1\u03a8\u0003\u0002\u0002\u0002\u03b1\u03ab', + '\u0003\u0002\u0002\u0002\u03b1\u03ae\u0003\u0002\u0002\u0002\u03b2s', + '\u0003\u0002\u0002\u0002\u03b3\u03b4\u0005z>\u0002\u03b4\u03b5\u0007', + '}\u0002\u0002\u03b5\u03b6\u0005\u0188\u00c5\u0002\u03b6u\u0003\u0002', + '\u0002\u0002\u03b7\u03b8\u0007q\u0002\u0002\u03b8\u03b9\u0007\u0017', + '\u0002\u0002\u03b9\u03ba\u0005|?\u0002\u03ba\u03bb\u0007\u0018\u0002', + '\u0002\u03bbw\u0003\u0002\u0002\u0002\u03bc\u03bd\u0007i\u0002\u0002', + '\u03bd\u03be\u0007\u0017\u0002\u0002\u03be\u03bf\u0005\u0080A\u0002', + '\u03bf\u03c0\u0007\u0018\u0002\u0002\u03c0\u03c3\u0003\u0002\u0002\u0002', + '\u03c1\u03c3\u0007\u0091\u0002\u0002\u03c2\u03bc\u0003\u0002\u0002\u0002', + '\u03c2\u03c1\u0003\u0002\u0002\u0002\u03c3y\u0003\u0002\u0002\u0002', + '\u03c4\u03c7\u0003\u0002\u0002\u0002\u03c5\u03c7\u0007\u00a9\u0002\u0002', + '\u03c6\u03c4\u0003\u0002\u0002\u0002\u03c6\u03c5\u0003\u0002\u0002\u0002', + '\u03c7{\u0003\u0002\u0002\u0002\u03c8\u03c9\b?\u0001\u0002\u03c9\u03ca', + '\u0005~@\u0002\u03ca\u03d0\u0003\u0002\u0002\u0002\u03cb\u03cc\f\u0003', + '\u0002\u0002\u03cc\u03cd\u0007\u001b\u0002\u0002\u03cd\u03cf\u0005~', + '@\u0002\u03ce\u03cb\u0003\u0002\u0002\u0002\u03cf\u03d2\u0003\u0002', + '\u0002\u0002\u03d0\u03ce\u0003\u0002\u0002\u0002\u03d0\u03d1\u0003\u0002', + '\u0002\u0002\u03d1}\u0003\u0002\u0002\u0002\u03d2\u03d0\u0003\u0002', + '\u0002\u0002\u03d3\u03d4\u0005\u0142\u00a2\u0002\u03d4\u03d5\u0005\u014c', + '\u00a7\u0002\u03d5\u007f\u0003\u0002\u0002\u0002\u03d6\u03d7\t\u0005', + '\u0002\u0002\u03d7\u0081\u0003\u0002\u0002\u0002\u03d8\u03d9\u0005p', + '9\u0002\u03d9\u0083\u0003\u0002\u0002\u0002\u03da\u03df\u0003\u0002', + '\u0002\u0002\u03db\u03df\u0007t\u0002\u0002\u03dc\u03dd\u0007\u0082', + '\u0002\u0002\u03dd\u03df\u0005\u0086D\u0002\u03de\u03da\u0003\u0002', + '\u0002\u0002\u03de\u03db\u0003\u0002\u0002\u0002\u03de\u03dc\u0003\u0002', + '\u0002\u0002\u03df\u0085\u0003\u0002\u0002\u0002\u03e0\u03e3\u0003\u0002', + '\u0002\u0002\u03e1\u03e3\u0007\u00a0\u0002\u0002\u03e2\u03e0\u0003\u0002', + '\u0002\u0002\u03e2\u03e1\u0003\u0002\u0002\u0002\u03e3\u0087\u0003\u0002', + '\u0002\u0002\u03e4\u03e5\u0007\u009a\u0002\u0002\u03e5\u03e6\u0005z', + '>\u0002\u03e6\u03e7\u0007}\u0002\u0002\u03e7\u03e8\u0005\u0188\u00c5', + '\u0002\u03e8\u0089\u0003\u0002\u0002\u0002\u03e9\u03ea\u0007\u009a\u0002', + '\u0002\u03ea\u03eb\u0005z>\u0002\u03eb\u03ec\u0007|\u0002\u0002\u03ec', + '\u03ed\u0005\u0188\u00c5\u0002\u03ed\u008b\u0003\u0002\u0002\u0002\u03ee', + '\u03f1\u0003\u0002\u0002\u0002\u03ef\u03f1\u0005\u008eH\u0002\u03f0', + '\u03ee\u0003\u0002\u0002\u0002\u03f0\u03ef\u0003\u0002\u0002\u0002\u03f1', + '\u008d\u0003\u0002\u0002\u0002\u03f2\u03f3\u0007\u0083\u0002\u0002\u03f3', + '\u03f4\u0005\u0090I\u0002\u03f4\u008f\u0003\u0002\u0002\u0002\u03f5', + '\u03f6\bI\u0001\u0002\u03f6\u03f7\u0005\u0092J\u0002\u03f7\u03fd\u0003', + '\u0002\u0002\u0002\u03f8\u03f9\f\u0003\u0002\u0002\u03f9\u03fa\u0007', + '\u001b\u0002\u0002\u03fa\u03fc\u0005\u0092J\u0002\u03fb\u03f8\u0003', + '\u0002\u0002\u0002\u03fc\u03ff\u0003\u0002\u0002\u0002\u03fd\u03fb\u0003', + '\u0002\u0002\u0002\u03fd\u03fe\u0003\u0002\u0002\u0002\u03fe\u0091\u0003', + '\u0002\u0002\u0002\u03ff\u03fd\u0003\u0002\u0002\u0002\u0400\u0401\u0005', + 'V,\u0002\u0401\u0402\u0007\u0010\u0002\u0002\u0402\u0403\u0005\u0188', + '\u00c5\u0002\u0403\u0093\u0003\u0002\u0002\u0002\u0404\u0408\u0003\u0002', + '\u0002\u0002\u0405\u0406\u0007\u00ea\u0002\u0002\u0406\u0408\u0005\u0096', + 'L\u0002\u0407\u0404\u0003\u0002\u0002\u0002\u0407\u0405\u0003\u0002', + '\u0002\u0002\u0408\u0095\u0003\u0002\u0002\u0002\u0409\u040a\bL\u0001', + '\u0002\u040a\u040b\u0005\u0098M\u0002\u040b\u0411\u0003\u0002\u0002', + '\u0002\u040c\u040d\f\u0003\u0002\u0002\u040d\u040e\u0007\u001b\u0002', + '\u0002\u040e\u0410\u0005\u0098M\u0002\u040f\u040c\u0003\u0002\u0002', + '\u0002\u0410\u0413\u0003\u0002\u0002\u0002\u0411\u040f\u0003\u0002\u0002', + '\u0002\u0411\u0412\u0003\u0002\u0002\u0002\u0412\u0097\u0003\u0002\u0002', + '\u0002\u0413\u0411\u0003\u0002\u0002\u0002\u0414\u0415\u0005V,\u0002', + '\u0415\u0416\u0007)\u0002\u0002\u0416\u0417\u0005\u01c0\u00e1\u0002', + '\u0417\u0099\u0003\u0002\u0002\u0002\u0418\u041b\u0003\u0002\u0002\u0002', + '\u0419\u041b\u0005\u009cO\u0002\u041a\u0418\u0003\u0002\u0002\u0002', + '\u041a\u0419\u0003\u0002\u0002\u0002\u041b\u009b\u0003\u0002\u0002\u0002', + '\u041c\u041d\u0007\u00e7\u0002\u0002\u041d\u041e\u0005\u0188\u00c5\u0002', + '\u041e\u009d\u0003\u0002\u0002\u0002\u041f\u0422\u0003\u0002\u0002\u0002', + '\u0420\u0422\u0005\u00a0Q\u0002\u0421\u041f\u0003\u0002\u0002\u0002', + '\u0421\u0420\u0003\u0002\u0002\u0002\u0422\u009f\u0003\u0002\u0002\u0002', + '\u0423\u0424\u0007f\u0002\u0002\u0424\u0425\u00073\u0002\u0002\u0425', + '\u0426\u0005\u00a2R\u0002\u0426\u0427\u0005\u00a6T\u0002\u0427\u0428', + '\u0005\u00aaV\u0002\u0428\u042b\u0003\u0002\u0002\u0002\u0429\u042b', + '\u0005\u00a8U\u0002\u042a\u0423\u0003\u0002\u0002\u0002\u042a\u0429', + '\u0003\u0002\u0002\u0002\u042b\u00a1\u0003\u0002\u0002\u0002\u042c\u042d', + '\bR\u0001\u0002\u042d\u042e\u0005\u00a4S\u0002\u042e\u0434\u0003\u0002', + '\u0002\u0002\u042f\u0430\f\u0003\u0002\u0002\u0430\u0431\u0007\u001b', + '\u0002\u0002\u0431\u0433\u0005\u00a4S\u0002\u0432\u042f\u0003\u0002', + '\u0002\u0002\u0433\u0436\u0003\u0002\u0002\u0002\u0434\u0432\u0003\u0002', + '\u0002\u0002\u0434\u0435\u0003\u0002\u0002\u0002\u0435\u00a3\u0003\u0002', + '\u0002\u0002\u0436\u0434\u0003\u0002\u0002\u0002\u0437\u0438\u0005\u0188', + '\u00c5\u0002\u0438\u0439\u0005R*\u0002\u0439\u00a5\u0003\u0002\u0002', + '\u0002\u043a\u043d\u0003\u0002\u0002\u0002\u043b\u043d\u0005\u00a8U', + '\u0002\u043c\u043a\u0003\u0002\u0002\u0002\u043c\u043b\u0003\u0002\u0002', + '\u0002\u043d\u00a7\u0003\u0002\u0002\u0002\u043e\u043f\u0007\u0084\u0002', + '\u0002\u043f\u0440\u0005\u0090I\u0002\u0440\u00a9\u0003\u0002\u0002', + '\u0002\u0441\u0444\u0003\u0002\u0002\u0002\u0442\u0444\u0005\u00acW', + '\u0002\u0443\u0441\u0003\u0002\u0002\u0002\u0443\u0442\u0003\u0002\u0002', + '\u0002\u0444\u00ab\u0003\u0002\u0002\u0002\u0445\u0446\u0007j\u0002', + '\u0002\u0446\u0447\u0005\u0188\u00c5\u0002\u0447\u00ad\u0003\u0002\u0002', + '\u0002\u0448\u044b\u0003\u0002\u0002\u0002\u0449\u044b\u0005\u00b0Y', + '\u0002\u044a\u0448\u0003\u0002\u0002\u0002\u044a\u0449\u0003\u0002\u0002', + '\u0002\u044b\u00af\u0003\u0002\u0002\u0002\u044c\u044d\u0007\u009e\u0002', + '\u0002\u044d\u044e\u00073\u0002\u0002\u044e\u044f\u0005\u00b2Z\u0002', + '\u044f\u00b1\u0003\u0002\u0002\u0002\u0450\u0451\bZ\u0001\u0002\u0451', + '\u0452\u0005\u00b4[\u0002\u0452\u0458\u0003\u0002\u0002\u0002\u0453', + '\u0454\f\u0003\u0002\u0002\u0454\u0455\u0007\u001b\u0002\u0002\u0455', + '\u0457\u0005\u00b4[\u0002\u0456\u0453\u0003\u0002\u0002\u0002\u0457', + '\u045a\u0003\u0002\u0002\u0002\u0458\u0456\u0003\u0002\u0002\u0002\u0458', + '\u0459\u0003\u0002\u0002\u0002\u0459\u00b3\u0003\u0002\u0002\u0002\u045a', + '\u0458\u0003\u0002\u0002\u0002\u045b\u045c\u0005\u0188\u00c5\u0002\u045c', + '\u045d\u0005\u00b6\\\u0002\u045d\u045e\u0005\u00ba^\u0002\u045e\u00b5', + '\u0003\u0002\u0002\u0002\u045f\u0462\u0003\u0002\u0002\u0002\u0460\u0462', + '\u0005\u00b8]\u0002\u0461\u045f\u0003\u0002\u0002\u0002\u0461\u0460', + '\u0003\u0002\u0002\u0002\u0462\u00b7\u0003\u0002\u0002\u0002\u0463\u0464', + '\t\u0006\u0002\u0002\u0464\u00b9\u0003\u0002\u0002\u0002\u0465\u046a', + '\u0003\u0002\u0002\u0002\u0466\u0467\u0005\u00be`\u0002\u0467\u0468', + '\u0005\u00bc_\u0002\u0468\u046a\u0003\u0002\u0002\u0002\u0469\u0465', + '\u0003\u0002\u0002\u0002\u0469\u0466\u0003\u0002\u0002\u0002\u046a\u00bb', + '\u0003\u0002\u0002\u0002\u046b\u046c\t\u0007\u0002\u0002\u046c\u00bd', + '\u0003\u0002\u0002\u0002\u046d\u046e\u0007\u0096\u0002\u0002\u046e\u00bf', + '\u0003\u0002\u0002\u0002\u046f\u0472\u0003\u0002\u0002\u0002\u0470\u0472', + '\u0005\u00c2b\u0002\u0471\u046f\u0003\u0002\u0002\u0002\u0471\u0470', + '\u0003\u0002\u0002\u0002\u0472\u00c1\u0003\u0002\u0002\u0002\u0473\u0474', + '\u0007\u0087\u0002\u0002\u0474\u0475\u0005\u0188\u00c5\u0002\u0475\u00c3', + '\u0003\u0002\u0002\u0002\u0476\u0479\u0003\u0002\u0002\u0002\u0477\u0479', + '\u0005\u00c6d\u0002\u0478\u0476\u0003\u0002\u0002\u0002\u0478\u0477', + '\u0003\u0002\u0002\u0002\u0479\u00c5\u0003\u0002\u0002\u0002\u047a\u047b', + '\u0007\u0099\u0002\u0002\u047b\u047c\u0005\u0188\u00c5\u0002\u047c\u00c7', + '\u0003\u0002\u0002\u0002\u047d\u047e\u0007u\u0002\u0002\u047e\u047f', + '\u0007w\u0002\u0002\u047f\u0480\u0005\u00ccg\u0002\u0480\u0481\u0005', + '\u00ceh\u0002\u0481\u0482\u0005\u00d2j\u0002\u0482\u0483\u0005\u00dc', + 'o\u0002\u0483\u048e\u0003\u0002\u0002\u0002\u0484\u0485\u0007u\u0002', + '\u0002\u0485\u0486\u0007w\u0002\u0002\u0486\u0487\u0005\u00ccg\u0002', + '\u0487\u0488\u0007\u0017\u0002\u0002\u0488\u0489\u0005\u00e8u\u0002', + '\u0489\u048a\u0007\u0018\u0002\u0002\u048a\u048b\u0005:\u001e\u0002', + '\u048b\u048c\u0005\u00dco\u0002\u048c\u048e\u0003\u0002\u0002\u0002', + '\u048d\u047d\u0003\u0002\u0002\u0002\u048d\u0484\u0003\u0002\u0002\u0002', + '\u048e\u00c9\u0003\u0002\u0002\u0002\u048f\u0490\u0005n8\u0002\u0490', + '\u0491\u0005R*\u0002\u0491\u049d\u0003\u0002\u0002\u0002\u0492\u0493', + '\u0005d3\u0002\u0493\u0494\u0005R*\u0002\u0494\u049d\u0003\u0002\u0002', + '\u0002\u0495\u0496\u0005j6\u0002\u0496\u0497\u0007\t\u0002\u0002\u0497', + '\u0498\u0005l7\u0002\u0498\u0499\u0007\t\u0002\u0002\u0499\u049a\u0005', + 'n8\u0002\u049a\u049b\u0005R*\u0002\u049b\u049d\u0003\u0002\u0002\u0002', + '\u049c\u048f\u0003\u0002\u0002\u0002\u049c\u0492\u0003\u0002\u0002\u0002', + '\u049c\u0495\u0003\u0002\u0002\u0002\u049d\u00cb\u0003\u0002\u0002\u0002', + '\u049e\u04a3\u0005\u00caf\u0002\u049f\u04a0\u0005\u01a2\u00d2\u0002', + '\u04a0\u04a1\u0005R*\u0002\u04a1\u04a3\u0003\u0002\u0002\u0002\u04a2', + '\u049e\u0003\u0002\u0002\u0002\u04a2\u049f\u0003\u0002\u0002\u0002\u04a3', + '\u00cd\u0003\u0002\u0002\u0002\u04a4\u04b6\u0003\u0002\u0002\u0002\u04a5', + '\u04a6\u0007\u0017\u0002\u0002\u04a6\u04a7\u0005z>\u0002\u04a7\u04a8', + '\u0007|\u0002\u0002\u04a8\u04a9\u0007\u001b\u0002\u0002\u04a9\u04aa', + '\u0007\u00e1\u0002\u0002\u04aa\u04ab\u0007\u0018\u0002\u0002\u04ab\u04b6', + '\u0003\u0002\u0002\u0002\u04ac\u04ad\u0007\u0017\u0002\u0002\u04ad\u04ae', + '\u0005z>\u0002\u04ae\u04af\u0007|\u0002\u0002\u04af\u04b0\u0007\u001b', + '\u0002\u0002\u04b0\u04b1\u0007\u00e1\u0002\u0002\u04b1\u04b2\u0007\u001b', + '\u0002\u0002\u04b2\u04b3\u0007\u009c\u0002\u0002\u04b3\u04b4\u0007\u0018', + '\u0002\u0002\u04b4\u04b6\u0003\u0002\u0002\u0002\u04b5\u04a4\u0003\u0002', + '\u0002\u0002\u04b5\u04a5\u0003\u0002\u0002\u0002\u04b5\u04ac\u0003\u0002', + '\u0002\u0002\u04b6\u00cf\u0003\u0002\u0002\u0002\u04b7\u04b8\u0005z', + '>\u0002\u04b8\u04b9\u0007|\u0002\u0002\u04b9\u00d1\u0003\u0002\u0002', + '\u0002\u04ba\u04bb\bj\u0001\u0002\u04bb\u04bc\u0005\u00d4k\u0002\u04bc', + '\u04c2\u0003\u0002\u0002\u0002\u04bd\u04be\f\u0003\u0002\u0002\u04be', + '\u04bf\u0007\u001b\u0002\u0002\u04bf\u04c1\u0005\u00d6l\u0002\u04c0', + '\u04bd\u0003\u0002\u0002\u0002\u04c1\u04c4\u0003\u0002\u0002\u0002\u04c2', + '\u04c0\u0003\u0002\u0002\u0002\u04c2\u04c3\u0003\u0002\u0002\u0002\u04c3', + '\u00d3\u0003\u0002\u0002\u0002\u04c4\u04c2\u0003\u0002\u0002\u0002\u04c5', + '\u04c6\u0007\u00e3\u0002\u0002\u04c6\u04ca\u0005\u00d8m\u0002\u04c7', + '\u04c8\u0007\u00e3\u0002\u0002\u04c8\u04ca\u0005\u00dan\u0002\u04c9', + '\u04c5\u0003\u0002\u0002\u0002\u04c9\u04c7\u0003\u0002\u0002\u0002\u04ca', + '\u00d5\u0003\u0002\u0002\u0002\u04cb\u04cf\u0005\u00d4k\u0002\u04cc', + '\u04cf\u0005\u00d8m\u0002\u04cd\u04cf\u0005\u00dan\u0002\u04ce\u04cb', + '\u0003\u0002\u0002\u0002\u04ce\u04cc\u0003\u0002\u0002\u0002\u04ce\u04cd', + '\u0003\u0002\u0002\u0002\u04cf\u00d7\u0003\u0002\u0002\u0002\u04d0\u04d1', + '\u0007\u0017\u0002\u0002\u04d1\u04d2\u0005\u0188\u00c5\u0002\u04d2\u04d3', + '\u0007\u001b\u0002\u0002\u04d3\u04d4\u0005\u0188\u00c5\u0002\u04d4\u04d5', + '\u0007\u0018\u0002\u0002\u04d5\u00d9\u0003\u0002\u0002\u0002\u04d6\u04d7', + '\u0007\u0017\u0002\u0002\u04d7\u04d8\u0005\u0188\u00c5\u0002\u04d8\u04d9', + '\u0007\u001b\u0002\u0002\u04d9\u04da\u0005\u0188\u00c5\u0002\u04da\u04db', + '\u0007\u001b\u0002\u0002\u04db\u04dc\u0005\u0188\u00c5\u0002\u04dc\u04dd', + '\u0007\u0018\u0002\u0002\u04dd\u00db\u0003\u0002\u0002\u0002\u04de\u04e1', + '\u0003\u0002\u0002\u0002\u04df\u04e1\u0005\u00dep\u0002\u04e0\u04de', + '\u0003\u0002\u0002\u0002\u04e0\u04df\u0003\u0002\u0002\u0002\u04e1\u00dd', + '\u0003\u0002\u0002\u0002\u04e2\u04e3\u0007\u00b8\u0002\u0002\u04e3\u04e4', + '\u0005\u00e0q\u0002\u04e4\u00df\u0003\u0002\u0002\u0002\u04e5\u04ea', + "\u0005N(\u0002\u04e6\u04e7\u0005L'\u0002\u04e7\u04e8\u0005\u0188\u00c5", + '\u0002\u04e8\u04ea\u0003\u0002\u0002\u0002\u04e9\u04e5\u0003\u0002\u0002', + '\u0002\u04e9\u04e6\u0003\u0002\u0002\u0002\u04ea\u00e1\u0003\u0002\u0002', + '\u0002\u04eb\u04ec\u0005\u00d0i\u0002\u04ec\u04ed\u0005\u0188\u00c5', + '\u0002\u04ed\u00e3\u0003\u0002\u0002\u0002\u04ee\u04ef\u0007\u00e1\u0002', + '\u0002\u04ef\u04f0\u0005\u0188\u00c5\u0002\u04f0\u00e5\u0003\u0002\u0002', + '\u0002\u04f1\u04f2\u0007\u009c\u0002\u0002\u04f2\u04f3\u0005\u0188\u00c5', + '\u0002\u04f3\u00e7\u0003\u0002\u0002\u0002\u04f4\u0504\u0005\u00e2r', + '\u0002\u04f5\u04f6\u0005\u00e2r\u0002\u04f6\u04f7\u0007\u001b\u0002', + '\u0002\u04f7\u04f8\u0005\u00e4s\u0002\u04f8\u0504\u0003\u0002\u0002', + '\u0002\u04f9\u04fa\u0005\u00e2r\u0002\u04fa\u04fb\u0007\u001b\u0002', + '\u0002\u04fb\u04fc\u0005\u00e4s\u0002\u04fc\u04fd\u0007\u001b\u0002', + '\u0002\u04fd\u04fe\u0005\u00e6t\u0002\u04fe\u0504\u0003\u0002\u0002', + '\u0002\u04ff\u0500\u0005\u00e2r\u0002\u0500\u0501\u0007\u001b\u0002', + '\u0002\u0501\u0502\u0005\u00e6t\u0002\u0502\u0504\u0003\u0002\u0002', + '\u0002\u0503\u04f4\u0003\u0002\u0002\u0002\u0503\u04f5\u0003\u0002\u0002', + '\u0002\u0503\u04f9\u0003\u0002\u0002\u0002\u0503\u04ff\u0003\u0002\u0002', + '\u0002\u0504\u00e9\u0003\u0002\u0002\u0002\u0505\u0506\u0007\u00dc\u0002', + '\u0002\u0506\u0507\u0007w\u0002\u0002\u0507\u0508\u0005\u00ccg\u0002', + '\u0508\u0509\u0005\u00ceh\u0002\u0509\u050a\u0005\u00d2j\u0002\u050a', + '\u050b\u0005\u00dco\u0002\u050b\u0516\u0003\u0002\u0002\u0002\u050c', + '\u050d\u0007\u00dc\u0002\u0002\u050d\u050e\u0007w\u0002\u0002\u050e', + '\u050f\u0005\u00ccg\u0002\u050f\u0510\u0007\u0017\u0002\u0002\u0510', + '\u0511\u0005\u00e8u\u0002\u0511\u0512\u0007\u0018\u0002\u0002\u0512', + '\u0513\u0005:\u001e\u0002\u0513\u0514\u0005\u00dco\u0002\u0514\u0516', + '\u0003\u0002\u0002\u0002\u0515\u0505\u0003\u0002\u0002\u0002\u0515\u050c', + '\u0003\u0002\u0002\u0002\u0516\u00eb\u0003\u0002\u0002\u0002\u0517\u0518', + '\u0007G\u0002\u0002\u0518\u0519\u0007a\u0002\u0002\u0519\u051a\u0005', + '\u00ccg\u0002\u051a\u051b\u0005\u0082B\u0002\u051b\u051c\u0005\u009a', + 'N\u0002\u051c\u051d\u0005\u00c0a\u0002\u051d\u051e\u0005\u00dco\u0002', + '\u051e\u00ed\u0003\u0002\u0002\u0002\u051f\u0520\u0007\u00db\u0002\u0002', + '\u0520\u0521\u0005\u00ccg\u0002\u0521\u0522\u0005\u0082B\u0002\u0522', + '\u0523\u0005\u00f0y\u0002\u0523\u0524\u0005\u0106\u0084\u0002\u0524', + '\u0525\u0005\u009aN\u0002\u0525\u0526\u0005\u00c0a\u0002\u0526\u0527', + '\u0005\u00dco\u0002\u0527\u0539\u0003\u0002\u0002\u0002\u0528\u0529', + '\u0007\u00db\u0002\u0002\u0529\u052a\u0005\u00ccg\u0002\u052a\u052b', + '\u0005\u0082B\u0002\u052b\u052c\u0005\u00f0y\u0002\u052c\u052d\u0005', + '\u009aN\u0002\u052d\u052e\u0005\u00c0a\u0002\u052e\u052f\u0005\u00dc', + 'o\u0002\u052f\u0539\u0003\u0002\u0002\u0002\u0530\u0531\u0007\u00db', + '\u0002\u0002\u0531\u0532\u0005\u00ccg\u0002\u0532\u0533\u0005\u0082', + 'B\u0002\u0533\u0534\u0005\u0106\u0084\u0002\u0534\u0535\u0005\u009a', + 'N\u0002\u0535\u0536\u0005\u00c0a\u0002\u0536\u0537\u0005\u00dco\u0002', + '\u0537\u0539\u0003\u0002\u0002\u0002\u0538\u051f\u0003\u0002\u0002\u0002', + '\u0538\u0528\u0003\u0002\u0002\u0002\u0538\u0530\u0003\u0002\u0002\u0002', + '\u0539\u00ef\u0003\u0002\u0002\u0002\u053a\u053b\u0007\u00c5\u0002\u0002', + '\u053b\u053c\u0005\u00f2z\u0002\u053c\u00f1\u0003\u0002\u0002\u0002', + '\u053d\u053e\bz\u0001\u0002\u053e\u053f\u0005\u00f4{\u0002\u053f\u0545', + '\u0003\u0002\u0002\u0002\u0540\u0541\f\u0003\u0002\u0002\u0541\u0542', + '\u0007\u001b\u0002\u0002\u0542\u0544\u0005\u00f4{\u0002\u0543\u0540', + '\u0003\u0002\u0002\u0002\u0544\u0547\u0003\u0002\u0002\u0002\u0545\u0543', + '\u0003\u0002\u0002\u0002\u0545\u0546\u0003\u0002\u0002\u0002\u0546\u00f3', + '\u0003\u0002\u0002\u0002\u0547\u0545\u0003\u0002\u0002\u0002\u0548\u0549', + '\u0005\u0186\u00c4\u0002\u0549\u054a\u0007\u0010\u0002\u0002\u054a\u054b', + '\u0005\u0188\u00c5\u0002\u054b\u054c\u0005\u00f8}\u0002\u054c\u0554', + '\u0003\u0002\u0002\u0002\u054d\u054e\u0005\u00f6|\u0002\u054e\u054f', + '\u0007\t\u0002\u0002\u054f\u0550\u0005\u0186\u00c4\u0002\u0550\u0551', + '\u0007\u0010\u0002\u0002\u0551\u0552\u0005\u0188\u00c5\u0002\u0552\u0554', + '\u0003\u0002\u0002\u0002\u0553\u0548\u0003\u0002\u0002\u0002\u0553\u054d', + '\u0003\u0002\u0002\u0002\u0554\u00f5\u0003\u0002\u0002\u0002\u0555\u0556', + '\u0005\u01b2\u00da\u0002\u0556\u0557\u0007\u0017\u0002\u0002\u0557\u0558', + '\u0005\u019e\u00d0\u0002\u0558\u0559\u0007\u0018\u0002\u0002\u0559\u00f7', + '\u0003\u0002\u0002\u0002\u055a\u055d\u0003\u0002\u0002\u0002\u055b\u055d', + '\u0005\u00fa~\u0002\u055c\u055a\u0003\u0002\u0002\u0002\u055c\u055b', + '\u0003\u0002\u0002\u0002\u055d\u00f9\u0003\u0002\u0002\u0002\u055e\u055f', + '\u0005\u00fc\u007f\u0002\u055f\u0560\u0005\u0104\u0083\u0002\u0560\u0561', + '\u0007Q\u0002\u0002\u0561\u00fb\u0003\u0002\u0002\u0002\u0562\u0563', + '\b\u007f\u0001\u0002\u0563\u0564\u0007_\u0002\u0002\u0564\u0565\u0005', + '\u00fe\u0080\u0002\u0565\u056b\u0003\u0002\u0002\u0002\u0566\u0567\f', + '\u0003\u0002\u0002\u0567\u0568\u0007_\u0002\u0002\u0568\u056a\u0005', + '\u00fe\u0080\u0002\u0569\u0566\u0003\u0002\u0002\u0002\u056a\u056d\u0003', + '\u0002\u0002\u0002\u056b\u0569\u0003\u0002\u0002\u0002\u056b\u056c\u0003', + '\u0002\u0002\u0002\u056c\u00fd\u0003\u0002\u0002\u0002\u056d\u056b\u0003', + '\u0002\u0002\u0002\u056e\u056f\b\u0080\u0001\u0002\u056f\u0570\u0005', + '\u0100\u0081\u0002\u0570\u0576\u0003\u0002\u0002\u0002\u0571\u0572\f', + '\u0003\u0002\u0002\u0572\u0573\u0007\u001b\u0002\u0002\u0573\u0575\u0005', + '\u0100\u0081\u0002\u0574\u0571\u0003\u0002\u0002\u0002\u0575\u0578\u0003', + '\u0002\u0002\u0002\u0576\u0574\u0003\u0002\u0002\u0002\u0576\u0577\u0003', + '\u0002\u0002\u0002\u0577\u00ff\u0003\u0002\u0002\u0002\u0578\u0576\u0003', + '\u0002\u0002\u0002\u0579\u057a\u0005\u0102\u0082\u0002\u057a\u057b\u0007', + 'n\u0002\u0002\u057b\u057c\u0005\u0188\u00c5\u0002\u057c\u058e\u0003', + '\u0002\u0002\u0002\u057d\u057e\u0005\u0102\u0082\u0002\u057e\u057f\u0007', + '\u00eb\u0002\u0002\u057f\u0580\u0005\u0188\u00c5\u0002\u0580\u058e\u0003', + '\u0002\u0002\u0002\u0581\u0582\u0005\u0102\u0082\u0002\u0582\u0583\u0007', + '\u001c\u0002\u0002\u0583\u0584\u0005\u0102\u0082\u0002\u0584\u0585\u0007', + 'n\u0002\u0002\u0585\u0586\u0005\u0188\u00c5\u0002\u0586\u058e\u0003', + '\u0002\u0002\u0002\u0587\u0588\u0005\u0102\u0082\u0002\u0588\u0589\u0007', + '\u001c\u0002\u0002\u0589\u058a\u0005\u0102\u0082\u0002\u058a\u058b\u0007', + '\u00eb\u0002\u0002\u058b\u058c\u0005\u0188\u00c5\u0002\u058c\u058e\u0003', + '\u0002\u0002\u0002\u058d\u0579\u0003\u0002\u0002\u0002\u058d\u057d\u0003', + '\u0002\u0002\u0002\u058d\u0581\u0003\u0002\u0002\u0002\u058d\u0587\u0003', + '\u0002\u0002\u0002\u058e\u0101\u0003\u0002\u0002\u0002\u058f\u0590\u0007', + '\u00ef\u0002\u0002\u0590\u0103\u0003\u0002\u0002\u0002\u0591\u0595\u0003', + '\u0002\u0002\u0002\u0592\u0593\u0007\u00e6\u0002\u0002\u0593\u0595\u0005', + '\u0188\u00c5\u0002\u0594\u0591\u0003\u0002\u0002\u0002\u0594\u0592\u0003', + '\u0002\u0002\u0002\u0595\u0105\u0003\u0002\u0002\u0002\u0596\u0597\u0007', + '\u00da\u0002\u0002\u0597\u0598\u0005\u0108\u0085\u0002\u0598\u0107\u0003', + '\u0002\u0002\u0002\u0599\u059a\b\u0085\u0001\u0002\u059a\u059b\u0005', + '\u010a\u0086\u0002\u059b\u05a1\u0003\u0002\u0002\u0002\u059c\u059d\f', + '\u0003\u0002\u0002\u059d\u059e\u0007\u001b\u0002\u0002\u059e\u05a0\u0005', + '\u010a\u0086\u0002\u059f\u059c\u0003\u0002\u0002\u0002\u05a0\u05a3\u0003', + '\u0002\u0002\u0002\u05a1\u059f\u0003\u0002\u0002\u0002\u05a1\u05a2\u0003', + '\u0002\u0002\u0002\u05a2\u0109\u0003\u0002\u0002\u0002\u05a3\u05a1\u0003', + '\u0002\u0002\u0002\u05a4\u05a5\u0005\u0186\u00c4\u0002\u05a5\u05a6\u0005', + '\u00f8}\u0002\u05a6\u010b\u0003\u0002\u0002\u0002\u05a7\u05a8\u0007', + '\u008d\u0002\u0002\u05a8\u05a9\u0007w\u0002\u0002\u05a9\u05aa\u0005', + '\u00caf\u0002\u05aa\u05ab\u0005\u010e\u0088\u0002\u05ab\u05ac\u0007', + '\u00df\u0002\u0002\u05ac\u05ad\u0005^0\u0002\u05ad\u05ae\u0007\u009a', + '\u0002\u0002\u05ae\u05af\u0005\u0110\u0089\u0002\u05af\u05b0\u0005\u0188', + '\u00c5\u0002\u05b0\u05b1\u0005\u0112\u008a\u0002\u05b1\u05b2\u0005\u00c0', + 'a\u0002\u05b2\u05b3\u0005\u00dco\u0002\u05b3\u010d\u0003\u0002\u0002', + '\u0002\u05b4\u05b5\u0005p9\u0002\u05b5\u010f\u0003\u0002\u0002\u0002', + '\u05b6\u05b9\u0003\u0002\u0002\u0002\u05b7\u05b9\u0005\u00d0i\u0002', + '\u05b8\u05b6\u0003\u0002\u0002\u0002\u05b8\u05b7\u0003\u0002\u0002\u0002', + '\u05b9\u0111\u0003\u0002\u0002\u0002\u05ba\u05d0\u0003\u0002\u0002\u0002', + '\u05bb\u05bc\u0007\u00e6\u0002\u0002\u05bc\u05bd\u0007\u008b\u0002\u0002', + '\u05bd\u05be\u0007\u00cc\u0002\u0002\u05be\u05bf\u0007\u00db\u0002\u0002', + '\u05bf\u05c0\u0005\u0118\u008d\u0002\u05c0\u05c1\u0005\u0114\u008b\u0002', + '\u05c1\u05d0\u0003\u0002\u0002\u0002\u05c2\u05c3\u0007\u00e6\u0002\u0002', + '\u05c3\u05c4\u0007\u008b\u0002\u0002\u05c4\u05c5\u0007\u00cc\u0002\u0002', + '\u05c5\u05c6\u0007G\u0002\u0002\u05c6\u05c7\u0005\u011a\u008e\u0002', + '\u05c7\u05c8\u0005\u0116\u008c\u0002\u05c8\u05d0\u0003\u0002\u0002\u0002', + '\u05c9\u05ca\u0007\u00e6\u0002\u0002\u05ca\u05cb\u0007\u0093\u0002\u0002', + '\u05cb\u05cc\u0007\u008b\u0002\u0002\u05cc\u05cd\u0007\u00cc\u0002\u0002', + '\u05cd\u05ce\u0007u\u0002\u0002\u05ce\u05d0\u0005\u011c\u008f\u0002', + '\u05cf\u05ba\u0003\u0002\u0002\u0002\u05cf\u05bb\u0003\u0002\u0002\u0002', + '\u05cf\u05c2\u0003\u0002\u0002\u0002\u05cf\u05c9\u0003\u0002\u0002\u0002', + '\u05d0\u0113\u0003\u0002\u0002\u0002\u05d1\u05e0\u0003\u0002\u0002\u0002', + '\u05d2\u05d3\u0007\u00e6\u0002\u0002\u05d3\u05d4\u0007\u008b\u0002\u0002', + '\u05d4\u05d5\u0007\u00cc\u0002\u0002\u05d5\u05d6\u0007G\u0002\u0002', + '\u05d6\u05d7\u0005\u011a\u008e\u0002\u05d7\u05d8\u0005\u0116\u008c\u0002', + '\u05d8\u05e0\u0003\u0002\u0002\u0002\u05d9\u05da\u0007\u00e6\u0002\u0002', + '\u05da\u05db\u0007\u0093\u0002\u0002\u05db\u05dc\u0007\u008b\u0002\u0002', + '\u05dc\u05dd\u0007\u00cc\u0002\u0002\u05dd\u05de\u0007u\u0002\u0002', + '\u05de\u05e0\u0005\u011c\u008f\u0002\u05df\u05d1\u0003\u0002\u0002\u0002', + '\u05df\u05d2\u0003\u0002\u0002\u0002\u05df\u05d9\u0003\u0002\u0002\u0002', + '\u05e0\u0115\u0003\u0002\u0002\u0002\u05e1\u05e9\u0003\u0002\u0002\u0002', + '\u05e2\u05e3\u0007\u00e6\u0002\u0002\u05e3\u05e4\u0007\u0093\u0002\u0002', + '\u05e4\u05e5\u0007\u008b\u0002\u0002\u05e5\u05e6\u0007\u00cc\u0002\u0002', + '\u05e6\u05e7\u0007u\u0002\u0002\u05e7\u05e9\u0005\u011c\u008f\u0002', + '\u05e8\u05e1\u0003\u0002\u0002\u0002\u05e8\u05e2\u0003\u0002\u0002\u0002', + '\u05e9\u0117\u0003\u0002\u0002\u0002\u05ea\u05eb\u0005\u00f0y\u0002', + '\u05eb\u05ec\u0005\u009aN\u0002\u05ec\u05f5\u0003\u0002\u0002\u0002', + '\u05ed\u05ee\u0005\u00f0y\u0002\u05ee\u05ef\u0005\u0106\u0084\u0002', + '\u05ef\u05f0\u0005\u009aN\u0002\u05f0\u05f5\u0003\u0002\u0002\u0002', + '\u05f1\u05f2\u0005\u0106\u0084\u0002\u05f2\u05f3\u0005\u009aN\u0002', + '\u05f3\u05f5\u0003\u0002\u0002\u0002\u05f4\u05ea\u0003\u0002\u0002\u0002', + '\u05f4\u05ed\u0003\u0002\u0002\u0002\u05f4\u05f1\u0003\u0002\u0002\u0002', + '\u05f5\u0119\u0003\u0002\u0002\u0002\u05f6\u05f7\u0005\u009aN\u0002', + '\u05f7\u011b\u0003\u0002\u0002\u0002\u05f8\u05f9\u0005\u0188\u00c5\u0002', + '\u05f9\u05fa\u0005\u009aN\u0002\u05fa\u0607\u0003\u0002\u0002\u0002', + '\u05fb\u05fc\u0005\u00d8m\u0002\u05fc\u05fd\u0005\u009aN\u0002\u05fd', + '\u0607\u0003\u0002\u0002\u0002\u05fe\u05ff\u0005\u00dan\u0002\u05ff', + '\u0600\u0005\u009aN\u0002\u0600\u0607\u0003\u0002\u0002\u0002\u0601', + '\u0602\u0007\u0017\u0002\u0002\u0602\u0603\u0005\u00e8u\u0002\u0603', + '\u0604\u0007\u0018\u0002\u0002\u0604\u0605\u0005\u009aN\u0002\u0605', + '\u0607\u0003\u0002\u0002\u0002\u0606\u05f8\u0003\u0002\u0002\u0002\u0606', + '\u05fb\u0003\u0002\u0002\u0002\u0606\u05fe\u0003\u0002\u0002\u0002\u0606', + '\u0601\u0003\u0002\u0002\u0002\u0607\u011d\u0003\u0002\u0002\u0002\u0608', + '\u0609\u0007e\u0002\u0002\u0609\u060a\u0005\u0120\u0091\u0002\u060a', + '\u060b\u0007\u00ce\u0002\u0002\u060b\u060c\u0005\u0128\u0095\u0002\u060c', + '\u0615\u0003\u0002\u0002\u0002\u060d\u060e\u0007e\u0002\u0002\u060e', + '\u060f\u0005\u0120\u0091\u0002\u060f\u0610\u0007\u009a\u0002\u0002\u0610', + '\u0611\u0005\u0124\u0093\u0002\u0611\u0612\u0007\u00ce\u0002\u0002\u0612', + '\u0613\u0005\u0128\u0095\u0002\u0613\u0615\u0003\u0002\u0002\u0002\u0614', + '\u0608\u0003\u0002\u0002\u0002\u0614\u060d\u0003\u0002\u0002\u0002\u0615', + '\u011f\u0003\u0002\u0002\u0002\u0616\u0617\b\u0091\u0001\u0002\u0617', + '\u0618\u0005\u0122\u0092\u0002\u0618\u061e\u0003\u0002\u0002\u0002\u0619', + '\u061a\f\u0003\u0002\u0002\u061a\u061b\u0007\u001b\u0002\u0002\u061b', + '\u061d\u0005\u0122\u0092\u0002\u061c\u0619\u0003\u0002\u0002\u0002\u061d', + '\u0620\u0003\u0002\u0002\u0002\u061e\u061c\u0003\u0002\u0002\u0002\u061e', + '\u061f\u0003\u0002\u0002\u0002\u061f\u0121\u0003\u0002\u0002\u0002\u0620', + '\u061e\u0003\u0002\u0002\u0002\u0621\u0622\t\b\u0002\u0002\u0622\u0123', + '\u0003\u0002\u0002\u0002\u0623\u0624\b\u0093\u0001\u0002\u0624\u0625', + '\u0005\u0126\u0094\u0002\u0625\u062b\u0003\u0002\u0002\u0002\u0626\u0627', + '\f\u0003\u0002\u0002\u0627\u0628\u0007\u001b\u0002\u0002\u0628\u062a', + '\u0005\u0126\u0094\u0002\u0629\u0626\u0003\u0002\u0002\u0002\u062a\u062d', + '\u0003\u0002\u0002\u0002\u062b\u0629\u0003\u0002\u0002\u0002\u062b\u062c', + '\u0003\u0002\u0002\u0002\u062c\u0125\u0003\u0002\u0002\u0002\u062d\u062b', + '\u0003\u0002\u0002\u0002\u062e\u0649\u0005n8\u0002\u062f\u0630\u0005', + 'h5\u0002\u0630\u0631\u0005n8\u0002\u0631\u0649\u0003\u0002\u0002\u0002', + '\u0632\u0633\u0005h5\u0002\u0633\u0634\u0005j6\u0002\u0634\u0635\u0007', + '\t\u0002\u0002\u0635\u0636\u0005l7\u0002\u0636\u0637\u0007\t\u0002\u0002', + '\u0637\u0638\u0005n8\u0002\u0638\u0649\u0003\u0002\u0002\u0002\u0639', + '\u063a\u0005j6\u0002\u063a\u063b\u0007\t\u0002\u0002\u063b\u063c\u0005', + 'l7\u0002\u063c\u063d\u0007\t\u0002\u0002\u063d\u063e\u0005n8\u0002\u063e', + '\u0649\u0003\u0002\u0002\u0002\u063f\u0640\u0005h5\u0002\u0640\u0641', + '\u0005j6\u0002\u0641\u0642\u0007\t\u0002\u0002\u0642\u0643\u0005l7\u0002', + '\u0643\u0649\u0003\u0002\u0002\u0002\u0644\u0645\u0005j6\u0002\u0645', + '\u0646\u0007\t\u0002\u0002\u0646\u0647\u0005l7\u0002\u0647\u0649\u0003', + '\u0002\u0002\u0002\u0648\u062e\u0003\u0002\u0002\u0002\u0648\u062f\u0003', + '\u0002\u0002\u0002\u0648\u0632\u0003\u0002\u0002\u0002\u0648\u0639\u0003', + '\u0002\u0002\u0002\u0648\u063f\u0003\u0002\u0002\u0002\u0648\u0644\u0003', + '\u0002\u0002\u0002\u0649\u0127\u0003\u0002\u0002\u0002\u064a\u064b\b', + '\u0095\u0001\u0002\u064b\u064c\u0005\u012a\u0096\u0002\u064c\u0652\u0003', + '\u0002\u0002\u0002\u064d\u064e\f\u0003\u0002\u0002\u064e\u064f\u0007', + '\u001b\u0002\u0002\u064f\u0651\u0005\u012a\u0096\u0002\u0650\u064d\u0003', + '\u0002\u0002\u0002\u0651\u0654\u0003\u0002\u0002\u0002\u0652\u0650\u0003', + '\u0002\u0002\u0002\u0652\u0653\u0003\u0002\u0002\u0002\u0653\u0129\u0003', + '\u0002\u0002\u0002\u0654\u0652\u0003\u0002\u0002\u0002\u0655\u065a\u0007', + '\u00ef\u0002\u0002\u0656\u0657\u0007\u00ef\u0002\u0002\u0657\u0658\u0007', + '\u001c\u0002\u0002\u0658\u065a\u0007\u00ef\u0002\u0002\u0659\u0655\u0003', + '\u0002\u0002\u0002\u0659\u0656\u0003\u0002\u0002\u0002\u065a\u012b\u0003', + '\u0002\u0002\u0002\u065b\u065c\u0007\u00b9\u0002\u0002\u065c\u065d\u0005', + '\u0120\u0091\u0002\u065d\u065e\u0007a\u0002\u0002\u065e\u065f\u0005', + '\u0128\u0095\u0002\u065f\u0668\u0003\u0002\u0002\u0002\u0660\u0661\u0007', + '\u00b9\u0002\u0002\u0661\u0662\u0005\u0120\u0091\u0002\u0662\u0663\u0007', + '\u009a\u0002\u0002\u0663\u0664\u0005\u0124\u0093\u0002\u0664\u0665\u0007', + 'a\u0002\u0002\u0665\u0666\u0005\u0128\u0095\u0002\u0666\u0668\u0003', + '\u0002\u0002\u0002\u0667\u065b\u0003\u0002\u0002\u0002\u0667\u0660\u0003', + '\u0002\u0002\u0002\u0668\u012d\u0003\u0002\u0002\u0002\u0669\u066a\u0007', + '@\u0002\u0002\u066a\u066b\u0007\u00c2\u0002\u0002\u066b\u066d\u0005', + '\u0148\u00a5\u0002\u066c\u066e\u0005\u020a\u0106\u0002\u066d\u066c\u0003', + '\u0002\u0002\u0002\u066d\u066e\u0003\u0002\u0002\u0002\u066e\u012f\u0003', + '\u0002\u0002\u0002\u066f\u0670\u0007M\u0002\u0002\u0670\u0671\u0007', + '\u00c2\u0002\u0002\u0671\u0673\u0005\u0148\u00a5\u0002\u0672\u0674\u0005', + '\u0208\u0105\u0002\u0673\u0672\u0003\u0002\u0002\u0002\u0673\u0674\u0003', + '\u0002\u0002\u0002\u0674\u0131\u0003\u0002\u0002\u0002\u0675\u0676\u0007', + '@\u0002\u0002\u0676\u0677\u00079\u0002\u0002\u0677\u0679\u0005\u0144', + '\u00a3\u0002\u0678\u067a\u0005\u020a\u0106\u0002\u0679\u0678\u0003\u0002', + '\u0002\u0002\u0679\u067a\u0003\u0002\u0002\u0002\u067a\u0133\u0003\u0002', + '\u0002\u0002\u067b\u067c\u0007M\u0002\u0002\u067c\u067d\u00079\u0002', + '\u0002\u067d\u067f\u0005\u0144\u00a3\u0002\u067e\u0680\u0005\u0208\u0105', + '\u0002\u067f\u067e\u0003\u0002\u0002\u0002\u067f\u0680\u0003\u0002\u0002', + '\u0002\u0680\u0135\u0003\u0002\u0002\u0002\u0681\u0682\u0005\u0138\u009d', + '\u0002\u0682\u0683\u00079\u0002\u0002\u0683\u0684\u0005\u0144\u00a3', + '\u0002\u0684\u0137\u0003\u0002\u0002\u0002\u0685\u0686\t\t\u0002\u0002', + '\u0686\u0139\u0003\u0002\u0002\u0002\u0687\u0688\u0007@\u0002\u0002', + '\u0688\u0689\u0007q\u0002\u0002\u0689\u068a\u0005\u0140\u00a1\u0002', + '\u068a\u068b\u0007\u009a\u0002\u0002\u068b\u068c\u0005\u0144\u00a3\u0002', + '\u068c\u068d\u0007\u0017\u0002\u0002\u068d\u068e\u0005\u0154\u00ab\u0002', + '\u068e\u068f\u0007\u0018\u0002\u0002\u068f\u0690\u0005\u014a\u00a6\u0002', + '\u0690\u0691\u0005\u015e\u00b0\u0002\u0691\u0692\u0005\u014c\u00a7\u0002', + '\u0692\u0694\u0005\u0150\u00a9\u0002\u0693\u0695\u0005\u020a\u0106\u0002', + '\u0694\u0693\u0003\u0002\u0002\u0002\u0694\u0695\u0003\u0002\u0002\u0002', + '\u0695\u013b\u0003\u0002\u0002\u0002\u0696\u0697\u0007@\u0002\u0002', + '\u0697\u0698\u0007\u00a9\u0002\u0002\u0698\u0699\u0007q\u0002\u0002', + '\u0699\u069a\u0005\u013e\u00a0\u0002\u069a\u069b\u0007\u009a\u0002\u0002', + '\u069b\u069c\u0005\u0144\u00a3\u0002\u069c\u069d\u0005\u014a\u00a6\u0002', + '\u069d\u069e\u0005\u014c\u00a7\u0002\u069e\u06a0\u0005\u0150\u00a9\u0002', + '\u069f\u06a1\u0005\u020a\u0106\u0002\u06a0\u069f\u0003\u0002\u0002\u0002', + '\u06a0\u06a1\u0003\u0002\u0002\u0002\u06a1\u013d\u0003\u0002\u0002\u0002', + '\u06a2\u06a5\u0003\u0002\u0002\u0002\u06a3\u06a5\u0005\u0140\u00a1\u0002', + '\u06a4\u06a2\u0003\u0002\u0002\u0002\u06a4\u06a3\u0003\u0002\u0002\u0002', + '\u06a5\u013f\u0003\u0002\u0002\u0002\u06a6\u06a7\u0007\u00ef\u0002\u0002', + '\u06a7\u0141\u0003\u0002\u0002\u0002\u06a8\u06ab\u0003\u0002\u0002\u0002', + '\u06a9\u06ab\u0005\u0140\u00a1\u0002\u06aa\u06a8\u0003\u0002\u0002\u0002', + '\u06aa\u06a9\u0003\u0002\u0002\u0002\u06ab\u0143\u0003\u0002\u0002\u0002', + '\u06ac\u06b7\u0005\u0146\u00a4\u0002\u06ad\u06ae\u0005h5\u0002\u06ae', + '\u06af\u0005j6\u0002\u06af\u06b7\u0003\u0002\u0002\u0002\u06b0\u06b1', + '\u0005j6\u0002\u06b1\u06b2\u0007\t\u0002\u0002\u06b2\u06b3\u0005l7\u0002', + '\u06b3\u06b4\u0007\t\u0002\u0002\u06b4\u06b5\u0005n8\u0002\u06b5\u06b7', + '\u0003\u0002\u0002\u0002\u06b6\u06ac\u0003\u0002\u0002\u0002\u06b6\u06ad', + '\u0003\u0002\u0002\u0002\u06b6\u06b0\u0003\u0002\u0002\u0002\u06b7\u0145', + '\u0003\u0002\u0002\u0002\u06b8\u06c1\u0005n8\u0002\u06b9\u06ba\u0005', + 'h5\u0002\u06ba\u06bb\u0005j6\u0002\u06bb\u06bc\u0007\t\u0002\u0002\u06bc', + '\u06bd\u0005l7\u0002\u06bd\u06be\u0007\t\u0002\u0002\u06be\u06bf\u0005', + 'n8\u0002\u06bf\u06c1\u0003\u0002\u0002\u0002\u06c0\u06b8\u0003\u0002', + '\u0002\u0002\u06c0\u06b9\u0003\u0002\u0002\u0002\u06c1\u0147\u0003\u0002', + '\u0002\u0002\u06c2\u06c3\u0005h5\u0002\u06c3\u06c4\u0005j6\u0002\u06c4', + '\u06c5\u0007\t\u0002\u0002\u06c5\u06c6\u0005l7\u0002\u06c6\u06cc\u0003', + '\u0002\u0002\u0002\u06c7\u06c8\u0005j6\u0002\u06c8\u06c9\u0007\t\u0002', + '\u0002\u06c9\u06ca\u0005l7\u0002\u06ca\u06cc\u0003\u0002\u0002\u0002', + '\u06cb\u06c2\u0003\u0002\u0002\u0002\u06cb\u06c7\u0003\u0002\u0002\u0002', + '\u06cc\u0149\u0003\u0002\u0002\u0002\u06cd\u06d6\u0003\u0002\u0002\u0002', + '\u06ce\u06cf\u0007\u00a3\u0002\u0002\u06cf\u06d0\u00073\u0002\u0002', + '\u06d0\u06d1\u0007i\u0002\u0002\u06d1\u06d2\u0007\u0017\u0002\u0002', + '\u06d2\u06d3\u0005\u01a0\u00d1\u0002\u06d3\u06d4\u0007\u0018\u0002\u0002', + '\u06d4\u06d6\u0003\u0002\u0002\u0002\u06d5\u06cd\u0003\u0002\u0002\u0002', + '\u06d5\u06ce\u0003\u0002\u0002\u0002\u06d6\u014b\u0003\u0002\u0002\u0002', + '\u06d7\u06da\u0003\u0002\u0002\u0002\u06d8\u06da\u0005\u014e\u00a8\u0002', + '\u06d9\u06d7\u0003\u0002\u0002\u0002\u06d9\u06d8\u0003\u0002\u0002\u0002', + '\u06da\u014d\u0003\u0002\u0002\u0002\u06db\u06dc\u0007\u00df\u0002\u0002', + '\u06dc\u06e2\u0007\u00e5\u0002\u0002\u06dd\u06de\u0007\u00df\u0002\u0002', + '\u06de\u06e2\u0007h\u0002\u0002\u06df\u06e0\u0007\u00df\u0002\u0002', + '\u06e0\u06e2\u0007b\u0002\u0002\u06e1\u06db\u0003\u0002\u0002\u0002', + '\u06e1\u06dd\u0003\u0002\u0002\u0002\u06e1\u06df\u0003\u0002\u0002\u0002', + '\u06e2\u014f\u0003\u0002\u0002\u0002\u06e3\u06e6\u0003\u0002\u0002\u0002', + '\u06e4\u06e6\u0005\u0152\u00aa\u0002\u06e5\u06e3\u0003\u0002\u0002\u0002', + '\u06e5\u06e4\u0003\u0002\u0002\u0002\u06e6\u0151\u0003\u0002\u0002\u0002', + '\u06e7\u06e8\u0007\u00ea\u0002\u0002\u06e8\u06e9\u0005\u0188\u00c5\u0002', + '\u06e9\u0153\u0003\u0002\u0002\u0002\u06ea\u06eb\b\u00ab\u0001\u0002', + '\u06eb\u06ec\u0005\u0156\u00ac\u0002\u06ec\u06f2\u0003\u0002\u0002\u0002', + '\u06ed\u06ee\f\u0003\u0002\u0002\u06ee\u06ef\u0007\u001b\u0002\u0002', + '\u06ef\u06f1\u0005\u0156\u00ac\u0002\u06f0\u06ed\u0003\u0002\u0002\u0002', + '\u06f1\u06f4\u0003\u0002\u0002\u0002\u06f2\u06f0\u0003\u0002\u0002\u0002', + '\u06f2\u06f3\u0003\u0002\u0002\u0002\u06f3\u0155\u0003\u0002\u0002\u0002', + '\u06f4\u06f2\u0003\u0002\u0002\u0002\u06f5\u06f6\u0005\u0158\u00ad\u0002', + '\u06f6\u06f7\u0005\u0160\u00b1\u0002\u06f7\u0157\u0003\u0002\u0002\u0002', + '\u06f8\u0703\u0005\u015a\u00ae\u0002\u06f9\u06fa\u0005\u015c\u00af\u0002', + '\u06fa\u06fb\u0005\u015a\u00ae\u0002\u06fb\u0703\u0003\u0002\u0002\u0002', + '\u06fc\u06fd\u0005\u015c\u00af\u0002\u06fd\u06fe\u0007K\u0002\u0002', + '\u06fe\u06ff\u0005\u015a\u00ae\u0002\u06ff\u0703\u0003\u0002\u0002\u0002', + '\u0700\u0701\u0007K\u0002\u0002\u0701\u0703\u0005\u015a\u00ae\u0002', + '\u0702\u06f8\u0003\u0002\u0002\u0002\u0702\u06f9\u0003\u0002\u0002\u0002', + '\u0702\u06fc\u0003\u0002\u0002\u0002\u0702\u0700\u0003\u0002\u0002\u0002', + '\u0703\u0159\u0003\u0002\u0002\u0002\u0704\u0705\u0005\u0188\u00c5\u0002', + '\u0705\u015b\u0003\u0002\u0002\u0002\u0706\u0707\t\n\u0002\u0002\u0707', + '\u015d\u0003\u0002\u0002\u0002\u0708\u070c\u0003\u0002\u0002\u0002\u0709', + '\u070a\u0007\u00e7\u0002\u0002\u070a\u070c\u0005\u015a\u00ae\u0002\u070b', + '\u0708\u0003\u0002\u0002\u0002\u070b\u0709\u0003\u0002\u0002\u0002\u070c', + '\u015f\u0003\u0002\u0002\u0002\u070d\u0713\u0003\u0002\u0002\u0002\u070e', + '\u0713\u0005\u0162\u00b2\u0002\u070f\u0710\u0005\u0162\u00b2\u0002\u0710', + '\u0711\u0005\u0162\u00b2\u0002\u0711\u0713\u0003\u0002\u0002\u0002\u0712', + '\u070d\u0003\u0002\u0002\u0002\u0712\u070e\u0003\u0002\u0002\u0002\u0712', + '\u070f\u0003\u0002\u0002\u0002\u0713\u0161\u0003\u0002\u0002\u0002\u0714', + '\u0715\t\u000b\u0002\u0002\u0715\u0163\u0003\u0002\u0002\u0002\u0716', + '\u0717\u0007M\u0002\u0002\u0717\u0718\u0007\u00a9\u0002\u0002\u0718', + '\u0719\u0007q\u0002\u0002\u0719\u071a\u0007\u009a\u0002\u0002\u071a', + '\u071b\u0005\u0144\u00a3\u0002\u071b\u071c\u0005\u014c\u00a7\u0002\u071c', + '\u072c\u0003\u0002\u0002\u0002\u071d\u071e\u0007M\u0002\u0002\u071e', + '\u071f\u0007q\u0002\u0002\u071f\u0720\u0005\u0146\u00a4\u0002\u0720', + '\u0721\u0007\t\u0002\u0002\u0721\u0722\u0005\u0140\u00a1\u0002\u0722', + '\u0723\u0005\u014c\u00a7\u0002\u0723\u072c\u0003\u0002\u0002\u0002\u0724', + '\u0725\u0007M\u0002\u0002\u0725\u0726\u0007q\u0002\u0002\u0726\u0727', + '\u0005\u0140\u00a1\u0002\u0727\u0728\u0007\u009a\u0002\u0002\u0728\u0729', + '\u0005\u0144\u00a3\u0002\u0729\u072a\u0005\u014c\u00a7\u0002\u072a\u072c', + '\u0003\u0002\u0002\u0002\u072b\u0716\u0003\u0002\u0002\u0002\u072b\u071d', + '\u0003\u0002\u0002\u0002\u072b\u0724\u0003\u0002\u0002\u0002\u072c\u0165', + '\u0003\u0002\u0002\u0002\u072d\u072e\u0007$\u0002\u0002\u072e\u072f', + '\u0007q\u0002\u0002\u072f\u0730\u0005\u0146\u00a4\u0002\u0730\u0731', + '\u0007\t\u0002\u0002\u0731\u0732\u0005\u0140\u00a1\u0002\u0732\u0733', + '\u0005\u014c\u00a7\u0002\u0733\u0734\u0005\u0152\u00aa\u0002\u0734\u073e', + '\u0003\u0002\u0002\u0002\u0735\u0736\u0007$\u0002\u0002\u0736\u0737', + '\u0007q\u0002\u0002\u0737\u0738\u0005\u0140\u00a1\u0002\u0738\u0739', + '\u0007\u009a\u0002\u0002\u0739\u073a\u0005\u0144\u00a3\u0002\u073a\u073b', + '\u0005\u014c\u00a7\u0002\u073b\u073c\u0005\u0152\u00aa\u0002\u073c\u073e', + '\u0003\u0002\u0002\u0002\u073d\u072d\u0003\u0002\u0002\u0002\u073d\u0735', + '\u0003\u0002\u0002\u0002\u073e\u0167\u0003\u0002\u0002\u0002\u073f\u0740', + '\u00072\u0002\u0002\u0740\u0741\u0007q\u0002\u0002\u0741\u0742\u0007', + '\u009a\u0002\u0002\u0742\u0743\u0005\u0144\u00a3\u0002\u0743\u0744\u0007', + '\u0017\u0002\u0002\u0744\u0745\u0005\u01a0\u00d1\u0002\u0745\u0746\u0007', + '\u0018\u0002\u0002\u0746\u0747\u0005\u014c\u00a7\u0002\u0747\u0169\u0003', + '\u0002\u0002\u0002\u0748\u0749\u0007@\u0002\u0002\u0749\u074a\u0005', + '\u016c\u00b7\u0002\u074a\u074b\u0007c\u0002\u0002\u074b\u074c\u0005', + '\u016e\u00b8\u0002\u074c\u074d\u0007\u0017\u0002\u0002\u074d\u074e\u0005', + '\u0174\u00bb\u0002\u074e\u074f\u0007\u0018\u0002\u0002\u074f\u0750\u0005', + '\u0178\u00bd\u0002\u0750\u016b\u0003\u0002\u0002\u0002\u0751\u0755\u0003', + '\u0002\u0002\u0002\u0752\u0753\u0007\u009d\u0002\u0002\u0753\u0755\u0007', + '\u00b5\u0002\u0002\u0754\u0751\u0003\u0002\u0002\u0002\u0754\u0752\u0003', + '\u0002\u0002\u0002\u0755\u016d\u0003\u0002\u0002\u0002\u0756\u0759\u0005', + '\u0170\u00b9\u0002\u0757\u0759\u0005\u0172\u00ba\u0002\u0758\u0756\u0003', + '\u0002\u0002\u0002\u0758\u0757\u0003\u0002\u0002\u0002\u0759\u016f\u0003', + '\u0002\u0002\u0002\u075a\u075b\u0005n8\u0002\u075b\u0171\u0003\u0002', + '\u0002\u0002\u075c\u075d\u0005f4\u0002\u075d\u075e\u0005n8\u0002\u075e', + '\u0767\u0003\u0002\u0002\u0002\u075f\u0760\u0005f4\u0002\u0760\u0761', + '\u0005j6\u0002\u0761\u0762\u0007\t\u0002\u0002\u0762\u0763\u0005l7\u0002', + '\u0763\u0764\u0007\t\u0002\u0002\u0764\u0765\u0005n8\u0002\u0765\u0767', + '\u0003\u0002\u0002\u0002\u0766\u075c\u0003\u0002\u0002\u0002\u0766\u075f', + '\u0003\u0002\u0002\u0002\u0767\u0173\u0003\u0002\u0002\u0002\u0768\u076e', + '\u0003\u0002\u0002\u0002\u0769\u076a\u0007\t\u0002\u0002\u076a\u076b', + '\u0007\t\u0002\u0002\u076b\u076e\u0007\t\u0002\u0002\u076c\u076e\u0005', + '\u0176\u00bc\u0002\u076d\u0768\u0003\u0002\u0002\u0002\u076d\u0769\u0003', + '\u0002\u0002\u0002\u076d\u076c\u0003\u0002\u0002\u0002\u076e\u0175\u0003', + '\u0002\u0002\u0002\u076f\u0770\b\u00bc\u0001\u0002\u0770\u0771\u0007', + '\u00ef\u0002\u0002\u0771\u0777\u0003\u0002\u0002\u0002\u0772\u0773\f', + '\u0003\u0002\u0002\u0773\u0774\u0007\u001b\u0002\u0002\u0774\u0776\u0007', + '\u00ef\u0002\u0002\u0775\u0772\u0003\u0002\u0002\u0002\u0776\u0779\u0003', + '\u0002\u0002\u0002\u0777\u0775\u0003\u0002\u0002\u0002\u0777\u0778\u0003', + '\u0002\u0002\u0002\u0778\u0177\u0003\u0002\u0002\u0002\u0779\u0777\u0003', + '\u0002\u0002\u0002\u077a\u077b\u0007\u0019\u0002\u0002\u077b\u077c\u0005', + '\u0188\u00c5\u0002\u077c\u077d\u0007\u001a\u0002\u0002\u077d\u078f\u0003', + '\u0002\u0002\u0002\u077e\u077f\u0007\u0080\u0002\u0002\u077f\u0780\u0007', + 's\u0002\u0002\u0780\u0781\u0007)\u0002\u0002\u0781\u078f\u0005\u0188', + '\u00c5\u0002\u0782\u0783\u0007\u0080\u0002\u0002\u0783\u0784\u0007d', + '\u0002\u0002\u0784\u0785\u0007)\u0002\u0002\u0785\u0786\u0007\u0003', + '\u0002\u0002\u0786\u0787\u0007+\u0002\u0002\u0787\u078f\u0007\u0003', + '\u0002\u0002\u0788\u0789\u0007\u0080\u0002\u0002\u0789\u078a\u0007z', + '\u0002\u0002\u078a\u078b\u0007)\u0002\u0002\u078b\u078c\u0007\u0003', + '\u0002\u0002\u078c\u078d\u0007+\u0002\u0002\u078d\u078f\u0007\u0003', + '\u0002\u0002\u078e\u077a\u0003\u0002\u0002\u0002\u078e\u077e\u0003\u0002', + '\u0002\u0002\u078e\u0782\u0003\u0002\u0002\u0002\u078e\u0788\u0003\u0002', + '\u0002\u0002\u078f\u0179\u0003\u0002\u0002\u0002\u0790\u0791\u0007M', + '\u0002\u0002\u0791\u0792\u0007c\u0002\u0002\u0792\u0793\u0005\u016e', + '\u00b8\u0002\u0793\u017b\u0003\u0002\u0002\u0002\u0794\u0795\u0007U', + '\u0002\u0002\u0795\u0796\u0007c\u0002\u0002\u0796\u0797\u0005\u016e', + '\u00b8\u0002\u0797\u0798\u0007\u0017\u0002\u0002\u0798\u0799\u0005\u019e', + '\u00d0\u0002\u0799\u079a\u0007\u0018\u0002\u0002\u079a\u017d\u0003\u0002', + '\u0002\u0002\u079b\u079c\u0007\u00db\u0002\u0002\u079c\u079d\u0007\u00c9', + '\u0002\u0002\u079d\u079e\u0005\u0180\u00c1\u0002\u079e\u079f\u0005\u0144', + '\u00a3\u0002\u079f\u07a0\u0007\u0017\u0002\u0002\u07a0\u07a1\u0005\u0182', + '\u00c2\u0002\u07a1\u07a2\u0007\u0018\u0002\u0002\u07a2\u07a3\u0005$', + '\u0013\u0002\u07a3\u0816\u0003\u0002\u0002\u0002\u07a4\u07a5\u0007\u00db', + '\u0002\u0002\u07a5\u07a6\u0007\u00c9\u0002\u0002\u07a6\u07a7\u0005\u0180', + '\u00c1\u0002\u07a7\u07a8\u0005\u0144\u00a3\u0002\u07a8\u07a9\u0007G', + '\u0002\u0002\u07a9\u07aa\u0007\u0017\u0002\u0002\u07aa\u07ab\u0005\u0182', + '\u00c2\u0002\u07ab\u07ac\u0007\u0018\u0002\u0002\u07ac\u0816\u0003\u0002', + '\u0002\u0002\u07ad\u07ae\u0007\u00db\u0002\u0002\u07ae\u07af\u0007\u00c9', + '\u0002\u0002\u07af\u07b0\u0005\u0180\u00c1\u0002\u07b0\u07b1\u0005\u0144', + '\u00a3\u0002\u07b1\u07b2\u0007G\u0002\u0002\u07b2\u07b3\u0007#\u0002', + '\u0002\u07b3\u0816\u0003\u0002\u0002\u0002\u07b4\u07b5\u0007\u00db\u0002', + '\u0002\u07b5\u07b6\u0007\u00c9\u0002\u0002\u07b6\u07b7\u0005\u0180\u00c1', + '\u0002\u07b7\u07b8\u0005\u0144\u00a3\u0002\u07b8\u07b9\u0007q\u0002', + '\u0002\u07b9\u07ba\u0007\u0017\u0002\u0002\u07ba\u07bb\u0005\u01a0\u00d1', + '\u0002\u07bb\u07bc\u0007\u0018\u0002\u0002\u07bc\u07bd\u0005\u014c\u00a7', + '\u0002\u07bd\u07be\u0005$\u0013\u0002\u07be\u0816\u0003\u0002\u0002', + '\u0002\u07bf\u07c0\u0007\u00db\u0002\u0002\u07c0\u07c1\u0007\u00c9\u0002', + '\u0002\u07c1\u07c2\u0005\u0180\u00c1\u0002\u07c2\u07c3\u0005\u0144\u00a3', + '\u0002\u07c3\u07c4\u0007q\u0002\u0002\u07c4\u07c5\u0007#\u0002\u0002', + '\u07c5\u07c6\u0005\u014c\u00a7\u0002\u07c6\u07c7\u0005$\u0013\u0002', + '\u07c7\u0816\u0003\u0002\u0002\u0002\u07c8\u07c9\u0007\u00db\u0002\u0002', + '\u07c9\u07ca\u0007\u00c9\u0002\u0002\u07ca\u07cb\u0007_\u0002\u0002', + '\u07cb\u07cc\u0007q\u0002\u0002\u07cc\u07cd\u0005\u0146\u00a4\u0002', + '\u07cd\u07ce\u0007\t\u0002\u0002\u07ce\u07cf\u0005\u0140\u00a1\u0002', + '\u07cf\u07d0\u0005\u014c\u00a7\u0002\u07d0\u07d1\u0005$\u0013\u0002', + '\u07d1\u0816\u0003\u0002\u0002\u0002\u07d2\u07d3\u0007\u00db\u0002\u0002', + '\u07d3\u07d4\u0007\u00c9\u0002\u0002\u07d4\u07d5\u0007_\u0002\u0002', + '\u07d5\u07d6\u0007q\u0002\u0002\u07d6\u07d7\u0005\u0140\u00a1\u0002', + '\u07d7\u07d8\u0007\u009a\u0002\u0002\u07d8\u07d9\u0005\u0144\u00a3\u0002', + '\u07d9\u07da\u0005\u014c\u00a7\u0002\u07da\u07db\u0005$\u0013\u0002', + '\u07db\u0816\u0003\u0002\u0002\u0002\u07dc\u07dd\u0007%\u0002\u0002', + '\u07dd\u07de\u0005 \u0011\u0002\u07de\u07df\u0005\u0144\u00a3\u0002', + '\u07df\u07e0\u0007\u0017\u0002\u0002\u07e0\u07e1\u0005\u0182\u00c2\u0002', + '\u07e1\u07e2\u0007\u0018\u0002\u0002\u07e2\u07e3\u0005$\u0013\u0002', + '\u07e3\u0816\u0003\u0002\u0002\u0002\u07e4\u07e5\u0007%\u0002\u0002', + '\u07e5\u07e6\u0005 \u0011\u0002\u07e6\u07e7\u0005\u0144\u00a3\u0002', + '\u07e7\u07e8\u0007G\u0002\u0002\u07e8\u07e9\u0007\u00c9\u0002\u0002', + '\u07e9\u07ea\u0007\u0017\u0002\u0002\u07ea\u07eb\u0005\u0182\u00c2\u0002', + '\u07eb\u07ec\u0007\u0018\u0002\u0002\u07ec\u0816\u0003\u0002\u0002\u0002', + '\u07ed\u07ee\u0007%\u0002\u0002\u07ee\u07ef\u0005 \u0011\u0002\u07ef', + '\u07f0\u0005\u0144\u00a3\u0002\u07f0\u07f1\u0007G\u0002\u0002\u07f1', + '\u07f2\u0007\u00c9\u0002\u0002\u07f2\u0816\u0003\u0002\u0002\u0002\u07f3', + '\u07f4\u0007%\u0002\u0002\u07f4\u07f5\u0005 \u0011\u0002\u07f5\u07f6', + '\u0005\u0144\u00a3\u0002\u07f6\u07f7\u0007q\u0002\u0002\u07f7\u07f8', + '\u0007\u0017\u0002\u0002\u07f8\u07f9\u0005\u01a0\u00d1\u0002\u07f9\u07fa', + '\u0007\u0018\u0002\u0002\u07fa\u07fb\u0005\u014c\u00a7\u0002\u07fb\u07fc', + '\u0005$\u0013\u0002\u07fc\u0816\u0003\u0002\u0002\u0002\u07fd\u07fe', + '\u0007%\u0002\u0002\u07fe\u07ff\u0005 \u0011\u0002\u07ff\u0800\u0005', + '\u0144\u00a3\u0002\u0800\u0801\u0007q\u0002\u0002\u0801\u0802\u0007', + '#\u0002\u0002\u0802\u0803\u0005\u014c\u00a7\u0002\u0803\u0804\u0005', + '$\u0013\u0002\u0804\u0816\u0003\u0002\u0002\u0002\u0805\u0806\u0007', + '%\u0002\u0002\u0806\u0807\u0007q\u0002\u0002\u0807\u0808\u0005\u0146', + '\u00a4\u0002\u0808\u0809\u0007\t\u0002\u0002\u0809\u080a\u0005\u0140', + '\u00a1\u0002\u080a\u080b\u0005\u014c\u00a7\u0002\u080b\u080c\u0005$', + '\u0013\u0002\u080c\u0816\u0003\u0002\u0002\u0002\u080d\u080e\u0007%', + '\u0002\u0002\u080e\u080f\u0007q\u0002\u0002\u080f\u0810\u0005\u0140', + '\u00a1\u0002\u0810\u0811\u0007\u009a\u0002\u0002\u0811\u0812\u0005\u0144', + '\u00a3\u0002\u0812\u0813\u0005\u014c\u00a7\u0002\u0813\u0814\u0005$', + '\u0013\u0002\u0814\u0816\u0003\u0002\u0002\u0002\u0815\u079b\u0003\u0002', + '\u0002\u0002\u0815\u07a4\u0003\u0002\u0002\u0002\u0815\u07ad\u0003\u0002', + '\u0002\u0002\u0815\u07b4\u0003\u0002\u0002\u0002\u0815\u07bf\u0003\u0002', + '\u0002\u0002\u0815\u07c8\u0003\u0002\u0002\u0002\u0815\u07d2\u0003\u0002', + '\u0002\u0002\u0815\u07dc\u0003\u0002\u0002\u0002\u0815\u07e4\u0003\u0002', + '\u0002\u0002\u0815\u07ed\u0003\u0002\u0002\u0002\u0815\u07f3\u0003\u0002', + '\u0002\u0002\u0815\u07fd\u0003\u0002\u0002\u0002\u0815\u0805\u0003\u0002', + '\u0002\u0002\u0815\u080d\u0003\u0002\u0002\u0002\u0816\u017f\u0003\u0002', + '\u0002\u0002\u0817\u081a\u0003\u0002\u0002\u0002\u0818\u081a\u0007_', + '\u0002\u0002\u0819\u0817\u0003\u0002\u0002\u0002\u0819\u0818\u0003\u0002', + '\u0002\u0002\u081a\u0181\u0003\u0002\u0002\u0002\u081b\u081c\b\u00c2', + '\u0001\u0002\u081c\u081d\u0005\u0184\u00c3\u0002\u081d\u0823\u0003\u0002', + '\u0002\u0002\u081e\u081f\f\u0003\u0002\u0002\u081f\u0820\u0007\u001b', + '\u0002\u0002\u0820\u0822\u0005\u0184\u00c3\u0002\u0821\u081e\u0003\u0002', + '\u0002\u0002\u0822\u0825\u0003\u0002\u0002\u0002\u0823\u0821\u0003\u0002', + '\u0002\u0002\u0823\u0824\u0003\u0002\u0002\u0002\u0824\u0183\u0003\u0002', + '\u0002\u0002\u0825\u0823\u0003\u0002\u0002\u0002\u0826\u0827\u0005\u0158', + '\u00ad\u0002\u0827\u0185\u0003\u0002\u0002\u0002\u0828\u0829\b\u00c4', + '\u0001\u0002\u0829\u082a\u0007\u00ef\u0002\u0002\u082a\u0844\u0003\u0002', + '\u0002\u0002\u082b\u082c\f\u0007\u0002\u0002\u082c\u082d\u0007\t\u0002', + '\u0002\u082d\u0843\u0007\u00ef\u0002\u0002\u082e\u082f\f\u0006\u0002', + '\u0002\u082f\u0830\u0007\t\u0002\u0002\u0830\u0843\u0007\u00ee\u0002', + '\u0002\u0831\u0832\f\u0005\u0002\u0002\u0832\u0833\u0007\t\u0002\u0002', + '\u0833\u0834\u0007\u001d\u0002\u0002\u0834\u0835\u0005\u0188\u00c5\u0002', + '\u0835\u0836\u0007\u001e\u0002\u0002\u0836\u0843\u0003\u0002\u0002\u0002', + '\u0837\u0838\f\u0004\u0002\u0002\u0838\u0839\u0007\t\u0002\u0002\u0839', + '\u083a\u0007\u001d\u0002\u0002\u083a\u083b\u0005\u0188\u00c5\u0002\u083b', + '\u083c\u0007\u001f\u0002\u0002\u083c\u0843\u0003\u0002\u0002\u0002\u083d', + '\u083e\f\u0003\u0002\u0002\u083e\u083f\u0007\u001d\u0002\u0002\u083f', + '\u0840\u0005\u0188\u00c5\u0002\u0840\u0841\u0007\u001e\u0002\u0002\u0841', + '\u0843\u0003\u0002\u0002\u0002\u0842\u082b\u0003\u0002\u0002\u0002\u0842', + '\u082e\u0003\u0002\u0002\u0002\u0842\u0831\u0003\u0002\u0002\u0002\u0842', + '\u0837\u0003\u0002\u0002\u0002\u0842\u083d\u0003\u0002\u0002\u0002\u0843', + '\u0846\u0003\u0002\u0002\u0002\u0844\u0842\u0003\u0002\u0002\u0002\u0844', + '\u0845\u0003\u0002\u0002\u0002\u0845\u0187\u0003\u0002\u0002\u0002\u0846', + '\u0844\u0003\u0002\u0002\u0002\u0847\u0848\b\u00c5\u0001\u0002\u0848', + '\u084e\u0005\u018c\u00c7\u0002\u0849\u084a\u0007\u0093\u0002\u0002\u084a', + '\u084e\u0005\u0188\u00c5\u0019\u084b\u084c\u0007V\u0002\u0002\u084c', + '\u084e\u0005\u0188\u00c5\u0003\u084d\u0847\u0003\u0002\u0002\u0002\u084d', + '\u0849\u0003\u0002\u0002\u0002\u084d\u084b\u0003\u0002\u0002\u0002\u084e', + '\u08dd\u0003\u0002\u0002\u0002\u084f\u0850\f!\u0002\u0002\u0850\u0851', + '\u0007\n\u0002\u0002\u0851\u08dc\u0005\u0188\u00c5"\u0852\u0853\f ', + '\u0002\u0002\u0853\u0854\u0007\u000b\u0002\u0002\u0854\u08dc\u0005\u0188', + '\u00c5!\u0855\u0856\f\u001f\u0002\u0002\u0856\u0857\u0007\f\u0002\u0002', + '\u0857\u08dc\u0005\u0188\u00c5 \u0858\u0859\f\u001e\u0002\u0002\u0859', + '\u085a\u0007\r\u0002\u0002\u085a\u08dc\u0005\u0188\u00c5\u001f\u085b', + '\u085c\f\u001d\u0002\u0002\u085c\u085d\u0007\u000e\u0002\u0002\u085d', + '\u08dc\u0005\u0188\u00c5\u001e\u085e\u085f\f\u001c\u0002\u0002\u085f', + '\u0860\u0007\u0016\u0002\u0002\u0860\u08dc\u0005\u0188\u00c5\u001d\u0861', + '\u0862\f\u001b\u0002\u0002\u0862\u0863\u0007&\u0002\u0002\u0863\u08dc', + '\u0005\u0188\u00c5\u001c\u0864\u0865\f\u001a\u0002\u0002\u0865\u0866', + '\u0007\u009d\u0002\u0002\u0866\u08dc\u0005\u0188\u00c5\u001b\u0867\u0868', + '\f\u0018\u0002\u0002\u0868\u0869\u0007\u0010\u0002\u0002\u0869\u08dc', + '\u0005\u0188\u00c5\u0019\u086a\u086b\f\u0017\u0002\u0002\u086b\u086c', + '\u0007\u000f\u0002\u0002\u086c\u08dc\u0005\u0188\u00c5\u0018\u086d\u086e', + '\f\u0016\u0002\u0002\u086e\u086f\u0007\u0011\u0002\u0002\u086f\u08dc', + '\u0005\u0188\u00c5\u0017\u0870\u0871\f\u0015\u0002\u0002\u0871\u0872', + '\u0007\u0012\u0002\u0002\u0872\u08dc\u0005\u0188\u00c5\u0016\u0873\u0874', + '\f\u0014\u0002\u0002\u0874\u0875\u0007\u0014\u0002\u0002\u0875\u08dc', + '\u0005\u0188\u00c5\u0015\u0876\u0877\f\u0013\u0002\u0002\u0877\u0878', + '\u0007\u0013\u0002\u0002\u0878\u08dc\u0005\u0188\u00c5\u0014\u0879\u087a', + '\f\u0012\u0002\u0002\u087a\u087b\u0007\u0015\u0002\u0002\u087b\u08dc', + '\u0005\u0188\u00c5\u0013\u087c\u087d\f\u000f\u0002\u0002\u087d\u087e', + '\u0007\u0086\u0002\u0002\u087e\u08dc\u0005\u0188\u00c5\u0010\u087f\u0880', + '\f\u000e\u0002\u0002\u0880\u0881\u0007\u0093\u0002\u0002\u0881\u0882', + '\u0007\u0086\u0002\u0002\u0882\u08dc\u0005\u0188\u00c5\u000f\u0883\u0884', + '\f\r\u0002\u0002\u0884\u0885\u0007n\u0002\u0002\u0885\u08dc\u0005\u0188', + '\u00c5\u000e\u0886\u0887\f\f\u0002\u0002\u0887\u0888\u0007\u0093\u0002', + '\u0002\u0888\u0889\u0007n\u0002\u0002\u0889\u08dc\u0005\u0188\u00c5', + '\r\u088a\u088b\f\u000b\u0002\u0002\u088b\u088c\u0007\u00eb\u0002\u0002', + '\u088c\u08dc\u0005\u0188\u00c5\f\u088d\u088e\f\n\u0002\u0002\u088e\u088f', + '\u0007\u0093\u0002\u0002\u088f\u0890\u0007\u00eb\u0002\u0002\u0890\u08dc', + '\u0005\u0188\u00c5\u000b\u0891\u0892\f)\u0002\u0002\u0892\u0893\u0007', + '\t\u0002\u0002\u0893\u08dc\u0007\u00ef\u0002\u0002\u0894\u0895\f(\u0002', + '\u0002\u0895\u0896\u0007\t\u0002\u0002\u0896\u08dc\u0007\u00ee\u0002', + "\u0002\u0897\u0898\f'\u0002\u0002\u0898\u0899\u0007\t\u0002\u0002\u0899", + '\u089a\u0007\u001d\u0002\u0002\u089a\u089b\u0005\u0188\u00c5\u0002\u089b', + '\u089c\u0007\u001e\u0002\u0002\u089c\u08dc\u0003\u0002\u0002\u0002\u089d', + '\u089e\f&\u0002\u0002\u089e\u089f\u0007\t\u0002\u0002\u089f\u08a0\u0007', + '\u001d\u0002\u0002\u08a0\u08a1\u0005\u0188\u00c5\u0002\u08a1\u08a2\u0007', + '\u001f\u0002\u0002\u08a2\u08dc\u0003\u0002\u0002\u0002\u08a3\u08a4\f', + '%\u0002\u0002\u08a4\u08a5\u0007\u001d\u0002\u0002\u08a5\u08a6\u0005', + '\u0188\u00c5\u0002\u08a6\u08a7\u0007\u001e\u0002\u0002\u08a7\u08dc\u0003', + '\u0002\u0002\u0002\u08a8\u08a9\f$\u0002\u0002\u08a9\u08aa\u0007\u001d', + '\u0002\u0002\u08aa\u08ab\u0005\u0188\u00c5\u0002\u08ab\u08ac\u0007\u001c', + '\u0002\u0002\u08ac\u08ad\u0007\u001e\u0002\u0002\u08ad\u08dc\u0003\u0002', + '\u0002\u0002\u08ae\u08af\f#\u0002\u0002\u08af\u08b0\u0007\u001d\u0002', + '\u0002\u08b0\u08b1\u0005\u0188\u00c5\u0002\u08b1\u08b2\u0007\u001c\u0002', + '\u0002\u08b2\u08b3\u0005\u0188\u00c5\u0002\u08b3\u08b4\u0007\u001e\u0002', + '\u0002\u08b4\u08dc\u0003\u0002\u0002\u0002\u08b5\u08b6\f"\u0002\u0002', + '\u08b6\u08b7\u0007\u001d\u0002\u0002\u08b7\u08b8\u0007\f\u0002\u0002', + '\u08b8\u08dc\u0007\u001e\u0002\u0002\u08b9\u08ba\f\u0011\u0002\u0002', + '\u08ba\u08bb\u0007-\u0002\u0002\u08bb\u08bc\u0005\u018e\u00c8\u0002', + '\u08bc\u08bd\u0007&\u0002\u0002\u08bd\u08be\u0005\u018e\u00c8\u0002', + '\u08be\u08dc\u0003\u0002\u0002\u0002\u08bf\u08c0\f\u0010\u0002\u0002', + '\u08c0\u08c1\u0007\u0093\u0002\u0002\u08c1\u08c2\u0007-\u0002\u0002', + '\u08c2\u08c3\u0005\u018e\u00c8\u0002\u08c3\u08c4\u0007&\u0002\u0002', + '\u08c4\u08c5\u0005\u018e\u00c8\u0002\u08c5\u08dc\u0003\u0002\u0002\u0002', + '\u08c6\u08c7\f\t\u0002\u0002\u08c7\u08c8\u0007x\u0002\u0002\u08c8\u08dc', + '\u0007\u0095\u0002\u0002\u08c9\u08ca\f\b\u0002\u0002\u08ca\u08cb\u0007', + 'x\u0002\u0002\u08cb\u08cc\u0007\u0093\u0002\u0002\u08cc\u08dc\u0007', + '\u0095\u0002\u0002\u08cd\u08ce\f\u0007\u0002\u0002\u08ce\u08cf\u0007', + 'x\u0002\u0002\u08cf\u08dc\u0007\u008e\u0002\u0002\u08d0\u08d1\f\u0006', + '\u0002\u0002\u08d1\u08d2\u0007x\u0002\u0002\u08d2\u08d3\u0007\u0093', + '\u0002\u0002\u08d3\u08dc\u0007\u008e\u0002\u0002\u08d4\u08d5\f\u0005', + '\u0002\u0002\u08d5\u08d6\u0007x\u0002\u0002\u08d6\u08dc\u0005\u018a', + '\u00c6\u0002\u08d7\u08d8\f\u0004\u0002\u0002\u08d8\u08d9\u0007x\u0002', + '\u0002\u08d9\u08da\u0007\u0093\u0002\u0002\u08da\u08dc\u0005\u018a\u00c6', + '\u0002\u08db\u084f\u0003\u0002\u0002\u0002\u08db\u0852\u0003\u0002\u0002', + '\u0002\u08db\u0855\u0003\u0002\u0002\u0002\u08db\u0858\u0003\u0002\u0002', + '\u0002\u08db\u085b\u0003\u0002\u0002\u0002\u08db\u085e\u0003\u0002\u0002', + '\u0002\u08db\u0861\u0003\u0002\u0002\u0002\u08db\u0864\u0003\u0002\u0002', + '\u0002\u08db\u0867\u0003\u0002\u0002\u0002\u08db\u086a\u0003\u0002\u0002', + '\u0002\u08db\u086d\u0003\u0002\u0002\u0002\u08db\u0870\u0003\u0002\u0002', + '\u0002\u08db\u0873\u0003\u0002\u0002\u0002\u08db\u0876\u0003\u0002\u0002', + '\u0002\u08db\u0879\u0003\u0002\u0002\u0002\u08db\u087c\u0003\u0002\u0002', + '\u0002\u08db\u087f\u0003\u0002\u0002\u0002\u08db\u0883\u0003\u0002\u0002', + '\u0002\u08db\u0886\u0003\u0002\u0002\u0002\u08db\u088a\u0003\u0002\u0002', + '\u0002\u08db\u088d\u0003\u0002\u0002\u0002\u08db\u0891\u0003\u0002\u0002', + '\u0002\u08db\u0894\u0003\u0002\u0002\u0002\u08db\u0897\u0003\u0002\u0002', + '\u0002\u08db\u089d\u0003\u0002\u0002\u0002\u08db\u08a3\u0003\u0002\u0002', + '\u0002\u08db\u08a8\u0003\u0002\u0002\u0002\u08db\u08ae\u0003\u0002\u0002', + '\u0002\u08db\u08b5\u0003\u0002\u0002\u0002\u08db\u08b9\u0003\u0002\u0002', + '\u0002\u08db\u08bf\u0003\u0002\u0002\u0002\u08db\u08c6\u0003\u0002\u0002', + '\u0002\u08db\u08c9\u0003\u0002\u0002\u0002\u08db\u08cd\u0003\u0002\u0002', + '\u0002\u08db\u08d0\u0003\u0002\u0002\u0002\u08db\u08d4\u0003\u0002\u0002', + '\u0002\u08db\u08d7\u0003\u0002\u0002\u0002\u08dc\u08df\u0003\u0002\u0002', + '\u0002\u08dd\u08db\u0003\u0002\u0002\u0002\u08dd\u08de\u0003\u0002\u0002', + '\u0002\u08de\u0189\u0003\u0002\u0002\u0002\u08df\u08dd\u0003\u0002\u0002', + '\u0002\u08e0\u08e1\t\f\u0002\u0002\u08e1\u018b\u0003\u0002\u0002\u0002', + '\u08e2\u08f3\u0005\u0190\u00c9\u0002\u08e3\u08f3\u0005\u0192\u00ca\u0002', + '\u08e4\u08f3\u0007\u00ef\u0002\u0002\u08e5\u08f3\u0007\u00ee\u0002\u0002', + '\u08e6\u08f3\u0007\u00c4\u0002\u0002\u08e7\u08f3\u0005\u01a2\u00d2\u0002', + '\u08e8\u08f3\u0005\u01b0\u00d9\u0002\u08e9\u08f3\u0007\u000b\u0002\u0002', + '\u08ea\u08f3\u0005\u01a4\u00d3\u0002\u08eb\u08f3\u0005\u01b4\u00db\u0002', + '\u08ec\u08f3\u0005\u01c0\u00e1\u0002\u08ed\u08ee\u0007?\u0002\u0002', + '\u08ee\u08ef\u0007\u0017\u0002\u0002\u08ef\u08f0\u0005\u0188\u00c5\u0002', + '\u08f0\u08f1\u0007\u0018\u0002\u0002\u08f1\u08f3\u0003\u0002\u0002\u0002', + '\u08f2\u08e2\u0003\u0002\u0002\u0002\u08f2\u08e3\u0003\u0002\u0002\u0002', + '\u08f2\u08e4\u0003\u0002\u0002\u0002\u08f2\u08e5\u0003\u0002\u0002\u0002', + '\u08f2\u08e6\u0003\u0002\u0002\u0002\u08f2\u08e7\u0003\u0002\u0002\u0002', + '\u08f2\u08e8\u0003\u0002\u0002\u0002\u08f2\u08e9\u0003\u0002\u0002\u0002', + '\u08f2\u08ea\u0003\u0002\u0002\u0002\u08f2\u08eb\u0003\u0002\u0002\u0002', + '\u08f2\u08ec\u0003\u0002\u0002\u0002\u08f2\u08ed\u0003\u0002\u0002\u0002', + '\u08f3\u018d\u0003\u0002\u0002\u0002\u08f4\u08f5\b\u00c8\u0001\u0002', + '\u08f5\u08f6\u0005\u018c\u00c7\u0002\u08f6\u0933\u0003\u0002\u0002\u0002', + '\u08f7\u08f8\f\b\u0002\u0002\u08f8\u08f9\u0007\n\u0002\u0002\u08f9\u0932', + '\u0005\u018e\u00c8\t\u08fa\u08fb\f\u0007\u0002\u0002\u08fb\u08fc\u0007', + '\u000b\u0002\u0002\u08fc\u0932\u0005\u018e\u00c8\b\u08fd\u08fe\f\u0006', + '\u0002\u0002\u08fe\u08ff\u0007\f\u0002\u0002\u08ff\u0932\u0005\u018e', + '\u00c8\u0007\u0900\u0901\f\u0005\u0002\u0002\u0901\u0902\u0007\r\u0002', + '\u0002\u0902\u0932\u0005\u018e\u00c8\u0006\u0903\u0904\f\u0004\u0002', + '\u0002\u0904\u0905\u0007\u000e\u0002\u0002\u0905\u0932\u0005\u018e\u00c8', + '\u0005\u0906\u0907\f\u0003\u0002\u0002\u0907\u0908\u0007\u0016\u0002', + '\u0002\u0908\u0932\u0005\u018e\u00c8\u0004\u0909\u090a\f\u0010\u0002', + '\u0002\u090a\u090b\u0007\t\u0002\u0002\u090b\u0932\u0007\u00ef\u0002', + '\u0002\u090c\u090d\f\u000f\u0002\u0002\u090d\u090e\u0007\t\u0002\u0002', + '\u090e\u0932\u0007\u00ee\u0002\u0002\u090f\u0910\f\u000e\u0002\u0002', + '\u0910\u0911\u0007\t\u0002\u0002\u0911\u0912\u0007\u001d\u0002\u0002', + '\u0912\u0913\u0005\u0188\u00c5\u0002\u0913\u0914\u0007\u001e\u0002\u0002', + '\u0914\u0932\u0003\u0002\u0002\u0002\u0915\u0916\f\r\u0002\u0002\u0916', + '\u0917\u0007\t\u0002\u0002\u0917\u0918\u0007\u001d\u0002\u0002\u0918', + '\u0919\u0005\u0188\u00c5\u0002\u0919\u091a\u0007\u001f\u0002\u0002\u091a', + '\u0932\u0003\u0002\u0002\u0002\u091b\u091c\f\f\u0002\u0002\u091c\u091d', + '\u0007\u001d\u0002\u0002\u091d\u091e\u0005\u0188\u00c5\u0002\u091e\u091f', + '\u0007\u001e\u0002\u0002\u091f\u0932\u0003\u0002\u0002\u0002\u0920\u0921', + '\f\u000b\u0002\u0002\u0921\u0922\u0007\u001d\u0002\u0002\u0922\u0923', + '\u0005\u0188\u00c5\u0002\u0923\u0924\u0007\u001c\u0002\u0002\u0924\u0925', + '\u0007\u001e\u0002\u0002\u0925\u0932\u0003\u0002\u0002\u0002\u0926\u0927', + '\f\n\u0002\u0002\u0927\u0928\u0007\u001d\u0002\u0002\u0928\u0929\u0005', + '\u0188\u00c5\u0002\u0929\u092a\u0007\u001c\u0002\u0002\u092a\u092b\u0005', + '\u0188\u00c5\u0002\u092b\u092c\u0007\u001e\u0002\u0002\u092c\u0932\u0003', + '\u0002\u0002\u0002\u092d\u092e\f\t\u0002\u0002\u092e\u092f\u0007\u001d', + '\u0002\u0002\u092f\u0930\u0007\f\u0002\u0002\u0930\u0932\u0007\u001e', + '\u0002\u0002\u0931\u08f7\u0003\u0002\u0002\u0002\u0931\u08fa\u0003\u0002', + '\u0002\u0002\u0931\u08fd\u0003\u0002\u0002\u0002\u0931\u0900\u0003\u0002', + '\u0002\u0002\u0931\u0903\u0003\u0002\u0002\u0002\u0931\u0906\u0003\u0002', + '\u0002\u0002\u0931\u0909\u0003\u0002\u0002\u0002\u0931\u090c\u0003\u0002', + '\u0002\u0002\u0931\u090f\u0003\u0002\u0002\u0002\u0931\u0915\u0003\u0002', + '\u0002\u0002\u0931\u091b\u0003\u0002\u0002\u0002\u0931\u0920\u0003\u0002', + '\u0002\u0002\u0931\u0926\u0003\u0002\u0002\u0002\u0931\u092d\u0003\u0002', + '\u0002\u0002\u0932\u0935\u0003\u0002\u0002\u0002\u0933\u0931\u0003\u0002', + '\u0002\u0002\u0933\u0934\u0003\u0002\u0002\u0002\u0934\u018f\u0003\u0002', + '\u0002\u0002\u0935\u0933\u0003\u0002\u0002\u0002\u0936\u0937\t\r\u0002', + '\u0002\u0937\u0191\u0003\u0002\u0002\u0002\u0938\u093b\u0005\u0194\u00cb', + '\u0002\u0939\u093b\u0005\u019c\u00cf\u0002\u093a\u0938\u0003\u0002\u0002', + '\u0002\u093a\u0939\u0003\u0002\u0002\u0002\u093b\u0193\u0003\u0002\u0002', + '\u0002\u093c\u093d\u0007\u0019\u0002\u0002\u093d\u093e\u0005\u0196\u00cc', + '\u0002\u093e\u093f\u0007\u001a\u0002\u0002\u093f\u0195\u0003\u0002\u0002', + '\u0002\u0940\u0943\u0003\u0002\u0002\u0002\u0941\u0943\u0005\u0198\u00cd', + '\u0002\u0942\u0940\u0003\u0002\u0002\u0002\u0942\u0941\u0003\u0002\u0002', + '\u0002\u0943\u0197\u0003\u0002\u0002\u0002\u0944\u0945\b\u00cd\u0001', + '\u0002\u0945\u0946\u0005\u019a\u00ce\u0002\u0946\u094c\u0003\u0002\u0002', + '\u0002\u0947\u0948\f\u0003\u0002\u0002\u0948\u0949\u0007\u001b\u0002', + '\u0002\u0949\u094b\u0005\u019a\u00ce\u0002\u094a\u0947\u0003\u0002\u0002', + '\u0002\u094b\u094e\u0003\u0002\u0002\u0002\u094c\u094a\u0003\u0002\u0002', + '\u0002\u094c\u094d\u0003\u0002\u0002\u0002\u094d\u0199\u0003\u0002\u0002', + '\u0002\u094e\u094c\u0003\u0002\u0002\u0002\u094f\u0950\u0005\u0188\u00c5', + '\u0002\u0950\u0951\u0007\u001c\u0002\u0002\u0951\u0952\u0005\u0188\u00c5', + '\u0002\u0952\u0955\u0003\u0002\u0002\u0002\u0953\u0955\u0005\u0188\u00c5', + '\u0002\u0954\u094f\u0003\u0002\u0002\u0002\u0954\u0953\u0003\u0002\u0002', + '\u0002\u0955\u019b\u0003\u0002\u0002\u0002\u0956\u0957\u0007\u001d\u0002', + '\u0002\u0957\u0958\u0005\u019e\u00d0\u0002\u0958\u0959\u0007\u001e\u0002', + '\u0002\u0959\u019d\u0003\u0002\u0002\u0002\u095a\u095d\u0003\u0002\u0002', + '\u0002\u095b\u095d\u0005\u01a0\u00d1\u0002\u095c\u095a\u0003\u0002\u0002', + '\u0002\u095c\u095b\u0003\u0002\u0002\u0002\u095d\u019f\u0003\u0002\u0002', + '\u0002\u095e\u095f\b\u00d1\u0001\u0002\u095f\u0960\u0005\u0188\u00c5', + '\u0002\u0960\u0966\u0003\u0002\u0002\u0002\u0961\u0962\f\u0003\u0002', + '\u0002\u0962\u0963\u0007\u001b\u0002\u0002\u0963\u0965\u0005\u0188\u00c5', + '\u0002\u0964\u0961\u0003\u0002\u0002\u0002\u0965\u0968\u0003\u0002\u0002', + '\u0002\u0966\u0964\u0003\u0002\u0002\u0002\u0966\u0967\u0003\u0002\u0002', + '\u0002\u0967\u01a1\u0003\u0002\u0002\u0002\u0968\u0966\u0003\u0002\u0002', + '\u0002\u0969\u096a\t\u000e\u0002\u0002\u096a\u01a3\u0003\u0002\u0002', + '\u0002\u096b\u096c\u00075\u0002\u0002\u096c\u096d\u0005\u01a6\u00d4', + '\u0002\u096d\u096e\u0007Q\u0002\u0002\u096e\u01a5\u0003\u0002\u0002', + '\u0002\u096f\u0972\u0005\u01a8\u00d5\u0002\u0970\u0972\u0005\u01ac\u00d7', + '\u0002\u0971\u096f\u0003\u0002\u0002\u0002\u0971\u0970\u0003\u0002\u0002', + '\u0002\u0972\u01a7\u0003\u0002\u0002\u0002\u0973\u0974\u0005\u0188\u00c5', + '\u0002\u0974\u0975\u0005\u01aa\u00d6\u0002\u0975\u0976\u0005\u01ae\u00d8', + '\u0002\u0976\u01a9\u0003\u0002\u0002\u0002\u0977\u0978\b\u00d6\u0001', + '\u0002\u0978\u0979\u0007\u00e6\u0002\u0002\u0979\u097a\u0005\u0188\u00c5', + '\u0002\u097a\u097b\u0007\u00cc\u0002\u0002\u097b\u097c\u0005\u0188\u00c5', + '\u0002\u097c\u0985\u0003\u0002\u0002\u0002\u097d\u097e\f\u0003\u0002', + '\u0002\u097e\u097f\u0007\u00e6\u0002\u0002\u097f\u0980\u0005\u0188\u00c5', + '\u0002\u0980\u0981\u0007\u00cc\u0002\u0002\u0981\u0982\u0005\u0188\u00c5', + '\u0002\u0982\u0984\u0003\u0002\u0002\u0002\u0983\u097d\u0003\u0002\u0002', + '\u0002\u0984\u0987\u0003\u0002\u0002\u0002\u0985\u0983\u0003\u0002\u0002', + '\u0002\u0985\u0986\u0003\u0002\u0002\u0002\u0986\u01ab\u0003\u0002\u0002', + '\u0002\u0987\u0985\u0003\u0002\u0002\u0002\u0988\u0989\u0005\u01aa\u00d6', + '\u0002\u0989\u098a\u0005\u01ae\u00d8\u0002\u098a\u01ad\u0003\u0002\u0002', + '\u0002\u098b\u098f\u0003\u0002\u0002\u0002\u098c\u098d\u0007P\u0002', + '\u0002\u098d\u098f\u0005\u0188\u00c5\u0002\u098e\u098b\u0003\u0002\u0002', + '\u0002\u098e\u098c\u0003\u0002\u0002\u0002\u098f\u01af\u0003\u0002\u0002', + '\u0002\u0990\u0991\u0007\u0094\u0002\u0002\u0991\u0992\u0007\u0017\u0002', + '\u0002\u0992\u0993\u0005\u01a0\u00d1\u0002\u0993\u0994\u0007\u0018\u0002', + '\u0002\u0994\u0995\u0005\u01e4\u00f3\u0002\u0995\u0996\u0005\u01e0\u00f1', + '\u0002\u0996\u0997\u0005\u01ec\u00f7\u0002\u0997\u09b5\u0003\u0002\u0002', + '\u0002\u0998\u0999\u0005\u01b2\u00da\u0002\u0999\u099a\u0007\u0017\u0002', + '\u0002\u099a\u099b\u0005\u019e\u00d0\u0002\u099b\u099c\u0007\u0018\u0002', + '\u0002\u099c\u099d\u0005\u01e8\u00f5\u0002\u099d\u099e\u0005\u01e0\u00f1', + '\u0002\u099e\u099f\u0005\u01ea\u00f6\u0002\u099f\u09b5\u0003\u0002\u0002', + '\u0002\u09a0\u09a1\u0005\u01b2\u00da\u0002\u09a1\u09a2\u0007\u0017\u0002', + '\u0002\u09a2\u09a3\u0005\u01e6\u00f4\u0002\u09a3\u09a4\u0005\u0188\u00c5', + '\u0002\u09a4\u09a5\u0007\u0018\u0002\u0002\u09a5\u09a6\u0005\u01e8\u00f5', + '\u0002\u09a6\u09a7\u0005\u01ea\u00f6\u0002\u09a7\u09b5\u0003\u0002\u0002', + '\u0002\u09a8\u09a9\u0005\u01b2\u00da\u0002\u09a9\u09aa\u0007\u0017\u0002', + '\u0002\u09aa\u09ab\u0007\f\u0002\u0002\u09ab\u09ac\u0007\u0018\u0002', + '\u0002\u09ac\u09ad\u0005\u01e8\u00f5\u0002\u09ad\u09ae\u0005\u01ea\u00f6', + '\u0002\u09ae\u09b5\u0003\u0002\u0002\u0002\u09af\u09b0\u0005\u0172\u00ba', + '\u0002\u09b0\u09b1\u0007\u0017\u0002\u0002\u09b1\u09b2\u0005\u019e\u00d0', + '\u0002\u09b2\u09b3\u0007\u0018\u0002\u0002\u09b3\u09b5\u0003\u0002\u0002', + '\u0002\u09b4\u0990\u0003\u0002\u0002\u0002\u09b4\u0998\u0003\u0002\u0002', + '\u0002\u09b4\u09a0\u0003\u0002\u0002\u0002\u09b4\u09a8\u0003\u0002\u0002', + '\u0002\u09b4\u09af\u0003\u0002\u0002\u0002\u09b5\u01b1\u0003\u0002\u0002', + '\u0002\u09b6\u09b7\t\u000f\u0002\u0002\u09b7\u01b3\u0003\u0002\u0002', + '\u0002\u09b8\u09bb\u0005\u01b6\u00dc\u0002\u09b9\u09bb\u0005\u01be\u00e0', + '\u0002\u09ba\u09b8\u0003\u0002\u0002\u0002\u09ba\u09b9\u0003\u0002\u0002', + "\u0002\u09bb\u01b5\u0003\u0002\u0002\u0002\u09bc\u09bd\u0007'\u0002", + '\u0002\u09bd\u09be\u0005\u01b8\u00dd\u0002\u09be\u09bf\u0005\u01bc\u00df', + '\u0002\u09bf\u09c0\u0007Q\u0002\u0002\u09c0\u09da\u0003\u0002\u0002', + '\u0002\u09c1\u09c2\u0007\u00c7\u0002\u0002\u09c2\u09c3\u0005\u01b8\u00dd', + '\u0002\u09c3\u09c4\u0005\u01bc\u00df\u0002\u09c4\u09c5\u0007Q\u0002', + '\u0002\u09c5\u09da\u0003\u0002\u0002\u0002\u09c6\u09c7\u0007R\u0002', + '\u0002\u09c7\u09c8\u0005\u01b8\u00dd\u0002\u09c8\u09c9\u0005\u01bc\u00df', + '\u0002\u09c9\u09ca\u0007Q\u0002\u0002\u09ca\u09da\u0003\u0002\u0002', + "\u0002\u09cb\u09cc\u0007'\u0002\u0002\u09cc\u09cd\u0007&\u0002\u0002", + '\u09cd\u09ce\u0007R\u0002\u0002\u09ce\u09cf\u0005\u01b8\u00dd\u0002', + '\u09cf\u09d0\u0005\u01bc\u00df\u0002\u09d0\u09d1\u0007Q\u0002\u0002', + '\u09d1\u09da\u0003\u0002\u0002\u0002\u09d2\u09d3\u0007\u00c7\u0002\u0002', + '\u09d3\u09d4\u0007&\u0002\u0002\u09d4\u09d5\u0007R\u0002\u0002\u09d5', + '\u09d6\u0005\u01b8\u00dd\u0002\u09d6\u09d7\u0005\u01bc\u00df\u0002\u09d7', + '\u09d8\u0007Q\u0002\u0002\u09d8\u09da\u0003\u0002\u0002\u0002\u09d9', + '\u09bc\u0003\u0002\u0002\u0002\u09d9\u09c1\u0003\u0002\u0002\u0002\u09d9', + '\u09c6\u0003\u0002\u0002\u0002\u09d9\u09cb\u0003\u0002\u0002\u0002\u09d9', + '\u09d2\u0003\u0002\u0002\u0002\u09da\u01b7\u0003\u0002\u0002\u0002\u09db', + '\u09dc\b\u00dd\u0001\u0002\u09dc\u09dd\u0005\u01ba\u00de\u0002\u09dd', + '\u09e3\u0003\u0002\u0002\u0002\u09de\u09df\f\u0003\u0002\u0002\u09df', + '\u09e0\u0007\u001b\u0002\u0002\u09e0\u09e2\u0005\u01ba\u00de\u0002\u09e1', + '\u09de\u0003\u0002\u0002\u0002\u09e2\u09e5\u0003\u0002\u0002\u0002\u09e3', + '\u09e1\u0003\u0002\u0002\u0002\u09e3\u09e4\u0003\u0002\u0002\u0002\u09e4', + '\u01b9\u0003\u0002\u0002\u0002\u09e5\u09e3\u0003\u0002\u0002\u0002\u09e6', + '\u09e7\u0005\u0102\u0082\u0002\u09e7\u09e8\u0007n\u0002\u0002\u09e8', + '\u09e9\u0005\u0188\u00c5\u0002\u09e9\u09fb\u0003\u0002\u0002\u0002\u09ea', + '\u09eb\u0005\u0102\u0082\u0002\u09eb\u09ec\u0007\u00eb\u0002\u0002\u09ec', + '\u09ed\u0005\u0188\u00c5\u0002\u09ed\u09fb\u0003\u0002\u0002\u0002\u09ee', + '\u09ef\u0005\u0102\u0082\u0002\u09ef\u09f0\u0007\u001c\u0002\u0002\u09f0', + '\u09f1\u0005\u0102\u0082\u0002\u09f1\u09f2\u0007n\u0002\u0002\u09f2', + '\u09f3\u0005\u0188\u00c5\u0002\u09f3\u09fb\u0003\u0002\u0002\u0002\u09f4', + '\u09f5\u0005\u0102\u0082\u0002\u09f5\u09f6\u0007\u001c\u0002\u0002\u09f6', + '\u09f7\u0005\u0102\u0082\u0002\u09f7\u09f8\u0007\u00eb\u0002\u0002\u09f8', + '\u09f9\u0005\u0188\u00c5\u0002\u09f9\u09fb\u0003\u0002\u0002\u0002\u09fa', + '\u09e6\u0003\u0002\u0002\u0002\u09fa\u09ea\u0003\u0002\u0002\u0002\u09fa', + '\u09ee\u0003\u0002\u0002\u0002\u09fa\u09f4\u0003\u0002\u0002\u0002\u09fb', + '\u01bb\u0003\u0002\u0002\u0002\u09fc\u09fd\u0007\u00bf\u0002\u0002\u09fd', + '\u09fe\u0005\u0188\u00c5\u0002\u09fe\u01bd\u0003\u0002\u0002\u0002\u09ff', + '\u0a00\u0007(\u0002\u0002\u0a00\u0a01\u0005\u0188\u00c5\u0002\u0a01', + '\u0a02\u0007_\u0002\u0002\u0a02\u0a03\u0005\u01b8\u00dd\u0002\u0a03', + '\u0a04\u0005\u0104\u0083\u0002\u0a04\u0a05\u0007Q\u0002\u0002\u0a05', + '\u0a17\u0003\u0002\u0002\u0002\u0a06\u0a07\u0007[\u0002\u0002\u0a07', + '\u0a08\u0005\u0188\u00c5\u0002\u0a08\u0a09\u0007_\u0002\u0002\u0a09', + '\u0a0a\u0005\u01b8\u00dd\u0002\u0a0a\u0a0b\u0005\u0104\u0083\u0002\u0a0b', + '\u0a0c\u0007Q\u0002\u0002\u0a0c\u0a17\u0003\u0002\u0002\u0002\u0a0d', + '\u0a0e\u0007\u0098\u0002\u0002\u0a0e\u0a0f\u0005\u0188\u00c5\u0002\u0a0f', + '\u0a10\u0007\u001c\u0002\u0002\u0a10\u0a11\u0005\u0188\u00c5\u0002\u0a11', + '\u0a12\u0007_\u0002\u0002\u0a12\u0a13\u0005\u01b8\u00dd\u0002\u0a13', + '\u0a14\u0005\u0104\u0083\u0002\u0a14\u0a15\u0007Q\u0002\u0002\u0a15', + '\u0a17\u0003\u0002\u0002\u0002\u0a16\u09ff\u0003\u0002\u0002\u0002\u0a16', + '\u0a06\u0003\u0002\u0002\u0002\u0a16\u0a0d\u0003\u0002\u0002\u0002\u0a17', + '\u01bf\u0003\u0002\u0002\u0002\u0a18\u0a19\u0007\u0017\u0002\u0002\u0a19', + '\u0a1a\u0005\u0188\u00c5\u0002\u0a1a\u0a1b\u0007\u0018\u0002\u0002\u0a1b', + '\u0a22\u0003\u0002\u0002\u0002\u0a1c\u0a1d\u0007\u0017\u0002\u0002\u0a1d', + '\u0a1e\u0005\u01c6\u00e4\u0002\u0a1e\u0a1f\u0007\u0018\u0002\u0002\u0a1f', + '\u0a22\u0003\u0002\u0002\u0002\u0a20\u0a22\u0005\u01c2\u00e2\u0002\u0a21', + '\u0a18\u0003\u0002\u0002\u0002\u0a21\u0a1c\u0003\u0002\u0002\u0002\u0a21', + '\u0a20\u0003\u0002\u0002\u0002\u0a22\u01c1\u0003\u0002\u0002\u0002\u0a23', + '\u0a24\u0007>\u0002\u0002\u0a24\u0a25\u0007\u0017\u0002\u0002\u0a25', + '\u0a26\u0005:\u001e\u0002\u0a26\u0a27\u0007\u0018\u0002\u0002\u0a27', + '\u0a2d\u0003\u0002\u0002\u0002\u0a28\u0a29\u0007\u0017\u0002\u0002\u0a29', + '\u0a2a\u0005:\u001e\u0002\u0a2a\u0a2b\u0007\u0018\u0002\u0002\u0a2b', + '\u0a2d\u0003\u0002\u0002\u0002\u0a2c\u0a23\u0003\u0002\u0002\u0002\u0a2c', + '\u0a28\u0003\u0002\u0002\u0002\u0a2d\u01c3\u0003\u0002\u0002\u0002\u0a2e', + '\u0a31\u0005\u0188\u00c5\u0002\u0a2f\u0a31\u0005\u01c6\u00e4\u0002\u0a30', + '\u0a2e\u0003\u0002\u0002\u0002\u0a30\u0a2f\u0003\u0002\u0002\u0002\u0a31', + '\u01c5\u0003\u0002\u0002\u0002\u0a32\u0a33\u0005\u015c\u00af\u0002\u0a33', + '\u0a34\u0005\u0188\u00c5\u0002\u0a34\u0a3c\u0003\u0002\u0002\u0002\u0a35', + '\u0a36\u0005\u015c\u00af\u0002\u0a36\u0a37\u0007K\u0002\u0002\u0a37', + '\u0a38\u0005\u0188\u00c5\u0002\u0a38\u0a3c\u0003\u0002\u0002\u0002\u0a39', + '\u0a3a\u0007K\u0002\u0002\u0a3a\u0a3c\u0005\u0188\u00c5\u0002\u0a3b', + '\u0a32\u0003\u0002\u0002\u0002\u0a3b\u0a35\u0003\u0002\u0002\u0002\u0a3b', + '\u0a39\u0003\u0002\u0002\u0002\u0a3c\u01c7\u0003\u0002\u0002\u0002\u0a3d', + '\u0a41\u0003\u0002\u0002\u0002\u0a3e\u0a3f\u0007\u00e9\u0002\u0002\u0a3f', + '\u0a41\u0005\u01ca\u00e6\u0002\u0a40\u0a3d\u0003\u0002\u0002\u0002\u0a40', + '\u0a3e\u0003\u0002\u0002\u0002\u0a41\u01c9\u0003\u0002\u0002\u0002\u0a42', + '\u0a43\b\u00e6\u0001\u0002\u0a43\u0a44\u0005\u01cc\u00e7\u0002\u0a44', + '\u0a4a\u0003\u0002\u0002\u0002\u0a45\u0a46\f\u0003\u0002\u0002\u0a46', + '\u0a47\u0007\u001b\u0002\u0002\u0a47\u0a49\u0005\u01cc\u00e7\u0002\u0a48', + '\u0a45\u0003\u0002\u0002\u0002\u0a49\u0a4c\u0003\u0002\u0002\u0002\u0a4a', + '\u0a48\u0003\u0002\u0002\u0002\u0a4a\u0a4b\u0003\u0002\u0002\u0002\u0a4b', + '\u01cb\u0003\u0002\u0002\u0002\u0a4c\u0a4a\u0003\u0002\u0002\u0002\u0a4d', + '\u0a4e\u0007\u00ef\u0002\u0002\u0a4e\u0a4f\u0007)\u0002\u0002\u0a4f', + '\u0a50\u0005\u01ce\u00e8\u0002\u0a50\u01cd\u0003\u0002\u0002\u0002\u0a51', + '\u0a52\u0007\u0017\u0002\u0002\u0a52\u0a53\u0005\u01d0\u00e9\u0002\u0a53', + '\u0a54\u0005\u01d2\u00ea\u0002\u0a54\u0a55\u0005\u00aeX\u0002\u0a55', + '\u0a56\u0005\u01d4\u00eb\u0002\u0a56\u0a57\u0007\u0018\u0002\u0002\u0a57', + '\u01cf\u0003\u0002\u0002\u0002\u0a58\u0a5b\u0003\u0002\u0002\u0002\u0a59', + '\u0a5b\u0007\u00ef\u0002\u0002\u0a5a\u0a58\u0003\u0002\u0002\u0002\u0a5a', + '\u0a59\u0003\u0002\u0002\u0002\u0a5b\u01d1\u0003\u0002\u0002\u0002\u0a5c', + '\u0a61\u0003\u0002\u0002\u0002\u0a5d\u0a5e\u0007\u00a3\u0002\u0002\u0a5e', + '\u0a5f\u00073\u0002\u0002\u0a5f\u0a61\u0005\u01a0\u00d1\u0002\u0a60', + '\u0a5c\u0003\u0002\u0002\u0002\u0a60\u0a5d\u0003\u0002\u0002\u0002\u0a61', + '\u01d3\u0003\u0002\u0002\u0002\u0a62\u0a68\u0003\u0002\u0002\u0002\u0a63', + '\u0a64\u0005\u01d6\u00ec\u0002\u0a64\u0a65\u0005\u01da\u00ee\u0002\u0a65', + '\u0a66\u0005\u01d8\u00ed\u0002\u0a66\u0a68\u0003\u0002\u0002\u0002\u0a67', + '\u0a62\u0003\u0002\u0002\u0002\u0a67\u0a63\u0003\u0002\u0002\u0002\u0a68', + '\u01d5\u0003\u0002\u0002\u0002\u0a69\u0a6a\t\u0010\u0002\u0002\u0a6a', + '\u01d7\u0003\u0002\u0002\u0002\u0a6b\u0a77\u0003\u0002\u0002\u0002\u0a6c', + '\u0a6d\u0007T\u0002\u0002\u0a6d\u0a6e\u0007\u0092\u0002\u0002\u0a6e', + '\u0a77\u0007\u009f\u0002\u0002\u0a6f\u0a70\u0007T\u0002\u0002\u0a70', + '\u0a71\u0007A\u0002\u0002\u0a71\u0a77\u0007\u00bd\u0002\u0002\u0a72', + '\u0a73\u0007T\u0002\u0002\u0a73\u0a77\u0007\u00cd\u0002\u0002\u0a74', + '\u0a75\u0007T\u0002\u0002\u0a75\u0a77\u0007f\u0002\u0002\u0a76\u0a6b', + '\u0003\u0002\u0002\u0002\u0a76\u0a6c\u0003\u0002\u0002\u0002\u0a76\u0a6f', + '\u0003\u0002\u0002\u0002\u0a76\u0a72\u0003\u0002\u0002\u0002\u0a76\u0a74', + '\u0003\u0002\u0002\u0002\u0a77\u01d9\u0003\u0002\u0002\u0002\u0a78\u0a7f', + '\u0005\u01dc\u00ef\u0002\u0a79\u0a7a\u0007-\u0002\u0002\u0a7a\u0a7b', + '\u0005\u01dc\u00ef\u0002\u0a7b\u0a7c\u0007&\u0002\u0002\u0a7c\u0a7d', + '\u0005\u01dc\u00ef\u0002\u0a7d\u0a7f\u0003\u0002\u0002\u0002\u0a7e\u0a78', + '\u0003\u0002\u0002\u0002\u0a7e\u0a79\u0003\u0002\u0002\u0002\u0a7f\u01db', + '\u0003\u0002\u0002\u0002\u0a80\u0a81\u0007\u00d4\u0002\u0002\u0a81\u0a8a', + '\u0007\u00a7\u0002\u0002\u0a82\u0a83\u0007\u00d4\u0002\u0002\u0a83\u0a8a', + '\u0007^\u0002\u0002\u0a84\u0a85\u0007A\u0002\u0002\u0a85\u0a8a\u0007', + '\u00bd\u0002\u0002\u0a86\u0a87\u0005\u0188\u00c5\u0002\u0a87\u0a88\u0005', + '\u01de\u00f0\u0002\u0a88\u0a8a\u0003\u0002\u0002\u0002\u0a89\u0a80\u0003', + '\u0002\u0002\u0002\u0a89\u0a82\u0003\u0002\u0002\u0002\u0a89\u0a84\u0003', + '\u0002\u0002\u0002\u0a89\u0a86\u0003\u0002\u0002\u0002\u0a8a\u01dd\u0003', + '\u0002\u0002\u0002\u0a8b\u0a8c\t\u0011\u0002\u0002\u0a8c\u01df\u0003', + '\u0002\u0002\u0002\u0a8d\u0a90\u0003\u0002\u0002\u0002\u0a8e\u0a90\u0005', + '\u01e2\u00f2\u0002\u0a8f\u0a8d\u0003\u0002\u0002\u0002\u0a8f\u0a8e\u0003', + '\u0002\u0002\u0002\u0a90\u01e1\u0003\u0002\u0002\u0002\u0a91\u0a92\u0007', + '\u00b6\u0002\u0002\u0a92\u0a96\u0007\u0096\u0002\u0002\u0a93\u0a94\u0007', + 'l\u0002\u0002\u0a94\u0a96\u0007\u0096\u0002\u0002\u0a95\u0a91\u0003', + '\u0002\u0002\u0002\u0a95\u0a93\u0003\u0002\u0002\u0002\u0a96\u01e3\u0003', + '\u0002\u0002\u0002\u0a97\u0a9b\u0003\u0002\u0002\u0002\u0a98\u0a99\u0007', + 'a\u0002\u0002\u0a99\u0a9b\u0005\u00bc_\u0002\u0a9a\u0a97\u0003\u0002', + '\u0002\u0002\u0a9a\u0a98\u0003\u0002\u0002\u0002\u0a9b\u01e5\u0003\u0002', + '\u0002\u0002\u0a9c\u0a9d\t\u0012\u0002\u0002\u0a9d\u01e7\u0003\u0002', + '\u0002\u0002\u0a9e\u0aa5\u0003\u0002\u0002\u0002\u0a9f\u0aa0\u0007Z', + '\u0002\u0002\u0aa0\u0aa1\u0007\u0017\u0002\u0002\u0aa1\u0aa2\u0005\u009c', + 'O\u0002\u0aa2\u0aa3\u0007\u0018\u0002\u0002\u0aa3\u0aa5\u0003\u0002', + '\u0002\u0002\u0aa4\u0a9e\u0003\u0002\u0002\u0002\u0aa4\u0a9f\u0003\u0002', + '\u0002\u0002\u0aa5\u01e9\u0003\u0002\u0002\u0002\u0aa6\u0aa9\u0003\u0002', + '\u0002\u0002\u0aa7\u0aa9\u0005\u01ec\u00f7\u0002\u0aa8\u0aa6\u0003\u0002', + '\u0002\u0002\u0aa8\u0aa7\u0003\u0002\u0002\u0002\u0aa9\u01eb\u0003\u0002', + '\u0002\u0002\u0aaa\u0aab\u0007\u00a1\u0002\u0002\u0aab\u0aaf\u0007\u00ef', + '\u0002\u0002\u0aac\u0aad\u0007\u00a1\u0002\u0002\u0aad\u0aaf\u0005\u01ce', + '\u00e8\u0002\u0aae\u0aaa\u0003\u0002\u0002\u0002\u0aae\u0aac\u0003\u0002', + '\u0002\u0002\u0aaf\u01ed\u0003\u0002\u0002\u0002\u0ab0\u0ab1\u0005\u01f4', + '\u00fb\u0002\u0ab1\u0ab2\u0005\u01f8\u00fd\u0002\u0ab2\u0ab3\u0005\u01fe', + '\u0100\u0002\u0ab3\u01ef\u0003\u0002\u0002\u0002\u0ab4\u0ab5\u0007:', + '\u0002\u0002\u0ab5\u0ab6\u0005\u01f6\u00fc\u0002\u0ab6\u01f1\u0003\u0002', + '\u0002\u0002\u0ab7\u0ab8\u0007\u00bc\u0002\u0002\u0ab8\u0ab9\u0005\u01f6', + '\u00fc\u0002\u0ab9\u0aba\u0005\u01fa\u00fe\u0002\u0aba\u01f3\u0003\u0002', + '\u0002\u0002\u0abb\u0abc\t\u0013\u0002\u0002\u0abc\u01f5\u0003\u0002', + '\u0002\u0002\u0abd\u0ac0\u0003\u0002\u0002\u0002\u0abe\u0ac0\u0005\u01f8', + '\u00fd\u0002\u0abf\u0abd\u0003\u0002\u0002\u0002\u0abf\u0abe\u0003\u0002', + '\u0002\u0002\u0ac0\u01f7\u0003\u0002\u0002\u0002\u0ac1\u0ac2\t\u0014', + '\u0002\u0002\u0ac2\u01f9\u0003\u0002\u0002\u0002\u0ac3\u0ac8\u0003\u0002', + '\u0002\u0002\u0ac4\u0ac5\u0007\u00ce\u0002\u0002\u0ac5\u0ac6\u0007\u00c0', + '\u0002\u0002\u0ac6\u0ac8\u0005\u01fc\u00ff\u0002\u0ac7\u0ac3\u0003\u0002', + '\u0002\u0002\u0ac7\u0ac4\u0003\u0002\u0002\u0002\u0ac8\u01fb\u0003\u0002', + '\u0002\u0002\u0ac9\u0aca\u0007\u00ef\u0002\u0002\u0aca\u01fd\u0003\u0002', + '\u0002\u0002\u0acb\u0ace\u0003\u0002\u0002\u0002\u0acc\u0ace\u0005\u0200', + '\u0101\u0002\u0acd\u0acb\u0003\u0002\u0002\u0002\u0acd\u0acc\u0003\u0002', + '\u0002\u0002\u0ace\u01ff\u0003\u0002\u0002\u0002\u0acf\u0ad0\u0007y', + '\u0002\u0002\u0ad0\u0ad1\u0007\u0085\u0002\u0002\u0ad1\u0ad2\u0005\u0202', + '\u0102\u0002\u0ad2\u0201\u0003\u0002\u0002\u0002\u0ad3\u0ad4\u0007\u00b1', + '\u0002\u0002\u0ad4\u0ad5\u0007;\u0002\u0002\u0ad5\u0203\u0003\u0002', + '\u0002\u0002\u0ad6\u0ad7\u0007\u00c5\u0002\u0002\u0ad7\u0ad8\u0007\u00d0', + '\u0002\u0002\u0ad8\u0ad9\u0005\u0200\u0101\u0002\u0ad9\u0205\u0003\u0002', + '\u0002\u0002\u0ada\u0adb\u0007\u00c0\u0002\u0002\u0adb\u0adc\u0005\u01fc', + '\u00ff\u0002\u0adc\u0207\u0003\u0002\u0002\u0002\u0add\u0ade\u0007k', + '\u0002\u0002\u0ade\u0adf\u0007V\u0002\u0002\u0adf\u0209\u0003\u0002', + '\u0002\u0002\u0ae0\u0ae1\u0007k\u0002\u0002\u0ae1\u0ae2\u0007\u0093', + '\u0002\u0002\u0ae2\u0ae3\u0007V\u0002\u0002\u0ae3\u020b\u0003\u0002', + '\u0002\u0002\u00aa\u0210\u0217\u021e\u0226\u0230\u0238\u0244\u024b\u0256', + '\u0261\u0267\u0273\u0278\u027c\u0283\u0287\u028c\u0291\u0298\u02a7\u02c6', + '\u02dd\u02df\u02e4\u02e8\u0305\u030a\u0316\u0321\u0325\u032a\u0330\u033f', + '\u0371\u0373\u037b\u038d\u0392\u03a0\u03b1\u03c2\u03c6\u03d0\u03de\u03e2', + '\u03f0\u03fd\u0407\u0411\u041a\u0421\u042a\u0434\u043c\u0443\u044a\u0458', + '\u0461\u0469\u0471\u0478\u048d\u049c\u04a2\u04b5\u04c2\u04c9\u04ce\u04e0', + '\u04e9\u0503\u0515\u0538\u0545\u0553\u055c\u056b\u0576\u058d\u0594\u05a1', + '\u05b8\u05cf\u05df\u05e8\u05f4\u0606\u0614\u061e\u062b\u0648\u0652\u0659', + '\u0667\u066d\u0673\u0679\u067f\u0694\u06a0\u06a4\u06aa\u06b6\u06c0\u06cb', + '\u06d5\u06d9\u06e1\u06e5\u06f2\u0702\u070b\u0712\u072b\u073d\u0754\u0758', + '\u0766\u076d\u0777\u078e\u0815\u0819\u0823\u0842\u0844\u084d\u08db\u08dd', + '\u08f2\u0931\u0933\u093a\u0942\u094c\u0954\u095c\u0966\u0971\u0985\u098e', + '\u09b4\u09ba\u09d9\u09e3\u09fa\u0a16\u0a21\u0a2c\u0a30\u0a3b\u0a40\u0a4a', + '\u0a5a\u0a60\u0a67\u0a76\u0a7e\u0a89\u0a8f\u0a95\u0a9a\u0aa4\u0aa8\u0aae', + '\u0abf\u0ac7\u0acd', +].join(''); + +const atn = new antlr4.atn.ATNDeserializer().deserialize(serializedATN); + +const decisionsToDFA = atn.decisionToState.map((ds, index) => new antlr4.dfa.DFA(ds, index)); + +const sharedContextCache = new antlr4.PredictionContextCache(); + +class n1qlParser extends antlr4.Parser { + static grammarFileName = 'n1ql.g4'; + static literalNames = [ + null, + null, + null, + null, + null, + null, + null, + "'.'", + "'+'", + null, + "'*'", + "'/'", + "'%'", + "'=='", + "'='", + null, + "'<'", + "'<='", + "'>'", + "'>='", + "'||'", + "'('", + "')'", + "'{'", + "'}'", + "','", + "':'", + "'['", + "']'", + "']i'", + "';'", + "'!'", + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + "'?'", + ]; + static symbolicNames = [ + null, + 'STR', + 'INT', + 'NUM', + 'BLOCK_COMMENT', + 'LINE_COMMENT', + 'WHITESPACE', + 'DOT', + 'PLUS', + 'MINUS', + 'STAR', + 'DIV', + 'MOD', + 'DEQ', + 'EQ', + 'NE', + 'LT', + 'LE', + 'GT', + 'GE', + 'CONCAT', + 'LPAREN', + 'RPAREN', + 'LBRACE', + 'RBRACE', + 'COMMA', + 'COLON', + 'LBRACKET', + 'RBRACKET', + 'RBRACKET_ICASE', + 'SEMI', + 'NOT_A_TOKEN', + 'ADVISE', + 'ALL', + 'ALTER', + 'ANALYZE', + 'AND', + 'ANY', + 'ARRAY', + 'AS', + 'ASC', + 'AT', + 'BEGIN', + 'BETWEEN', + 'BINARY', + 'BOOLEAN', + 'BREAK', + 'BUCKET', + 'BUILD', + 'BY', + 'CALL', + 'CASE', + 'CAST', + 'CLUSTER', + 'COLLATE', + 'COLLECTION', + 'COMMIT', + 'COMMITTED', + 'CONNECT', + 'CONTINUE', + 'CORRELATED', + 'COVER', + 'CREATE', + 'CURRENT', + 'DATABASE', + 'DATASET', + 'DATASTORE', + 'DECLARE', + 'DECREMENT', + 'DELETE_', + 'DERIVED', + 'DESC', + 'DESCRIBE', + 'DISTINCT', + 'DO', + 'DROP', + 'EACH', + 'ELEMENT', + 'ELSE', + 'END', + 'EVERY', + 'EXCEPT', + 'EXCLUDE', + 'EXECUTE', + 'EXISTS', + 'EXPLAIN', + 'FALSE', + 'FETCH', + 'FILTER', + 'FIRST', + 'FLATTEN', + 'FLUSH', + 'FOLLOWING', + 'FOR', + 'FORCE', + 'FROM', + 'FTS', + 'FUNCTION', + 'GOLANG', + 'GRANT', + 'GROUP', + 'GROUPS', + 'GSI', + 'HASH', + 'HAVING', + 'IF', + 'IGNORE', + 'ILIKE', + 'IN', + 'INCLUDE', + 'INCREMENT', + 'INDEX', + 'INFER', + 'INLINE', + 'INNER', + 'INSERT', + 'INTERSECT', + 'INTO', + 'IS', + 'ISOLATION', + 'JAVASCRIPT', + 'JOIN', + 'KEY', + 'KEYS', + 'KEYSPACE', + 'KNOWN', + 'LANGUAGE', + 'LAST', + 'LEFT', + 'LET_', + 'LETTING', + 'LEVEL', + 'LIKE', + 'LIMIT', + 'LSM', + 'MAP', + 'MAPPING', + 'MATCHED', + 'MATERIALIZED', + 'MERGE', + 'MISSING', + 'NAMESPACE', + 'NEST', + 'NL', + 'NO', + 'NOT', + 'NTH_VALUE', + 'NULL', + 'NULLS', + 'NUMBER', + 'OBJECT', + 'OFFSET', + 'ON', + 'OPTION', + 'OPTIONS', + 'OR', + 'ORDER', + 'OTHERS', + 'OUTER', + 'OVER', + 'PARSE', + 'PARTITION', + 'PASSWORD', + 'PATH', + 'POOL', + 'PRECEDING', + 'PREPARE', + 'PRIMARY', + 'PRIVATE', + 'PRIVILEGE', + 'PROCEDURE', + 'PROBE', + 'PUBLIC', + 'RANGE', + 'RAW', + 'READ', + 'REALM', + 'REDUCE', + 'RENAME', + 'REPLACE', + 'RESPECT', + 'RETURN', + 'RETURNING', + 'REVOKE', + 'RIGHT', + 'ROLE', + 'ROLLBACK', + 'ROW', + 'ROWS', + 'SATISFIES', + 'SAVEPOINT', + 'SCHEMA', + 'SCOPE', + 'SELECT', + 'SELF', + 'SET', + 'SHOW', + 'SOME', + 'START', + 'STATISTICS', + 'STRING', + 'SYSTEM', + 'THEN', + 'TIES', + 'TO', + 'TRAN', + 'TRANSACTION', + 'TRIGGER', + 'TRUE', + 'TRUNCATE', + 'UNBOUNDED', + 'UNDER', + 'UNION', + 'UNIQUE', + 'UNKNOWN', + 'UNNEST', + 'UNSET', + 'UPDATE', + 'UPSERT', + 'USE', + 'USER', + 'USING', + 'VALIDATE', + 'VALUE', + 'VALUED', + 'VALUES', + 'VIA', + 'VIEW', + 'WHEN', + 'WHERE', + 'WHILE', + 'WINDOW', + 'WITH', + 'WITHIN', + 'WORK', + 'XOR', + 'IDENT_ICASE', + 'IDENT', + 'NAMED_PARAM', + 'POSITIONAL_PARAM', + 'NEXT_PARAM', + ]; + static ruleNames = [ + 'statements', + 'input', + 'opt_trailer', + 'stmt_body', + 'stmt', + 'advise', + 'opt_index', + 'explain', + 'prepare', + 'opt_force', + 'opt_name', + 'from_or_as', + 'execute', + 'execute_using', + 'infer', + 'opt_keyspace_collection', + 'opt_infer_using', + 'opt_infer_ustat_with', + 'infer_ustat_with', + 'select_stmt', + 'dml_stmt', + 'ddl_stmt', + 'role_stmt', + 'index_stmt', + 'scope_stmt', + 'collection_stmt', + 'function_stmt', + 'transaction_stmt', + 'fullselect', + 'select_terms', + 'select_term', + 'subselect', + 'from_select', + 'select_from', + 'select_clause', + 'projection', + 'opt_quantifier', + 'raw', + 'projects', + 'project', + 'opt_as_alias', + 'as_alias', + 'alias', + 'opt_from', + 'from', + 'from_term', + 'simple_from_term', + 'unnest', + 'keyspace_term', + 'keyspace_path', + 'namespace_term', + 'namespace_name', + 'bucket_name', + 'scope_name', + 'keyspace_name', + 'opt_use', + 'use_options', + 'use_keys', + 'use_index', + 'join_hint', + 'opt_primary', + 'index_refs', + 'index_ref', + 'use_hash_option', + 'opt_use_del_upd', + 'opt_join_type', + 'opt_outer', + 'on_keys', + 'on_key', + 'opt_let', + 'let_', + 'bindings', + 'binding', + 'opt_with', + 'with_list', + 'with_term', + 'opt_where', + 'where', + 'opt_group', + 'group', + 'group_terms', + 'group_term', + 'opt_letting', + 'letting', + 'opt_having', + 'having', + 'opt_order_by', + 'order_by', + 'sort_terms', + 'sort_term', + 'opt_dir', + 'dir', + 'opt_order_nulls', + 'first_last', + 'nulls', + 'opt_limit', + 'limit', + 'opt_offset', + 'offset', + 'insert', + 'simple_keyspace_ref', + 'keyspace_ref', + 'opt_values_header', + 'key', + 'values_list', + 'values', + 'next_values', + 'key_val_expr', + 'key_val_options_expr', + 'opt_returning', + 'returning', + 'returns_', + 'key_expr_header', + 'value_expr_header', + 'options_expr_header', + 'key_val_options_expr_header', + 'upsert', + 'delete_', + 'update', + 'set', + 'set_terms', + 'set_term', + 'function_meta_expr', + 'opt_update_for', + 'update_for', + 'update_dimensions', + 'update_dimension', + 'update_binding', + 'variable', + 'opt_when', + 'unset', + 'unset_terms', + 'unset_term', + 'merge', + 'opt_use_merge', + 'opt_key', + 'merge_actions', + 'opt_merge_delete_insert', + 'opt_merge_insert', + 'merge_update', + 'merge_delete', + 'merge_insert', + 'grant_role', + 'role_list', + 'role_name', + 'keyspace_scope_list', + 'keyspace_scope', + 'user_list', + 'user', + 'revoke_role', + 'create_scope', + 'drop_scope', + 'create_collection', + 'drop_collection', + 'flush_collection', + 'flush_or_truncate', + 'create_index', + 'create_primary_index', + 'opt_primary_name', + 'index_name', + 'opt_index_name', + 'named_keyspace_ref', + 'simple_named_keyspace_ref', + 'named_scope_ref', + 'index_partition', + 'opt_index_using', + 'index_using', + 'opt_index_with', + 'index_with', + 'index_terms', + 'index_term', + 'index_term_expr', + 'index_expr', + 'all', + 'index_where', + 'opt_ikattr', + 'ikattr', + 'drop_index', + 'alter_index', + 'build_index', + 'create_function', + 'opt_replace', + 'func_name', + 'short_func_name', + 'long_func_name', + 'parm_list', + 'parameter_terms', + 'func_body', + 'drop_function', + 'execute_function', + 'update_statistics', + 'opt_for', + 'update_stat_terms', + 'update_stat_term', + 'path', + 'expr', + 'valued', + 'c_expr', + 'b_expr', + 'literal', + 'construction_expr', + 'object', + 'opt_members', + 'members', + 'member', + 'array', + 'opt_exprs', + 'exprs', + 'param_expr', + 'case_expr', + 'simple_or_searched_case', + 'simple_case', + 'when_thens', + 'searched_case', + 'opt_else', + 'function_expr', + 'function_name', + 'collection_expr', + 'collection_cond', + 'coll_bindings', + 'coll_binding', + 'satisfies', + 'collection_xform', + 'paren_expr', + 'subquery_expr', + 'expr_input', + 'all_expr', + 'opt_window_clause', + 'window_list', + 'window_term', + 'window_specification', + 'opt_window_name', + 'opt_window_partition', + 'opt_window_frame', + 'window_frame_modifier', + 'opt_window_frame_exclusion', + 'window_frame_extents', + 'window_frame_extent', + 'window_frame_valexpr_modifier', + 'opt_nulls_treatment', + 'nulls_treatment', + 'opt_from_first_last', + 'agg_quantifier', + 'opt_filter', + 'opt_window_function', + 'window_function_details', + 'start_transaction', + 'commit_transaction', + 'rollback_transaction', + 'start_or_begin', + 'opt_transaction', + 'transaction', + 'opt_savepoint', + 'savepoint_name', + 'opt_isolation_level', + 'isolation_level', + 'isolation_val', + 'set_transaction_isolation', + 'savepoint', + 'if_exists', + 'if_not_exists', + ]; + + constructor(input) { + super(input); + this._interp = new antlr4.atn.ParserATNSimulator(this, atn, decisionsToDFA, sharedContextCache); + this.ruleNames = n1qlParser.ruleNames; + this.literalNames = n1qlParser.literalNames; + this.symbolicNames = n1qlParser.symbolicNames; + } + + get atn() { + return atn; + } + + sempred(localctx, ruleIndex, predIndex) { + switch (ruleIndex) { + case 2: + return this.opt_trailer_sempred(localctx, predIndex); + case 29: + return this.select_terms_sempred(localctx, predIndex); + case 38: + return this.projects_sempred(localctx, predIndex); + case 45: + return this.from_term_sempred(localctx, predIndex); + case 61: + return this.index_refs_sempred(localctx, predIndex); + case 71: + return this.bindings_sempred(localctx, predIndex); + case 74: + return this.with_list_sempred(localctx, predIndex); + case 80: + return this.group_terms_sempred(localctx, predIndex); + case 88: + return this.sort_terms_sempred(localctx, predIndex); + case 104: + return this.values_list_sempred(localctx, predIndex); + case 120: + return this.set_terms_sempred(localctx, predIndex); + case 125: + return this.update_dimensions_sempred(localctx, predIndex); + case 126: + return this.update_dimension_sempred(localctx, predIndex); + case 131: + return this.unset_terms_sempred(localctx, predIndex); + case 143: + return this.role_list_sempred(localctx, predIndex); + case 145: + return this.keyspace_scope_list_sempred(localctx, predIndex); + case 147: + return this.user_list_sempred(localctx, predIndex); + case 169: + return this.index_terms_sempred(localctx, predIndex); + case 186: + return this.parameter_terms_sempred(localctx, predIndex); + case 192: + return this.update_stat_terms_sempred(localctx, predIndex); + case 194: + return this.path_sempred(localctx, predIndex); + case 195: + return this.expr_sempred(localctx, predIndex); + case 198: + return this.b_expr_sempred(localctx, predIndex); + case 203: + return this.members_sempred(localctx, predIndex); + case 207: + return this.exprs_sempred(localctx, predIndex); + case 212: + return this.when_thens_sempred(localctx, predIndex); + case 219: + return this.coll_bindings_sempred(localctx, predIndex); + case 228: + return this.window_list_sempred(localctx, predIndex); + default: + throw 'No predicate with index:' + ruleIndex; + } + } + + opt_trailer_sempred(localctx, predIndex) { + switch (predIndex) { + case 0: + return this.precpred(this._ctx, 1); + default: + throw 'No predicate with index:' + predIndex; + } + } + + select_terms_sempred(localctx, predIndex) { + switch (predIndex) { + case 1: + return this.precpred(this._ctx, 12); + case 2: + return this.precpred(this._ctx, 11); + case 3: + return this.precpred(this._ctx, 10); + case 4: + return this.precpred(this._ctx, 9); + case 5: + return this.precpred(this._ctx, 8); + case 6: + return this.precpred(this._ctx, 7); + default: + throw 'No predicate with index:' + predIndex; + } + } + + projects_sempred(localctx, predIndex) { + switch (predIndex) { + case 7: + return this.precpred(this._ctx, 1); + default: + throw 'No predicate with index:' + predIndex; + } + } + + from_term_sempred(localctx, predIndex) { + switch (predIndex) { + case 8: + return this.precpred(this._ctx, 8); + case 9: + return this.precpred(this._ctx, 7); + case 10: + return this.precpred(this._ctx, 6); + case 11: + return this.precpred(this._ctx, 5); + case 12: + return this.precpred(this._ctx, 4); + case 13: + return this.precpred(this._ctx, 3); + case 14: + return this.precpred(this._ctx, 2); + default: + throw 'No predicate with index:' + predIndex; + } + } + + index_refs_sempred(localctx, predIndex) { + switch (predIndex) { + case 15: + return this.precpred(this._ctx, 1); + default: + throw 'No predicate with index:' + predIndex; + } + } + + bindings_sempred(localctx, predIndex) { + switch (predIndex) { + case 16: + return this.precpred(this._ctx, 1); + default: + throw 'No predicate with index:' + predIndex; + } + } + + with_list_sempred(localctx, predIndex) { + switch (predIndex) { + case 17: + return this.precpred(this._ctx, 1); + default: + throw 'No predicate with index:' + predIndex; + } + } + + group_terms_sempred(localctx, predIndex) { + switch (predIndex) { + case 18: + return this.precpred(this._ctx, 1); + default: + throw 'No predicate with index:' + predIndex; + } + } + + sort_terms_sempred(localctx, predIndex) { + switch (predIndex) { + case 19: + return this.precpred(this._ctx, 1); + default: + throw 'No predicate with index:' + predIndex; + } + } + + values_list_sempred(localctx, predIndex) { + switch (predIndex) { + case 20: + return this.precpred(this._ctx, 1); + default: + throw 'No predicate with index:' + predIndex; + } + } + + set_terms_sempred(localctx, predIndex) { + switch (predIndex) { + case 21: + return this.precpred(this._ctx, 1); + default: + throw 'No predicate with index:' + predIndex; + } + } + + update_dimensions_sempred(localctx, predIndex) { + switch (predIndex) { + case 22: + return this.precpred(this._ctx, 1); + default: + throw 'No predicate with index:' + predIndex; + } + } + + update_dimension_sempred(localctx, predIndex) { + switch (predIndex) { + case 23: + return this.precpred(this._ctx, 1); + default: + throw 'No predicate with index:' + predIndex; + } + } + + unset_terms_sempred(localctx, predIndex) { + switch (predIndex) { + case 24: + return this.precpred(this._ctx, 1); + default: + throw 'No predicate with index:' + predIndex; + } + } + + role_list_sempred(localctx, predIndex) { + switch (predIndex) { + case 25: + return this.precpred(this._ctx, 1); + default: + throw 'No predicate with index:' + predIndex; + } + } + + keyspace_scope_list_sempred(localctx, predIndex) { + switch (predIndex) { + case 26: + return this.precpred(this._ctx, 1); + default: + throw 'No predicate with index:' + predIndex; + } + } + + user_list_sempred(localctx, predIndex) { + switch (predIndex) { + case 27: + return this.precpred(this._ctx, 1); + default: + throw 'No predicate with index:' + predIndex; + } + } + + index_terms_sempred(localctx, predIndex) { + switch (predIndex) { + case 28: + return this.precpred(this._ctx, 1); + default: + throw 'No predicate with index:' + predIndex; + } + } + + parameter_terms_sempred(localctx, predIndex) { + switch (predIndex) { + case 29: + return this.precpred(this._ctx, 1); + default: + throw 'No predicate with index:' + predIndex; + } + } + + update_stat_terms_sempred(localctx, predIndex) { + switch (predIndex) { + case 30: + return this.precpred(this._ctx, 1); + default: + throw 'No predicate with index:' + predIndex; + } + } + + path_sempred(localctx, predIndex) { + switch (predIndex) { + case 31: + return this.precpred(this._ctx, 5); + case 32: + return this.precpred(this._ctx, 4); + case 33: + return this.precpred(this._ctx, 3); + case 34: + return this.precpred(this._ctx, 2); + case 35: + return this.precpred(this._ctx, 1); + default: + throw 'No predicate with index:' + predIndex; + } + } + + expr_sempred(localctx, predIndex) { + switch (predIndex) { + case 36: + return this.precpred(this._ctx, 31); + case 37: + return this.precpred(this._ctx, 30); + case 38: + return this.precpred(this._ctx, 29); + case 39: + return this.precpred(this._ctx, 28); + case 40: + return this.precpred(this._ctx, 27); + case 41: + return this.precpred(this._ctx, 26); + case 42: + return this.precpred(this._ctx, 25); + case 43: + return this.precpred(this._ctx, 24); + case 44: + return this.precpred(this._ctx, 22); + case 45: + return this.precpred(this._ctx, 21); + case 46: + return this.precpred(this._ctx, 20); + case 47: + return this.precpred(this._ctx, 19); + case 48: + return this.precpred(this._ctx, 18); + case 49: + return this.precpred(this._ctx, 17); + case 50: + return this.precpred(this._ctx, 16); + case 51: + return this.precpred(this._ctx, 13); + case 52: + return this.precpred(this._ctx, 12); + case 53: + return this.precpred(this._ctx, 11); + case 54: + return this.precpred(this._ctx, 10); + case 55: + return this.precpred(this._ctx, 9); + case 56: + return this.precpred(this._ctx, 8); + case 57: + return this.precpred(this._ctx, 39); + case 58: + return this.precpred(this._ctx, 38); + case 59: + return this.precpred(this._ctx, 37); + case 60: + return this.precpred(this._ctx, 36); + case 61: + return this.precpred(this._ctx, 35); + case 62: + return this.precpred(this._ctx, 34); + case 63: + return this.precpred(this._ctx, 33); + case 64: + return this.precpred(this._ctx, 32); + case 65: + return this.precpred(this._ctx, 15); + case 66: + return this.precpred(this._ctx, 14); + case 67: + return this.precpred(this._ctx, 7); + case 68: + return this.precpred(this._ctx, 6); + case 69: + return this.precpred(this._ctx, 5); + case 70: + return this.precpred(this._ctx, 4); + case 71: + return this.precpred(this._ctx, 3); + case 72: + return this.precpred(this._ctx, 2); + default: + throw 'No predicate with index:' + predIndex; + } + } + + b_expr_sempred(localctx, predIndex) { + switch (predIndex) { + case 73: + return this.precpred(this._ctx, 6); + case 74: + return this.precpred(this._ctx, 5); + case 75: + return this.precpred(this._ctx, 4); + case 76: + return this.precpred(this._ctx, 3); + case 77: + return this.precpred(this._ctx, 2); + case 78: + return this.precpred(this._ctx, 1); + case 79: + return this.precpred(this._ctx, 14); + case 80: + return this.precpred(this._ctx, 13); + case 81: + return this.precpred(this._ctx, 12); + case 82: + return this.precpred(this._ctx, 11); + case 83: + return this.precpred(this._ctx, 10); + case 84: + return this.precpred(this._ctx, 9); + case 85: + return this.precpred(this._ctx, 8); + case 86: + return this.precpred(this._ctx, 7); + default: + throw 'No predicate with index:' + predIndex; + } + } + + members_sempred(localctx, predIndex) { + switch (predIndex) { + case 87: + return this.precpred(this._ctx, 1); + default: + throw 'No predicate with index:' + predIndex; + } + } + + exprs_sempred(localctx, predIndex) { + switch (predIndex) { + case 88: + return this.precpred(this._ctx, 1); + default: + throw 'No predicate with index:' + predIndex; + } + } + + when_thens_sempred(localctx, predIndex) { + switch (predIndex) { + case 89: + return this.precpred(this._ctx, 1); + default: + throw 'No predicate with index:' + predIndex; + } + } + + coll_bindings_sempred(localctx, predIndex) { + switch (predIndex) { + case 90: + return this.precpred(this._ctx, 1); + default: + throw 'No predicate with index:' + predIndex; + } + } + + window_list_sempred(localctx, predIndex) { + switch (predIndex) { + case 91: + return this.precpred(this._ctx, 1); + default: + throw 'No predicate with index:' + predIndex; + } + } + + statements() { + let localctx = new StatementsContext(this, this._ctx, this.state); + this.enterRule(localctx, 0, n1qlParser.RULE_statements); + var _la = 0; // Token type + try { + this.enterOuterAlt(localctx, 1); + this.state = 522; + this.input(); + this.state = 526; + this._errHandler.sync(this); + _la = this._input.LA(1); + while ( + ((_la & ~0x1f) == 0 && + ((1 << _la) & + ((1 << n1qlParser.STR) | + (1 << n1qlParser.INT) | + (1 << n1qlParser.NUM) | + (1 << n1qlParser.MINUS) | + (1 << n1qlParser.LPAREN) | + (1 << n1qlParser.LBRACE) | + (1 << n1qlParser.LBRACKET))) !== + 0) || + (((_la - 32) & ~0x1f) == 0 && + ((1 << (_la - 32)) & + ((1 << (n1qlParser.ADVISE - 32)) | + (1 << (n1qlParser.ALL - 32)) | + (1 << (n1qlParser.ALTER - 32)) | + (1 << (n1qlParser.ANALYZE - 32)) | + (1 << (n1qlParser.ANY - 32)) | + (1 << (n1qlParser.ARRAY - 32)) | + (1 << (n1qlParser.BEGIN - 32)) | + (1 << (n1qlParser.BUILD - 32)) | + (1 << (n1qlParser.CASE - 32)) | + (1 << (n1qlParser.COMMIT - 32)) | + (1 << (n1qlParser.CORRELATED - 32)) | + (1 << (n1qlParser.COVER - 32)) | + (1 << (n1qlParser.CREATE - 32)))) !== + 0) || + (((_la - 69) & ~0x1f) == 0 && + ((1 << (_la - 69)) & + ((1 << (n1qlParser.DELETE_ - 69)) | + (1 << (n1qlParser.DISTINCT - 69)) | + (1 << (n1qlParser.DROP - 69)) | + (1 << (n1qlParser.EACH - 69)) | + (1 << (n1qlParser.EVERY - 69)) | + (1 << (n1qlParser.EXECUTE - 69)) | + (1 << (n1qlParser.EXISTS - 69)) | + (1 << (n1qlParser.EXPLAIN - 69)) | + (1 << (n1qlParser.FALSE - 69)) | + (1 << (n1qlParser.FIRST - 69)) | + (1 << (n1qlParser.FLUSH - 69)) | + (1 << (n1qlParser.FROM - 69)) | + (1 << (n1qlParser.GRANT - 69)))) !== + 0) || + (((_la - 112) & ~0x1f) == 0 && + ((1 << (_la - 112)) & + ((1 << (n1qlParser.INFER - 112)) | + (1 << (n1qlParser.INSERT - 112)) | + (1 << (n1qlParser.MERGE - 112)) | + (1 << (n1qlParser.MISSING - 112)))) !== + 0) || + (((_la - 145) & ~0x1f) == 0 && + ((1 << (_la - 145)) & + ((1 << (n1qlParser.NOT - 145)) | + (1 << (n1qlParser.NTH_VALUE - 145)) | + (1 << (n1qlParser.NULL - 145)) | + (1 << (n1qlParser.OBJECT - 145)) | + (1 << (n1qlParser.PREPARE - 145)))) !== + 0) || + (((_la - 179) & ~0x1f) == 0 && + ((1 << (_la - 179)) & + ((1 << (n1qlParser.REPLACE - 179)) | + (1 << (n1qlParser.REVOKE - 179)) | + (1 << (n1qlParser.ROLLBACK - 179)) | + (1 << (n1qlParser.SAVEPOINT - 179)) | + (1 << (n1qlParser.SELECT - 179)) | + (1 << (n1qlParser.SELF - 179)) | + (1 << (n1qlParser.SET - 179)) | + (1 << (n1qlParser.SOME - 179)) | + (1 << (n1qlParser.START - 179)) | + (1 << (n1qlParser.SYSTEM - 179)) | + (1 << (n1qlParser.TRUE - 179)) | + (1 << (n1qlParser.TRUNCATE - 179)))) !== + 0) || + (((_la - 217) & ~0x1f) == 0 && + ((1 << (_la - 217)) & + ((1 << (n1qlParser.UPDATE - 217)) | + (1 << (n1qlParser.UPSERT - 217)) | + (1 << (n1qlParser.WITH - 217)) | + (1 << (n1qlParser.IDENT_ICASE - 217)) | + (1 << (n1qlParser.IDENT - 217)) | + (1 << (n1qlParser.NAMED_PARAM - 217)) | + (1 << (n1qlParser.POSITIONAL_PARAM - 217)) | + (1 << (n1qlParser.NEXT_PARAM - 217)))) !== + 0) + ) { + this.state = 523; + this.input(); + this.state = 528; + this._errHandler.sync(this); + _la = this._input.LA(1); + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + input() { + let localctx = new InputContext(this, this._ctx, this.state); + this.enterRule(localctx, 2, n1qlParser.RULE_input); + try { + this.state = 533; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 1, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 529; + this.stmt_body(); + this.state = 530; + this.opt_trailer(0); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 532; + this.expr_input(); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + opt_trailer(_p) { + if (_p === undefined) { + _p = 0; + } + const _parentctx = this._ctx; + const _parentState = this.state; + let localctx = new Opt_trailerContext(this, this._ctx, _parentState); + let _prevctx = localctx; + const _startState = 4; + this.enterRecursionRule(localctx, 4, n1qlParser.RULE_opt_trailer, _p); + try { + this.enterOuterAlt(localctx, 1); + this._ctx.stop = this._input.LT(-1); + this.state = 540; + this._errHandler.sync(this); + var _alt = this._interp.adaptivePredict(this._input, 2, this._ctx); + while (_alt != 2 && _alt != antlr4.atn.ATN.INVALID_ALT_NUMBER) { + if (_alt === 1) { + if (this._parseListeners !== null) { + this.triggerExitRuleEvent(); + } + _prevctx = localctx; + localctx = new Opt_trailerContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_opt_trailer); + this.state = 536; + if (!this.precpred(this._ctx, 1)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 1)'); + } + this.state = 537; + this.match(n1qlParser.SEMI); + } + this.state = 542; + this._errHandler.sync(this); + _alt = this._interp.adaptivePredict(this._input, 2, this._ctx); + } + } catch (error) { + if (error instanceof antlr4.error.RecognitionException) { + localctx.exception = error; + this._errHandler.reportError(this, error); + this._errHandler.recover(this, error); + } else { + throw error; + } + } finally { + this.unrollRecursionContexts(_parentctx); + } + return localctx; + } + + stmt_body() { + let localctx = new Stmt_bodyContext(this, this._ctx, this.state); + this.enterRule(localctx, 6, n1qlParser.RULE_stmt_body); + try { + this.state = 548; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 3, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 543; + this.advise(); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 544; + this.explain(); + break; + + case 3: + this.enterOuterAlt(localctx, 3); + this.state = 545; + this.prepare(); + break; + + case 4: + this.enterOuterAlt(localctx, 4); + this.state = 546; + this.execute(); + break; + + case 5: + this.enterOuterAlt(localctx, 5); + this.state = 547; + this.stmt(); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + stmt() { + let localctx = new StmtContext(this, this._ctx, this.state); + this.enterRule(localctx, 8, n1qlParser.RULE_stmt); + try { + this.state = 558; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 4, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 550; + this.select_stmt(); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 551; + this.dml_stmt(); + break; + + case 3: + this.enterOuterAlt(localctx, 3); + this.state = 552; + this.ddl_stmt(); + break; + + case 4: + this.enterOuterAlt(localctx, 4); + this.state = 553; + this.infer(); + break; + + case 5: + this.enterOuterAlt(localctx, 5); + this.state = 554; + this.update_statistics(); + break; + + case 6: + this.enterOuterAlt(localctx, 6); + this.state = 555; + this.role_stmt(); + break; + + case 7: + this.enterOuterAlt(localctx, 7); + this.state = 556; + this.function_stmt(); + break; + + case 8: + this.enterOuterAlt(localctx, 8); + this.state = 557; + this.transaction_stmt(); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + advise() { + let localctx = new AdviseContext(this, this._ctx, this.state); + this.enterRule(localctx, 10, n1qlParser.RULE_advise); + try { + this.enterOuterAlt(localctx, 1); + this.state = 560; + this.match(n1qlParser.ADVISE); + this.state = 561; + this.opt_index(); + this.state = 562; + this.stmt(); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + opt_index() { + let localctx = new Opt_indexContext(this, this._ctx, this.state); + this.enterRule(localctx, 12, n1qlParser.RULE_opt_index); + try { + this.state = 566; + this._errHandler.sync(this); + switch (this._input.LA(1)) { + case n1qlParser.LPAREN: + case n1qlParser.ALTER: + case n1qlParser.ANALYZE: + case n1qlParser.BEGIN: + case n1qlParser.BUILD: + case n1qlParser.COMMIT: + case n1qlParser.CORRELATED: + case n1qlParser.CREATE: + case n1qlParser.DELETE_: + case n1qlParser.DROP: + case n1qlParser.EXECUTE: + case n1qlParser.FLUSH: + case n1qlParser.FROM: + case n1qlParser.GRANT: + case n1qlParser.INFER: + case n1qlParser.INSERT: + case n1qlParser.MERGE: + case n1qlParser.REVOKE: + case n1qlParser.ROLLBACK: + case n1qlParser.SAVEPOINT: + case n1qlParser.SELECT: + case n1qlParser.SET: + case n1qlParser.START: + case n1qlParser.TRUNCATE: + case n1qlParser.UPDATE: + case n1qlParser.UPSERT: + case n1qlParser.WITH: + this.enterOuterAlt(localctx, 1); + + break; + case n1qlParser.INDEX: + this.enterOuterAlt(localctx, 2); + this.state = 565; + this.match(n1qlParser.INDEX); + break; + default: + throw new antlr4.error.NoViableAltException(this); + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + explain() { + let localctx = new ExplainContext(this, this._ctx, this.state); + this.enterRule(localctx, 14, n1qlParser.RULE_explain); + try { + this.enterOuterAlt(localctx, 1); + this.state = 568; + this.match(n1qlParser.EXPLAIN); + this.state = 569; + this.stmt(); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + prepare() { + let localctx = new PrepareContext(this, this._ctx, this.state); + this.enterRule(localctx, 16, n1qlParser.RULE_prepare); + try { + this.enterOuterAlt(localctx, 1); + this.state = 571; + this.match(n1qlParser.PREPARE); + this.state = 572; + this.opt_force(); + this.state = 573; + this.opt_name(); + this.state = 574; + this.stmt(); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + opt_force() { + let localctx = new Opt_forceContext(this, this._ctx, this.state); + this.enterRule(localctx, 18, n1qlParser.RULE_opt_force); + try { + this.state = 578; + this._errHandler.sync(this); + switch (this._input.LA(1)) { + case n1qlParser.STR: + case n1qlParser.LPAREN: + case n1qlParser.ALTER: + case n1qlParser.ANALYZE: + case n1qlParser.BEGIN: + case n1qlParser.BUILD: + case n1qlParser.COMMIT: + case n1qlParser.CORRELATED: + case n1qlParser.CREATE: + case n1qlParser.DELETE_: + case n1qlParser.DROP: + case n1qlParser.EXECUTE: + case n1qlParser.FLUSH: + case n1qlParser.FROM: + case n1qlParser.GRANT: + case n1qlParser.INFER: + case n1qlParser.INSERT: + case n1qlParser.MERGE: + case n1qlParser.REVOKE: + case n1qlParser.ROLLBACK: + case n1qlParser.SAVEPOINT: + case n1qlParser.SELECT: + case n1qlParser.SET: + case n1qlParser.START: + case n1qlParser.TRUNCATE: + case n1qlParser.UPDATE: + case n1qlParser.UPSERT: + case n1qlParser.WITH: + case n1qlParser.IDENT: + this.enterOuterAlt(localctx, 1); + + break; + case n1qlParser.FORCE: + this.enterOuterAlt(localctx, 2); + this.state = 577; + this.match(n1qlParser.FORCE); + break; + default: + throw new antlr4.error.NoViableAltException(this); + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + opt_name() { + let localctx = new Opt_nameContext(this, this._ctx, this.state); + this.enterRule(localctx, 20, n1qlParser.RULE_opt_name); + try { + this.state = 585; + this._errHandler.sync(this); + switch (this._input.LA(1)) { + case n1qlParser.LPAREN: + case n1qlParser.ALTER: + case n1qlParser.ANALYZE: + case n1qlParser.BEGIN: + case n1qlParser.BUILD: + case n1qlParser.COMMIT: + case n1qlParser.CORRELATED: + case n1qlParser.CREATE: + case n1qlParser.DELETE_: + case n1qlParser.DROP: + case n1qlParser.EXECUTE: + case n1qlParser.FLUSH: + case n1qlParser.FROM: + case n1qlParser.GRANT: + case n1qlParser.INFER: + case n1qlParser.INSERT: + case n1qlParser.MERGE: + case n1qlParser.REVOKE: + case n1qlParser.ROLLBACK: + case n1qlParser.SAVEPOINT: + case n1qlParser.SELECT: + case n1qlParser.SET: + case n1qlParser.START: + case n1qlParser.TRUNCATE: + case n1qlParser.UPDATE: + case n1qlParser.UPSERT: + case n1qlParser.WITH: + this.enterOuterAlt(localctx, 1); + + break; + case n1qlParser.IDENT: + this.enterOuterAlt(localctx, 2); + this.state = 581; + this.match(n1qlParser.IDENT); + this.state = 582; + this.from_or_as(); + break; + case n1qlParser.STR: + this.enterOuterAlt(localctx, 3); + this.state = 583; + this.match(n1qlParser.STR); + this.state = 584; + this.from_or_as(); + break; + default: + throw new antlr4.error.NoViableAltException(this); + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + from_or_as() { + let localctx = new From_or_asContext(this, this._ctx, this.state); + this.enterRule(localctx, 22, n1qlParser.RULE_from_or_as); + var _la = 0; // Token type + try { + this.enterOuterAlt(localctx, 1); + this.state = 587; + _la = this._input.LA(1); + if (!(_la === n1qlParser.AS || _la === n1qlParser.FROM)) { + this._errHandler.recoverInline(this); + } else { + this._errHandler.reportMatch(this); + this.consume(); + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + execute() { + let localctx = new ExecuteContext(this, this._ctx, this.state); + this.enterRule(localctx, 24, n1qlParser.RULE_execute); + try { + this.enterOuterAlt(localctx, 1); + this.state = 589; + this.match(n1qlParser.EXECUTE); + this.state = 590; + this.expr(0); + this.state = 591; + this.execute_using(); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + execute_using() { + let localctx = new Execute_usingContext(this, this._ctx, this.state); + this.enterRule(localctx, 26, n1qlParser.RULE_execute_using); + try { + this.state = 596; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 8, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 594; + this.match(n1qlParser.USING); + this.state = 595; + this.construction_expr(); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + infer() { + let localctx = new InferContext(this, this._ctx, this.state); + this.enterRule(localctx, 28, n1qlParser.RULE_infer); + try { + this.enterOuterAlt(localctx, 1); + this.state = 598; + this.match(n1qlParser.INFER); + this.state = 599; + this.opt_keyspace_collection(); + this.state = 600; + this.simple_keyspace_ref(); + this.state = 601; + this.opt_infer_using(); + this.state = 602; + this.opt_infer_ustat_with(); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + opt_keyspace_collection() { + let localctx = new Opt_keyspace_collectionContext(this, this._ctx, this.state); + this.enterRule(localctx, 30, n1qlParser.RULE_opt_keyspace_collection); + try { + this.state = 607; + this._errHandler.sync(this); + switch (this._input.LA(1)) { + case n1qlParser.SYSTEM: + case n1qlParser.IDENT: + this.enterOuterAlt(localctx, 1); + + break; + case n1qlParser.KEYSPACE: + this.enterOuterAlt(localctx, 2); + this.state = 605; + this.match(n1qlParser.KEYSPACE); + break; + case n1qlParser.COLLECTION: + this.enterOuterAlt(localctx, 3); + this.state = 606; + this.match(n1qlParser.COLLECTION); + break; + default: + throw new antlr4.error.NoViableAltException(this); + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + opt_infer_using() { + let localctx = new Opt_infer_usingContext(this, this._ctx, this.state); + this.enterRule(localctx, 32, n1qlParser.RULE_opt_infer_using); + try { + this.enterOuterAlt(localctx, 1); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + opt_infer_ustat_with() { + let localctx = new Opt_infer_ustat_withContext(this, this._ctx, this.state); + this.enterRule(localctx, 34, n1qlParser.RULE_opt_infer_ustat_with); + try { + this.state = 613; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 10, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 612; + this.infer_ustat_with(); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + infer_ustat_with() { + let localctx = new Infer_ustat_withContext(this, this._ctx, this.state); + this.enterRule(localctx, 36, n1qlParser.RULE_infer_ustat_with); + try { + this.enterOuterAlt(localctx, 1); + this.state = 615; + this.match(n1qlParser.WITH); + this.state = 616; + this.expr(0); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + select_stmt() { + let localctx = new Select_stmtContext(this, this._ctx, this.state); + this.enterRule(localctx, 38, n1qlParser.RULE_select_stmt); + try { + this.enterOuterAlt(localctx, 1); + this.state = 618; + this.fullselect(); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + dml_stmt() { + let localctx = new Dml_stmtContext(this, this._ctx, this.state); + this.enterRule(localctx, 40, n1qlParser.RULE_dml_stmt); + try { + this.state = 625; + this._errHandler.sync(this); + switch (this._input.LA(1)) { + case n1qlParser.INSERT: + this.enterOuterAlt(localctx, 1); + this.state = 620; + this.insert(); + break; + case n1qlParser.UPSERT: + this.enterOuterAlt(localctx, 2); + this.state = 621; + this.upsert(); + break; + case n1qlParser.DELETE_: + this.enterOuterAlt(localctx, 3); + this.state = 622; + this.delete_(); + break; + case n1qlParser.UPDATE: + this.enterOuterAlt(localctx, 4); + this.state = 623; + this.update(); + break; + case n1qlParser.MERGE: + this.enterOuterAlt(localctx, 5); + this.state = 624; + this.merge(); + break; + default: + throw new antlr4.error.NoViableAltException(this); + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + ddl_stmt() { + let localctx = new Ddl_stmtContext(this, this._ctx, this.state); + this.enterRule(localctx, 42, n1qlParser.RULE_ddl_stmt); + try { + this.state = 630; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 12, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 627; + this.index_stmt(); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 628; + this.scope_stmt(); + break; + + case 3: + this.enterOuterAlt(localctx, 3); + this.state = 629; + this.collection_stmt(); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + role_stmt() { + let localctx = new Role_stmtContext(this, this._ctx, this.state); + this.enterRule(localctx, 44, n1qlParser.RULE_role_stmt); + try { + this.state = 634; + this._errHandler.sync(this); + switch (this._input.LA(1)) { + case n1qlParser.GRANT: + this.enterOuterAlt(localctx, 1); + this.state = 632; + this.grant_role(); + break; + case n1qlParser.REVOKE: + this.enterOuterAlt(localctx, 2); + this.state = 633; + this.revoke_role(); + break; + default: + throw new antlr4.error.NoViableAltException(this); + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + index_stmt() { + let localctx = new Index_stmtContext(this, this._ctx, this.state); + this.enterRule(localctx, 46, n1qlParser.RULE_index_stmt); + try { + this.state = 641; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 14, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 636; + this.create_index(); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 637; + this.create_primary_index(); + break; + + case 3: + this.enterOuterAlt(localctx, 3); + this.state = 638; + this.drop_index(); + break; + + case 4: + this.enterOuterAlt(localctx, 4); + this.state = 639; + this.alter_index(); + break; + + case 5: + this.enterOuterAlt(localctx, 5); + this.state = 640; + this.build_index(); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + scope_stmt() { + let localctx = new Scope_stmtContext(this, this._ctx, this.state); + this.enterRule(localctx, 48, n1qlParser.RULE_scope_stmt); + try { + this.state = 645; + this._errHandler.sync(this); + switch (this._input.LA(1)) { + case n1qlParser.CREATE: + this.enterOuterAlt(localctx, 1); + this.state = 643; + this.create_scope(); + break; + case n1qlParser.DROP: + this.enterOuterAlt(localctx, 2); + this.state = 644; + this.drop_scope(); + break; + default: + throw new antlr4.error.NoViableAltException(this); + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + collection_stmt() { + let localctx = new Collection_stmtContext(this, this._ctx, this.state); + this.enterRule(localctx, 50, n1qlParser.RULE_collection_stmt); + try { + this.state = 650; + this._errHandler.sync(this); + switch (this._input.LA(1)) { + case n1qlParser.CREATE: + this.enterOuterAlt(localctx, 1); + this.state = 647; + this.create_collection(); + break; + case n1qlParser.DROP: + this.enterOuterAlt(localctx, 2); + this.state = 648; + this.drop_collection(); + break; + case n1qlParser.FLUSH: + case n1qlParser.TRUNCATE: + this.enterOuterAlt(localctx, 3); + this.state = 649; + this.flush_collection(); + break; + default: + throw new antlr4.error.NoViableAltException(this); + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + function_stmt() { + let localctx = new Function_stmtContext(this, this._ctx, this.state); + this.enterRule(localctx, 52, n1qlParser.RULE_function_stmt); + try { + this.state = 655; + this._errHandler.sync(this); + switch (this._input.LA(1)) { + case n1qlParser.CREATE: + this.enterOuterAlt(localctx, 1); + this.state = 652; + this.create_function(); + break; + case n1qlParser.DROP: + this.enterOuterAlt(localctx, 2); + this.state = 653; + this.drop_function(); + break; + case n1qlParser.EXECUTE: + this.enterOuterAlt(localctx, 3); + this.state = 654; + this.execute_function(); + break; + default: + throw new antlr4.error.NoViableAltException(this); + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + transaction_stmt() { + let localctx = new Transaction_stmtContext(this, this._ctx, this.state); + this.enterRule(localctx, 54, n1qlParser.RULE_transaction_stmt); + try { + this.state = 662; + this._errHandler.sync(this); + switch (this._input.LA(1)) { + case n1qlParser.BEGIN: + case n1qlParser.START: + this.enterOuterAlt(localctx, 1); + this.state = 657; + this.start_transaction(); + break; + case n1qlParser.COMMIT: + this.enterOuterAlt(localctx, 2); + this.state = 658; + this.commit_transaction(); + break; + case n1qlParser.ROLLBACK: + this.enterOuterAlt(localctx, 3); + this.state = 659; + this.rollback_transaction(); + break; + case n1qlParser.SAVEPOINT: + this.enterOuterAlt(localctx, 4); + this.state = 660; + this.savepoint(); + break; + case n1qlParser.SET: + this.enterOuterAlt(localctx, 5); + this.state = 661; + this.set_transaction_isolation(); + break; + default: + throw new antlr4.error.NoViableAltException(this); + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + fullselect() { + let localctx = new FullselectContext(this, this._ctx, this.state); + this.enterRule(localctx, 56, n1qlParser.RULE_fullselect); + try { + this.state = 677; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 19, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 664; + this.select_terms(0); + this.state = 665; + this.opt_order_by(); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 667; + this.select_terms(0); + this.state = 668; + this.opt_order_by(); + this.state = 669; + this.limit(); + this.state = 670; + this.opt_offset(); + break; + + case 3: + this.enterOuterAlt(localctx, 3); + this.state = 672; + this.select_terms(0); + this.state = 673; + this.opt_order_by(); + this.state = 674; + this.offset(); + this.state = 675; + this.opt_limit(); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + select_terms(_p) { + if (_p === undefined) { + _p = 0; + } + const _parentctx = this._ctx; + const _parentState = this.state; + let localctx = new Select_termsContext(this, this._ctx, _parentState); + let _prevctx = localctx; + const _startState = 58; + this.enterRecursionRule(localctx, 58, n1qlParser.RULE_select_terms, _p); + try { + this.enterOuterAlt(localctx, 1); + this.state = 708; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 20, this._ctx); + switch (la_) { + case 1: + this.state = 680; + this.subselect(); + break; + + case 2: + this.state = 681; + this.subquery_expr(); + this.state = 682; + this.match(n1qlParser.UNION); + this.state = 683; + this.select_term(); + break; + + case 3: + this.state = 685; + this.subquery_expr(); + this.state = 686; + this.match(n1qlParser.UNION); + this.state = 687; + this.match(n1qlParser.ALL); + this.state = 688; + this.select_term(); + break; + + case 4: + this.state = 690; + this.subquery_expr(); + this.state = 691; + this.match(n1qlParser.INTERSECT); + this.state = 692; + this.select_term(); + break; + + case 5: + this.state = 694; + this.subquery_expr(); + this.state = 695; + this.match(n1qlParser.INTERSECT); + this.state = 696; + this.match(n1qlParser.ALL); + this.state = 697; + this.select_term(); + break; + + case 6: + this.state = 699; + this.subquery_expr(); + this.state = 700; + this.match(n1qlParser.EXCEPT); + this.state = 701; + this.select_term(); + break; + + case 7: + this.state = 703; + this.subquery_expr(); + this.state = 704; + this.match(n1qlParser.EXCEPT); + this.state = 705; + this.match(n1qlParser.ALL); + this.state = 706; + this.select_term(); + break; + } + this._ctx.stop = this._input.LT(-1); + this.state = 733; + this._errHandler.sync(this); + var _alt = this._interp.adaptivePredict(this._input, 22, this._ctx); + while (_alt != 2 && _alt != antlr4.atn.ATN.INVALID_ALT_NUMBER) { + if (_alt === 1) { + if (this._parseListeners !== null) { + this.triggerExitRuleEvent(); + } + _prevctx = localctx; + this.state = 731; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 21, this._ctx); + switch (la_) { + case 1: + localctx = new Select_termsContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_select_terms); + this.state = 710; + if (!this.precpred(this._ctx, 12)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 12)'); + } + this.state = 711; + this.match(n1qlParser.UNION); + this.state = 712; + this.select_term(); + break; + + case 2: + localctx = new Select_termsContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_select_terms); + this.state = 713; + if (!this.precpred(this._ctx, 11)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 11)'); + } + this.state = 714; + this.match(n1qlParser.UNION); + this.state = 715; + this.match(n1qlParser.ALL); + this.state = 716; + this.select_term(); + break; + + case 3: + localctx = new Select_termsContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_select_terms); + this.state = 717; + if (!this.precpred(this._ctx, 10)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 10)'); + } + this.state = 718; + this.match(n1qlParser.INTERSECT); + this.state = 719; + this.select_term(); + break; + + case 4: + localctx = new Select_termsContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_select_terms); + this.state = 720; + if (!this.precpred(this._ctx, 9)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 9)'); + } + this.state = 721; + this.match(n1qlParser.INTERSECT); + this.state = 722; + this.match(n1qlParser.ALL); + this.state = 723; + this.select_term(); + break; + + case 5: + localctx = new Select_termsContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_select_terms); + this.state = 724; + if (!this.precpred(this._ctx, 8)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 8)'); + } + this.state = 725; + this.match(n1qlParser.EXCEPT); + this.state = 726; + this.select_term(); + break; + + case 6: + localctx = new Select_termsContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_select_terms); + this.state = 727; + if (!this.precpred(this._ctx, 7)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 7)'); + } + this.state = 728; + this.match(n1qlParser.EXCEPT); + this.state = 729; + this.match(n1qlParser.ALL); + this.state = 730; + this.select_term(); + break; + } + } + this.state = 735; + this._errHandler.sync(this); + _alt = this._interp.adaptivePredict(this._input, 22, this._ctx); + } + } catch (error) { + if (error instanceof antlr4.error.RecognitionException) { + localctx.exception = error; + this._errHandler.reportError(this, error); + this._errHandler.recover(this, error); + } else { + throw error; + } + } finally { + this.unrollRecursionContexts(_parentctx); + } + return localctx; + } + + select_term() { + let localctx = new Select_termContext(this, this._ctx, this.state); + this.enterRule(localctx, 60, n1qlParser.RULE_select_term); + try { + this.state = 738; + this._errHandler.sync(this); + switch (this._input.LA(1)) { + case n1qlParser.FROM: + case n1qlParser.SELECT: + case n1qlParser.WITH: + this.enterOuterAlt(localctx, 1); + this.state = 736; + this.subselect(); + break; + case n1qlParser.LPAREN: + case n1qlParser.CORRELATED: + this.enterOuterAlt(localctx, 2); + this.state = 737; + this.subquery_expr(); + break; + default: + throw new antlr4.error.NoViableAltException(this); + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + subselect() { + let localctx = new SubselectContext(this, this._ctx, this.state); + this.enterRule(localctx, 62, n1qlParser.RULE_subselect); + try { + this.state = 742; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 24, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 740; + this.from_select(); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 741; + this.select_from(); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + from_select() { + let localctx = new From_selectContext(this, this._ctx, this.state); + this.enterRule(localctx, 64, n1qlParser.RULE_from_select); + try { + this.enterOuterAlt(localctx, 1); + this.state = 744; + this.opt_with(); + this.state = 745; + this.from(); + this.state = 746; + this.opt_let(); + this.state = 747; + this.opt_where(); + this.state = 748; + this.opt_group(); + this.state = 749; + this.opt_window_clause(); + this.state = 750; + this.select_clause(); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + select_from() { + let localctx = new Select_fromContext(this, this._ctx, this.state); + this.enterRule(localctx, 66, n1qlParser.RULE_select_from); + try { + this.enterOuterAlt(localctx, 1); + this.state = 752; + this.opt_with(); + this.state = 753; + this.select_clause(); + this.state = 754; + this.opt_from(); + this.state = 755; + this.opt_let(); + this.state = 756; + this.opt_where(); + this.state = 757; + this.opt_group(); + this.state = 758; + this.opt_window_clause(); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + select_clause() { + let localctx = new Select_clauseContext(this, this._ctx, this.state); + this.enterRule(localctx, 68, n1qlParser.RULE_select_clause); + try { + this.enterOuterAlt(localctx, 1); + this.state = 760; + this.match(n1qlParser.SELECT); + this.state = 761; + this.projection(); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + projection() { + let localctx = new ProjectionContext(this, this._ctx, this.state); + this.enterRule(localctx, 70, n1qlParser.RULE_projection); + try { + this.state = 771; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 25, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 763; + this.opt_quantifier(); + this.state = 764; + this.projects(0); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 766; + this.opt_quantifier(); + this.state = 767; + this.raw(); + this.state = 768; + this.expr(0); + this.state = 769; + this.opt_as_alias(); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + opt_quantifier() { + let localctx = new Opt_quantifierContext(this, this._ctx, this.state); + this.enterRule(localctx, 72, n1qlParser.RULE_opt_quantifier); + try { + this.state = 776; + this._errHandler.sync(this); + switch (this._input.LA(1)) { + case n1qlParser.STR: + case n1qlParser.INT: + case n1qlParser.NUM: + case n1qlParser.MINUS: + case n1qlParser.STAR: + case n1qlParser.LPAREN: + case n1qlParser.LBRACE: + case n1qlParser.LBRACKET: + case n1qlParser.ANY: + case n1qlParser.ARRAY: + case n1qlParser.CASE: + case n1qlParser.CORRELATED: + case n1qlParser.COVER: + case n1qlParser.ELEMENT: + case n1qlParser.EVERY: + case n1qlParser.EXISTS: + case n1qlParser.FALSE: + case n1qlParser.FIRST: + case n1qlParser.MISSING: + case n1qlParser.NOT: + case n1qlParser.NTH_VALUE: + case n1qlParser.NULL: + case n1qlParser.OBJECT: + case n1qlParser.RAW: + case n1qlParser.REPLACE: + case n1qlParser.SELF: + case n1qlParser.SOME: + case n1qlParser.SYSTEM: + case n1qlParser.TRUE: + case n1qlParser.VALUE: + case n1qlParser.IDENT_ICASE: + case n1qlParser.IDENT: + case n1qlParser.NAMED_PARAM: + case n1qlParser.POSITIONAL_PARAM: + case n1qlParser.NEXT_PARAM: + this.enterOuterAlt(localctx, 1); + + break; + case n1qlParser.ALL: + this.enterOuterAlt(localctx, 2); + this.state = 774; + this.match(n1qlParser.ALL); + break; + case n1qlParser.DISTINCT: + this.enterOuterAlt(localctx, 3); + this.state = 775; + this.match(n1qlParser.DISTINCT); + break; + default: + throw new antlr4.error.NoViableAltException(this); + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + raw() { + let localctx = new RawContext(this, this._ctx, this.state); + this.enterRule(localctx, 74, n1qlParser.RULE_raw); + var _la = 0; // Token type + try { + this.enterOuterAlt(localctx, 1); + this.state = 778; + _la = this._input.LA(1); + if (!(_la === n1qlParser.ELEMENT || _la === n1qlParser.RAW || _la === n1qlParser.VALUE)) { + this._errHandler.recoverInline(this); + } else { + this._errHandler.reportMatch(this); + this.consume(); + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + projects(_p) { + if (_p === undefined) { + _p = 0; + } + const _parentctx = this._ctx; + const _parentState = this.state; + let localctx = new ProjectsContext(this, this._ctx, _parentState); + let _prevctx = localctx; + const _startState = 76; + this.enterRecursionRule(localctx, 76, n1qlParser.RULE_projects, _p); + try { + this.enterOuterAlt(localctx, 1); + this.state = 781; + this.project(); + this._ctx.stop = this._input.LT(-1); + this.state = 788; + this._errHandler.sync(this); + var _alt = this._interp.adaptivePredict(this._input, 27, this._ctx); + while (_alt != 2 && _alt != antlr4.atn.ATN.INVALID_ALT_NUMBER) { + if (_alt === 1) { + if (this._parseListeners !== null) { + this.triggerExitRuleEvent(); + } + _prevctx = localctx; + localctx = new ProjectsContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_projects); + this.state = 783; + if (!this.precpred(this._ctx, 1)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 1)'); + } + this.state = 784; + this.match(n1qlParser.COMMA); + this.state = 785; + this.project(); + } + this.state = 790; + this._errHandler.sync(this); + _alt = this._interp.adaptivePredict(this._input, 27, this._ctx); + } + } catch (error) { + if (error instanceof antlr4.error.RecognitionException) { + localctx.exception = error; + this._errHandler.reportError(this, error); + this._errHandler.recover(this, error); + } else { + throw error; + } + } finally { + this.unrollRecursionContexts(_parentctx); + } + return localctx; + } + + project() { + let localctx = new ProjectContext(this, this._ctx, this.state); + this.enterRule(localctx, 78, n1qlParser.RULE_project); + try { + this.state = 799; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 28, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 791; + this.match(n1qlParser.STAR); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 792; + this.expr(0); + this.state = 793; + this.match(n1qlParser.DOT); + this.state = 794; + this.match(n1qlParser.STAR); + break; + + case 3: + this.enterOuterAlt(localctx, 3); + this.state = 796; + this.expr(0); + this.state = 797; + this.opt_as_alias(); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + opt_as_alias() { + let localctx = new Opt_as_aliasContext(this, this._ctx, this.state); + this.enterRule(localctx, 80, n1qlParser.RULE_opt_as_alias); + try { + this.state = 803; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 29, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 802; + this.as_alias(); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + as_alias() { + let localctx = new As_aliasContext(this, this._ctx, this.state); + this.enterRule(localctx, 82, n1qlParser.RULE_as_alias); + try { + this.state = 808; + this._errHandler.sync(this); + switch (this._input.LA(1)) { + case n1qlParser.IDENT: + this.enterOuterAlt(localctx, 1); + this.state = 805; + this.alias(); + break; + case n1qlParser.AS: + this.enterOuterAlt(localctx, 2); + this.state = 806; + this.match(n1qlParser.AS); + this.state = 807; + this.alias(); + break; + default: + throw new antlr4.error.NoViableAltException(this); + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + alias() { + let localctx = new AliasContext(this, this._ctx, this.state); + this.enterRule(localctx, 84, n1qlParser.RULE_alias); + try { + this.enterOuterAlt(localctx, 1); + this.state = 810; + this.match(n1qlParser.IDENT); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + opt_from() { + let localctx = new Opt_fromContext(this, this._ctx, this.state); + this.enterRule(localctx, 86, n1qlParser.RULE_opt_from); + try { + this.state = 814; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 31, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 813; + this.from(); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + from() { + let localctx = new FromContext(this, this._ctx, this.state); + this.enterRule(localctx, 88, n1qlParser.RULE_from); + try { + this.enterOuterAlt(localctx, 1); + this.state = 816; + this.match(n1qlParser.FROM); + this.state = 817; + this.from_term(0); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + from_term(_p) { + if (_p === undefined) { + _p = 0; + } + const _parentctx = this._ctx; + const _parentState = this.state; + let localctx = new From_termContext(this, this._ctx, _parentState); + let _prevctx = localctx; + const _startState = 90; + this.enterRecursionRule(localctx, 90, n1qlParser.RULE_from_term, _p); + try { + this.enterOuterAlt(localctx, 1); + this.state = 829; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 32, this._ctx); + switch (la_) { + case 1: + this.state = 820; + this.simple_from_term(); + break; + + case 2: + this.state = 821; + this.simple_from_term(); + this.state = 822; + this.match(n1qlParser.RIGHT); + this.state = 823; + this.opt_outer(); + this.state = 824; + this.match(n1qlParser.JOIN); + this.state = 825; + this.simple_from_term(); + this.state = 826; + this.match(n1qlParser.ON); + this.state = 827; + this.expr(0); + break; + } + this._ctx.stop = this._input.LT(-1); + this.state = 881; + this._errHandler.sync(this); + var _alt = this._interp.adaptivePredict(this._input, 34, this._ctx); + while (_alt != 2 && _alt != antlr4.atn.ATN.INVALID_ALT_NUMBER) { + if (_alt === 1) { + if (this._parseListeners !== null) { + this.triggerExitRuleEvent(); + } + _prevctx = localctx; + this.state = 879; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 33, this._ctx); + switch (la_) { + case 1: + localctx = new From_termContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_from_term); + this.state = 831; + if (!this.precpred(this._ctx, 8)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 8)'); + } + this.state = 832; + this.opt_join_type(); + this.state = 833; + this.match(n1qlParser.JOIN); + this.state = 834; + this.simple_from_term(); + this.state = 835; + this.on_keys(); + break; + + case 2: + localctx = new From_termContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_from_term); + this.state = 837; + if (!this.precpred(this._ctx, 7)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 7)'); + } + this.state = 838; + this.opt_join_type(); + this.state = 839; + this.match(n1qlParser.JOIN); + this.state = 840; + this.simple_from_term(); + this.state = 841; + this.on_key(); + this.state = 842; + this.match(n1qlParser.FOR); + this.state = 843; + this.match(n1qlParser.IDENT); + break; + + case 3: + localctx = new From_termContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_from_term); + this.state = 845; + if (!this.precpred(this._ctx, 6)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 6)'); + } + this.state = 846; + this.opt_join_type(); + this.state = 847; + this.match(n1qlParser.NEST); + this.state = 848; + this.simple_from_term(); + this.state = 849; + this.on_keys(); + break; + + case 4: + localctx = new From_termContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_from_term); + this.state = 851; + if (!this.precpred(this._ctx, 5)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 5)'); + } + this.state = 852; + this.opt_join_type(); + this.state = 853; + this.match(n1qlParser.NEST); + this.state = 854; + this.simple_from_term(); + this.state = 855; + this.on_key(); + this.state = 856; + this.match(n1qlParser.FOR); + this.state = 857; + this.match(n1qlParser.IDENT); + break; + + case 5: + localctx = new From_termContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_from_term); + this.state = 859; + if (!this.precpred(this._ctx, 4)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 4)'); + } + this.state = 860; + this.opt_join_type(); + this.state = 861; + this.unnest(); + this.state = 862; + this.expr(0); + this.state = 863; + this.opt_as_alias(); + break; + + case 6: + localctx = new From_termContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_from_term); + this.state = 865; + if (!this.precpred(this._ctx, 3)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 3)'); + } + this.state = 866; + this.opt_join_type(); + this.state = 867; + this.match(n1qlParser.JOIN); + this.state = 868; + this.simple_from_term(); + this.state = 869; + this.match(n1qlParser.ON); + this.state = 870; + this.expr(0); + break; + + case 7: + localctx = new From_termContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_from_term); + this.state = 872; + if (!this.precpred(this._ctx, 2)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 2)'); + } + this.state = 873; + this.opt_join_type(); + this.state = 874; + this.match(n1qlParser.NEST); + this.state = 875; + this.simple_from_term(); + this.state = 876; + this.match(n1qlParser.ON); + this.state = 877; + this.expr(0); + break; + } + } + this.state = 883; + this._errHandler.sync(this); + _alt = this._interp.adaptivePredict(this._input, 34, this._ctx); + } + } catch (error) { + if (error instanceof antlr4.error.RecognitionException) { + localctx.exception = error; + this._errHandler.reportError(this, error); + this._errHandler.recover(this, error); + } else { + throw error; + } + } finally { + this.unrollRecursionContexts(_parentctx); + } + return localctx; + } + + simple_from_term() { + let localctx = new Simple_from_termContext(this, this._ctx, this.state); + this.enterRule(localctx, 92, n1qlParser.RULE_simple_from_term); + try { + this.state = 889; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 35, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 884; + this.keyspace_term(); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 885; + this.expr(0); + this.state = 886; + this.opt_as_alias(); + this.state = 887; + this.opt_use(); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + unnest() { + let localctx = new UnnestContext(this, this._ctx, this.state); + this.enterRule(localctx, 94, n1qlParser.RULE_unnest); + var _la = 0; // Token type + try { + this.enterOuterAlt(localctx, 1); + this.state = 891; + _la = this._input.LA(1); + if (!(_la === n1qlParser.FLATTEN || _la === n1qlParser.UNNEST)) { + this._errHandler.recoverInline(this); + } else { + this._errHandler.reportMatch(this); + this.consume(); + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + keyspace_term() { + let localctx = new Keyspace_termContext(this, this._ctx, this.state); + this.enterRule(localctx, 96, n1qlParser.RULE_keyspace_term); + try { + this.enterOuterAlt(localctx, 1); + this.state = 893; + this.keyspace_path(); + this.state = 894; + this.opt_as_alias(); + this.state = 895; + this.opt_use(); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + keyspace_path() { + let localctx = new Keyspace_pathContext(this, this._ctx, this.state); + this.enterRule(localctx, 98, n1qlParser.RULE_keyspace_path); + try { + this.state = 907; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 36, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 897; + this.namespace_term(); + this.state = 898; + this.keyspace_name(); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 900; + this.namespace_term(); + this.state = 901; + this.bucket_name(); + this.state = 902; + this.match(n1qlParser.DOT); + this.state = 903; + this.scope_name(); + this.state = 904; + this.match(n1qlParser.DOT); + this.state = 905; + this.keyspace_name(); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + namespace_term() { + let localctx = new Namespace_termContext(this, this._ctx, this.state); + this.enterRule(localctx, 100, n1qlParser.RULE_namespace_term); + try { + this.state = 912; + this._errHandler.sync(this); + switch (this._input.LA(1)) { + case n1qlParser.IDENT: + this.enterOuterAlt(localctx, 1); + this.state = 909; + this.namespace_name(); + break; + case n1qlParser.SYSTEM: + this.enterOuterAlt(localctx, 2); + this.state = 910; + this.match(n1qlParser.SYSTEM); + this.state = 911; + this.match(n1qlParser.COLON); + break; + default: + throw new antlr4.error.NoViableAltException(this); + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + namespace_name() { + let localctx = new Namespace_nameContext(this, this._ctx, this.state); + this.enterRule(localctx, 102, n1qlParser.RULE_namespace_name); + try { + this.enterOuterAlt(localctx, 1); + this.state = 914; + this.match(n1qlParser.IDENT); + this.state = 915; + this.match(n1qlParser.COLON); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + bucket_name() { + let localctx = new Bucket_nameContext(this, this._ctx, this.state); + this.enterRule(localctx, 104, n1qlParser.RULE_bucket_name); + try { + this.enterOuterAlt(localctx, 1); + this.state = 917; + this.match(n1qlParser.IDENT); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + scope_name() { + let localctx = new Scope_nameContext(this, this._ctx, this.state); + this.enterRule(localctx, 106, n1qlParser.RULE_scope_name); + try { + this.enterOuterAlt(localctx, 1); + this.state = 919; + this.match(n1qlParser.IDENT); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + keyspace_name() { + let localctx = new Keyspace_nameContext(this, this._ctx, this.state); + this.enterRule(localctx, 108, n1qlParser.RULE_keyspace_name); + try { + this.enterOuterAlt(localctx, 1); + this.state = 921; + this.match(n1qlParser.IDENT); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + opt_use() { + let localctx = new Opt_useContext(this, this._ctx, this.state); + this.enterRule(localctx, 110, n1qlParser.RULE_opt_use); + try { + this.state = 926; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 38, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 924; + this.match(n1qlParser.USE); + this.state = 925; + this.use_options(); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + use_options() { + let localctx = new Use_optionsContext(this, this._ctx, this.state); + this.enterRule(localctx, 112, n1qlParser.RULE_use_options); + try { + this.state = 943; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 39, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 928; + this.use_keys(); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 929; + this.use_index(); + break; + + case 3: + this.enterOuterAlt(localctx, 3); + this.state = 930; + this.join_hint(); + break; + + case 4: + this.enterOuterAlt(localctx, 4); + this.state = 931; + this.use_index(); + this.state = 932; + this.join_hint(); + break; + + case 5: + this.enterOuterAlt(localctx, 5); + this.state = 934; + this.join_hint(); + this.state = 935; + this.use_index(); + break; + + case 6: + this.enterOuterAlt(localctx, 6); + this.state = 937; + this.use_keys(); + this.state = 938; + this.join_hint(); + break; + + case 7: + this.enterOuterAlt(localctx, 7); + this.state = 940; + this.join_hint(); + this.state = 941; + this.use_keys(); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + use_keys() { + let localctx = new Use_keysContext(this, this._ctx, this.state); + this.enterRule(localctx, 114, n1qlParser.RULE_use_keys); + try { + this.enterOuterAlt(localctx, 1); + this.state = 945; + this.opt_primary(); + this.state = 946; + this.match(n1qlParser.KEYS); + this.state = 947; + this.expr(0); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + use_index() { + let localctx = new Use_indexContext(this, this._ctx, this.state); + this.enterRule(localctx, 116, n1qlParser.RULE_use_index); + try { + this.enterOuterAlt(localctx, 1); + this.state = 949; + this.match(n1qlParser.INDEX); + this.state = 950; + this.match(n1qlParser.LPAREN); + this.state = 951; + this.index_refs(0); + this.state = 952; + this.match(n1qlParser.RPAREN); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + join_hint() { + let localctx = new Join_hintContext(this, this._ctx, this.state); + this.enterRule(localctx, 118, n1qlParser.RULE_join_hint); + try { + this.state = 960; + this._errHandler.sync(this); + switch (this._input.LA(1)) { + case n1qlParser.HASH: + this.enterOuterAlt(localctx, 1); + this.state = 954; + this.match(n1qlParser.HASH); + this.state = 955; + this.match(n1qlParser.LPAREN); + this.state = 956; + this.use_hash_option(); + this.state = 957; + this.match(n1qlParser.RPAREN); + break; + case n1qlParser.NL: + this.enterOuterAlt(localctx, 2); + this.state = 959; + this.match(n1qlParser.NL); + break; + default: + throw new antlr4.error.NoViableAltException(this); + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + opt_primary() { + let localctx = new Opt_primaryContext(this, this._ctx, this.state); + this.enterRule(localctx, 120, n1qlParser.RULE_opt_primary); + try { + this.state = 964; + this._errHandler.sync(this); + switch (this._input.LA(1)) { + case n1qlParser.KEY: + case n1qlParser.KEYS: + this.enterOuterAlt(localctx, 1); + + break; + case n1qlParser.PRIMARY: + this.enterOuterAlt(localctx, 2); + this.state = 963; + this.match(n1qlParser.PRIMARY); + break; + default: + throw new antlr4.error.NoViableAltException(this); + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + index_refs(_p) { + if (_p === undefined) { + _p = 0; + } + const _parentctx = this._ctx; + const _parentState = this.state; + let localctx = new Index_refsContext(this, this._ctx, _parentState); + let _prevctx = localctx; + const _startState = 122; + this.enterRecursionRule(localctx, 122, n1qlParser.RULE_index_refs, _p); + try { + this.enterOuterAlt(localctx, 1); + this.state = 967; + this.index_ref(); + this._ctx.stop = this._input.LT(-1); + this.state = 974; + this._errHandler.sync(this); + var _alt = this._interp.adaptivePredict(this._input, 42, this._ctx); + while (_alt != 2 && _alt != antlr4.atn.ATN.INVALID_ALT_NUMBER) { + if (_alt === 1) { + if (this._parseListeners !== null) { + this.triggerExitRuleEvent(); + } + _prevctx = localctx; + localctx = new Index_refsContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_index_refs); + this.state = 969; + if (!this.precpred(this._ctx, 1)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 1)'); + } + this.state = 970; + this.match(n1qlParser.COMMA); + this.state = 971; + this.index_ref(); + } + this.state = 976; + this._errHandler.sync(this); + _alt = this._interp.adaptivePredict(this._input, 42, this._ctx); + } + } catch (error) { + if (error instanceof antlr4.error.RecognitionException) { + localctx.exception = error; + this._errHandler.reportError(this, error); + this._errHandler.recover(this, error); + } else { + throw error; + } + } finally { + this.unrollRecursionContexts(_parentctx); + } + return localctx; + } + + index_ref() { + let localctx = new Index_refContext(this, this._ctx, this.state); + this.enterRule(localctx, 124, n1qlParser.RULE_index_ref); + try { + this.enterOuterAlt(localctx, 1); + this.state = 977; + this.opt_index_name(); + this.state = 978; + this.opt_index_using(); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + use_hash_option() { + let localctx = new Use_hash_optionContext(this, this._ctx, this.state); + this.enterRule(localctx, 126, n1qlParser.RULE_use_hash_option); + var _la = 0; // Token type + try { + this.enterOuterAlt(localctx, 1); + this.state = 980; + _la = this._input.LA(1); + if (!(_la === n1qlParser.BUILD || _la === n1qlParser.PROBE)) { + this._errHandler.recoverInline(this); + } else { + this._errHandler.reportMatch(this); + this.consume(); + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + opt_use_del_upd() { + let localctx = new Opt_use_del_updContext(this, this._ctx, this.state); + this.enterRule(localctx, 128, n1qlParser.RULE_opt_use_del_upd); + try { + this.enterOuterAlt(localctx, 1); + this.state = 982; + this.opt_use(); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + opt_join_type() { + let localctx = new Opt_join_typeContext(this, this._ctx, this.state); + this.enterRule(localctx, 130, n1qlParser.RULE_opt_join_type); + try { + this.state = 988; + this._errHandler.sync(this); + switch (this._input.LA(1)) { + case n1qlParser.FLATTEN: + case n1qlParser.JOIN: + case n1qlParser.NEST: + case n1qlParser.UNNEST: + this.enterOuterAlt(localctx, 1); + + break; + case n1qlParser.INNER: + this.enterOuterAlt(localctx, 2); + this.state = 985; + this.match(n1qlParser.INNER); + break; + case n1qlParser.LEFT: + this.enterOuterAlt(localctx, 3); + this.state = 986; + this.match(n1qlParser.LEFT); + this.state = 987; + this.opt_outer(); + break; + default: + throw new antlr4.error.NoViableAltException(this); + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + opt_outer() { + let localctx = new Opt_outerContext(this, this._ctx, this.state); + this.enterRule(localctx, 132, n1qlParser.RULE_opt_outer); + try { + this.state = 992; + this._errHandler.sync(this); + switch (this._input.LA(1)) { + case n1qlParser.FLATTEN: + case n1qlParser.JOIN: + case n1qlParser.NEST: + case n1qlParser.UNNEST: + this.enterOuterAlt(localctx, 1); + + break; + case n1qlParser.OUTER: + this.enterOuterAlt(localctx, 2); + this.state = 991; + this.match(n1qlParser.OUTER); + break; + default: + throw new antlr4.error.NoViableAltException(this); + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + on_keys() { + let localctx = new On_keysContext(this, this._ctx, this.state); + this.enterRule(localctx, 134, n1qlParser.RULE_on_keys); + try { + this.enterOuterAlt(localctx, 1); + this.state = 994; + this.match(n1qlParser.ON); + this.state = 995; + this.opt_primary(); + this.state = 996; + this.match(n1qlParser.KEYS); + this.state = 997; + this.expr(0); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + on_key() { + let localctx = new On_keyContext(this, this._ctx, this.state); + this.enterRule(localctx, 136, n1qlParser.RULE_on_key); + try { + this.enterOuterAlt(localctx, 1); + this.state = 999; + this.match(n1qlParser.ON); + this.state = 1000; + this.opt_primary(); + this.state = 1001; + this.match(n1qlParser.KEY); + this.state = 1002; + this.expr(0); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + opt_let() { + let localctx = new Opt_letContext(this, this._ctx, this.state); + this.enterRule(localctx, 138, n1qlParser.RULE_opt_let); + try { + this.state = 1006; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 45, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 1005; + this.let_(); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + let_() { + let localctx = new Let_Context(this, this._ctx, this.state); + this.enterRule(localctx, 140, n1qlParser.RULE_let_); + try { + this.enterOuterAlt(localctx, 1); + this.state = 1008; + this.match(n1qlParser.LET_); + this.state = 1009; + this.bindings(0); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + bindings(_p) { + if (_p === undefined) { + _p = 0; + } + const _parentctx = this._ctx; + const _parentState = this.state; + let localctx = new BindingsContext(this, this._ctx, _parentState); + let _prevctx = localctx; + const _startState = 142; + this.enterRecursionRule(localctx, 142, n1qlParser.RULE_bindings, _p); + try { + this.enterOuterAlt(localctx, 1); + this.state = 1012; + this.binding(); + this._ctx.stop = this._input.LT(-1); + this.state = 1019; + this._errHandler.sync(this); + var _alt = this._interp.adaptivePredict(this._input, 46, this._ctx); + while (_alt != 2 && _alt != antlr4.atn.ATN.INVALID_ALT_NUMBER) { + if (_alt === 1) { + if (this._parseListeners !== null) { + this.triggerExitRuleEvent(); + } + _prevctx = localctx; + localctx = new BindingsContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_bindings); + this.state = 1014; + if (!this.precpred(this._ctx, 1)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 1)'); + } + this.state = 1015; + this.match(n1qlParser.COMMA); + this.state = 1016; + this.binding(); + } + this.state = 1021; + this._errHandler.sync(this); + _alt = this._interp.adaptivePredict(this._input, 46, this._ctx); + } + } catch (error) { + if (error instanceof antlr4.error.RecognitionException) { + localctx.exception = error; + this._errHandler.reportError(this, error); + this._errHandler.recover(this, error); + } else { + throw error; + } + } finally { + this.unrollRecursionContexts(_parentctx); + } + return localctx; + } + + binding() { + let localctx = new BindingContext(this, this._ctx, this.state); + this.enterRule(localctx, 144, n1qlParser.RULE_binding); + try { + this.enterOuterAlt(localctx, 1); + this.state = 1022; + this.alias(); + this.state = 1023; + this.match(n1qlParser.EQ); + this.state = 1024; + this.expr(0); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + opt_with() { + let localctx = new Opt_withContext(this, this._ctx, this.state); + this.enterRule(localctx, 146, n1qlParser.RULE_opt_with); + try { + this.state = 1029; + this._errHandler.sync(this); + switch (this._input.LA(1)) { + case n1qlParser.FROM: + case n1qlParser.SELECT: + this.enterOuterAlt(localctx, 1); + + break; + case n1qlParser.WITH: + this.enterOuterAlt(localctx, 2); + this.state = 1027; + this.match(n1qlParser.WITH); + this.state = 1028; + this.with_list(0); + break; + default: + throw new antlr4.error.NoViableAltException(this); + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + with_list(_p) { + if (_p === undefined) { + _p = 0; + } + const _parentctx = this._ctx; + const _parentState = this.state; + let localctx = new With_listContext(this, this._ctx, _parentState); + let _prevctx = localctx; + const _startState = 148; + this.enterRecursionRule(localctx, 148, n1qlParser.RULE_with_list, _p); + try { + this.enterOuterAlt(localctx, 1); + this.state = 1032; + this.with_term(); + this._ctx.stop = this._input.LT(-1); + this.state = 1039; + this._errHandler.sync(this); + var _alt = this._interp.adaptivePredict(this._input, 48, this._ctx); + while (_alt != 2 && _alt != antlr4.atn.ATN.INVALID_ALT_NUMBER) { + if (_alt === 1) { + if (this._parseListeners !== null) { + this.triggerExitRuleEvent(); + } + _prevctx = localctx; + localctx = new With_listContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_with_list); + this.state = 1034; + if (!this.precpred(this._ctx, 1)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 1)'); + } + this.state = 1035; + this.match(n1qlParser.COMMA); + this.state = 1036; + this.with_term(); + } + this.state = 1041; + this._errHandler.sync(this); + _alt = this._interp.adaptivePredict(this._input, 48, this._ctx); + } + } catch (error) { + if (error instanceof antlr4.error.RecognitionException) { + localctx.exception = error; + this._errHandler.reportError(this, error); + this._errHandler.recover(this, error); + } else { + throw error; + } + } finally { + this.unrollRecursionContexts(_parentctx); + } + return localctx; + } + + with_term() { + let localctx = new With_termContext(this, this._ctx, this.state); + this.enterRule(localctx, 150, n1qlParser.RULE_with_term); + try { + this.enterOuterAlt(localctx, 1); + this.state = 1042; + this.alias(); + this.state = 1043; + this.match(n1qlParser.AS); + this.state = 1044; + this.paren_expr(); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + opt_where() { + let localctx = new Opt_whereContext(this, this._ctx, this.state); + this.enterRule(localctx, 152, n1qlParser.RULE_opt_where); + try { + this.state = 1048; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 49, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 1047; + this.where(); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + where() { + let localctx = new WhereContext(this, this._ctx, this.state); + this.enterRule(localctx, 154, n1qlParser.RULE_where); + try { + this.enterOuterAlt(localctx, 1); + this.state = 1050; + this.match(n1qlParser.WHERE); + this.state = 1051; + this.expr(0); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + opt_group() { + let localctx = new Opt_groupContext(this, this._ctx, this.state); + this.enterRule(localctx, 156, n1qlParser.RULE_opt_group); + try { + this.state = 1055; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 50, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 1054; + this.group(); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + group() { + let localctx = new GroupContext(this, this._ctx, this.state); + this.enterRule(localctx, 158, n1qlParser.RULE_group); + try { + this.state = 1064; + this._errHandler.sync(this); + switch (this._input.LA(1)) { + case n1qlParser.GROUP: + this.enterOuterAlt(localctx, 1); + this.state = 1057; + this.match(n1qlParser.GROUP); + this.state = 1058; + this.match(n1qlParser.BY); + this.state = 1059; + this.group_terms(0); + this.state = 1060; + this.opt_letting(); + this.state = 1061; + this.opt_having(); + break; + case n1qlParser.LETTING: + this.enterOuterAlt(localctx, 2); + this.state = 1063; + this.letting(); + break; + default: + throw new antlr4.error.NoViableAltException(this); + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + group_terms(_p) { + if (_p === undefined) { + _p = 0; + } + const _parentctx = this._ctx; + const _parentState = this.state; + let localctx = new Group_termsContext(this, this._ctx, _parentState); + let _prevctx = localctx; + const _startState = 160; + this.enterRecursionRule(localctx, 160, n1qlParser.RULE_group_terms, _p); + try { + this.enterOuterAlt(localctx, 1); + this.state = 1067; + this.group_term(); + this._ctx.stop = this._input.LT(-1); + this.state = 1074; + this._errHandler.sync(this); + var _alt = this._interp.adaptivePredict(this._input, 52, this._ctx); + while (_alt != 2 && _alt != antlr4.atn.ATN.INVALID_ALT_NUMBER) { + if (_alt === 1) { + if (this._parseListeners !== null) { + this.triggerExitRuleEvent(); + } + _prevctx = localctx; + localctx = new Group_termsContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_group_terms); + this.state = 1069; + if (!this.precpred(this._ctx, 1)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 1)'); + } + this.state = 1070; + this.match(n1qlParser.COMMA); + this.state = 1071; + this.group_term(); + } + this.state = 1076; + this._errHandler.sync(this); + _alt = this._interp.adaptivePredict(this._input, 52, this._ctx); + } + } catch (error) { + if (error instanceof antlr4.error.RecognitionException) { + localctx.exception = error; + this._errHandler.reportError(this, error); + this._errHandler.recover(this, error); + } else { + throw error; + } + } finally { + this.unrollRecursionContexts(_parentctx); + } + return localctx; + } + + group_term() { + let localctx = new Group_termContext(this, this._ctx, this.state); + this.enterRule(localctx, 162, n1qlParser.RULE_group_term); + try { + this.enterOuterAlt(localctx, 1); + this.state = 1077; + this.expr(0); + this.state = 1078; + this.opt_as_alias(); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + opt_letting() { + let localctx = new Opt_lettingContext(this, this._ctx, this.state); + this.enterRule(localctx, 164, n1qlParser.RULE_opt_letting); + try { + this.state = 1082; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 53, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 1081; + this.letting(); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + letting() { + let localctx = new LettingContext(this, this._ctx, this.state); + this.enterRule(localctx, 166, n1qlParser.RULE_letting); + try { + this.enterOuterAlt(localctx, 1); + this.state = 1084; + this.match(n1qlParser.LETTING); + this.state = 1085; + this.bindings(0); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + opt_having() { + let localctx = new Opt_havingContext(this, this._ctx, this.state); + this.enterRule(localctx, 168, n1qlParser.RULE_opt_having); + try { + this.state = 1089; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 54, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 1088; + this.having(); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + having() { + let localctx = new HavingContext(this, this._ctx, this.state); + this.enterRule(localctx, 170, n1qlParser.RULE_having); + try { + this.enterOuterAlt(localctx, 1); + this.state = 1091; + this.match(n1qlParser.HAVING); + this.state = 1092; + this.expr(0); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + opt_order_by() { + let localctx = new Opt_order_byContext(this, this._ctx, this.state); + this.enterRule(localctx, 172, n1qlParser.RULE_opt_order_by); + try { + this.state = 1096; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 55, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 1095; + this.order_by(); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + order_by() { + let localctx = new Order_byContext(this, this._ctx, this.state); + this.enterRule(localctx, 174, n1qlParser.RULE_order_by); + try { + this.enterOuterAlt(localctx, 1); + this.state = 1098; + this.match(n1qlParser.ORDER); + this.state = 1099; + this.match(n1qlParser.BY); + this.state = 1100; + this.sort_terms(0); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + sort_terms(_p) { + if (_p === undefined) { + _p = 0; + } + const _parentctx = this._ctx; + const _parentState = this.state; + let localctx = new Sort_termsContext(this, this._ctx, _parentState); + let _prevctx = localctx; + const _startState = 176; + this.enterRecursionRule(localctx, 176, n1qlParser.RULE_sort_terms, _p); + try { + this.enterOuterAlt(localctx, 1); + this.state = 1103; + this.sort_term(); + this._ctx.stop = this._input.LT(-1); + this.state = 1110; + this._errHandler.sync(this); + var _alt = this._interp.adaptivePredict(this._input, 56, this._ctx); + while (_alt != 2 && _alt != antlr4.atn.ATN.INVALID_ALT_NUMBER) { + if (_alt === 1) { + if (this._parseListeners !== null) { + this.triggerExitRuleEvent(); + } + _prevctx = localctx; + localctx = new Sort_termsContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_sort_terms); + this.state = 1105; + if (!this.precpred(this._ctx, 1)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 1)'); + } + this.state = 1106; + this.match(n1qlParser.COMMA); + this.state = 1107; + this.sort_term(); + } + this.state = 1112; + this._errHandler.sync(this); + _alt = this._interp.adaptivePredict(this._input, 56, this._ctx); + } + } catch (error) { + if (error instanceof antlr4.error.RecognitionException) { + localctx.exception = error; + this._errHandler.reportError(this, error); + this._errHandler.recover(this, error); + } else { + throw error; + } + } finally { + this.unrollRecursionContexts(_parentctx); + } + return localctx; + } + + sort_term() { + let localctx = new Sort_termContext(this, this._ctx, this.state); + this.enterRule(localctx, 178, n1qlParser.RULE_sort_term); + try { + this.enterOuterAlt(localctx, 1); + this.state = 1113; + this.expr(0); + this.state = 1114; + this.opt_dir(); + this.state = 1115; + this.opt_order_nulls(); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + opt_dir() { + let localctx = new Opt_dirContext(this, this._ctx, this.state); + this.enterRule(localctx, 180, n1qlParser.RULE_opt_dir); + try { + this.state = 1119; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 57, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 1118; + this.dir(); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + dir() { + let localctx = new DirContext(this, this._ctx, this.state); + this.enterRule(localctx, 182, n1qlParser.RULE_dir); + var _la = 0; // Token type + try { + this.enterOuterAlt(localctx, 1); + this.state = 1121; + _la = this._input.LA(1); + if (!(_la === n1qlParser.ASC || _la === n1qlParser.DESC)) { + this._errHandler.recoverInline(this); + } else { + this._errHandler.reportMatch(this); + this.consume(); + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + opt_order_nulls() { + let localctx = new Opt_order_nullsContext(this, this._ctx, this.state); + this.enterRule(localctx, 184, n1qlParser.RULE_opt_order_nulls); + try { + this.state = 1127; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 58, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 1124; + this.nulls(); + this.state = 1125; + this.first_last(); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + first_last() { + let localctx = new First_lastContext(this, this._ctx, this.state); + this.enterRule(localctx, 186, n1qlParser.RULE_first_last); + var _la = 0; // Token type + try { + this.enterOuterAlt(localctx, 1); + this.state = 1129; + _la = this._input.LA(1); + if (!(_la === n1qlParser.FIRST || _la === n1qlParser.LAST)) { + this._errHandler.recoverInline(this); + } else { + this._errHandler.reportMatch(this); + this.consume(); + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + nulls() { + let localctx = new NullsContext(this, this._ctx, this.state); + this.enterRule(localctx, 188, n1qlParser.RULE_nulls); + try { + this.enterOuterAlt(localctx, 1); + this.state = 1131; + this.match(n1qlParser.NULLS); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + opt_limit() { + let localctx = new Opt_limitContext(this, this._ctx, this.state); + this.enterRule(localctx, 190, n1qlParser.RULE_opt_limit); + try { + this.state = 1135; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 59, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 1134; + this.limit(); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + limit() { + let localctx = new LimitContext(this, this._ctx, this.state); + this.enterRule(localctx, 192, n1qlParser.RULE_limit); + try { + this.enterOuterAlt(localctx, 1); + this.state = 1137; + this.match(n1qlParser.LIMIT); + this.state = 1138; + this.expr(0); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + opt_offset() { + let localctx = new Opt_offsetContext(this, this._ctx, this.state); + this.enterRule(localctx, 194, n1qlParser.RULE_opt_offset); + try { + this.state = 1142; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 60, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 1141; + this.offset(); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + offset() { + let localctx = new OffsetContext(this, this._ctx, this.state); + this.enterRule(localctx, 196, n1qlParser.RULE_offset); + try { + this.enterOuterAlt(localctx, 1); + this.state = 1144; + this.match(n1qlParser.OFFSET); + this.state = 1145; + this.expr(0); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + insert() { + let localctx = new InsertContext(this, this._ctx, this.state); + this.enterRule(localctx, 198, n1qlParser.RULE_insert); + try { + this.state = 1163; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 61, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 1147; + this.match(n1qlParser.INSERT); + this.state = 1148; + this.match(n1qlParser.INTO); + this.state = 1149; + this.keyspace_ref(); + this.state = 1150; + this.opt_values_header(); + this.state = 1151; + this.values_list(0); + this.state = 1152; + this.opt_returning(); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 1154; + this.match(n1qlParser.INSERT); + this.state = 1155; + this.match(n1qlParser.INTO); + this.state = 1156; + this.keyspace_ref(); + this.state = 1157; + this.match(n1qlParser.LPAREN); + this.state = 1158; + this.key_val_options_expr_header(); + this.state = 1159; + this.match(n1qlParser.RPAREN); + this.state = 1160; + this.fullselect(); + this.state = 1161; + this.opt_returning(); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + simple_keyspace_ref() { + let localctx = new Simple_keyspace_refContext(this, this._ctx, this.state); + this.enterRule(localctx, 200, n1qlParser.RULE_simple_keyspace_ref); + try { + this.state = 1178; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 62, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 1165; + this.keyspace_name(); + this.state = 1166; + this.opt_as_alias(); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 1168; + this.keyspace_path(); + this.state = 1169; + this.opt_as_alias(); + break; + + case 3: + this.enterOuterAlt(localctx, 3); + this.state = 1171; + this.bucket_name(); + this.state = 1172; + this.match(n1qlParser.DOT); + this.state = 1173; + this.scope_name(); + this.state = 1174; + this.match(n1qlParser.DOT); + this.state = 1175; + this.keyspace_name(); + this.state = 1176; + this.opt_as_alias(); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + keyspace_ref() { + let localctx = new Keyspace_refContext(this, this._ctx, this.state); + this.enterRule(localctx, 202, n1qlParser.RULE_keyspace_ref); + try { + this.state = 1184; + this._errHandler.sync(this); + switch (this._input.LA(1)) { + case n1qlParser.SYSTEM: + case n1qlParser.IDENT: + this.enterOuterAlt(localctx, 1); + this.state = 1180; + this.simple_keyspace_ref(); + break; + case n1qlParser.NAMED_PARAM: + case n1qlParser.POSITIONAL_PARAM: + case n1qlParser.NEXT_PARAM: + this.enterOuterAlt(localctx, 2); + this.state = 1181; + this.param_expr(); + this.state = 1182; + this.opt_as_alias(); + break; + default: + throw new antlr4.error.NoViableAltException(this); + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + opt_values_header() { + let localctx = new Opt_values_headerContext(this, this._ctx, this.state); + this.enterRule(localctx, 204, n1qlParser.RULE_opt_values_header); + try { + this.state = 1203; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 64, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 1187; + this.match(n1qlParser.LPAREN); + this.state = 1188; + this.opt_primary(); + this.state = 1189; + this.match(n1qlParser.KEY); + this.state = 1190; + this.match(n1qlParser.COMMA); + this.state = 1191; + this.match(n1qlParser.VALUE); + this.state = 1192; + this.match(n1qlParser.RPAREN); + break; + + case 3: + this.enterOuterAlt(localctx, 3); + this.state = 1194; + this.match(n1qlParser.LPAREN); + this.state = 1195; + this.opt_primary(); + this.state = 1196; + this.match(n1qlParser.KEY); + this.state = 1197; + this.match(n1qlParser.COMMA); + this.state = 1198; + this.match(n1qlParser.VALUE); + this.state = 1199; + this.match(n1qlParser.COMMA); + this.state = 1200; + this.match(n1qlParser.OPTIONS); + this.state = 1201; + this.match(n1qlParser.RPAREN); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + key() { + let localctx = new KeyContext(this, this._ctx, this.state); + this.enterRule(localctx, 206, n1qlParser.RULE_key); + try { + this.enterOuterAlt(localctx, 1); + this.state = 1205; + this.opt_primary(); + this.state = 1206; + this.match(n1qlParser.KEY); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + values_list(_p) { + if (_p === undefined) { + _p = 0; + } + const _parentctx = this._ctx; + const _parentState = this.state; + let localctx = new Values_listContext(this, this._ctx, _parentState); + let _prevctx = localctx; + const _startState = 208; + this.enterRecursionRule(localctx, 208, n1qlParser.RULE_values_list, _p); + try { + this.enterOuterAlt(localctx, 1); + this.state = 1209; + this.values(); + this._ctx.stop = this._input.LT(-1); + this.state = 1216; + this._errHandler.sync(this); + var _alt = this._interp.adaptivePredict(this._input, 65, this._ctx); + while (_alt != 2 && _alt != antlr4.atn.ATN.INVALID_ALT_NUMBER) { + if (_alt === 1) { + if (this._parseListeners !== null) { + this.triggerExitRuleEvent(); + } + _prevctx = localctx; + localctx = new Values_listContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_values_list); + this.state = 1211; + if (!this.precpred(this._ctx, 1)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 1)'); + } + this.state = 1212; + this.match(n1qlParser.COMMA); + this.state = 1213; + this.next_values(); + } + this.state = 1218; + this._errHandler.sync(this); + _alt = this._interp.adaptivePredict(this._input, 65, this._ctx); + } + } catch (error) { + if (error instanceof antlr4.error.RecognitionException) { + localctx.exception = error; + this._errHandler.reportError(this, error); + this._errHandler.recover(this, error); + } else { + throw error; + } + } finally { + this.unrollRecursionContexts(_parentctx); + } + return localctx; + } + + values() { + let localctx = new ValuesContext(this, this._ctx, this.state); + this.enterRule(localctx, 210, n1qlParser.RULE_values); + try { + this.state = 1223; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 66, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 1219; + this.match(n1qlParser.VALUES); + this.state = 1220; + this.key_val_expr(); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 1221; + this.match(n1qlParser.VALUES); + this.state = 1222; + this.key_val_options_expr(); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + next_values() { + let localctx = new Next_valuesContext(this, this._ctx, this.state); + this.enterRule(localctx, 212, n1qlParser.RULE_next_values); + try { + this.state = 1228; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 67, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 1225; + this.values(); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 1226; + this.key_val_expr(); + break; + + case 3: + this.enterOuterAlt(localctx, 3); + this.state = 1227; + this.key_val_options_expr(); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + key_val_expr() { + let localctx = new Key_val_exprContext(this, this._ctx, this.state); + this.enterRule(localctx, 214, n1qlParser.RULE_key_val_expr); + try { + this.enterOuterAlt(localctx, 1); + this.state = 1230; + this.match(n1qlParser.LPAREN); + this.state = 1231; + this.expr(0); + this.state = 1232; + this.match(n1qlParser.COMMA); + this.state = 1233; + this.expr(0); + this.state = 1234; + this.match(n1qlParser.RPAREN); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + key_val_options_expr() { + let localctx = new Key_val_options_exprContext(this, this._ctx, this.state); + this.enterRule(localctx, 216, n1qlParser.RULE_key_val_options_expr); + try { + this.enterOuterAlt(localctx, 1); + this.state = 1236; + this.match(n1qlParser.LPAREN); + this.state = 1237; + this.expr(0); + this.state = 1238; + this.match(n1qlParser.COMMA); + this.state = 1239; + this.expr(0); + this.state = 1240; + this.match(n1qlParser.COMMA); + this.state = 1241; + this.expr(0); + this.state = 1242; + this.match(n1qlParser.RPAREN); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + opt_returning() { + let localctx = new Opt_returningContext(this, this._ctx, this.state); + this.enterRule(localctx, 218, n1qlParser.RULE_opt_returning); + try { + this.state = 1246; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 68, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 1245; + this.returning(); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + returning() { + let localctx = new ReturningContext(this, this._ctx, this.state); + this.enterRule(localctx, 220, n1qlParser.RULE_returning); + try { + this.enterOuterAlt(localctx, 1); + this.state = 1248; + this.match(n1qlParser.RETURNING); + this.state = 1249; + this.returns_(); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + returns_() { + let localctx = new Returns_Context(this, this._ctx, this.state); + this.enterRule(localctx, 222, n1qlParser.RULE_returns_); + try { + this.state = 1255; + this._errHandler.sync(this); + switch (this._input.LA(1)) { + case n1qlParser.STR: + case n1qlParser.INT: + case n1qlParser.NUM: + case n1qlParser.MINUS: + case n1qlParser.STAR: + case n1qlParser.LPAREN: + case n1qlParser.LBRACE: + case n1qlParser.LBRACKET: + case n1qlParser.ANY: + case n1qlParser.ARRAY: + case n1qlParser.CASE: + case n1qlParser.CORRELATED: + case n1qlParser.COVER: + case n1qlParser.EVERY: + case n1qlParser.EXISTS: + case n1qlParser.FALSE: + case n1qlParser.FIRST: + case n1qlParser.MISSING: + case n1qlParser.NOT: + case n1qlParser.NTH_VALUE: + case n1qlParser.NULL: + case n1qlParser.OBJECT: + case n1qlParser.REPLACE: + case n1qlParser.SELF: + case n1qlParser.SOME: + case n1qlParser.SYSTEM: + case n1qlParser.TRUE: + case n1qlParser.IDENT_ICASE: + case n1qlParser.IDENT: + case n1qlParser.NAMED_PARAM: + case n1qlParser.POSITIONAL_PARAM: + case n1qlParser.NEXT_PARAM: + this.enterOuterAlt(localctx, 1); + this.state = 1251; + this.projects(0); + break; + case n1qlParser.ELEMENT: + case n1qlParser.RAW: + case n1qlParser.VALUE: + this.enterOuterAlt(localctx, 2); + this.state = 1252; + this.raw(); + this.state = 1253; + this.expr(0); + break; + default: + throw new antlr4.error.NoViableAltException(this); + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + key_expr_header() { + let localctx = new Key_expr_headerContext(this, this._ctx, this.state); + this.enterRule(localctx, 224, n1qlParser.RULE_key_expr_header); + try { + this.enterOuterAlt(localctx, 1); + this.state = 1257; + this.key(); + this.state = 1258; + this.expr(0); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + value_expr_header() { + let localctx = new Value_expr_headerContext(this, this._ctx, this.state); + this.enterRule(localctx, 226, n1qlParser.RULE_value_expr_header); + try { + this.enterOuterAlt(localctx, 1); + this.state = 1260; + this.match(n1qlParser.VALUE); + this.state = 1261; + this.expr(0); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + options_expr_header() { + let localctx = new Options_expr_headerContext(this, this._ctx, this.state); + this.enterRule(localctx, 228, n1qlParser.RULE_options_expr_header); + try { + this.enterOuterAlt(localctx, 1); + this.state = 1263; + this.match(n1qlParser.OPTIONS); + this.state = 1264; + this.expr(0); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + key_val_options_expr_header() { + let localctx = new Key_val_options_expr_headerContext(this, this._ctx, this.state); + this.enterRule(localctx, 230, n1qlParser.RULE_key_val_options_expr_header); + try { + this.state = 1281; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 70, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 1266; + this.key_expr_header(); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 1267; + this.key_expr_header(); + this.state = 1268; + this.match(n1qlParser.COMMA); + this.state = 1269; + this.value_expr_header(); + break; + + case 3: + this.enterOuterAlt(localctx, 3); + this.state = 1271; + this.key_expr_header(); + this.state = 1272; + this.match(n1qlParser.COMMA); + this.state = 1273; + this.value_expr_header(); + this.state = 1274; + this.match(n1qlParser.COMMA); + this.state = 1275; + this.options_expr_header(); + break; + + case 4: + this.enterOuterAlt(localctx, 4); + this.state = 1277; + this.key_expr_header(); + this.state = 1278; + this.match(n1qlParser.COMMA); + this.state = 1279; + this.options_expr_header(); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + upsert() { + let localctx = new UpsertContext(this, this._ctx, this.state); + this.enterRule(localctx, 232, n1qlParser.RULE_upsert); + try { + this.state = 1299; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 71, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 1283; + this.match(n1qlParser.UPSERT); + this.state = 1284; + this.match(n1qlParser.INTO); + this.state = 1285; + this.keyspace_ref(); + this.state = 1286; + this.opt_values_header(); + this.state = 1287; + this.values_list(0); + this.state = 1288; + this.opt_returning(); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 1290; + this.match(n1qlParser.UPSERT); + this.state = 1291; + this.match(n1qlParser.INTO); + this.state = 1292; + this.keyspace_ref(); + this.state = 1293; + this.match(n1qlParser.LPAREN); + this.state = 1294; + this.key_val_options_expr_header(); + this.state = 1295; + this.match(n1qlParser.RPAREN); + this.state = 1296; + this.fullselect(); + this.state = 1297; + this.opt_returning(); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + delete_() { + let localctx = new Delete_Context(this, this._ctx, this.state); + this.enterRule(localctx, 234, n1qlParser.RULE_delete_); + try { + this.enterOuterAlt(localctx, 1); + this.state = 1301; + this.match(n1qlParser.DELETE_); + this.state = 1302; + this.match(n1qlParser.FROM); + this.state = 1303; + this.keyspace_ref(); + this.state = 1304; + this.opt_use_del_upd(); + this.state = 1305; + this.opt_where(); + this.state = 1306; + this.opt_limit(); + this.state = 1307; + this.opt_returning(); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + update() { + let localctx = new UpdateContext(this, this._ctx, this.state); + this.enterRule(localctx, 236, n1qlParser.RULE_update); + try { + this.state = 1334; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 72, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 1309; + this.match(n1qlParser.UPDATE); + this.state = 1310; + this.keyspace_ref(); + this.state = 1311; + this.opt_use_del_upd(); + this.state = 1312; + this.set(); + this.state = 1313; + this.unset(); + this.state = 1314; + this.opt_where(); + this.state = 1315; + this.opt_limit(); + this.state = 1316; + this.opt_returning(); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 1318; + this.match(n1qlParser.UPDATE); + this.state = 1319; + this.keyspace_ref(); + this.state = 1320; + this.opt_use_del_upd(); + this.state = 1321; + this.set(); + this.state = 1322; + this.opt_where(); + this.state = 1323; + this.opt_limit(); + this.state = 1324; + this.opt_returning(); + break; + + case 3: + this.enterOuterAlt(localctx, 3); + this.state = 1326; + this.match(n1qlParser.UPDATE); + this.state = 1327; + this.keyspace_ref(); + this.state = 1328; + this.opt_use_del_upd(); + this.state = 1329; + this.unset(); + this.state = 1330; + this.opt_where(); + this.state = 1331; + this.opt_limit(); + this.state = 1332; + this.opt_returning(); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + set() { + let localctx = new SetContext(this, this._ctx, this.state); + this.enterRule(localctx, 238, n1qlParser.RULE_set); + try { + this.enterOuterAlt(localctx, 1); + this.state = 1336; + this.match(n1qlParser.SET); + this.state = 1337; + this.set_terms(0); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + set_terms(_p) { + if (_p === undefined) { + _p = 0; + } + const _parentctx = this._ctx; + const _parentState = this.state; + let localctx = new Set_termsContext(this, this._ctx, _parentState); + let _prevctx = localctx; + const _startState = 240; + this.enterRecursionRule(localctx, 240, n1qlParser.RULE_set_terms, _p); + try { + this.enterOuterAlt(localctx, 1); + this.state = 1340; + this.set_term(); + this._ctx.stop = this._input.LT(-1); + this.state = 1347; + this._errHandler.sync(this); + var _alt = this._interp.adaptivePredict(this._input, 73, this._ctx); + while (_alt != 2 && _alt != antlr4.atn.ATN.INVALID_ALT_NUMBER) { + if (_alt === 1) { + if (this._parseListeners !== null) { + this.triggerExitRuleEvent(); + } + _prevctx = localctx; + localctx = new Set_termsContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_set_terms); + this.state = 1342; + if (!this.precpred(this._ctx, 1)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 1)'); + } + this.state = 1343; + this.match(n1qlParser.COMMA); + this.state = 1344; + this.set_term(); + } + this.state = 1349; + this._errHandler.sync(this); + _alt = this._interp.adaptivePredict(this._input, 73, this._ctx); + } + } catch (error) { + if (error instanceof antlr4.error.RecognitionException) { + localctx.exception = error; + this._errHandler.reportError(this, error); + this._errHandler.recover(this, error); + } else { + throw error; + } + } finally { + this.unrollRecursionContexts(_parentctx); + } + return localctx; + } + + set_term() { + let localctx = new Set_termContext(this, this._ctx, this.state); + this.enterRule(localctx, 242, n1qlParser.RULE_set_term); + try { + this.state = 1361; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 74, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 1350; + this.path(0); + this.state = 1351; + this.match(n1qlParser.EQ); + this.state = 1352; + this.expr(0); + this.state = 1353; + this.opt_update_for(); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 1355; + this.function_meta_expr(); + this.state = 1356; + this.match(n1qlParser.DOT); + this.state = 1357; + this.path(0); + this.state = 1358; + this.match(n1qlParser.EQ); + this.state = 1359; + this.expr(0); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + function_meta_expr() { + let localctx = new Function_meta_exprContext(this, this._ctx, this.state); + this.enterRule(localctx, 244, n1qlParser.RULE_function_meta_expr); + try { + this.enterOuterAlt(localctx, 1); + this.state = 1363; + this.function_name(); + this.state = 1364; + this.match(n1qlParser.LPAREN); + this.state = 1365; + this.opt_exprs(); + this.state = 1366; + this.match(n1qlParser.RPAREN); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + opt_update_for() { + let localctx = new Opt_update_forContext(this, this._ctx, this.state); + this.enterRule(localctx, 246, n1qlParser.RULE_opt_update_for); + try { + this.state = 1370; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 75, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 1369; + this.update_for(); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + update_for() { + let localctx = new Update_forContext(this, this._ctx, this.state); + this.enterRule(localctx, 248, n1qlParser.RULE_update_for); + try { + this.enterOuterAlt(localctx, 1); + this.state = 1372; + this.update_dimensions(0); + this.state = 1373; + this.opt_when(); + this.state = 1374; + this.match(n1qlParser.END); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + update_dimensions(_p) { + if (_p === undefined) { + _p = 0; + } + const _parentctx = this._ctx; + const _parentState = this.state; + let localctx = new Update_dimensionsContext(this, this._ctx, _parentState); + let _prevctx = localctx; + const _startState = 250; + this.enterRecursionRule(localctx, 250, n1qlParser.RULE_update_dimensions, _p); + try { + this.enterOuterAlt(localctx, 1); + this.state = 1377; + this.match(n1qlParser.FOR); + this.state = 1378; + this.update_dimension(0); + this._ctx.stop = this._input.LT(-1); + this.state = 1385; + this._errHandler.sync(this); + var _alt = this._interp.adaptivePredict(this._input, 76, this._ctx); + while (_alt != 2 && _alt != antlr4.atn.ATN.INVALID_ALT_NUMBER) { + if (_alt === 1) { + if (this._parseListeners !== null) { + this.triggerExitRuleEvent(); + } + _prevctx = localctx; + localctx = new Update_dimensionsContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_update_dimensions); + this.state = 1380; + if (!this.precpred(this._ctx, 1)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 1)'); + } + this.state = 1381; + this.match(n1qlParser.FOR); + this.state = 1382; + this.update_dimension(0); + } + this.state = 1387; + this._errHandler.sync(this); + _alt = this._interp.adaptivePredict(this._input, 76, this._ctx); + } + } catch (error) { + if (error instanceof antlr4.error.RecognitionException) { + localctx.exception = error; + this._errHandler.reportError(this, error); + this._errHandler.recover(this, error); + } else { + throw error; + } + } finally { + this.unrollRecursionContexts(_parentctx); + } + return localctx; + } + + update_dimension(_p) { + if (_p === undefined) { + _p = 0; + } + const _parentctx = this._ctx; + const _parentState = this.state; + let localctx = new Update_dimensionContext(this, this._ctx, _parentState); + let _prevctx = localctx; + const _startState = 252; + this.enterRecursionRule(localctx, 252, n1qlParser.RULE_update_dimension, _p); + try { + this.enterOuterAlt(localctx, 1); + this.state = 1389; + this.update_binding(); + this._ctx.stop = this._input.LT(-1); + this.state = 1396; + this._errHandler.sync(this); + var _alt = this._interp.adaptivePredict(this._input, 77, this._ctx); + while (_alt != 2 && _alt != antlr4.atn.ATN.INVALID_ALT_NUMBER) { + if (_alt === 1) { + if (this._parseListeners !== null) { + this.triggerExitRuleEvent(); + } + _prevctx = localctx; + localctx = new Update_dimensionContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_update_dimension); + this.state = 1391; + if (!this.precpred(this._ctx, 1)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 1)'); + } + this.state = 1392; + this.match(n1qlParser.COMMA); + this.state = 1393; + this.update_binding(); + } + this.state = 1398; + this._errHandler.sync(this); + _alt = this._interp.adaptivePredict(this._input, 77, this._ctx); + } + } catch (error) { + if (error instanceof antlr4.error.RecognitionException) { + localctx.exception = error; + this._errHandler.reportError(this, error); + this._errHandler.recover(this, error); + } else { + throw error; + } + } finally { + this.unrollRecursionContexts(_parentctx); + } + return localctx; + } + + update_binding() { + let localctx = new Update_bindingContext(this, this._ctx, this.state); + this.enterRule(localctx, 254, n1qlParser.RULE_update_binding); + try { + this.state = 1419; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 78, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 1399; + this.variable(); + this.state = 1400; + this.match(n1qlParser.IN); + this.state = 1401; + this.expr(0); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 1403; + this.variable(); + this.state = 1404; + this.match(n1qlParser.WITHIN); + this.state = 1405; + this.expr(0); + break; + + case 3: + this.enterOuterAlt(localctx, 3); + this.state = 1407; + this.variable(); + this.state = 1408; + this.match(n1qlParser.COLON); + this.state = 1409; + this.variable(); + this.state = 1410; + this.match(n1qlParser.IN); + this.state = 1411; + this.expr(0); + break; + + case 4: + this.enterOuterAlt(localctx, 4); + this.state = 1413; + this.variable(); + this.state = 1414; + this.match(n1qlParser.COLON); + this.state = 1415; + this.variable(); + this.state = 1416; + this.match(n1qlParser.WITHIN); + this.state = 1417; + this.expr(0); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + variable() { + let localctx = new VariableContext(this, this._ctx, this.state); + this.enterRule(localctx, 256, n1qlParser.RULE_variable); + try { + this.enterOuterAlt(localctx, 1); + this.state = 1421; + this.match(n1qlParser.IDENT); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + opt_when() { + let localctx = new Opt_whenContext(this, this._ctx, this.state); + this.enterRule(localctx, 258, n1qlParser.RULE_opt_when); + try { + this.state = 1426; + this._errHandler.sync(this); + switch (this._input.LA(1)) { + case n1qlParser.END: + this.enterOuterAlt(localctx, 1); + + break; + case n1qlParser.WHEN: + this.enterOuterAlt(localctx, 2); + this.state = 1424; + this.match(n1qlParser.WHEN); + this.state = 1425; + this.expr(0); + break; + default: + throw new antlr4.error.NoViableAltException(this); + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + unset() { + let localctx = new UnsetContext(this, this._ctx, this.state); + this.enterRule(localctx, 260, n1qlParser.RULE_unset); + try { + this.enterOuterAlt(localctx, 1); + this.state = 1428; + this.match(n1qlParser.UNSET); + this.state = 1429; + this.unset_terms(0); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + unset_terms(_p) { + if (_p === undefined) { + _p = 0; + } + const _parentctx = this._ctx; + const _parentState = this.state; + let localctx = new Unset_termsContext(this, this._ctx, _parentState); + let _prevctx = localctx; + const _startState = 262; + this.enterRecursionRule(localctx, 262, n1qlParser.RULE_unset_terms, _p); + try { + this.enterOuterAlt(localctx, 1); + this.state = 1432; + this.unset_term(); + this._ctx.stop = this._input.LT(-1); + this.state = 1439; + this._errHandler.sync(this); + var _alt = this._interp.adaptivePredict(this._input, 80, this._ctx); + while (_alt != 2 && _alt != antlr4.atn.ATN.INVALID_ALT_NUMBER) { + if (_alt === 1) { + if (this._parseListeners !== null) { + this.triggerExitRuleEvent(); + } + _prevctx = localctx; + localctx = new Unset_termsContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_unset_terms); + this.state = 1434; + if (!this.precpred(this._ctx, 1)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 1)'); + } + this.state = 1435; + this.match(n1qlParser.COMMA); + this.state = 1436; + this.unset_term(); + } + this.state = 1441; + this._errHandler.sync(this); + _alt = this._interp.adaptivePredict(this._input, 80, this._ctx); + } + } catch (error) { + if (error instanceof antlr4.error.RecognitionException) { + localctx.exception = error; + this._errHandler.reportError(this, error); + this._errHandler.recover(this, error); + } else { + throw error; + } + } finally { + this.unrollRecursionContexts(_parentctx); + } + return localctx; + } + + unset_term() { + let localctx = new Unset_termContext(this, this._ctx, this.state); + this.enterRule(localctx, 264, n1qlParser.RULE_unset_term); + try { + this.enterOuterAlt(localctx, 1); + this.state = 1442; + this.path(0); + this.state = 1443; + this.opt_update_for(); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + merge() { + let localctx = new MergeContext(this, this._ctx, this.state); + this.enterRule(localctx, 266, n1qlParser.RULE_merge); + try { + this.enterOuterAlt(localctx, 1); + this.state = 1445; + this.match(n1qlParser.MERGE); + this.state = 1446; + this.match(n1qlParser.INTO); + this.state = 1447; + this.simple_keyspace_ref(); + this.state = 1448; + this.opt_use_merge(); + this.state = 1449; + this.match(n1qlParser.USING); + this.state = 1450; + this.simple_from_term(); + this.state = 1451; + this.match(n1qlParser.ON); + this.state = 1452; + this.opt_key(); + this.state = 1453; + this.expr(0); + this.state = 1454; + this.merge_actions(); + this.state = 1455; + this.opt_limit(); + this.state = 1456; + this.opt_returning(); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + opt_use_merge() { + let localctx = new Opt_use_mergeContext(this, this._ctx, this.state); + this.enterRule(localctx, 268, n1qlParser.RULE_opt_use_merge); + try { + this.enterOuterAlt(localctx, 1); + this.state = 1458; + this.opt_use(); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + opt_key() { + let localctx = new Opt_keyContext(this, this._ctx, this.state); + this.enterRule(localctx, 270, n1qlParser.RULE_opt_key); + try { + this.state = 1462; + this._errHandler.sync(this); + switch (this._input.LA(1)) { + case n1qlParser.STR: + case n1qlParser.INT: + case n1qlParser.NUM: + case n1qlParser.MINUS: + case n1qlParser.LPAREN: + case n1qlParser.LBRACE: + case n1qlParser.LBRACKET: + case n1qlParser.ANY: + case n1qlParser.ARRAY: + case n1qlParser.CASE: + case n1qlParser.CORRELATED: + case n1qlParser.COVER: + case n1qlParser.EVERY: + case n1qlParser.EXISTS: + case n1qlParser.FALSE: + case n1qlParser.FIRST: + case n1qlParser.MISSING: + case n1qlParser.NOT: + case n1qlParser.NTH_VALUE: + case n1qlParser.NULL: + case n1qlParser.OBJECT: + case n1qlParser.REPLACE: + case n1qlParser.SELF: + case n1qlParser.SOME: + case n1qlParser.SYSTEM: + case n1qlParser.TRUE: + case n1qlParser.IDENT_ICASE: + case n1qlParser.IDENT: + case n1qlParser.NAMED_PARAM: + case n1qlParser.POSITIONAL_PARAM: + case n1qlParser.NEXT_PARAM: + this.enterOuterAlt(localctx, 1); + + break; + case n1qlParser.KEY: + case n1qlParser.PRIMARY: + this.enterOuterAlt(localctx, 2); + this.state = 1461; + this.key(); + break; + default: + throw new antlr4.error.NoViableAltException(this); + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + merge_actions() { + let localctx = new Merge_actionsContext(this, this._ctx, this.state); + this.enterRule(localctx, 272, n1qlParser.RULE_merge_actions); + try { + this.state = 1485; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 82, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 1465; + this.match(n1qlParser.WHEN); + this.state = 1466; + this.match(n1qlParser.MATCHED); + this.state = 1467; + this.match(n1qlParser.THEN); + this.state = 1468; + this.match(n1qlParser.UPDATE); + this.state = 1469; + this.merge_update(); + this.state = 1470; + this.opt_merge_delete_insert(); + break; + + case 3: + this.enterOuterAlt(localctx, 3); + this.state = 1472; + this.match(n1qlParser.WHEN); + this.state = 1473; + this.match(n1qlParser.MATCHED); + this.state = 1474; + this.match(n1qlParser.THEN); + this.state = 1475; + this.match(n1qlParser.DELETE_); + this.state = 1476; + this.merge_delete(); + this.state = 1477; + this.opt_merge_insert(); + break; + + case 4: + this.enterOuterAlt(localctx, 4); + this.state = 1479; + this.match(n1qlParser.WHEN); + this.state = 1480; + this.match(n1qlParser.NOT); + this.state = 1481; + this.match(n1qlParser.MATCHED); + this.state = 1482; + this.match(n1qlParser.THEN); + this.state = 1483; + this.match(n1qlParser.INSERT); + this.state = 1484; + this.merge_insert(); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + opt_merge_delete_insert() { + let localctx = new Opt_merge_delete_insertContext(this, this._ctx, this.state); + this.enterRule(localctx, 274, n1qlParser.RULE_opt_merge_delete_insert); + try { + this.state = 1501; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 83, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 1488; + this.match(n1qlParser.WHEN); + this.state = 1489; + this.match(n1qlParser.MATCHED); + this.state = 1490; + this.match(n1qlParser.THEN); + this.state = 1491; + this.match(n1qlParser.DELETE_); + this.state = 1492; + this.merge_delete(); + this.state = 1493; + this.opt_merge_insert(); + break; + + case 3: + this.enterOuterAlt(localctx, 3); + this.state = 1495; + this.match(n1qlParser.WHEN); + this.state = 1496; + this.match(n1qlParser.NOT); + this.state = 1497; + this.match(n1qlParser.MATCHED); + this.state = 1498; + this.match(n1qlParser.THEN); + this.state = 1499; + this.match(n1qlParser.INSERT); + this.state = 1500; + this.merge_insert(); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + opt_merge_insert() { + let localctx = new Opt_merge_insertContext(this, this._ctx, this.state); + this.enterRule(localctx, 276, n1qlParser.RULE_opt_merge_insert); + try { + this.state = 1510; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 84, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 1504; + this.match(n1qlParser.WHEN); + this.state = 1505; + this.match(n1qlParser.NOT); + this.state = 1506; + this.match(n1qlParser.MATCHED); + this.state = 1507; + this.match(n1qlParser.THEN); + this.state = 1508; + this.match(n1qlParser.INSERT); + this.state = 1509; + this.merge_insert(); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + merge_update() { + let localctx = new Merge_updateContext(this, this._ctx, this.state); + this.enterRule(localctx, 278, n1qlParser.RULE_merge_update); + try { + this.state = 1522; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 85, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 1512; + this.set(); + this.state = 1513; + this.opt_where(); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 1515; + this.set(); + this.state = 1516; + this.unset(); + this.state = 1517; + this.opt_where(); + break; + + case 3: + this.enterOuterAlt(localctx, 3); + this.state = 1519; + this.unset(); + this.state = 1520; + this.opt_where(); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + merge_delete() { + let localctx = new Merge_deleteContext(this, this._ctx, this.state); + this.enterRule(localctx, 280, n1qlParser.RULE_merge_delete); + try { + this.enterOuterAlt(localctx, 1); + this.state = 1524; + this.opt_where(); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + merge_insert() { + let localctx = new Merge_insertContext(this, this._ctx, this.state); + this.enterRule(localctx, 282, n1qlParser.RULE_merge_insert); + try { + this.state = 1540; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 86, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 1526; + this.expr(0); + this.state = 1527; + this.opt_where(); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 1529; + this.key_val_expr(); + this.state = 1530; + this.opt_where(); + break; + + case 3: + this.enterOuterAlt(localctx, 3); + this.state = 1532; + this.key_val_options_expr(); + this.state = 1533; + this.opt_where(); + break; + + case 4: + this.enterOuterAlt(localctx, 4); + this.state = 1535; + this.match(n1qlParser.LPAREN); + this.state = 1536; + this.key_val_options_expr_header(); + this.state = 1537; + this.match(n1qlParser.RPAREN); + this.state = 1538; + this.opt_where(); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + grant_role() { + let localctx = new Grant_roleContext(this, this._ctx, this.state); + this.enterRule(localctx, 284, n1qlParser.RULE_grant_role); + try { + this.state = 1554; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 87, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 1542; + this.match(n1qlParser.GRANT); + this.state = 1543; + this.role_list(0); + this.state = 1544; + this.match(n1qlParser.TO); + this.state = 1545; + this.user_list(0); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 1547; + this.match(n1qlParser.GRANT); + this.state = 1548; + this.role_list(0); + this.state = 1549; + this.match(n1qlParser.ON); + this.state = 1550; + this.keyspace_scope_list(0); + this.state = 1551; + this.match(n1qlParser.TO); + this.state = 1552; + this.user_list(0); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + role_list(_p) { + if (_p === undefined) { + _p = 0; + } + const _parentctx = this._ctx; + const _parentState = this.state; + let localctx = new Role_listContext(this, this._ctx, _parentState); + let _prevctx = localctx; + const _startState = 286; + this.enterRecursionRule(localctx, 286, n1qlParser.RULE_role_list, _p); + try { + this.enterOuterAlt(localctx, 1); + this.state = 1557; + this.role_name(); + this._ctx.stop = this._input.LT(-1); + this.state = 1564; + this._errHandler.sync(this); + var _alt = this._interp.adaptivePredict(this._input, 88, this._ctx); + while (_alt != 2 && _alt != antlr4.atn.ATN.INVALID_ALT_NUMBER) { + if (_alt === 1) { + if (this._parseListeners !== null) { + this.triggerExitRuleEvent(); + } + _prevctx = localctx; + localctx = new Role_listContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_role_list); + this.state = 1559; + if (!this.precpred(this._ctx, 1)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 1)'); + } + this.state = 1560; + this.match(n1qlParser.COMMA); + this.state = 1561; + this.role_name(); + } + this.state = 1566; + this._errHandler.sync(this); + _alt = this._interp.adaptivePredict(this._input, 88, this._ctx); + } + } catch (error) { + if (error instanceof antlr4.error.RecognitionException) { + localctx.exception = error; + this._errHandler.reportError(this, error); + this._errHandler.recover(this, error); + } else { + throw error; + } + } finally { + this.unrollRecursionContexts(_parentctx); + } + return localctx; + } + + role_name() { + let localctx = new Role_nameContext(this, this._ctx, this.state); + this.enterRule(localctx, 288, n1qlParser.RULE_role_name); + var _la = 0; // Token type + try { + this.enterOuterAlt(localctx, 1); + this.state = 1567; + _la = this._input.LA(1); + if ( + !( + _la === n1qlParser.DELETE_ || + _la === n1qlParser.INSERT || + _la === n1qlParser.SELECT || + _la === n1qlParser.UPDATE || + _la === n1qlParser.IDENT + ) + ) { + this._errHandler.recoverInline(this); + } else { + this._errHandler.reportMatch(this); + this.consume(); + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + keyspace_scope_list(_p) { + if (_p === undefined) { + _p = 0; + } + const _parentctx = this._ctx; + const _parentState = this.state; + let localctx = new Keyspace_scope_listContext(this, this._ctx, _parentState); + let _prevctx = localctx; + const _startState = 290; + this.enterRecursionRule(localctx, 290, n1qlParser.RULE_keyspace_scope_list, _p); + try { + this.enterOuterAlt(localctx, 1); + this.state = 1570; + this.keyspace_scope(); + this._ctx.stop = this._input.LT(-1); + this.state = 1577; + this._errHandler.sync(this); + var _alt = this._interp.adaptivePredict(this._input, 89, this._ctx); + while (_alt != 2 && _alt != antlr4.atn.ATN.INVALID_ALT_NUMBER) { + if (_alt === 1) { + if (this._parseListeners !== null) { + this.triggerExitRuleEvent(); + } + _prevctx = localctx; + localctx = new Keyspace_scope_listContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_keyspace_scope_list); + this.state = 1572; + if (!this.precpred(this._ctx, 1)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 1)'); + } + this.state = 1573; + this.match(n1qlParser.COMMA); + this.state = 1574; + this.keyspace_scope(); + } + this.state = 1579; + this._errHandler.sync(this); + _alt = this._interp.adaptivePredict(this._input, 89, this._ctx); + } + } catch (error) { + if (error instanceof antlr4.error.RecognitionException) { + localctx.exception = error; + this._errHandler.reportError(this, error); + this._errHandler.recover(this, error); + } else { + throw error; + } + } finally { + this.unrollRecursionContexts(_parentctx); + } + return localctx; + } + + keyspace_scope() { + let localctx = new Keyspace_scopeContext(this, this._ctx, this.state); + this.enterRule(localctx, 292, n1qlParser.RULE_keyspace_scope); + try { + this.state = 1606; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 90, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 1580; + this.keyspace_name(); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 1581; + this.namespace_name(); + this.state = 1582; + this.keyspace_name(); + break; + + case 3: + this.enterOuterAlt(localctx, 3); + this.state = 1584; + this.namespace_name(); + this.state = 1585; + this.bucket_name(); + this.state = 1586; + this.match(n1qlParser.DOT); + this.state = 1587; + this.scope_name(); + this.state = 1588; + this.match(n1qlParser.DOT); + this.state = 1589; + this.keyspace_name(); + break; + + case 4: + this.enterOuterAlt(localctx, 4); + this.state = 1591; + this.bucket_name(); + this.state = 1592; + this.match(n1qlParser.DOT); + this.state = 1593; + this.scope_name(); + this.state = 1594; + this.match(n1qlParser.DOT); + this.state = 1595; + this.keyspace_name(); + break; + + case 5: + this.enterOuterAlt(localctx, 5); + this.state = 1597; + this.namespace_name(); + this.state = 1598; + this.bucket_name(); + this.state = 1599; + this.match(n1qlParser.DOT); + this.state = 1600; + this.scope_name(); + break; + + case 6: + this.enterOuterAlt(localctx, 6); + this.state = 1602; + this.bucket_name(); + this.state = 1603; + this.match(n1qlParser.DOT); + this.state = 1604; + this.scope_name(); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + user_list(_p) { + if (_p === undefined) { + _p = 0; + } + const _parentctx = this._ctx; + const _parentState = this.state; + let localctx = new User_listContext(this, this._ctx, _parentState); + let _prevctx = localctx; + const _startState = 294; + this.enterRecursionRule(localctx, 294, n1qlParser.RULE_user_list, _p); + try { + this.enterOuterAlt(localctx, 1); + this.state = 1609; + this.user(); + this._ctx.stop = this._input.LT(-1); + this.state = 1616; + this._errHandler.sync(this); + var _alt = this._interp.adaptivePredict(this._input, 91, this._ctx); + while (_alt != 2 && _alt != antlr4.atn.ATN.INVALID_ALT_NUMBER) { + if (_alt === 1) { + if (this._parseListeners !== null) { + this.triggerExitRuleEvent(); + } + _prevctx = localctx; + localctx = new User_listContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_user_list); + this.state = 1611; + if (!this.precpred(this._ctx, 1)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 1)'); + } + this.state = 1612; + this.match(n1qlParser.COMMA); + this.state = 1613; + this.user(); + } + this.state = 1618; + this._errHandler.sync(this); + _alt = this._interp.adaptivePredict(this._input, 91, this._ctx); + } + } catch (error) { + if (error instanceof antlr4.error.RecognitionException) { + localctx.exception = error; + this._errHandler.reportError(this, error); + this._errHandler.recover(this, error); + } else { + throw error; + } + } finally { + this.unrollRecursionContexts(_parentctx); + } + return localctx; + } + + user() { + let localctx = new UserContext(this, this._ctx, this.state); + this.enterRule(localctx, 296, n1qlParser.RULE_user); + try { + this.state = 1623; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 92, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 1619; + this.match(n1qlParser.IDENT); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 1620; + this.match(n1qlParser.IDENT); + this.state = 1621; + this.match(n1qlParser.COLON); + this.state = 1622; + this.match(n1qlParser.IDENT); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + revoke_role() { + let localctx = new Revoke_roleContext(this, this._ctx, this.state); + this.enterRule(localctx, 298, n1qlParser.RULE_revoke_role); + try { + this.state = 1637; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 93, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 1625; + this.match(n1qlParser.REVOKE); + this.state = 1626; + this.role_list(0); + this.state = 1627; + this.match(n1qlParser.FROM); + this.state = 1628; + this.user_list(0); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 1630; + this.match(n1qlParser.REVOKE); + this.state = 1631; + this.role_list(0); + this.state = 1632; + this.match(n1qlParser.ON); + this.state = 1633; + this.keyspace_scope_list(0); + this.state = 1634; + this.match(n1qlParser.FROM); + this.state = 1635; + this.user_list(0); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + create_scope() { + let localctx = new Create_scopeContext(this, this._ctx, this.state); + this.enterRule(localctx, 300, n1qlParser.RULE_create_scope); + try { + this.enterOuterAlt(localctx, 1); + this.state = 1639; + this.match(n1qlParser.CREATE); + this.state = 1640; + this.match(n1qlParser.SCOPE); + this.state = 1641; + this.named_scope_ref(); + this.state = 1643; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 94, this._ctx); + if (la_ === 1) { + this.state = 1642; + this.if_not_exists(); + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + drop_scope() { + let localctx = new Drop_scopeContext(this, this._ctx, this.state); + this.enterRule(localctx, 302, n1qlParser.RULE_drop_scope); + try { + this.enterOuterAlt(localctx, 1); + this.state = 1645; + this.match(n1qlParser.DROP); + this.state = 1646; + this.match(n1qlParser.SCOPE); + this.state = 1647; + this.named_scope_ref(); + this.state = 1649; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 95, this._ctx); + if (la_ === 1) { + this.state = 1648; + this.if_exists(); + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + create_collection() { + let localctx = new Create_collectionContext(this, this._ctx, this.state); + this.enterRule(localctx, 304, n1qlParser.RULE_create_collection); + try { + this.enterOuterAlt(localctx, 1); + this.state = 1651; + this.match(n1qlParser.CREATE); + this.state = 1652; + this.match(n1qlParser.COLLECTION); + this.state = 1653; + this.named_keyspace_ref(); + this.state = 1655; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 96, this._ctx); + if (la_ === 1) { + this.state = 1654; + this.if_not_exists(); + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + drop_collection() { + let localctx = new Drop_collectionContext(this, this._ctx, this.state); + this.enterRule(localctx, 306, n1qlParser.RULE_drop_collection); + try { + this.enterOuterAlt(localctx, 1); + this.state = 1657; + this.match(n1qlParser.DROP); + this.state = 1658; + this.match(n1qlParser.COLLECTION); + this.state = 1659; + this.named_keyspace_ref(); + this.state = 1661; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 97, this._ctx); + if (la_ === 1) { + this.state = 1660; + this.if_exists(); + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + flush_collection() { + let localctx = new Flush_collectionContext(this, this._ctx, this.state); + this.enterRule(localctx, 308, n1qlParser.RULE_flush_collection); + try { + this.enterOuterAlt(localctx, 1); + this.state = 1663; + this.flush_or_truncate(); + this.state = 1664; + this.match(n1qlParser.COLLECTION); + this.state = 1665; + this.named_keyspace_ref(); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + flush_or_truncate() { + let localctx = new Flush_or_truncateContext(this, this._ctx, this.state); + this.enterRule(localctx, 310, n1qlParser.RULE_flush_or_truncate); + var _la = 0; // Token type + try { + this.enterOuterAlt(localctx, 1); + this.state = 1667; + _la = this._input.LA(1); + if (!(_la === n1qlParser.FLUSH || _la === n1qlParser.TRUNCATE)) { + this._errHandler.recoverInline(this); + } else { + this._errHandler.reportMatch(this); + this.consume(); + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + create_index() { + let localctx = new Create_indexContext(this, this._ctx, this.state); + this.enterRule(localctx, 312, n1qlParser.RULE_create_index); + try { + this.enterOuterAlt(localctx, 1); + this.state = 1669; + this.match(n1qlParser.CREATE); + this.state = 1670; + this.match(n1qlParser.INDEX); + this.state = 1671; + this.index_name(); + this.state = 1672; + this.match(n1qlParser.ON); + this.state = 1673; + this.named_keyspace_ref(); + this.state = 1674; + this.match(n1qlParser.LPAREN); + this.state = 1675; + this.index_terms(0); + this.state = 1676; + this.match(n1qlParser.RPAREN); + this.state = 1677; + this.index_partition(); + this.state = 1678; + this.index_where(); + this.state = 1679; + this.opt_index_using(); + this.state = 1680; + this.opt_index_with(); + this.state = 1682; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 98, this._ctx); + if (la_ === 1) { + this.state = 1681; + this.if_not_exists(); + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + create_primary_index() { + let localctx = new Create_primary_indexContext(this, this._ctx, this.state); + this.enterRule(localctx, 314, n1qlParser.RULE_create_primary_index); + try { + this.enterOuterAlt(localctx, 1); + this.state = 1684; + this.match(n1qlParser.CREATE); + this.state = 1685; + this.match(n1qlParser.PRIMARY); + this.state = 1686; + this.match(n1qlParser.INDEX); + this.state = 1687; + this.opt_primary_name(); + this.state = 1688; + this.match(n1qlParser.ON); + this.state = 1689; + this.named_keyspace_ref(); + this.state = 1690; + this.index_partition(); + this.state = 1691; + this.opt_index_using(); + this.state = 1692; + this.opt_index_with(); + this.state = 1694; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 99, this._ctx); + if (la_ === 1) { + this.state = 1693; + this.if_not_exists(); + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + opt_primary_name() { + let localctx = new Opt_primary_nameContext(this, this._ctx, this.state); + this.enterRule(localctx, 316, n1qlParser.RULE_opt_primary_name); + try { + this.state = 1698; + this._errHandler.sync(this); + switch (this._input.LA(1)) { + case n1qlParser.ON: + this.enterOuterAlt(localctx, 1); + + break; + case n1qlParser.IDENT: + this.enterOuterAlt(localctx, 2); + this.state = 1697; + this.index_name(); + break; + default: + throw new antlr4.error.NoViableAltException(this); + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + index_name() { + let localctx = new Index_nameContext(this, this._ctx, this.state); + this.enterRule(localctx, 318, n1qlParser.RULE_index_name); + try { + this.enterOuterAlt(localctx, 1); + this.state = 1700; + this.match(n1qlParser.IDENT); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + opt_index_name() { + let localctx = new Opt_index_nameContext(this, this._ctx, this.state); + this.enterRule(localctx, 320, n1qlParser.RULE_opt_index_name); + try { + this.state = 1704; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 101, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 1703; + this.index_name(); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + named_keyspace_ref() { + let localctx = new Named_keyspace_refContext(this, this._ctx, this.state); + this.enterRule(localctx, 322, n1qlParser.RULE_named_keyspace_ref); + try { + this.state = 1716; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 102, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 1706; + this.simple_named_keyspace_ref(); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 1707; + this.namespace_name(); + this.state = 1708; + this.bucket_name(); + break; + + case 3: + this.enterOuterAlt(localctx, 3); + this.state = 1710; + this.bucket_name(); + this.state = 1711; + this.match(n1qlParser.DOT); + this.state = 1712; + this.scope_name(); + this.state = 1713; + this.match(n1qlParser.DOT); + this.state = 1714; + this.keyspace_name(); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + simple_named_keyspace_ref() { + let localctx = new Simple_named_keyspace_refContext(this, this._ctx, this.state); + this.enterRule(localctx, 324, n1qlParser.RULE_simple_named_keyspace_ref); + try { + this.state = 1726; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 103, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 1718; + this.keyspace_name(); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 1719; + this.namespace_name(); + this.state = 1720; + this.bucket_name(); + this.state = 1721; + this.match(n1qlParser.DOT); + this.state = 1722; + this.scope_name(); + this.state = 1723; + this.match(n1qlParser.DOT); + this.state = 1724; + this.keyspace_name(); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + named_scope_ref() { + let localctx = new Named_scope_refContext(this, this._ctx, this.state); + this.enterRule(localctx, 326, n1qlParser.RULE_named_scope_ref); + try { + this.state = 1737; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 104, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 1728; + this.namespace_name(); + this.state = 1729; + this.bucket_name(); + this.state = 1730; + this.match(n1qlParser.DOT); + this.state = 1731; + this.scope_name(); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 1733; + this.bucket_name(); + this.state = 1734; + this.match(n1qlParser.DOT); + this.state = 1735; + this.scope_name(); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + index_partition() { + let localctx = new Index_partitionContext(this, this._ctx, this.state); + this.enterRule(localctx, 328, n1qlParser.RULE_index_partition); + try { + this.state = 1747; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 105, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 1740; + this.match(n1qlParser.PARTITION); + this.state = 1741; + this.match(n1qlParser.BY); + this.state = 1742; + this.match(n1qlParser.HASH); + this.state = 1743; + this.match(n1qlParser.LPAREN); + this.state = 1744; + this.exprs(0); + this.state = 1745; + this.match(n1qlParser.RPAREN); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + opt_index_using() { + let localctx = new Opt_index_usingContext(this, this._ctx, this.state); + this.enterRule(localctx, 330, n1qlParser.RULE_opt_index_using); + try { + this.state = 1751; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 106, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 1750; + this.index_using(); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + index_using() { + let localctx = new Index_usingContext(this, this._ctx, this.state); + this.enterRule(localctx, 332, n1qlParser.RULE_index_using); + try { + this.state = 1759; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 107, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 1753; + this.match(n1qlParser.USING); + this.state = 1754; + this.match(n1qlParser.VIEW); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 1755; + this.match(n1qlParser.USING); + this.state = 1756; + this.match(n1qlParser.GSI); + break; + + case 3: + this.enterOuterAlt(localctx, 3); + this.state = 1757; + this.match(n1qlParser.USING); + this.state = 1758; + this.match(n1qlParser.FTS); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + opt_index_with() { + let localctx = new Opt_index_withContext(this, this._ctx, this.state); + this.enterRule(localctx, 334, n1qlParser.RULE_opt_index_with); + try { + this.state = 1763; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 108, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 1762; + this.index_with(); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + index_with() { + let localctx = new Index_withContext(this, this._ctx, this.state); + this.enterRule(localctx, 336, n1qlParser.RULE_index_with); + try { + this.enterOuterAlt(localctx, 1); + this.state = 1765; + this.match(n1qlParser.WITH); + this.state = 1766; + this.expr(0); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + index_terms(_p) { + if (_p === undefined) { + _p = 0; + } + const _parentctx = this._ctx; + const _parentState = this.state; + let localctx = new Index_termsContext(this, this._ctx, _parentState); + let _prevctx = localctx; + const _startState = 338; + this.enterRecursionRule(localctx, 338, n1qlParser.RULE_index_terms, _p); + try { + this.enterOuterAlt(localctx, 1); + this.state = 1769; + this.index_term(); + this._ctx.stop = this._input.LT(-1); + this.state = 1776; + this._errHandler.sync(this); + var _alt = this._interp.adaptivePredict(this._input, 109, this._ctx); + while (_alt != 2 && _alt != antlr4.atn.ATN.INVALID_ALT_NUMBER) { + if (_alt === 1) { + if (this._parseListeners !== null) { + this.triggerExitRuleEvent(); + } + _prevctx = localctx; + localctx = new Index_termsContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_index_terms); + this.state = 1771; + if (!this.precpred(this._ctx, 1)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 1)'); + } + this.state = 1772; + this.match(n1qlParser.COMMA); + this.state = 1773; + this.index_term(); + } + this.state = 1778; + this._errHandler.sync(this); + _alt = this._interp.adaptivePredict(this._input, 109, this._ctx); + } + } catch (error) { + if (error instanceof antlr4.error.RecognitionException) { + localctx.exception = error; + this._errHandler.reportError(this, error); + this._errHandler.recover(this, error); + } else { + throw error; + } + } finally { + this.unrollRecursionContexts(_parentctx); + } + return localctx; + } + + index_term() { + let localctx = new Index_termContext(this, this._ctx, this.state); + this.enterRule(localctx, 340, n1qlParser.RULE_index_term); + try { + this.enterOuterAlt(localctx, 1); + this.state = 1779; + this.index_term_expr(); + this.state = 1780; + this.opt_ikattr(); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + index_term_expr() { + let localctx = new Index_term_exprContext(this, this._ctx, this.state); + this.enterRule(localctx, 342, n1qlParser.RULE_index_term_expr); + try { + this.state = 1792; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 110, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 1782; + this.index_expr(); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 1783; + this.all(); + this.state = 1784; + this.index_expr(); + break; + + case 3: + this.enterOuterAlt(localctx, 3); + this.state = 1786; + this.all(); + this.state = 1787; + this.match(n1qlParser.DISTINCT); + this.state = 1788; + this.index_expr(); + break; + + case 4: + this.enterOuterAlt(localctx, 4); + this.state = 1790; + this.match(n1qlParser.DISTINCT); + this.state = 1791; + this.index_expr(); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + index_expr() { + let localctx = new Index_exprContext(this, this._ctx, this.state); + this.enterRule(localctx, 344, n1qlParser.RULE_index_expr); + try { + this.enterOuterAlt(localctx, 1); + this.state = 1794; + this.expr(0); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + all() { + let localctx = new AllContext(this, this._ctx, this.state); + this.enterRule(localctx, 346, n1qlParser.RULE_all); + var _la = 0; // Token type + try { + this.enterOuterAlt(localctx, 1); + this.state = 1796; + _la = this._input.LA(1); + if (!(_la === n1qlParser.ALL || _la === n1qlParser.EACH)) { + this._errHandler.recoverInline(this); + } else { + this._errHandler.reportMatch(this); + this.consume(); + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + index_where() { + let localctx = new Index_whereContext(this, this._ctx, this.state); + this.enterRule(localctx, 348, n1qlParser.RULE_index_where); + try { + this.state = 1801; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 111, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 1799; + this.match(n1qlParser.WHERE); + this.state = 1800; + this.index_expr(); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + opt_ikattr() { + let localctx = new Opt_ikattrContext(this, this._ctx, this.state); + this.enterRule(localctx, 350, n1qlParser.RULE_opt_ikattr); + try { + this.state = 1808; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 112, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 1804; + this.ikattr(); + break; + + case 3: + this.enterOuterAlt(localctx, 3); + this.state = 1805; + this.ikattr(); + this.state = 1806; + this.ikattr(); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + ikattr() { + let localctx = new IkattrContext(this, this._ctx, this.state); + this.enterRule(localctx, 352, n1qlParser.RULE_ikattr); + var _la = 0; // Token type + try { + this.enterOuterAlt(localctx, 1); + this.state = 1810; + _la = this._input.LA(1); + if (!(_la === n1qlParser.ASC || _la === n1qlParser.DESC || _la === n1qlParser.MISSING)) { + this._errHandler.recoverInline(this); + } else { + this._errHandler.reportMatch(this); + this.consume(); + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + drop_index() { + let localctx = new Drop_indexContext(this, this._ctx, this.state); + this.enterRule(localctx, 354, n1qlParser.RULE_drop_index); + try { + this.state = 1833; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 113, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 1812; + this.match(n1qlParser.DROP); + this.state = 1813; + this.match(n1qlParser.PRIMARY); + this.state = 1814; + this.match(n1qlParser.INDEX); + this.state = 1815; + this.match(n1qlParser.ON); + this.state = 1816; + this.named_keyspace_ref(); + this.state = 1817; + this.opt_index_using(); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 1819; + this.match(n1qlParser.DROP); + this.state = 1820; + this.match(n1qlParser.INDEX); + this.state = 1821; + this.simple_named_keyspace_ref(); + this.state = 1822; + this.match(n1qlParser.DOT); + this.state = 1823; + this.index_name(); + this.state = 1824; + this.opt_index_using(); + break; + + case 3: + this.enterOuterAlt(localctx, 3); + this.state = 1826; + this.match(n1qlParser.DROP); + this.state = 1827; + this.match(n1qlParser.INDEX); + this.state = 1828; + this.index_name(); + this.state = 1829; + this.match(n1qlParser.ON); + this.state = 1830; + this.named_keyspace_ref(); + this.state = 1831; + this.opt_index_using(); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + alter_index() { + let localctx = new Alter_indexContext(this, this._ctx, this.state); + this.enterRule(localctx, 356, n1qlParser.RULE_alter_index); + try { + this.state = 1851; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 114, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 1835; + this.match(n1qlParser.ALTER); + this.state = 1836; + this.match(n1qlParser.INDEX); + this.state = 1837; + this.simple_named_keyspace_ref(); + this.state = 1838; + this.match(n1qlParser.DOT); + this.state = 1839; + this.index_name(); + this.state = 1840; + this.opt_index_using(); + this.state = 1841; + this.index_with(); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 1843; + this.match(n1qlParser.ALTER); + this.state = 1844; + this.match(n1qlParser.INDEX); + this.state = 1845; + this.index_name(); + this.state = 1846; + this.match(n1qlParser.ON); + this.state = 1847; + this.named_keyspace_ref(); + this.state = 1848; + this.opt_index_using(); + this.state = 1849; + this.index_with(); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + build_index() { + let localctx = new Build_indexContext(this, this._ctx, this.state); + this.enterRule(localctx, 358, n1qlParser.RULE_build_index); + try { + this.enterOuterAlt(localctx, 1); + this.state = 1853; + this.match(n1qlParser.BUILD); + this.state = 1854; + this.match(n1qlParser.INDEX); + this.state = 1855; + this.match(n1qlParser.ON); + this.state = 1856; + this.named_keyspace_ref(); + this.state = 1857; + this.match(n1qlParser.LPAREN); + this.state = 1858; + this.exprs(0); + this.state = 1859; + this.match(n1qlParser.RPAREN); + this.state = 1860; + this.opt_index_using(); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + create_function() { + let localctx = new Create_functionContext(this, this._ctx, this.state); + this.enterRule(localctx, 360, n1qlParser.RULE_create_function); + try { + this.enterOuterAlt(localctx, 1); + this.state = 1862; + this.match(n1qlParser.CREATE); + this.state = 1863; + this.opt_replace(); + this.state = 1864; + this.match(n1qlParser.FUNCTION); + this.state = 1865; + this.func_name(); + this.state = 1866; + this.match(n1qlParser.LPAREN); + this.state = 1867; + this.parm_list(); + this.state = 1868; + this.match(n1qlParser.RPAREN); + this.state = 1869; + this.func_body(); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + opt_replace() { + let localctx = new Opt_replaceContext(this, this._ctx, this.state); + this.enterRule(localctx, 362, n1qlParser.RULE_opt_replace); + try { + this.state = 1874; + this._errHandler.sync(this); + switch (this._input.LA(1)) { + case n1qlParser.FUNCTION: + this.enterOuterAlt(localctx, 1); + + break; + case n1qlParser.OR: + this.enterOuterAlt(localctx, 2); + this.state = 1872; + this.match(n1qlParser.OR); + this.state = 1873; + this.match(n1qlParser.REPLACE); + break; + default: + throw new antlr4.error.NoViableAltException(this); + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + func_name() { + let localctx = new Func_nameContext(this, this._ctx, this.state); + this.enterRule(localctx, 364, n1qlParser.RULE_func_name); + try { + this.state = 1878; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 116, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 1876; + this.short_func_name(); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 1877; + this.long_func_name(); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + short_func_name() { + let localctx = new Short_func_nameContext(this, this._ctx, this.state); + this.enterRule(localctx, 366, n1qlParser.RULE_short_func_name); + try { + this.enterOuterAlt(localctx, 1); + this.state = 1880; + this.keyspace_name(); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + long_func_name() { + let localctx = new Long_func_nameContext(this, this._ctx, this.state); + this.enterRule(localctx, 368, n1qlParser.RULE_long_func_name); + try { + this.state = 1892; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 117, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 1882; + this.namespace_term(); + this.state = 1883; + this.keyspace_name(); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 1885; + this.namespace_term(); + this.state = 1886; + this.bucket_name(); + this.state = 1887; + this.match(n1qlParser.DOT); + this.state = 1888; + this.scope_name(); + this.state = 1889; + this.match(n1qlParser.DOT); + this.state = 1890; + this.keyspace_name(); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + parm_list() { + let localctx = new Parm_listContext(this, this._ctx, this.state); + this.enterRule(localctx, 370, n1qlParser.RULE_parm_list); + try { + this.state = 1899; + this._errHandler.sync(this); + switch (this._input.LA(1)) { + case n1qlParser.RPAREN: + this.enterOuterAlt(localctx, 1); + + break; + case n1qlParser.DOT: + this.enterOuterAlt(localctx, 2); + this.state = 1895; + this.match(n1qlParser.DOT); + this.state = 1896; + this.match(n1qlParser.DOT); + this.state = 1897; + this.match(n1qlParser.DOT); + break; + case n1qlParser.IDENT: + this.enterOuterAlt(localctx, 3); + this.state = 1898; + this.parameter_terms(0); + break; + default: + throw new antlr4.error.NoViableAltException(this); + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + parameter_terms(_p) { + if (_p === undefined) { + _p = 0; + } + const _parentctx = this._ctx; + const _parentState = this.state; + let localctx = new Parameter_termsContext(this, this._ctx, _parentState); + let _prevctx = localctx; + const _startState = 372; + this.enterRecursionRule(localctx, 372, n1qlParser.RULE_parameter_terms, _p); + try { + this.enterOuterAlt(localctx, 1); + this.state = 1902; + this.match(n1qlParser.IDENT); + this._ctx.stop = this._input.LT(-1); + this.state = 1909; + this._errHandler.sync(this); + var _alt = this._interp.adaptivePredict(this._input, 119, this._ctx); + while (_alt != 2 && _alt != antlr4.atn.ATN.INVALID_ALT_NUMBER) { + if (_alt === 1) { + if (this._parseListeners !== null) { + this.triggerExitRuleEvent(); + } + _prevctx = localctx; + localctx = new Parameter_termsContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_parameter_terms); + this.state = 1904; + if (!this.precpred(this._ctx, 1)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 1)'); + } + this.state = 1905; + this.match(n1qlParser.COMMA); + this.state = 1906; + this.match(n1qlParser.IDENT); + } + this.state = 1911; + this._errHandler.sync(this); + _alt = this._interp.adaptivePredict(this._input, 119, this._ctx); + } + } catch (error) { + if (error instanceof antlr4.error.RecognitionException) { + localctx.exception = error; + this._errHandler.reportError(this, error); + this._errHandler.recover(this, error); + } else { + throw error; + } + } finally { + this.unrollRecursionContexts(_parentctx); + } + return localctx; + } + + func_body() { + let localctx = new Func_bodyContext(this, this._ctx, this.state); + this.enterRule(localctx, 374, n1qlParser.RULE_func_body); + try { + this.state = 1932; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 120, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 1912; + this.match(n1qlParser.LBRACE); + this.state = 1913; + this.expr(0); + this.state = 1914; + this.match(n1qlParser.RBRACE); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 1916; + this.match(n1qlParser.LANGUAGE); + this.state = 1917; + this.match(n1qlParser.INLINE); + this.state = 1918; + this.match(n1qlParser.AS); + this.state = 1919; + this.expr(0); + break; + + case 3: + this.enterOuterAlt(localctx, 3); + this.state = 1920; + this.match(n1qlParser.LANGUAGE); + this.state = 1921; + this.match(n1qlParser.GOLANG); + this.state = 1922; + this.match(n1qlParser.AS); + this.state = 1923; + this.match(n1qlParser.STR); + this.state = 1924; + this.match(n1qlParser.AT); + this.state = 1925; + this.match(n1qlParser.STR); + break; + + case 4: + this.enterOuterAlt(localctx, 4); + this.state = 1926; + this.match(n1qlParser.LANGUAGE); + this.state = 1927; + this.match(n1qlParser.JAVASCRIPT); + this.state = 1928; + this.match(n1qlParser.AS); + this.state = 1929; + this.match(n1qlParser.STR); + this.state = 1930; + this.match(n1qlParser.AT); + this.state = 1931; + this.match(n1qlParser.STR); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + drop_function() { + let localctx = new Drop_functionContext(this, this._ctx, this.state); + this.enterRule(localctx, 376, n1qlParser.RULE_drop_function); + try { + this.enterOuterAlt(localctx, 1); + this.state = 1934; + this.match(n1qlParser.DROP); + this.state = 1935; + this.match(n1qlParser.FUNCTION); + this.state = 1936; + this.func_name(); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + execute_function() { + let localctx = new Execute_functionContext(this, this._ctx, this.state); + this.enterRule(localctx, 378, n1qlParser.RULE_execute_function); + try { + this.enterOuterAlt(localctx, 1); + this.state = 1938; + this.match(n1qlParser.EXECUTE); + this.state = 1939; + this.match(n1qlParser.FUNCTION); + this.state = 1940; + this.func_name(); + this.state = 1941; + this.match(n1qlParser.LPAREN); + this.state = 1942; + this.opt_exprs(); + this.state = 1943; + this.match(n1qlParser.RPAREN); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + update_statistics() { + let localctx = new Update_statisticsContext(this, this._ctx, this.state); + this.enterRule(localctx, 380, n1qlParser.RULE_update_statistics); + try { + this.state = 2067; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 121, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 1945; + this.match(n1qlParser.UPDATE); + this.state = 1946; + this.match(n1qlParser.STATISTICS); + this.state = 1947; + this.opt_for(); + this.state = 1948; + this.named_keyspace_ref(); + this.state = 1949; + this.match(n1qlParser.LPAREN); + this.state = 1950; + this.update_stat_terms(0); + this.state = 1951; + this.match(n1qlParser.RPAREN); + this.state = 1952; + this.opt_infer_ustat_with(); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 1954; + this.match(n1qlParser.UPDATE); + this.state = 1955; + this.match(n1qlParser.STATISTICS); + this.state = 1956; + this.opt_for(); + this.state = 1957; + this.named_keyspace_ref(); + this.state = 1958; + this.match(n1qlParser.DELETE_); + this.state = 1959; + this.match(n1qlParser.LPAREN); + this.state = 1960; + this.update_stat_terms(0); + this.state = 1961; + this.match(n1qlParser.RPAREN); + break; + + case 3: + this.enterOuterAlt(localctx, 3); + this.state = 1963; + this.match(n1qlParser.UPDATE); + this.state = 1964; + this.match(n1qlParser.STATISTICS); + this.state = 1965; + this.opt_for(); + this.state = 1966; + this.named_keyspace_ref(); + this.state = 1967; + this.match(n1qlParser.DELETE_); + this.state = 1968; + this.match(n1qlParser.ALL); + break; + + case 4: + this.enterOuterAlt(localctx, 4); + this.state = 1970; + this.match(n1qlParser.UPDATE); + this.state = 1971; + this.match(n1qlParser.STATISTICS); + this.state = 1972; + this.opt_for(); + this.state = 1973; + this.named_keyspace_ref(); + this.state = 1974; + this.match(n1qlParser.INDEX); + this.state = 1975; + this.match(n1qlParser.LPAREN); + this.state = 1976; + this.exprs(0); + this.state = 1977; + this.match(n1qlParser.RPAREN); + this.state = 1978; + this.opt_index_using(); + this.state = 1979; + this.opt_infer_ustat_with(); + break; + + case 5: + this.enterOuterAlt(localctx, 5); + this.state = 1981; + this.match(n1qlParser.UPDATE); + this.state = 1982; + this.match(n1qlParser.STATISTICS); + this.state = 1983; + this.opt_for(); + this.state = 1984; + this.named_keyspace_ref(); + this.state = 1985; + this.match(n1qlParser.INDEX); + this.state = 1986; + this.match(n1qlParser.ALL); + this.state = 1987; + this.opt_index_using(); + this.state = 1988; + this.opt_infer_ustat_with(); + break; + + case 6: + this.enterOuterAlt(localctx, 6); + this.state = 1990; + this.match(n1qlParser.UPDATE); + this.state = 1991; + this.match(n1qlParser.STATISTICS); + this.state = 1992; + this.match(n1qlParser.FOR); + this.state = 1993; + this.match(n1qlParser.INDEX); + this.state = 1994; + this.simple_named_keyspace_ref(); + this.state = 1995; + this.match(n1qlParser.DOT); + this.state = 1996; + this.index_name(); + this.state = 1997; + this.opt_index_using(); + this.state = 1998; + this.opt_infer_ustat_with(); + break; + + case 7: + this.enterOuterAlt(localctx, 7); + this.state = 2000; + this.match(n1qlParser.UPDATE); + this.state = 2001; + this.match(n1qlParser.STATISTICS); + this.state = 2002; + this.match(n1qlParser.FOR); + this.state = 2003; + this.match(n1qlParser.INDEX); + this.state = 2004; + this.index_name(); + this.state = 2005; + this.match(n1qlParser.ON); + this.state = 2006; + this.named_keyspace_ref(); + this.state = 2007; + this.opt_index_using(); + this.state = 2008; + this.opt_infer_ustat_with(); + break; + + case 8: + this.enterOuterAlt(localctx, 8); + this.state = 2010; + this.match(n1qlParser.ANALYZE); + this.state = 2011; + this.opt_keyspace_collection(); + this.state = 2012; + this.named_keyspace_ref(); + this.state = 2013; + this.match(n1qlParser.LPAREN); + this.state = 2014; + this.update_stat_terms(0); + this.state = 2015; + this.match(n1qlParser.RPAREN); + this.state = 2016; + this.opt_infer_ustat_with(); + break; + + case 9: + this.enterOuterAlt(localctx, 9); + this.state = 2018; + this.match(n1qlParser.ANALYZE); + this.state = 2019; + this.opt_keyspace_collection(); + this.state = 2020; + this.named_keyspace_ref(); + this.state = 2021; + this.match(n1qlParser.DELETE_); + this.state = 2022; + this.match(n1qlParser.STATISTICS); + this.state = 2023; + this.match(n1qlParser.LPAREN); + this.state = 2024; + this.update_stat_terms(0); + this.state = 2025; + this.match(n1qlParser.RPAREN); + break; + + case 10: + this.enterOuterAlt(localctx, 10); + this.state = 2027; + this.match(n1qlParser.ANALYZE); + this.state = 2028; + this.opt_keyspace_collection(); + this.state = 2029; + this.named_keyspace_ref(); + this.state = 2030; + this.match(n1qlParser.DELETE_); + this.state = 2031; + this.match(n1qlParser.STATISTICS); + break; + + case 11: + this.enterOuterAlt(localctx, 11); + this.state = 2033; + this.match(n1qlParser.ANALYZE); + this.state = 2034; + this.opt_keyspace_collection(); + this.state = 2035; + this.named_keyspace_ref(); + this.state = 2036; + this.match(n1qlParser.INDEX); + this.state = 2037; + this.match(n1qlParser.LPAREN); + this.state = 2038; + this.exprs(0); + this.state = 2039; + this.match(n1qlParser.RPAREN); + this.state = 2040; + this.opt_index_using(); + this.state = 2041; + this.opt_infer_ustat_with(); + break; + + case 12: + this.enterOuterAlt(localctx, 12); + this.state = 2043; + this.match(n1qlParser.ANALYZE); + this.state = 2044; + this.opt_keyspace_collection(); + this.state = 2045; + this.named_keyspace_ref(); + this.state = 2046; + this.match(n1qlParser.INDEX); + this.state = 2047; + this.match(n1qlParser.ALL); + this.state = 2048; + this.opt_index_using(); + this.state = 2049; + this.opt_infer_ustat_with(); + break; + + case 13: + this.enterOuterAlt(localctx, 13); + this.state = 2051; + this.match(n1qlParser.ANALYZE); + this.state = 2052; + this.match(n1qlParser.INDEX); + this.state = 2053; + this.simple_named_keyspace_ref(); + this.state = 2054; + this.match(n1qlParser.DOT); + this.state = 2055; + this.index_name(); + this.state = 2056; + this.opt_index_using(); + this.state = 2057; + this.opt_infer_ustat_with(); + break; + + case 14: + this.enterOuterAlt(localctx, 14); + this.state = 2059; + this.match(n1qlParser.ANALYZE); + this.state = 2060; + this.match(n1qlParser.INDEX); + this.state = 2061; + this.index_name(); + this.state = 2062; + this.match(n1qlParser.ON); + this.state = 2063; + this.named_keyspace_ref(); + this.state = 2064; + this.opt_index_using(); + this.state = 2065; + this.opt_infer_ustat_with(); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + opt_for() { + let localctx = new Opt_forContext(this, this._ctx, this.state); + this.enterRule(localctx, 382, n1qlParser.RULE_opt_for); + try { + this.state = 2071; + this._errHandler.sync(this); + switch (this._input.LA(1)) { + case n1qlParser.IDENT: + this.enterOuterAlt(localctx, 1); + + break; + case n1qlParser.FOR: + this.enterOuterAlt(localctx, 2); + this.state = 2070; + this.match(n1qlParser.FOR); + break; + default: + throw new antlr4.error.NoViableAltException(this); + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + update_stat_terms(_p) { + if (_p === undefined) { + _p = 0; + } + const _parentctx = this._ctx; + const _parentState = this.state; + let localctx = new Update_stat_termsContext(this, this._ctx, _parentState); + let _prevctx = localctx; + const _startState = 384; + this.enterRecursionRule(localctx, 384, n1qlParser.RULE_update_stat_terms, _p); + try { + this.enterOuterAlt(localctx, 1); + this.state = 2074; + this.update_stat_term(); + this._ctx.stop = this._input.LT(-1); + this.state = 2081; + this._errHandler.sync(this); + var _alt = this._interp.adaptivePredict(this._input, 123, this._ctx); + while (_alt != 2 && _alt != antlr4.atn.ATN.INVALID_ALT_NUMBER) { + if (_alt === 1) { + if (this._parseListeners !== null) { + this.triggerExitRuleEvent(); + } + _prevctx = localctx; + localctx = new Update_stat_termsContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_update_stat_terms); + this.state = 2076; + if (!this.precpred(this._ctx, 1)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 1)'); + } + this.state = 2077; + this.match(n1qlParser.COMMA); + this.state = 2078; + this.update_stat_term(); + } + this.state = 2083; + this._errHandler.sync(this); + _alt = this._interp.adaptivePredict(this._input, 123, this._ctx); + } + } catch (error) { + if (error instanceof antlr4.error.RecognitionException) { + localctx.exception = error; + this._errHandler.reportError(this, error); + this._errHandler.recover(this, error); + } else { + throw error; + } + } finally { + this.unrollRecursionContexts(_parentctx); + } + return localctx; + } + + update_stat_term() { + let localctx = new Update_stat_termContext(this, this._ctx, this.state); + this.enterRule(localctx, 386, n1qlParser.RULE_update_stat_term); + try { + this.enterOuterAlt(localctx, 1); + this.state = 2084; + this.index_term_expr(); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + path(_p) { + if (_p === undefined) { + _p = 0; + } + const _parentctx = this._ctx; + const _parentState = this.state; + let localctx = new PathContext(this, this._ctx, _parentState); + let _prevctx = localctx; + const _startState = 388; + this.enterRecursionRule(localctx, 388, n1qlParser.RULE_path, _p); + try { + this.enterOuterAlt(localctx, 1); + this.state = 2087; + this.match(n1qlParser.IDENT); + this._ctx.stop = this._input.LT(-1); + this.state = 2114; + this._errHandler.sync(this); + var _alt = this._interp.adaptivePredict(this._input, 125, this._ctx); + while (_alt != 2 && _alt != antlr4.atn.ATN.INVALID_ALT_NUMBER) { + if (_alt === 1) { + if (this._parseListeners !== null) { + this.triggerExitRuleEvent(); + } + _prevctx = localctx; + this.state = 2112; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 124, this._ctx); + switch (la_) { + case 1: + localctx = new PathContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_path); + this.state = 2089; + if (!this.precpred(this._ctx, 5)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 5)'); + } + this.state = 2090; + this.match(n1qlParser.DOT); + this.state = 2091; + this.match(n1qlParser.IDENT); + break; + + case 2: + localctx = new PathContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_path); + this.state = 2092; + if (!this.precpred(this._ctx, 4)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 4)'); + } + this.state = 2093; + this.match(n1qlParser.DOT); + this.state = 2094; + this.match(n1qlParser.IDENT_ICASE); + break; + + case 3: + localctx = new PathContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_path); + this.state = 2095; + if (!this.precpred(this._ctx, 3)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 3)'); + } + this.state = 2096; + this.match(n1qlParser.DOT); + this.state = 2097; + this.match(n1qlParser.LBRACKET); + this.state = 2098; + this.expr(0); + this.state = 2099; + this.match(n1qlParser.RBRACKET); + break; + + case 4: + localctx = new PathContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_path); + this.state = 2101; + if (!this.precpred(this._ctx, 2)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 2)'); + } + this.state = 2102; + this.match(n1qlParser.DOT); + this.state = 2103; + this.match(n1qlParser.LBRACKET); + this.state = 2104; + this.expr(0); + this.state = 2105; + this.match(n1qlParser.RBRACKET_ICASE); + break; + + case 5: + localctx = new PathContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_path); + this.state = 2107; + if (!this.precpred(this._ctx, 1)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 1)'); + } + this.state = 2108; + this.match(n1qlParser.LBRACKET); + this.state = 2109; + this.expr(0); + this.state = 2110; + this.match(n1qlParser.RBRACKET); + break; + } + } + this.state = 2116; + this._errHandler.sync(this); + _alt = this._interp.adaptivePredict(this._input, 125, this._ctx); + } + } catch (error) { + if (error instanceof antlr4.error.RecognitionException) { + localctx.exception = error; + this._errHandler.reportError(this, error); + this._errHandler.recover(this, error); + } else { + throw error; + } + } finally { + this.unrollRecursionContexts(_parentctx); + } + return localctx; + } + + expr(_p) { + if (_p === undefined) { + _p = 0; + } + const _parentctx = this._ctx; + const _parentState = this.state; + let localctx = new ExprContext(this, this._ctx, _parentState); + let _prevctx = localctx; + const _startState = 390; + this.enterRecursionRule(localctx, 390, n1qlParser.RULE_expr, _p); + try { + this.enterOuterAlt(localctx, 1); + this.state = 2123; + this._errHandler.sync(this); + switch (this._input.LA(1)) { + case n1qlParser.STR: + case n1qlParser.INT: + case n1qlParser.NUM: + case n1qlParser.MINUS: + case n1qlParser.LPAREN: + case n1qlParser.LBRACE: + case n1qlParser.LBRACKET: + case n1qlParser.ANY: + case n1qlParser.ARRAY: + case n1qlParser.CASE: + case n1qlParser.CORRELATED: + case n1qlParser.COVER: + case n1qlParser.EVERY: + case n1qlParser.FALSE: + case n1qlParser.FIRST: + case n1qlParser.MISSING: + case n1qlParser.NTH_VALUE: + case n1qlParser.NULL: + case n1qlParser.OBJECT: + case n1qlParser.REPLACE: + case n1qlParser.SELF: + case n1qlParser.SOME: + case n1qlParser.SYSTEM: + case n1qlParser.TRUE: + case n1qlParser.IDENT_ICASE: + case n1qlParser.IDENT: + case n1qlParser.NAMED_PARAM: + case n1qlParser.POSITIONAL_PARAM: + case n1qlParser.NEXT_PARAM: + this.state = 2118; + this.c_expr(); + break; + case n1qlParser.NOT: + this.state = 2119; + this.match(n1qlParser.NOT); + this.state = 2120; + this.expr(23); + break; + case n1qlParser.EXISTS: + this.state = 2121; + this.match(n1qlParser.EXISTS); + this.state = 2122; + this.expr(1); + break; + default: + throw new antlr4.error.NoViableAltException(this); + } + this._ctx.stop = this._input.LT(-1); + this.state = 2267; + this._errHandler.sync(this); + var _alt = this._interp.adaptivePredict(this._input, 128, this._ctx); + while (_alt != 2 && _alt != antlr4.atn.ATN.INVALID_ALT_NUMBER) { + if (_alt === 1) { + if (this._parseListeners !== null) { + this.triggerExitRuleEvent(); + } + _prevctx = localctx; + this.state = 2265; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 127, this._ctx); + switch (la_) { + case 1: + localctx = new ExprContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_expr); + this.state = 2125; + if (!this.precpred(this._ctx, 31)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 31)'); + } + this.state = 2126; + this.match(n1qlParser.PLUS); + this.state = 2127; + this.expr(32); + break; + + case 2: + localctx = new ExprContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_expr); + this.state = 2128; + if (!this.precpred(this._ctx, 30)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 30)'); + } + this.state = 2129; + this.match(n1qlParser.MINUS); + this.state = 2130; + this.expr(31); + break; + + case 3: + localctx = new ExprContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_expr); + this.state = 2131; + if (!this.precpred(this._ctx, 29)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 29)'); + } + this.state = 2132; + this.match(n1qlParser.STAR); + this.state = 2133; + this.expr(30); + break; + + case 4: + localctx = new ExprContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_expr); + this.state = 2134; + if (!this.precpred(this._ctx, 28)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 28)'); + } + this.state = 2135; + this.match(n1qlParser.DIV); + this.state = 2136; + this.expr(29); + break; + + case 5: + localctx = new ExprContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_expr); + this.state = 2137; + if (!this.precpred(this._ctx, 27)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 27)'); + } + this.state = 2138; + this.match(n1qlParser.MOD); + this.state = 2139; + this.expr(28); + break; + + case 6: + localctx = new ExprContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_expr); + this.state = 2140; + if (!this.precpred(this._ctx, 26)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 26)'); + } + this.state = 2141; + this.match(n1qlParser.CONCAT); + this.state = 2142; + this.expr(27); + break; + + case 7: + localctx = new ExprContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_expr); + this.state = 2143; + if (!this.precpred(this._ctx, 25)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 25)'); + } + this.state = 2144; + this.match(n1qlParser.AND); + this.state = 2145; + this.expr(26); + break; + + case 8: + localctx = new ExprContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_expr); + this.state = 2146; + if (!this.precpred(this._ctx, 24)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 24)'); + } + this.state = 2147; + this.match(n1qlParser.OR); + this.state = 2148; + this.expr(25); + break; + + case 9: + localctx = new ExprContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_expr); + this.state = 2149; + if (!this.precpred(this._ctx, 22)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 22)'); + } + this.state = 2150; + this.match(n1qlParser.EQ); + this.state = 2151; + this.expr(23); + break; + + case 10: + localctx = new ExprContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_expr); + this.state = 2152; + if (!this.precpred(this._ctx, 21)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 21)'); + } + this.state = 2153; + this.match(n1qlParser.DEQ); + this.state = 2154; + this.expr(22); + break; + + case 11: + localctx = new ExprContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_expr); + this.state = 2155; + if (!this.precpred(this._ctx, 20)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 20)'); + } + this.state = 2156; + this.match(n1qlParser.NE); + this.state = 2157; + this.expr(21); + break; + + case 12: + localctx = new ExprContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_expr); + this.state = 2158; + if (!this.precpred(this._ctx, 19)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 19)'); + } + this.state = 2159; + this.match(n1qlParser.LT); + this.state = 2160; + this.expr(20); + break; + + case 13: + localctx = new ExprContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_expr); + this.state = 2161; + if (!this.precpred(this._ctx, 18)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 18)'); + } + this.state = 2162; + this.match(n1qlParser.GT); + this.state = 2163; + this.expr(19); + break; + + case 14: + localctx = new ExprContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_expr); + this.state = 2164; + if (!this.precpred(this._ctx, 17)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 17)'); + } + this.state = 2165; + this.match(n1qlParser.LE); + this.state = 2166; + this.expr(18); + break; + + case 15: + localctx = new ExprContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_expr); + this.state = 2167; + if (!this.precpred(this._ctx, 16)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 16)'); + } + this.state = 2168; + this.match(n1qlParser.GE); + this.state = 2169; + this.expr(17); + break; + + case 16: + localctx = new ExprContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_expr); + this.state = 2170; + if (!this.precpred(this._ctx, 13)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 13)'); + } + this.state = 2171; + this.match(n1qlParser.LIKE); + this.state = 2172; + this.expr(14); + break; + + case 17: + localctx = new ExprContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_expr); + this.state = 2173; + if (!this.precpred(this._ctx, 12)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 12)'); + } + this.state = 2174; + this.match(n1qlParser.NOT); + this.state = 2175; + this.match(n1qlParser.LIKE); + this.state = 2176; + this.expr(13); + break; + + case 18: + localctx = new ExprContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_expr); + this.state = 2177; + if (!this.precpred(this._ctx, 11)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 11)'); + } + this.state = 2178; + this.match(n1qlParser.IN); + this.state = 2179; + this.expr(12); + break; + + case 19: + localctx = new ExprContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_expr); + this.state = 2180; + if (!this.precpred(this._ctx, 10)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 10)'); + } + this.state = 2181; + this.match(n1qlParser.NOT); + this.state = 2182; + this.match(n1qlParser.IN); + this.state = 2183; + this.expr(11); + break; + + case 20: + localctx = new ExprContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_expr); + this.state = 2184; + if (!this.precpred(this._ctx, 9)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 9)'); + } + this.state = 2185; + this.match(n1qlParser.WITHIN); + this.state = 2186; + this.expr(10); + break; + + case 21: + localctx = new ExprContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_expr); + this.state = 2187; + if (!this.precpred(this._ctx, 8)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 8)'); + } + this.state = 2188; + this.match(n1qlParser.NOT); + this.state = 2189; + this.match(n1qlParser.WITHIN); + this.state = 2190; + this.expr(9); + break; + + case 22: + localctx = new ExprContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_expr); + this.state = 2191; + if (!this.precpred(this._ctx, 39)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 39)'); + } + this.state = 2192; + this.match(n1qlParser.DOT); + this.state = 2193; + this.match(n1qlParser.IDENT); + break; + + case 23: + localctx = new ExprContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_expr); + this.state = 2194; + if (!this.precpred(this._ctx, 38)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 38)'); + } + this.state = 2195; + this.match(n1qlParser.DOT); + this.state = 2196; + this.match(n1qlParser.IDENT_ICASE); + break; + + case 24: + localctx = new ExprContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_expr); + this.state = 2197; + if (!this.precpred(this._ctx, 37)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 37)'); + } + this.state = 2198; + this.match(n1qlParser.DOT); + this.state = 2199; + this.match(n1qlParser.LBRACKET); + this.state = 2200; + this.expr(0); + this.state = 2201; + this.match(n1qlParser.RBRACKET); + break; + + case 25: + localctx = new ExprContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_expr); + this.state = 2203; + if (!this.precpred(this._ctx, 36)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 36)'); + } + this.state = 2204; + this.match(n1qlParser.DOT); + this.state = 2205; + this.match(n1qlParser.LBRACKET); + this.state = 2206; + this.expr(0); + this.state = 2207; + this.match(n1qlParser.RBRACKET_ICASE); + break; + + case 26: + localctx = new ExprContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_expr); + this.state = 2209; + if (!this.precpred(this._ctx, 35)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 35)'); + } + this.state = 2210; + this.match(n1qlParser.LBRACKET); + this.state = 2211; + this.expr(0); + this.state = 2212; + this.match(n1qlParser.RBRACKET); + break; + + case 27: + localctx = new ExprContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_expr); + this.state = 2214; + if (!this.precpred(this._ctx, 34)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 34)'); + } + this.state = 2215; + this.match(n1qlParser.LBRACKET); + this.state = 2216; + this.expr(0); + this.state = 2217; + this.match(n1qlParser.COLON); + this.state = 2218; + this.match(n1qlParser.RBRACKET); + break; + + case 28: + localctx = new ExprContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_expr); + this.state = 2220; + if (!this.precpred(this._ctx, 33)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 33)'); + } + this.state = 2221; + this.match(n1qlParser.LBRACKET); + this.state = 2222; + this.expr(0); + this.state = 2223; + this.match(n1qlParser.COLON); + this.state = 2224; + this.expr(0); + this.state = 2225; + this.match(n1qlParser.RBRACKET); + break; + + case 29: + localctx = new ExprContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_expr); + this.state = 2227; + if (!this.precpred(this._ctx, 32)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 32)'); + } + this.state = 2228; + this.match(n1qlParser.LBRACKET); + this.state = 2229; + this.match(n1qlParser.STAR); + this.state = 2230; + this.match(n1qlParser.RBRACKET); + break; + + case 30: + localctx = new ExprContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_expr); + this.state = 2231; + if (!this.precpred(this._ctx, 15)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 15)'); + } + this.state = 2232; + this.match(n1qlParser.BETWEEN); + this.state = 2233; + this.b_expr(0); + this.state = 2234; + this.match(n1qlParser.AND); + this.state = 2235; + this.b_expr(0); + break; + + case 31: + localctx = new ExprContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_expr); + this.state = 2237; + if (!this.precpred(this._ctx, 14)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 14)'); + } + this.state = 2238; + this.match(n1qlParser.NOT); + this.state = 2239; + this.match(n1qlParser.BETWEEN); + this.state = 2240; + this.b_expr(0); + this.state = 2241; + this.match(n1qlParser.AND); + this.state = 2242; + this.b_expr(0); + break; + + case 32: + localctx = new ExprContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_expr); + this.state = 2244; + if (!this.precpred(this._ctx, 7)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 7)'); + } + this.state = 2245; + this.match(n1qlParser.IS); + this.state = 2246; + this.match(n1qlParser.NULL); + break; + + case 33: + localctx = new ExprContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_expr); + this.state = 2247; + if (!this.precpred(this._ctx, 6)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 6)'); + } + this.state = 2248; + this.match(n1qlParser.IS); + this.state = 2249; + this.match(n1qlParser.NOT); + this.state = 2250; + this.match(n1qlParser.NULL); + break; + + case 34: + localctx = new ExprContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_expr); + this.state = 2251; + if (!this.precpred(this._ctx, 5)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 5)'); + } + this.state = 2252; + this.match(n1qlParser.IS); + this.state = 2253; + this.match(n1qlParser.MISSING); + break; + + case 35: + localctx = new ExprContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_expr); + this.state = 2254; + if (!this.precpred(this._ctx, 4)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 4)'); + } + this.state = 2255; + this.match(n1qlParser.IS); + this.state = 2256; + this.match(n1qlParser.NOT); + this.state = 2257; + this.match(n1qlParser.MISSING); + break; + + case 36: + localctx = new ExprContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_expr); + this.state = 2258; + if (!this.precpred(this._ctx, 3)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 3)'); + } + this.state = 2259; + this.match(n1qlParser.IS); + this.state = 2260; + this.valued(); + break; + + case 37: + localctx = new ExprContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_expr); + this.state = 2261; + if (!this.precpred(this._ctx, 2)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 2)'); + } + this.state = 2262; + this.match(n1qlParser.IS); + this.state = 2263; + this.match(n1qlParser.NOT); + this.state = 2264; + this.valued(); + break; + } + } + this.state = 2269; + this._errHandler.sync(this); + _alt = this._interp.adaptivePredict(this._input, 128, this._ctx); + } + } catch (error) { + if (error instanceof antlr4.error.RecognitionException) { + localctx.exception = error; + this._errHandler.reportError(this, error); + this._errHandler.recover(this, error); + } else { + throw error; + } + } finally { + this.unrollRecursionContexts(_parentctx); + } + return localctx; + } + + valued() { + let localctx = new ValuedContext(this, this._ctx, this.state); + this.enterRule(localctx, 392, n1qlParser.RULE_valued); + var _la = 0; // Token type + try { + this.enterOuterAlt(localctx, 1); + this.state = 2270; + _la = this._input.LA(1); + if (!(_la === n1qlParser.KNOWN || _la === n1qlParser.VALUED)) { + this._errHandler.recoverInline(this); + } else { + this._errHandler.reportMatch(this); + this.consume(); + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + c_expr() { + let localctx = new C_exprContext(this, this._ctx, this.state); + this.enterRule(localctx, 394, n1qlParser.RULE_c_expr); + try { + this.state = 2288; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 129, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 2272; + this.literal(); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 2273; + this.construction_expr(); + break; + + case 3: + this.enterOuterAlt(localctx, 3); + this.state = 2274; + this.match(n1qlParser.IDENT); + break; + + case 4: + this.enterOuterAlt(localctx, 4); + this.state = 2275; + this.match(n1qlParser.IDENT_ICASE); + break; + + case 5: + this.enterOuterAlt(localctx, 5); + this.state = 2276; + this.match(n1qlParser.SELF); + break; + + case 6: + this.enterOuterAlt(localctx, 6); + this.state = 2277; + this.param_expr(); + break; + + case 7: + this.enterOuterAlt(localctx, 7); + this.state = 2278; + this.function_expr(); + break; + + case 8: + this.enterOuterAlt(localctx, 8); + this.state = 2279; + this.match(n1qlParser.MINUS); + break; + + case 9: + this.enterOuterAlt(localctx, 9); + this.state = 2280; + this.case_expr(); + break; + + case 10: + this.enterOuterAlt(localctx, 10); + this.state = 2281; + this.collection_expr(); + break; + + case 11: + this.enterOuterAlt(localctx, 11); + this.state = 2282; + this.paren_expr(); + break; + + case 12: + this.enterOuterAlt(localctx, 12); + this.state = 2283; + this.match(n1qlParser.COVER); + this.state = 2284; + this.match(n1qlParser.LPAREN); + this.state = 2285; + this.expr(0); + this.state = 2286; + this.match(n1qlParser.RPAREN); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + b_expr(_p) { + if (_p === undefined) { + _p = 0; + } + const _parentctx = this._ctx; + const _parentState = this.state; + let localctx = new B_exprContext(this, this._ctx, _parentState); + let _prevctx = localctx; + const _startState = 396; + this.enterRecursionRule(localctx, 396, n1qlParser.RULE_b_expr, _p); + try { + this.enterOuterAlt(localctx, 1); + this.state = 2291; + this.c_expr(); + this._ctx.stop = this._input.LT(-1); + this.state = 2353; + this._errHandler.sync(this); + var _alt = this._interp.adaptivePredict(this._input, 131, this._ctx); + while (_alt != 2 && _alt != antlr4.atn.ATN.INVALID_ALT_NUMBER) { + if (_alt === 1) { + if (this._parseListeners !== null) { + this.triggerExitRuleEvent(); + } + _prevctx = localctx; + this.state = 2351; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 130, this._ctx); + switch (la_) { + case 1: + localctx = new B_exprContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_b_expr); + this.state = 2293; + if (!this.precpred(this._ctx, 6)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 6)'); + } + this.state = 2294; + this.match(n1qlParser.PLUS); + this.state = 2295; + this.b_expr(7); + break; + + case 2: + localctx = new B_exprContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_b_expr); + this.state = 2296; + if (!this.precpred(this._ctx, 5)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 5)'); + } + this.state = 2297; + this.match(n1qlParser.MINUS); + this.state = 2298; + this.b_expr(6); + break; + + case 3: + localctx = new B_exprContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_b_expr); + this.state = 2299; + if (!this.precpred(this._ctx, 4)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 4)'); + } + this.state = 2300; + this.match(n1qlParser.STAR); + this.state = 2301; + this.b_expr(5); + break; + + case 4: + localctx = new B_exprContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_b_expr); + this.state = 2302; + if (!this.precpred(this._ctx, 3)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 3)'); + } + this.state = 2303; + this.match(n1qlParser.DIV); + this.state = 2304; + this.b_expr(4); + break; + + case 5: + localctx = new B_exprContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_b_expr); + this.state = 2305; + if (!this.precpred(this._ctx, 2)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 2)'); + } + this.state = 2306; + this.match(n1qlParser.MOD); + this.state = 2307; + this.b_expr(3); + break; + + case 6: + localctx = new B_exprContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_b_expr); + this.state = 2308; + if (!this.precpred(this._ctx, 1)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 1)'); + } + this.state = 2309; + this.match(n1qlParser.CONCAT); + this.state = 2310; + this.b_expr(2); + break; + + case 7: + localctx = new B_exprContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_b_expr); + this.state = 2311; + if (!this.precpred(this._ctx, 14)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 14)'); + } + this.state = 2312; + this.match(n1qlParser.DOT); + this.state = 2313; + this.match(n1qlParser.IDENT); + break; + + case 8: + localctx = new B_exprContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_b_expr); + this.state = 2314; + if (!this.precpred(this._ctx, 13)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 13)'); + } + this.state = 2315; + this.match(n1qlParser.DOT); + this.state = 2316; + this.match(n1qlParser.IDENT_ICASE); + break; + + case 9: + localctx = new B_exprContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_b_expr); + this.state = 2317; + if (!this.precpred(this._ctx, 12)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 12)'); + } + this.state = 2318; + this.match(n1qlParser.DOT); + this.state = 2319; + this.match(n1qlParser.LBRACKET); + this.state = 2320; + this.expr(0); + this.state = 2321; + this.match(n1qlParser.RBRACKET); + break; + + case 10: + localctx = new B_exprContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_b_expr); + this.state = 2323; + if (!this.precpred(this._ctx, 11)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 11)'); + } + this.state = 2324; + this.match(n1qlParser.DOT); + this.state = 2325; + this.match(n1qlParser.LBRACKET); + this.state = 2326; + this.expr(0); + this.state = 2327; + this.match(n1qlParser.RBRACKET_ICASE); + break; + + case 11: + localctx = new B_exprContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_b_expr); + this.state = 2329; + if (!this.precpred(this._ctx, 10)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 10)'); + } + this.state = 2330; + this.match(n1qlParser.LBRACKET); + this.state = 2331; + this.expr(0); + this.state = 2332; + this.match(n1qlParser.RBRACKET); + break; + + case 12: + localctx = new B_exprContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_b_expr); + this.state = 2334; + if (!this.precpred(this._ctx, 9)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 9)'); + } + this.state = 2335; + this.match(n1qlParser.LBRACKET); + this.state = 2336; + this.expr(0); + this.state = 2337; + this.match(n1qlParser.COLON); + this.state = 2338; + this.match(n1qlParser.RBRACKET); + break; + + case 13: + localctx = new B_exprContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_b_expr); + this.state = 2340; + if (!this.precpred(this._ctx, 8)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 8)'); + } + this.state = 2341; + this.match(n1qlParser.LBRACKET); + this.state = 2342; + this.expr(0); + this.state = 2343; + this.match(n1qlParser.COLON); + this.state = 2344; + this.expr(0); + this.state = 2345; + this.match(n1qlParser.RBRACKET); + break; + + case 14: + localctx = new B_exprContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_b_expr); + this.state = 2347; + if (!this.precpred(this._ctx, 7)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 7)'); + } + this.state = 2348; + this.match(n1qlParser.LBRACKET); + this.state = 2349; + this.match(n1qlParser.STAR); + this.state = 2350; + this.match(n1qlParser.RBRACKET); + break; + } + } + this.state = 2355; + this._errHandler.sync(this); + _alt = this._interp.adaptivePredict(this._input, 131, this._ctx); + } + } catch (error) { + if (error instanceof antlr4.error.RecognitionException) { + localctx.exception = error; + this._errHandler.reportError(this, error); + this._errHandler.recover(this, error); + } else { + throw error; + } + } finally { + this.unrollRecursionContexts(_parentctx); + } + return localctx; + } + + literal() { + let localctx = new LiteralContext(this, this._ctx, this.state); + this.enterRule(localctx, 398, n1qlParser.RULE_literal); + var _la = 0; // Token type + try { + this.enterOuterAlt(localctx, 1); + this.state = 2356; + _la = this._input.LA(1); + if ( + !( + ((_la & ~0x1f) == 0 && + ((1 << _la) & ((1 << n1qlParser.STR) | (1 << n1qlParser.INT) | (1 << n1qlParser.NUM))) !== 0) || + _la === n1qlParser.FALSE || + _la === n1qlParser.MISSING || + _la === n1qlParser.NULL || + _la === n1qlParser.TRUE + ) + ) { + this._errHandler.recoverInline(this); + } else { + this._errHandler.reportMatch(this); + this.consume(); + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + construction_expr() { + let localctx = new Construction_exprContext(this, this._ctx, this.state); + this.enterRule(localctx, 400, n1qlParser.RULE_construction_expr); + try { + this.state = 2360; + this._errHandler.sync(this); + switch (this._input.LA(1)) { + case n1qlParser.LBRACE: + this.enterOuterAlt(localctx, 1); + this.state = 2358; + this.object(); + break; + case n1qlParser.LBRACKET: + this.enterOuterAlt(localctx, 2); + this.state = 2359; + this.array(); + break; + default: + throw new antlr4.error.NoViableAltException(this); + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + object() { + let localctx = new ObjectContext(this, this._ctx, this.state); + this.enterRule(localctx, 402, n1qlParser.RULE_object); + try { + this.enterOuterAlt(localctx, 1); + this.state = 2362; + this.match(n1qlParser.LBRACE); + this.state = 2363; + this.opt_members(); + this.state = 2364; + this.match(n1qlParser.RBRACE); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + opt_members() { + let localctx = new Opt_membersContext(this, this._ctx, this.state); + this.enterRule(localctx, 404, n1qlParser.RULE_opt_members); + try { + this.state = 2368; + this._errHandler.sync(this); + switch (this._input.LA(1)) { + case n1qlParser.RBRACE: + this.enterOuterAlt(localctx, 1); + + break; + case n1qlParser.STR: + case n1qlParser.INT: + case n1qlParser.NUM: + case n1qlParser.MINUS: + case n1qlParser.LPAREN: + case n1qlParser.LBRACE: + case n1qlParser.LBRACKET: + case n1qlParser.ANY: + case n1qlParser.ARRAY: + case n1qlParser.CASE: + case n1qlParser.CORRELATED: + case n1qlParser.COVER: + case n1qlParser.EVERY: + case n1qlParser.EXISTS: + case n1qlParser.FALSE: + case n1qlParser.FIRST: + case n1qlParser.MISSING: + case n1qlParser.NOT: + case n1qlParser.NTH_VALUE: + case n1qlParser.NULL: + case n1qlParser.OBJECT: + case n1qlParser.REPLACE: + case n1qlParser.SELF: + case n1qlParser.SOME: + case n1qlParser.SYSTEM: + case n1qlParser.TRUE: + case n1qlParser.IDENT_ICASE: + case n1qlParser.IDENT: + case n1qlParser.NAMED_PARAM: + case n1qlParser.POSITIONAL_PARAM: + case n1qlParser.NEXT_PARAM: + this.enterOuterAlt(localctx, 2); + this.state = 2367; + this.members(0); + break; + default: + throw new antlr4.error.NoViableAltException(this); + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + members(_p) { + if (_p === undefined) { + _p = 0; + } + const _parentctx = this._ctx; + const _parentState = this.state; + let localctx = new MembersContext(this, this._ctx, _parentState); + let _prevctx = localctx; + const _startState = 406; + this.enterRecursionRule(localctx, 406, n1qlParser.RULE_members, _p); + try { + this.enterOuterAlt(localctx, 1); + this.state = 2371; + this.member(); + this._ctx.stop = this._input.LT(-1); + this.state = 2378; + this._errHandler.sync(this); + var _alt = this._interp.adaptivePredict(this._input, 134, this._ctx); + while (_alt != 2 && _alt != antlr4.atn.ATN.INVALID_ALT_NUMBER) { + if (_alt === 1) { + if (this._parseListeners !== null) { + this.triggerExitRuleEvent(); + } + _prevctx = localctx; + localctx = new MembersContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_members); + this.state = 2373; + if (!this.precpred(this._ctx, 1)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 1)'); + } + this.state = 2374; + this.match(n1qlParser.COMMA); + this.state = 2375; + this.member(); + } + this.state = 2380; + this._errHandler.sync(this); + _alt = this._interp.adaptivePredict(this._input, 134, this._ctx); + } + } catch (error) { + if (error instanceof antlr4.error.RecognitionException) { + localctx.exception = error; + this._errHandler.reportError(this, error); + this._errHandler.recover(this, error); + } else { + throw error; + } + } finally { + this.unrollRecursionContexts(_parentctx); + } + return localctx; + } + + member() { + let localctx = new MemberContext(this, this._ctx, this.state); + this.enterRule(localctx, 408, n1qlParser.RULE_member); + try { + this.state = 2386; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 135, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 2381; + this.expr(0); + this.state = 2382; + this.match(n1qlParser.COLON); + this.state = 2383; + this.expr(0); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 2385; + this.expr(0); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + array() { + let localctx = new ArrayContext(this, this._ctx, this.state); + this.enterRule(localctx, 410, n1qlParser.RULE_array); + try { + this.enterOuterAlt(localctx, 1); + this.state = 2388; + this.match(n1qlParser.LBRACKET); + this.state = 2389; + this.opt_exprs(); + this.state = 2390; + this.match(n1qlParser.RBRACKET); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + opt_exprs() { + let localctx = new Opt_exprsContext(this, this._ctx, this.state); + this.enterRule(localctx, 412, n1qlParser.RULE_opt_exprs); + try { + this.state = 2394; + this._errHandler.sync(this); + switch (this._input.LA(1)) { + case n1qlParser.RPAREN: + case n1qlParser.RBRACKET: + this.enterOuterAlt(localctx, 1); + + break; + case n1qlParser.STR: + case n1qlParser.INT: + case n1qlParser.NUM: + case n1qlParser.MINUS: + case n1qlParser.LPAREN: + case n1qlParser.LBRACE: + case n1qlParser.LBRACKET: + case n1qlParser.ANY: + case n1qlParser.ARRAY: + case n1qlParser.CASE: + case n1qlParser.CORRELATED: + case n1qlParser.COVER: + case n1qlParser.EVERY: + case n1qlParser.EXISTS: + case n1qlParser.FALSE: + case n1qlParser.FIRST: + case n1qlParser.MISSING: + case n1qlParser.NOT: + case n1qlParser.NTH_VALUE: + case n1qlParser.NULL: + case n1qlParser.OBJECT: + case n1qlParser.REPLACE: + case n1qlParser.SELF: + case n1qlParser.SOME: + case n1qlParser.SYSTEM: + case n1qlParser.TRUE: + case n1qlParser.IDENT_ICASE: + case n1qlParser.IDENT: + case n1qlParser.NAMED_PARAM: + case n1qlParser.POSITIONAL_PARAM: + case n1qlParser.NEXT_PARAM: + this.enterOuterAlt(localctx, 2); + this.state = 2393; + this.exprs(0); + break; + default: + throw new antlr4.error.NoViableAltException(this); + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + exprs(_p) { + if (_p === undefined) { + _p = 0; + } + const _parentctx = this._ctx; + const _parentState = this.state; + let localctx = new ExprsContext(this, this._ctx, _parentState); + let _prevctx = localctx; + const _startState = 414; + this.enterRecursionRule(localctx, 414, n1qlParser.RULE_exprs, _p); + try { + this.enterOuterAlt(localctx, 1); + this.state = 2397; + this.expr(0); + this._ctx.stop = this._input.LT(-1); + this.state = 2404; + this._errHandler.sync(this); + var _alt = this._interp.adaptivePredict(this._input, 137, this._ctx); + while (_alt != 2 && _alt != antlr4.atn.ATN.INVALID_ALT_NUMBER) { + if (_alt === 1) { + if (this._parseListeners !== null) { + this.triggerExitRuleEvent(); + } + _prevctx = localctx; + localctx = new ExprsContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_exprs); + this.state = 2399; + if (!this.precpred(this._ctx, 1)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 1)'); + } + this.state = 2400; + this.match(n1qlParser.COMMA); + this.state = 2401; + this.expr(0); + } + this.state = 2406; + this._errHandler.sync(this); + _alt = this._interp.adaptivePredict(this._input, 137, this._ctx); + } + } catch (error) { + if (error instanceof antlr4.error.RecognitionException) { + localctx.exception = error; + this._errHandler.reportError(this, error); + this._errHandler.recover(this, error); + } else { + throw error; + } + } finally { + this.unrollRecursionContexts(_parentctx); + } + return localctx; + } + + param_expr() { + let localctx = new Param_exprContext(this, this._ctx, this.state); + this.enterRule(localctx, 416, n1qlParser.RULE_param_expr); + var _la = 0; // Token type + try { + this.enterOuterAlt(localctx, 1); + this.state = 2407; + _la = this._input.LA(1); + if ( + !( + ((_la - 238) & ~0x1f) == 0 && + ((1 << (_la - 238)) & + ((1 << (n1qlParser.NAMED_PARAM - 238)) | + (1 << (n1qlParser.POSITIONAL_PARAM - 238)) | + (1 << (n1qlParser.NEXT_PARAM - 238)))) !== + 0 + ) + ) { + this._errHandler.recoverInline(this); + } else { + this._errHandler.reportMatch(this); + this.consume(); + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + case_expr() { + let localctx = new Case_exprContext(this, this._ctx, this.state); + this.enterRule(localctx, 418, n1qlParser.RULE_case_expr); + try { + this.enterOuterAlt(localctx, 1); + this.state = 2409; + this.match(n1qlParser.CASE); + this.state = 2410; + this.simple_or_searched_case(); + this.state = 2411; + this.match(n1qlParser.END); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + simple_or_searched_case() { + let localctx = new Simple_or_searched_caseContext(this, this._ctx, this.state); + this.enterRule(localctx, 420, n1qlParser.RULE_simple_or_searched_case); + try { + this.state = 2415; + this._errHandler.sync(this); + switch (this._input.LA(1)) { + case n1qlParser.STR: + case n1qlParser.INT: + case n1qlParser.NUM: + case n1qlParser.MINUS: + case n1qlParser.LPAREN: + case n1qlParser.LBRACE: + case n1qlParser.LBRACKET: + case n1qlParser.ANY: + case n1qlParser.ARRAY: + case n1qlParser.CASE: + case n1qlParser.CORRELATED: + case n1qlParser.COVER: + case n1qlParser.EVERY: + case n1qlParser.EXISTS: + case n1qlParser.FALSE: + case n1qlParser.FIRST: + case n1qlParser.MISSING: + case n1qlParser.NOT: + case n1qlParser.NTH_VALUE: + case n1qlParser.NULL: + case n1qlParser.OBJECT: + case n1qlParser.REPLACE: + case n1qlParser.SELF: + case n1qlParser.SOME: + case n1qlParser.SYSTEM: + case n1qlParser.TRUE: + case n1qlParser.IDENT_ICASE: + case n1qlParser.IDENT: + case n1qlParser.NAMED_PARAM: + case n1qlParser.POSITIONAL_PARAM: + case n1qlParser.NEXT_PARAM: + this.enterOuterAlt(localctx, 1); + this.state = 2413; + this.simple_case(); + break; + case n1qlParser.WHEN: + this.enterOuterAlt(localctx, 2); + this.state = 2414; + this.searched_case(); + break; + default: + throw new antlr4.error.NoViableAltException(this); + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + simple_case() { + let localctx = new Simple_caseContext(this, this._ctx, this.state); + this.enterRule(localctx, 422, n1qlParser.RULE_simple_case); + try { + this.enterOuterAlt(localctx, 1); + this.state = 2417; + this.expr(0); + this.state = 2418; + this.when_thens(0); + this.state = 2419; + this.opt_else(); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + when_thens(_p) { + if (_p === undefined) { + _p = 0; + } + const _parentctx = this._ctx; + const _parentState = this.state; + let localctx = new When_thensContext(this, this._ctx, _parentState); + let _prevctx = localctx; + const _startState = 424; + this.enterRecursionRule(localctx, 424, n1qlParser.RULE_when_thens, _p); + try { + this.enterOuterAlt(localctx, 1); + this.state = 2422; + this.match(n1qlParser.WHEN); + this.state = 2423; + this.expr(0); + this.state = 2424; + this.match(n1qlParser.THEN); + this.state = 2425; + this.expr(0); + this._ctx.stop = this._input.LT(-1); + this.state = 2435; + this._errHandler.sync(this); + var _alt = this._interp.adaptivePredict(this._input, 139, this._ctx); + while (_alt != 2 && _alt != antlr4.atn.ATN.INVALID_ALT_NUMBER) { + if (_alt === 1) { + if (this._parseListeners !== null) { + this.triggerExitRuleEvent(); + } + _prevctx = localctx; + localctx = new When_thensContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_when_thens); + this.state = 2427; + if (!this.precpred(this._ctx, 1)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 1)'); + } + this.state = 2428; + this.match(n1qlParser.WHEN); + this.state = 2429; + this.expr(0); + this.state = 2430; + this.match(n1qlParser.THEN); + this.state = 2431; + this.expr(0); + } + this.state = 2437; + this._errHandler.sync(this); + _alt = this._interp.adaptivePredict(this._input, 139, this._ctx); + } + } catch (error) { + if (error instanceof antlr4.error.RecognitionException) { + localctx.exception = error; + this._errHandler.reportError(this, error); + this._errHandler.recover(this, error); + } else { + throw error; + } + } finally { + this.unrollRecursionContexts(_parentctx); + } + return localctx; + } + + searched_case() { + let localctx = new Searched_caseContext(this, this._ctx, this.state); + this.enterRule(localctx, 426, n1qlParser.RULE_searched_case); + try { + this.enterOuterAlt(localctx, 1); + this.state = 2438; + this.when_thens(0); + this.state = 2439; + this.opt_else(); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + opt_else() { + let localctx = new Opt_elseContext(this, this._ctx, this.state); + this.enterRule(localctx, 428, n1qlParser.RULE_opt_else); + try { + this.state = 2444; + this._errHandler.sync(this); + switch (this._input.LA(1)) { + case n1qlParser.END: + this.enterOuterAlt(localctx, 1); + + break; + case n1qlParser.ELSE: + this.enterOuterAlt(localctx, 2); + this.state = 2442; + this.match(n1qlParser.ELSE); + this.state = 2443; + this.expr(0); + break; + default: + throw new antlr4.error.NoViableAltException(this); + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + function_expr() { + let localctx = new Function_exprContext(this, this._ctx, this.state); + this.enterRule(localctx, 430, n1qlParser.RULE_function_expr); + try { + this.state = 2482; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 141, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 2446; + this.match(n1qlParser.NTH_VALUE); + this.state = 2447; + this.match(n1qlParser.LPAREN); + this.state = 2448; + this.exprs(0); + this.state = 2449; + this.match(n1qlParser.RPAREN); + this.state = 2450; + this.opt_from_first_last(); + this.state = 2451; + this.opt_nulls_treatment(); + this.state = 2452; + this.window_function_details(); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 2454; + this.function_name(); + this.state = 2455; + this.match(n1qlParser.LPAREN); + this.state = 2456; + this.opt_exprs(); + this.state = 2457; + this.match(n1qlParser.RPAREN); + this.state = 2458; + this.opt_filter(); + this.state = 2459; + this.opt_nulls_treatment(); + this.state = 2460; + this.opt_window_function(); + break; + + case 3: + this.enterOuterAlt(localctx, 3); + this.state = 2462; + this.function_name(); + this.state = 2463; + this.match(n1qlParser.LPAREN); + this.state = 2464; + this.agg_quantifier(); + this.state = 2465; + this.expr(0); + this.state = 2466; + this.match(n1qlParser.RPAREN); + this.state = 2467; + this.opt_filter(); + this.state = 2468; + this.opt_window_function(); + break; + + case 4: + this.enterOuterAlt(localctx, 4); + this.state = 2470; + this.function_name(); + this.state = 2471; + this.match(n1qlParser.LPAREN); + this.state = 2472; + this.match(n1qlParser.STAR); + this.state = 2473; + this.match(n1qlParser.RPAREN); + this.state = 2474; + this.opt_filter(); + this.state = 2475; + this.opt_window_function(); + break; + + case 5: + this.enterOuterAlt(localctx, 5); + this.state = 2477; + this.long_func_name(); + this.state = 2478; + this.match(n1qlParser.LPAREN); + this.state = 2479; + this.opt_exprs(); + this.state = 2480; + this.match(n1qlParser.RPAREN); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + function_name() { + let localctx = new Function_nameContext(this, this._ctx, this.state); + this.enterRule(localctx, 432, n1qlParser.RULE_function_name); + var _la = 0; // Token type + try { + this.enterOuterAlt(localctx, 1); + this.state = 2484; + _la = this._input.LA(1); + if (!(_la === n1qlParser.REPLACE || _la === n1qlParser.IDENT)) { + this._errHandler.recoverInline(this); + } else { + this._errHandler.reportMatch(this); + this.consume(); + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + collection_expr() { + let localctx = new Collection_exprContext(this, this._ctx, this.state); + this.enterRule(localctx, 434, n1qlParser.RULE_collection_expr); + try { + this.state = 2488; + this._errHandler.sync(this); + switch (this._input.LA(1)) { + case n1qlParser.ANY: + case n1qlParser.EVERY: + case n1qlParser.SOME: + this.enterOuterAlt(localctx, 1); + this.state = 2486; + this.collection_cond(); + break; + case n1qlParser.ARRAY: + case n1qlParser.FIRST: + case n1qlParser.OBJECT: + this.enterOuterAlt(localctx, 2); + this.state = 2487; + this.collection_xform(); + break; + default: + throw new antlr4.error.NoViableAltException(this); + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + collection_cond() { + let localctx = new Collection_condContext(this, this._ctx, this.state); + this.enterRule(localctx, 436, n1qlParser.RULE_collection_cond); + try { + this.state = 2519; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 143, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 2490; + this.match(n1qlParser.ANY); + this.state = 2491; + this.coll_bindings(0); + this.state = 2492; + this.satisfies(); + this.state = 2493; + this.match(n1qlParser.END); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 2495; + this.match(n1qlParser.SOME); + this.state = 2496; + this.coll_bindings(0); + this.state = 2497; + this.satisfies(); + this.state = 2498; + this.match(n1qlParser.END); + break; + + case 3: + this.enterOuterAlt(localctx, 3); + this.state = 2500; + this.match(n1qlParser.EVERY); + this.state = 2501; + this.coll_bindings(0); + this.state = 2502; + this.satisfies(); + this.state = 2503; + this.match(n1qlParser.END); + break; + + case 4: + this.enterOuterAlt(localctx, 4); + this.state = 2505; + this.match(n1qlParser.ANY); + this.state = 2506; + this.match(n1qlParser.AND); + this.state = 2507; + this.match(n1qlParser.EVERY); + this.state = 2508; + this.coll_bindings(0); + this.state = 2509; + this.satisfies(); + this.state = 2510; + this.match(n1qlParser.END); + break; + + case 5: + this.enterOuterAlt(localctx, 5); + this.state = 2512; + this.match(n1qlParser.SOME); + this.state = 2513; + this.match(n1qlParser.AND); + this.state = 2514; + this.match(n1qlParser.EVERY); + this.state = 2515; + this.coll_bindings(0); + this.state = 2516; + this.satisfies(); + this.state = 2517; + this.match(n1qlParser.END); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + coll_bindings(_p) { + if (_p === undefined) { + _p = 0; + } + const _parentctx = this._ctx; + const _parentState = this.state; + let localctx = new Coll_bindingsContext(this, this._ctx, _parentState); + let _prevctx = localctx; + const _startState = 438; + this.enterRecursionRule(localctx, 438, n1qlParser.RULE_coll_bindings, _p); + try { + this.enterOuterAlt(localctx, 1); + this.state = 2522; + this.coll_binding(); + this._ctx.stop = this._input.LT(-1); + this.state = 2529; + this._errHandler.sync(this); + var _alt = this._interp.adaptivePredict(this._input, 144, this._ctx); + while (_alt != 2 && _alt != antlr4.atn.ATN.INVALID_ALT_NUMBER) { + if (_alt === 1) { + if (this._parseListeners !== null) { + this.triggerExitRuleEvent(); + } + _prevctx = localctx; + localctx = new Coll_bindingsContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_coll_bindings); + this.state = 2524; + if (!this.precpred(this._ctx, 1)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 1)'); + } + this.state = 2525; + this.match(n1qlParser.COMMA); + this.state = 2526; + this.coll_binding(); + } + this.state = 2531; + this._errHandler.sync(this); + _alt = this._interp.adaptivePredict(this._input, 144, this._ctx); + } + } catch (error) { + if (error instanceof antlr4.error.RecognitionException) { + localctx.exception = error; + this._errHandler.reportError(this, error); + this._errHandler.recover(this, error); + } else { + throw error; + } + } finally { + this.unrollRecursionContexts(_parentctx); + } + return localctx; + } + + coll_binding() { + let localctx = new Coll_bindingContext(this, this._ctx, this.state); + this.enterRule(localctx, 440, n1qlParser.RULE_coll_binding); + try { + this.state = 2552; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 145, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 2532; + this.variable(); + this.state = 2533; + this.match(n1qlParser.IN); + this.state = 2534; + this.expr(0); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 2536; + this.variable(); + this.state = 2537; + this.match(n1qlParser.WITHIN); + this.state = 2538; + this.expr(0); + break; + + case 3: + this.enterOuterAlt(localctx, 3); + this.state = 2540; + this.variable(); + this.state = 2541; + this.match(n1qlParser.COLON); + this.state = 2542; + this.variable(); + this.state = 2543; + this.match(n1qlParser.IN); + this.state = 2544; + this.expr(0); + break; + + case 4: + this.enterOuterAlt(localctx, 4); + this.state = 2546; + this.variable(); + this.state = 2547; + this.match(n1qlParser.COLON); + this.state = 2548; + this.variable(); + this.state = 2549; + this.match(n1qlParser.WITHIN); + this.state = 2550; + this.expr(0); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + satisfies() { + let localctx = new SatisfiesContext(this, this._ctx, this.state); + this.enterRule(localctx, 442, n1qlParser.RULE_satisfies); + try { + this.enterOuterAlt(localctx, 1); + this.state = 2554; + this.match(n1qlParser.SATISFIES); + this.state = 2555; + this.expr(0); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + collection_xform() { + let localctx = new Collection_xformContext(this, this._ctx, this.state); + this.enterRule(localctx, 444, n1qlParser.RULE_collection_xform); + try { + this.state = 2580; + this._errHandler.sync(this); + switch (this._input.LA(1)) { + case n1qlParser.ARRAY: + this.enterOuterAlt(localctx, 1); + this.state = 2557; + this.match(n1qlParser.ARRAY); + this.state = 2558; + this.expr(0); + this.state = 2559; + this.match(n1qlParser.FOR); + this.state = 2560; + this.coll_bindings(0); + this.state = 2561; + this.opt_when(); + this.state = 2562; + this.match(n1qlParser.END); + break; + case n1qlParser.FIRST: + this.enterOuterAlt(localctx, 2); + this.state = 2564; + this.match(n1qlParser.FIRST); + this.state = 2565; + this.expr(0); + this.state = 2566; + this.match(n1qlParser.FOR); + this.state = 2567; + this.coll_bindings(0); + this.state = 2568; + this.opt_when(); + this.state = 2569; + this.match(n1qlParser.END); + break; + case n1qlParser.OBJECT: + this.enterOuterAlt(localctx, 3); + this.state = 2571; + this.match(n1qlParser.OBJECT); + this.state = 2572; + this.expr(0); + this.state = 2573; + this.match(n1qlParser.COLON); + this.state = 2574; + this.expr(0); + this.state = 2575; + this.match(n1qlParser.FOR); + this.state = 2576; + this.coll_bindings(0); + this.state = 2577; + this.opt_when(); + this.state = 2578; + this.match(n1qlParser.END); + break; + default: + throw new antlr4.error.NoViableAltException(this); + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + paren_expr() { + let localctx = new Paren_exprContext(this, this._ctx, this.state); + this.enterRule(localctx, 446, n1qlParser.RULE_paren_expr); + try { + this.state = 2591; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 147, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 2582; + this.match(n1qlParser.LPAREN); + this.state = 2583; + this.expr(0); + this.state = 2584; + this.match(n1qlParser.RPAREN); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 2586; + this.match(n1qlParser.LPAREN); + this.state = 2587; + this.all_expr(); + this.state = 2588; + this.match(n1qlParser.RPAREN); + break; + + case 3: + this.enterOuterAlt(localctx, 3); + this.state = 2590; + this.subquery_expr(); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + subquery_expr() { + let localctx = new Subquery_exprContext(this, this._ctx, this.state); + this.enterRule(localctx, 448, n1qlParser.RULE_subquery_expr); + try { + this.state = 2602; + this._errHandler.sync(this); + switch (this._input.LA(1)) { + case n1qlParser.CORRELATED: + this.enterOuterAlt(localctx, 1); + this.state = 2593; + this.match(n1qlParser.CORRELATED); + this.state = 2594; + this.match(n1qlParser.LPAREN); + this.state = 2595; + this.fullselect(); + this.state = 2596; + this.match(n1qlParser.RPAREN); + break; + case n1qlParser.LPAREN: + this.enterOuterAlt(localctx, 2); + this.state = 2598; + this.match(n1qlParser.LPAREN); + this.state = 2599; + this.fullselect(); + this.state = 2600; + this.match(n1qlParser.RPAREN); + break; + default: + throw new antlr4.error.NoViableAltException(this); + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + expr_input() { + let localctx = new Expr_inputContext(this, this._ctx, this.state); + this.enterRule(localctx, 450, n1qlParser.RULE_expr_input); + try { + this.state = 2606; + this._errHandler.sync(this); + switch (this._input.LA(1)) { + case n1qlParser.STR: + case n1qlParser.INT: + case n1qlParser.NUM: + case n1qlParser.MINUS: + case n1qlParser.LPAREN: + case n1qlParser.LBRACE: + case n1qlParser.LBRACKET: + case n1qlParser.ANY: + case n1qlParser.ARRAY: + case n1qlParser.CASE: + case n1qlParser.CORRELATED: + case n1qlParser.COVER: + case n1qlParser.EVERY: + case n1qlParser.EXISTS: + case n1qlParser.FALSE: + case n1qlParser.FIRST: + case n1qlParser.MISSING: + case n1qlParser.NOT: + case n1qlParser.NTH_VALUE: + case n1qlParser.NULL: + case n1qlParser.OBJECT: + case n1qlParser.REPLACE: + case n1qlParser.SELF: + case n1qlParser.SOME: + case n1qlParser.SYSTEM: + case n1qlParser.TRUE: + case n1qlParser.IDENT_ICASE: + case n1qlParser.IDENT: + case n1qlParser.NAMED_PARAM: + case n1qlParser.POSITIONAL_PARAM: + case n1qlParser.NEXT_PARAM: + this.enterOuterAlt(localctx, 1); + this.state = 2604; + this.expr(0); + break; + case n1qlParser.ALL: + case n1qlParser.DISTINCT: + case n1qlParser.EACH: + this.enterOuterAlt(localctx, 2); + this.state = 2605; + this.all_expr(); + break; + default: + throw new antlr4.error.NoViableAltException(this); + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + all_expr() { + let localctx = new All_exprContext(this, this._ctx, this.state); + this.enterRule(localctx, 452, n1qlParser.RULE_all_expr); + try { + this.state = 2617; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 150, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 2608; + this.all(); + this.state = 2609; + this.expr(0); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 2611; + this.all(); + this.state = 2612; + this.match(n1qlParser.DISTINCT); + this.state = 2613; + this.expr(0); + break; + + case 3: + this.enterOuterAlt(localctx, 3); + this.state = 2615; + this.match(n1qlParser.DISTINCT); + this.state = 2616; + this.expr(0); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + opt_window_clause() { + let localctx = new Opt_window_clauseContext(this, this._ctx, this.state); + this.enterRule(localctx, 454, n1qlParser.RULE_opt_window_clause); + try { + this.state = 2622; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 151, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 2620; + this.match(n1qlParser.WINDOW); + this.state = 2621; + this.window_list(0); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + window_list(_p) { + if (_p === undefined) { + _p = 0; + } + const _parentctx = this._ctx; + const _parentState = this.state; + let localctx = new Window_listContext(this, this._ctx, _parentState); + let _prevctx = localctx; + const _startState = 456; + this.enterRecursionRule(localctx, 456, n1qlParser.RULE_window_list, _p); + try { + this.enterOuterAlt(localctx, 1); + this.state = 2625; + this.window_term(); + this._ctx.stop = this._input.LT(-1); + this.state = 2632; + this._errHandler.sync(this); + var _alt = this._interp.adaptivePredict(this._input, 152, this._ctx); + while (_alt != 2 && _alt != antlr4.atn.ATN.INVALID_ALT_NUMBER) { + if (_alt === 1) { + if (this._parseListeners !== null) { + this.triggerExitRuleEvent(); + } + _prevctx = localctx; + localctx = new Window_listContext(this, _parentctx, _parentState); + this.pushNewRecursionContext(localctx, _startState, n1qlParser.RULE_window_list); + this.state = 2627; + if (!this.precpred(this._ctx, 1)) { + throw new antlr4.error.FailedPredicateException(this, 'this.precpred(this._ctx, 1)'); + } + this.state = 2628; + this.match(n1qlParser.COMMA); + this.state = 2629; + this.window_term(); + } + this.state = 2634; + this._errHandler.sync(this); + _alt = this._interp.adaptivePredict(this._input, 152, this._ctx); + } + } catch (error) { + if (error instanceof antlr4.error.RecognitionException) { + localctx.exception = error; + this._errHandler.reportError(this, error); + this._errHandler.recover(this, error); + } else { + throw error; + } + } finally { + this.unrollRecursionContexts(_parentctx); + } + return localctx; + } + + window_term() { + let localctx = new Window_termContext(this, this._ctx, this.state); + this.enterRule(localctx, 458, n1qlParser.RULE_window_term); + try { + this.enterOuterAlt(localctx, 1); + this.state = 2635; + this.match(n1qlParser.IDENT); + this.state = 2636; + this.match(n1qlParser.AS); + this.state = 2637; + this.window_specification(); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + window_specification() { + let localctx = new Window_specificationContext(this, this._ctx, this.state); + this.enterRule(localctx, 460, n1qlParser.RULE_window_specification); + try { + this.enterOuterAlt(localctx, 1); + this.state = 2639; + this.match(n1qlParser.LPAREN); + this.state = 2640; + this.opt_window_name(); + this.state = 2641; + this.opt_window_partition(); + this.state = 2642; + this.opt_order_by(); + this.state = 2643; + this.opt_window_frame(); + this.state = 2644; + this.match(n1qlParser.RPAREN); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + opt_window_name() { + let localctx = new Opt_window_nameContext(this, this._ctx, this.state); + this.enterRule(localctx, 462, n1qlParser.RULE_opt_window_name); + try { + this.state = 2648; + this._errHandler.sync(this); + switch (this._input.LA(1)) { + case n1qlParser.RPAREN: + case n1qlParser.GROUPS: + case n1qlParser.ORDER: + case n1qlParser.PARTITION: + case n1qlParser.RANGE: + case n1qlParser.ROWS: + this.enterOuterAlt(localctx, 1); + + break; + case n1qlParser.IDENT: + this.enterOuterAlt(localctx, 2); + this.state = 2647; + this.match(n1qlParser.IDENT); + break; + default: + throw new antlr4.error.NoViableAltException(this); + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + opt_window_partition() { + let localctx = new Opt_window_partitionContext(this, this._ctx, this.state); + this.enterRule(localctx, 464, n1qlParser.RULE_opt_window_partition); + try { + this.state = 2654; + this._errHandler.sync(this); + switch (this._input.LA(1)) { + case n1qlParser.RPAREN: + case n1qlParser.GROUPS: + case n1qlParser.ORDER: + case n1qlParser.RANGE: + case n1qlParser.ROWS: + this.enterOuterAlt(localctx, 1); + + break; + case n1qlParser.PARTITION: + this.enterOuterAlt(localctx, 2); + this.state = 2651; + this.match(n1qlParser.PARTITION); + this.state = 2652; + this.match(n1qlParser.BY); + this.state = 2653; + this.exprs(0); + break; + default: + throw new antlr4.error.NoViableAltException(this); + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + opt_window_frame() { + let localctx = new Opt_window_frameContext(this, this._ctx, this.state); + this.enterRule(localctx, 466, n1qlParser.RULE_opt_window_frame); + try { + this.state = 2661; + this._errHandler.sync(this); + switch (this._input.LA(1)) { + case n1qlParser.RPAREN: + this.enterOuterAlt(localctx, 1); + + break; + case n1qlParser.GROUPS: + case n1qlParser.RANGE: + case n1qlParser.ROWS: + this.enterOuterAlt(localctx, 2); + this.state = 2657; + this.window_frame_modifier(); + this.state = 2658; + this.window_frame_extents(); + this.state = 2659; + this.opt_window_frame_exclusion(); + break; + default: + throw new antlr4.error.NoViableAltException(this); + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + window_frame_modifier() { + let localctx = new Window_frame_modifierContext(this, this._ctx, this.state); + this.enterRule(localctx, 468, n1qlParser.RULE_window_frame_modifier); + var _la = 0; // Token type + try { + this.enterOuterAlt(localctx, 1); + this.state = 2663; + _la = this._input.LA(1); + if (!(_la === n1qlParser.GROUPS || _la === n1qlParser.RANGE || _la === n1qlParser.ROWS)) { + this._errHandler.recoverInline(this); + } else { + this._errHandler.reportMatch(this); + this.consume(); + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + opt_window_frame_exclusion() { + let localctx = new Opt_window_frame_exclusionContext(this, this._ctx, this.state); + this.enterRule(localctx, 470, n1qlParser.RULE_opt_window_frame_exclusion); + try { + this.state = 2676; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 156, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 2666; + this.match(n1qlParser.EXCLUDE); + this.state = 2667; + this.match(n1qlParser.NO); + this.state = 2668; + this.match(n1qlParser.OTHERS); + break; + + case 3: + this.enterOuterAlt(localctx, 3); + this.state = 2669; + this.match(n1qlParser.EXCLUDE); + this.state = 2670; + this.match(n1qlParser.CURRENT); + this.state = 2671; + this.match(n1qlParser.ROW); + break; + + case 4: + this.enterOuterAlt(localctx, 4); + this.state = 2672; + this.match(n1qlParser.EXCLUDE); + this.state = 2673; + this.match(n1qlParser.TIES); + break; + + case 5: + this.enterOuterAlt(localctx, 5); + this.state = 2674; + this.match(n1qlParser.EXCLUDE); + this.state = 2675; + this.match(n1qlParser.GROUP); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + window_frame_extents() { + let localctx = new Window_frame_extentsContext(this, this._ctx, this.state); + this.enterRule(localctx, 472, n1qlParser.RULE_window_frame_extents); + try { + this.state = 2684; + this._errHandler.sync(this); + switch (this._input.LA(1)) { + case n1qlParser.STR: + case n1qlParser.INT: + case n1qlParser.NUM: + case n1qlParser.MINUS: + case n1qlParser.LPAREN: + case n1qlParser.LBRACE: + case n1qlParser.LBRACKET: + case n1qlParser.ANY: + case n1qlParser.ARRAY: + case n1qlParser.CASE: + case n1qlParser.CORRELATED: + case n1qlParser.COVER: + case n1qlParser.CURRENT: + case n1qlParser.EVERY: + case n1qlParser.EXISTS: + case n1qlParser.FALSE: + case n1qlParser.FIRST: + case n1qlParser.MISSING: + case n1qlParser.NOT: + case n1qlParser.NTH_VALUE: + case n1qlParser.NULL: + case n1qlParser.OBJECT: + case n1qlParser.REPLACE: + case n1qlParser.SELF: + case n1qlParser.SOME: + case n1qlParser.SYSTEM: + case n1qlParser.TRUE: + case n1qlParser.UNBOUNDED: + case n1qlParser.IDENT_ICASE: + case n1qlParser.IDENT: + case n1qlParser.NAMED_PARAM: + case n1qlParser.POSITIONAL_PARAM: + case n1qlParser.NEXT_PARAM: + this.enterOuterAlt(localctx, 1); + this.state = 2678; + this.window_frame_extent(); + break; + case n1qlParser.BETWEEN: + this.enterOuterAlt(localctx, 2); + this.state = 2679; + this.match(n1qlParser.BETWEEN); + this.state = 2680; + this.window_frame_extent(); + this.state = 2681; + this.match(n1qlParser.AND); + this.state = 2682; + this.window_frame_extent(); + break; + default: + throw new antlr4.error.NoViableAltException(this); + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + window_frame_extent() { + let localctx = new Window_frame_extentContext(this, this._ctx, this.state); + this.enterRule(localctx, 474, n1qlParser.RULE_window_frame_extent); + try { + this.state = 2695; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 158, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 2686; + this.match(n1qlParser.UNBOUNDED); + this.state = 2687; + this.match(n1qlParser.PRECEDING); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 2688; + this.match(n1qlParser.UNBOUNDED); + this.state = 2689; + this.match(n1qlParser.FOLLOWING); + break; + + case 3: + this.enterOuterAlt(localctx, 3); + this.state = 2690; + this.match(n1qlParser.CURRENT); + this.state = 2691; + this.match(n1qlParser.ROW); + break; + + case 4: + this.enterOuterAlt(localctx, 4); + this.state = 2692; + this.expr(0); + this.state = 2693; + this.window_frame_valexpr_modifier(); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + window_frame_valexpr_modifier() { + let localctx = new Window_frame_valexpr_modifierContext(this, this._ctx, this.state); + this.enterRule(localctx, 476, n1qlParser.RULE_window_frame_valexpr_modifier); + var _la = 0; // Token type + try { + this.enterOuterAlt(localctx, 1); + this.state = 2697; + _la = this._input.LA(1); + if (!(_la === n1qlParser.FOLLOWING || _la === n1qlParser.PRECEDING)) { + this._errHandler.recoverInline(this); + } else { + this._errHandler.reportMatch(this); + this.consume(); + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + opt_nulls_treatment() { + let localctx = new Opt_nulls_treatmentContext(this, this._ctx, this.state); + this.enterRule(localctx, 478, n1qlParser.RULE_opt_nulls_treatment); + try { + this.state = 2701; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 159, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 2700; + this.nulls_treatment(); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + nulls_treatment() { + let localctx = new Nulls_treatmentContext(this, this._ctx, this.state); + this.enterRule(localctx, 480, n1qlParser.RULE_nulls_treatment); + try { + this.state = 2707; + this._errHandler.sync(this); + switch (this._input.LA(1)) { + case n1qlParser.RESPECT: + this.enterOuterAlt(localctx, 1); + this.state = 2703; + this.match(n1qlParser.RESPECT); + this.state = 2704; + this.match(n1qlParser.NULLS); + break; + case n1qlParser.IGNORE: + this.enterOuterAlt(localctx, 2); + this.state = 2705; + this.match(n1qlParser.IGNORE); + this.state = 2706; + this.match(n1qlParser.NULLS); + break; + default: + throw new antlr4.error.NoViableAltException(this); + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + opt_from_first_last() { + let localctx = new Opt_from_first_lastContext(this, this._ctx, this.state); + this.enterRule(localctx, 482, n1qlParser.RULE_opt_from_first_last); + try { + this.state = 2712; + this._errHandler.sync(this); + switch (this._input.LA(1)) { + case n1qlParser.IGNORE: + case n1qlParser.OVER: + case n1qlParser.RESPECT: + this.enterOuterAlt(localctx, 1); + + break; + case n1qlParser.FROM: + this.enterOuterAlt(localctx, 2); + this.state = 2710; + this.match(n1qlParser.FROM); + this.state = 2711; + this.first_last(); + break; + default: + throw new antlr4.error.NoViableAltException(this); + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + agg_quantifier() { + let localctx = new Agg_quantifierContext(this, this._ctx, this.state); + this.enterRule(localctx, 484, n1qlParser.RULE_agg_quantifier); + var _la = 0; // Token type + try { + this.enterOuterAlt(localctx, 1); + this.state = 2714; + _la = this._input.LA(1); + if (!(_la === n1qlParser.ALL || _la === n1qlParser.DISTINCT)) { + this._errHandler.recoverInline(this); + } else { + this._errHandler.reportMatch(this); + this.consume(); + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + opt_filter() { + let localctx = new Opt_filterContext(this, this._ctx, this.state); + this.enterRule(localctx, 486, n1qlParser.RULE_opt_filter); + try { + this.state = 2722; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 162, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 2717; + this.match(n1qlParser.FILTER); + this.state = 2718; + this.match(n1qlParser.LPAREN); + this.state = 2719; + this.where(); + this.state = 2720; + this.match(n1qlParser.RPAREN); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + opt_window_function() { + let localctx = new Opt_window_functionContext(this, this._ctx, this.state); + this.enterRule(localctx, 488, n1qlParser.RULE_opt_window_function); + try { + this.state = 2726; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 163, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 2725; + this.window_function_details(); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + window_function_details() { + let localctx = new Window_function_detailsContext(this, this._ctx, this.state); + this.enterRule(localctx, 490, n1qlParser.RULE_window_function_details); + try { + this.state = 2732; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 164, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + this.state = 2728; + this.match(n1qlParser.OVER); + this.state = 2729; + this.match(n1qlParser.IDENT); + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 2730; + this.match(n1qlParser.OVER); + this.state = 2731; + this.window_specification(); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + start_transaction() { + let localctx = new Start_transactionContext(this, this._ctx, this.state); + this.enterRule(localctx, 492, n1qlParser.RULE_start_transaction); + try { + this.enterOuterAlt(localctx, 1); + this.state = 2734; + this.start_or_begin(); + this.state = 2735; + this.transaction(); + this.state = 2736; + this.opt_isolation_level(); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + commit_transaction() { + let localctx = new Commit_transactionContext(this, this._ctx, this.state); + this.enterRule(localctx, 494, n1qlParser.RULE_commit_transaction); + try { + this.enterOuterAlt(localctx, 1); + this.state = 2738; + this.match(n1qlParser.COMMIT); + this.state = 2739; + this.opt_transaction(); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + rollback_transaction() { + let localctx = new Rollback_transactionContext(this, this._ctx, this.state); + this.enterRule(localctx, 496, n1qlParser.RULE_rollback_transaction); + try { + this.enterOuterAlt(localctx, 1); + this.state = 2741; + this.match(n1qlParser.ROLLBACK); + this.state = 2742; + this.opt_transaction(); + this.state = 2743; + this.opt_savepoint(); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + start_or_begin() { + let localctx = new Start_or_beginContext(this, this._ctx, this.state); + this.enterRule(localctx, 498, n1qlParser.RULE_start_or_begin); + var _la = 0; // Token type + try { + this.enterOuterAlt(localctx, 1); + this.state = 2745; + _la = this._input.LA(1); + if (!(_la === n1qlParser.BEGIN || _la === n1qlParser.START)) { + this._errHandler.recoverInline(this); + } else { + this._errHandler.reportMatch(this); + this.consume(); + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + opt_transaction() { + let localctx = new Opt_transactionContext(this, this._ctx, this.state); + this.enterRule(localctx, 500, n1qlParser.RULE_opt_transaction); + try { + this.state = 2749; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 165, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 2748; + this.transaction(); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + transaction() { + let localctx = new TransactionContext(this, this._ctx, this.state); + this.enterRule(localctx, 502, n1qlParser.RULE_transaction); + var _la = 0; // Token type + try { + this.enterOuterAlt(localctx, 1); + this.state = 2751; + _la = this._input.LA(1); + if ( + !( + ((_la - 205) & ~0x1f) == 0 && + ((1 << (_la - 205)) & + ((1 << (n1qlParser.TRAN - 205)) | + (1 << (n1qlParser.TRANSACTION - 205)) | + (1 << (n1qlParser.WORK - 205)))) !== + 0 + ) + ) { + this._errHandler.recoverInline(this); + } else { + this._errHandler.reportMatch(this); + this.consume(); + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + opt_savepoint() { + let localctx = new Opt_savepointContext(this, this._ctx, this.state); + this.enterRule(localctx, 504, n1qlParser.RULE_opt_savepoint); + try { + this.state = 2757; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 166, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 2754; + this.match(n1qlParser.TO); + this.state = 2755; + this.match(n1qlParser.SAVEPOINT); + this.state = 2756; + this.savepoint_name(); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + savepoint_name() { + let localctx = new Savepoint_nameContext(this, this._ctx, this.state); + this.enterRule(localctx, 506, n1qlParser.RULE_savepoint_name); + try { + this.enterOuterAlt(localctx, 1); + this.state = 2759; + this.match(n1qlParser.IDENT); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + opt_isolation_level() { + let localctx = new Opt_isolation_levelContext(this, this._ctx, this.state); + this.enterRule(localctx, 508, n1qlParser.RULE_opt_isolation_level); + try { + this.state = 2763; + this._errHandler.sync(this); + var la_ = this._interp.adaptivePredict(this._input, 167, this._ctx); + switch (la_) { + case 1: + this.enterOuterAlt(localctx, 1); + + break; + + case 2: + this.enterOuterAlt(localctx, 2); + this.state = 2762; + this.isolation_level(); + break; + } + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + isolation_level() { + let localctx = new Isolation_levelContext(this, this._ctx, this.state); + this.enterRule(localctx, 510, n1qlParser.RULE_isolation_level); + try { + this.enterOuterAlt(localctx, 1); + this.state = 2765; + this.match(n1qlParser.ISOLATION); + this.state = 2766; + this.match(n1qlParser.LEVEL); + this.state = 2767; + this.isolation_val(); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + isolation_val() { + let localctx = new Isolation_valContext(this, this._ctx, this.state); + this.enterRule(localctx, 512, n1qlParser.RULE_isolation_val); + try { + this.enterOuterAlt(localctx, 1); + this.state = 2769; + this.match(n1qlParser.READ); + this.state = 2770; + this.match(n1qlParser.COMMITTED); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + set_transaction_isolation() { + let localctx = new Set_transaction_isolationContext(this, this._ctx, this.state); + this.enterRule(localctx, 514, n1qlParser.RULE_set_transaction_isolation); + try { + this.enterOuterAlt(localctx, 1); + this.state = 2772; + this.match(n1qlParser.SET); + this.state = 2773; + this.match(n1qlParser.TRANSACTION); + this.state = 2774; + this.isolation_level(); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + savepoint() { + let localctx = new SavepointContext(this, this._ctx, this.state); + this.enterRule(localctx, 516, n1qlParser.RULE_savepoint); + try { + this.enterOuterAlt(localctx, 1); + this.state = 2776; + this.match(n1qlParser.SAVEPOINT); + this.state = 2777; + this.savepoint_name(); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + if_exists() { + let localctx = new If_existsContext(this, this._ctx, this.state); + this.enterRule(localctx, 518, n1qlParser.RULE_if_exists); + try { + this.enterOuterAlt(localctx, 1); + this.state = 2779; + this.match(n1qlParser.IF); + this.state = 2780; + this.match(n1qlParser.EXISTS); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } + + if_not_exists() { + let localctx = new If_not_existsContext(this, this._ctx, this.state); + this.enterRule(localctx, 520, n1qlParser.RULE_if_not_exists); + try { + this.enterOuterAlt(localctx, 1); + this.state = 2782; + this.match(n1qlParser.IF); + this.state = 2783; + this.match(n1qlParser.NOT); + this.state = 2784; + this.match(n1qlParser.EXISTS); + } catch (re) { + if (re instanceof antlr4.error.RecognitionException) { + localctx.exception = re; + this._errHandler.reportError(this, re); + this._errHandler.recover(this, re); + } else { + throw re; + } + } finally { + this.exitRule(); + } + return localctx; + } +} + +n1qlParser.EOF = antlr4.Token.EOF; +n1qlParser.STR = 1; +n1qlParser.INT = 2; +n1qlParser.NUM = 3; +n1qlParser.BLOCK_COMMENT = 4; +n1qlParser.LINE_COMMENT = 5; +n1qlParser.WHITESPACE = 6; +n1qlParser.DOT = 7; +n1qlParser.PLUS = 8; +n1qlParser.MINUS = 9; +n1qlParser.STAR = 10; +n1qlParser.DIV = 11; +n1qlParser.MOD = 12; +n1qlParser.DEQ = 13; +n1qlParser.EQ = 14; +n1qlParser.NE = 15; +n1qlParser.LT = 16; +n1qlParser.LE = 17; +n1qlParser.GT = 18; +n1qlParser.GE = 19; +n1qlParser.CONCAT = 20; +n1qlParser.LPAREN = 21; +n1qlParser.RPAREN = 22; +n1qlParser.LBRACE = 23; +n1qlParser.RBRACE = 24; +n1qlParser.COMMA = 25; +n1qlParser.COLON = 26; +n1qlParser.LBRACKET = 27; +n1qlParser.RBRACKET = 28; +n1qlParser.RBRACKET_ICASE = 29; +n1qlParser.SEMI = 30; +n1qlParser.NOT_A_TOKEN = 31; +n1qlParser.ADVISE = 32; +n1qlParser.ALL = 33; +n1qlParser.ALTER = 34; +n1qlParser.ANALYZE = 35; +n1qlParser.AND = 36; +n1qlParser.ANY = 37; +n1qlParser.ARRAY = 38; +n1qlParser.AS = 39; +n1qlParser.ASC = 40; +n1qlParser.AT = 41; +n1qlParser.BEGIN = 42; +n1qlParser.BETWEEN = 43; +n1qlParser.BINARY = 44; +n1qlParser.BOOLEAN = 45; +n1qlParser.BREAK = 46; +n1qlParser.BUCKET = 47; +n1qlParser.BUILD = 48; +n1qlParser.BY = 49; +n1qlParser.CALL = 50; +n1qlParser.CASE = 51; +n1qlParser.CAST = 52; +n1qlParser.CLUSTER = 53; +n1qlParser.COLLATE = 54; +n1qlParser.COLLECTION = 55; +n1qlParser.COMMIT = 56; +n1qlParser.COMMITTED = 57; +n1qlParser.CONNECT = 58; +n1qlParser.CONTINUE = 59; +n1qlParser.CORRELATED = 60; +n1qlParser.COVER = 61; +n1qlParser.CREATE = 62; +n1qlParser.CURRENT = 63; +n1qlParser.DATABASE = 64; +n1qlParser.DATASET = 65; +n1qlParser.DATASTORE = 66; +n1qlParser.DECLARE = 67; +n1qlParser.DECREMENT = 68; +n1qlParser.DELETE_ = 69; +n1qlParser.DERIVED = 70; +n1qlParser.DESC = 71; +n1qlParser.DESCRIBE = 72; +n1qlParser.DISTINCT = 73; +n1qlParser.DO = 74; +n1qlParser.DROP = 75; +n1qlParser.EACH = 76; +n1qlParser.ELEMENT = 77; +n1qlParser.ELSE = 78; +n1qlParser.END = 79; +n1qlParser.EVERY = 80; +n1qlParser.EXCEPT = 81; +n1qlParser.EXCLUDE = 82; +n1qlParser.EXECUTE = 83; +n1qlParser.EXISTS = 84; +n1qlParser.EXPLAIN = 85; +n1qlParser.FALSE = 86; +n1qlParser.FETCH = 87; +n1qlParser.FILTER = 88; +n1qlParser.FIRST = 89; +n1qlParser.FLATTEN = 90; +n1qlParser.FLUSH = 91; +n1qlParser.FOLLOWING = 92; +n1qlParser.FOR = 93; +n1qlParser.FORCE = 94; +n1qlParser.FROM = 95; +n1qlParser.FTS = 96; +n1qlParser.FUNCTION = 97; +n1qlParser.GOLANG = 98; +n1qlParser.GRANT = 99; +n1qlParser.GROUP = 100; +n1qlParser.GROUPS = 101; +n1qlParser.GSI = 102; +n1qlParser.HASH = 103; +n1qlParser.HAVING = 104; +n1qlParser.IF = 105; +n1qlParser.IGNORE = 106; +n1qlParser.ILIKE = 107; +n1qlParser.IN = 108; +n1qlParser.INCLUDE = 109; +n1qlParser.INCREMENT = 110; +n1qlParser.INDEX = 111; +n1qlParser.INFER = 112; +n1qlParser.INLINE = 113; +n1qlParser.INNER = 114; +n1qlParser.INSERT = 115; +n1qlParser.INTERSECT = 116; +n1qlParser.INTO = 117; +n1qlParser.IS = 118; +n1qlParser.ISOLATION = 119; +n1qlParser.JAVASCRIPT = 120; +n1qlParser.JOIN = 121; +n1qlParser.KEY = 122; +n1qlParser.KEYS = 123; +n1qlParser.KEYSPACE = 124; +n1qlParser.KNOWN = 125; +n1qlParser.LANGUAGE = 126; +n1qlParser.LAST = 127; +n1qlParser.LEFT = 128; +n1qlParser.LET_ = 129; +n1qlParser.LETTING = 130; +n1qlParser.LEVEL = 131; +n1qlParser.LIKE = 132; +n1qlParser.LIMIT = 133; +n1qlParser.LSM = 134; +n1qlParser.MAP = 135; +n1qlParser.MAPPING = 136; +n1qlParser.MATCHED = 137; +n1qlParser.MATERIALIZED = 138; +n1qlParser.MERGE = 139; +n1qlParser.MISSING = 140; +n1qlParser.NAMESPACE = 141; +n1qlParser.NEST = 142; +n1qlParser.NL = 143; +n1qlParser.NO = 144; +n1qlParser.NOT = 145; +n1qlParser.NTH_VALUE = 146; +n1qlParser.NULL = 147; +n1qlParser.NULLS = 148; +n1qlParser.NUMBER = 149; +n1qlParser.OBJECT = 150; +n1qlParser.OFFSET = 151; +n1qlParser.ON = 152; +n1qlParser.OPTION = 153; +n1qlParser.OPTIONS = 154; +n1qlParser.OR = 155; +n1qlParser.ORDER = 156; +n1qlParser.OTHERS = 157; +n1qlParser.OUTER = 158; +n1qlParser.OVER = 159; +n1qlParser.PARSE = 160; +n1qlParser.PARTITION = 161; +n1qlParser.PASSWORD = 162; +n1qlParser.PATH = 163; +n1qlParser.POOL = 164; +n1qlParser.PRECEDING = 165; +n1qlParser.PREPARE = 166; +n1qlParser.PRIMARY = 167; +n1qlParser.PRIVATE = 168; +n1qlParser.PRIVILEGE = 169; +n1qlParser.PROCEDURE = 170; +n1qlParser.PROBE = 171; +n1qlParser.PUBLIC = 172; +n1qlParser.RANGE = 173; +n1qlParser.RAW = 174; +n1qlParser.READ = 175; +n1qlParser.REALM = 176; +n1qlParser.REDUCE = 177; +n1qlParser.RENAME = 178; +n1qlParser.REPLACE = 179; +n1qlParser.RESPECT = 180; +n1qlParser.RETURN = 181; +n1qlParser.RETURNING = 182; +n1qlParser.REVOKE = 183; +n1qlParser.RIGHT = 184; +n1qlParser.ROLE = 185; +n1qlParser.ROLLBACK = 186; +n1qlParser.ROW = 187; +n1qlParser.ROWS = 188; +n1qlParser.SATISFIES = 189; +n1qlParser.SAVEPOINT = 190; +n1qlParser.SCHEMA = 191; +n1qlParser.SCOPE = 192; +n1qlParser.SELECT = 193; +n1qlParser.SELF = 194; +n1qlParser.SET = 195; +n1qlParser.SHOW = 196; +n1qlParser.SOME = 197; +n1qlParser.START = 198; +n1qlParser.STATISTICS = 199; +n1qlParser.STRING = 200; +n1qlParser.SYSTEM = 201; +n1qlParser.THEN = 202; +n1qlParser.TIES = 203; +n1qlParser.TO = 204; +n1qlParser.TRAN = 205; +n1qlParser.TRANSACTION = 206; +n1qlParser.TRIGGER = 207; +n1qlParser.TRUE = 208; +n1qlParser.TRUNCATE = 209; +n1qlParser.UNBOUNDED = 210; +n1qlParser.UNDER = 211; +n1qlParser.UNION = 212; +n1qlParser.UNIQUE = 213; +n1qlParser.UNKNOWN = 214; +n1qlParser.UNNEST = 215; +n1qlParser.UNSET = 216; +n1qlParser.UPDATE = 217; +n1qlParser.UPSERT = 218; +n1qlParser.USE = 219; +n1qlParser.USER = 220; +n1qlParser.USING = 221; +n1qlParser.VALIDATE = 222; +n1qlParser.VALUE = 223; +n1qlParser.VALUED = 224; +n1qlParser.VALUES = 225; +n1qlParser.VIA = 226; +n1qlParser.VIEW = 227; +n1qlParser.WHEN = 228; +n1qlParser.WHERE = 229; +n1qlParser.WHILE = 230; +n1qlParser.WINDOW = 231; +n1qlParser.WITH = 232; +n1qlParser.WITHIN = 233; +n1qlParser.WORK = 234; +n1qlParser.XOR = 235; +n1qlParser.IDENT_ICASE = 236; +n1qlParser.IDENT = 237; +n1qlParser.NAMED_PARAM = 238; +n1qlParser.POSITIONAL_PARAM = 239; +n1qlParser.NEXT_PARAM = 240; + +n1qlParser.RULE_statements = 0; +n1qlParser.RULE_input = 1; +n1qlParser.RULE_opt_trailer = 2; +n1qlParser.RULE_stmt_body = 3; +n1qlParser.RULE_stmt = 4; +n1qlParser.RULE_advise = 5; +n1qlParser.RULE_opt_index = 6; +n1qlParser.RULE_explain = 7; +n1qlParser.RULE_prepare = 8; +n1qlParser.RULE_opt_force = 9; +n1qlParser.RULE_opt_name = 10; +n1qlParser.RULE_from_or_as = 11; +n1qlParser.RULE_execute = 12; +n1qlParser.RULE_execute_using = 13; +n1qlParser.RULE_infer = 14; +n1qlParser.RULE_opt_keyspace_collection = 15; +n1qlParser.RULE_opt_infer_using = 16; +n1qlParser.RULE_opt_infer_ustat_with = 17; +n1qlParser.RULE_infer_ustat_with = 18; +n1qlParser.RULE_select_stmt = 19; +n1qlParser.RULE_dml_stmt = 20; +n1qlParser.RULE_ddl_stmt = 21; +n1qlParser.RULE_role_stmt = 22; +n1qlParser.RULE_index_stmt = 23; +n1qlParser.RULE_scope_stmt = 24; +n1qlParser.RULE_collection_stmt = 25; +n1qlParser.RULE_function_stmt = 26; +n1qlParser.RULE_transaction_stmt = 27; +n1qlParser.RULE_fullselect = 28; +n1qlParser.RULE_select_terms = 29; +n1qlParser.RULE_select_term = 30; +n1qlParser.RULE_subselect = 31; +n1qlParser.RULE_from_select = 32; +n1qlParser.RULE_select_from = 33; +n1qlParser.RULE_select_clause = 34; +n1qlParser.RULE_projection = 35; +n1qlParser.RULE_opt_quantifier = 36; +n1qlParser.RULE_raw = 37; +n1qlParser.RULE_projects = 38; +n1qlParser.RULE_project = 39; +n1qlParser.RULE_opt_as_alias = 40; +n1qlParser.RULE_as_alias = 41; +n1qlParser.RULE_alias = 42; +n1qlParser.RULE_opt_from = 43; +n1qlParser.RULE_from = 44; +n1qlParser.RULE_from_term = 45; +n1qlParser.RULE_simple_from_term = 46; +n1qlParser.RULE_unnest = 47; +n1qlParser.RULE_keyspace_term = 48; +n1qlParser.RULE_keyspace_path = 49; +n1qlParser.RULE_namespace_term = 50; +n1qlParser.RULE_namespace_name = 51; +n1qlParser.RULE_bucket_name = 52; +n1qlParser.RULE_scope_name = 53; +n1qlParser.RULE_keyspace_name = 54; +n1qlParser.RULE_opt_use = 55; +n1qlParser.RULE_use_options = 56; +n1qlParser.RULE_use_keys = 57; +n1qlParser.RULE_use_index = 58; +n1qlParser.RULE_join_hint = 59; +n1qlParser.RULE_opt_primary = 60; +n1qlParser.RULE_index_refs = 61; +n1qlParser.RULE_index_ref = 62; +n1qlParser.RULE_use_hash_option = 63; +n1qlParser.RULE_opt_use_del_upd = 64; +n1qlParser.RULE_opt_join_type = 65; +n1qlParser.RULE_opt_outer = 66; +n1qlParser.RULE_on_keys = 67; +n1qlParser.RULE_on_key = 68; +n1qlParser.RULE_opt_let = 69; +n1qlParser.RULE_let_ = 70; +n1qlParser.RULE_bindings = 71; +n1qlParser.RULE_binding = 72; +n1qlParser.RULE_opt_with = 73; +n1qlParser.RULE_with_list = 74; +n1qlParser.RULE_with_term = 75; +n1qlParser.RULE_opt_where = 76; +n1qlParser.RULE_where = 77; +n1qlParser.RULE_opt_group = 78; +n1qlParser.RULE_group = 79; +n1qlParser.RULE_group_terms = 80; +n1qlParser.RULE_group_term = 81; +n1qlParser.RULE_opt_letting = 82; +n1qlParser.RULE_letting = 83; +n1qlParser.RULE_opt_having = 84; +n1qlParser.RULE_having = 85; +n1qlParser.RULE_opt_order_by = 86; +n1qlParser.RULE_order_by = 87; +n1qlParser.RULE_sort_terms = 88; +n1qlParser.RULE_sort_term = 89; +n1qlParser.RULE_opt_dir = 90; +n1qlParser.RULE_dir = 91; +n1qlParser.RULE_opt_order_nulls = 92; +n1qlParser.RULE_first_last = 93; +n1qlParser.RULE_nulls = 94; +n1qlParser.RULE_opt_limit = 95; +n1qlParser.RULE_limit = 96; +n1qlParser.RULE_opt_offset = 97; +n1qlParser.RULE_offset = 98; +n1qlParser.RULE_insert = 99; +n1qlParser.RULE_simple_keyspace_ref = 100; +n1qlParser.RULE_keyspace_ref = 101; +n1qlParser.RULE_opt_values_header = 102; +n1qlParser.RULE_key = 103; +n1qlParser.RULE_values_list = 104; +n1qlParser.RULE_values = 105; +n1qlParser.RULE_next_values = 106; +n1qlParser.RULE_key_val_expr = 107; +n1qlParser.RULE_key_val_options_expr = 108; +n1qlParser.RULE_opt_returning = 109; +n1qlParser.RULE_returning = 110; +n1qlParser.RULE_returns_ = 111; +n1qlParser.RULE_key_expr_header = 112; +n1qlParser.RULE_value_expr_header = 113; +n1qlParser.RULE_options_expr_header = 114; +n1qlParser.RULE_key_val_options_expr_header = 115; +n1qlParser.RULE_upsert = 116; +n1qlParser.RULE_delete_ = 117; +n1qlParser.RULE_update = 118; +n1qlParser.RULE_set = 119; +n1qlParser.RULE_set_terms = 120; +n1qlParser.RULE_set_term = 121; +n1qlParser.RULE_function_meta_expr = 122; +n1qlParser.RULE_opt_update_for = 123; +n1qlParser.RULE_update_for = 124; +n1qlParser.RULE_update_dimensions = 125; +n1qlParser.RULE_update_dimension = 126; +n1qlParser.RULE_update_binding = 127; +n1qlParser.RULE_variable = 128; +n1qlParser.RULE_opt_when = 129; +n1qlParser.RULE_unset = 130; +n1qlParser.RULE_unset_terms = 131; +n1qlParser.RULE_unset_term = 132; +n1qlParser.RULE_merge = 133; +n1qlParser.RULE_opt_use_merge = 134; +n1qlParser.RULE_opt_key = 135; +n1qlParser.RULE_merge_actions = 136; +n1qlParser.RULE_opt_merge_delete_insert = 137; +n1qlParser.RULE_opt_merge_insert = 138; +n1qlParser.RULE_merge_update = 139; +n1qlParser.RULE_merge_delete = 140; +n1qlParser.RULE_merge_insert = 141; +n1qlParser.RULE_grant_role = 142; +n1qlParser.RULE_role_list = 143; +n1qlParser.RULE_role_name = 144; +n1qlParser.RULE_keyspace_scope_list = 145; +n1qlParser.RULE_keyspace_scope = 146; +n1qlParser.RULE_user_list = 147; +n1qlParser.RULE_user = 148; +n1qlParser.RULE_revoke_role = 149; +n1qlParser.RULE_create_scope = 150; +n1qlParser.RULE_drop_scope = 151; +n1qlParser.RULE_create_collection = 152; +n1qlParser.RULE_drop_collection = 153; +n1qlParser.RULE_flush_collection = 154; +n1qlParser.RULE_flush_or_truncate = 155; +n1qlParser.RULE_create_index = 156; +n1qlParser.RULE_create_primary_index = 157; +n1qlParser.RULE_opt_primary_name = 158; +n1qlParser.RULE_index_name = 159; +n1qlParser.RULE_opt_index_name = 160; +n1qlParser.RULE_named_keyspace_ref = 161; +n1qlParser.RULE_simple_named_keyspace_ref = 162; +n1qlParser.RULE_named_scope_ref = 163; +n1qlParser.RULE_index_partition = 164; +n1qlParser.RULE_opt_index_using = 165; +n1qlParser.RULE_index_using = 166; +n1qlParser.RULE_opt_index_with = 167; +n1qlParser.RULE_index_with = 168; +n1qlParser.RULE_index_terms = 169; +n1qlParser.RULE_index_term = 170; +n1qlParser.RULE_index_term_expr = 171; +n1qlParser.RULE_index_expr = 172; +n1qlParser.RULE_all = 173; +n1qlParser.RULE_index_where = 174; +n1qlParser.RULE_opt_ikattr = 175; +n1qlParser.RULE_ikattr = 176; +n1qlParser.RULE_drop_index = 177; +n1qlParser.RULE_alter_index = 178; +n1qlParser.RULE_build_index = 179; +n1qlParser.RULE_create_function = 180; +n1qlParser.RULE_opt_replace = 181; +n1qlParser.RULE_func_name = 182; +n1qlParser.RULE_short_func_name = 183; +n1qlParser.RULE_long_func_name = 184; +n1qlParser.RULE_parm_list = 185; +n1qlParser.RULE_parameter_terms = 186; +n1qlParser.RULE_func_body = 187; +n1qlParser.RULE_drop_function = 188; +n1qlParser.RULE_execute_function = 189; +n1qlParser.RULE_update_statistics = 190; +n1qlParser.RULE_opt_for = 191; +n1qlParser.RULE_update_stat_terms = 192; +n1qlParser.RULE_update_stat_term = 193; +n1qlParser.RULE_path = 194; +n1qlParser.RULE_expr = 195; +n1qlParser.RULE_valued = 196; +n1qlParser.RULE_c_expr = 197; +n1qlParser.RULE_b_expr = 198; +n1qlParser.RULE_literal = 199; +n1qlParser.RULE_construction_expr = 200; +n1qlParser.RULE_object = 201; +n1qlParser.RULE_opt_members = 202; +n1qlParser.RULE_members = 203; +n1qlParser.RULE_member = 204; +n1qlParser.RULE_array = 205; +n1qlParser.RULE_opt_exprs = 206; +n1qlParser.RULE_exprs = 207; +n1qlParser.RULE_param_expr = 208; +n1qlParser.RULE_case_expr = 209; +n1qlParser.RULE_simple_or_searched_case = 210; +n1qlParser.RULE_simple_case = 211; +n1qlParser.RULE_when_thens = 212; +n1qlParser.RULE_searched_case = 213; +n1qlParser.RULE_opt_else = 214; +n1qlParser.RULE_function_expr = 215; +n1qlParser.RULE_function_name = 216; +n1qlParser.RULE_collection_expr = 217; +n1qlParser.RULE_collection_cond = 218; +n1qlParser.RULE_coll_bindings = 219; +n1qlParser.RULE_coll_binding = 220; +n1qlParser.RULE_satisfies = 221; +n1qlParser.RULE_collection_xform = 222; +n1qlParser.RULE_paren_expr = 223; +n1qlParser.RULE_subquery_expr = 224; +n1qlParser.RULE_expr_input = 225; +n1qlParser.RULE_all_expr = 226; +n1qlParser.RULE_opt_window_clause = 227; +n1qlParser.RULE_window_list = 228; +n1qlParser.RULE_window_term = 229; +n1qlParser.RULE_window_specification = 230; +n1qlParser.RULE_opt_window_name = 231; +n1qlParser.RULE_opt_window_partition = 232; +n1qlParser.RULE_opt_window_frame = 233; +n1qlParser.RULE_window_frame_modifier = 234; +n1qlParser.RULE_opt_window_frame_exclusion = 235; +n1qlParser.RULE_window_frame_extents = 236; +n1qlParser.RULE_window_frame_extent = 237; +n1qlParser.RULE_window_frame_valexpr_modifier = 238; +n1qlParser.RULE_opt_nulls_treatment = 239; +n1qlParser.RULE_nulls_treatment = 240; +n1qlParser.RULE_opt_from_first_last = 241; +n1qlParser.RULE_agg_quantifier = 242; +n1qlParser.RULE_opt_filter = 243; +n1qlParser.RULE_opt_window_function = 244; +n1qlParser.RULE_window_function_details = 245; +n1qlParser.RULE_start_transaction = 246; +n1qlParser.RULE_commit_transaction = 247; +n1qlParser.RULE_rollback_transaction = 248; +n1qlParser.RULE_start_or_begin = 249; +n1qlParser.RULE_opt_transaction = 250; +n1qlParser.RULE_transaction = 251; +n1qlParser.RULE_opt_savepoint = 252; +n1qlParser.RULE_savepoint_name = 253; +n1qlParser.RULE_opt_isolation_level = 254; +n1qlParser.RULE_isolation_level = 255; +n1qlParser.RULE_isolation_val = 256; +n1qlParser.RULE_set_transaction_isolation = 257; +n1qlParser.RULE_savepoint = 258; +n1qlParser.RULE_if_exists = 259; +n1qlParser.RULE_if_not_exists = 260; + +class StatementsContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_statements; + } + + input = function (i) { + if (i === undefined) { + i = null; + } + if (i === null) { + return this.getTypedRuleContexts(InputContext); + } else { + return this.getTypedRuleContext(InputContext, i); + } + }; + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitStatements(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class InputContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_input; + } + + stmt_body() { + return this.getTypedRuleContext(Stmt_bodyContext, 0); + } + + opt_trailer() { + return this.getTypedRuleContext(Opt_trailerContext, 0); + } + + expr_input() { + return this.getTypedRuleContext(Expr_inputContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitInput(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Opt_trailerContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_opt_trailer; + } + + opt_trailer() { + return this.getTypedRuleContext(Opt_trailerContext, 0); + } + + SEMI() { + return this.getToken(n1qlParser.SEMI, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitOpt_trailer(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Stmt_bodyContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_stmt_body; + } + + advise() { + return this.getTypedRuleContext(AdviseContext, 0); + } + + explain() { + return this.getTypedRuleContext(ExplainContext, 0); + } + + prepare() { + return this.getTypedRuleContext(PrepareContext, 0); + } + + execute() { + return this.getTypedRuleContext(ExecuteContext, 0); + } + + stmt() { + return this.getTypedRuleContext(StmtContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitStmt_body(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class StmtContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_stmt; + } + + select_stmt() { + return this.getTypedRuleContext(Select_stmtContext, 0); + } + + dml_stmt() { + return this.getTypedRuleContext(Dml_stmtContext, 0); + } + + ddl_stmt() { + return this.getTypedRuleContext(Ddl_stmtContext, 0); + } + + infer() { + return this.getTypedRuleContext(InferContext, 0); + } + + update_statistics() { + return this.getTypedRuleContext(Update_statisticsContext, 0); + } + + role_stmt() { + return this.getTypedRuleContext(Role_stmtContext, 0); + } + + function_stmt() { + return this.getTypedRuleContext(Function_stmtContext, 0); + } + + transaction_stmt() { + return this.getTypedRuleContext(Transaction_stmtContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitStmt(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class AdviseContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_advise; + } + + ADVISE() { + return this.getToken(n1qlParser.ADVISE, 0); + } + + opt_index() { + return this.getTypedRuleContext(Opt_indexContext, 0); + } + + stmt() { + return this.getTypedRuleContext(StmtContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitAdvise(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Opt_indexContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_opt_index; + } + + INDEX() { + return this.getToken(n1qlParser.INDEX, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitOpt_index(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class ExplainContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_explain; + } + + EXPLAIN() { + return this.getToken(n1qlParser.EXPLAIN, 0); + } + + stmt() { + return this.getTypedRuleContext(StmtContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitExplain(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class PrepareContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_prepare; + } + + PREPARE() { + return this.getToken(n1qlParser.PREPARE, 0); + } + + opt_force() { + return this.getTypedRuleContext(Opt_forceContext, 0); + } + + opt_name() { + return this.getTypedRuleContext(Opt_nameContext, 0); + } + + stmt() { + return this.getTypedRuleContext(StmtContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitPrepare(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Opt_forceContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_opt_force; + } + + FORCE() { + return this.getToken(n1qlParser.FORCE, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitOpt_force(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Opt_nameContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_opt_name; + } + + IDENT() { + return this.getToken(n1qlParser.IDENT, 0); + } + + from_or_as() { + return this.getTypedRuleContext(From_or_asContext, 0); + } + + STR() { + return this.getToken(n1qlParser.STR, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitOpt_name(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class From_or_asContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_from_or_as; + } + + FROM() { + return this.getToken(n1qlParser.FROM, 0); + } + + AS() { + return this.getToken(n1qlParser.AS, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitFrom_or_as(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class ExecuteContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_execute; + } + + EXECUTE() { + return this.getToken(n1qlParser.EXECUTE, 0); + } + + expr() { + return this.getTypedRuleContext(ExprContext, 0); + } + + execute_using() { + return this.getTypedRuleContext(Execute_usingContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitExecute(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Execute_usingContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_execute_using; + } + + USING() { + return this.getToken(n1qlParser.USING, 0); + } + + construction_expr() { + return this.getTypedRuleContext(Construction_exprContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitExecute_using(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class InferContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_infer; + } + + INFER() { + return this.getToken(n1qlParser.INFER, 0); + } + + opt_keyspace_collection() { + return this.getTypedRuleContext(Opt_keyspace_collectionContext, 0); + } + + simple_keyspace_ref() { + return this.getTypedRuleContext(Simple_keyspace_refContext, 0); + } + + opt_infer_using() { + return this.getTypedRuleContext(Opt_infer_usingContext, 0); + } + + opt_infer_ustat_with() { + return this.getTypedRuleContext(Opt_infer_ustat_withContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitInfer(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Opt_keyspace_collectionContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_opt_keyspace_collection; + } + + KEYSPACE() { + return this.getToken(n1qlParser.KEYSPACE, 0); + } + + COLLECTION() { + return this.getToken(n1qlParser.COLLECTION, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitOpt_keyspace_collection(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Opt_infer_usingContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_opt_infer_using; + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitOpt_infer_using(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Opt_infer_ustat_withContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_opt_infer_ustat_with; + } + + infer_ustat_with() { + return this.getTypedRuleContext(Infer_ustat_withContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitOpt_infer_ustat_with(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Infer_ustat_withContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_infer_ustat_with; + } + + WITH() { + return this.getToken(n1qlParser.WITH, 0); + } + + expr() { + return this.getTypedRuleContext(ExprContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitInfer_ustat_with(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Select_stmtContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_select_stmt; + } + + fullselect() { + return this.getTypedRuleContext(FullselectContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitSelect_stmt(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Dml_stmtContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_dml_stmt; + } + + insert() { + return this.getTypedRuleContext(InsertContext, 0); + } + + upsert() { + return this.getTypedRuleContext(UpsertContext, 0); + } + + delete_() { + return this.getTypedRuleContext(Delete_Context, 0); + } + + update() { + return this.getTypedRuleContext(UpdateContext, 0); + } + + merge() { + return this.getTypedRuleContext(MergeContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitDml_stmt(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Ddl_stmtContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_ddl_stmt; + } + + index_stmt() { + return this.getTypedRuleContext(Index_stmtContext, 0); + } + + scope_stmt() { + return this.getTypedRuleContext(Scope_stmtContext, 0); + } + + collection_stmt() { + return this.getTypedRuleContext(Collection_stmtContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitDdl_stmt(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Role_stmtContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_role_stmt; + } + + grant_role() { + return this.getTypedRuleContext(Grant_roleContext, 0); + } + + revoke_role() { + return this.getTypedRuleContext(Revoke_roleContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitRole_stmt(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Index_stmtContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_index_stmt; + } + + create_index() { + return this.getTypedRuleContext(Create_indexContext, 0); + } + + create_primary_index() { + return this.getTypedRuleContext(Create_primary_indexContext, 0); + } + + drop_index() { + return this.getTypedRuleContext(Drop_indexContext, 0); + } + + alter_index() { + return this.getTypedRuleContext(Alter_indexContext, 0); + } + + build_index() { + return this.getTypedRuleContext(Build_indexContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitIndex_stmt(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Scope_stmtContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_scope_stmt; + } + + create_scope() { + return this.getTypedRuleContext(Create_scopeContext, 0); + } + + drop_scope() { + return this.getTypedRuleContext(Drop_scopeContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitScope_stmt(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Collection_stmtContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_collection_stmt; + } + + create_collection() { + return this.getTypedRuleContext(Create_collectionContext, 0); + } + + drop_collection() { + return this.getTypedRuleContext(Drop_collectionContext, 0); + } + + flush_collection() { + return this.getTypedRuleContext(Flush_collectionContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitCollection_stmt(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Function_stmtContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_function_stmt; + } + + create_function() { + return this.getTypedRuleContext(Create_functionContext, 0); + } + + drop_function() { + return this.getTypedRuleContext(Drop_functionContext, 0); + } + + execute_function() { + return this.getTypedRuleContext(Execute_functionContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitFunction_stmt(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Transaction_stmtContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_transaction_stmt; + } + + start_transaction() { + return this.getTypedRuleContext(Start_transactionContext, 0); + } + + commit_transaction() { + return this.getTypedRuleContext(Commit_transactionContext, 0); + } + + rollback_transaction() { + return this.getTypedRuleContext(Rollback_transactionContext, 0); + } + + savepoint() { + return this.getTypedRuleContext(SavepointContext, 0); + } + + set_transaction_isolation() { + return this.getTypedRuleContext(Set_transaction_isolationContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitTransaction_stmt(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class FullselectContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_fullselect; + } + + select_terms() { + return this.getTypedRuleContext(Select_termsContext, 0); + } + + opt_order_by() { + return this.getTypedRuleContext(Opt_order_byContext, 0); + } + + limit() { + return this.getTypedRuleContext(LimitContext, 0); + } + + opt_offset() { + return this.getTypedRuleContext(Opt_offsetContext, 0); + } + + offset() { + return this.getTypedRuleContext(OffsetContext, 0); + } + + opt_limit() { + return this.getTypedRuleContext(Opt_limitContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitFullselect(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Select_termsContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_select_terms; + } + + subselect() { + return this.getTypedRuleContext(SubselectContext, 0); + } + + subquery_expr() { + return this.getTypedRuleContext(Subquery_exprContext, 0); + } + + UNION() { + return this.getToken(n1qlParser.UNION, 0); + } + + select_term() { + return this.getTypedRuleContext(Select_termContext, 0); + } + + ALL() { + return this.getToken(n1qlParser.ALL, 0); + } + + INTERSECT() { + return this.getToken(n1qlParser.INTERSECT, 0); + } + + EXCEPT() { + return this.getToken(n1qlParser.EXCEPT, 0); + } + + select_terms() { + return this.getTypedRuleContext(Select_termsContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitSelect_terms(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Select_termContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_select_term; + } + + subselect() { + return this.getTypedRuleContext(SubselectContext, 0); + } + + subquery_expr() { + return this.getTypedRuleContext(Subquery_exprContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitSelect_term(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class SubselectContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_subselect; + } + + from_select() { + return this.getTypedRuleContext(From_selectContext, 0); + } + + select_from() { + return this.getTypedRuleContext(Select_fromContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitSubselect(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class From_selectContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_from_select; + } + + opt_with() { + return this.getTypedRuleContext(Opt_withContext, 0); + } + + from() { + return this.getTypedRuleContext(FromContext, 0); + } + + opt_let() { + return this.getTypedRuleContext(Opt_letContext, 0); + } + + opt_where() { + return this.getTypedRuleContext(Opt_whereContext, 0); + } + + opt_group() { + return this.getTypedRuleContext(Opt_groupContext, 0); + } + + opt_window_clause() { + return this.getTypedRuleContext(Opt_window_clauseContext, 0); + } + + select_clause() { + return this.getTypedRuleContext(Select_clauseContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitFrom_select(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Select_fromContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_select_from; + } + + opt_with() { + return this.getTypedRuleContext(Opt_withContext, 0); + } + + select_clause() { + return this.getTypedRuleContext(Select_clauseContext, 0); + } + + opt_from() { + return this.getTypedRuleContext(Opt_fromContext, 0); + } + + opt_let() { + return this.getTypedRuleContext(Opt_letContext, 0); + } + + opt_where() { + return this.getTypedRuleContext(Opt_whereContext, 0); + } + + opt_group() { + return this.getTypedRuleContext(Opt_groupContext, 0); + } + + opt_window_clause() { + return this.getTypedRuleContext(Opt_window_clauseContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitSelect_from(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Select_clauseContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_select_clause; + } + + SELECT() { + return this.getToken(n1qlParser.SELECT, 0); + } + + projection() { + return this.getTypedRuleContext(ProjectionContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitSelect_clause(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class ProjectionContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_projection; + } + + opt_quantifier() { + return this.getTypedRuleContext(Opt_quantifierContext, 0); + } + + projects() { + return this.getTypedRuleContext(ProjectsContext, 0); + } + + raw() { + return this.getTypedRuleContext(RawContext, 0); + } + + expr() { + return this.getTypedRuleContext(ExprContext, 0); + } + + opt_as_alias() { + return this.getTypedRuleContext(Opt_as_aliasContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitProjection(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Opt_quantifierContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_opt_quantifier; + } + + ALL() { + return this.getToken(n1qlParser.ALL, 0); + } + + DISTINCT() { + return this.getToken(n1qlParser.DISTINCT, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitOpt_quantifier(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class RawContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_raw; + } + + RAW() { + return this.getToken(n1qlParser.RAW, 0); + } + + ELEMENT() { + return this.getToken(n1qlParser.ELEMENT, 0); + } + + VALUE() { + return this.getToken(n1qlParser.VALUE, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitRaw(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class ProjectsContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_projects; + } + + project() { + return this.getTypedRuleContext(ProjectContext, 0); + } + + projects() { + return this.getTypedRuleContext(ProjectsContext, 0); + } + + COMMA() { + return this.getToken(n1qlParser.COMMA, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitProjects(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class ProjectContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_project; + } + + STAR() { + return this.getToken(n1qlParser.STAR, 0); + } + + expr() { + return this.getTypedRuleContext(ExprContext, 0); + } + + DOT() { + return this.getToken(n1qlParser.DOT, 0); + } + + opt_as_alias() { + return this.getTypedRuleContext(Opt_as_aliasContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitProject(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Opt_as_aliasContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_opt_as_alias; + } + + as_alias() { + return this.getTypedRuleContext(As_aliasContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitOpt_as_alias(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class As_aliasContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_as_alias; + } + + alias() { + return this.getTypedRuleContext(AliasContext, 0); + } + + AS() { + return this.getToken(n1qlParser.AS, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitAs_alias(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class AliasContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_alias; + } + + IDENT() { + return this.getToken(n1qlParser.IDENT, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitAlias(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Opt_fromContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_opt_from; + } + + from() { + return this.getTypedRuleContext(FromContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitOpt_from(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class FromContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_from; + } + + FROM() { + return this.getToken(n1qlParser.FROM, 0); + } + + from_term() { + return this.getTypedRuleContext(From_termContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitFrom(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class From_termContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_from_term; + } + + simple_from_term = function (i) { + if (i === undefined) { + i = null; + } + if (i === null) { + return this.getTypedRuleContexts(Simple_from_termContext); + } else { + return this.getTypedRuleContext(Simple_from_termContext, i); + } + }; + + RIGHT() { + return this.getToken(n1qlParser.RIGHT, 0); + } + + opt_outer() { + return this.getTypedRuleContext(Opt_outerContext, 0); + } + + JOIN() { + return this.getToken(n1qlParser.JOIN, 0); + } + + ON() { + return this.getToken(n1qlParser.ON, 0); + } + + expr() { + return this.getTypedRuleContext(ExprContext, 0); + } + + from_term() { + return this.getTypedRuleContext(From_termContext, 0); + } + + opt_join_type() { + return this.getTypedRuleContext(Opt_join_typeContext, 0); + } + + on_keys() { + return this.getTypedRuleContext(On_keysContext, 0); + } + + on_key() { + return this.getTypedRuleContext(On_keyContext, 0); + } + + FOR() { + return this.getToken(n1qlParser.FOR, 0); + } + + IDENT() { + return this.getToken(n1qlParser.IDENT, 0); + } + + NEST() { + return this.getToken(n1qlParser.NEST, 0); + } + + unnest() { + return this.getTypedRuleContext(UnnestContext, 0); + } + + opt_as_alias() { + return this.getTypedRuleContext(Opt_as_aliasContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitFrom_term(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Simple_from_termContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_simple_from_term; + } + + keyspace_term() { + return this.getTypedRuleContext(Keyspace_termContext, 0); + } + + expr() { + return this.getTypedRuleContext(ExprContext, 0); + } + + opt_as_alias() { + return this.getTypedRuleContext(Opt_as_aliasContext, 0); + } + + opt_use() { + return this.getTypedRuleContext(Opt_useContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitSimple_from_term(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class UnnestContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_unnest; + } + + UNNEST() { + return this.getToken(n1qlParser.UNNEST, 0); + } + + FLATTEN() { + return this.getToken(n1qlParser.FLATTEN, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitUnnest(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Keyspace_termContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_keyspace_term; + } + + keyspace_path() { + return this.getTypedRuleContext(Keyspace_pathContext, 0); + } + + opt_as_alias() { + return this.getTypedRuleContext(Opt_as_aliasContext, 0); + } + + opt_use() { + return this.getTypedRuleContext(Opt_useContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitKeyspace_term(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Keyspace_pathContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_keyspace_path; + } + + namespace_term() { + return this.getTypedRuleContext(Namespace_termContext, 0); + } + + keyspace_name() { + return this.getTypedRuleContext(Keyspace_nameContext, 0); + } + + bucket_name() { + return this.getTypedRuleContext(Bucket_nameContext, 0); + } + + DOT = function (i) { + if (i === undefined) { + i = null; + } + if (i === null) { + return this.getTokens(n1qlParser.DOT); + } else { + return this.getToken(n1qlParser.DOT, i); + } + }; + + scope_name() { + return this.getTypedRuleContext(Scope_nameContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitKeyspace_path(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Namespace_termContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_namespace_term; + } + + namespace_name() { + return this.getTypedRuleContext(Namespace_nameContext, 0); + } + + SYSTEM() { + return this.getToken(n1qlParser.SYSTEM, 0); + } + + COLON() { + return this.getToken(n1qlParser.COLON, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitNamespace_term(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Namespace_nameContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_namespace_name; + } + + IDENT() { + return this.getToken(n1qlParser.IDENT, 0); + } + + COLON() { + return this.getToken(n1qlParser.COLON, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitNamespace_name(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Bucket_nameContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_bucket_name; + } + + IDENT() { + return this.getToken(n1qlParser.IDENT, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitBucket_name(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Scope_nameContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_scope_name; + } + + IDENT() { + return this.getToken(n1qlParser.IDENT, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitScope_name(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Keyspace_nameContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_keyspace_name; + } + + IDENT() { + return this.getToken(n1qlParser.IDENT, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitKeyspace_name(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Opt_useContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_opt_use; + } + + USE() { + return this.getToken(n1qlParser.USE, 0); + } + + use_options() { + return this.getTypedRuleContext(Use_optionsContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitOpt_use(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Use_optionsContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_use_options; + } + + use_keys() { + return this.getTypedRuleContext(Use_keysContext, 0); + } + + use_index() { + return this.getTypedRuleContext(Use_indexContext, 0); + } + + join_hint() { + return this.getTypedRuleContext(Join_hintContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitUse_options(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Use_keysContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_use_keys; + } + + opt_primary() { + return this.getTypedRuleContext(Opt_primaryContext, 0); + } + + KEYS() { + return this.getToken(n1qlParser.KEYS, 0); + } + + expr() { + return this.getTypedRuleContext(ExprContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitUse_keys(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Use_indexContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_use_index; + } + + INDEX() { + return this.getToken(n1qlParser.INDEX, 0); + } + + LPAREN() { + return this.getToken(n1qlParser.LPAREN, 0); + } + + index_refs() { + return this.getTypedRuleContext(Index_refsContext, 0); + } + + RPAREN() { + return this.getToken(n1qlParser.RPAREN, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitUse_index(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Join_hintContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_join_hint; + } + + HASH() { + return this.getToken(n1qlParser.HASH, 0); + } + + LPAREN() { + return this.getToken(n1qlParser.LPAREN, 0); + } + + use_hash_option() { + return this.getTypedRuleContext(Use_hash_optionContext, 0); + } + + RPAREN() { + return this.getToken(n1qlParser.RPAREN, 0); + } + + NL() { + return this.getToken(n1qlParser.NL, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitJoin_hint(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Opt_primaryContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_opt_primary; + } + + PRIMARY() { + return this.getToken(n1qlParser.PRIMARY, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitOpt_primary(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Index_refsContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_index_refs; + } + + index_ref() { + return this.getTypedRuleContext(Index_refContext, 0); + } + + index_refs() { + return this.getTypedRuleContext(Index_refsContext, 0); + } + + COMMA() { + return this.getToken(n1qlParser.COMMA, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitIndex_refs(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Index_refContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_index_ref; + } + + opt_index_name() { + return this.getTypedRuleContext(Opt_index_nameContext, 0); + } + + opt_index_using() { + return this.getTypedRuleContext(Opt_index_usingContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitIndex_ref(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Use_hash_optionContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_use_hash_option; + } + + BUILD() { + return this.getToken(n1qlParser.BUILD, 0); + } + + PROBE() { + return this.getToken(n1qlParser.PROBE, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitUse_hash_option(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Opt_use_del_updContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_opt_use_del_upd; + } + + opt_use() { + return this.getTypedRuleContext(Opt_useContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitOpt_use_del_upd(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Opt_join_typeContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_opt_join_type; + } + + INNER() { + return this.getToken(n1qlParser.INNER, 0); + } + + LEFT() { + return this.getToken(n1qlParser.LEFT, 0); + } + + opt_outer() { + return this.getTypedRuleContext(Opt_outerContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitOpt_join_type(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Opt_outerContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_opt_outer; + } + + OUTER() { + return this.getToken(n1qlParser.OUTER, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitOpt_outer(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class On_keysContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_on_keys; + } + + ON() { + return this.getToken(n1qlParser.ON, 0); + } + + opt_primary() { + return this.getTypedRuleContext(Opt_primaryContext, 0); + } + + KEYS() { + return this.getToken(n1qlParser.KEYS, 0); + } + + expr() { + return this.getTypedRuleContext(ExprContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitOn_keys(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class On_keyContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_on_key; + } + + ON() { + return this.getToken(n1qlParser.ON, 0); + } + + opt_primary() { + return this.getTypedRuleContext(Opt_primaryContext, 0); + } + + KEY() { + return this.getToken(n1qlParser.KEY, 0); + } + + expr() { + return this.getTypedRuleContext(ExprContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitOn_key(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Opt_letContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_opt_let; + } + + let_() { + return this.getTypedRuleContext(Let_Context, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitOpt_let(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Let_Context extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_let_; + } + + LET_() { + return this.getToken(n1qlParser.LET_, 0); + } + + bindings() { + return this.getTypedRuleContext(BindingsContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitLet_(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class BindingsContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_bindings; + } + + binding() { + return this.getTypedRuleContext(BindingContext, 0); + } + + bindings() { + return this.getTypedRuleContext(BindingsContext, 0); + } + + COMMA() { + return this.getToken(n1qlParser.COMMA, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitBindings(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class BindingContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_binding; + } + + alias() { + return this.getTypedRuleContext(AliasContext, 0); + } + + EQ() { + return this.getToken(n1qlParser.EQ, 0); + } + + expr() { + return this.getTypedRuleContext(ExprContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitBinding(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Opt_withContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_opt_with; + } + + WITH() { + return this.getToken(n1qlParser.WITH, 0); + } + + with_list() { + return this.getTypedRuleContext(With_listContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitOpt_with(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class With_listContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_with_list; + } + + with_term() { + return this.getTypedRuleContext(With_termContext, 0); + } + + with_list() { + return this.getTypedRuleContext(With_listContext, 0); + } + + COMMA() { + return this.getToken(n1qlParser.COMMA, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitWith_list(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class With_termContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_with_term; + } + + alias() { + return this.getTypedRuleContext(AliasContext, 0); + } + + AS() { + return this.getToken(n1qlParser.AS, 0); + } + + paren_expr() { + return this.getTypedRuleContext(Paren_exprContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitWith_term(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Opt_whereContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_opt_where; + } + + where() { + return this.getTypedRuleContext(WhereContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitOpt_where(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class WhereContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_where; + } + + WHERE() { + return this.getToken(n1qlParser.WHERE, 0); + } + + expr() { + return this.getTypedRuleContext(ExprContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitWhere(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Opt_groupContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_opt_group; + } + + group() { + return this.getTypedRuleContext(GroupContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitOpt_group(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class GroupContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_group; + } + + GROUP() { + return this.getToken(n1qlParser.GROUP, 0); + } + + BY() { + return this.getToken(n1qlParser.BY, 0); + } + + group_terms() { + return this.getTypedRuleContext(Group_termsContext, 0); + } + + opt_letting() { + return this.getTypedRuleContext(Opt_lettingContext, 0); + } + + opt_having() { + return this.getTypedRuleContext(Opt_havingContext, 0); + } + + letting() { + return this.getTypedRuleContext(LettingContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitGroup(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Group_termsContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_group_terms; + } + + group_term() { + return this.getTypedRuleContext(Group_termContext, 0); + } + + group_terms() { + return this.getTypedRuleContext(Group_termsContext, 0); + } + + COMMA() { + return this.getToken(n1qlParser.COMMA, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitGroup_terms(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Group_termContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_group_term; + } + + expr() { + return this.getTypedRuleContext(ExprContext, 0); + } + + opt_as_alias() { + return this.getTypedRuleContext(Opt_as_aliasContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitGroup_term(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Opt_lettingContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_opt_letting; + } + + letting() { + return this.getTypedRuleContext(LettingContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitOpt_letting(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class LettingContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_letting; + } + + LETTING() { + return this.getToken(n1qlParser.LETTING, 0); + } + + bindings() { + return this.getTypedRuleContext(BindingsContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitLetting(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Opt_havingContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_opt_having; + } + + having() { + return this.getTypedRuleContext(HavingContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitOpt_having(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class HavingContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_having; + } + + HAVING() { + return this.getToken(n1qlParser.HAVING, 0); + } + + expr() { + return this.getTypedRuleContext(ExprContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitHaving(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Opt_order_byContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_opt_order_by; + } + + order_by() { + return this.getTypedRuleContext(Order_byContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitOpt_order_by(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Order_byContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_order_by; + } + + ORDER() { + return this.getToken(n1qlParser.ORDER, 0); + } + + BY() { + return this.getToken(n1qlParser.BY, 0); + } + + sort_terms() { + return this.getTypedRuleContext(Sort_termsContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitOrder_by(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Sort_termsContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_sort_terms; + } + + sort_term() { + return this.getTypedRuleContext(Sort_termContext, 0); + } + + sort_terms() { + return this.getTypedRuleContext(Sort_termsContext, 0); + } + + COMMA() { + return this.getToken(n1qlParser.COMMA, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitSort_terms(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Sort_termContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_sort_term; + } + + expr() { + return this.getTypedRuleContext(ExprContext, 0); + } + + opt_dir() { + return this.getTypedRuleContext(Opt_dirContext, 0); + } + + opt_order_nulls() { + return this.getTypedRuleContext(Opt_order_nullsContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitSort_term(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Opt_dirContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_opt_dir; + } + + dir() { + return this.getTypedRuleContext(DirContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitOpt_dir(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class DirContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_dir; + } + + ASC() { + return this.getToken(n1qlParser.ASC, 0); + } + + DESC() { + return this.getToken(n1qlParser.DESC, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitDir(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Opt_order_nullsContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_opt_order_nulls; + } + + nulls() { + return this.getTypedRuleContext(NullsContext, 0); + } + + first_last() { + return this.getTypedRuleContext(First_lastContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitOpt_order_nulls(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class First_lastContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_first_last; + } + + FIRST() { + return this.getToken(n1qlParser.FIRST, 0); + } + + LAST() { + return this.getToken(n1qlParser.LAST, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitFirst_last(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class NullsContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_nulls; + } + + NULLS() { + return this.getToken(n1qlParser.NULLS, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitNulls(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Opt_limitContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_opt_limit; + } + + limit() { + return this.getTypedRuleContext(LimitContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitOpt_limit(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class LimitContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_limit; + } + + LIMIT() { + return this.getToken(n1qlParser.LIMIT, 0); + } + + expr() { + return this.getTypedRuleContext(ExprContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitLimit(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Opt_offsetContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_opt_offset; + } + + offset() { + return this.getTypedRuleContext(OffsetContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitOpt_offset(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class OffsetContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_offset; + } + + OFFSET() { + return this.getToken(n1qlParser.OFFSET, 0); + } + + expr() { + return this.getTypedRuleContext(ExprContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitOffset(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class InsertContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_insert; + } + + INSERT() { + return this.getToken(n1qlParser.INSERT, 0); + } + + INTO() { + return this.getToken(n1qlParser.INTO, 0); + } + + keyspace_ref() { + return this.getTypedRuleContext(Keyspace_refContext, 0); + } + + opt_values_header() { + return this.getTypedRuleContext(Opt_values_headerContext, 0); + } + + values_list() { + return this.getTypedRuleContext(Values_listContext, 0); + } + + opt_returning() { + return this.getTypedRuleContext(Opt_returningContext, 0); + } + + LPAREN() { + return this.getToken(n1qlParser.LPAREN, 0); + } + + key_val_options_expr_header() { + return this.getTypedRuleContext(Key_val_options_expr_headerContext, 0); + } + + RPAREN() { + return this.getToken(n1qlParser.RPAREN, 0); + } + + fullselect() { + return this.getTypedRuleContext(FullselectContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitInsert(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Simple_keyspace_refContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_simple_keyspace_ref; + } + + keyspace_name() { + return this.getTypedRuleContext(Keyspace_nameContext, 0); + } + + opt_as_alias() { + return this.getTypedRuleContext(Opt_as_aliasContext, 0); + } + + keyspace_path() { + return this.getTypedRuleContext(Keyspace_pathContext, 0); + } + + bucket_name() { + return this.getTypedRuleContext(Bucket_nameContext, 0); + } + + DOT = function (i) { + if (i === undefined) { + i = null; + } + if (i === null) { + return this.getTokens(n1qlParser.DOT); + } else { + return this.getToken(n1qlParser.DOT, i); + } + }; + + scope_name() { + return this.getTypedRuleContext(Scope_nameContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitSimple_keyspace_ref(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Keyspace_refContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_keyspace_ref; + } + + simple_keyspace_ref() { + return this.getTypedRuleContext(Simple_keyspace_refContext, 0); + } + + param_expr() { + return this.getTypedRuleContext(Param_exprContext, 0); + } + + opt_as_alias() { + return this.getTypedRuleContext(Opt_as_aliasContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitKeyspace_ref(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Opt_values_headerContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_opt_values_header; + } + + LPAREN() { + return this.getToken(n1qlParser.LPAREN, 0); + } + + opt_primary() { + return this.getTypedRuleContext(Opt_primaryContext, 0); + } + + KEY() { + return this.getToken(n1qlParser.KEY, 0); + } + + COMMA = function (i) { + if (i === undefined) { + i = null; + } + if (i === null) { + return this.getTokens(n1qlParser.COMMA); + } else { + return this.getToken(n1qlParser.COMMA, i); + } + }; + + VALUE() { + return this.getToken(n1qlParser.VALUE, 0); + } + + RPAREN() { + return this.getToken(n1qlParser.RPAREN, 0); + } + + OPTIONS() { + return this.getToken(n1qlParser.OPTIONS, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitOpt_values_header(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class KeyContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_key; + } + + opt_primary() { + return this.getTypedRuleContext(Opt_primaryContext, 0); + } + + KEY() { + return this.getToken(n1qlParser.KEY, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitKey(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Values_listContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_values_list; + } + + values() { + return this.getTypedRuleContext(ValuesContext, 0); + } + + values_list() { + return this.getTypedRuleContext(Values_listContext, 0); + } + + COMMA() { + return this.getToken(n1qlParser.COMMA, 0); + } + + next_values() { + return this.getTypedRuleContext(Next_valuesContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitValues_list(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class ValuesContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_values; + } + + VALUES() { + return this.getToken(n1qlParser.VALUES, 0); + } + + key_val_expr() { + return this.getTypedRuleContext(Key_val_exprContext, 0); + } + + key_val_options_expr() { + return this.getTypedRuleContext(Key_val_options_exprContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitValues(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Next_valuesContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_next_values; + } + + values() { + return this.getTypedRuleContext(ValuesContext, 0); + } + + key_val_expr() { + return this.getTypedRuleContext(Key_val_exprContext, 0); + } + + key_val_options_expr() { + return this.getTypedRuleContext(Key_val_options_exprContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitNext_values(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Key_val_exprContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_key_val_expr; + } + + LPAREN() { + return this.getToken(n1qlParser.LPAREN, 0); + } + + expr = function (i) { + if (i === undefined) { + i = null; + } + if (i === null) { + return this.getTypedRuleContexts(ExprContext); + } else { + return this.getTypedRuleContext(ExprContext, i); + } + }; + + COMMA() { + return this.getToken(n1qlParser.COMMA, 0); + } + + RPAREN() { + return this.getToken(n1qlParser.RPAREN, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitKey_val_expr(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Key_val_options_exprContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_key_val_options_expr; + } + + LPAREN() { + return this.getToken(n1qlParser.LPAREN, 0); + } + + expr = function (i) { + if (i === undefined) { + i = null; + } + if (i === null) { + return this.getTypedRuleContexts(ExprContext); + } else { + return this.getTypedRuleContext(ExprContext, i); + } + }; + + COMMA = function (i) { + if (i === undefined) { + i = null; + } + if (i === null) { + return this.getTokens(n1qlParser.COMMA); + } else { + return this.getToken(n1qlParser.COMMA, i); + } + }; + + RPAREN() { + return this.getToken(n1qlParser.RPAREN, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitKey_val_options_expr(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Opt_returningContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_opt_returning; + } + + returning() { + return this.getTypedRuleContext(ReturningContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitOpt_returning(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class ReturningContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_returning; + } + + RETURNING() { + return this.getToken(n1qlParser.RETURNING, 0); + } + + returns_() { + return this.getTypedRuleContext(Returns_Context, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitReturning(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Returns_Context extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_returns_; + } + + projects() { + return this.getTypedRuleContext(ProjectsContext, 0); + } + + raw() { + return this.getTypedRuleContext(RawContext, 0); + } + + expr() { + return this.getTypedRuleContext(ExprContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitReturns_(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Key_expr_headerContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_key_expr_header; + } + + key() { + return this.getTypedRuleContext(KeyContext, 0); + } + + expr() { + return this.getTypedRuleContext(ExprContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitKey_expr_header(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Value_expr_headerContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_value_expr_header; + } + + VALUE() { + return this.getToken(n1qlParser.VALUE, 0); + } + + expr() { + return this.getTypedRuleContext(ExprContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitValue_expr_header(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Options_expr_headerContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_options_expr_header; + } + + OPTIONS() { + return this.getToken(n1qlParser.OPTIONS, 0); + } + + expr() { + return this.getTypedRuleContext(ExprContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitOptions_expr_header(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Key_val_options_expr_headerContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_key_val_options_expr_header; + } + + key_expr_header() { + return this.getTypedRuleContext(Key_expr_headerContext, 0); + } + + COMMA = function (i) { + if (i === undefined) { + i = null; + } + if (i === null) { + return this.getTokens(n1qlParser.COMMA); + } else { + return this.getToken(n1qlParser.COMMA, i); + } + }; + + value_expr_header() { + return this.getTypedRuleContext(Value_expr_headerContext, 0); + } + + options_expr_header() { + return this.getTypedRuleContext(Options_expr_headerContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitKey_val_options_expr_header(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class UpsertContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_upsert; + } + + UPSERT() { + return this.getToken(n1qlParser.UPSERT, 0); + } + + INTO() { + return this.getToken(n1qlParser.INTO, 0); + } + + keyspace_ref() { + return this.getTypedRuleContext(Keyspace_refContext, 0); + } + + opt_values_header() { + return this.getTypedRuleContext(Opt_values_headerContext, 0); + } + + values_list() { + return this.getTypedRuleContext(Values_listContext, 0); + } + + opt_returning() { + return this.getTypedRuleContext(Opt_returningContext, 0); + } + + LPAREN() { + return this.getToken(n1qlParser.LPAREN, 0); + } + + key_val_options_expr_header() { + return this.getTypedRuleContext(Key_val_options_expr_headerContext, 0); + } + + RPAREN() { + return this.getToken(n1qlParser.RPAREN, 0); + } + + fullselect() { + return this.getTypedRuleContext(FullselectContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitUpsert(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Delete_Context extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_delete_; + } + + DELETE_() { + return this.getToken(n1qlParser.DELETE_, 0); + } + + FROM() { + return this.getToken(n1qlParser.FROM, 0); + } + + keyspace_ref() { + return this.getTypedRuleContext(Keyspace_refContext, 0); + } + + opt_use_del_upd() { + return this.getTypedRuleContext(Opt_use_del_updContext, 0); + } + + opt_where() { + return this.getTypedRuleContext(Opt_whereContext, 0); + } + + opt_limit() { + return this.getTypedRuleContext(Opt_limitContext, 0); + } + + opt_returning() { + return this.getTypedRuleContext(Opt_returningContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitDelete_(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class UpdateContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_update; + } + + UPDATE() { + return this.getToken(n1qlParser.UPDATE, 0); + } + + keyspace_ref() { + return this.getTypedRuleContext(Keyspace_refContext, 0); + } + + opt_use_del_upd() { + return this.getTypedRuleContext(Opt_use_del_updContext, 0); + } + + set() { + return this.getTypedRuleContext(SetContext, 0); + } + + unset() { + return this.getTypedRuleContext(UnsetContext, 0); + } + + opt_where() { + return this.getTypedRuleContext(Opt_whereContext, 0); + } + + opt_limit() { + return this.getTypedRuleContext(Opt_limitContext, 0); + } + + opt_returning() { + return this.getTypedRuleContext(Opt_returningContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitUpdate(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class SetContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_set; + } + + SET() { + return this.getToken(n1qlParser.SET, 0); + } + + set_terms() { + return this.getTypedRuleContext(Set_termsContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitSet(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Set_termsContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_set_terms; + } + + set_term() { + return this.getTypedRuleContext(Set_termContext, 0); + } + + set_terms() { + return this.getTypedRuleContext(Set_termsContext, 0); + } + + COMMA() { + return this.getToken(n1qlParser.COMMA, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitSet_terms(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Set_termContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_set_term; + } + + path() { + return this.getTypedRuleContext(PathContext, 0); + } + + EQ() { + return this.getToken(n1qlParser.EQ, 0); + } + + expr() { + return this.getTypedRuleContext(ExprContext, 0); + } + + opt_update_for() { + return this.getTypedRuleContext(Opt_update_forContext, 0); + } + + function_meta_expr() { + return this.getTypedRuleContext(Function_meta_exprContext, 0); + } + + DOT() { + return this.getToken(n1qlParser.DOT, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitSet_term(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Function_meta_exprContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_function_meta_expr; + } + + function_name() { + return this.getTypedRuleContext(Function_nameContext, 0); + } + + LPAREN() { + return this.getToken(n1qlParser.LPAREN, 0); + } + + opt_exprs() { + return this.getTypedRuleContext(Opt_exprsContext, 0); + } + + RPAREN() { + return this.getToken(n1qlParser.RPAREN, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitFunction_meta_expr(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Opt_update_forContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_opt_update_for; + } + + update_for() { + return this.getTypedRuleContext(Update_forContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitOpt_update_for(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Update_forContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_update_for; + } + + update_dimensions() { + return this.getTypedRuleContext(Update_dimensionsContext, 0); + } + + opt_when() { + return this.getTypedRuleContext(Opt_whenContext, 0); + } + + END() { + return this.getToken(n1qlParser.END, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitUpdate_for(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Update_dimensionsContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_update_dimensions; + } + + FOR() { + return this.getToken(n1qlParser.FOR, 0); + } + + update_dimension() { + return this.getTypedRuleContext(Update_dimensionContext, 0); + } + + update_dimensions() { + return this.getTypedRuleContext(Update_dimensionsContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitUpdate_dimensions(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Update_dimensionContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_update_dimension; + } + + update_binding() { + return this.getTypedRuleContext(Update_bindingContext, 0); + } + + update_dimension() { + return this.getTypedRuleContext(Update_dimensionContext, 0); + } + + COMMA() { + return this.getToken(n1qlParser.COMMA, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitUpdate_dimension(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Update_bindingContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_update_binding; + } + + variable = function (i) { + if (i === undefined) { + i = null; + } + if (i === null) { + return this.getTypedRuleContexts(VariableContext); + } else { + return this.getTypedRuleContext(VariableContext, i); + } + }; + + IN() { + return this.getToken(n1qlParser.IN, 0); + } + + expr() { + return this.getTypedRuleContext(ExprContext, 0); + } + + WITHIN() { + return this.getToken(n1qlParser.WITHIN, 0); + } + + COLON() { + return this.getToken(n1qlParser.COLON, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitUpdate_binding(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class VariableContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_variable; + } + + IDENT() { + return this.getToken(n1qlParser.IDENT, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitVariable(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Opt_whenContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_opt_when; + } + + WHEN() { + return this.getToken(n1qlParser.WHEN, 0); + } + + expr() { + return this.getTypedRuleContext(ExprContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitOpt_when(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class UnsetContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_unset; + } + + UNSET() { + return this.getToken(n1qlParser.UNSET, 0); + } + + unset_terms() { + return this.getTypedRuleContext(Unset_termsContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitUnset(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Unset_termsContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_unset_terms; + } + + unset_term() { + return this.getTypedRuleContext(Unset_termContext, 0); + } + + unset_terms() { + return this.getTypedRuleContext(Unset_termsContext, 0); + } + + COMMA() { + return this.getToken(n1qlParser.COMMA, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitUnset_terms(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Unset_termContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_unset_term; + } + + path() { + return this.getTypedRuleContext(PathContext, 0); + } + + opt_update_for() { + return this.getTypedRuleContext(Opt_update_forContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitUnset_term(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class MergeContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_merge; + } + + MERGE() { + return this.getToken(n1qlParser.MERGE, 0); + } + + INTO() { + return this.getToken(n1qlParser.INTO, 0); + } + + simple_keyspace_ref() { + return this.getTypedRuleContext(Simple_keyspace_refContext, 0); + } + + opt_use_merge() { + return this.getTypedRuleContext(Opt_use_mergeContext, 0); + } + + USING() { + return this.getToken(n1qlParser.USING, 0); + } + + simple_from_term() { + return this.getTypedRuleContext(Simple_from_termContext, 0); + } + + ON() { + return this.getToken(n1qlParser.ON, 0); + } + + opt_key() { + return this.getTypedRuleContext(Opt_keyContext, 0); + } + + expr() { + return this.getTypedRuleContext(ExprContext, 0); + } + + merge_actions() { + return this.getTypedRuleContext(Merge_actionsContext, 0); + } + + opt_limit() { + return this.getTypedRuleContext(Opt_limitContext, 0); + } + + opt_returning() { + return this.getTypedRuleContext(Opt_returningContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitMerge(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Opt_use_mergeContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_opt_use_merge; + } + + opt_use() { + return this.getTypedRuleContext(Opt_useContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitOpt_use_merge(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Opt_keyContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_opt_key; + } + + key() { + return this.getTypedRuleContext(KeyContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitOpt_key(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Merge_actionsContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_merge_actions; + } + + WHEN() { + return this.getToken(n1qlParser.WHEN, 0); + } + + MATCHED() { + return this.getToken(n1qlParser.MATCHED, 0); + } + + THEN() { + return this.getToken(n1qlParser.THEN, 0); + } + + UPDATE() { + return this.getToken(n1qlParser.UPDATE, 0); + } + + merge_update() { + return this.getTypedRuleContext(Merge_updateContext, 0); + } + + opt_merge_delete_insert() { + return this.getTypedRuleContext(Opt_merge_delete_insertContext, 0); + } + + DELETE_() { + return this.getToken(n1qlParser.DELETE_, 0); + } + + merge_delete() { + return this.getTypedRuleContext(Merge_deleteContext, 0); + } + + opt_merge_insert() { + return this.getTypedRuleContext(Opt_merge_insertContext, 0); + } + + NOT() { + return this.getToken(n1qlParser.NOT, 0); + } + + INSERT() { + return this.getToken(n1qlParser.INSERT, 0); + } + + merge_insert() { + return this.getTypedRuleContext(Merge_insertContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitMerge_actions(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Opt_merge_delete_insertContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_opt_merge_delete_insert; + } + + WHEN() { + return this.getToken(n1qlParser.WHEN, 0); + } + + MATCHED() { + return this.getToken(n1qlParser.MATCHED, 0); + } + + THEN() { + return this.getToken(n1qlParser.THEN, 0); + } + + DELETE_() { + return this.getToken(n1qlParser.DELETE_, 0); + } + + merge_delete() { + return this.getTypedRuleContext(Merge_deleteContext, 0); + } + + opt_merge_insert() { + return this.getTypedRuleContext(Opt_merge_insertContext, 0); + } + + NOT() { + return this.getToken(n1qlParser.NOT, 0); + } + + INSERT() { + return this.getToken(n1qlParser.INSERT, 0); + } + + merge_insert() { + return this.getTypedRuleContext(Merge_insertContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitOpt_merge_delete_insert(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Opt_merge_insertContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_opt_merge_insert; + } + + WHEN() { + return this.getToken(n1qlParser.WHEN, 0); + } + + NOT() { + return this.getToken(n1qlParser.NOT, 0); + } + + MATCHED() { + return this.getToken(n1qlParser.MATCHED, 0); + } + + THEN() { + return this.getToken(n1qlParser.THEN, 0); + } + + INSERT() { + return this.getToken(n1qlParser.INSERT, 0); + } + + merge_insert() { + return this.getTypedRuleContext(Merge_insertContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitOpt_merge_insert(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Merge_updateContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_merge_update; + } + + set() { + return this.getTypedRuleContext(SetContext, 0); + } + + opt_where() { + return this.getTypedRuleContext(Opt_whereContext, 0); + } + + unset() { + return this.getTypedRuleContext(UnsetContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitMerge_update(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Merge_deleteContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_merge_delete; + } + + opt_where() { + return this.getTypedRuleContext(Opt_whereContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitMerge_delete(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Merge_insertContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_merge_insert; + } + + expr() { + return this.getTypedRuleContext(ExprContext, 0); + } + + opt_where() { + return this.getTypedRuleContext(Opt_whereContext, 0); + } + + key_val_expr() { + return this.getTypedRuleContext(Key_val_exprContext, 0); + } + + key_val_options_expr() { + return this.getTypedRuleContext(Key_val_options_exprContext, 0); + } + + LPAREN() { + return this.getToken(n1qlParser.LPAREN, 0); + } + + key_val_options_expr_header() { + return this.getTypedRuleContext(Key_val_options_expr_headerContext, 0); + } + + RPAREN() { + return this.getToken(n1qlParser.RPAREN, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitMerge_insert(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Grant_roleContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_grant_role; + } + + GRANT() { + return this.getToken(n1qlParser.GRANT, 0); + } + + role_list() { + return this.getTypedRuleContext(Role_listContext, 0); + } + + TO() { + return this.getToken(n1qlParser.TO, 0); + } + + user_list() { + return this.getTypedRuleContext(User_listContext, 0); + } + + ON() { + return this.getToken(n1qlParser.ON, 0); + } + + keyspace_scope_list() { + return this.getTypedRuleContext(Keyspace_scope_listContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitGrant_role(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Role_listContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_role_list; + } + + role_name() { + return this.getTypedRuleContext(Role_nameContext, 0); + } + + role_list() { + return this.getTypedRuleContext(Role_listContext, 0); + } + + COMMA() { + return this.getToken(n1qlParser.COMMA, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitRole_list(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Role_nameContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_role_name; + } + + IDENT() { + return this.getToken(n1qlParser.IDENT, 0); + } + + SELECT() { + return this.getToken(n1qlParser.SELECT, 0); + } + + INSERT() { + return this.getToken(n1qlParser.INSERT, 0); + } + + UPDATE() { + return this.getToken(n1qlParser.UPDATE, 0); + } + + DELETE_() { + return this.getToken(n1qlParser.DELETE_, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitRole_name(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Keyspace_scope_listContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_keyspace_scope_list; + } + + keyspace_scope() { + return this.getTypedRuleContext(Keyspace_scopeContext, 0); + } + + keyspace_scope_list() { + return this.getTypedRuleContext(Keyspace_scope_listContext, 0); + } + + COMMA() { + return this.getToken(n1qlParser.COMMA, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitKeyspace_scope_list(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Keyspace_scopeContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_keyspace_scope; + } + + keyspace_name() { + return this.getTypedRuleContext(Keyspace_nameContext, 0); + } + + namespace_name() { + return this.getTypedRuleContext(Namespace_nameContext, 0); + } + + bucket_name() { + return this.getTypedRuleContext(Bucket_nameContext, 0); + } + + DOT = function (i) { + if (i === undefined) { + i = null; + } + if (i === null) { + return this.getTokens(n1qlParser.DOT); + } else { + return this.getToken(n1qlParser.DOT, i); + } + }; + + scope_name() { + return this.getTypedRuleContext(Scope_nameContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitKeyspace_scope(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class User_listContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_user_list; + } + + user() { + return this.getTypedRuleContext(UserContext, 0); + } + + user_list() { + return this.getTypedRuleContext(User_listContext, 0); + } + + COMMA() { + return this.getToken(n1qlParser.COMMA, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitUser_list(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class UserContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_user; + } + + IDENT = function (i) { + if (i === undefined) { + i = null; + } + if (i === null) { + return this.getTokens(n1qlParser.IDENT); + } else { + return this.getToken(n1qlParser.IDENT, i); + } + }; + + COLON() { + return this.getToken(n1qlParser.COLON, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitUser(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Revoke_roleContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_revoke_role; + } + + REVOKE() { + return this.getToken(n1qlParser.REVOKE, 0); + } + + role_list() { + return this.getTypedRuleContext(Role_listContext, 0); + } + + FROM() { + return this.getToken(n1qlParser.FROM, 0); + } + + user_list() { + return this.getTypedRuleContext(User_listContext, 0); + } + + ON() { + return this.getToken(n1qlParser.ON, 0); + } + + keyspace_scope_list() { + return this.getTypedRuleContext(Keyspace_scope_listContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitRevoke_role(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Create_scopeContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_create_scope; + } + + CREATE() { + return this.getToken(n1qlParser.CREATE, 0); + } + + SCOPE() { + return this.getToken(n1qlParser.SCOPE, 0); + } + + named_scope_ref() { + return this.getTypedRuleContext(Named_scope_refContext, 0); + } + + if_not_exists() { + return this.getTypedRuleContext(If_not_existsContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitCreate_scope(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Drop_scopeContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_drop_scope; + } + + DROP() { + return this.getToken(n1qlParser.DROP, 0); + } + + SCOPE() { + return this.getToken(n1qlParser.SCOPE, 0); + } + + named_scope_ref() { + return this.getTypedRuleContext(Named_scope_refContext, 0); + } + + if_exists() { + return this.getTypedRuleContext(If_existsContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitDrop_scope(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Create_collectionContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_create_collection; + } + + CREATE() { + return this.getToken(n1qlParser.CREATE, 0); + } + + COLLECTION() { + return this.getToken(n1qlParser.COLLECTION, 0); + } + + named_keyspace_ref() { + return this.getTypedRuleContext(Named_keyspace_refContext, 0); + } + + if_not_exists() { + return this.getTypedRuleContext(If_not_existsContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitCreate_collection(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Drop_collectionContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_drop_collection; + } + + DROP() { + return this.getToken(n1qlParser.DROP, 0); + } + + COLLECTION() { + return this.getToken(n1qlParser.COLLECTION, 0); + } + + named_keyspace_ref() { + return this.getTypedRuleContext(Named_keyspace_refContext, 0); + } + + if_exists() { + return this.getTypedRuleContext(If_existsContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitDrop_collection(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Flush_collectionContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_flush_collection; + } + + flush_or_truncate() { + return this.getTypedRuleContext(Flush_or_truncateContext, 0); + } + + COLLECTION() { + return this.getToken(n1qlParser.COLLECTION, 0); + } + + named_keyspace_ref() { + return this.getTypedRuleContext(Named_keyspace_refContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitFlush_collection(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Flush_or_truncateContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_flush_or_truncate; + } + + FLUSH() { + return this.getToken(n1qlParser.FLUSH, 0); + } + + TRUNCATE() { + return this.getToken(n1qlParser.TRUNCATE, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitFlush_or_truncate(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Create_indexContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_create_index; + } + + CREATE() { + return this.getToken(n1qlParser.CREATE, 0); + } + + INDEX() { + return this.getToken(n1qlParser.INDEX, 0); + } + + index_name() { + return this.getTypedRuleContext(Index_nameContext, 0); + } + + ON() { + return this.getToken(n1qlParser.ON, 0); + } + + named_keyspace_ref() { + return this.getTypedRuleContext(Named_keyspace_refContext, 0); + } + + LPAREN() { + return this.getToken(n1qlParser.LPAREN, 0); + } + + index_terms() { + return this.getTypedRuleContext(Index_termsContext, 0); + } + + RPAREN() { + return this.getToken(n1qlParser.RPAREN, 0); + } + + index_partition() { + return this.getTypedRuleContext(Index_partitionContext, 0); + } + + index_where() { + return this.getTypedRuleContext(Index_whereContext, 0); + } + + opt_index_using() { + return this.getTypedRuleContext(Opt_index_usingContext, 0); + } + + opt_index_with() { + return this.getTypedRuleContext(Opt_index_withContext, 0); + } + + if_not_exists() { + return this.getTypedRuleContext(If_not_existsContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitCreate_index(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Create_primary_indexContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_create_primary_index; + } + + CREATE() { + return this.getToken(n1qlParser.CREATE, 0); + } + + PRIMARY() { + return this.getToken(n1qlParser.PRIMARY, 0); + } + + INDEX() { + return this.getToken(n1qlParser.INDEX, 0); + } + + opt_primary_name() { + return this.getTypedRuleContext(Opt_primary_nameContext, 0); + } + + ON() { + return this.getToken(n1qlParser.ON, 0); + } + + named_keyspace_ref() { + return this.getTypedRuleContext(Named_keyspace_refContext, 0); + } + + index_partition() { + return this.getTypedRuleContext(Index_partitionContext, 0); + } + + opt_index_using() { + return this.getTypedRuleContext(Opt_index_usingContext, 0); + } + + opt_index_with() { + return this.getTypedRuleContext(Opt_index_withContext, 0); + } + + if_not_exists() { + return this.getTypedRuleContext(If_not_existsContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitCreate_primary_index(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Opt_primary_nameContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_opt_primary_name; + } + + index_name() { + return this.getTypedRuleContext(Index_nameContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitOpt_primary_name(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Index_nameContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_index_name; + } + + IDENT() { + return this.getToken(n1qlParser.IDENT, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitIndex_name(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Opt_index_nameContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_opt_index_name; + } + + index_name() { + return this.getTypedRuleContext(Index_nameContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitOpt_index_name(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Named_keyspace_refContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_named_keyspace_ref; + } + + simple_named_keyspace_ref() { + return this.getTypedRuleContext(Simple_named_keyspace_refContext, 0); + } + + namespace_name() { + return this.getTypedRuleContext(Namespace_nameContext, 0); + } + + bucket_name() { + return this.getTypedRuleContext(Bucket_nameContext, 0); + } + + DOT = function (i) { + if (i === undefined) { + i = null; + } + if (i === null) { + return this.getTokens(n1qlParser.DOT); + } else { + return this.getToken(n1qlParser.DOT, i); + } + }; + + scope_name() { + return this.getTypedRuleContext(Scope_nameContext, 0); + } + + keyspace_name() { + return this.getTypedRuleContext(Keyspace_nameContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitNamed_keyspace_ref(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Simple_named_keyspace_refContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_simple_named_keyspace_ref; + } + + keyspace_name() { + return this.getTypedRuleContext(Keyspace_nameContext, 0); + } + + namespace_name() { + return this.getTypedRuleContext(Namespace_nameContext, 0); + } + + bucket_name() { + return this.getTypedRuleContext(Bucket_nameContext, 0); + } + + DOT = function (i) { + if (i === undefined) { + i = null; + } + if (i === null) { + return this.getTokens(n1qlParser.DOT); + } else { + return this.getToken(n1qlParser.DOT, i); + } + }; + + scope_name() { + return this.getTypedRuleContext(Scope_nameContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitSimple_named_keyspace_ref(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Named_scope_refContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_named_scope_ref; + } + + namespace_name() { + return this.getTypedRuleContext(Namespace_nameContext, 0); + } + + bucket_name() { + return this.getTypedRuleContext(Bucket_nameContext, 0); + } + + DOT() { + return this.getToken(n1qlParser.DOT, 0); + } + + scope_name() { + return this.getTypedRuleContext(Scope_nameContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitNamed_scope_ref(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Index_partitionContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_index_partition; + } + + PARTITION() { + return this.getToken(n1qlParser.PARTITION, 0); + } + + BY() { + return this.getToken(n1qlParser.BY, 0); + } + + HASH() { + return this.getToken(n1qlParser.HASH, 0); + } + + LPAREN() { + return this.getToken(n1qlParser.LPAREN, 0); + } + + exprs() { + return this.getTypedRuleContext(ExprsContext, 0); + } + + RPAREN() { + return this.getToken(n1qlParser.RPAREN, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitIndex_partition(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Opt_index_usingContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_opt_index_using; + } + + index_using() { + return this.getTypedRuleContext(Index_usingContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitOpt_index_using(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Index_usingContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_index_using; + } + + USING() { + return this.getToken(n1qlParser.USING, 0); + } + + VIEW() { + return this.getToken(n1qlParser.VIEW, 0); + } + + GSI() { + return this.getToken(n1qlParser.GSI, 0); + } + + FTS() { + return this.getToken(n1qlParser.FTS, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitIndex_using(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Opt_index_withContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_opt_index_with; + } + + index_with() { + return this.getTypedRuleContext(Index_withContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitOpt_index_with(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Index_withContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_index_with; + } + + WITH() { + return this.getToken(n1qlParser.WITH, 0); + } + + expr() { + return this.getTypedRuleContext(ExprContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitIndex_with(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Index_termsContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_index_terms; + } + + index_term() { + return this.getTypedRuleContext(Index_termContext, 0); + } + + index_terms() { + return this.getTypedRuleContext(Index_termsContext, 0); + } + + COMMA() { + return this.getToken(n1qlParser.COMMA, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitIndex_terms(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Index_termContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_index_term; + } + + index_term_expr() { + return this.getTypedRuleContext(Index_term_exprContext, 0); + } + + opt_ikattr() { + return this.getTypedRuleContext(Opt_ikattrContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitIndex_term(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Index_term_exprContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_index_term_expr; + } + + index_expr() { + return this.getTypedRuleContext(Index_exprContext, 0); + } + + all() { + return this.getTypedRuleContext(AllContext, 0); + } + + DISTINCT() { + return this.getToken(n1qlParser.DISTINCT, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitIndex_term_expr(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Index_exprContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_index_expr; + } + + expr() { + return this.getTypedRuleContext(ExprContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitIndex_expr(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class AllContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_all; + } + + ALL() { + return this.getToken(n1qlParser.ALL, 0); + } + + EACH() { + return this.getToken(n1qlParser.EACH, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitAll(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Index_whereContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_index_where; + } + + WHERE() { + return this.getToken(n1qlParser.WHERE, 0); + } + + index_expr() { + return this.getTypedRuleContext(Index_exprContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitIndex_where(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Opt_ikattrContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_opt_ikattr; + } + + ikattr = function (i) { + if (i === undefined) { + i = null; + } + if (i === null) { + return this.getTypedRuleContexts(IkattrContext); + } else { + return this.getTypedRuleContext(IkattrContext, i); + } + }; + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitOpt_ikattr(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class IkattrContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_ikattr; + } + + ASC() { + return this.getToken(n1qlParser.ASC, 0); + } + + DESC() { + return this.getToken(n1qlParser.DESC, 0); + } + + MISSING() { + return this.getToken(n1qlParser.MISSING, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitIkattr(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Drop_indexContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_drop_index; + } + + DROP() { + return this.getToken(n1qlParser.DROP, 0); + } + + PRIMARY() { + return this.getToken(n1qlParser.PRIMARY, 0); + } + + INDEX() { + return this.getToken(n1qlParser.INDEX, 0); + } + + ON() { + return this.getToken(n1qlParser.ON, 0); + } + + named_keyspace_ref() { + return this.getTypedRuleContext(Named_keyspace_refContext, 0); + } + + opt_index_using() { + return this.getTypedRuleContext(Opt_index_usingContext, 0); + } + + simple_named_keyspace_ref() { + return this.getTypedRuleContext(Simple_named_keyspace_refContext, 0); + } + + DOT() { + return this.getToken(n1qlParser.DOT, 0); + } + + index_name() { + return this.getTypedRuleContext(Index_nameContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitDrop_index(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Alter_indexContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_alter_index; + } + + ALTER() { + return this.getToken(n1qlParser.ALTER, 0); + } + + INDEX() { + return this.getToken(n1qlParser.INDEX, 0); + } + + simple_named_keyspace_ref() { + return this.getTypedRuleContext(Simple_named_keyspace_refContext, 0); + } + + DOT() { + return this.getToken(n1qlParser.DOT, 0); + } + + index_name() { + return this.getTypedRuleContext(Index_nameContext, 0); + } + + opt_index_using() { + return this.getTypedRuleContext(Opt_index_usingContext, 0); + } + + index_with() { + return this.getTypedRuleContext(Index_withContext, 0); + } + + ON() { + return this.getToken(n1qlParser.ON, 0); + } + + named_keyspace_ref() { + return this.getTypedRuleContext(Named_keyspace_refContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitAlter_index(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Build_indexContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_build_index; + } + + BUILD() { + return this.getToken(n1qlParser.BUILD, 0); + } + + INDEX() { + return this.getToken(n1qlParser.INDEX, 0); + } + + ON() { + return this.getToken(n1qlParser.ON, 0); + } + + named_keyspace_ref() { + return this.getTypedRuleContext(Named_keyspace_refContext, 0); + } + + LPAREN() { + return this.getToken(n1qlParser.LPAREN, 0); + } + + exprs() { + return this.getTypedRuleContext(ExprsContext, 0); + } + + RPAREN() { + return this.getToken(n1qlParser.RPAREN, 0); + } + + opt_index_using() { + return this.getTypedRuleContext(Opt_index_usingContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitBuild_index(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Create_functionContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_create_function; + } + + CREATE() { + return this.getToken(n1qlParser.CREATE, 0); + } + + opt_replace() { + return this.getTypedRuleContext(Opt_replaceContext, 0); + } + + FUNCTION() { + return this.getToken(n1qlParser.FUNCTION, 0); + } + + func_name() { + return this.getTypedRuleContext(Func_nameContext, 0); + } + + LPAREN() { + return this.getToken(n1qlParser.LPAREN, 0); + } + + parm_list() { + return this.getTypedRuleContext(Parm_listContext, 0); + } + + RPAREN() { + return this.getToken(n1qlParser.RPAREN, 0); + } + + func_body() { + return this.getTypedRuleContext(Func_bodyContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitCreate_function(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Opt_replaceContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_opt_replace; + } + + OR() { + return this.getToken(n1qlParser.OR, 0); + } + + REPLACE() { + return this.getToken(n1qlParser.REPLACE, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitOpt_replace(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Func_nameContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_func_name; + } + + short_func_name() { + return this.getTypedRuleContext(Short_func_nameContext, 0); + } + + long_func_name() { + return this.getTypedRuleContext(Long_func_nameContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitFunc_name(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Short_func_nameContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_short_func_name; + } + + keyspace_name() { + return this.getTypedRuleContext(Keyspace_nameContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitShort_func_name(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Long_func_nameContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_long_func_name; + } + + namespace_term() { + return this.getTypedRuleContext(Namespace_termContext, 0); + } + + keyspace_name() { + return this.getTypedRuleContext(Keyspace_nameContext, 0); + } + + bucket_name() { + return this.getTypedRuleContext(Bucket_nameContext, 0); + } + + DOT = function (i) { + if (i === undefined) { + i = null; + } + if (i === null) { + return this.getTokens(n1qlParser.DOT); + } else { + return this.getToken(n1qlParser.DOT, i); + } + }; + + scope_name() { + return this.getTypedRuleContext(Scope_nameContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitLong_func_name(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Parm_listContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_parm_list; + } + + DOT = function (i) { + if (i === undefined) { + i = null; + } + if (i === null) { + return this.getTokens(n1qlParser.DOT); + } else { + return this.getToken(n1qlParser.DOT, i); + } + }; + + parameter_terms() { + return this.getTypedRuleContext(Parameter_termsContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitParm_list(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Parameter_termsContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_parameter_terms; + } + + IDENT() { + return this.getToken(n1qlParser.IDENT, 0); + } + + parameter_terms() { + return this.getTypedRuleContext(Parameter_termsContext, 0); + } + + COMMA() { + return this.getToken(n1qlParser.COMMA, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitParameter_terms(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Func_bodyContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_func_body; + } + + LBRACE() { + return this.getToken(n1qlParser.LBRACE, 0); + } + + expr() { + return this.getTypedRuleContext(ExprContext, 0); + } + + RBRACE() { + return this.getToken(n1qlParser.RBRACE, 0); + } + + LANGUAGE() { + return this.getToken(n1qlParser.LANGUAGE, 0); + } + + INLINE() { + return this.getToken(n1qlParser.INLINE, 0); + } + + AS() { + return this.getToken(n1qlParser.AS, 0); + } + + GOLANG() { + return this.getToken(n1qlParser.GOLANG, 0); + } + + STR = function (i) { + if (i === undefined) { + i = null; + } + if (i === null) { + return this.getTokens(n1qlParser.STR); + } else { + return this.getToken(n1qlParser.STR, i); + } + }; + + AT() { + return this.getToken(n1qlParser.AT, 0); + } + + JAVASCRIPT() { + return this.getToken(n1qlParser.JAVASCRIPT, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitFunc_body(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Drop_functionContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_drop_function; + } + + DROP() { + return this.getToken(n1qlParser.DROP, 0); + } + + FUNCTION() { + return this.getToken(n1qlParser.FUNCTION, 0); + } + + func_name() { + return this.getTypedRuleContext(Func_nameContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitDrop_function(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Execute_functionContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_execute_function; + } + + EXECUTE() { + return this.getToken(n1qlParser.EXECUTE, 0); + } + + FUNCTION() { + return this.getToken(n1qlParser.FUNCTION, 0); + } + + func_name() { + return this.getTypedRuleContext(Func_nameContext, 0); + } + + LPAREN() { + return this.getToken(n1qlParser.LPAREN, 0); + } + + opt_exprs() { + return this.getTypedRuleContext(Opt_exprsContext, 0); + } + + RPAREN() { + return this.getToken(n1qlParser.RPAREN, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitExecute_function(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Update_statisticsContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_update_statistics; + } + + UPDATE() { + return this.getToken(n1qlParser.UPDATE, 0); + } + + STATISTICS() { + return this.getToken(n1qlParser.STATISTICS, 0); + } + + opt_for() { + return this.getTypedRuleContext(Opt_forContext, 0); + } + + named_keyspace_ref() { + return this.getTypedRuleContext(Named_keyspace_refContext, 0); + } + + LPAREN() { + return this.getToken(n1qlParser.LPAREN, 0); + } + + update_stat_terms() { + return this.getTypedRuleContext(Update_stat_termsContext, 0); + } + + RPAREN() { + return this.getToken(n1qlParser.RPAREN, 0); + } + + opt_infer_ustat_with() { + return this.getTypedRuleContext(Opt_infer_ustat_withContext, 0); + } + + DELETE_() { + return this.getToken(n1qlParser.DELETE_, 0); + } + + ALL() { + return this.getToken(n1qlParser.ALL, 0); + } + + INDEX() { + return this.getToken(n1qlParser.INDEX, 0); + } + + exprs() { + return this.getTypedRuleContext(ExprsContext, 0); + } + + opt_index_using() { + return this.getTypedRuleContext(Opt_index_usingContext, 0); + } + + FOR() { + return this.getToken(n1qlParser.FOR, 0); + } + + simple_named_keyspace_ref() { + return this.getTypedRuleContext(Simple_named_keyspace_refContext, 0); + } + + DOT() { + return this.getToken(n1qlParser.DOT, 0); + } + + index_name() { + return this.getTypedRuleContext(Index_nameContext, 0); + } + + ON() { + return this.getToken(n1qlParser.ON, 0); + } + + ANALYZE() { + return this.getToken(n1qlParser.ANALYZE, 0); + } + + opt_keyspace_collection() { + return this.getTypedRuleContext(Opt_keyspace_collectionContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitUpdate_statistics(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Opt_forContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_opt_for; + } + + FOR() { + return this.getToken(n1qlParser.FOR, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitOpt_for(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Update_stat_termsContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_update_stat_terms; + } + + update_stat_term() { + return this.getTypedRuleContext(Update_stat_termContext, 0); + } + + update_stat_terms() { + return this.getTypedRuleContext(Update_stat_termsContext, 0); + } + + COMMA() { + return this.getToken(n1qlParser.COMMA, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitUpdate_stat_terms(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Update_stat_termContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_update_stat_term; + } + + index_term_expr() { + return this.getTypedRuleContext(Index_term_exprContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitUpdate_stat_term(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class PathContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_path; + } + + IDENT() { + return this.getToken(n1qlParser.IDENT, 0); + } + + path() { + return this.getTypedRuleContext(PathContext, 0); + } + + DOT() { + return this.getToken(n1qlParser.DOT, 0); + } + + IDENT_ICASE() { + return this.getToken(n1qlParser.IDENT_ICASE, 0); + } + + LBRACKET() { + return this.getToken(n1qlParser.LBRACKET, 0); + } + + expr() { + return this.getTypedRuleContext(ExprContext, 0); + } + + RBRACKET() { + return this.getToken(n1qlParser.RBRACKET, 0); + } + + RBRACKET_ICASE() { + return this.getToken(n1qlParser.RBRACKET_ICASE, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitPath(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class ExprContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_expr; + } + + c_expr() { + return this.getTypedRuleContext(C_exprContext, 0); + } + + NOT() { + return this.getToken(n1qlParser.NOT, 0); + } + + expr = function (i) { + if (i === undefined) { + i = null; + } + if (i === null) { + return this.getTypedRuleContexts(ExprContext); + } else { + return this.getTypedRuleContext(ExprContext, i); + } + }; + + EXISTS() { + return this.getToken(n1qlParser.EXISTS, 0); + } + + PLUS() { + return this.getToken(n1qlParser.PLUS, 0); + } + + MINUS() { + return this.getToken(n1qlParser.MINUS, 0); + } + + STAR() { + return this.getToken(n1qlParser.STAR, 0); + } + + DIV() { + return this.getToken(n1qlParser.DIV, 0); + } + + MOD() { + return this.getToken(n1qlParser.MOD, 0); + } + + CONCAT() { + return this.getToken(n1qlParser.CONCAT, 0); + } + + AND() { + return this.getToken(n1qlParser.AND, 0); + } + + OR() { + return this.getToken(n1qlParser.OR, 0); + } + + EQ() { + return this.getToken(n1qlParser.EQ, 0); + } + + DEQ() { + return this.getToken(n1qlParser.DEQ, 0); + } + + NE() { + return this.getToken(n1qlParser.NE, 0); + } + + LT() { + return this.getToken(n1qlParser.LT, 0); + } + + GT() { + return this.getToken(n1qlParser.GT, 0); + } + + LE() { + return this.getToken(n1qlParser.LE, 0); + } + + GE() { + return this.getToken(n1qlParser.GE, 0); + } + + LIKE() { + return this.getToken(n1qlParser.LIKE, 0); + } + + IN() { + return this.getToken(n1qlParser.IN, 0); + } + + WITHIN() { + return this.getToken(n1qlParser.WITHIN, 0); + } + + DOT() { + return this.getToken(n1qlParser.DOT, 0); + } + + IDENT() { + return this.getToken(n1qlParser.IDENT, 0); + } + + IDENT_ICASE() { + return this.getToken(n1qlParser.IDENT_ICASE, 0); + } + + LBRACKET() { + return this.getToken(n1qlParser.LBRACKET, 0); + } + + RBRACKET() { + return this.getToken(n1qlParser.RBRACKET, 0); + } + + RBRACKET_ICASE() { + return this.getToken(n1qlParser.RBRACKET_ICASE, 0); + } + + COLON() { + return this.getToken(n1qlParser.COLON, 0); + } + + BETWEEN() { + return this.getToken(n1qlParser.BETWEEN, 0); + } + + b_expr = function (i) { + if (i === undefined) { + i = null; + } + if (i === null) { + return this.getTypedRuleContexts(B_exprContext); + } else { + return this.getTypedRuleContext(B_exprContext, i); + } + }; + + IS() { + return this.getToken(n1qlParser.IS, 0); + } + + NULL() { + return this.getToken(n1qlParser.NULL, 0); + } + + MISSING() { + return this.getToken(n1qlParser.MISSING, 0); + } + + valued() { + return this.getTypedRuleContext(ValuedContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitExpr(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class ValuedContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_valued; + } + + VALUED() { + return this.getToken(n1qlParser.VALUED, 0); + } + + KNOWN() { + return this.getToken(n1qlParser.KNOWN, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitValued(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class C_exprContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_c_expr; + } + + literal() { + return this.getTypedRuleContext(LiteralContext, 0); + } + + construction_expr() { + return this.getTypedRuleContext(Construction_exprContext, 0); + } + + IDENT() { + return this.getToken(n1qlParser.IDENT, 0); + } + + IDENT_ICASE() { + return this.getToken(n1qlParser.IDENT_ICASE, 0); + } + + SELF() { + return this.getToken(n1qlParser.SELF, 0); + } + + param_expr() { + return this.getTypedRuleContext(Param_exprContext, 0); + } + + function_expr() { + return this.getTypedRuleContext(Function_exprContext, 0); + } + + MINUS() { + return this.getToken(n1qlParser.MINUS, 0); + } + + case_expr() { + return this.getTypedRuleContext(Case_exprContext, 0); + } + + collection_expr() { + return this.getTypedRuleContext(Collection_exprContext, 0); + } + + paren_expr() { + return this.getTypedRuleContext(Paren_exprContext, 0); + } + + COVER() { + return this.getToken(n1qlParser.COVER, 0); + } + + LPAREN() { + return this.getToken(n1qlParser.LPAREN, 0); + } + + expr() { + return this.getTypedRuleContext(ExprContext, 0); + } + + RPAREN() { + return this.getToken(n1qlParser.RPAREN, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitC_expr(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class B_exprContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_b_expr; + } + + c_expr() { + return this.getTypedRuleContext(C_exprContext, 0); + } + + b_expr = function (i) { + if (i === undefined) { + i = null; + } + if (i === null) { + return this.getTypedRuleContexts(B_exprContext); + } else { + return this.getTypedRuleContext(B_exprContext, i); + } + }; + + PLUS() { + return this.getToken(n1qlParser.PLUS, 0); + } + + MINUS() { + return this.getToken(n1qlParser.MINUS, 0); + } + + STAR() { + return this.getToken(n1qlParser.STAR, 0); + } + + DIV() { + return this.getToken(n1qlParser.DIV, 0); + } + + MOD() { + return this.getToken(n1qlParser.MOD, 0); + } + + CONCAT() { + return this.getToken(n1qlParser.CONCAT, 0); + } + + DOT() { + return this.getToken(n1qlParser.DOT, 0); + } + + IDENT() { + return this.getToken(n1qlParser.IDENT, 0); + } + + IDENT_ICASE() { + return this.getToken(n1qlParser.IDENT_ICASE, 0); + } + + LBRACKET() { + return this.getToken(n1qlParser.LBRACKET, 0); + } + + expr = function (i) { + if (i === undefined) { + i = null; + } + if (i === null) { + return this.getTypedRuleContexts(ExprContext); + } else { + return this.getTypedRuleContext(ExprContext, i); + } + }; + + RBRACKET() { + return this.getToken(n1qlParser.RBRACKET, 0); + } + + RBRACKET_ICASE() { + return this.getToken(n1qlParser.RBRACKET_ICASE, 0); + } + + COLON() { + return this.getToken(n1qlParser.COLON, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitB_expr(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class LiteralContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_literal; + } + + NULL() { + return this.getToken(n1qlParser.NULL, 0); + } + + MISSING() { + return this.getToken(n1qlParser.MISSING, 0); + } + + FALSE() { + return this.getToken(n1qlParser.FALSE, 0); + } + + TRUE() { + return this.getToken(n1qlParser.TRUE, 0); + } + + NUM() { + return this.getToken(n1qlParser.NUM, 0); + } + + INT() { + return this.getToken(n1qlParser.INT, 0); + } + + STR() { + return this.getToken(n1qlParser.STR, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitLiteral(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Construction_exprContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_construction_expr; + } + + object() { + return this.getTypedRuleContext(ObjectContext, 0); + } + + array() { + return this.getTypedRuleContext(ArrayContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitConstruction_expr(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class ObjectContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_object; + } + + LBRACE() { + return this.getToken(n1qlParser.LBRACE, 0); + } + + opt_members() { + return this.getTypedRuleContext(Opt_membersContext, 0); + } + + RBRACE() { + return this.getToken(n1qlParser.RBRACE, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitObject(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Opt_membersContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_opt_members; + } + + members() { + return this.getTypedRuleContext(MembersContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitOpt_members(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class MembersContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_members; + } + + member() { + return this.getTypedRuleContext(MemberContext, 0); + } + + members() { + return this.getTypedRuleContext(MembersContext, 0); + } + + COMMA() { + return this.getToken(n1qlParser.COMMA, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitMembers(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class MemberContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_member; + } + + expr = function (i) { + if (i === undefined) { + i = null; + } + if (i === null) { + return this.getTypedRuleContexts(ExprContext); + } else { + return this.getTypedRuleContext(ExprContext, i); + } + }; + + COLON() { + return this.getToken(n1qlParser.COLON, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitMember(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class ArrayContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_array; + } + + LBRACKET() { + return this.getToken(n1qlParser.LBRACKET, 0); + } + + opt_exprs() { + return this.getTypedRuleContext(Opt_exprsContext, 0); + } + + RBRACKET() { + return this.getToken(n1qlParser.RBRACKET, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitArray(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Opt_exprsContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_opt_exprs; + } + + exprs() { + return this.getTypedRuleContext(ExprsContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitOpt_exprs(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class ExprsContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_exprs; + } + + expr() { + return this.getTypedRuleContext(ExprContext, 0); + } + + exprs() { + return this.getTypedRuleContext(ExprsContext, 0); + } + + COMMA() { + return this.getToken(n1qlParser.COMMA, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitExprs(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Param_exprContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_param_expr; + } + + NAMED_PARAM() { + return this.getToken(n1qlParser.NAMED_PARAM, 0); + } + + POSITIONAL_PARAM() { + return this.getToken(n1qlParser.POSITIONAL_PARAM, 0); + } + + NEXT_PARAM() { + return this.getToken(n1qlParser.NEXT_PARAM, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitParam_expr(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Case_exprContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_case_expr; + } + + CASE() { + return this.getToken(n1qlParser.CASE, 0); + } + + simple_or_searched_case() { + return this.getTypedRuleContext(Simple_or_searched_caseContext, 0); + } + + END() { + return this.getToken(n1qlParser.END, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitCase_expr(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Simple_or_searched_caseContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_simple_or_searched_case; + } + + simple_case() { + return this.getTypedRuleContext(Simple_caseContext, 0); + } + + searched_case() { + return this.getTypedRuleContext(Searched_caseContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitSimple_or_searched_case(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Simple_caseContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_simple_case; + } + + expr() { + return this.getTypedRuleContext(ExprContext, 0); + } + + when_thens() { + return this.getTypedRuleContext(When_thensContext, 0); + } + + opt_else() { + return this.getTypedRuleContext(Opt_elseContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitSimple_case(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class When_thensContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_when_thens; + } + + WHEN() { + return this.getToken(n1qlParser.WHEN, 0); + } + + expr = function (i) { + if (i === undefined) { + i = null; + } + if (i === null) { + return this.getTypedRuleContexts(ExprContext); + } else { + return this.getTypedRuleContext(ExprContext, i); + } + }; + + THEN() { + return this.getToken(n1qlParser.THEN, 0); + } + + when_thens() { + return this.getTypedRuleContext(When_thensContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitWhen_thens(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Searched_caseContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_searched_case; + } + + when_thens() { + return this.getTypedRuleContext(When_thensContext, 0); + } + + opt_else() { + return this.getTypedRuleContext(Opt_elseContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitSearched_case(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Opt_elseContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_opt_else; + } + + ELSE() { + return this.getToken(n1qlParser.ELSE, 0); + } + + expr() { + return this.getTypedRuleContext(ExprContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitOpt_else(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Function_exprContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_function_expr; + } + + NTH_VALUE() { + return this.getToken(n1qlParser.NTH_VALUE, 0); + } + + LPAREN() { + return this.getToken(n1qlParser.LPAREN, 0); + } + + exprs() { + return this.getTypedRuleContext(ExprsContext, 0); + } + + RPAREN() { + return this.getToken(n1qlParser.RPAREN, 0); + } + + opt_from_first_last() { + return this.getTypedRuleContext(Opt_from_first_lastContext, 0); + } + + opt_nulls_treatment() { + return this.getTypedRuleContext(Opt_nulls_treatmentContext, 0); + } + + window_function_details() { + return this.getTypedRuleContext(Window_function_detailsContext, 0); + } + + function_name() { + return this.getTypedRuleContext(Function_nameContext, 0); + } + + opt_exprs() { + return this.getTypedRuleContext(Opt_exprsContext, 0); + } + + opt_filter() { + return this.getTypedRuleContext(Opt_filterContext, 0); + } + + opt_window_function() { + return this.getTypedRuleContext(Opt_window_functionContext, 0); + } + + agg_quantifier() { + return this.getTypedRuleContext(Agg_quantifierContext, 0); + } + + expr() { + return this.getTypedRuleContext(ExprContext, 0); + } + + STAR() { + return this.getToken(n1qlParser.STAR, 0); + } + + long_func_name() { + return this.getTypedRuleContext(Long_func_nameContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitFunction_expr(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Function_nameContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_function_name; + } + + IDENT() { + return this.getToken(n1qlParser.IDENT, 0); + } + + REPLACE() { + return this.getToken(n1qlParser.REPLACE, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitFunction_name(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Collection_exprContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_collection_expr; + } + + collection_cond() { + return this.getTypedRuleContext(Collection_condContext, 0); + } + + collection_xform() { + return this.getTypedRuleContext(Collection_xformContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitCollection_expr(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Collection_condContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_collection_cond; + } + + ANY() { + return this.getToken(n1qlParser.ANY, 0); + } + + coll_bindings() { + return this.getTypedRuleContext(Coll_bindingsContext, 0); + } + + satisfies() { + return this.getTypedRuleContext(SatisfiesContext, 0); + } + + END() { + return this.getToken(n1qlParser.END, 0); + } + + SOME() { + return this.getToken(n1qlParser.SOME, 0); + } + + EVERY() { + return this.getToken(n1qlParser.EVERY, 0); + } + + AND() { + return this.getToken(n1qlParser.AND, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitCollection_cond(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Coll_bindingsContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_coll_bindings; + } + + coll_binding() { + return this.getTypedRuleContext(Coll_bindingContext, 0); + } + + coll_bindings() { + return this.getTypedRuleContext(Coll_bindingsContext, 0); + } + + COMMA() { + return this.getToken(n1qlParser.COMMA, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitColl_bindings(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Coll_bindingContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_coll_binding; + } + + variable = function (i) { + if (i === undefined) { + i = null; + } + if (i === null) { + return this.getTypedRuleContexts(VariableContext); + } else { + return this.getTypedRuleContext(VariableContext, i); + } + }; + + IN() { + return this.getToken(n1qlParser.IN, 0); + } + + expr() { + return this.getTypedRuleContext(ExprContext, 0); + } + + WITHIN() { + return this.getToken(n1qlParser.WITHIN, 0); + } + + COLON() { + return this.getToken(n1qlParser.COLON, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitColl_binding(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class SatisfiesContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_satisfies; + } + + SATISFIES() { + return this.getToken(n1qlParser.SATISFIES, 0); + } + + expr() { + return this.getTypedRuleContext(ExprContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitSatisfies(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Collection_xformContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_collection_xform; + } + + ARRAY() { + return this.getToken(n1qlParser.ARRAY, 0); + } + + expr = function (i) { + if (i === undefined) { + i = null; + } + if (i === null) { + return this.getTypedRuleContexts(ExprContext); + } else { + return this.getTypedRuleContext(ExprContext, i); + } + }; + + FOR() { + return this.getToken(n1qlParser.FOR, 0); + } + + coll_bindings() { + return this.getTypedRuleContext(Coll_bindingsContext, 0); + } + + opt_when() { + return this.getTypedRuleContext(Opt_whenContext, 0); + } + + END() { + return this.getToken(n1qlParser.END, 0); + } + + FIRST() { + return this.getToken(n1qlParser.FIRST, 0); + } + + OBJECT() { + return this.getToken(n1qlParser.OBJECT, 0); + } + + COLON() { + return this.getToken(n1qlParser.COLON, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitCollection_xform(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Paren_exprContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_paren_expr; + } + + LPAREN() { + return this.getToken(n1qlParser.LPAREN, 0); + } + + expr() { + return this.getTypedRuleContext(ExprContext, 0); + } + + RPAREN() { + return this.getToken(n1qlParser.RPAREN, 0); + } + + all_expr() { + return this.getTypedRuleContext(All_exprContext, 0); + } + + subquery_expr() { + return this.getTypedRuleContext(Subquery_exprContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitParen_expr(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Subquery_exprContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_subquery_expr; + } + + CORRELATED() { + return this.getToken(n1qlParser.CORRELATED, 0); + } + + LPAREN() { + return this.getToken(n1qlParser.LPAREN, 0); + } + + fullselect() { + return this.getTypedRuleContext(FullselectContext, 0); + } + + RPAREN() { + return this.getToken(n1qlParser.RPAREN, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitSubquery_expr(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Expr_inputContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_expr_input; + } + + expr() { + return this.getTypedRuleContext(ExprContext, 0); + } + + all_expr() { + return this.getTypedRuleContext(All_exprContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitExpr_input(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class All_exprContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_all_expr; + } + + all() { + return this.getTypedRuleContext(AllContext, 0); + } + + expr() { + return this.getTypedRuleContext(ExprContext, 0); + } + + DISTINCT() { + return this.getToken(n1qlParser.DISTINCT, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitAll_expr(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Opt_window_clauseContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_opt_window_clause; + } + + WINDOW() { + return this.getToken(n1qlParser.WINDOW, 0); + } + + window_list() { + return this.getTypedRuleContext(Window_listContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitOpt_window_clause(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Window_listContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_window_list; + } + + window_term() { + return this.getTypedRuleContext(Window_termContext, 0); + } + + window_list() { + return this.getTypedRuleContext(Window_listContext, 0); + } + + COMMA() { + return this.getToken(n1qlParser.COMMA, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitWindow_list(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Window_termContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_window_term; + } + + IDENT() { + return this.getToken(n1qlParser.IDENT, 0); + } + + AS() { + return this.getToken(n1qlParser.AS, 0); + } + + window_specification() { + return this.getTypedRuleContext(Window_specificationContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitWindow_term(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Window_specificationContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_window_specification; + } + + LPAREN() { + return this.getToken(n1qlParser.LPAREN, 0); + } + + opt_window_name() { + return this.getTypedRuleContext(Opt_window_nameContext, 0); + } + + opt_window_partition() { + return this.getTypedRuleContext(Opt_window_partitionContext, 0); + } + + opt_order_by() { + return this.getTypedRuleContext(Opt_order_byContext, 0); + } + + opt_window_frame() { + return this.getTypedRuleContext(Opt_window_frameContext, 0); + } + + RPAREN() { + return this.getToken(n1qlParser.RPAREN, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitWindow_specification(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Opt_window_nameContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_opt_window_name; + } + + IDENT() { + return this.getToken(n1qlParser.IDENT, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitOpt_window_name(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Opt_window_partitionContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_opt_window_partition; + } + + PARTITION() { + return this.getToken(n1qlParser.PARTITION, 0); + } + + BY() { + return this.getToken(n1qlParser.BY, 0); + } + + exprs() { + return this.getTypedRuleContext(ExprsContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitOpt_window_partition(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Opt_window_frameContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_opt_window_frame; + } + + window_frame_modifier() { + return this.getTypedRuleContext(Window_frame_modifierContext, 0); + } + + window_frame_extents() { + return this.getTypedRuleContext(Window_frame_extentsContext, 0); + } + + opt_window_frame_exclusion() { + return this.getTypedRuleContext(Opt_window_frame_exclusionContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitOpt_window_frame(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Window_frame_modifierContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_window_frame_modifier; + } + + ROWS() { + return this.getToken(n1qlParser.ROWS, 0); + } + + RANGE() { + return this.getToken(n1qlParser.RANGE, 0); + } + + GROUPS() { + return this.getToken(n1qlParser.GROUPS, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitWindow_frame_modifier(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Opt_window_frame_exclusionContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_opt_window_frame_exclusion; + } + + EXCLUDE() { + return this.getToken(n1qlParser.EXCLUDE, 0); + } + + NO() { + return this.getToken(n1qlParser.NO, 0); + } + + OTHERS() { + return this.getToken(n1qlParser.OTHERS, 0); + } + + CURRENT() { + return this.getToken(n1qlParser.CURRENT, 0); + } + + ROW() { + return this.getToken(n1qlParser.ROW, 0); + } + + TIES() { + return this.getToken(n1qlParser.TIES, 0); + } + + GROUP() { + return this.getToken(n1qlParser.GROUP, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitOpt_window_frame_exclusion(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Window_frame_extentsContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_window_frame_extents; + } + + window_frame_extent = function (i) { + if (i === undefined) { + i = null; + } + if (i === null) { + return this.getTypedRuleContexts(Window_frame_extentContext); + } else { + return this.getTypedRuleContext(Window_frame_extentContext, i); + } + }; + + BETWEEN() { + return this.getToken(n1qlParser.BETWEEN, 0); + } + + AND() { + return this.getToken(n1qlParser.AND, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitWindow_frame_extents(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Window_frame_extentContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_window_frame_extent; + } + + UNBOUNDED() { + return this.getToken(n1qlParser.UNBOUNDED, 0); + } + + PRECEDING() { + return this.getToken(n1qlParser.PRECEDING, 0); + } + + FOLLOWING() { + return this.getToken(n1qlParser.FOLLOWING, 0); + } + + CURRENT() { + return this.getToken(n1qlParser.CURRENT, 0); + } + + ROW() { + return this.getToken(n1qlParser.ROW, 0); + } + + expr() { + return this.getTypedRuleContext(ExprContext, 0); + } + + window_frame_valexpr_modifier() { + return this.getTypedRuleContext(Window_frame_valexpr_modifierContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitWindow_frame_extent(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Window_frame_valexpr_modifierContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_window_frame_valexpr_modifier; + } + + PRECEDING() { + return this.getToken(n1qlParser.PRECEDING, 0); + } + + FOLLOWING() { + return this.getToken(n1qlParser.FOLLOWING, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitWindow_frame_valexpr_modifier(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Opt_nulls_treatmentContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_opt_nulls_treatment; + } + + nulls_treatment() { + return this.getTypedRuleContext(Nulls_treatmentContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitOpt_nulls_treatment(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Nulls_treatmentContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_nulls_treatment; + } + + RESPECT() { + return this.getToken(n1qlParser.RESPECT, 0); + } + + NULLS() { + return this.getToken(n1qlParser.NULLS, 0); + } + + IGNORE() { + return this.getToken(n1qlParser.IGNORE, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitNulls_treatment(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Opt_from_first_lastContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_opt_from_first_last; + } + + FROM() { + return this.getToken(n1qlParser.FROM, 0); + } + + first_last() { + return this.getTypedRuleContext(First_lastContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitOpt_from_first_last(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Agg_quantifierContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_agg_quantifier; + } + + ALL() { + return this.getToken(n1qlParser.ALL, 0); + } + + DISTINCT() { + return this.getToken(n1qlParser.DISTINCT, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitAgg_quantifier(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Opt_filterContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_opt_filter; + } + + FILTER() { + return this.getToken(n1qlParser.FILTER, 0); + } + + LPAREN() { + return this.getToken(n1qlParser.LPAREN, 0); + } + + where() { + return this.getTypedRuleContext(WhereContext, 0); + } + + RPAREN() { + return this.getToken(n1qlParser.RPAREN, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitOpt_filter(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Opt_window_functionContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_opt_window_function; + } + + window_function_details() { + return this.getTypedRuleContext(Window_function_detailsContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitOpt_window_function(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Window_function_detailsContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_window_function_details; + } + + OVER() { + return this.getToken(n1qlParser.OVER, 0); + } + + IDENT() { + return this.getToken(n1qlParser.IDENT, 0); + } + + window_specification() { + return this.getTypedRuleContext(Window_specificationContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitWindow_function_details(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Start_transactionContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_start_transaction; + } + + start_or_begin() { + return this.getTypedRuleContext(Start_or_beginContext, 0); + } + + transaction() { + return this.getTypedRuleContext(TransactionContext, 0); + } + + opt_isolation_level() { + return this.getTypedRuleContext(Opt_isolation_levelContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitStart_transaction(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Commit_transactionContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_commit_transaction; + } + + COMMIT() { + return this.getToken(n1qlParser.COMMIT, 0); + } + + opt_transaction() { + return this.getTypedRuleContext(Opt_transactionContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitCommit_transaction(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Rollback_transactionContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_rollback_transaction; + } + + ROLLBACK() { + return this.getToken(n1qlParser.ROLLBACK, 0); + } + + opt_transaction() { + return this.getTypedRuleContext(Opt_transactionContext, 0); + } + + opt_savepoint() { + return this.getTypedRuleContext(Opt_savepointContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitRollback_transaction(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Start_or_beginContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_start_or_begin; + } + + START() { + return this.getToken(n1qlParser.START, 0); + } + + BEGIN() { + return this.getToken(n1qlParser.BEGIN, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitStart_or_begin(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Opt_transactionContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_opt_transaction; + } + + transaction() { + return this.getTypedRuleContext(TransactionContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitOpt_transaction(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class TransactionContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_transaction; + } + + TRAN() { + return this.getToken(n1qlParser.TRAN, 0); + } + + TRANSACTION() { + return this.getToken(n1qlParser.TRANSACTION, 0); + } + + WORK() { + return this.getToken(n1qlParser.WORK, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitTransaction(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Opt_savepointContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_opt_savepoint; + } + + TO() { + return this.getToken(n1qlParser.TO, 0); + } + + SAVEPOINT() { + return this.getToken(n1qlParser.SAVEPOINT, 0); + } + + savepoint_name() { + return this.getTypedRuleContext(Savepoint_nameContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitOpt_savepoint(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Savepoint_nameContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_savepoint_name; + } + + IDENT() { + return this.getToken(n1qlParser.IDENT, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitSavepoint_name(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Opt_isolation_levelContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_opt_isolation_level; + } + + isolation_level() { + return this.getTypedRuleContext(Isolation_levelContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitOpt_isolation_level(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Isolation_levelContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_isolation_level; + } + + ISOLATION() { + return this.getToken(n1qlParser.ISOLATION, 0); + } + + LEVEL() { + return this.getToken(n1qlParser.LEVEL, 0); + } + + isolation_val() { + return this.getTypedRuleContext(Isolation_valContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitIsolation_level(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Isolation_valContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_isolation_val; + } + + READ() { + return this.getToken(n1qlParser.READ, 0); + } + + COMMITTED() { + return this.getToken(n1qlParser.COMMITTED, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitIsolation_val(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class Set_transaction_isolationContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_set_transaction_isolation; + } + + SET() { + return this.getToken(n1qlParser.SET, 0); + } + + TRANSACTION() { + return this.getToken(n1qlParser.TRANSACTION, 0); + } + + isolation_level() { + return this.getTypedRuleContext(Isolation_levelContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitSet_transaction_isolation(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class SavepointContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_savepoint; + } + + SAVEPOINT() { + return this.getToken(n1qlParser.SAVEPOINT, 0); + } + + savepoint_name() { + return this.getTypedRuleContext(Savepoint_nameContext, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitSavepoint(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class If_existsContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_if_exists; + } + + IF() { + return this.getToken(n1qlParser.IF, 0); + } + + EXISTS() { + return this.getToken(n1qlParser.EXISTS, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitIf_exists(this); + } else { + return visitor.visitChildren(this); + } + } +} + +class If_not_existsContext extends antlr4.ParserRuleContext { + constructor(parser, parent, invokingState) { + if (parent === undefined) { + parent = null; + } + if (invokingState === undefined || invokingState === null) { + invokingState = -1; + } + super(parent, invokingState); + this.parser = parser; + this.ruleIndex = n1qlParser.RULE_if_not_exists; + } + + IF() { + return this.getToken(n1qlParser.IF, 0); + } + + NOT() { + return this.getToken(n1qlParser.NOT, 0); + } + + EXISTS() { + return this.getToken(n1qlParser.EXISTS, 0); + } + + accept(visitor) { + if (visitor instanceof n1qlVisitor) { + return visitor.visitIf_not_exists(this); + } else { + return visitor.visitChildren(this); + } + } +} + +n1qlParser.StatementsContext = StatementsContext; +n1qlParser.InputContext = InputContext; +n1qlParser.Opt_trailerContext = Opt_trailerContext; +n1qlParser.Stmt_bodyContext = Stmt_bodyContext; +n1qlParser.StmtContext = StmtContext; +n1qlParser.AdviseContext = AdviseContext; +n1qlParser.Opt_indexContext = Opt_indexContext; +n1qlParser.ExplainContext = ExplainContext; +n1qlParser.PrepareContext = PrepareContext; +n1qlParser.Opt_forceContext = Opt_forceContext; +n1qlParser.Opt_nameContext = Opt_nameContext; +n1qlParser.From_or_asContext = From_or_asContext; +n1qlParser.ExecuteContext = ExecuteContext; +n1qlParser.Execute_usingContext = Execute_usingContext; +n1qlParser.InferContext = InferContext; +n1qlParser.Opt_keyspace_collectionContext = Opt_keyspace_collectionContext; +n1qlParser.Opt_infer_usingContext = Opt_infer_usingContext; +n1qlParser.Opt_infer_ustat_withContext = Opt_infer_ustat_withContext; +n1qlParser.Infer_ustat_withContext = Infer_ustat_withContext; +n1qlParser.Select_stmtContext = Select_stmtContext; +n1qlParser.Dml_stmtContext = Dml_stmtContext; +n1qlParser.Ddl_stmtContext = Ddl_stmtContext; +n1qlParser.Role_stmtContext = Role_stmtContext; +n1qlParser.Index_stmtContext = Index_stmtContext; +n1qlParser.Scope_stmtContext = Scope_stmtContext; +n1qlParser.Collection_stmtContext = Collection_stmtContext; +n1qlParser.Function_stmtContext = Function_stmtContext; +n1qlParser.Transaction_stmtContext = Transaction_stmtContext; +n1qlParser.FullselectContext = FullselectContext; +n1qlParser.Select_termsContext = Select_termsContext; +n1qlParser.Select_termContext = Select_termContext; +n1qlParser.SubselectContext = SubselectContext; +n1qlParser.From_selectContext = From_selectContext; +n1qlParser.Select_fromContext = Select_fromContext; +n1qlParser.Select_clauseContext = Select_clauseContext; +n1qlParser.ProjectionContext = ProjectionContext; +n1qlParser.Opt_quantifierContext = Opt_quantifierContext; +n1qlParser.RawContext = RawContext; +n1qlParser.ProjectsContext = ProjectsContext; +n1qlParser.ProjectContext = ProjectContext; +n1qlParser.Opt_as_aliasContext = Opt_as_aliasContext; +n1qlParser.As_aliasContext = As_aliasContext; +n1qlParser.AliasContext = AliasContext; +n1qlParser.Opt_fromContext = Opt_fromContext; +n1qlParser.FromContext = FromContext; +n1qlParser.From_termContext = From_termContext; +n1qlParser.Simple_from_termContext = Simple_from_termContext; +n1qlParser.UnnestContext = UnnestContext; +n1qlParser.Keyspace_termContext = Keyspace_termContext; +n1qlParser.Keyspace_pathContext = Keyspace_pathContext; +n1qlParser.Namespace_termContext = Namespace_termContext; +n1qlParser.Namespace_nameContext = Namespace_nameContext; +n1qlParser.Bucket_nameContext = Bucket_nameContext; +n1qlParser.Scope_nameContext = Scope_nameContext; +n1qlParser.Keyspace_nameContext = Keyspace_nameContext; +n1qlParser.Opt_useContext = Opt_useContext; +n1qlParser.Use_optionsContext = Use_optionsContext; +n1qlParser.Use_keysContext = Use_keysContext; +n1qlParser.Use_indexContext = Use_indexContext; +n1qlParser.Join_hintContext = Join_hintContext; +n1qlParser.Opt_primaryContext = Opt_primaryContext; +n1qlParser.Index_refsContext = Index_refsContext; +n1qlParser.Index_refContext = Index_refContext; +n1qlParser.Use_hash_optionContext = Use_hash_optionContext; +n1qlParser.Opt_use_del_updContext = Opt_use_del_updContext; +n1qlParser.Opt_join_typeContext = Opt_join_typeContext; +n1qlParser.Opt_outerContext = Opt_outerContext; +n1qlParser.On_keysContext = On_keysContext; +n1qlParser.On_keyContext = On_keyContext; +n1qlParser.Opt_letContext = Opt_letContext; +n1qlParser.Let_Context = Let_Context; +n1qlParser.BindingsContext = BindingsContext; +n1qlParser.BindingContext = BindingContext; +n1qlParser.Opt_withContext = Opt_withContext; +n1qlParser.With_listContext = With_listContext; +n1qlParser.With_termContext = With_termContext; +n1qlParser.Opt_whereContext = Opt_whereContext; +n1qlParser.WhereContext = WhereContext; +n1qlParser.Opt_groupContext = Opt_groupContext; +n1qlParser.GroupContext = GroupContext; +n1qlParser.Group_termsContext = Group_termsContext; +n1qlParser.Group_termContext = Group_termContext; +n1qlParser.Opt_lettingContext = Opt_lettingContext; +n1qlParser.LettingContext = LettingContext; +n1qlParser.Opt_havingContext = Opt_havingContext; +n1qlParser.HavingContext = HavingContext; +n1qlParser.Opt_order_byContext = Opt_order_byContext; +n1qlParser.Order_byContext = Order_byContext; +n1qlParser.Sort_termsContext = Sort_termsContext; +n1qlParser.Sort_termContext = Sort_termContext; +n1qlParser.Opt_dirContext = Opt_dirContext; +n1qlParser.DirContext = DirContext; +n1qlParser.Opt_order_nullsContext = Opt_order_nullsContext; +n1qlParser.First_lastContext = First_lastContext; +n1qlParser.NullsContext = NullsContext; +n1qlParser.Opt_limitContext = Opt_limitContext; +n1qlParser.LimitContext = LimitContext; +n1qlParser.Opt_offsetContext = Opt_offsetContext; +n1qlParser.OffsetContext = OffsetContext; +n1qlParser.InsertContext = InsertContext; +n1qlParser.Simple_keyspace_refContext = Simple_keyspace_refContext; +n1qlParser.Keyspace_refContext = Keyspace_refContext; +n1qlParser.Opt_values_headerContext = Opt_values_headerContext; +n1qlParser.KeyContext = KeyContext; +n1qlParser.Values_listContext = Values_listContext; +n1qlParser.ValuesContext = ValuesContext; +n1qlParser.Next_valuesContext = Next_valuesContext; +n1qlParser.Key_val_exprContext = Key_val_exprContext; +n1qlParser.Key_val_options_exprContext = Key_val_options_exprContext; +n1qlParser.Opt_returningContext = Opt_returningContext; +n1qlParser.ReturningContext = ReturningContext; +n1qlParser.Returns_Context = Returns_Context; +n1qlParser.Key_expr_headerContext = Key_expr_headerContext; +n1qlParser.Value_expr_headerContext = Value_expr_headerContext; +n1qlParser.Options_expr_headerContext = Options_expr_headerContext; +n1qlParser.Key_val_options_expr_headerContext = Key_val_options_expr_headerContext; +n1qlParser.UpsertContext = UpsertContext; +n1qlParser.Delete_Context = Delete_Context; +n1qlParser.UpdateContext = UpdateContext; +n1qlParser.SetContext = SetContext; +n1qlParser.Set_termsContext = Set_termsContext; +n1qlParser.Set_termContext = Set_termContext; +n1qlParser.Function_meta_exprContext = Function_meta_exprContext; +n1qlParser.Opt_update_forContext = Opt_update_forContext; +n1qlParser.Update_forContext = Update_forContext; +n1qlParser.Update_dimensionsContext = Update_dimensionsContext; +n1qlParser.Update_dimensionContext = Update_dimensionContext; +n1qlParser.Update_bindingContext = Update_bindingContext; +n1qlParser.VariableContext = VariableContext; +n1qlParser.Opt_whenContext = Opt_whenContext; +n1qlParser.UnsetContext = UnsetContext; +n1qlParser.Unset_termsContext = Unset_termsContext; +n1qlParser.Unset_termContext = Unset_termContext; +n1qlParser.MergeContext = MergeContext; +n1qlParser.Opt_use_mergeContext = Opt_use_mergeContext; +n1qlParser.Opt_keyContext = Opt_keyContext; +n1qlParser.Merge_actionsContext = Merge_actionsContext; +n1qlParser.Opt_merge_delete_insertContext = Opt_merge_delete_insertContext; +n1qlParser.Opt_merge_insertContext = Opt_merge_insertContext; +n1qlParser.Merge_updateContext = Merge_updateContext; +n1qlParser.Merge_deleteContext = Merge_deleteContext; +n1qlParser.Merge_insertContext = Merge_insertContext; +n1qlParser.Grant_roleContext = Grant_roleContext; +n1qlParser.Role_listContext = Role_listContext; +n1qlParser.Role_nameContext = Role_nameContext; +n1qlParser.Keyspace_scope_listContext = Keyspace_scope_listContext; +n1qlParser.Keyspace_scopeContext = Keyspace_scopeContext; +n1qlParser.User_listContext = User_listContext; +n1qlParser.UserContext = UserContext; +n1qlParser.Revoke_roleContext = Revoke_roleContext; +n1qlParser.Create_scopeContext = Create_scopeContext; +n1qlParser.Drop_scopeContext = Drop_scopeContext; +n1qlParser.Create_collectionContext = Create_collectionContext; +n1qlParser.Drop_collectionContext = Drop_collectionContext; +n1qlParser.Flush_collectionContext = Flush_collectionContext; +n1qlParser.Flush_or_truncateContext = Flush_or_truncateContext; +n1qlParser.Create_indexContext = Create_indexContext; +n1qlParser.Create_primary_indexContext = Create_primary_indexContext; +n1qlParser.Opt_primary_nameContext = Opt_primary_nameContext; +n1qlParser.Index_nameContext = Index_nameContext; +n1qlParser.Opt_index_nameContext = Opt_index_nameContext; +n1qlParser.Named_keyspace_refContext = Named_keyspace_refContext; +n1qlParser.Simple_named_keyspace_refContext = Simple_named_keyspace_refContext; +n1qlParser.Named_scope_refContext = Named_scope_refContext; +n1qlParser.Index_partitionContext = Index_partitionContext; +n1qlParser.Opt_index_usingContext = Opt_index_usingContext; +n1qlParser.Index_usingContext = Index_usingContext; +n1qlParser.Opt_index_withContext = Opt_index_withContext; +n1qlParser.Index_withContext = Index_withContext; +n1qlParser.Index_termsContext = Index_termsContext; +n1qlParser.Index_termContext = Index_termContext; +n1qlParser.Index_term_exprContext = Index_term_exprContext; +n1qlParser.Index_exprContext = Index_exprContext; +n1qlParser.AllContext = AllContext; +n1qlParser.Index_whereContext = Index_whereContext; +n1qlParser.Opt_ikattrContext = Opt_ikattrContext; +n1qlParser.IkattrContext = IkattrContext; +n1qlParser.Drop_indexContext = Drop_indexContext; +n1qlParser.Alter_indexContext = Alter_indexContext; +n1qlParser.Build_indexContext = Build_indexContext; +n1qlParser.Create_functionContext = Create_functionContext; +n1qlParser.Opt_replaceContext = Opt_replaceContext; +n1qlParser.Func_nameContext = Func_nameContext; +n1qlParser.Short_func_nameContext = Short_func_nameContext; +n1qlParser.Long_func_nameContext = Long_func_nameContext; +n1qlParser.Parm_listContext = Parm_listContext; +n1qlParser.Parameter_termsContext = Parameter_termsContext; +n1qlParser.Func_bodyContext = Func_bodyContext; +n1qlParser.Drop_functionContext = Drop_functionContext; +n1qlParser.Execute_functionContext = Execute_functionContext; +n1qlParser.Update_statisticsContext = Update_statisticsContext; +n1qlParser.Opt_forContext = Opt_forContext; +n1qlParser.Update_stat_termsContext = Update_stat_termsContext; +n1qlParser.Update_stat_termContext = Update_stat_termContext; +n1qlParser.PathContext = PathContext; +n1qlParser.ExprContext = ExprContext; +n1qlParser.ValuedContext = ValuedContext; +n1qlParser.C_exprContext = C_exprContext; +n1qlParser.B_exprContext = B_exprContext; +n1qlParser.LiteralContext = LiteralContext; +n1qlParser.Construction_exprContext = Construction_exprContext; +n1qlParser.ObjectContext = ObjectContext; +n1qlParser.Opt_membersContext = Opt_membersContext; +n1qlParser.MembersContext = MembersContext; +n1qlParser.MemberContext = MemberContext; +n1qlParser.ArrayContext = ArrayContext; +n1qlParser.Opt_exprsContext = Opt_exprsContext; +n1qlParser.ExprsContext = ExprsContext; +n1qlParser.Param_exprContext = Param_exprContext; +n1qlParser.Case_exprContext = Case_exprContext; +n1qlParser.Simple_or_searched_caseContext = Simple_or_searched_caseContext; +n1qlParser.Simple_caseContext = Simple_caseContext; +n1qlParser.When_thensContext = When_thensContext; +n1qlParser.Searched_caseContext = Searched_caseContext; +n1qlParser.Opt_elseContext = Opt_elseContext; +n1qlParser.Function_exprContext = Function_exprContext; +n1qlParser.Function_nameContext = Function_nameContext; +n1qlParser.Collection_exprContext = Collection_exprContext; +n1qlParser.Collection_condContext = Collection_condContext; +n1qlParser.Coll_bindingsContext = Coll_bindingsContext; +n1qlParser.Coll_bindingContext = Coll_bindingContext; +n1qlParser.SatisfiesContext = SatisfiesContext; +n1qlParser.Collection_xformContext = Collection_xformContext; +n1qlParser.Paren_exprContext = Paren_exprContext; +n1qlParser.Subquery_exprContext = Subquery_exprContext; +n1qlParser.Expr_inputContext = Expr_inputContext; +n1qlParser.All_exprContext = All_exprContext; +n1qlParser.Opt_window_clauseContext = Opt_window_clauseContext; +n1qlParser.Window_listContext = Window_listContext; +n1qlParser.Window_termContext = Window_termContext; +n1qlParser.Window_specificationContext = Window_specificationContext; +n1qlParser.Opt_window_nameContext = Opt_window_nameContext; +n1qlParser.Opt_window_partitionContext = Opt_window_partitionContext; +n1qlParser.Opt_window_frameContext = Opt_window_frameContext; +n1qlParser.Window_frame_modifierContext = Window_frame_modifierContext; +n1qlParser.Opt_window_frame_exclusionContext = Opt_window_frame_exclusionContext; +n1qlParser.Window_frame_extentsContext = Window_frame_extentsContext; +n1qlParser.Window_frame_extentContext = Window_frame_extentContext; +n1qlParser.Window_frame_valexpr_modifierContext = Window_frame_valexpr_modifierContext; +n1qlParser.Opt_nulls_treatmentContext = Opt_nulls_treatmentContext; +n1qlParser.Nulls_treatmentContext = Nulls_treatmentContext; +n1qlParser.Opt_from_first_lastContext = Opt_from_first_lastContext; +n1qlParser.Agg_quantifierContext = Agg_quantifierContext; +n1qlParser.Opt_filterContext = Opt_filterContext; +n1qlParser.Opt_window_functionContext = Opt_window_functionContext; +n1qlParser.Window_function_detailsContext = Window_function_detailsContext; +n1qlParser.Start_transactionContext = Start_transactionContext; +n1qlParser.Commit_transactionContext = Commit_transactionContext; +n1qlParser.Rollback_transactionContext = Rollback_transactionContext; +n1qlParser.Start_or_beginContext = Start_or_beginContext; +n1qlParser.Opt_transactionContext = Opt_transactionContext; +n1qlParser.TransactionContext = TransactionContext; +n1qlParser.Opt_savepointContext = Opt_savepointContext; +n1qlParser.Savepoint_nameContext = Savepoint_nameContext; +n1qlParser.Opt_isolation_levelContext = Opt_isolation_levelContext; +n1qlParser.Isolation_levelContext = Isolation_levelContext; +n1qlParser.Isolation_valContext = Isolation_valContext; +n1qlParser.Set_transaction_isolationContext = Set_transaction_isolationContext; +n1qlParser.SavepointContext = SavepointContext; +n1qlParser.If_existsContext = If_existsContext; +n1qlParser.If_not_existsContext = If_not_existsContext; + +module.exports = n1qlParser; diff --git a/reverse_engineering/antlr/parser/n1qlVisitor.js b/reverse_engineering/antlr/parser/n1qlVisitor.js new file mode 100644 index 0000000..b93b077 --- /dev/null +++ b/reverse_engineering/antlr/parser/n1qlVisitor.js @@ -0,0 +1,1314 @@ +// Generated from grammars/n1ql.g4 by ANTLR 4.9.2 +// jshint ignore: start +const antlr4 = require('antlr4'); + +// This class defines a complete generic visitor for a parse tree produced by n1qlParser. + +class n1qlVisitor extends antlr4.tree.ParseTreeVisitor { + // Visit a parse tree produced by n1qlParser#statements. + visitStatements(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#input. + visitInput(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#opt_trailer. + visitOpt_trailer(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#stmt_body. + visitStmt_body(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#stmt. + visitStmt(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#advise. + visitAdvise(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#opt_index. + visitOpt_index(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#explain. + visitExplain(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#prepare. + visitPrepare(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#opt_force. + visitOpt_force(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#opt_name. + visitOpt_name(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#from_or_as. + visitFrom_or_as(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#execute. + visitExecute(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#execute_using. + visitExecute_using(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#infer. + visitInfer(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#opt_keyspace_collection. + visitOpt_keyspace_collection(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#opt_infer_using. + visitOpt_infer_using(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#opt_infer_ustat_with. + visitOpt_infer_ustat_with(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#infer_ustat_with. + visitInfer_ustat_with(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#select_stmt. + visitSelect_stmt(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#dml_stmt. + visitDml_stmt(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#ddl_stmt. + visitDdl_stmt(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#role_stmt. + visitRole_stmt(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#index_stmt. + visitIndex_stmt(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#scope_stmt. + visitScope_stmt(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#collection_stmt. + visitCollection_stmt(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#function_stmt. + visitFunction_stmt(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#transaction_stmt. + visitTransaction_stmt(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#fullselect. + visitFullselect(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#select_terms. + visitSelect_terms(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#select_term. + visitSelect_term(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#subselect. + visitSubselect(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#from_select. + visitFrom_select(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#select_from. + visitSelect_from(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#select_clause. + visitSelect_clause(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#projection. + visitProjection(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#opt_quantifier. + visitOpt_quantifier(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#raw. + visitRaw(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#projects. + visitProjects(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#project. + visitProject(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#opt_as_alias. + visitOpt_as_alias(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#as_alias. + visitAs_alias(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#alias. + visitAlias(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#opt_from. + visitOpt_from(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#from. + visitFrom(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#from_term. + visitFrom_term(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#simple_from_term. + visitSimple_from_term(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#unnest. + visitUnnest(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#keyspace_term. + visitKeyspace_term(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#keyspace_path. + visitKeyspace_path(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#namespace_term. + visitNamespace_term(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#namespace_name. + visitNamespace_name(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#bucket_name. + visitBucket_name(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#scope_name. + visitScope_name(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#keyspace_name. + visitKeyspace_name(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#opt_use. + visitOpt_use(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#use_options. + visitUse_options(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#use_keys. + visitUse_keys(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#use_index. + visitUse_index(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#join_hint. + visitJoin_hint(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#opt_primary. + visitOpt_primary(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#index_refs. + visitIndex_refs(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#index_ref. + visitIndex_ref(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#use_hash_option. + visitUse_hash_option(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#opt_use_del_upd. + visitOpt_use_del_upd(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#opt_join_type. + visitOpt_join_type(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#opt_outer. + visitOpt_outer(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#on_keys. + visitOn_keys(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#on_key. + visitOn_key(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#opt_let. + visitOpt_let(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#let_. + visitLet_(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#bindings. + visitBindings(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#binding. + visitBinding(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#opt_with. + visitOpt_with(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#with_list. + visitWith_list(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#with_term. + visitWith_term(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#opt_where. + visitOpt_where(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#where. + visitWhere(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#opt_group. + visitOpt_group(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#group. + visitGroup(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#group_terms. + visitGroup_terms(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#group_term. + visitGroup_term(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#opt_letting. + visitOpt_letting(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#letting. + visitLetting(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#opt_having. + visitOpt_having(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#having. + visitHaving(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#opt_order_by. + visitOpt_order_by(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#order_by. + visitOrder_by(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#sort_terms. + visitSort_terms(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#sort_term. + visitSort_term(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#opt_dir. + visitOpt_dir(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#dir. + visitDir(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#opt_order_nulls. + visitOpt_order_nulls(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#first_last. + visitFirst_last(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#nulls. + visitNulls(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#opt_limit. + visitOpt_limit(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#limit. + visitLimit(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#opt_offset. + visitOpt_offset(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#offset. + visitOffset(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#insert. + visitInsert(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#simple_keyspace_ref. + visitSimple_keyspace_ref(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#keyspace_ref. + visitKeyspace_ref(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#opt_values_header. + visitOpt_values_header(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#key. + visitKey(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#values_list. + visitValues_list(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#values. + visitValues(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#next_values. + visitNext_values(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#key_val_expr. + visitKey_val_expr(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#key_val_options_expr. + visitKey_val_options_expr(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#opt_returning. + visitOpt_returning(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#returning. + visitReturning(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#returns_. + visitReturns_(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#key_expr_header. + visitKey_expr_header(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#value_expr_header. + visitValue_expr_header(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#options_expr_header. + visitOptions_expr_header(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#key_val_options_expr_header. + visitKey_val_options_expr_header(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#upsert. + visitUpsert(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#delete_. + visitDelete_(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#update. + visitUpdate(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#set. + visitSet(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#set_terms. + visitSet_terms(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#set_term. + visitSet_term(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#function_meta_expr. + visitFunction_meta_expr(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#opt_update_for. + visitOpt_update_for(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#update_for. + visitUpdate_for(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#update_dimensions. + visitUpdate_dimensions(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#update_dimension. + visitUpdate_dimension(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#update_binding. + visitUpdate_binding(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#variable. + visitVariable(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#opt_when. + visitOpt_when(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#unset. + visitUnset(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#unset_terms. + visitUnset_terms(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#unset_term. + visitUnset_term(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#merge. + visitMerge(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#opt_use_merge. + visitOpt_use_merge(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#opt_key. + visitOpt_key(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#merge_actions. + visitMerge_actions(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#opt_merge_delete_insert. + visitOpt_merge_delete_insert(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#opt_merge_insert. + visitOpt_merge_insert(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#merge_update. + visitMerge_update(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#merge_delete. + visitMerge_delete(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#merge_insert. + visitMerge_insert(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#grant_role. + visitGrant_role(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#role_list. + visitRole_list(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#role_name. + visitRole_name(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#keyspace_scope_list. + visitKeyspace_scope_list(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#keyspace_scope. + visitKeyspace_scope(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#user_list. + visitUser_list(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#user. + visitUser(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#revoke_role. + visitRevoke_role(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#create_scope. + visitCreate_scope(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#drop_scope. + visitDrop_scope(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#create_collection. + visitCreate_collection(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#drop_collection. + visitDrop_collection(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#flush_collection. + visitFlush_collection(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#flush_or_truncate. + visitFlush_or_truncate(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#create_index. + visitCreate_index(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#create_primary_index. + visitCreate_primary_index(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#opt_primary_name. + visitOpt_primary_name(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#index_name. + visitIndex_name(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#opt_index_name. + visitOpt_index_name(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#named_keyspace_ref. + visitNamed_keyspace_ref(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#simple_named_keyspace_ref. + visitSimple_named_keyspace_ref(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#named_scope_ref. + visitNamed_scope_ref(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#index_partition. + visitIndex_partition(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#opt_index_using. + visitOpt_index_using(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#index_using. + visitIndex_using(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#opt_index_with. + visitOpt_index_with(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#index_with. + visitIndex_with(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#index_terms. + visitIndex_terms(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#index_term. + visitIndex_term(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#index_term_expr. + visitIndex_term_expr(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#index_expr. + visitIndex_expr(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#all. + visitAll(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#index_where. + visitIndex_where(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#opt_ikattr. + visitOpt_ikattr(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#ikattr. + visitIkattr(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#drop_index. + visitDrop_index(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#alter_index. + visitAlter_index(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#build_index. + visitBuild_index(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#create_function. + visitCreate_function(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#opt_replace. + visitOpt_replace(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#func_name. + visitFunc_name(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#short_func_name. + visitShort_func_name(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#long_func_name. + visitLong_func_name(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#parm_list. + visitParm_list(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#parameter_terms. + visitParameter_terms(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#func_body. + visitFunc_body(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#drop_function. + visitDrop_function(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#execute_function. + visitExecute_function(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#update_statistics. + visitUpdate_statistics(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#opt_for. + visitOpt_for(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#update_stat_terms. + visitUpdate_stat_terms(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#update_stat_term. + visitUpdate_stat_term(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#path. + visitPath(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#expr. + visitExpr(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#valued. + visitValued(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#c_expr. + visitC_expr(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#b_expr. + visitB_expr(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#literal. + visitLiteral(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#construction_expr. + visitConstruction_expr(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#object. + visitObject(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#opt_members. + visitOpt_members(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#members. + visitMembers(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#member. + visitMember(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#array. + visitArray(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#opt_exprs. + visitOpt_exprs(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#exprs. + visitExprs(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#param_expr. + visitParam_expr(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#case_expr. + visitCase_expr(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#simple_or_searched_case. + visitSimple_or_searched_case(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#simple_case. + visitSimple_case(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#when_thens. + visitWhen_thens(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#searched_case. + visitSearched_case(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#opt_else. + visitOpt_else(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#function_expr. + visitFunction_expr(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#function_name. + visitFunction_name(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#collection_expr. + visitCollection_expr(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#collection_cond. + visitCollection_cond(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#coll_bindings. + visitColl_bindings(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#coll_binding. + visitColl_binding(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#satisfies. + visitSatisfies(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#collection_xform. + visitCollection_xform(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#paren_expr. + visitParen_expr(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#subquery_expr. + visitSubquery_expr(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#expr_input. + visitExpr_input(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#all_expr. + visitAll_expr(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#opt_window_clause. + visitOpt_window_clause(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#window_list. + visitWindow_list(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#window_term. + visitWindow_term(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#window_specification. + visitWindow_specification(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#opt_window_name. + visitOpt_window_name(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#opt_window_partition. + visitOpt_window_partition(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#opt_window_frame. + visitOpt_window_frame(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#window_frame_modifier. + visitWindow_frame_modifier(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#opt_window_frame_exclusion. + visitOpt_window_frame_exclusion(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#window_frame_extents. + visitWindow_frame_extents(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#window_frame_extent. + visitWindow_frame_extent(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#window_frame_valexpr_modifier. + visitWindow_frame_valexpr_modifier(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#opt_nulls_treatment. + visitOpt_nulls_treatment(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#nulls_treatment. + visitNulls_treatment(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#opt_from_first_last. + visitOpt_from_first_last(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#agg_quantifier. + visitAgg_quantifier(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#opt_filter. + visitOpt_filter(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#opt_window_function. + visitOpt_window_function(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#window_function_details. + visitWindow_function_details(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#start_transaction. + visitStart_transaction(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#commit_transaction. + visitCommit_transaction(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#rollback_transaction. + visitRollback_transaction(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#start_or_begin. + visitStart_or_begin(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#opt_transaction. + visitOpt_transaction(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#transaction. + visitTransaction(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#opt_savepoint. + visitOpt_savepoint(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#savepoint_name. + visitSavepoint_name(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#opt_isolation_level. + visitOpt_isolation_level(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#isolation_level. + visitIsolation_level(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#isolation_val. + visitIsolation_val(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#set_transaction_isolation. + visitSet_transaction_isolation(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#savepoint. + visitSavepoint(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#if_exists. + visitIf_exists(ctx) { + return this.visitChildren(ctx); + } + + // Visit a parse tree produced by n1qlParser#if_not_exists. + visitIf_not_exists(ctx) { + return this.visitChildren(ctx); + } +} + +module.exports = n1qlVisitor; From b4f5adf500a2f5a9931cdc0a37f132e2ee8b92b1 Mon Sep 17 00:00:00 2001 From: Serhii Filonenko Date: Fri, 2 Feb 2024 08:52:05 +0200 Subject: [PATCH 13/37] RE: implement collection indexes reversing --- localization/en.json | 2 +- reverse_engineering/api.js | 16 +- reverse_engineering/helpers/clusterHelper.js | 17 ++ .../helpers/connectionHelper.js | 2 +- reverse_engineering/helpers/indexHelper.js | 166 ++++++++++++++++++ reverse_engineering/helpers/logHelper.js | 2 +- reverse_engineering/helpers/parserHelper.js | 90 ++++++++++ reverse_engineering/helpers/queryHelper.js | 8 + reverse_engineering/helpers/restApiHelper.js | 9 + reverse_engineering/helpers/schemaHelper.js | 22 ++- shared/constants.js | 15 +- 11 files changed, 336 insertions(+), 13 deletions(-) create mode 100644 reverse_engineering/helpers/indexHelper.js create mode 100644 reverse_engineering/helpers/parserHelper.js diff --git a/localization/en.json b/localization/en.json index 365c07c..fd2dfe9 100644 --- a/localization/en.json +++ b/localization/en.json @@ -100,7 +100,7 @@ "MODAL_WINDOW___SUBDOCUMENT_IN_CHILD": "Sub-document in child", "MODAL_WINDOW___ARRAY_IN_PARENT": "Array in parent", "MODAL_WINDOW___CREATE_COLLECTION": "Create Couchbase Collection", - "MODAL_WINDOW___INCLUDE_EMPTY_COLLECTION": "Include empty documents", + "MODAL_WINDOW___INCLUDE_EMPTY_COLLECTION": "Include empty collections", "MODAL_WINDOW___CREATE_BUCKET": "Create Couchbase Scope", "MODAL_WINDOW___ALL_COLLECTIONS": "and all nested collections", "MODAL_WINDOW___COLLECTION_NAME_ERROR": "Collection name is empty or is a reserved word", diff --git a/reverse_engineering/api.js b/reverse_engineering/api.js index 5b11e77..adcdefc 100644 --- a/reverse_engineering/api.js +++ b/reverse_engineering/api.js @@ -11,8 +11,8 @@ const connectionHelper = require('./helpers/connectionHelper'); const clusterHelper = require('./helpers/clusterHelper'); const documentKindHelper = require('./helpers/documentKindHelper'); +const indexHelper = require('./helpers/indexHelper'); const logHelper = require('./helpers/logHelper'); -const { DEFAULT_LIMIT } = require('../shared/constants'); /** * @param {ConnectionInfo} connectionInfo @@ -108,20 +108,30 @@ const getDbCollectionsData = async (data, appLogger, callback, app) => { }); try { - const cluster = await connectionHelper.connect({ connectionInfo: data.connectionInfo, app }); + const connectionInfo = data.connectionInfo; const collectionVersion = data.collectionData.collectionVersion; - + const includeEmptyCollection = data.includeEmptyCollection; + const cluster = await connectionHelper.connect({ connectionInfo, app }); + const indexesByCollectionMap = await indexHelper.getIndexesByCollectionMap({ + cluster, + connectionInfo, + logger, + app, + }); const dbCollectionsData = []; for (const bucketName in collectionVersion) { for (const scopeName in collectionVersion[bucketName]) { for (const collectionName of collectionVersion[bucketName][scopeName]) { + const collectionIndexes = indexesByCollectionMap[bucketName]?.[scopeName]?.[collectionName]; const dbCollectionData = await clusterHelper.getDbCollectionData({ cluster, data, bucketName, scopeName, collectionName, + collectionIndexes, + includeEmptyCollection, logger, app, }); diff --git a/reverse_engineering/helpers/clusterHelper.js b/reverse_engineering/helpers/clusterHelper.js index a8016f2..8388358 100644 --- a/reverse_engineering/helpers/clusterHelper.js +++ b/reverse_engineering/helpers/clusterHelper.js @@ -339,6 +339,7 @@ const getCollectionDocumentsByInfer = async ({ cluster, bucketName, scopeName, c * scopeName: string; * collectionName: string; * collectionIndexes: object[]; + * includeEmptyCollection: boolean; * logger: Logger; * app: App; * }} param0 @@ -351,6 +352,7 @@ const getDbCollectionData = async ({ scopeName, collectionName, collectionIndexes, + includeEmptyCollection, logger, app, }) => { @@ -377,6 +379,7 @@ const getDbCollectionData = async ({ collectionName, documents, collectionIndexes, + includeEmptyCollection, }); } catch (error) { try { @@ -430,10 +433,23 @@ const getDbCollectionData = async ({ collectionName, documents, collectionIndexes, + includeEmptyCollection, }); } }; +const getIndexes = async ({ cluster, logger }) => { + try { + const query = queryHelper.getSelectIndexesQuery(); + const { rows } = await cluster.query(query); + + return rows.map(row => row.indexes); + } catch (error) { + logger.error(error); + return []; + } +}; + module.exports = { isBucketHasDefaultCollection, getAllBuckets, @@ -444,5 +460,6 @@ module.exports = { getBucketDocumentsByInfer, getErrorCode, getErrorMessage, + getIndexes, getPaginatedQuery, }; diff --git a/reverse_engineering/helpers/connectionHelper.js b/reverse_engineering/helpers/connectionHelper.js index 76b8981..4819fdb 100644 --- a/reverse_engineering/helpers/connectionHelper.js +++ b/reverse_engineering/helpers/connectionHelper.js @@ -68,7 +68,7 @@ const connect = async ({ connectionInfo, app }) => { return cluster; } - const couchbase = app.require('couchbase'); + const couchbase = await app.require('couchbase'); const { url, options } = generateConnectionParams({ connectionInfo }); cluster = await couchbase.connect(url, options); const buckets = await clusterHelper.getAllBuckets({ cluster }); diff --git a/reverse_engineering/helpers/indexHelper.js b/reverse_engineering/helpers/indexHelper.js new file mode 100644 index 0000000..921925c --- /dev/null +++ b/reverse_engineering/helpers/indexHelper.js @@ -0,0 +1,166 @@ +const _ = require('lodash'); +const restApiHelper = require('./restApiHelper'); +const clusterHelper = require('./clusterHelper'); +const parserHelper = require('./parserHelper'); +const { GET_META_REGEXP, GET_PARTITION_HASH_REGEXP, DEFAULT_NAME } = require('../../shared/constants'); + +const handleIndex = index => { + const indexData = getHackoladeCompatibleIndex(index); + return _.pickBy(indexData, value => !_.isUndefined(value)); +}; + +const getHackoladeCompatibleIndex = index => { + if (index.is_primary) { + return { + indxName: index.name, + indxType: 'Primary', + usingGSI: index.using === 'gsi', + }; + } else if (checkArrayIndex(index)) { + return { + indxName: index.name, + indxType: 'Array', + usingGSI: index.using === 'gsi', + arrayExpr: index.index_key.map(getExpression).join(','), + whereClause: getWhereCondition(index), + }; + } else if (checkMetaIndex(index)) { + return { + indxName: index.name, + indxType: 'Metadata', + metadataExpr: index.index_key.map(getExpression).join(','), + }; + } else { + const partitionByHash = getPartition(index); + const { expression, keys } = getKeysAndExpression(index); + + return { + indxName: index.name, + indxType: 'Secondary', + usingGSI: index.using === 'gsi', + indxKey: keys, + functionExpr: expression, + whereClause: getWhereCondition(index), + partitionByHash: partitionByHash.type, + partitionByHashExpr: partitionByHash.expression, + }; + } +}; + +const checkMetaIndex = index => { + return Boolean(_.get(index, 'index_key', []).find(key => GET_META_REGEXP.test(key))); +}; + +const checkArrayIndex = index => { + return Boolean( + _.get(index, 'index_key', []).find( + key => key.startsWith('(distinct') || key.startsWith('(all') || key.startsWith('array'), + ), + ); +}; + +const getKeysAndExpression = index => { + const indexKeys = _.get(index, 'index_key', []); + const keys = indexKeys.filter(checkKeySimple).map(getSimpleKey); + const expression = indexKeys.filter(key => !checkKeySimple(key)).join(','); + + if (expression) { + return { keys, expression }; + } + + return { keys }; +}; + +const checkKeySimple = key => { + return /^\`.*?\`$/.test(key) || /^\(\`.*?\`\)$/.test(key); +}; + +const getExpression = key => { + if (GET_META_REGEXP.test(key)) { + return `META().` + GET_META_REGEXP.exec(key)[1]; + } + + return key; +}; + +const getSimpleKey = key => { + const isDescending = key.endsWith('DESC'); + const keyName = key + .replace(/\`/gi, '') + .replace(' DESC', '') + .replace(/^\s+/, '') + .replace(/\s+$/, '') + .replace(/^\((.*?)\)$/, '$1'); + + return { name: keyName, type: isDescending ? 'descending' : 'ascending' }; +}; + +const getPartition = index => { + if (index.partition && GET_PARTITION_HASH_REGEXP.test(index.partition)) { + return { expression: _.get(GET_PARTITION_HASH_REGEXP.exec(index.partition), '[2]'), type: 'Expression' }; + } + + return { type: '' }; +}; + +const getWhereCondition = index => { + if (index.condition) { + return index.condition; + } +}; + +const getIndexes = async ({ cluster, connectionInfo, logger, app }) => { + try { + const indexData = await restApiHelper.getIndexes({ connectionInfo, logger, app }); + const statements = indexData.map(indx => indx.definition).join(';\n'); + + if (!statements) { + return []; + } + + const { indexes } = parserHelper.parseN1qlStatements({ statements }); + + return indexes; + } catch (error) { + try { + logger.error(error); + + const indexes = await clusterHelper.getIndexes({ cluster, logger }); + + return indexes + .sort((a, b) => a.name.localeCompare(b.name)) + .map(index => { + const isDefaultCollectionIndex = !index.bucket_id; + const bucketName = isDefaultCollectionIndex ? index.keyspace_id : index.bucket_id; + const scopeName = isDefaultCollectionIndex ? DEFAULT_NAME : index.scope_id; + const collectionName = isDefaultCollectionIndex ? DEFAULT_NAME : index.keyspace_id; + + return { + index: handleIndex(index), + bucketName, + scopeName, + collectionName, + }; + }); + } catch (err) { + logger.error(err); + return []; + } + } +}; + +const getIndexesByCollectionMap = async ({ cluster, connectionInfo, logger, app }) => { + const indexes = await getIndexes({ cluster, connectionInfo, logger, app }); + return indexes.reduce((result, indexData) => { + const { bucketName, scopeName, collectionName, index } = indexData; + const namePath = [bucketName, scopeName, collectionName]; + const collectionIndexes = _.get(result, namePath, []); + + return _.set(result, namePath, [...collectionIndexes, index]); + }, {}); +}; + +module.exports = { + getIndexes, + getIndexesByCollectionMap, +}; diff --git a/reverse_engineering/helpers/logHelper.js b/reverse_engineering/helpers/logHelper.js index e6bd39a..f68f9bf 100644 --- a/reverse_engineering/helpers/logHelper.js +++ b/reverse_engineering/helpers/logHelper.js @@ -70,7 +70,7 @@ const createLogger = ({ title, logger, hiddenKeys }) => { const createError = error => { return { - message: error.cause?.message || error.message, + message: error.cause?.first_error_message || error.message, }; }; diff --git a/reverse_engineering/helpers/parserHelper.js b/reverse_engineering/helpers/parserHelper.js new file mode 100644 index 0000000..d695ea3 --- /dev/null +++ b/reverse_engineering/helpers/parserHelper.js @@ -0,0 +1,90 @@ +/** + * @typedef {{ scopes: Scope[]; collections: Collection[]; indexes: object[] }} ParsedResult + */ + +const _ = require('lodash'); +const antlr4 = require('antlr4'); +const n1qlLexer = require('../antlr/parser/n1qlLexer'); +const n1qlParser = require('../antlr/parser/n1qlParser'); +const n1qlToCollectionVisitor = require('../antlr/n1qlToCollectionVisitor'); +const ExprErrorListener = require('../antlr/antlrErrorListener'); + +/** + * @param {{ statements: string }} param0 + * @returns {ParsedResult} + */ +const parseN1qlStatements = ({ statements }) => { + const chars = new antlr4.InputStream(statements); + const lexer = new n1qlLexer(chars); + + const tokens = new antlr4.CommonTokenStream(lexer); + const parser = new n1qlParser(tokens); + + parser.removeErrorListeners(); + parser.addErrorListener(new ExprErrorListener()); + + const tree = parser.statements(); + + const n1qlToCollectionsGenerator = new n1qlToCollectionVisitor(); + const result = tree.accept(n1qlToCollectionsGenerator); + + return mapParsedResult(result); +}; + +/** + * @param {ParsedResult[]} result + * @returns {ParsedResult} + */ +const mapParsedResult = result => { + return { + scopes: result.flatMap(({ scopes }) => scopes), + collections: result.flatMap(({ collections }) => collections), + indexes: result.flatMap(({ indexes }) => indexes.map(mapIndexes)), + }; +}; + +const mapIndexes = ({ indexes, statements }) => { + return indexes.reduce((result, indexData) => { + if (_.isEmpty(indexData)) { + return result; + } + + let indexWithKeys = indexData.index; + + if (indexWithKeys.indxType !== 'Primary') { + const indexKeys = _.get(indexData, 'indexKeys.indexKeysIntervals').reduce((indexKeys, key) => { + const select = key.select; + const name = removeParentheses(statements.substring(select.start, select.stop)); + return [...indexKeys, { name, type: key.type }]; + }, []); + + if (indexWithKeys.indxType === 'Secondary') { + indexWithKeys = { + ...indexWithKeys, + [_.get(indexData, 'indexKeys.indexKeysPropertyKeyword')]: indexKeys, + }; + } else { + indexWithKeys = { + ...indexWithKeys, + [_.get(indexData, 'indexKeys.indexKeysPropertyKeyword')]: indexKeys + .map(index => index.name) + .join(', '), + }; + } + } + + return [...result, { ...indexData, index: indexWithKeys }]; + }, []); +}; + +const removeParentheses = string => { + if (/^[(`'"].*[)`'"]$/i.test(string)) { + return string.slice(1, string.length - 1); + } + + return string; +}; + +module.exports = { + parseN1qlStatements, +}; diff --git a/reverse_engineering/helpers/queryHelper.js b/reverse_engineering/helpers/queryHelper.js index 4ce93a3..4304663 100644 --- a/reverse_engineering/helpers/queryHelper.js +++ b/reverse_engineering/helpers/queryHelper.js @@ -53,6 +53,13 @@ const getSelectBucketDocumentsByDocumentKindQuery = ({ bucketName, documentKind, return getQueryOptions({ query, limit, offset }); }; +/** + * @returns {string} + */ +const getSelectIndexesQuery = () => { + return `SELECT * FROM system:indexes`; +}; + /** * @param {{ query: string; limit: number; offset: number; }} param0 * @returns {string} @@ -69,5 +76,6 @@ module.exports = { getSelectBucketDocumentsByDocumentKindQuery, getSelectBucketDocumentsQuery, getSelectCollectionDocumentsQuery, + getSelectIndexesQuery, getQueryOptions, }; diff --git a/reverse_engineering/helpers/restApiHelper.js b/reverse_engineering/helpers/restApiHelper.js index 1af27a3..85d89dc 100644 --- a/reverse_engineering/helpers/restApiHelper.js +++ b/reverse_engineering/helpers/restApiHelper.js @@ -182,6 +182,15 @@ const getBucketDocuments = async ({ connectionInfo, bucketName, logger, app }) = }); }; +const getIndexes = async ({ connectionInfo, logger, app }) => { + logger.info(`Start getting indexes using REST API`); + + const apiService = createRestApiService({ connectionInfo, app }); + + return await apiService.getIndexes(); +}; + module.exports = { getBucketDocuments, + getIndexes, }; diff --git a/reverse_engineering/helpers/schemaHelper.js b/reverse_engineering/helpers/schemaHelper.js index 7228618..cf934c4 100644 --- a/reverse_engineering/helpers/schemaHelper.js +++ b/reverse_engineering/helpers/schemaHelper.js @@ -6,10 +6,17 @@ const _ = require('lodash'); /** * - * @param {{ documents: Document[]; bucketName: string; scopeName: string; collectionName: string; collectionIndexes: object[] }} param0 + * @param {{ documents: Document[]; bucketName: string; scopeName: string; collectionName: string; collectionIndexes: object[]; includeEmptyCollection: boolean }} param0 * @returns {DbCollectionData} */ -const getDbCollectionData = ({ documents, bucketName, scopeName, collectionName, collectionIndexes }) => { +const getDbCollectionData = ({ + documents, + bucketName, + scopeName, + collectionName, + collectionIndexes, + includeEmptyCollection, +}) => { const jsonDocuments = documents .filter(item => _.isPlainObject(item[bucketName])) .map(item => ({ @@ -17,17 +24,24 @@ const getDbCollectionData = ({ documents, bucketName, scopeName, collectionName, ...item[bucketName], })); + if (!includeEmptyCollection && _.isEmpty(jsonDocuments)) { + return null; + } + return { dbName: scopeName, collectionName: collectionName, documentKind: '', collectionDocs: {}, + standardDoc: _.first(jsonDocuments), bucketInfo: { bucket: bucketName, }, - emptyBucket: !jsonDocuments.length, - indexes: collectionIndexes, + emptyBucket: false, documents: jsonDocuments, + entityLevel: { + indexes: collectionIndexes, + }, }; }; diff --git a/shared/constants.js b/shared/constants.js index 5ff7829..6ae90bf 100644 --- a/shared/constants.js +++ b/shared/constants.js @@ -35,11 +35,17 @@ const STATUS = { }; const DEFAULT_DOCUMENT_KIND = '*'; +const DEFAULT_LIMIT = 1000; +const DEFAULT_NAME = '_default'; + const COUCHBASE_DEFAULT_KV_CONNECTION_PORT = 11210; + const DISABLED_TOOLTIP = 'Something went wrong. Please, check logs for more details'; -const DEFAULT_NAME = '_default'; -const FLAVOR_REGEX = /([\s\S]*?) \= "?([\s\S]*?)"?$/; -const DEFAULT_LIMIT = 1000; + +const FLAVOR_REGEX = /([\s\S]*?) = "?([\s\S]*?)"?$/; +const GET_META_REGEXP = /\(meta\(\)\.(.*?)\)/; +const GET_NODES_REGEXP = /"nodes":(\[.*?\])/; +const GET_PARTITION_HASH_REGEXP = /(HASH|hash)\((.*?)\)$/; module.exports = { AUTH_TYPE, @@ -51,5 +57,8 @@ module.exports = { DEFAULT_NAME, DISABLED_TOOLTIP, FLAVOR_REGEX, + GET_META_REGEXP, + GET_NODES_REGEXP, + GET_PARTITION_HASH_REGEXP, STATUS, }; From ac2c5a356a350d1523d48293edb8783090a9d364 Mon Sep 17 00:00:00 2001 From: Serhii Filonenko Date: Fri, 2 Feb 2024 09:09:00 +0200 Subject: [PATCH 14/37] RE: fix incorrect error message --- reverse_engineering/helpers/clusterHelper.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reverse_engineering/helpers/clusterHelper.js b/reverse_engineering/helpers/clusterHelper.js index 8388358..e49c78a 100644 --- a/reverse_engineering/helpers/clusterHelper.js +++ b/reverse_engineering/helpers/clusterHelper.js @@ -215,7 +215,7 @@ const getErrorMessage = ({ error }) => { case COUCHBASE_ERROR_CODE.userDoesNotHaveAccessToPrivilegeCluster: return 'User doesn`t have credentials for privileged cluster.'; default: - return error?.cause?.message || error?.message || ''; + return error?.cause?.first_error_message || error?.message || ''; } }; From c6feaf764dc768235efedd1f0463e2e783eccf5b Mon Sep 17 00:00:00 2001 From: Serhii Filonenko Date: Fri, 2 Feb 2024 09:09:21 +0200 Subject: [PATCH 15/37] RE: add constant for default key name --- .../helpers/documentKindHelper.js | 5 +++-- reverse_engineering/helpers/schemaHelper.js | 16 ++++++++++++++-- shared/constants.js | 2 ++ shared/types.d.ts | 2 ++ 4 files changed, 21 insertions(+), 4 deletions(-) diff --git a/reverse_engineering/helpers/documentKindHelper.js b/reverse_engineering/helpers/documentKindHelper.js index 440ae31..fc67c9b 100644 --- a/reverse_engineering/helpers/documentKindHelper.js +++ b/reverse_engineering/helpers/documentKindHelper.js @@ -1,5 +1,6 @@ /** * @typedef {import('../../shared/types').App} App + * @typedef {import('../../shared/types').Document} Document * @typedef {import('../../shared/types').DocumentKindData} DocumentKindData * @typedef {import('../../shared/types').Cluster} Cluster * @typedef {import('../../shared/types').ConnectionInfo} ConnectionInfo @@ -9,7 +10,7 @@ const _ = require('lodash'); const clusterHelper = require('./clusterHelper'); const restApiHelper = require('./restApiHelper'); -const { COUCHBASE_ERROR_CODE, DEFAULT_NAME, FLAVOR_REGEX, STATUS, DEFAULT_LIMIT } = require('../../shared/constants'); +const { COUCHBASE_ERROR_CODE, DEFAULT_NAME, FLAVOR_REGEX, STATUS } = require('../../shared/constants'); /** * @param {{ bucketName: string; status?: STATUS; }} param0 @@ -69,7 +70,7 @@ const getBucketDocumentKindData = async ({ cluster, connectionInfo, bucketName, /** * @param {{ bucketName: string; documents: Document[]; }} param0 - * @returns {any} + * @returns {object} */ const generateCustomInferSchema = ({ bucketName, documents }) => { const typeOf = obj => { diff --git a/reverse_engineering/helpers/schemaHelper.js b/reverse_engineering/helpers/schemaHelper.js index cf934c4..780c7a2 100644 --- a/reverse_engineering/helpers/schemaHelper.js +++ b/reverse_engineering/helpers/schemaHelper.js @@ -3,6 +3,7 @@ * @typedef {import('../../shared/types').Document} Document */ const _ = require('lodash'); +const { DEFAULT_KEY_NAME } = require('../../shared/constants'); /** * @@ -20,9 +21,10 @@ const getDbCollectionData = ({ const jsonDocuments = documents .filter(item => _.isPlainObject(item[bucketName])) .map(item => ({ - KEY: item.docid, + [DEFAULT_KEY_NAME]: item.docid, ...item[bucketName], })); + const standardDoc = _.first(jsonDocuments); if (!includeEmptyCollection && _.isEmpty(jsonDocuments)) { return null; @@ -33,7 +35,7 @@ const getDbCollectionData = ({ collectionName: collectionName, documentKind: '', collectionDocs: {}, - standardDoc: _.first(jsonDocuments), + standardDoc: standardDoc, bucketInfo: { bucket: bucketName, }, @@ -41,6 +43,8 @@ const getDbCollectionData = ({ documents: jsonDocuments, entityLevel: { indexes: collectionIndexes, + keyName: DEFAULT_KEY_NAME, + keyType: typeOf(standardDoc[DEFAULT_KEY_NAME]), }, }; }; @@ -70,6 +74,14 @@ const convertInferSchemaToDocuments = ({ inference, bucketName }) => { })); }; +/** + * @param {any} obj + * @returns {string} + */ +const typeOf = obj => { + return {}.toString.call(obj).split(' ')[1].slice(0, -1).toLowerCase(); +}; + module.exports = { getDbCollectionData, convertInferSchemaToDocuments, diff --git a/shared/constants.js b/shared/constants.js index 6ae90bf..7fa28d8 100644 --- a/shared/constants.js +++ b/shared/constants.js @@ -35,6 +35,7 @@ const STATUS = { }; const DEFAULT_DOCUMENT_KIND = '*'; +const DEFAULT_KEY_NAME = 'KEY'; const DEFAULT_LIMIT = 1000; const DEFAULT_NAME = '_default'; @@ -53,6 +54,7 @@ module.exports = { COUCHBASE_HOST_PREFIX, COUCHBASE_DEFAULT_KV_CONNECTION_PORT, DEFAULT_DOCUMENT_KIND, + DEFAULT_KEY_NAME, DEFAULT_LIMIT, DEFAULT_NAME, DISABLED_TOOLTIP, diff --git a/shared/types.d.ts b/shared/types.d.ts index a614107..bef3a68 100644 --- a/shared/types.d.ts +++ b/shared/types.d.ts @@ -104,11 +104,13 @@ type DbCollectionData = { dbName: string; collectionName: string; documentKind: string; + standardDoc: object; collectionDocs: object; bucketInfo: object; emptyBucket: boolean; indexes: object[]; documents: Document[]; + entityLevel: object; } export { From 75eb69040ba0da481cc89141b28c335caf74006c Mon Sep 17 00:00:00 2001 From: Serhii Filonenko Date: Fri, 2 Feb 2024 12:10:38 +0200 Subject: [PATCH 16/37] RE: implement re from n1ql files --- .../antlr/n1qlToCollectionVisitor.js | 5 +- reverse_engineering/api.js | 95 ++++++++++++++++--- reverse_engineering/helpers/indexHelper.js | 3 +- reverse_engineering/helpers/parserHelper.js | 14 ++- 4 files changed, 97 insertions(+), 20 deletions(-) diff --git a/reverse_engineering/antlr/n1qlToCollectionVisitor.js b/reverse_engineering/antlr/n1qlToCollectionVisitor.js index c220893..411ec66 100644 --- a/reverse_engineering/antlr/n1qlToCollectionVisitor.js +++ b/reverse_engineering/antlr/n1qlToCollectionVisitor.js @@ -7,6 +7,7 @@ * the agreement/contract under which the software has been supplied. */ const n1qlVisitor = require('./parser/n1qlVisitor'); +const { DEFAULT_NAME } = require('../../shared/constants'); class Visitor extends n1qlVisitor { visitCreate_index(ctx) { @@ -160,8 +161,8 @@ class Visitor extends n1qlVisitor { visitNamed_keyspace_ref(ctx) { const defaultBucketName = this.visitIfExists(ctx, 'simple_named_keyspace_ref', ''); const bucketName = this.visitIfExists(ctx, 'bucket_name', ''); - const scopeName = this.visitIfExists(ctx, 'scope_name', ''); - const collectionName = this.visitIfExists(ctx, 'keyspace_name', ''); + const scopeName = this.visitIfExists(ctx, 'scope_name', DEFAULT_NAME); + const collectionName = this.visitIfExists(ctx, 'keyspace_name', DEFAULT_NAME); return { bucketName: defaultBucketName || bucketName, diff --git a/reverse_engineering/api.js b/reverse_engineering/api.js index adcdefc..616fc33 100644 --- a/reverse_engineering/api.js +++ b/reverse_engineering/api.js @@ -8,11 +8,31 @@ * @typedef {import('../shared/types').Callback} Callback */ +const fs = require('fs'); +const _ = require('lodash'); const connectionHelper = require('./helpers/connectionHelper'); const clusterHelper = require('./helpers/clusterHelper'); const documentKindHelper = require('./helpers/documentKindHelper'); const indexHelper = require('./helpers/indexHelper'); const logHelper = require('./helpers/logHelper'); +const parserHelper = require('./helpers/parserHelper'); +const schemaHelper = require('./helpers/schemaHelper'); + +/** + * @param {string} filePath + * @returns {Promise} + */ +const handleFileData = filePath => { + return new Promise((resolve, reject) => { + fs.readFile(filePath, 'utf-8', (err, content) => { + if (err) { + reject(err); + } else { + resolve(content); + } + }); + }); +}; /** * @param {ConnectionInfo} connectionInfo @@ -95,14 +115,14 @@ const getDbCollectionsNames = async (connectionInfo, appLogger, callback, app) = }; /** - * @param {any} data + * @param {object} data * @param {AppLogger} appLogger * @param {Callback} callback * @param {App} app */ const getDbCollectionsData = async (data, appLogger, callback, app) => { const logger = logHelper.createLogger({ - title: 'Retrieving data for inferring schema', + title: 'Retrieving databases and collections', hiddenKeys: data.hiddenKeys, logger: appLogger, }); @@ -112,12 +132,8 @@ const getDbCollectionsData = async (data, appLogger, callback, app) => { const collectionVersion = data.collectionData.collectionVersion; const includeEmptyCollection = data.includeEmptyCollection; const cluster = await connectionHelper.connect({ connectionInfo, app }); - const indexesByCollectionMap = await indexHelper.getIndexesByCollectionMap({ - cluster, - connectionInfo, - logger, - app, - }); + const indexes = await indexHelper.getIndexes({ cluster, connectionInfo, logger, app }); + const indexesByCollectionMap = indexHelper.getIndexesByCollectionMap({ indexes }); const dbCollectionsData = []; for (const bucketName in collectionVersion) { @@ -141,11 +157,67 @@ const getDbCollectionsData = async (data, appLogger, callback, app) => { } } - callback(null, dbCollectionsData); + const updatedDbCollectionsData = schemaHelper.updateDefaultDbNames({ dbCollectionsData }); + await connectionHelper.disconnect(); + callback(null, updatedDbCollectionsData); } catch (error) { - callback(error); - } finally { await connectionHelper.disconnect(); + callback(error); + } +}; + +/** + * @param {object} data + * @param {AppLogger} appLogger + * @param {Callback} callback + */ +const reFromFile = async (data, appLogger, callback) => { + const logger = logHelper.createLogger({ + title: 'Retrieving data from file', + hiddenKeys: data.hiddenKeys, + logger: appLogger, + }); + try { + const statements = await handleFileData(data.filePath); + const { scopes, collections, indexes } = parserHelper.parseN1qlStatements({ statements }); + const indexesByCollectionMap = indexHelper.getIndexesByCollectionMap({ indexes }); + const scopeBucketNameMap = scopes.reduce( + (result, scope) => _.set(result, [scope.bucketName, scope.scopeName], scope), + {}, + ); + const emptyScopes = scopes.filter(scope => + collections.every( + collection => collection.bucketName !== scope.bucketName && collection.scopeName !== scope.scopeName, + ), + ); + const bucketIndexes = indexes.filter(index => + collections.every( + collection => + collection.bucketName !== index.bucketName && + collection.scopeName !== index.scopeName && + collection.collectionName !== index.collectionName, + ), + ); + const schemas = schemaHelper.mapParsedResultToMultipleSchema({ + entitiesData: collections, + indexesByCollectionMap, + scopeBucketNameMap, + }); + const emptySchemas = schemaHelper.mapParsedResultToMultipleSchema({ + entitiesData: emptyScopes, + indexesByCollectionMap, + scopeBucketNameMap, + }); + const defaultSchemas = schemaHelper.mapParsedResultToMultipleSchema({ + entitiesData: _.uniqBy(bucketIndexes, 'bucketName'), + indexesByCollectionMap, + scopeBucketNameMap, + }); + + return callback(null, [...schemas, ...emptySchemas, ...defaultSchemas], {}, [], 'multipleSchema'); + } catch (error) { + logger.error(error); + return callback(error); } }; @@ -155,4 +227,5 @@ module.exports = { getDbCollectionsData, getDocumentKinds, testConnection, + reFromFile, }; diff --git a/reverse_engineering/helpers/indexHelper.js b/reverse_engineering/helpers/indexHelper.js index 921925c..18d87a2 100644 --- a/reverse_engineering/helpers/indexHelper.js +++ b/reverse_engineering/helpers/indexHelper.js @@ -149,8 +149,7 @@ const getIndexes = async ({ cluster, connectionInfo, logger, app }) => { } }; -const getIndexesByCollectionMap = async ({ cluster, connectionInfo, logger, app }) => { - const indexes = await getIndexes({ cluster, connectionInfo, logger, app }); +const getIndexesByCollectionMap = ({ indexes }) => { return indexes.reduce((result, indexData) => { const { bucketName, scopeName, collectionName, index } = indexData; const namePath = [bucketName, scopeName, collectionName]; diff --git a/reverse_engineering/helpers/parserHelper.js b/reverse_engineering/helpers/parserHelper.js index d695ea3..b7fce4d 100644 --- a/reverse_engineering/helpers/parserHelper.js +++ b/reverse_engineering/helpers/parserHelper.js @@ -28,18 +28,22 @@ const parseN1qlStatements = ({ statements }) => { const n1qlToCollectionsGenerator = new n1qlToCollectionVisitor(); const result = tree.accept(n1qlToCollectionsGenerator); - return mapParsedResult(result); + return mapParsedResult({ result, statements }); }; /** * @param {ParsedResult[]} result * @returns {ParsedResult} */ -const mapParsedResult = result => { +const mapParsedResult = ({ result, statements }) => { + const scopes = result.flatMap(({ scopes }) => scopes); + const collections = result.flatMap(({ collections }) => collections); + const indexes = result.flatMap(({ indexes }) => indexes); + return { - scopes: result.flatMap(({ scopes }) => scopes), - collections: result.flatMap(({ collections }) => collections), - indexes: result.flatMap(({ indexes }) => indexes.map(mapIndexes)), + scopes, + collections, + indexes: mapIndexes({ indexes, statements }), }; }; From ce32c904b222f454a956142e7d1d88a31282ceb5 Mon Sep 17 00:00:00 2001 From: Serhii Filonenko Date: Fri, 2 Feb 2024 12:15:57 +0200 Subject: [PATCH 17/37] RE: add split default scope names to avoid their combining --- .../helpers/documentKindHelper.js | 9 +-- reverse_engineering/helpers/schemaHelper.js | 80 +++++++++++++++++-- 2 files changed, 76 insertions(+), 13 deletions(-) diff --git a/reverse_engineering/helpers/documentKindHelper.js b/reverse_engineering/helpers/documentKindHelper.js index fc67c9b..135369c 100644 --- a/reverse_engineering/helpers/documentKindHelper.js +++ b/reverse_engineering/helpers/documentKindHelper.js @@ -10,6 +10,7 @@ const _ = require('lodash'); const clusterHelper = require('./clusterHelper'); const restApiHelper = require('./restApiHelper'); +const schemaHelper = require('./schemaHelper'); const { COUCHBASE_ERROR_CODE, DEFAULT_NAME, FLAVOR_REGEX, STATUS } = require('../../shared/constants'); /** @@ -73,10 +74,6 @@ const getBucketDocumentKindData = async ({ cluster, connectionInfo, bucketName, * @returns {object} */ const generateCustomInferSchema = ({ bucketName, documents }) => { - const typeOf = obj => { - return {}.toString.call(obj).split(' ')[1].slice(0, -1).toLowerCase(); - }; - documents = documents.map(item => { if (typeof item[bucketName] === 'object') { return item[bucketName]; @@ -107,13 +104,13 @@ const generateCustomInferSchema = ({ bucketName, documents }) => { inferSchema.properties[prop]['samples'].push(item[prop]); } - inferSchema.properties[prop]['type'] = typeOf(item[prop]); + inferSchema.properties[prop]['type'] = schemaHelper.typeOf(item[prop]); } else { inferSchema.properties[prop] = { '#docs': 1, '%docs': 100, 'samples': [item[prop]], - 'type': typeOf(item[prop]), + 'type': schemaHelper.typeOf(item[prop]), }; } } diff --git a/reverse_engineering/helpers/schemaHelper.js b/reverse_engineering/helpers/schemaHelper.js index 780c7a2..5493de7 100644 --- a/reverse_engineering/helpers/schemaHelper.js +++ b/reverse_engineering/helpers/schemaHelper.js @@ -1,9 +1,10 @@ /** * @typedef {import('../../shared/types').DbCollectionData} DbCollectionData * @typedef {import('../../shared/types').Document} Document + * @typedef {import('../../shared/types').NameMap} NameMap */ const _ = require('lodash'); -const { DEFAULT_KEY_NAME } = require('../../shared/constants'); +const { DEFAULT_KEY_NAME, DEFAULT_NAME } = require('../../shared/constants'); /** * @@ -25,10 +26,8 @@ const getDbCollectionData = ({ ...item[bucketName], })); const standardDoc = _.first(jsonDocuments); - - if (!includeEmptyCollection && _.isEmpty(jsonDocuments)) { - return null; - } + const keyType = standardDoc ? typeOf(standardDoc[DEFAULT_KEY_NAME]) : ''; + const emptyBucket = !includeEmptyCollection && _.isEmpty(jsonDocuments); return { dbName: scopeName, @@ -39,12 +38,12 @@ const getDbCollectionData = ({ bucketInfo: { bucket: bucketName, }, - emptyBucket: false, + emptyBucket: emptyBucket, documents: jsonDocuments, entityLevel: { indexes: collectionIndexes, keyName: DEFAULT_KEY_NAME, - keyType: typeOf(standardDoc[DEFAULT_KEY_NAME]), + keyType: keyType, }, }; }; @@ -74,6 +73,70 @@ const convertInferSchemaToDocuments = ({ inference, bucketName }) => { })); }; +/** + * @param {{ entitiesData: object[]; indexesByCollectionMap: NameMap; scopeBucketNameMap: NameMap }} param0 + * @returns {DbCollectionData[]} + */ +const mapParsedResultToMultipleSchema = ({ entitiesData, indexesByCollectionMap, scopeBucketNameMap }) => { + return entitiesData.map(({ bucketName, scopeName, collectionName, ifNotExists }) => { + return { + doc: { + bucketInfo: { + bucket: bucketName, + ifNotExists: scopeBucketNameMap[scopeName]?.ifNotExists, + }, + emptyBucket: !collectionName, + dbName: scopeName, + collectionName: collectionName, + entityLevel: { + ifNotExists, + indexes: indexesByCollectionMap?.[bucketName]?.[scopeName]?.[collectionName], + }, + }, + objectNames: { + collectionName, + }, + collectionDocs: {}, + jsonSchema: { + type: 'object', + }, + }; + }); +}; + +/** + * @param {{ dbCollectionsData: DbCollectionData[] }} param0 + * @returns {DbCollectionData[]} + */ +const updateDefaultDbNames = ({ dbCollectionsData }) => { + const bucketNames = dbCollectionsData + .filter(data => data.dbName === DEFAULT_NAME) + .map(data => data.bucketInfo.bucket); + const uniqueBucketNames = _.uniq(bucketNames); + const shouldUpdateDefaultNames = _.uniq(bucketNames).length > 1; + + if (!shouldUpdateDefaultNames) { + return dbCollectionsData; + } + + return dbCollectionsData.map(data => { + if (data.dbName !== DEFAULT_NAME) { + return data; + } + + const bucketIndex = uniqueBucketNames.indexOf(data.bucketInfo.bucket); + + if (bucketIndex < 1) { + return data; + } + + return { + ...data, + dbName: data.dbName + `(${bucketIndex})`, + }; + }); +}; + /** * @param {any} obj * @returns {string} @@ -85,4 +148,7 @@ const typeOf = obj => { module.exports = { getDbCollectionData, convertInferSchemaToDocuments, + mapParsedResultToMultipleSchema, + typeOf, + updateDefaultDbNames, }; From 0de3b14b06c873d3262b14dc7e6ac2efc614df50 Mon Sep 17 00:00:00 2001 From: Serhii Filonenko Date: Fri, 2 Feb 2024 12:44:03 +0200 Subject: [PATCH 18/37] package: add parser folder to eslint ignore --- .eslintignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.eslintignore b/.eslintignore index eca74ee..ceacd6a 100644 --- a/.eslintignore +++ b/.eslintignore @@ -3,6 +3,7 @@ .idea node_modules reverse_engineering/node_modules +reverse_engineering/antlr/parser forward_engineering/node_modules build release From c0dc23677f345f373a17e941586394cc97806f89 Mon Sep 17 00:00:00 2001 From: Serhii Filonenko Date: Fri, 2 Feb 2024 12:46:15 +0200 Subject: [PATCH 19/37] package: remove unneded libs --- package-lock.json | 2535 --------------------------------------------- package.json | 2 - 2 files changed, 2537 deletions(-) diff --git a/package-lock.json b/package-lock.json index 08f1cbf..979d659 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,9 +20,7 @@ "eslint": "8.56.0", "eslint-config-prettier": "9.1.0", "eslint-plugin-prettier": "5.1.3", - "install": "^0.13.0", "lint-staged": "14.0.1", - "npm": "^10.4.0", "prettier": "3.2.4", "simple-git-hooks": "2.9.0" }, @@ -1521,15 +1519,6 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, - "node_modules/install": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/install/-/install-0.13.0.tgz", - "integrity": "sha512-zDml/jzr2PKU9I8J/xyZBQn8rPCAY//UOYNmR01XwNwyfhEWObo2SWfSl1+0tm1u6PhxLwDnfsT/6jB7OUxqFA==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -1881,163 +1870,6 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, - "node_modules/npm": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/npm/-/npm-10.4.0.tgz", - "integrity": "sha512-RS7Mx0OVfXlOcQLRePuDIYdFCVBPCNapWHplDK+mh7GDdP/Tvor4ocuybRRPSvfcRb2vjRJt1fHCqw3cr8qACQ==", - "bundleDependencies": [ - "@isaacs/string-locale-compare", - "@npmcli/arborist", - "@npmcli/config", - "@npmcli/fs", - "@npmcli/map-workspaces", - "@npmcli/package-json", - "@npmcli/promise-spawn", - "@npmcli/run-script", - "@sigstore/tuf", - "abbrev", - "archy", - "cacache", - "chalk", - "ci-info", - "cli-columns", - "cli-table3", - "columnify", - "fastest-levenshtein", - "fs-minipass", - "glob", - "graceful-fs", - "hosted-git-info", - "ini", - "init-package-json", - "is-cidr", - "json-parse-even-better-errors", - "libnpmaccess", - "libnpmdiff", - "libnpmexec", - "libnpmfund", - "libnpmhook", - "libnpmorg", - "libnpmpack", - "libnpmpublish", - "libnpmsearch", - "libnpmteam", - "libnpmversion", - "make-fetch-happen", - "minimatch", - "minipass", - "minipass-pipeline", - "ms", - "node-gyp", - "nopt", - "normalize-package-data", - "npm-audit-report", - "npm-install-checks", - "npm-package-arg", - "npm-pick-manifest", - "npm-profile", - "npm-registry-fetch", - "npm-user-validate", - "npmlog", - "p-map", - "pacote", - "parse-conflict-json", - "proc-log", - "qrcode-terminal", - "read", - "semver", - "spdx-expression-parse", - "ssri", - "supports-color", - "tar", - "text-table", - "tiny-relative-date", - "treeverse", - "validate-npm-package-name", - "which", - "write-file-atomic" - ], - "dev": true, - "dependencies": { - "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/arborist": "^7.2.1", - "@npmcli/config": "^8.0.2", - "@npmcli/fs": "^3.1.0", - "@npmcli/map-workspaces": "^3.0.4", - "@npmcli/package-json": "^5.0.0", - "@npmcli/promise-spawn": "^7.0.1", - "@npmcli/run-script": "^7.0.4", - "@sigstore/tuf": "^2.3.0", - "abbrev": "^2.0.0", - "archy": "~1.0.0", - "cacache": "^18.0.2", - "chalk": "^5.3.0", - "ci-info": "^4.0.0", - "cli-columns": "^4.0.0", - "cli-table3": "^0.6.3", - "columnify": "^1.6.0", - "fastest-levenshtein": "^1.0.16", - "fs-minipass": "^3.0.3", - "glob": "^10.3.10", - "graceful-fs": "^4.2.11", - "hosted-git-info": "^7.0.1", - "ini": "^4.1.1", - "init-package-json": "^6.0.0", - "is-cidr": "^5.0.3", - "json-parse-even-better-errors": "^3.0.1", - "libnpmaccess": "^8.0.1", - "libnpmdiff": "^6.0.3", - "libnpmexec": "^7.0.4", - "libnpmfund": "^5.0.1", - "libnpmhook": "^10.0.0", - "libnpmorg": "^6.0.1", - "libnpmpack": "^6.0.3", - "libnpmpublish": "^9.0.2", - "libnpmsearch": "^7.0.0", - "libnpmteam": "^6.0.0", - "libnpmversion": "^5.0.1", - "make-fetch-happen": "^13.0.0", - "minimatch": "^9.0.3", - "minipass": "^7.0.4", - "minipass-pipeline": "^1.2.4", - "ms": "^2.1.2", - "node-gyp": "^10.0.1", - "nopt": "^7.2.0", - "normalize-package-data": "^6.0.0", - "npm-audit-report": "^5.0.0", - "npm-install-checks": "^6.3.0", - "npm-package-arg": "^11.0.1", - "npm-pick-manifest": "^9.0.0", - "npm-profile": "^9.0.0", - "npm-registry-fetch": "^16.1.0", - "npm-user-validate": "^2.0.0", - "npmlog": "^7.0.1", - "p-map": "^4.0.0", - "pacote": "^17.0.6", - "parse-conflict-json": "^3.0.1", - "proc-log": "^3.0.0", - "qrcode-terminal": "^0.12.0", - "read": "^2.1.0", - "semver": "^7.5.4", - "spdx-expression-parse": "^3.0.1", - "ssri": "^10.0.5", - "supports-color": "^9.4.0", - "tar": "^6.2.0", - "text-table": "~0.2.0", - "tiny-relative-date": "^1.3.0", - "treeverse": "^3.0.0", - "validate-npm-package-name": "^5.0.0", - "which": "^4.0.0", - "write-file-atomic": "^5.0.1" - }, - "bin": { - "npm": "bin/npm-cli.js", - "npx": "bin/npx-cli.js" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, "node_modules/npm-run-path": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.2.0.tgz", @@ -2065,2373 +1897,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm/node_modules/@colors/colors": { - "version": "1.5.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/npm/node_modules/@isaacs/cliui": { - "version": "8.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/npm/node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/npm/node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm/node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/npm/node_modules/@isaacs/string-locale-compare": { - "version": "1.1.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/@npmcli/agent": { - "version": "2.2.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "agent-base": "^7.1.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.1", - "lru-cache": "^10.0.1", - "socks-proxy-agent": "^8.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/arborist": { - "version": "7.3.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/fs": "^3.1.0", - "@npmcli/installed-package-contents": "^2.0.2", - "@npmcli/map-workspaces": "^3.0.2", - "@npmcli/metavuln-calculator": "^7.0.0", - "@npmcli/name-from-folder": "^2.0.0", - "@npmcli/node-gyp": "^3.0.0", - "@npmcli/package-json": "^5.0.0", - "@npmcli/query": "^3.0.1", - "@npmcli/run-script": "^7.0.2", - "bin-links": "^4.0.1", - "cacache": "^18.0.0", - "common-ancestor-path": "^1.0.1", - "hosted-git-info": "^7.0.1", - "json-parse-even-better-errors": "^3.0.0", - "json-stringify-nice": "^1.1.4", - "minimatch": "^9.0.0", - "nopt": "^7.0.0", - "npm-install-checks": "^6.2.0", - "npm-package-arg": "^11.0.1", - "npm-pick-manifest": "^9.0.0", - "npm-registry-fetch": "^16.0.0", - "npmlog": "^7.0.1", - "pacote": "^17.0.4", - "parse-conflict-json": "^3.0.0", - "proc-log": "^3.0.0", - "promise-all-reject-late": "^1.0.0", - "promise-call-limit": "^3.0.1", - "read-package-json-fast": "^3.0.2", - "semver": "^7.3.7", - "ssri": "^10.0.5", - "treeverse": "^3.0.0", - "walk-up-path": "^3.0.1" - }, - "bin": { - "arborist": "bin/index.js" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/config": { - "version": "8.1.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/map-workspaces": "^3.0.2", - "ci-info": "^4.0.0", - "ini": "^4.1.0", - "nopt": "^7.0.0", - "proc-log": "^3.0.0", - "read-package-json-fast": "^3.0.2", - "semver": "^7.3.5", - "walk-up-path": "^3.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/disparity-colors": { - "version": "3.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "ansi-styles": "^4.3.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/disparity-colors/node_modules/ansi-styles": { - "version": "4.3.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/npm/node_modules/@npmcli/fs": { - "version": "3.1.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/git": { - "version": "5.0.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/promise-spawn": "^7.0.0", - "lru-cache": "^10.0.1", - "npm-pick-manifest": "^9.0.0", - "proc-log": "^3.0.0", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^4.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/installed-package-contents": { - "version": "2.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-bundled": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "bin": { - "installed-package-contents": "lib/index.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/map-workspaces": { - "version": "3.0.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/name-from-folder": "^2.0.0", - "glob": "^10.2.2", - "minimatch": "^9.0.0", - "read-package-json-fast": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/metavuln-calculator": { - "version": "7.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "cacache": "^18.0.0", - "json-parse-even-better-errors": "^3.0.0", - "pacote": "^17.0.0", - "semver": "^7.3.5" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/name-from-folder": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/node-gyp": { - "version": "3.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/package-json": { - "version": "5.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/git": "^5.0.0", - "glob": "^10.2.2", - "hosted-git-info": "^7.0.0", - "json-parse-even-better-errors": "^3.0.0", - "normalize-package-data": "^6.0.0", - "proc-log": "^3.0.0", - "semver": "^7.5.3" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/promise-spawn": { - "version": "7.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "which": "^4.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/query": { - "version": "3.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@npmcli/run-script": { - "version": "7.0.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/node-gyp": "^3.0.0", - "@npmcli/package-json": "^5.0.0", - "@npmcli/promise-spawn": "^7.0.0", - "node-gyp": "^10.0.0", - "which": "^4.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=14" - } - }, - "node_modules/npm/node_modules/@sigstore/bundle": { - "version": "2.1.1", - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/protobuf-specs": "^0.2.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@sigstore/core": { - "version": "0.2.0", - "inBundle": true, - "license": "Apache-2.0", - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@sigstore/protobuf-specs": { - "version": "0.2.1", - "inBundle": true, - "license": "Apache-2.0", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@sigstore/sign": { - "version": "2.2.1", - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/bundle": "^2.1.1", - "@sigstore/core": "^0.2.0", - "@sigstore/protobuf-specs": "^0.2.1", - "make-fetch-happen": "^13.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@sigstore/tuf": { - "version": "2.3.0", - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/protobuf-specs": "^0.2.1", - "tuf-js": "^2.2.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@sigstore/verify": { - "version": "0.1.0", - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/bundle": "^2.1.1", - "@sigstore/core": "^0.2.0", - "@sigstore/protobuf-specs": "^0.2.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@tufjs/canonical-json": { - "version": "2.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/@tufjs/models": { - "version": "2.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "@tufjs/canonical-json": "2.0.0", - "minimatch": "^9.0.3" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/abbrev": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/agent-base": { - "version": "7.1.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/npm/node_modules/aggregate-error": { - "version": "3.1.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/ansi-regex": { - "version": "5.0.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/ansi-styles": { - "version": "6.2.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/npm/node_modules/aproba": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/archy": { - "version": "1.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/are-we-there-yet": { - "version": "4.0.2", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/balanced-match": { - "version": "1.0.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/bin-links": { - "version": "4.0.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "cmd-shim": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "read-cmd-shim": "^4.0.0", - "write-file-atomic": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/binary-extensions": { - "version": "2.2.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/brace-expansion": { - "version": "2.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/npm/node_modules/builtins": { - "version": "5.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "semver": "^7.0.0" - } - }, - "node_modules/npm/node_modules/cacache": { - "version": "18.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/fs": "^3.1.0", - "fs-minipass": "^3.0.0", - "glob": "^10.2.2", - "lru-cache": "^10.0.1", - "minipass": "^7.0.3", - "minipass-collect": "^2.0.1", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^4.0.0", - "ssri": "^10.0.0", - "tar": "^6.1.11", - "unique-filename": "^3.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/chalk": { - "version": "5.3.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/npm/node_modules/chownr": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/ci-info": { - "version": "4.0.0", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/cidr-regex": { - "version": "4.0.3", - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "ip-regex": "^5.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/npm/node_modules/clean-stack": { - "version": "2.2.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/cli-columns": { - "version": "4.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/npm/node_modules/cli-table3": { - "version": "0.6.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "@colors/colors": "1.5.0" - } - }, - "node_modules/npm/node_modules/clone": { - "version": "1.0.4", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/npm/node_modules/cmd-shim": { - "version": "6.0.2", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/color-convert": { - "version": "2.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/npm/node_modules/color-name": { - "version": "1.1.4", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/color-support": { - "version": "1.1.3", - "inBundle": true, - "license": "ISC", - "bin": { - "color-support": "bin.js" - } - }, - "node_modules/npm/node_modules/columnify": { - "version": "1.6.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "strip-ansi": "^6.0.1", - "wcwidth": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/npm/node_modules/common-ancestor-path": { - "version": "1.0.1", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/console-control-strings": { - "version": "1.1.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/cross-spawn": { - "version": "7.0.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/cross-spawn/node_modules/which": { - "version": "2.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/cssesc": { - "version": "3.0.0", - "inBundle": true, - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/debug": { - "version": "4.3.4", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/npm/node_modules/debug/node_modules/ms": { - "version": "2.1.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/defaults": { - "version": "1.0.4", - "inBundle": true, - "license": "MIT", - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm/node_modules/diff": { - "version": "5.1.0", - "inBundle": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/npm/node_modules/eastasianwidth": { - "version": "0.2.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/emoji-regex": { - "version": "8.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/encoding": { - "version": "0.1.13", - "inBundle": true, - "license": "MIT", - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/npm/node_modules/env-paths": { - "version": "2.2.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/err-code": { - "version": "2.0.3", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/exponential-backoff": { - "version": "3.1.1", - "inBundle": true, - "license": "Apache-2.0" - }, - "node_modules/npm/node_modules/fastest-levenshtein": { - "version": "1.0.16", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 4.9.1" - } - }, - "node_modules/npm/node_modules/foreground-child": { - "version": "3.1.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/fs-minipass": { - "version": "3.0.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/function-bind": { - "version": "1.1.2", - "inBundle": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/npm/node_modules/gauge": { - "version": "5.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^4.0.1", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/glob": { - "version": "10.3.10", - "inBundle": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/graceful-fs": { - "version": "4.2.11", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/has-unicode": { - "version": "2.0.1", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/hasown": { - "version": "2.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/npm/node_modules/hosted-git-info": { - "version": "7.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^10.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/http-cache-semantics": { - "version": "4.1.1", - "inBundle": true, - "license": "BSD-2-Clause" - }, - "node_modules/npm/node_modules/http-proxy-agent": { - "version": "7.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/npm/node_modules/https-proxy-agent": { - "version": "7.0.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/npm/node_modules/iconv-lite": { - "version": "0.6.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/ignore-walk": { - "version": "6.0.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minimatch": "^9.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/imurmurhash": { - "version": "0.1.4", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/npm/node_modules/indent-string": { - "version": "4.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/ini": { - "version": "4.1.1", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/init-package-json": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-package-arg": "^11.0.0", - "promzard": "^1.0.0", - "read": "^2.0.0", - "read-package-json": "^7.0.0", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4", - "validate-npm-package-name": "^5.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/ip": { - "version": "2.0.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/ip-regex": { - "version": "5.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm/node_modules/is-cidr": { - "version": "5.0.3", - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "cidr-regex": "4.0.3" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/npm/node_modules/is-core-module": { - "version": "2.13.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/npm/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/is-lambda": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/isexe": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/jackspeak": { - "version": "2.3.6", - "inBundle": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/npm/node_modules/json-parse-even-better-errors": { - "version": "3.0.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/json-stringify-nice": { - "version": "1.1.4", - "inBundle": true, - "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/jsonparse": { - "version": "1.3.1", - "engines": [ - "node >= 0.2.0" - ], - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/just-diff": { - "version": "6.0.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/just-diff-apply": { - "version": "5.5.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/libnpmaccess": { - "version": "8.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-package-arg": "^11.0.1", - "npm-registry-fetch": "^16.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/libnpmdiff": { - "version": "6.0.6", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/arborist": "^7.2.1", - "@npmcli/disparity-colors": "^3.0.0", - "@npmcli/installed-package-contents": "^2.0.2", - "binary-extensions": "^2.2.0", - "diff": "^5.1.0", - "minimatch": "^9.0.0", - "npm-package-arg": "^11.0.1", - "pacote": "^17.0.4", - "tar": "^6.2.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/libnpmexec": { - "version": "7.0.7", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/arborist": "^7.2.1", - "@npmcli/run-script": "^7.0.2", - "ci-info": "^4.0.0", - "npm-package-arg": "^11.0.1", - "npmlog": "^7.0.1", - "pacote": "^17.0.4", - "proc-log": "^3.0.0", - "read": "^2.0.0", - "read-package-json-fast": "^3.0.2", - "semver": "^7.3.7", - "walk-up-path": "^3.0.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/libnpmfund": { - "version": "5.0.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/arborist": "^7.2.1" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/libnpmhook": { - "version": "10.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^16.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/libnpmorg": { - "version": "6.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^16.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/libnpmpack": { - "version": "6.0.6", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/arborist": "^7.2.1", - "@npmcli/run-script": "^7.0.2", - "npm-package-arg": "^11.0.1", - "pacote": "^17.0.4" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/libnpmpublish": { - "version": "9.0.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "ci-info": "^4.0.0", - "normalize-package-data": "^6.0.0", - "npm-package-arg": "^11.0.1", - "npm-registry-fetch": "^16.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.7", - "sigstore": "^2.2.0", - "ssri": "^10.0.5" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/libnpmsearch": { - "version": "7.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-registry-fetch": "^16.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/libnpmteam": { - "version": "6.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^16.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/libnpmversion": { - "version": "5.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/git": "^5.0.3", - "@npmcli/run-script": "^7.0.2", - "json-parse-even-better-errors": "^3.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.7" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/lru-cache": { - "version": "10.1.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "14 || >=16.14" - } - }, - "node_modules/npm/node_modules/make-fetch-happen": { - "version": "13.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/agent": "^2.0.0", - "cacache": "^18.0.0", - "http-cache-semantics": "^4.1.1", - "is-lambda": "^1.0.1", - "minipass": "^7.0.2", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "ssri": "^10.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/minimatch": { - "version": "9.0.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/minipass": { - "version": "7.0.4", - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/npm/node_modules/minipass-collect": { - "version": "2.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/npm/node_modules/minipass-fetch": { - "version": "3.0.4", - "inBundle": true, - "license": "MIT", - "dependencies": { - "minipass": "^7.0.3", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/npm/node_modules/minipass-flush": { - "version": "1.0.5", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/minipass-flush/node_modules/minipass": { - "version": "3.3.6", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minipass-json-stream": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" - } - }, - "node_modules/npm/node_modules/minipass-json-stream/node_modules/minipass": { - "version": "3.3.6", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minipass-pipeline": { - "version": "1.2.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minipass-pipeline/node_modules/minipass": { - "version": "3.3.6", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minipass-sized": { - "version": "1.0.3", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minipass-sized/node_modules/minipass": { - "version": "3.3.6", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minizlib": { - "version": "2.1.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/mkdirp": { - "version": "1.0.4", - "inBundle": true, - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/ms": { - "version": "2.1.3", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/mute-stream": { - "version": "1.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/negotiator": { - "version": "0.6.3", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/npm/node_modules/node-gyp": { - "version": "10.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "env-paths": "^2.2.0", - "exponential-backoff": "^3.1.1", - "glob": "^10.3.10", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^13.0.0", - "nopt": "^7.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^4.0.0" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/nopt": { - "version": "7.2.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "abbrev": "^2.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/normalize-package-data": { - "version": "6.0.0", - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^7.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npm-audit-report": { - "version": "5.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npm-bundled": { - "version": "3.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npm-install-checks": { - "version": "6.3.0", - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "semver": "^7.1.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npm-normalize-package-bin": { - "version": "3.0.1", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npm-package-arg": { - "version": "11.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "hosted-git-info": "^7.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.5", - "validate-npm-package-name": "^5.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npm-packlist": { - "version": "8.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "ignore-walk": "^6.0.4" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npm-pick-manifest": { - "version": "9.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-install-checks": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0", - "npm-package-arg": "^11.0.0", - "semver": "^7.3.5" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npm-profile": { - "version": "9.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-registry-fetch": "^16.0.0", - "proc-log": "^3.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npm-registry-fetch": { - "version": "16.1.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "make-fetch-happen": "^13.0.0", - "minipass": "^7.0.2", - "minipass-fetch": "^3.0.0", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.1.2", - "npm-package-arg": "^11.0.0", - "proc-log": "^3.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npm-user-validate": { - "version": "2.0.0", - "inBundle": true, - "license": "BSD-2-Clause", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/npmlog": { - "version": "7.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "are-we-there-yet": "^4.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^5.0.0", - "set-blocking": "^2.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/p-map": { - "version": "4.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm/node_modules/pacote": { - "version": "17.0.6", - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/git": "^5.0.0", - "@npmcli/installed-package-contents": "^2.0.1", - "@npmcli/promise-spawn": "^7.0.0", - "@npmcli/run-script": "^7.0.0", - "cacache": "^18.0.0", - "fs-minipass": "^3.0.0", - "minipass": "^7.0.2", - "npm-package-arg": "^11.0.0", - "npm-packlist": "^8.0.0", - "npm-pick-manifest": "^9.0.0", - "npm-registry-fetch": "^16.0.0", - "proc-log": "^3.0.0", - "promise-retry": "^2.0.1", - "read-package-json": "^7.0.0", - "read-package-json-fast": "^3.0.0", - "sigstore": "^2.2.0", - "ssri": "^10.0.0", - "tar": "^6.1.11" - }, - "bin": { - "pacote": "lib/bin.js" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/parse-conflict-json": { - "version": "3.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "json-parse-even-better-errors": "^3.0.0", - "just-diff": "^6.0.0", - "just-diff-apply": "^5.2.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/path-key": { - "version": "3.1.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/path-scurry": { - "version": "1.10.1", - "inBundle": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^9.1.1 || ^10.0.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/postcss-selector-parser": { - "version": "6.0.15", - "inBundle": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/proc-log": { - "version": "3.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/promise-all-reject-late": { - "version": "1.0.1", - "inBundle": true, - "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/promise-call-limit": { - "version": "3.0.1", - "inBundle": true, - "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/promise-inflight": { - "version": "1.0.1", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/promise-retry": { - "version": "2.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/promzard": { - "version": "1.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "read": "^2.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/qrcode-terminal": { - "version": "0.12.0", - "inBundle": true, - "bin": { - "qrcode-terminal": "bin/qrcode-terminal.js" - } - }, - "node_modules/npm/node_modules/read": { - "version": "2.1.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "mute-stream": "~1.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/read-cmd-shim": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/read-package-json": { - "version": "7.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "glob": "^10.2.2", - "json-parse-even-better-errors": "^3.0.0", - "normalize-package-data": "^6.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/read-package-json-fast": { - "version": "3.0.2", - "inBundle": true, - "license": "ISC", - "dependencies": { - "json-parse-even-better-errors": "^3.0.0", - "npm-normalize-package-bin": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/retry": { - "version": "0.12.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/npm/node_modules/safer-buffer": { - "version": "2.1.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/semver": { - "version": "7.5.4", - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/set-blocking": { - "version": "2.0.0", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/shebang-command": { - "version": "2.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/shebang-regex": { - "version": "3.0.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/signal-exit": { - "version": "4.1.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/sigstore": { - "version": "2.2.0", - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "@sigstore/bundle": "^2.1.1", - "@sigstore/core": "^0.2.0", - "@sigstore/protobuf-specs": "^0.2.1", - "@sigstore/sign": "^2.2.1", - "@sigstore/tuf": "^2.3.0", - "@sigstore/verify": "^0.1.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/smart-buffer": { - "version": "4.2.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/npm/node_modules/socks": { - "version": "2.7.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ip": "^2.0.0", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.13.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/npm/node_modules/socks-proxy-agent": { - "version": "8.0.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.0.2", - "debug": "^4.3.4", - "socks": "^2.7.1" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/npm/node_modules/spdx-correct": { - "version": "3.2.0", - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/npm/node_modules/spdx-exceptions": { - "version": "2.3.0", - "inBundle": true, - "license": "CC-BY-3.0" - }, - "node_modules/npm/node_modules/spdx-expression-parse": { - "version": "3.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/npm/node_modules/spdx-license-ids": { - "version": "3.0.16", - "inBundle": true, - "license": "CC0-1.0" - }, - "node_modules/npm/node_modules/ssri": { - "version": "10.0.5", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/string-width": { - "version": "4.2.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "inBundle": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/strip-ansi": { - "version": "6.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/supports-color": { - "version": "9.4.0", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/npm/node_modules/tar": { - "version": "6.2.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/tar/node_modules/fs-minipass": { - "version": "2.1.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/tar/node_modules/minipass": { - "version": "5.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/text-table": { - "version": "0.2.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/tiny-relative-date": { - "version": "1.3.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/treeverse": { - "version": "3.0.0", - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/tuf-js": { - "version": "2.2.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "@tufjs/models": "2.0.0", - "debug": "^4.3.4", - "make-fetch-happen": "^13.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/unique-filename": { - "version": "3.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "unique-slug": "^4.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/unique-slug": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/util-deprecate": { - "version": "1.0.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/validate-npm-package-license": { - "version": "3.0.4", - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/npm/node_modules/validate-npm-package-name": { - "version": "5.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "builtins": "^5.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/walk-up-path": { - "version": "3.0.1", - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/wcwidth": { - "version": "1.0.1", - "inBundle": true, - "license": "MIT", - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/npm/node_modules/which": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC", - "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/which/node_modules/isexe": { - "version": "3.1.1", - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=16" - } - }, - "node_modules/npm/node_modules/wide-align": { - "version": "1.1.5", - "inBundle": true, - "license": "ISC", - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "node_modules/npm/node_modules/wrap-ansi": { - "version": "8.1.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/npm/node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/npm/node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { - "version": "4.3.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/npm/node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.0.1", - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/npm/node_modules/wrap-ansi/node_modules/emoji-regex": { - "version": "9.2.2", - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/wrap-ansi/node_modules/string-width": { - "version": "5.1.2", - "inBundle": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm/node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.1.0", - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/npm/node_modules/write-file-atomic": { - "version": "5.0.1", - "inBundle": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm/node_modules/yallist": { - "version": "4.0.0", - "inBundle": true, - "license": "ISC" - }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", diff --git a/package.json b/package.json index 55ac739..8165ae6 100644 --- a/package.json +++ b/package.json @@ -40,9 +40,7 @@ "eslint": "8.56.0", "eslint-config-prettier": "9.1.0", "eslint-plugin-prettier": "5.1.3", - "install": "^0.13.0", "lint-staged": "14.0.1", - "npm": "^10.4.0", "prettier": "3.2.4", "simple-git-hooks": "2.9.0" }, From 3c0108bcca1b20526ec90c242c11f6e5569317f4 Mon Sep 17 00:00:00 2001 From: Serhii Filonenko Date: Fri, 2 Feb 2024 16:11:16 +0200 Subject: [PATCH 20/37] config: add container level keys config --- .../container_level/containerLevelConfig.json | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/properties_pane/container_level/containerLevelConfig.json b/properties_pane/container_level/containerLevelConfig.json index c7c7c7d..5dec4ab 100644 --- a/properties_pane/container_level/containerLevelConfig.json +++ b/properties_pane/container_level/containerLevelConfig.json @@ -116,7 +116,6 @@ making sure that you maintain a proper JSON format. [ { "lowerTab": "Details", - "containerLevelKeys": [], "structure": [ { "propertyKeyword": "name", @@ -342,6 +341,23 @@ making sure that you maintain a proper JSON format. "shouldValidate": false, "propertyType": "checkbox" } + ], + "containerLevelKeys": [ + { + "labelName": "Key", + "propertyName": "Key", + "propertyKeyword": "key", + "defaultName": "KEY", + "propertyPrimaryKey": true, + "propertyType": "text", + "typeName": "type", + "typeOptions": ["string"], + "defaultType": "string", + "disabledFieldOption": true, + "validation": { + "disableNameValidationForReservedWords": true + } + } ] } ] From 393d4c0dc3c3c61f67cd47fea4d8ad94da2bff5b Mon Sep 17 00:00:00 2001 From: Serhii Filonenko Date: Fri, 2 Feb 2024 16:11:48 +0200 Subject: [PATCH 21/37] RE: add document kinds value to db collections data --- reverse_engineering/helpers/clusterHelper.js | 2 ++ reverse_engineering/helpers/schemaHelper.js | 25 +++++++++++++------- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/reverse_engineering/helpers/clusterHelper.js b/reverse_engineering/helpers/clusterHelper.js index e49c78a..2a914da 100644 --- a/reverse_engineering/helpers/clusterHelper.js +++ b/reverse_engineering/helpers/clusterHelper.js @@ -377,6 +377,7 @@ const getDbCollectionData = async ({ bucketName, scopeName, collectionName, + documentKind, documents, collectionIndexes, includeEmptyCollection, @@ -431,6 +432,7 @@ const getDbCollectionData = async ({ bucketName, scopeName, collectionName, + documentKind, documents, collectionIndexes, includeEmptyCollection, diff --git a/reverse_engineering/helpers/schemaHelper.js b/reverse_engineering/helpers/schemaHelper.js index 5493de7..cd21e1e 100644 --- a/reverse_engineering/helpers/schemaHelper.js +++ b/reverse_engineering/helpers/schemaHelper.js @@ -7,8 +7,14 @@ const _ = require('lodash'); const { DEFAULT_KEY_NAME, DEFAULT_NAME } = require('../../shared/constants'); /** - * - * @param {{ documents: Document[]; bucketName: string; scopeName: string; collectionName: string; collectionIndexes: object[]; includeEmptyCollection: boolean }} param0 + * @param {{ + * documents: Document[]; + * bucketName: string; + * scopeName: string; + * collectionName: string; + * documentKind: string; + * collectionIndexes: object[]; + * includeEmptyCollection: boolean }} param0 * @returns {DbCollectionData} */ const getDbCollectionData = ({ @@ -16,6 +22,7 @@ const getDbCollectionData = ({ bucketName, scopeName, collectionName, + documentKind, collectionIndexes, includeEmptyCollection, }) => { @@ -26,24 +33,24 @@ const getDbCollectionData = ({ ...item[bucketName], })); const standardDoc = _.first(jsonDocuments); - const keyType = standardDoc ? typeOf(standardDoc[DEFAULT_KEY_NAME]) : ''; const emptyBucket = !includeEmptyCollection && _.isEmpty(jsonDocuments); return { dbName: scopeName, - collectionName: collectionName, - documentKind: '', + collectionName, + documentKind, collectionDocs: {}, - standardDoc: standardDoc, + standardDoc, bucketInfo: { bucket: bucketName, }, - emptyBucket: emptyBucket, + emptyBucket, documents: jsonDocuments, + containerLevelKeys: { + key: DEFAULT_KEY_NAME, + }, entityLevel: { indexes: collectionIndexes, - keyName: DEFAULT_KEY_NAME, - keyType: keyType, }, }; }; From e9eb77fb41130cb13e379f9f41d570360a305e4d Mon Sep 17 00:00:00 2001 From: Serhii Filonenko Date: Fri, 2 Feb 2024 17:08:46 +0200 Subject: [PATCH 22/37] RE: add logging for test connection --- reverse_engineering/api.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/reverse_engineering/api.js b/reverse_engineering/api.js index 616fc33..4ba9141 100644 --- a/reverse_engineering/api.js +++ b/reverse_engineering/api.js @@ -50,13 +50,19 @@ const disconnect = async (__connectionInfo, __appLogger, callback) => { * @param {Callback} callback * @param {App} app */ -const testConnection = async (connectionInfo, __appLogger, callback, app) => { +const testConnection = async (connectionInfo, appLogger, callback, app) => { + const logger = logHelper.createLogger({ + title: 'Test database connection', + hiddenKeys: connectionInfo.hiddenKeys, + logger: appLogger, + }); try { await connectionHelper.disconnect(); await connectionHelper.connect({ connectionInfo, app }); await connectionHelper.disconnect(); callback(); } catch (error) { + logger.error(error); callback(error); } }; From b9097baaa78b8156207f20b1f2738de7bb4cf255 Mon Sep 17 00:00:00 2001 From: Serhii Filonenko Date: Fri, 2 Feb 2024 17:09:32 +0200 Subject: [PATCH 23/37] RE: add safety getting scopes for document kinds --- reverse_engineering/helpers/clusterHelper.js | 21 +++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/reverse_engineering/helpers/clusterHelper.js b/reverse_engineering/helpers/clusterHelper.js index 2a914da..90a686a 100644 --- a/reverse_engineering/helpers/clusterHelper.js +++ b/reverse_engineering/helpers/clusterHelper.js @@ -63,12 +63,21 @@ const getBucketScopeNameMap = async ({ cluster, selectedBucket }) => { const buckets = await getBucketsForReverse({ cluster, selectedBucket }); const bucketScopeMap = {}; - for (const bucket of buckets) { - const scopes = await getBucketScopes({ cluster, bucketName: bucket.name }); - bucketScopeMap[bucket.name] = scopes; - } + try { + for (const bucket of buckets) { + const scopes = await getBucketScopes({ cluster, bucketName: bucket.name }); + bucketScopeMap[bucket.name] = scopes; + } - return bucketScopeMap; + return bucketScopeMap; + } catch (error) { + for (const bucket of buckets) { + const defaultScope = { name: DEFAULT_NAME, collections: [{ name: DEFAULT_NAME }] }; + bucketScopeMap[bucket.name] = [defaultScope]; + } + + return bucketScopeMap; + } }; /** @@ -386,6 +395,7 @@ const getDbCollectionData = async ({ try { const errorCode = getErrorCode({ error }); switch (errorCode) { + case COUCHBASE_ERROR_CODE.parseSyntaxError: case COUCHBASE_ERROR_CODE.collectionDoesNotExist: query = queryHelper.getSelectBucketDocumentsByDocumentKindQuery({ bucketName, @@ -455,6 +465,7 @@ const getIndexes = async ({ cluster, logger }) => { module.exports = { isBucketHasDefaultCollection, getAllBuckets, + getBucketsForReverse, getBucketScopeNameMap, getDbCollectionsNames, getDbCollectionData, From 1903fa4c95d6c2a68b4aa3cee8135945ce894512 Mon Sep 17 00:00:00 2001 From: Serhii Filonenko Date: Tue, 6 Feb 2024 10:48:51 +0200 Subject: [PATCH 24/37] package: install hackolade couchbase deps --- package-lock.json | 705 ++++++++++++++++++++++++++++++++++++++++++++-- package.json | 1 + 2 files changed, 685 insertions(+), 21 deletions(-) diff --git a/package-lock.json b/package-lock.json index 979d659..3ec51be 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,7 @@ "dependencies": { "antlr4": "^4.9.2", "async": "^3.2.5", + "couchbase": "npm:@hackolade/couchbase@27.4.7", "lodash": "^4.17.21" }, "devDependencies": { @@ -462,6 +463,38 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/@hackolade/couchbase-darwin-arm64-napi": { + "version": "27.4.7", + "resolved": "https://registry.npmjs.org/@hackolade/couchbase-darwin-arm64-napi/-/couchbase-darwin-arm64-napi-27.4.7.tgz", + "integrity": "sha512-6zfKRfWpARg8gKFm/O4MgZcGUWtVzLSxjlrSmRVkmFCHK8U/uKPBs1vMQuiwCQTlV7e8rUQiS8vI7Oz4mcphbw==", + "engines": { + "node": ">=16" + } + }, + "node_modules/@hackolade/couchbase-darwin-x64-napi": { + "version": "27.4.7", + "resolved": "https://registry.npmjs.org/@hackolade/couchbase-darwin-x64-napi/-/couchbase-darwin-x64-napi-27.4.7.tgz", + "integrity": "sha512-Pv9BqQf8/jjjoTW/JPVNaWyC9pPHuP88+3Q0fAoBNo8XLwjQJ4ejNwsnl1D7jQkiubO/SyJnDFoxiHej9GAnRw==", + "engines": { + "node": ">=16" + } + }, + "node_modules/@hackolade/couchbase-linux-x64-napi": { + "version": "27.4.7", + "resolved": "https://registry.npmjs.org/@hackolade/couchbase-linux-x64-napi/-/couchbase-linux-x64-napi-27.4.7.tgz", + "integrity": "sha512-WYc45PdEeXT7hTPf/X7oxheqZCJuafa6h9JWJLst2NJx49gPUurFrSOkwDS/Z+oRpK9nNb3rDUvh9x7gqMLIzQ==", + "engines": { + "node": ">=16" + } + }, + "node_modules/@hackolade/couchbase-win32-x64-napi": { + "version": "27.4.7", + "resolved": "https://registry.npmjs.org/@hackolade/couchbase-win32-x64-napi/-/couchbase-win32-x64-napi-27.4.7.tgz", + "integrity": "sha512-4hTtYz8iRfKC78e+wCf3OjyyT9RlyIypsfA4It3i4GhDXyLqYP4L4SAoFDrfzFHmIQa4H1MPRJ705gw9H+h2ig==", + "engines": { + "node": ">=16" + } + }, "node_modules/@hackolade/hck-esbuild-plugins-pack": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/@hackolade/hck-esbuild-plugins-pack/-/hck-esbuild-plugins-pack-0.0.1.tgz", @@ -659,7 +692,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, "engines": { "node": ">=8" } @@ -668,7 +700,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -687,6 +718,23 @@ "node": ">=14" } }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" + }, + "node_modules/are-we-there-yet": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -707,6 +755,21 @@ "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/axios": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.7.tgz", + "integrity": "sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==", + "dependencies": { + "follow-redirects": "^1.15.4", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -760,6 +823,14 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } + }, "node_modules/clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", @@ -800,11 +871,91 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/cmake-js": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/cmake-js/-/cmake-js-7.3.0.tgz", + "integrity": "sha512-dXs2zq9WxrV87bpJ+WbnGKv8WUBXDw8blNiwNHoRe/it+ptscxhQHKB1SJXa1w+kocLMeP28Tk4/eTCezg4o+w==", + "dependencies": { + "axios": "^1.6.5", + "debug": "^4", + "fs-extra": "^11.2.0", + "lodash.isplainobject": "^4.0.6", + "memory-stream": "^1.0.0", + "node-api-headers": "^1.1.0", + "npmlog": "^6.0.2", + "rc": "^1.2.7", + "semver": "^7.5.4", + "tar": "^6.2.0", + "url-join": "^4.0.1", + "which": "^2.0.2", + "yargs": "^17.7.2" + }, + "bin": { + "cmake-js": "bin/cmake-js" + }, + "engines": { + "node": ">= 14.15.0" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -815,8 +966,15 @@ "node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "bin": { + "color-support": "bin.js" + } }, "node_modules/colorette": { "version": "2.0.20", @@ -824,6 +982,17 @@ "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/commander": { "version": "11.0.0", "resolved": "https://registry.npmjs.org/commander/-/commander-11.0.0.tgz", @@ -839,6 +1008,28 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" + }, + "node_modules/couchbase": { + "name": "@hackolade/couchbase", + "version": "27.4.7", + "resolved": "https://registry.npmjs.org/@hackolade/couchbase/-/couchbase-27.4.7.tgz", + "integrity": "sha512-zSfhVk14td3v6S8e9XvWynmWNCEoeJX7j0r51gGUAkPhKpCdYu9e2noAjsm8GbqOVefSGNW1Hw4O1y5AbW6OoQ==", + "dependencies": { + "@hackolade/couchbase-darwin-arm64-napi": "27.4.7", + "@hackolade/couchbase-darwin-x64-napi": "27.4.7", + "@hackolade/couchbase-linux-x64-napi": "27.4.7", + "@hackolade/couchbase-win32-x64-napi": "27.4.7", + "cmake-js": "^7.2.1", + "node-addon-api": "^7.0.0" + }, + "engines": { + "node": ">=16" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -857,7 +1048,6 @@ "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, "dependencies": { "ms": "2.1.2" }, @@ -870,6 +1060,14 @@ } } }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -898,6 +1096,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -985,6 +1196,14 @@ "esbuild": ">= 0.14.0" } }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "engines": { + "node": ">=6" + } + }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -1331,11 +1550,42 @@ "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", "dev": true }, + "node_modules/follow-redirects": { + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", + "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/fs-extra": { "version": "11.2.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", - "dev": true, "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -1345,12 +1595,86 @@ "node": ">=14.14" } }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, + "node_modules/gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/gauge/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/gauge/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/gauge/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, "node_modules/get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", @@ -1433,8 +1757,7 @@ "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, "node_modules/graphemer": { "version": "1.4.0", @@ -1451,6 +1774,11 @@ "node": ">=8" } }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" + }, "node_modules/human-signals": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", @@ -1516,8 +1844,12 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" }, "node_modules/is-extglob": { "version": "2.1.1", @@ -1594,8 +1926,7 @@ "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, "node_modules/js-yaml": { "version": "4.1.0", @@ -1631,7 +1962,6 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, "dependencies": { "universalify": "^2.0.0" }, @@ -1754,6 +2084,11 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -1806,6 +2141,25 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/memory-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/memory-stream/-/memory-stream-1.0.0.tgz", + "integrity": "sha512-Wm13VcsPIMdG96dzILfij09PvuS3APtcKNh7M28FsCA/w6+1mjR7hhPmfFNoilX9xU7wTdhsH5lJAm6XNzdtww==", + "dependencies": { + "readable-stream": "^3.4.0" + } + }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -1834,6 +2188,25 @@ "node": ">=8.6" } }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/mimic-fn": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", @@ -1858,11 +2231,60 @@ "node": "*" } }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/natural-compare": { "version": "1.4.0", @@ -1870,6 +2292,19 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, + "node_modules/node-addon-api": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.0.tgz", + "integrity": "sha512-mNcltoe1R8o7STTegSOHdnJNN7s5EUvhoS7ShnTHDyOSd+8H+UdWODq6qSv67PjC8Zc5JRT8+oLAMCr0SIXw7g==", + "engines": { + "node": "^16 || ^18 || >= 20" + } + }, + "node_modules/node-api-headers": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/node-api-headers/-/node-api-headers-1.1.0.tgz", + "integrity": "sha512-ucQW+SbYCUPfprvmzBsnjT034IGRB2XK8rRc78BgjNKhTdFKgAwAmgW704bKIBmcYW48it0Gkjpkd39Azrwquw==" + }, "node_modules/npm-run-path": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.2.0.tgz", @@ -1897,6 +2332,20 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "dependencies": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -2091,6 +2540,11 @@ "node": ">=6.0.0" } }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -2120,6 +2574,49 @@ } ] }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -2223,6 +2720,44 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -2247,8 +2782,7 @@ "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, "node_modules/simple-git-hooks": { "version": "2.9.0", @@ -2297,6 +2831,14 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/string-argv": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", @@ -2354,7 +2896,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -2414,6 +2955,22 @@ "url": "https://opencollective.com/unts" } }, + "node_modules/tar": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", + "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -2472,7 +3029,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, "engines": { "node": ">= 10.0.0" } @@ -2486,11 +3042,20 @@ "punycode": "^2.1.0" } }, + "node_modules/url-join": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", + "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==" + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, "dependencies": { "isexe": "^2.0.0" }, @@ -2501,6 +3066,40 @@ "node": ">= 8" } }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wide-align/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/wide-align/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/wide-align/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/wrap-ansi": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", @@ -2563,6 +3162,19 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "node_modules/yaml": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", @@ -2572,6 +3184,57 @@ "node": ">= 14" } }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/yargs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index 8165ae6..6ccb585 100644 --- a/package.json +++ b/package.json @@ -47,6 +47,7 @@ "dependencies": { "antlr4": "^4.9.2", "async": "^3.2.5", + "couchbase": "npm:@hackolade/couchbase@27.4.7", "lodash": "^4.17.21" } } From 70b9ddc8f6a73313bf5edec8e8a734e2080e1187 Mon Sep 17 00:00:00 2001 From: Serhii Filonenko Date: Tue, 6 Feb 2024 12:17:06 +0200 Subject: [PATCH 25/37] parser: remove license data --- reverse_engineering/antlr/n1qlToCollectionVisitor.js | 8 -------- 1 file changed, 8 deletions(-) diff --git a/reverse_engineering/antlr/n1qlToCollectionVisitor.js b/reverse_engineering/antlr/n1qlToCollectionVisitor.js index 411ec66..25ffb5a 100644 --- a/reverse_engineering/antlr/n1qlToCollectionVisitor.js +++ b/reverse_engineering/antlr/n1qlToCollectionVisitor.js @@ -1,11 +1,3 @@ -/* - * Copyright © 2016-2023 by IntegrIT S.A. dba Hackolade. All rights reserved. - * - * The copyright to the computer software herein is the property of IntegrIT S.A. - * The software may be used and/or copied only with the written permission of - * IntegrIT S.A. or in accordance with the terms and conditions stipulated in - * the agreement/contract under which the software has been supplied. - */ const n1qlVisitor = require('./parser/n1qlVisitor'); const { DEFAULT_NAME } = require('../../shared/constants'); From f8e2749a415cae109e2e98cc05ab67b4e9d611c8 Mon Sep 17 00:00:00 2001 From: Serhii Filonenko Date: Tue, 6 Feb 2024 12:17:32 +0200 Subject: [PATCH 26/37] RE: fix names of params --- reverse_engineering/api.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/reverse_engineering/api.js b/reverse_engineering/api.js index 4ba9141..b9a295b 100644 --- a/reverse_engineering/api.js +++ b/reverse_engineering/api.js @@ -35,8 +35,8 @@ const handleFileData = filePath => { }; /** - * @param {ConnectionInfo} connectionInfo - * @param {AppLogger} appLogger + * @param {ConnectionInfo} __connectionInfo + * @param {AppLogger} __appLogger * @param {Callback} callback */ const disconnect = async (__connectionInfo, __appLogger, callback) => { @@ -58,7 +58,7 @@ const testConnection = async (connectionInfo, appLogger, callback, app) => { }); try { await connectionHelper.disconnect(); - await connectionHelper.connect({ connectionInfo, app }); + await connectionHelper.connect({ connectionInfo }); await connectionHelper.disconnect(); callback(); } catch (error) { @@ -80,7 +80,7 @@ const getDocumentKinds = async (connectionInfo, appLogger, callback, app) => { logger: appLogger, }); try { - const cluster = await connectionHelper.connect({ connectionInfo, app }); + const cluster = await connectionHelper.connect({ connectionInfo }); const bucketsDocumentKindList = await documentKindHelper.getBucketsDocumentKindList({ cluster, connectionInfo, @@ -109,7 +109,7 @@ const getDbCollectionsNames = async (connectionInfo, appLogger, callback, app) = }); try { - const cluster = await connectionHelper.connect({ connectionInfo, app }); + const cluster = await connectionHelper.connect({ connectionInfo }); const documents = await clusterHelper.getDbCollectionsNames({ connectionInfo, cluster, logger, app }); callback(null, documents); @@ -137,7 +137,7 @@ const getDbCollectionsData = async (data, appLogger, callback, app) => { const connectionInfo = data.connectionInfo; const collectionVersion = data.collectionData.collectionVersion; const includeEmptyCollection = data.includeEmptyCollection; - const cluster = await connectionHelper.connect({ connectionInfo, app }); + const cluster = await connectionHelper.connect({ connectionInfo }); const indexes = await indexHelper.getIndexes({ cluster, connectionInfo, logger, app }); const indexesByCollectionMap = indexHelper.getIndexesByCollectionMap({ indexes }); const dbCollectionsData = []; From 34d00d516a50458f33ae9964e89c400c10ef6267 Mon Sep 17 00:00:00 2001 From: Serhii Filonenko Date: Tue, 6 Feb 2024 12:19:39 +0200 Subject: [PATCH 27/37] RE: add require of couchbase lib --- reverse_engineering/helpers/connectionHelper.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/reverse_engineering/helpers/connectionHelper.js b/reverse_engineering/helpers/connectionHelper.js index 4819fdb..6a349cd 100644 --- a/reverse_engineering/helpers/connectionHelper.js +++ b/reverse_engineering/helpers/connectionHelper.js @@ -5,6 +5,7 @@ * @typedef {import('../../shared/types').ConnectionParams} ConnectionParams */ +const couchbase = require('couchbase'); const clusterHelper = require('./clusterHelper'); const { AUTH_TYPE, COUCHBASE_HOST_PREFIX, COUCHBASE_DEFAULT_KV_CONNECTION_PORT } = require('../../shared/constants'); @@ -59,16 +60,15 @@ const generateConnectionParams = ({ connectionInfo }) => { }; /** - * @param {{ connectionInfo: ConnectionInfo; app: App; }} param0 + * @param {{ connectionInfo: ConnectionInfo }} param0 * @throws {Error} * @returns {Promise} */ -const connect = async ({ connectionInfo, app }) => { +const connect = async ({ connectionInfo }) => { if (cluster) { return cluster; } - const couchbase = await app.require('couchbase'); const { url, options } = generateConnectionParams({ connectionInfo }); cluster = await couchbase.connect(url, options); const buckets = await clusterHelper.getAllBuckets({ cluster }); From 5069883a85e8701d851085af5da3e5b167931d9f Mon Sep 17 00:00:00 2001 From: Serhii Filonenko Date: Tue, 6 Feb 2024 12:20:39 +0200 Subject: [PATCH 28/37] RE: replace complex iterations by async reduce --- reverse_engineering/helpers/clusterHelper.js | 122 +++++++++++------- .../helpers/documentKindHelper.js | 30 ++--- shared/constants.js | 10 ++ 3 files changed, 99 insertions(+), 63 deletions(-) diff --git a/reverse_engineering/helpers/clusterHelper.js b/reverse_engineering/helpers/clusterHelper.js index 90a686a..55ce552 100644 --- a/reverse_engineering/helpers/clusterHelper.js +++ b/reverse_engineering/helpers/clusterHelper.js @@ -10,6 +10,7 @@ * @typedef {import('../../shared/types').Logger} Logger * @typedef {import('../../shared/types').RecordSamplingSettings} RecordSamplingSettings */ +const async = require('async'); const _ = require('lodash'); const restApiHelper = require('./restApiHelper'); const schemaHelper = require('./schemaHelper'); @@ -20,6 +21,7 @@ const { DISABLED_TOOLTIP, STATUS, DEFAULT_LIMIT, + DEFAULT_SCOPE, } = require('../../shared/constants'); const queryHelper = require('./queryHelper'); @@ -44,40 +46,37 @@ const getBucketsForReverse = async ({ cluster, selectedBucket }) => { }; /** - * @param {{ cluster: Cluster; bucketName: string }} param0 + * @param {{ cluster: Cluster; bucketName: string; logger: Logger }} param0 * @returns {Promise} */ -const getBucketScopes = async ({ cluster, bucketName }) => { - const bucketInstance = await cluster.bucket(bucketName); - const collectionManager = await bucketInstance.collections(); - const bucketScopes = await collectionManager.getAllScopes(); +const getBucketScopes = async ({ cluster, bucketName, logger }) => { + try { + const bucketInstance = await cluster.bucket(bucketName); + const collectionManager = await bucketInstance.collections(); + const bucketScopes = await collectionManager.getAllScopes(); - return bucketScopes; + return bucketScopes; + } catch (error) { + logger.error(error); + return [DEFAULT_SCOPE]; + } }; /** - * @param {{cluster: Cluster; selectedBucket: string; }} param0 + * @param {{cluster: Cluster; selectedBucket: string; logger: Logger }} param0 * @returns {Promise} */ -const getBucketScopeNameMap = async ({ cluster, selectedBucket }) => { +const getBucketScopeNameMap = async ({ cluster, selectedBucket, logger }) => { const buckets = await getBucketsForReverse({ cluster, selectedBucket }); - const bucketScopeMap = {}; - - try { - for (const bucket of buckets) { - const scopes = await getBucketScopes({ cluster, bucketName: bucket.name }); - bucketScopeMap[bucket.name] = scopes; - } - return bucketScopeMap; - } catch (error) { - for (const bucket of buckets) { - const defaultScope = { name: DEFAULT_NAME, collections: [{ name: DEFAULT_NAME }] }; - bucketScopeMap[bucket.name] = [defaultScope]; - } + return await async.reduce(buckets, {}, async (result, bucket) => { + const scopes = await getBucketScopes({ cluster, bucketName: bucket.name, logger }); - return bucketScopeMap; - } + return { + ...result, + [bucket.name]: scopes, + }; + }); }; /** @@ -94,36 +93,63 @@ const isBucketHasDefaultCollection = ({ scopes }) => { * @returns {Promise} */ const getDbCollectionsNames = async ({ cluster, connectionInfo, logger, app }) => { - const dbCollectionNames = []; - const bucketScopeMap = await getBucketScopeNameMap({ cluster, selectedBucket: connectionInfo.couchbase_bucket }); + const bucketScopeMap = await getBucketScopeNameMap({ + cluster, + selectedBucket: connectionInfo.couchbase_bucket, + logger, + }); - for (const bucketName in bucketScopeMap) { + return await async.reduce(Object.entries(bucketScopeMap), [], async (result, [bucketName, scopes]) => { const documentKind = connectionInfo.documentKinds?.[bucketName]?.documentKindName || DEFAULT_DOCUMENT_KIND; - const scopes = bucketScopeMap[bucketName]; - - for (const scope of scopes) { - const scopeName = scope.name; - const scopeCollectionNames = scope.collections.map(collection => collection.name); - const notDefaultScopeCollectionNames = scopeCollectionNames.filter(name => name !== DEFAULT_NAME); - const hasDefaultCollection = isBucketHasDefaultCollection({ scopes: [scope] }); - const documentKindCollectionNames = hasDefaultCollection - ? await getDocumentKindCollectionNames({ - cluster, - connectionInfo, - bucketName, - documentKind, - logger, - app, - }) - : []; - const collectionNames = [...documentKindCollectionNames, ...notDefaultScopeCollectionNames]; - const dbCollectionNameData = prepareBucketCollectionNamesData({ bucketName, scopeName, collectionNames }); + const dbCollectionsNames = await async.map(scopes, async scope => { + const collectionNames = await getScopeCollectionNames({ + cluster, + connectionInfo, + bucketName, + documentKind, + scope, + logger, + app, + }); + + return prepareBucketCollectionNamesData({ bucketName, scopeName: scope.name, collectionNames }); + }); - dbCollectionNames.push(dbCollectionNameData); - } + return [...result, ...dbCollectionsNames]; + }); +}; + +/** + * @param {{ + * cluster: Cluster; + * connectionInfo: ConnectionInfo; + * bucketName: string; + * documentKind: string; + * scope: Scope; + * logger: Logger; + * app: App + * }} param0 + * @returns {Promise} + */ +const getScopeCollectionNames = async ({ cluster, connectionInfo, bucketName, documentKind, scope, logger, app }) => { + const scopeCollectionNames = scope.collections.map(collection => collection.name); + const notDefaultScopeCollectionNames = scopeCollectionNames.filter(name => name !== DEFAULT_NAME); + const hasDefaultCollection = isBucketHasDefaultCollection({ scopes: [scope] }); + + if (!hasDefaultCollection) { + return notDefaultScopeCollectionNames; } - return dbCollectionNames; + const documentKindCollectionNames = await getDocumentKindCollectionNames({ + cluster, + connectionInfo, + bucketName, + documentKind, + logger, + app, + }); + + return [...documentKindCollectionNames, ...notDefaultScopeCollectionNames]; }; /** diff --git a/reverse_engineering/helpers/documentKindHelper.js b/reverse_engineering/helpers/documentKindHelper.js index 135369c..31b4d33 100644 --- a/reverse_engineering/helpers/documentKindHelper.js +++ b/reverse_engineering/helpers/documentKindHelper.js @@ -7,6 +7,7 @@ * @typedef {import('../../shared/types').BucketCollectionNamesData} BucketCollectionNamesData * @typedef {import('../../shared/types').Logger} Logger */ +const async = require('async'); const _ = require('lodash'); const clusterHelper = require('./clusterHelper'); const restApiHelper = require('./restApiHelper'); @@ -26,27 +27,26 @@ const getDefaultDocumentKindData = ({ bucketName, status }) => { * @returns {Promise} */ const getBucketsDocumentKindList = async ({ cluster, connectionInfo, logger, app }) => { - const documentKindList = []; const selectedBucket = connectionInfo.couchbase_bucket; - const bucketScopeNameMap = await clusterHelper.getBucketScopeNameMap({ cluster, selectedBucket }); + const bucketScopeNameMap = await clusterHelper.getBucketScopeNameMap({ cluster, selectedBucket, logger }); - for (const bucketName in bucketScopeNameMap) { - const scopes = bucketScopeNameMap[bucketName]; + return await async.reduce(Object.entries(bucketScopeNameMap), [], async (result, [bucketName, scopes]) => { const hasDefaultCollection = clusterHelper.isBucketHasDefaultCollection({ scopes }); - if (hasDefaultCollection) { - const documentKindData = await getBucketDocumentKindData({ - cluster, - connectionInfo, - bucketName, - logger, - app, - }); - documentKindList.push(documentKindData); + if (!hasDefaultCollection) { + return result; } - } - return documentKindList; + const documentKindData = await getBucketDocumentKindData({ + cluster, + connectionInfo, + bucketName, + logger, + app, + }); + + return [...result, documentKindData]; + }); }; /** diff --git a/shared/constants.js b/shared/constants.js index 7fa28d8..5ee159d 100644 --- a/shared/constants.js +++ b/shared/constants.js @@ -38,6 +38,15 @@ const DEFAULT_DOCUMENT_KIND = '*'; const DEFAULT_KEY_NAME = 'KEY'; const DEFAULT_LIMIT = 1000; const DEFAULT_NAME = '_default'; +const DEFAULT_SCOPE = { + name: DEFAULT_NAME, + collections: [ + { + name: DEFAULT_NAME, + scopeName: DEFAULT_NAME, + }, + ], +}; const COUCHBASE_DEFAULT_KV_CONNECTION_PORT = 11210; @@ -57,6 +66,7 @@ module.exports = { DEFAULT_KEY_NAME, DEFAULT_LIMIT, DEFAULT_NAME, + DEFAULT_SCOPE, DISABLED_TOOLTIP, FLAVOR_REGEX, GET_META_REGEXP, From 7115891aeca84519e1f4d6cf61c6105a8a1e0e5a Mon Sep 17 00:00:00 2001 From: Serhii Filonenko Date: Tue, 6 Feb 2024 13:21:17 +0200 Subject: [PATCH 29/37] RE: reduce complexity for retriving doc kinds by manual infer --- .../helpers/documentKindHelper.js | 126 +++++++++++------- 1 file changed, 80 insertions(+), 46 deletions(-) diff --git a/reverse_engineering/helpers/documentKindHelper.js b/reverse_engineering/helpers/documentKindHelper.js index 31b4d33..641bffd 100644 --- a/reverse_engineering/helpers/documentKindHelper.js +++ b/reverse_engineering/helpers/documentKindHelper.js @@ -134,15 +134,14 @@ const isSuggestedDocKind = property => { }; /** - * @param {string[]} array - * @returns {string[]} + * @param {string} string + * @returns {string} */ -const replaceQuotes = array => - array.map(item => { - const inQuotes = _.first(item) === '`' && _.last(item) === '`'; +const replaceQuotes = string => { + const inQuotes = _.first(string) === '`' && _.last(string) === '`'; - return inQuotes ? item.slice(1, -1) : item; - }); + return inQuotes ? string.slice(1, -1) : string; +}; const rejectPropertiesWithLowAppearancePercentage = properties => { return _.chain(properties) @@ -163,59 +162,94 @@ const getSuggestedDocKindsFromInference = inferences => { }; /** - * @param {{ bucketName: string; inference: Document; isCustomInfer: boolean; flavorValue: string; }} param0 + * @param {{ bucketName: string; inference: Document; flavorValue: string; }} param0 * @returns {DocumentKindData} */ -const getDocumentKindDataFromInfer = ({ bucketName, inference, isCustomInfer, flavorValue }) => { - let suggestedDocKinds = []; - let otherDocKinds = []; - let documentKind = { - key: '', - probability: 0, - }; +const getDocumentKindDataFromInfer = ({ bucketName, inference, flavorValue }) => { + const flavor = flavorValue ? flavorValue.split(',') : inference[0].Flavor.split(','); - if (isCustomInfer) { - let minCount = Infinity; - inference = inference.properties; - - for (let key in inference) { - if (isSuggestedDocKind(inference[key])) { - suggestedDocKinds.push(key); - - if (inference[key]['%docs'] >= documentKind.probability && inference[key].samples.length < minCount) { - minCount = inference[key].samples.length; - documentKind.probability = inference[key]['%docs']; - documentKind.key = key; - } - } else if (inference[key]['type'] === 'string') { - otherDocKinds.push(key); - } - } - } else { - const flavor = flavorValue ? flavorValue.split(',') : inference[0].Flavor.split(','); - if (flavor.length === 1) { - suggestedDocKinds = getSuggestedDocKindsFromInference(inference); - const flavorRegex = new RegExp(FLAVOR_REGEX); - const matchedDocKind = flavor[0].match(flavorRegex); - documentKind.key = matchedDocKind.length ? matchedDocKind[1] : ''; - } + if (flavor.length !== 1) { + return { + bucketName, + documentKind: '', + documentList: [], + otherDocKinds: [], + }; } - documentKind.key = replaceQuotes([documentKind.key])[0]; + const suggestedDocKinds = getSuggestedDocKindsFromInference(inference); + const flavorRegex = new RegExp(FLAVOR_REGEX); + const matchedDocKind = flavor[0].match(flavorRegex); + const documentKindKey = matchedDocKind.length ? matchedDocKind[1] : ''; + const documentKind = replaceQuotes(documentKindKey); - let documentKindData = { + return { bucketName, + documentKind, documentList: suggestedDocKinds, - documentKind: documentKind.key, - otherDocKinds, + otherDocKinds: [], }; +}; + +/** + * @param {{ bucketName: string; inference: Document; }} param0 + * @returns {DocumentKindData} + */ +const getDocumentKindDataFromManualInfer = ({ bucketName, inference }) => { + let minCount = Infinity; + let probability = 0; - return documentKindData; + return Object.entries(inference.properties).reduce( + (result, [propertyName, property]) => { + const isSuggestedDocumentKind = isSuggestedDocKind(property); + const isOtherDocumentKind = property.type === 'string'; + + if (!isSuggestedDocumentKind && !isOtherDocumentKind) { + return result; + } + + if (!isSuggestedDocumentKind && isOtherDocumentKind) { + return { + ...result, + otherDocKinds: [...result.otherDocKinds, propertyName], + }; + } + + const propertyProbability = property['%docs']; + const propertySamplesCount = property.samples.length; + + if (propertyProbability >= probability && propertySamplesCount < minCount) { + minCount = propertySamplesCount; + probability = propertyProbability; + + return { + ...result, + documentList: [...result.documentList, propertyName], + documentKind: replaceQuotes(propertyName), + }; + } + + return { + ...result, + documentList: [...result.documentList, propertyName], + }; + }, + { + bucketName, + documentKind: '', + documentList: [], + otherDocKinds: [], + }, + ); }; +/** + * @param {{ bucketName: string; documents: Document[] }} param0 + * @returns {DocumentKindData} + */ const manualInfer = ({ bucketName, documents }) => { const inference = generateCustomInferSchema({ bucketName, documents }); - return getDocumentKindDataFromInfer({ bucketName, inference, isCustomInfer: true }); + return getDocumentKindDataFromManualInfer({ bucketName, inference }); }; /** From d6df181a2e3cfc37d2e1b2564171245cd637eb0f Mon Sep 17 00:00:00 2001 From: Serhii Filonenko Date: Tue, 6 Feb 2024 13:25:23 +0200 Subject: [PATCH 30/37] types: fix typing for some methods --- reverse_engineering/helpers/parserHelper.js | 2 +- shared/types.d.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/reverse_engineering/helpers/parserHelper.js b/reverse_engineering/helpers/parserHelper.js index b7fce4d..bd7ca68 100644 --- a/reverse_engineering/helpers/parserHelper.js +++ b/reverse_engineering/helpers/parserHelper.js @@ -32,7 +32,7 @@ const parseN1qlStatements = ({ statements }) => { }; /** - * @param {ParsedResult[]} result + * @param {{ result: ParsedResult[]; statements: string; }} param0 * @returns {ParsedResult} */ const mapParsedResult = ({ result, statements }) => { diff --git a/shared/types.d.ts b/shared/types.d.ts index bef3a68..01301de 100644 --- a/shared/types.d.ts +++ b/shared/types.d.ts @@ -46,12 +46,12 @@ type ConnectionInfo = { couchbase_password: string; security_certificate: FilePath; security_certificate_key: FilePath; - kv_port: number | undefined; + kv_port?: number; target: AppTarget; id: UUID; appVersion: string; tempFolder: FilePath; - pluginVersion: string | undefined; + pluginVersion?: string; includeSystemCollection: boolean; includeEmptyCollection: boolean; pagination: Pagination; From 1ba0a40913ef6a6fd9844e79cbac0d87c32ac56a Mon Sep 17 00:00:00 2001 From: Serhii Filonenko Date: Tue, 6 Feb 2024 13:26:42 +0200 Subject: [PATCH 31/37] package: uninstall redundant couchbase types lib --- package-lock.json | 25 ------------------------- package.json | 1 - shared/types.d.ts | 2 +- 3 files changed, 1 insertion(+), 27 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3ec51be..cb83b87 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,6 @@ }, "devDependencies": { "@hackolade/hck-esbuild-plugins-pack": "0.0.1", - "@types/couchbase": "^2.4.9", "esbuild": "0.19.12", "esbuild-plugin-clean": "1.0.1", "eslint": "8.56.0", @@ -587,24 +586,6 @@ "url": "https://opencollective.com/unts" } }, - "node_modules/@types/couchbase": { - "version": "2.4.9", - "resolved": "https://registry.npmjs.org/@types/couchbase/-/couchbase-2.4.9.tgz", - "integrity": "sha512-qQzFxeMbFU5U/s26UW4COD2MevkYRhunXx3D+GOuZROanOHmR3Hd3uKjOfqO4DpkXh3DMjVJX9qcMoM3CDdAFg==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/node": { - "version": "20.11.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.6.tgz", - "integrity": "sha512-+EOokTnksGVgip2PbYbr3xnR7kZigh4LbybAfBAw5BpnQ+FqBYUsvCEjYd70IXKlbohQ64mzEYmMtlWUY8q//Q==", - "dev": true, - "dependencies": { - "undici-types": "~5.26.4" - } - }, "node_modules/@ungap/structured-clone": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", @@ -3019,12 +3000,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true - }, "node_modules/universalify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", diff --git a/package.json b/package.json index 6ccb585..effcd2b 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,6 @@ }, "devDependencies": { "@hackolade/hck-esbuild-plugins-pack": "0.0.1", - "@types/couchbase": "^2.4.9", "esbuild": "0.19.12", "esbuild-plugin-clean": "1.0.1", "eslint": "8.56.0", diff --git a/shared/types.d.ts b/shared/types.d.ts index 01301de..0ccdba2 100644 --- a/shared/types.d.ts +++ b/shared/types.d.ts @@ -1,4 +1,4 @@ -import { Cluster, Scope, Bucket } from '@types/couchbase'; +import { Cluster, Scope, Bucket } from 'couchbase'; import { STATUS } from './constants'; type UUID = string; From 8dc0577d5a8519061760b2f7a34c88f2178e23b7 Mon Sep 17 00:00:00 2001 From: Serhii Filonenko Date: Tue, 6 Feb 2024 14:14:49 +0200 Subject: [PATCH 32/37] package: add exact lib versions --- package-lock.json | 6 +++--- package.json | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index cb83b87..a084197 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,10 +8,10 @@ "name": "CouchbaseV7Plus", "version": "0.0.3", "dependencies": { - "antlr4": "^4.9.2", - "async": "^3.2.5", + "antlr4": "4.9.2", + "async": "3.2.5", "couchbase": "npm:@hackolade/couchbase@27.4.7", - "lodash": "^4.17.21" + "lodash": "4.17.21" }, "devDependencies": { "@hackolade/hck-esbuild-plugins-pack": "0.0.1", diff --git a/package.json b/package.json index effcd2b..6e17411 100644 --- a/package.json +++ b/package.json @@ -44,9 +44,9 @@ "simple-git-hooks": "2.9.0" }, "dependencies": { - "antlr4": "^4.9.2", - "async": "^3.2.5", + "antlr4": "4.9.2", + "async": "3.2.5", "couchbase": "npm:@hackolade/couchbase@27.4.7", - "lodash": "^4.17.21" + "lodash": "4.17.21" } } From b29eb8cce630e19c6da2e95a358ef024f1a8d604 Mon Sep 17 00:00:00 2001 From: Serhii Filonenko Date: Wed, 7 Feb 2024 09:16:41 +0200 Subject: [PATCH 33/37] RE: fix create of empty scopes after reversing from file --- reverse_engineering/api.js | 2 +- reverse_engineering/helpers/schemaHelper.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/reverse_engineering/api.js b/reverse_engineering/api.js index b9a295b..251e7bd 100644 --- a/reverse_engineering/api.js +++ b/reverse_engineering/api.js @@ -193,7 +193,7 @@ const reFromFile = async (data, appLogger, callback) => { ); const emptyScopes = scopes.filter(scope => collections.every( - collection => collection.bucketName !== scope.bucketName && collection.scopeName !== scope.scopeName, + collection => collection.bucketName !== scope.bucketName || collection.scopeName !== scope.scopeName, ), ); const bucketIndexes = indexes.filter(index => diff --git a/reverse_engineering/helpers/schemaHelper.js b/reverse_engineering/helpers/schemaHelper.js index cd21e1e..2e9ebaf 100644 --- a/reverse_engineering/helpers/schemaHelper.js +++ b/reverse_engineering/helpers/schemaHelper.js @@ -90,7 +90,7 @@ const mapParsedResultToMultipleSchema = ({ entitiesData, indexesByCollectionMap, doc: { bucketInfo: { bucket: bucketName, - ifNotExists: scopeBucketNameMap[scopeName]?.ifNotExists, + ifNotExists: scopeBucketNameMap[bucketName]?.[scopeName]?.ifNotExists, }, emptyBucket: !collectionName, dbName: scopeName, From 8d09b9fd54198e56ad857ba572b49821131555b6 Mon Sep 17 00:00:00 2001 From: Serhii Filonenko Date: Wed, 7 Feb 2024 09:17:26 +0200 Subject: [PATCH 34/37] package: remove couchbase native module --- package-lock.json | 705 +----------------- package.json | 1 - reverse_engineering/api.js | 8 +- .../helpers/connectionHelper.js | 6 +- 4 files changed, 28 insertions(+), 692 deletions(-) diff --git a/package-lock.json b/package-lock.json index a084197..6a47d41 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,6 @@ "dependencies": { "antlr4": "4.9.2", "async": "3.2.5", - "couchbase": "npm:@hackolade/couchbase@27.4.7", "lodash": "4.17.21" }, "devDependencies": { @@ -462,38 +461,6 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@hackolade/couchbase-darwin-arm64-napi": { - "version": "27.4.7", - "resolved": "https://registry.npmjs.org/@hackolade/couchbase-darwin-arm64-napi/-/couchbase-darwin-arm64-napi-27.4.7.tgz", - "integrity": "sha512-6zfKRfWpARg8gKFm/O4MgZcGUWtVzLSxjlrSmRVkmFCHK8U/uKPBs1vMQuiwCQTlV7e8rUQiS8vI7Oz4mcphbw==", - "engines": { - "node": ">=16" - } - }, - "node_modules/@hackolade/couchbase-darwin-x64-napi": { - "version": "27.4.7", - "resolved": "https://registry.npmjs.org/@hackolade/couchbase-darwin-x64-napi/-/couchbase-darwin-x64-napi-27.4.7.tgz", - "integrity": "sha512-Pv9BqQf8/jjjoTW/JPVNaWyC9pPHuP88+3Q0fAoBNo8XLwjQJ4ejNwsnl1D7jQkiubO/SyJnDFoxiHej9GAnRw==", - "engines": { - "node": ">=16" - } - }, - "node_modules/@hackolade/couchbase-linux-x64-napi": { - "version": "27.4.7", - "resolved": "https://registry.npmjs.org/@hackolade/couchbase-linux-x64-napi/-/couchbase-linux-x64-napi-27.4.7.tgz", - "integrity": "sha512-WYc45PdEeXT7hTPf/X7oxheqZCJuafa6h9JWJLst2NJx49gPUurFrSOkwDS/Z+oRpK9nNb3rDUvh9x7gqMLIzQ==", - "engines": { - "node": ">=16" - } - }, - "node_modules/@hackolade/couchbase-win32-x64-napi": { - "version": "27.4.7", - "resolved": "https://registry.npmjs.org/@hackolade/couchbase-win32-x64-napi/-/couchbase-win32-x64-napi-27.4.7.tgz", - "integrity": "sha512-4hTtYz8iRfKC78e+wCf3OjyyT9RlyIypsfA4It3i4GhDXyLqYP4L4SAoFDrfzFHmIQa4H1MPRJ705gw9H+h2ig==", - "engines": { - "node": ">=16" - } - }, "node_modules/@hackolade/hck-esbuild-plugins-pack": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/@hackolade/hck-esbuild-plugins-pack/-/hck-esbuild-plugins-pack-0.0.1.tgz", @@ -673,6 +640,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, "engines": { "node": ">=8" } @@ -681,6 +649,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -699,23 +668,6 @@ "node": ">=14" } }, - "node_modules/aproba": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", - "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==" - }, - "node_modules/are-we-there-yet": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", - "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -736,21 +688,6 @@ "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "node_modules/axios": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.7.tgz", - "integrity": "sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==", - "dependencies": { - "follow-redirects": "^1.15.4", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -804,14 +741,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "engines": { - "node": ">=10" - } - }, "node_modules/clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", @@ -852,91 +781,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/cliui/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/cliui/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/cmake-js": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/cmake-js/-/cmake-js-7.3.0.tgz", - "integrity": "sha512-dXs2zq9WxrV87bpJ+WbnGKv8WUBXDw8blNiwNHoRe/it+ptscxhQHKB1SJXa1w+kocLMeP28Tk4/eTCezg4o+w==", - "dependencies": { - "axios": "^1.6.5", - "debug": "^4", - "fs-extra": "^11.2.0", - "lodash.isplainobject": "^4.0.6", - "memory-stream": "^1.0.0", - "node-api-headers": "^1.1.0", - "npmlog": "^6.0.2", - "rc": "^1.2.7", - "semver": "^7.5.4", - "tar": "^6.2.0", - "url-join": "^4.0.1", - "which": "^2.0.2", - "yargs": "^17.7.2" - }, - "bin": { - "cmake-js": "bin/cmake-js" - }, - "engines": { - "node": ">= 14.15.0" - } - }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -947,15 +796,8 @@ "node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "bin": { - "color-support": "bin.js" - } + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "node_modules/colorette": { "version": "2.0.20", @@ -963,17 +805,6 @@ "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "dev": true }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/commander": { "version": "11.0.0", "resolved": "https://registry.npmjs.org/commander/-/commander-11.0.0.tgz", @@ -989,28 +820,6 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" - }, - "node_modules/couchbase": { - "name": "@hackolade/couchbase", - "version": "27.4.7", - "resolved": "https://registry.npmjs.org/@hackolade/couchbase/-/couchbase-27.4.7.tgz", - "integrity": "sha512-zSfhVk14td3v6S8e9XvWynmWNCEoeJX7j0r51gGUAkPhKpCdYu9e2noAjsm8GbqOVefSGNW1Hw4O1y5AbW6OoQ==", - "dependencies": { - "@hackolade/couchbase-darwin-arm64-napi": "27.4.7", - "@hackolade/couchbase-darwin-x64-napi": "27.4.7", - "@hackolade/couchbase-linux-x64-napi": "27.4.7", - "@hackolade/couchbase-win32-x64-napi": "27.4.7", - "cmake-js": "^7.2.1", - "node-addon-api": "^7.0.0" - }, - "engines": { - "node": ">=16" - } - }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -1029,6 +838,7 @@ "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, "dependencies": { "ms": "2.1.2" }, @@ -1041,14 +851,6 @@ } } }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -1077,19 +879,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" - }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -1177,14 +966,6 @@ "esbuild": ">= 0.14.0" } }, - "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", - "engines": { - "node": ">=6" - } - }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -1531,42 +1312,11 @@ "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", "dev": true }, - "node_modules/follow-redirects": { - "version": "1.15.5", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", - "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/fs-extra": { "version": "11.2.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -1576,86 +1326,12 @@ "node": ">=14.14" } }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, - "node_modules/gauge": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", - "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.3", - "console-control-strings": "^1.1.0", - "has-unicode": "^2.0.1", - "signal-exit": "^3.0.7", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/gauge/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/gauge/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/gauge/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, "node_modules/get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", @@ -1738,7 +1414,8 @@ "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true }, "node_modules/graphemer": { "version": "1.4.0", @@ -1755,11 +1432,6 @@ "node": ">=8" } }, - "node_modules/has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" - }, "node_modules/human-signals": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", @@ -1825,12 +1497,8 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true }, "node_modules/is-extglob": { "version": "2.1.1", @@ -1907,7 +1575,8 @@ "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true }, "node_modules/js-yaml": { "version": "4.1.0", @@ -1943,6 +1612,7 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, "dependencies": { "universalify": "^2.0.0" }, @@ -2065,11 +1735,6 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" - }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -2122,25 +1787,6 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/memory-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/memory-stream/-/memory-stream-1.0.0.tgz", - "integrity": "sha512-Wm13VcsPIMdG96dzILfij09PvuS3APtcKNh7M28FsCA/w6+1mjR7hhPmfFNoilX9xU7wTdhsH5lJAm6XNzdtww==", - "dependencies": { - "readable-stream": "^3.4.0" - } - }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -2169,25 +1815,6 @@ "node": ">=8.6" } }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/mimic-fn": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", @@ -2212,60 +1839,11 @@ "node": "*" } }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true }, "node_modules/natural-compare": { "version": "1.4.0", @@ -2273,19 +1851,6 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, - "node_modules/node-addon-api": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.0.tgz", - "integrity": "sha512-mNcltoe1R8o7STTegSOHdnJNN7s5EUvhoS7ShnTHDyOSd+8H+UdWODq6qSv67PjC8Zc5JRT8+oLAMCr0SIXw7g==", - "engines": { - "node": "^16 || ^18 || >= 20" - } - }, - "node_modules/node-api-headers": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/node-api-headers/-/node-api-headers-1.1.0.tgz", - "integrity": "sha512-ucQW+SbYCUPfprvmzBsnjT034IGRB2XK8rRc78BgjNKhTdFKgAwAmgW704bKIBmcYW48it0Gkjpkd39Azrwquw==" - }, "node_modules/npm-run-path": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.2.0.tgz", @@ -2313,20 +1878,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npmlog": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", - "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", - "dependencies": { - "are-we-there-yet": "^3.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^4.0.3", - "set-blocking": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -2521,11 +2072,6 @@ "node": ">=6.0.0" } }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -2555,49 +2101,6 @@ } ] }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -2701,44 +2204,6 @@ "queue-microtask": "^1.2.2" } }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" - }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -2763,7 +2228,8 @@ "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true }, "node_modules/simple-git-hooks": { "version": "2.9.0", @@ -2812,14 +2278,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, "node_modules/string-argv": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", @@ -2877,6 +2335,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -2936,22 +2395,6 @@ "url": "https://opencollective.com/unts" } }, - "node_modules/tar": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", - "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -3004,6 +2447,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, "engines": { "node": ">= 10.0.0" } @@ -3017,20 +2461,11 @@ "punycode": "^2.1.0" } }, - "node_modules/url-join": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", - "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==" - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, "dependencies": { "isexe": "^2.0.0" }, @@ -3041,40 +2476,6 @@ "node": ">= 8" } }, - "node_modules/wide-align": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", - "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", - "dependencies": { - "string-width": "^1.0.2 || 2 || 3 || 4" - } - }, - "node_modules/wide-align/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/wide-align/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/wide-align/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/wrap-ansi": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", @@ -3137,19 +2538,6 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, "node_modules/yaml": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", @@ -3159,57 +2547,6 @@ "node": ">= 14" } }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/yargs/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index 6e17411..b2b4295 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,6 @@ "dependencies": { "antlr4": "4.9.2", "async": "3.2.5", - "couchbase": "npm:@hackolade/couchbase@27.4.7", "lodash": "4.17.21" } } diff --git a/reverse_engineering/api.js b/reverse_engineering/api.js index 251e7bd..4b1848b 100644 --- a/reverse_engineering/api.js +++ b/reverse_engineering/api.js @@ -58,7 +58,7 @@ const testConnection = async (connectionInfo, appLogger, callback, app) => { }); try { await connectionHelper.disconnect(); - await connectionHelper.connect({ connectionInfo }); + await connectionHelper.connect({ connectionInfo, app }); await connectionHelper.disconnect(); callback(); } catch (error) { @@ -80,7 +80,7 @@ const getDocumentKinds = async (connectionInfo, appLogger, callback, app) => { logger: appLogger, }); try { - const cluster = await connectionHelper.connect({ connectionInfo }); + const cluster = await connectionHelper.connect({ connectionInfo, app }); const bucketsDocumentKindList = await documentKindHelper.getBucketsDocumentKindList({ cluster, connectionInfo, @@ -109,7 +109,7 @@ const getDbCollectionsNames = async (connectionInfo, appLogger, callback, app) = }); try { - const cluster = await connectionHelper.connect({ connectionInfo }); + const cluster = await connectionHelper.connect({ connectionInfo, app }); const documents = await clusterHelper.getDbCollectionsNames({ connectionInfo, cluster, logger, app }); callback(null, documents); @@ -137,7 +137,7 @@ const getDbCollectionsData = async (data, appLogger, callback, app) => { const connectionInfo = data.connectionInfo; const collectionVersion = data.collectionData.collectionVersion; const includeEmptyCollection = data.includeEmptyCollection; - const cluster = await connectionHelper.connect({ connectionInfo }); + const cluster = await connectionHelper.connect({ connectionInfo, app }); const indexes = await indexHelper.getIndexes({ cluster, connectionInfo, logger, app }); const indexesByCollectionMap = indexHelper.getIndexesByCollectionMap({ indexes }); const dbCollectionsData = []; diff --git a/reverse_engineering/helpers/connectionHelper.js b/reverse_engineering/helpers/connectionHelper.js index 6a349cd..cc17e0c 100644 --- a/reverse_engineering/helpers/connectionHelper.js +++ b/reverse_engineering/helpers/connectionHelper.js @@ -5,7 +5,6 @@ * @typedef {import('../../shared/types').ConnectionParams} ConnectionParams */ -const couchbase = require('couchbase'); const clusterHelper = require('./clusterHelper'); const { AUTH_TYPE, COUCHBASE_HOST_PREFIX, COUCHBASE_DEFAULT_KV_CONNECTION_PORT } = require('../../shared/constants'); @@ -60,15 +59,16 @@ const generateConnectionParams = ({ connectionInfo }) => { }; /** - * @param {{ connectionInfo: ConnectionInfo }} param0 + * @param {{ connectionInfo: ConnectionInfo, app: App }} param0 * @throws {Error} * @returns {Promise} */ -const connect = async ({ connectionInfo }) => { +const connect = async ({ connectionInfo, app }) => { if (cluster) { return cluster; } + const couchbase = await app.require('couchbase'); const { url, options } = generateConnectionParams({ connectionInfo }); cluster = await couchbase.connect(url, options); const buckets = await clusterHelper.getAllBuckets({ cluster }); From c490b5a59e708819846edd10849b0a4eade31153 Mon Sep 17 00:00:00 2001 From: Serhii Filonenko Date: Wed, 7 Feb 2024 09:19:55 +0200 Subject: [PATCH 35/37] build: add .ts files to excluded extensions --- buildConstants.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildConstants.js b/buildConstants.js index 5c3f239..89b6090 100644 --- a/buildConstants.js +++ b/buildConstants.js @@ -2,7 +2,7 @@ const path = require('path'); const DEFAULT_RELEASE_FOLDER_PATH = path.resolve(__dirname, 'release'); -const EXCLUDED_EXTENSIONS = ['.js', '.g4', '.interp', '.tokens']; +const EXCLUDED_EXTENSIONS = ['.js', '.g4', '.interp', '.tokens', '.ts']; const EXCLUDED_FILES = [ '.github', '.DS_Store', From 88d7dda03436705af7a32d243352b625f1e71e60 Mon Sep 17 00:00:00 2001 From: Serhii Filonenko Date: Wed, 7 Feb 2024 09:23:19 +0200 Subject: [PATCH 36/37] package: add types lib to dev dependencies --- package-lock.json | 25 +++++++++++++++++++++++++ package.json | 1 + 2 files changed, 26 insertions(+) diff --git a/package-lock.json b/package-lock.json index 6a47d41..f677fb3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,6 +14,7 @@ }, "devDependencies": { "@hackolade/hck-esbuild-plugins-pack": "0.0.1", + "@types/couchbase": "2.4.9", "esbuild": "0.19.12", "esbuild-plugin-clean": "1.0.1", "eslint": "8.56.0", @@ -553,6 +554,24 @@ "url": "https://opencollective.com/unts" } }, + "node_modules/@types/couchbase": { + "version": "2.4.9", + "resolved": "https://registry.npmjs.org/@types/couchbase/-/couchbase-2.4.9.tgz", + "integrity": "sha512-qQzFxeMbFU5U/s26UW4COD2MevkYRhunXx3D+GOuZROanOHmR3Hd3uKjOfqO4DpkXh3DMjVJX9qcMoM3CDdAFg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "20.11.16", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.16.tgz", + "integrity": "sha512-gKb0enTmRCzXSSUJDq6/sPcqrfCv2mkkG6Jt/clpn5eiCbKTY+SgZUxo+p8ZKMof5dCp9vHQUAB7wOUTod22wQ==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, "node_modules/@ungap/structured-clone": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", @@ -2443,6 +2462,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, "node_modules/universalify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", diff --git a/package.json b/package.json index b2b4295..026eada 100644 --- a/package.json +++ b/package.json @@ -34,6 +34,7 @@ }, "devDependencies": { "@hackolade/hck-esbuild-plugins-pack": "0.0.1", + "@types/couchbase": "2.4.9", "esbuild": "0.19.12", "esbuild-plugin-clean": "1.0.1", "eslint": "8.56.0", From 9f4850663d1bdda546a625ee90a46183144ff456 Mon Sep 17 00:00:00 2001 From: Serhii Filonenko Date: Wed, 7 Feb 2024 14:13:25 +0200 Subject: [PATCH 37/37] RE: add retrive selected bucket collections if selected collections are not specifed --- reverse_engineering/api.js | 8 ++--- reverse_engineering/helpers/clusterHelper.js | 35 ++++++++++++++++++++ 2 files changed, 39 insertions(+), 4 deletions(-) diff --git a/reverse_engineering/api.js b/reverse_engineering/api.js index 4b1848b..cb3de2d 100644 --- a/reverse_engineering/api.js +++ b/reverse_engineering/api.js @@ -135,16 +135,16 @@ const getDbCollectionsData = async (data, appLogger, callback, app) => { try { const connectionInfo = data.connectionInfo; - const collectionVersion = data.collectionData.collectionVersion; const includeEmptyCollection = data.includeEmptyCollection; const cluster = await connectionHelper.connect({ connectionInfo, app }); const indexes = await indexHelper.getIndexes({ cluster, connectionInfo, logger, app }); + const selectedCollections = await clusterHelper.getSelectedCollections({ cluster, data, logger, app }); const indexesByCollectionMap = indexHelper.getIndexesByCollectionMap({ indexes }); const dbCollectionsData = []; - for (const bucketName in collectionVersion) { - for (const scopeName in collectionVersion[bucketName]) { - for (const collectionName of collectionVersion[bucketName][scopeName]) { + for (const bucketName in selectedCollections) { + for (const scopeName in selectedCollections[bucketName]) { + for (const collectionName of selectedCollections[bucketName][scopeName]) { const collectionIndexes = indexesByCollectionMap[bucketName]?.[scopeName]?.[collectionName]; const dbCollectionData = await clusterHelper.getDbCollectionData({ cluster, diff --git a/reverse_engineering/helpers/clusterHelper.js b/reverse_engineering/helpers/clusterHelper.js index 55ce552..3e8537b 100644 --- a/reverse_engineering/helpers/clusterHelper.js +++ b/reverse_engineering/helpers/clusterHelper.js @@ -476,6 +476,10 @@ const getDbCollectionData = async ({ } }; +/** + * @param {{ cluster: Cluster; logger: Logger }} param0 + * @returns {Promise} + */ const getIndexes = async ({ cluster, logger }) => { try { const query = queryHelper.getSelectIndexesQuery(); @@ -488,6 +492,36 @@ const getIndexes = async ({ cluster, logger }) => { } }; +/** + * @param { cluster: Cluster; data: object; logger: Logger; app: App } param0 + * @returns {Promise} + */ +const getSelectedCollections = async ({ cluster, data, logger, app }) => { + const collectionVersion = data.collectionData.collectionVersion; + const dataBaseNames = data.collectionData.dataBaseNames; + + if (!_.isEmpty(collectionVersion)) { + return collectionVersion; + } + + const dbCollectionData = await async.flatMap(dataBaseNames, async bucketName => { + return getDbCollectionsNames({ + connectionInfo: { + ...data, + couchbase_bucket: bucketName, + }, + cluster, + logger, + app, + }); + }); + + return dbCollectionData.reduce((result, collectionData) => { + const { dbName, scopeName, dbCollections } = collectionData; + return _.set(result, [dbName, scopeName], dbCollections); + }, {}); +}; + module.exports = { isBucketHasDefaultCollection, getAllBuckets, @@ -501,4 +535,5 @@ module.exports = { getErrorMessage, getIndexes, getPaginatedQuery, + getSelectedCollections, };