From ce793cc54f35d60b58abd6e57def480741fbc062 Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Sat, 5 Sep 2026 12:33:52 -0700 Subject: [PATCH 1/4] Build workspace agent, capability graph, and versioned cutovers --- README.md | 92 +- flake.nix | 26 + grammar/QuixosCapability.g4 | 43 +- grammar/QuixosLock.g4 | 30 +- package.json | 2 + proto/quixos/orch.proto | 1 + proto/quixos/refs.proto | 2 +- proto/quixos/runtime.proto | 1 + src/capability-language/assembly.ts | 365 +++ src/capability-language/cli.ts | 52 +- .../generated/QuixosCapability.interp | 15 +- .../generated/QuixosCapability.tokens | 386 +-- .../generated/QuixosCapabilityLexer.interp | 8 +- .../generated/QuixosCapabilityLexer.tokens | 386 +-- .../generated/QuixosCapabilityLexer.ts | 944 +++--- .../generated/QuixosCapabilityParser.ts | 2572 +++++++++-------- .../generated/QuixosCapabilityVisitor.ts | 47 +- src/capability-language/git-resolver.ts | 86 + src/capability-language/index.ts | 1 + src/capability-language/parser.ts | 563 +++- src/capability-language/resource-cli.ts | 101 + src/capability-language/workspace-cli.ts | 86 + src/capability-model/types.ts | 5 +- src/capability-model/validation.ts | 95 +- src/gen/quixos/orch_pb.ts | 7 +- src/gen/quixos/refs_pb.ts | 6 +- src/gen/quixos/runtime_pb.ts | 7 +- src/resource-lock/cli.ts | 5 +- src/resource-lock/generated/QuixosLock.interp | 19 +- src/resource-lock/generated/QuixosLock.tokens | 66 +- .../generated/QuixosLockLexer.interp | 23 +- .../generated/QuixosLockLexer.tokens | 66 +- .../generated/QuixosLockLexer.ts | 213 +- .../generated/QuixosLockParser.ts | 469 ++- .../generated/QuixosLockVisitor.ts | 21 + src/resource-lock/index.ts | 1 + src/resource-lock/loader.ts | 150 + src/resource-lock/parser.ts | 254 +- src/resource-lock/types.ts | 35 +- test/capability-assembly.test.ts | 184 ++ test/capability-cli.test.ts | 30 + test/capability-language.test.ts | 186 +- test/capability-model.test.ts | 21 +- test/fixtures/capability-model.ts | 126 +- test/fixtures/component-runtime.package.qx | 10 + .../fixtures/has-react-component.interface.qx | 7 + test/fixtures/named.interface.qx | 7 + test/fixtures/owned.interface.qx | 10 + test/fixtures/react-component.interface.qx | 5 + test/fixtures/summary.interface.qx | 5 + test/fixtures/todo.capabilities.qx | 48 +- test/fixtures/todo.package.qx | 12 + test/fixtures/web-studio.capabilities.qx | 42 +- test/resource-lock.test.ts | 183 ++ yarn.lock | 2 + 55 files changed, 5600 insertions(+), 2529 deletions(-) create mode 100644 src/capability-language/assembly.ts create mode 100644 src/capability-language/git-resolver.ts create mode 100644 src/capability-language/resource-cli.ts create mode 100644 src/capability-language/workspace-cli.ts create mode 100644 src/resource-lock/loader.ts create mode 100644 test/capability-assembly.test.ts create mode 100644 test/capability-cli.test.ts create mode 100644 test/fixtures/component-runtime.package.qx create mode 100644 test/fixtures/has-react-component.interface.qx create mode 100644 test/fixtures/named.interface.qx create mode 100644 test/fixtures/owned.interface.qx create mode 100644 test/fixtures/react-component.interface.qx create mode 100644 test/fixtures/summary.interface.qx create mode 100644 test/fixtures/todo.package.qx diff --git a/README.md b/README.md index bef74d9..fd1dddd 100644 --- a/README.md +++ b/README.md @@ -13,10 +13,29 @@ on parse-tree shapes or declaration order. ```sh nix develop -quixos-capability-compile ../quixos-instance/workspaces/todo.capabilities.qx +quixos-workspace-compile \ + --root ../quixos-instance/workspaces/todo \ + --checkout-root /tmp/quixos-resolved-resources ``` -The compiler validates exact identities, interface operation coverage, +`workspace.qx` contains workspace-local atoms, attachments, conformances, and +constructor bindings. Each imported interface has an `interface.qx` in its own +repository; each imported package similarly has a `package.qx`. Source +locations never appear in those declarations. `quixos.lock` supplies their +exact Git repositories and commits, and the workspace compiler resolves that +dependency graph recursively. + +Inside an interface or package manifest, `import interface Named;` is a true +source dependency: the repository lock must pin it, and tooling may use the +full contract for generated types. `external atom` and `external interface` +declare nominal identities which the final importing workspace must provide. +The latter is appropriate for relationship targets and other opaque +references; it deliberately does not grant the contract needed for an +interface invocation port. This distinction permits mutually referential +interface identities without creating a cycle in the Git Merkle graph. + +The compiler validates exact identities, recursive lock/source agreement, +external requirement satisfaction, interface operation coverage, attachment ownership, native state/edge providers, package receiver and dependency-port requirements, constructors, and the exact runtime closure. Generics, interface composition, declarative forwarding, automatic @@ -26,21 +45,69 @@ from v1. ## Repository locks Every workspace, interface, and package repository carries a `quixos.lock`. -It pins the exact Quixos toolchain revision plus exact Git sources for imported -interfaces and packages. The v1 Git source is deliberately only a repository -URL and full commit ID; the publisher-owned reachability tag and Nix fetch -details are derived from those values. +A resource lock is not a miniature workspace: it contains only the exact +Quixos commit that resource was authored against plus its dependency list. +It also pins exact Git sources for interfaces and packages named by that +resource's own manifest. Resource Git sources are deliberately only a +repository URL and full commit ID; the publisher-owned reachability tag and +Nix fetch details are derived from those values. + +A workspace root additionally records its Quixos selection policy and ref. +Its `commit` is the exact compatibility baseline shared by the resource graph, +not necessarily the runtime candidate. `pinned` requires the ref, baseline, +and candidate to be one commit. `track-development` lets Central resolve the +named development ref to a newer candidate while preserving the authored +baseline. `track-release` is reserved for compatibility-filtered release-line +advancement and is not implemented yet. ```sh quixos-lock-check quixos.lock -qx resource publish +quixos-resource-compile \ + --root . --kind package \ + --repository https://repos.quixos.org/example/package-example.git \ + --commit 1111111111111111111111111111111111111111 \ + --checkout-root /tmp/quixos-resource-dependencies +qx-workspace resource publish ``` -The second command runs from a jj checkout. It validates the lock, snapshots -the current working-copy commit, and pushes the immutable tag +The resource compiler validates the local manifest against the recursively +resolved locks without turning the resource into a workspace. The final +command runs from a jj checkout. It performs that same recursive compilation, +snapshots the current working-copy commit, and pushes the immutable tag `refs/tags/quixos-reachability/` without advancing an authoring bookmark. +A workspace root may split its resource pins into same-repository fragments: + +```text +quixos-lock version 1 { + quixos source { + repository "https://repos.quixos.org/quixos/quixos.git"; + policy track-development; + ref "dev/alice/main"; + commit "1111111111111111111111111111111111111111"; + } + import "locks/web-studio.lock"; +} +``` + +```text +quixos-lock fragment version 1 { + package CanvasRuntime source { + repository "https://repos.quixos.org/org-quixos-web-studio/package-canvas-runtime.git"; + commit "2222222222222222222222222222222222222222"; + } +} +``` + +Import paths are normalized, repository-root-relative paths. Absolute paths, +URLs, traversal, empty segments, directories, and symbolic links are rejected. +Fragments may import other fragments; cycles fail, shared fragments are loaded +once, and duplicate resource bindings fail across the flattened closure. +`quixos-lock-check` resolves the complete closure and reports its `sourceFiles` +alongside the flattened resources. The root Git commit content-addresses every +fragment, so fragments do not become independent repositories or identities. + ## Package descriptors Executable package metadata remains protobuf text format: @@ -59,6 +126,7 @@ their exact dependency ports. nix develop -c yarn test ``` -The suite covers parsing/diagnostics, source-order independence, ordinary call -operations, semantic validation, exact closure/tree-shaking, private and shared -attachments, package port injection, and constructors. +The suite covers parsing/diagnostics, recursive repository assembly, external +requirement validation, source-order independence, ordinary call operations, +semantic validation, exact closure/tree-shaking, private and shared +attachments, related-object interface-port injection, and constructors. diff --git a/flake.nix b/flake.nix index bdb67f2..173c303 100644 --- a/flake.nix +++ b/flake.nix @@ -15,20 +15,34 @@ src = pkgs.lib.cleanSource ./.; overrideAttrs = old: { nativeBuildInputs = (old.nativeBuildInputs or [ ]) ++ [ + pkgs.diffutils pkgs.esbuild pkgs.protobuf ]; buildPhase = '' runHook preBuild + mkdir -p "$TMPDIR/generated-before" + cp --recursive src/gen "$TMPDIR/generated-before/proto" + cp --recursive src/capability-language/generated "$TMPDIR/generated-before/capability" + cp --recursive src/resource-lock/generated "$TMPDIR/generated-before/lock" export QUIXOS_PROTO_PATH="${pkgs.protobuf}/include:$PWD/proto''${QUIXOS_PROTO_PATH:+:$QUIXOS_PROTO_PATH}" patchShebangs node_modules/.bin node_modules/@bufbuild/protoc-gen-es/bin yarn build + diff --recursive --unified "$TMPDIR/generated-before/proto" src/gen + diff --recursive --unified "$TMPDIR/generated-before/capability" src/capability-language/generated + diff --recursive --unified "$TMPDIR/generated-before/lock" src/resource-lock/generated esbuild dist/src/descriptor-check.js \ --bundle --platform=node --target=node24 --format=esm \ --outfile=quixos-descriptor-check.mjs esbuild dist/src/capability-language/cli.js \ --bundle --platform=node --target=node24 --format=esm \ --outfile=quixos-capability-compile.mjs + esbuild dist/src/capability-language/workspace-cli.js \ + --bundle --platform=node --target=node24 --format=esm \ + --outfile=quixos-workspace-compile.mjs + esbuild dist/src/capability-language/resource-cli.js \ + --bundle --platform=node --target=node24 --format=esm \ + --outfile=quixos-resource-compile.mjs esbuild dist/src/resource-lock/cli.js \ --bundle --platform=node --target=node24 --format=esm \ --outfile=quixos-lock-check.mjs @@ -60,6 +74,16 @@ EOF exec ${pkgs.nodejs_24}/bin/node "$out/libexec/quixos-protocol/quixos-capability-compile.mjs" "\$@" EOF chmod +x "$out/bin/quixos-capability-compile" + cat > "$out/bin/quixos-workspace-compile" < "$out/bin/quixos-resource-compile" < "$out/bin/quixos-lock-check" < Promise; + +export type ResolvedCapabilityResource = { + key: string; + kind: LockedResource["kind"]; + source: GitSource; + directory: string; + lock: QuixosRepositoryLock; + resource: CapabilityResource; + dependencies: ReadonlyMap; +}; + +export type CompiledWorkspaceRepository = { + workspace: WorkspaceRevision; + plan: CompiledWorkspaceRevision; + lock: QuixosRepositoryLock; + resources: ResolvedCapabilityResource[]; + directResources: ReadonlyMap; +}; + +export type CompiledCapabilityResourceRepository = { + resource: CapabilityResource; + lock: QuixosRepositoryLock; + resources: ResolvedCapabilityResource[]; + directResources: ReadonlyMap; +}; + +const sourceKey = (kind: LockedResource["kind"], source: GitSource) => + `${kind}\0${source.repository}\0${source.commit.toLowerCase()}`; + +const bindingKey = (kind: LockedResource["kind"], binding: string) => + `${kind}\0${binding}`; + +const importsKey = (entry: CapabilityResourceImport | LockedResource) => + bindingKey(entry.kind, entry.binding); + +const assertImportsMatchLock = ( + label: string, + imports: readonly CapabilityResourceImport[], + resources: readonly LockedResource[], +) => { + const authored = [...imports].map(importsKey).sort(); + const locked = [...resources].map(importsKey).sort(); + if ( + authored.length !== locked.length || + authored.some((entry, index) => entry !== locked[index]) + ) { + throw new Error( + `${label} imports do not match quixos.lock:\n` + + `authored: ${authored.join(", ") || "none"}\n` + + `locked: ${locked.join(", ") || "none"}`, + ); + } +}; + +const exactRevisions = (revisions: readonly Revision[]) => { + const seen = new Set(); + return revisions.filter((revision) => { + const key = `${revision.revisionId}\0${revision.source.repository}\0${revision.source.commit}`; + if (seen.has(key)) return false; + seen.add(key); + return true; + }); +}; + +const exactAtoms = (atoms: readonly AtomDefinition[]) => { + const seen = new Set(); + return atoms.filter((atom) => { + if (seen.has(atom.id)) return false; + seen.add(atom.id); + return true; + }); +}; + +const diagnosticsMessage = ( + label: string, + diagnostics: readonly { + fileName: string; + line: number; + column: number; + phase: string; + code: string; + message: string; + path?: string; + }[], +) => `${label} did not compile:\n${diagnostics.map((entry) => { + const location = entry.line > 0 + ? `${entry.fileName}:${entry.line}:${entry.column + 1}` + : `${entry.fileName}${entry.path ? `:${entry.path}` : ""}`; + return `${location}: ${entry.phase} ${entry.code}: ${entry.message}`; +}).join("\n")}`; + +const revisionFor = (node: ResolvedCapabilityResource) => + node.resource.revision; + +const resourceClosure = ( + roots: readonly ResolvedCapabilityResource[], +): ResolvedCapabilityResource[] => { + const result: ResolvedCapabilityResource[] = []; + const seen = new Set(); + const visit = (node: ResolvedCapabilityResource) => { + if (seen.has(node.key)) return; + seen.add(node.key); + for (const dependency of node.dependencies.values()) visit(dependency); + result.push(node); + }; + for (const root of roots) visit(root); + return result; +}; + +const environmentFor = ( + direct: readonly [LockedResource, ResolvedCapabilityResource][], + closure: readonly ResolvedCapabilityResource[], +): CapabilityImportEnvironment => ({ + interfaces: new Map(direct.flatMap(([locked, node]) => + node.resource.kind === "interface" + ? [[locked.binding, node.resource.revision] as const] + : [])), + packages: new Map(direct.flatMap(([locked, node]) => + node.resource.kind === "package" + ? [[locked.binding, node.resource.revision] as const] + : [])), + interfaceClosure: exactRevisions(closure.flatMap((node) => + node.resource.kind === "interface" ? [node.resource.revision] : [])), + packageClosure: exactRevisions(closure.flatMap((node) => + node.resource.kind === "package" ? [node.resource.revision] : [])), + externalAtoms: exactAtoms(closure.flatMap((node) => node.resource.externalAtoms)), +}); + +const createResourceGraphResolver = ( + quixosCommit: string, + resolveResource: CapabilityRepositoryResolver, +) => { + const resolved = new Map>(); + const active: string[] = []; + + const visit = async ( + locked: LockedResource, + suppliedSnapshot?: CapabilityRepositorySnapshot, + ): Promise => { + const key = sourceKey(locked.kind, locked.source); + const cached = resolved.get(key); + if (cached) { + if (active.includes(key)) { + throw new Error(`Resource dependency cycle: ${[...active, key].join(" -> ")}`); + } + return await cached; + } + const pending = (async () => { + active.push(key); + try { + const snapshot = suppliedSnapshot ?? await resolveResource(locked.source, locked.kind); + const lockResult = await loadQuixosLock(path.join(snapshot.directory, "quixos.lock")); + if (!lockResult.ok) { + throw new Error(diagnosticsMessage(`${locked.kind} ${locked.binding} lock`, lockResult.diagnostics)); + } + if (lockResult.lock.quixos.policy) { + throw new Error( + `${locked.kind} ${locked.binding} lock declares workspace Quixos policy ` + + `${lockResult.lock.quixos.policy}; resource locks may only declare their exact authored-against commit`, + ); + } + if (lockResult.lock.quixos.commit.toLowerCase() !== quixosCommit.toLowerCase()) { + throw new Error( + `${locked.kind} ${locked.binding} selects Quixos ${lockResult.lock.quixos.commit}, ` + + `but the repository graph selects ${quixosCommit}`, + ); + } + const directPairs: Array<[LockedResource, ResolvedCapabilityResource]> = []; + for (const dependency of lockResult.lock.resources) { + directPairs.push([dependency, await visit(dependency)]); + } + const dependencyClosure = resourceClosure( + directPairs.map(([, node]) => node), + ); + const environment = environmentFor(directPairs, dependencyClosure); + const manifestName = locked.kind === "interface" ? "interface.qx" : "package.qx"; + const manifestPath = path.join(snapshot.directory, manifestName); + const sourceText = await readFile(manifestPath, "utf8"); + const compiled = compileCapabilityResourceSource(sourceText, { + source: locked.source, + fileName: manifestPath, + environment, + }); + if (!compiled.ok) { + throw new Error(diagnosticsMessage(`${locked.kind} ${locked.binding}`, compiled.diagnostics)); + } + if (compiled.resource.kind !== locked.kind) { + throw new Error( + `${manifestPath} declares ${compiled.resource.kind}, not ${locked.kind}`, + ); + } + assertImportsMatchLock(manifestPath, compiled.resource.imports, lockResult.lock.resources); + return { + key, + kind: locked.kind, + source: locked.source, + directory: snapshot.directory, + lock: lockResult.lock, + resource: compiled.resource, + dependencies: new Map(directPairs.map(([dependency, node]) => [ + bindingKey(dependency.kind, dependency.binding), + node, + ])), + }; + } finally { + active.pop(); + } + })(); + resolved.set(key, pending); + return await pending; + }; + + return { + visit, + nodes: async () => await Promise.all(resolved.values()), + }; +}; + +export const compileCapabilityResourceRepository = async (options: { + rootDirectory: string; + kind: LockedResource["kind"]; + source: GitSource; + resolveResource: CapabilityRepositoryResolver; +}): Promise => { + const lockResult = await loadQuixosLock(path.join(options.rootDirectory, "quixos.lock")); + if (!lockResult.ok) { + throw new Error(diagnosticsMessage("Resource lock", lockResult.diagnostics)); + } + const resolver = createResourceGraphResolver( + lockResult.lock.quixos.commit, + options.resolveResource, + ); + const root = await resolver.visit({ + kind: options.kind, + binding: "", + source: options.source, + }, { directory: options.rootDirectory }); + return { + resource: root.resource, + lock: root.lock, + resources: await resolver.nodes(), + directResources: root.dependencies, + }; +}; + +export const compileWorkspaceRepository = async (options: { + rootDirectory: string; + resolveResource: CapabilityRepositoryResolver; + workspaceId?: string; + workspaceRevisionId?: string; + sourceRootCommit?: string; +}): Promise => { + const rootLockResult = await loadQuixosLock( + path.join(options.rootDirectory, "quixos.lock"), + ); + if (!rootLockResult.ok) { + throw new Error(diagnosticsMessage("Workspace lock", rootLockResult.diagnostics)); + } + const rootLock = rootLockResult.lock; + const resolver = createResourceGraphResolver(rootLock.quixos.commit, options.resolveResource); + + const directPairs: Array<[LockedResource, ResolvedCapabilityResource]> = []; + for (const locked of rootLock.resources) { + directPairs.push([locked, await resolver.visit(locked)]); + } + const nodes = await resolver.nodes(); + const environment = environmentFor(directPairs, nodes); + const workspacePath = path.join(options.rootDirectory, "workspace.qx"); + const workspaceSource = await readFile(workspacePath, "utf8"); + const compiled = compileCapabilitySource(workspaceSource, workspacePath, environment); + if (!compiled.ok) { + throw new Error(diagnosticsMessage("Workspace", compiled.diagnostics)); + } + assertImportsMatchLock(workspacePath, compiled.imports, rootLock.resources); + const availableInterfaceIds = new Set( + nodes.flatMap((node) => node.resource.kind === "interface" + ? [node.resource.revision.revisionId] + : []), + ); + const availableAtomIds = new Set(compiled.workspace.atoms.map((atom) => atom.id)); + for (const node of nodes) { + for (const requirement of node.resource.externalInterfaces) { + if (!availableInterfaceIds.has(requirement.revisionId)) { + throw new Error( + `${node.kind} ${node.resource.revision.displayName} requires external interface ` + + `${requirement.binding} (${requirement.revisionId}), but the workspace resource graph does not provide it`, + ); + } + } + for (const atom of node.resource.externalAtoms) { + if (!availableAtomIds.has(atom.id)) { + throw new Error( + `${node.kind} ${node.resource.revision.displayName} requires external atom ` + + `${atom.displayName} (${atom.id}), but the workspace does not define it`, + ); + } + } + } + const workspace: WorkspaceRevision = { + ...compiled.workspace, + ...(options.workspaceId + ? { workspaceId: capabilityId.workspace(options.workspaceId) } + : {}), + ...(options.workspaceRevisionId + ? { id: capabilityId.workspaceRevision(options.workspaceRevisionId) } + : {}), + ...(options.sourceRootCommit + ? { sourceRootCommit: options.sourceRootCommit } + : {}), + }; + const checked = compileWorkspaceRevision(workspace); + if (!checked.ok) { + throw new Error( + `Instantiated workspace did not compile:\n${checked.issues.map((entry) => + `${entry.path}: ${entry.message}`).join("\n")}`, + ); + } + return { + workspace, + plan: checked.plan, + lock: rootLock, + resources: nodes, + directResources: new Map(directPairs.map(([locked, node]) => [ + bindingKey(locked.kind, locked.binding), + node, + ])), + }; +}; diff --git a/src/capability-language/cli.ts b/src/capability-language/cli.ts index a4c2a06..54bb9d7 100644 --- a/src/capability-language/cli.ts +++ b/src/capability-language/cli.ts @@ -2,21 +2,23 @@ import { readFile } from "node:fs/promises"; import process from "node:process"; -import { compileCapabilitySource } from "./parser.js"; +import { compileCapabilityResourceSource, compileCapabilitySource } from "./parser.js"; import { capabilityId } from "../capability-model/types.js"; import { compileWorkspaceRevision } from "../capability-model/validation.js"; -const usage = `usage: quixos-capability-compile [--check] +const usage = `usage: quixos-capability-compile [--check] [--resource] [--workspace-id ID] [--workspace-revision-id ID] [--source-root-commit GIT_REV] -Parses, lowers, and validates a Quixos capability workspace. By default the -checked semantic workspace revision is written as JSON. --check emits no JSON. +Parses, lowers, and validates a Quixos capability workspace. --resource instead +expects one standalone interface or package document. By default the checked +semantic workspace revision or resource is written as JSON. --check emits no JSON. The identity overrides instantiate a checked built-in/template assembly for one real workspace; both must be supplied together.`; const parseArgs = (args: string[]) => { let checkOnly = false; + let resource = false; let workspaceId: string | undefined; let workspaceRevisionId: string | undefined; let sourceRootCommit: string | undefined; @@ -24,6 +26,7 @@ const parseArgs = (args: string[]) => { for (let index = 0; index < args.length; index += 1) { const argument = args[index]!; if (argument === "--check") checkOnly = true; + else if (argument === "--resource") resource = true; else if (argument === "--workspace-id") workspaceId = args[++index]; else if (argument === "--workspace-revision-id") workspaceRevisionId = args[++index]; else if (argument === "--source-root-commit") sourceRootCommit = args[++index]; @@ -31,10 +34,14 @@ const parseArgs = (args: string[]) => { else if (argument.startsWith("-")) throw new Error(usage); else positional.push(argument); } - if (positional.length !== 1 || Boolean(workspaceId) !== Boolean(workspaceRevisionId)) { + if ( + positional.length !== 1 + || Boolean(workspaceId) !== Boolean(workspaceRevisionId) + || (resource && Boolean(workspaceId || workspaceRevisionId || sourceRootCommit)) + ) { throw new Error(usage); } - return { checkOnly, workspaceId, workspaceRevisionId, sourceRootCommit, fileName: positional[0]! }; + return { checkOnly, resource, workspaceId, workspaceRevisionId, sourceRootCommit, fileName: positional[0]! }; }; const main = async () => { @@ -45,6 +52,7 @@ const main = async () => { } const { checkOnly, + resource, workspaceId, workspaceRevisionId, sourceRootCommit, @@ -59,9 +67,16 @@ const main = async () => { process.stdin.on("error", reject); }) : await readFile(fileName, "utf8"); - const result = compileCapabilitySource(source, fileName); - if (!result.ok) { - for (const diagnostic of result.diagnostics) { + const reportDiagnostics = (diagnostics: readonly { + fileName: string; + line: number; + column: number; + phase: string; + code: string; + message: string; + path?: string; + }[]) => { + for (const diagnostic of diagnostics) { const location = diagnostic.line ? `${diagnostic.fileName}:${diagnostic.line}:${diagnostic.column + 1}` : `${diagnostic.fileName}${diagnostic.path ? `:${diagnostic.path}` : ""}`; @@ -70,6 +85,25 @@ const main = async () => { ); } process.exitCode = 1; + }; + if (resource) { + const result = compileCapabilityResourceSource(source, { + source: { + repository: "https://compiler.invalid/resource.git", + commit: "0000000000000000000000000000000000000000", + }, + fileName, + }); + if (!result.ok) { + reportDiagnostics(result.diagnostics); + return; + } + if (!checkOnly) process.stdout.write(`${JSON.stringify(result.resource, null, 2)}\n`); + return; + } + const result = compileCapabilitySource(source, fileName); + if (!result.ok) { + reportDiagnostics(result.diagnostics); return; } const workspace = workspaceId && workspaceRevisionId diff --git a/src/capability-language/generated/QuixosCapability.interp b/src/capability-language/generated/QuixosCapability.interp index 3e3c730..445a49b 100644 --- a/src/capability-language/generated/QuixosCapability.interp +++ b/src/capability-language/generated/QuixosCapability.interp @@ -1,6 +1,8 @@ token literal names: null 'workspace' +'import' +'external' 'atom' 'interface' 'interfaces' @@ -104,6 +106,8 @@ null token symbolic names: null WORKSPACE +IMPORT +EXTERNAL ATOM INTERFACE INTERFACES @@ -208,9 +212,12 @@ rule names: document workspaceDecl workspaceItem +resourceImportDecl +externalAtomDecl +externalInterfaceDecl +resourcePreamble atomDecl -interfaceDecl -sourceBlock +interfaceResourceDecl interfaceMember operationMember valueMember @@ -218,7 +225,7 @@ valueMemberOperation relationshipMember relationshipOperation targetConstraint -packageDecl +packageResourceDecl packageExport packageOperationExport packageFunctionExport @@ -261,4 +268,4 @@ stringLiteral atn: -[4, 1, 100, 701, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 120, 8, 1, 10, 1, 12, 1, 123, 9, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 3, 2, 133, 8, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 3, 3, 141, 8, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 5, 4, 154, 8, 4, 10, 4, 12, 4, 157, 9, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 3, 6, 174, 8, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 5, 8, 199, 8, 8, 10, 8, 12, 8, 202, 9, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 225, 8, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 3, 10, 235, 8, 10, 1, 10, 1, 10, 5, 10, 239, 8, 10, 10, 10, 12, 10, 242, 9, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 3, 11, 270, 8, 11, 1, 12, 1, 12, 1, 12, 1, 12, 3, 12, 276, 8, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 5, 13, 287, 8, 13, 10, 13, 12, 13, 290, 9, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 3, 14, 297, 8, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 310, 8, 15, 1, 15, 1, 15, 1, 15, 3, 15, 315, 8, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 3, 16, 328, 8, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 3, 17, 341, 8, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 356, 8, 20, 1, 20, 3, 20, 359, 8, 20, 1, 21, 1, 21, 1, 21, 5, 21, 364, 8, 21, 10, 21, 12, 21, 367, 9, 21, 1, 22, 1, 22, 1, 22, 5, 22, 372, 8, 22, 10, 22, 12, 22, 375, 9, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 414, 8, 23, 1, 24, 1, 24, 1, 24, 1, 24, 5, 24, 420, 8, 24, 10, 24, 12, 24, 423, 9, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 3, 27, 434, 8, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 3, 28, 448, 8, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 3, 29, 458, 8, 29, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 3, 31, 476, 8, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 5, 32, 486, 8, 32, 10, 32, 12, 32, 489, 9, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 3, 33, 497, 8, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 3, 37, 534, 8, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 3, 38, 553, 8, 38, 3, 38, 555, 8, 38, 1, 39, 1, 39, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 5, 41, 564, 8, 41, 10, 41, 12, 41, 567, 9, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 3, 42, 581, 8, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 3, 42, 597, 8, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 3, 42, 613, 8, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 3, 43, 622, 8, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 3, 44, 651, 8, 44, 1, 45, 1, 45, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 3, 47, 665, 8, 47, 1, 48, 1, 48, 1, 48, 1, 48, 5, 48, 671, 8, 48, 10, 48, 12, 48, 674, 9, 48, 3, 48, 676, 8, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 5, 50, 688, 8, 50, 10, 50, 12, 50, 691, 9, 50, 3, 50, 693, 8, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 0, 0, 53, 0, 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, 0, 7, 1, 0, 51, 55, 2, 0, 46, 50, 52, 53, 2, 0, 46, 47, 52, 53, 2, 0, 48, 50, 52, 53, 1, 0, 70, 77, 1, 0, 58, 61, 2, 0, 30, 30, 96, 96, 727, 0, 106, 1, 0, 0, 0, 2, 109, 1, 0, 0, 0, 4, 132, 1, 0, 0, 0, 6, 134, 1, 0, 0, 0, 8, 144, 1, 0, 0, 0, 10, 160, 1, 0, 0, 0, 12, 173, 1, 0, 0, 0, 14, 175, 1, 0, 0, 0, 16, 190, 1, 0, 0, 0, 18, 224, 1, 0, 0, 0, 20, 226, 1, 0, 0, 0, 22, 269, 1, 0, 0, 0, 24, 275, 1, 0, 0, 0, 26, 277, 1, 0, 0, 0, 28, 296, 1, 0, 0, 0, 30, 298, 1, 0, 0, 0, 32, 318, 1, 0, 0, 0, 34, 331, 1, 0, 0, 0, 36, 344, 1, 0, 0, 0, 38, 347, 1, 0, 0, 0, 40, 358, 1, 0, 0, 0, 42, 360, 1, 0, 0, 0, 44, 368, 1, 0, 0, 0, 46, 413, 1, 0, 0, 0, 48, 415, 1, 0, 0, 0, 50, 426, 1, 0, 0, 0, 52, 428, 1, 0, 0, 0, 54, 433, 1, 0, 0, 0, 56, 435, 1, 0, 0, 0, 58, 457, 1, 0, 0, 0, 60, 459, 1, 0, 0, 0, 62, 468, 1, 0, 0, 0, 64, 479, 1, 0, 0, 0, 66, 496, 1, 0, 0, 0, 68, 498, 1, 0, 0, 0, 70, 512, 1, 0, 0, 0, 72, 518, 1, 0, 0, 0, 74, 533, 1, 0, 0, 0, 76, 554, 1, 0, 0, 0, 78, 556, 1, 0, 0, 0, 80, 558, 1, 0, 0, 0, 82, 560, 1, 0, 0, 0, 84, 612, 1, 0, 0, 0, 86, 614, 1, 0, 0, 0, 88, 650, 1, 0, 0, 0, 90, 652, 1, 0, 0, 0, 92, 654, 1, 0, 0, 0, 94, 664, 1, 0, 0, 0, 96, 666, 1, 0, 0, 0, 98, 679, 1, 0, 0, 0, 100, 683, 1, 0, 0, 0, 102, 696, 1, 0, 0, 0, 104, 698, 1, 0, 0, 0, 106, 107, 3, 2, 1, 0, 107, 108, 5, 0, 0, 1, 108, 1, 1, 0, 0, 0, 109, 110, 5, 1, 0, 0, 110, 111, 3, 102, 51, 0, 111, 112, 5, 34, 0, 0, 112, 113, 3, 104, 52, 0, 113, 114, 5, 33, 0, 0, 114, 115, 3, 104, 52, 0, 115, 116, 5, 32, 0, 0, 116, 117, 3, 104, 52, 0, 117, 121, 5, 86, 0, 0, 118, 120, 3, 4, 2, 0, 119, 118, 1, 0, 0, 0, 120, 123, 1, 0, 0, 0, 121, 119, 1, 0, 0, 0, 121, 122, 1, 0, 0, 0, 122, 124, 1, 0, 0, 0, 123, 121, 1, 0, 0, 0, 124, 125, 5, 87, 0, 0, 125, 3, 1, 0, 0, 0, 126, 133, 3, 6, 3, 0, 127, 133, 3, 8, 4, 0, 128, 133, 3, 26, 13, 0, 129, 133, 3, 52, 26, 0, 130, 133, 3, 64, 32, 0, 131, 133, 3, 86, 43, 0, 132, 126, 1, 0, 0, 0, 132, 127, 1, 0, 0, 0, 132, 128, 1, 0, 0, 0, 132, 129, 1, 0, 0, 0, 132, 130, 1, 0, 0, 0, 132, 131, 1, 0, 0, 0, 133, 5, 1, 0, 0, 0, 134, 135, 5, 2, 0, 0, 135, 136, 3, 102, 51, 0, 136, 137, 5, 34, 0, 0, 137, 140, 3, 104, 52, 0, 138, 139, 5, 35, 0, 0, 139, 141, 3, 104, 52, 0, 140, 138, 1, 0, 0, 0, 140, 141, 1, 0, 0, 0, 141, 142, 1, 0, 0, 0, 142, 143, 5, 83, 0, 0, 143, 7, 1, 0, 0, 0, 144, 145, 5, 3, 0, 0, 145, 146, 3, 102, 51, 0, 146, 147, 5, 34, 0, 0, 147, 148, 3, 104, 52, 0, 148, 149, 5, 33, 0, 0, 149, 150, 3, 104, 52, 0, 150, 151, 3, 10, 5, 0, 151, 155, 5, 86, 0, 0, 152, 154, 3, 12, 6, 0, 153, 152, 1, 0, 0, 0, 154, 157, 1, 0, 0, 0, 155, 153, 1, 0, 0, 0, 155, 156, 1, 0, 0, 0, 156, 158, 1, 0, 0, 0, 157, 155, 1, 0, 0, 0, 158, 159, 5, 87, 0, 0, 159, 9, 1, 0, 0, 0, 160, 161, 5, 30, 0, 0, 161, 162, 5, 86, 0, 0, 162, 163, 5, 31, 0, 0, 163, 164, 3, 104, 52, 0, 164, 165, 5, 83, 0, 0, 165, 166, 5, 32, 0, 0, 166, 167, 3, 104, 52, 0, 167, 168, 5, 83, 0, 0, 168, 169, 5, 87, 0, 0, 169, 11, 1, 0, 0, 0, 170, 174, 3, 16, 8, 0, 171, 174, 3, 20, 10, 0, 172, 174, 3, 14, 7, 0, 173, 170, 1, 0, 0, 0, 173, 171, 1, 0, 0, 0, 173, 172, 1, 0, 0, 0, 174, 13, 1, 0, 0, 0, 175, 176, 5, 8, 0, 0, 176, 177, 3, 102, 51, 0, 177, 178, 5, 34, 0, 0, 178, 179, 3, 104, 52, 0, 179, 180, 5, 82, 0, 0, 180, 181, 3, 88, 44, 0, 181, 182, 5, 81, 0, 0, 182, 183, 3, 88, 44, 0, 183, 184, 5, 86, 0, 0, 184, 185, 5, 51, 0, 0, 185, 186, 5, 34, 0, 0, 186, 187, 3, 104, 52, 0, 187, 188, 5, 83, 0, 0, 188, 189, 5, 87, 0, 0, 189, 15, 1, 0, 0, 0, 190, 191, 5, 6, 0, 0, 191, 192, 3, 102, 51, 0, 192, 193, 5, 34, 0, 0, 193, 194, 3, 104, 52, 0, 194, 195, 5, 82, 0, 0, 195, 196, 3, 88, 44, 0, 196, 200, 5, 86, 0, 0, 197, 199, 3, 18, 9, 0, 198, 197, 1, 0, 0, 0, 199, 202, 1, 0, 0, 0, 200, 198, 1, 0, 0, 0, 200, 201, 1, 0, 0, 0, 201, 203, 1, 0, 0, 0, 202, 200, 1, 0, 0, 0, 203, 204, 5, 87, 0, 0, 204, 17, 1, 0, 0, 0, 205, 206, 5, 41, 0, 0, 206, 207, 5, 34, 0, 0, 207, 208, 3, 104, 52, 0, 208, 209, 5, 83, 0, 0, 209, 225, 1, 0, 0, 0, 210, 211, 5, 42, 0, 0, 211, 212, 5, 34, 0, 0, 212, 213, 3, 104, 52, 0, 213, 214, 5, 83, 0, 0, 214, 225, 1, 0, 0, 0, 215, 216, 5, 43, 0, 0, 216, 217, 5, 44, 0, 0, 217, 218, 5, 34, 0, 0, 218, 219, 3, 104, 52, 0, 219, 220, 5, 45, 0, 0, 220, 221, 5, 34, 0, 0, 221, 222, 3, 104, 52, 0, 222, 223, 5, 83, 0, 0, 223, 225, 1, 0, 0, 0, 224, 205, 1, 0, 0, 0, 224, 210, 1, 0, 0, 0, 224, 215, 1, 0, 0, 0, 225, 19, 1, 0, 0, 0, 226, 227, 5, 7, 0, 0, 227, 228, 3, 102, 51, 0, 228, 229, 5, 34, 0, 0, 229, 230, 3, 104, 52, 0, 230, 231, 5, 82, 0, 0, 231, 232, 3, 92, 46, 0, 232, 234, 3, 24, 12, 0, 233, 235, 5, 62, 0, 0, 234, 233, 1, 0, 0, 0, 234, 235, 1, 0, 0, 0, 235, 236, 1, 0, 0, 0, 236, 240, 5, 86, 0, 0, 237, 239, 3, 22, 11, 0, 238, 237, 1, 0, 0, 0, 239, 242, 1, 0, 0, 0, 240, 238, 1, 0, 0, 0, 240, 241, 1, 0, 0, 0, 241, 243, 1, 0, 0, 0, 242, 240, 1, 0, 0, 0, 243, 244, 5, 87, 0, 0, 244, 21, 1, 0, 0, 0, 245, 246, 5, 48, 0, 0, 246, 247, 5, 34, 0, 0, 247, 248, 3, 104, 52, 0, 248, 249, 5, 83, 0, 0, 249, 270, 1, 0, 0, 0, 250, 251, 5, 49, 0, 0, 251, 252, 5, 34, 0, 0, 252, 253, 3, 104, 52, 0, 253, 254, 5, 83, 0, 0, 254, 270, 1, 0, 0, 0, 255, 256, 5, 50, 0, 0, 256, 257, 5, 34, 0, 0, 257, 258, 3, 104, 52, 0, 258, 259, 5, 83, 0, 0, 259, 270, 1, 0, 0, 0, 260, 261, 5, 43, 0, 0, 261, 262, 5, 44, 0, 0, 262, 263, 5, 34, 0, 0, 263, 264, 3, 104, 52, 0, 264, 265, 5, 45, 0, 0, 265, 266, 5, 34, 0, 0, 266, 267, 3, 104, 52, 0, 267, 268, 5, 83, 0, 0, 268, 270, 1, 0, 0, 0, 269, 245, 1, 0, 0, 0, 269, 250, 1, 0, 0, 0, 269, 255, 1, 0, 0, 0, 269, 260, 1, 0, 0, 0, 270, 23, 1, 0, 0, 0, 271, 272, 5, 2, 0, 0, 272, 276, 3, 102, 51, 0, 273, 274, 5, 3, 0, 0, 274, 276, 3, 102, 51, 0, 275, 271, 1, 0, 0, 0, 275, 273, 1, 0, 0, 0, 276, 25, 1, 0, 0, 0, 277, 278, 5, 5, 0, 0, 278, 279, 3, 102, 51, 0, 279, 280, 5, 34, 0, 0, 280, 281, 3, 104, 52, 0, 281, 282, 5, 33, 0, 0, 282, 283, 3, 104, 52, 0, 283, 284, 3, 10, 5, 0, 284, 288, 5, 86, 0, 0, 285, 287, 3, 28, 14, 0, 286, 285, 1, 0, 0, 0, 287, 290, 1, 0, 0, 0, 288, 286, 1, 0, 0, 0, 288, 289, 1, 0, 0, 0, 289, 291, 1, 0, 0, 0, 290, 288, 1, 0, 0, 0, 291, 292, 5, 87, 0, 0, 292, 27, 1, 0, 0, 0, 293, 297, 3, 30, 15, 0, 294, 297, 3, 32, 16, 0, 295, 297, 3, 34, 17, 0, 296, 293, 1, 0, 0, 0, 296, 294, 1, 0, 0, 0, 296, 295, 1, 0, 0, 0, 297, 29, 1, 0, 0, 0, 298, 299, 5, 8, 0, 0, 299, 300, 3, 102, 51, 0, 300, 301, 5, 34, 0, 0, 301, 302, 3, 104, 52, 0, 302, 303, 5, 82, 0, 0, 303, 304, 3, 88, 44, 0, 304, 305, 5, 81, 0, 0, 305, 306, 3, 88, 44, 0, 306, 307, 5, 36, 0, 0, 307, 309, 3, 38, 19, 0, 308, 310, 3, 36, 18, 0, 309, 308, 1, 0, 0, 0, 309, 310, 1, 0, 0, 0, 310, 311, 1, 0, 0, 0, 311, 312, 5, 38, 0, 0, 312, 314, 3, 40, 20, 0, 313, 315, 3, 44, 22, 0, 314, 313, 1, 0, 0, 0, 314, 315, 1, 0, 0, 0, 315, 316, 1, 0, 0, 0, 316, 317, 5, 83, 0, 0, 317, 31, 1, 0, 0, 0, 318, 319, 5, 9, 0, 0, 319, 320, 3, 102, 51, 0, 320, 321, 5, 34, 0, 0, 321, 322, 3, 104, 52, 0, 322, 323, 5, 82, 0, 0, 323, 324, 3, 88, 44, 0, 324, 325, 5, 81, 0, 0, 325, 327, 3, 88, 44, 0, 326, 328, 3, 44, 22, 0, 327, 326, 1, 0, 0, 0, 327, 328, 1, 0, 0, 0, 328, 329, 1, 0, 0, 0, 329, 330, 5, 83, 0, 0, 330, 33, 1, 0, 0, 0, 331, 332, 5, 10, 0, 0, 332, 333, 3, 102, 51, 0, 333, 334, 5, 34, 0, 0, 334, 335, 3, 104, 52, 0, 335, 336, 5, 11, 0, 0, 336, 337, 3, 102, 51, 0, 337, 338, 5, 82, 0, 0, 338, 340, 3, 88, 44, 0, 339, 341, 3, 44, 22, 0, 340, 339, 1, 0, 0, 0, 340, 341, 1, 0, 0, 0, 341, 342, 1, 0, 0, 0, 342, 343, 5, 83, 0, 0, 343, 35, 1, 0, 0, 0, 344, 345, 5, 37, 0, 0, 345, 346, 3, 88, 44, 0, 346, 37, 1, 0, 0, 0, 347, 348, 7, 0, 0, 0, 348, 39, 1, 0, 0, 0, 349, 359, 5, 40, 0, 0, 350, 351, 5, 2, 0, 0, 351, 359, 3, 102, 51, 0, 352, 353, 5, 4, 0, 0, 353, 355, 5, 88, 0, 0, 354, 356, 3, 42, 21, 0, 355, 354, 1, 0, 0, 0, 355, 356, 1, 0, 0, 0, 356, 357, 1, 0, 0, 0, 357, 359, 5, 89, 0, 0, 358, 349, 1, 0, 0, 0, 358, 350, 1, 0, 0, 0, 358, 352, 1, 0, 0, 0, 359, 41, 1, 0, 0, 0, 360, 365, 3, 102, 51, 0, 361, 362, 5, 84, 0, 0, 362, 364, 3, 102, 51, 0, 363, 361, 1, 0, 0, 0, 364, 367, 1, 0, 0, 0, 365, 363, 1, 0, 0, 0, 365, 366, 1, 0, 0, 0, 366, 43, 1, 0, 0, 0, 367, 365, 1, 0, 0, 0, 368, 369, 5, 39, 0, 0, 369, 373, 5, 86, 0, 0, 370, 372, 3, 46, 23, 0, 371, 370, 1, 0, 0, 0, 372, 375, 1, 0, 0, 0, 373, 371, 1, 0, 0, 0, 373, 374, 1, 0, 0, 0, 374, 376, 1, 0, 0, 0, 375, 373, 1, 0, 0, 0, 376, 377, 5, 87, 0, 0, 377, 45, 1, 0, 0, 0, 378, 379, 5, 18, 0, 0, 379, 380, 3, 102, 51, 0, 380, 381, 5, 34, 0, 0, 381, 382, 3, 104, 52, 0, 382, 383, 5, 82, 0, 0, 383, 384, 3, 88, 44, 0, 384, 385, 3, 48, 24, 0, 385, 386, 5, 83, 0, 0, 386, 414, 1, 0, 0, 0, 387, 388, 5, 19, 0, 0, 388, 389, 3, 102, 51, 0, 389, 390, 5, 34, 0, 0, 390, 391, 3, 104, 52, 0, 391, 392, 5, 82, 0, 0, 392, 393, 3, 92, 46, 0, 393, 394, 3, 24, 12, 0, 394, 395, 3, 48, 24, 0, 395, 396, 5, 83, 0, 0, 396, 414, 1, 0, 0, 0, 397, 398, 5, 3, 0, 0, 398, 399, 3, 102, 51, 0, 399, 400, 5, 34, 0, 0, 400, 401, 3, 104, 52, 0, 401, 402, 5, 82, 0, 0, 402, 403, 3, 102, 51, 0, 403, 404, 5, 83, 0, 0, 404, 414, 1, 0, 0, 0, 405, 406, 5, 10, 0, 0, 406, 407, 3, 102, 51, 0, 407, 408, 5, 34, 0, 0, 408, 409, 3, 104, 52, 0, 409, 410, 5, 82, 0, 0, 410, 411, 3, 102, 51, 0, 411, 412, 5, 83, 0, 0, 412, 414, 1, 0, 0, 0, 413, 378, 1, 0, 0, 0, 413, 387, 1, 0, 0, 0, 413, 397, 1, 0, 0, 0, 413, 405, 1, 0, 0, 0, 414, 47, 1, 0, 0, 0, 415, 416, 5, 88, 0, 0, 416, 421, 3, 50, 25, 0, 417, 418, 5, 84, 0, 0, 418, 420, 3, 50, 25, 0, 419, 417, 1, 0, 0, 0, 420, 423, 1, 0, 0, 0, 421, 419, 1, 0, 0, 0, 421, 422, 1, 0, 0, 0, 422, 424, 1, 0, 0, 0, 423, 421, 1, 0, 0, 0, 424, 425, 5, 89, 0, 0, 425, 49, 1, 0, 0, 0, 426, 427, 7, 1, 0, 0, 427, 51, 1, 0, 0, 0, 428, 429, 5, 17, 0, 0, 429, 430, 3, 54, 27, 0, 430, 53, 1, 0, 0, 0, 431, 434, 3, 56, 28, 0, 432, 434, 3, 60, 30, 0, 433, 431, 1, 0, 0, 0, 433, 432, 1, 0, 0, 0, 434, 55, 1, 0, 0, 0, 435, 436, 5, 18, 0, 0, 436, 437, 3, 102, 51, 0, 437, 438, 5, 34, 0, 0, 438, 439, 3, 104, 52, 0, 439, 440, 5, 27, 0, 0, 440, 441, 3, 102, 51, 0, 441, 442, 5, 82, 0, 0, 442, 443, 3, 88, 44, 0, 443, 444, 5, 28, 0, 0, 444, 447, 3, 58, 29, 0, 445, 446, 5, 29, 0, 0, 446, 448, 3, 94, 47, 0, 447, 445, 1, 0, 0, 0, 447, 448, 1, 0, 0, 0, 448, 449, 1, 0, 0, 0, 449, 450, 5, 83, 0, 0, 450, 57, 1, 0, 0, 0, 451, 458, 5, 56, 0, 0, 452, 453, 5, 57, 0, 0, 453, 454, 5, 90, 0, 0, 454, 455, 3, 88, 44, 0, 455, 456, 5, 91, 0, 0, 456, 458, 1, 0, 0, 0, 457, 451, 1, 0, 0, 0, 457, 452, 1, 0, 0, 0, 458, 59, 1, 0, 0, 0, 459, 460, 5, 19, 0, 0, 460, 461, 3, 102, 51, 0, 461, 462, 5, 34, 0, 0, 462, 463, 3, 104, 52, 0, 463, 464, 5, 86, 0, 0, 464, 465, 3, 62, 31, 0, 465, 466, 3, 62, 31, 0, 466, 467, 5, 87, 0, 0, 467, 61, 1, 0, 0, 0, 468, 469, 3, 24, 12, 0, 469, 470, 5, 20, 0, 0, 470, 471, 3, 102, 51, 0, 471, 472, 5, 34, 0, 0, 472, 473, 3, 104, 52, 0, 473, 475, 3, 92, 46, 0, 474, 476, 5, 62, 0, 0, 475, 474, 1, 0, 0, 0, 475, 476, 1, 0, 0, 0, 476, 477, 1, 0, 0, 0, 477, 478, 5, 83, 0, 0, 478, 63, 1, 0, 0, 0, 479, 480, 5, 12, 0, 0, 480, 481, 3, 102, 51, 0, 481, 482, 5, 13, 0, 0, 482, 483, 3, 102, 51, 0, 483, 487, 5, 86, 0, 0, 484, 486, 3, 66, 33, 0, 485, 484, 1, 0, 0, 0, 486, 489, 1, 0, 0, 0, 487, 485, 1, 0, 0, 0, 487, 488, 1, 0, 0, 0, 488, 490, 1, 0, 0, 0, 489, 487, 1, 0, 0, 0, 490, 491, 5, 87, 0, 0, 491, 65, 1, 0, 0, 0, 492, 493, 5, 16, 0, 0, 493, 497, 3, 54, 27, 0, 494, 497, 3, 70, 35, 0, 495, 497, 3, 68, 34, 0, 496, 492, 1, 0, 0, 0, 496, 494, 1, 0, 0, 0, 496, 495, 1, 0, 0, 0, 497, 67, 1, 0, 0, 0, 498, 499, 5, 24, 0, 0, 499, 500, 3, 102, 51, 0, 500, 501, 5, 25, 0, 0, 501, 502, 5, 26, 0, 0, 502, 503, 5, 22, 0, 0, 503, 504, 5, 10, 0, 0, 504, 505, 3, 102, 51, 0, 505, 506, 5, 23, 0, 0, 506, 507, 5, 19, 0, 0, 507, 508, 3, 102, 51, 0, 508, 509, 5, 85, 0, 0, 509, 510, 3, 102, 51, 0, 510, 511, 5, 83, 0, 0, 511, 69, 1, 0, 0, 0, 512, 513, 5, 14, 0, 0, 513, 514, 3, 72, 36, 0, 514, 515, 5, 15, 0, 0, 515, 516, 3, 76, 38, 0, 516, 517, 5, 83, 0, 0, 517, 71, 1, 0, 0, 0, 518, 519, 3, 102, 51, 0, 519, 520, 5, 85, 0, 0, 520, 521, 3, 74, 37, 0, 521, 73, 1, 0, 0, 0, 522, 534, 3, 102, 51, 0, 523, 534, 5, 51, 0, 0, 524, 534, 5, 41, 0, 0, 525, 534, 5, 42, 0, 0, 526, 534, 5, 48, 0, 0, 527, 534, 5, 49, 0, 0, 528, 534, 5, 50, 0, 0, 529, 534, 5, 52, 0, 0, 530, 534, 5, 53, 0, 0, 531, 534, 5, 54, 0, 0, 532, 534, 5, 55, 0, 0, 533, 522, 1, 0, 0, 0, 533, 523, 1, 0, 0, 0, 533, 524, 1, 0, 0, 0, 533, 525, 1, 0, 0, 0, 533, 526, 1, 0, 0, 0, 533, 527, 1, 0, 0, 0, 533, 528, 1, 0, 0, 0, 533, 529, 1, 0, 0, 0, 533, 530, 1, 0, 0, 0, 533, 531, 1, 0, 0, 0, 533, 532, 1, 0, 0, 0, 534, 75, 1, 0, 0, 0, 535, 536, 5, 18, 0, 0, 536, 537, 3, 102, 51, 0, 537, 538, 5, 85, 0, 0, 538, 539, 3, 78, 39, 0, 539, 555, 1, 0, 0, 0, 540, 541, 5, 19, 0, 0, 541, 542, 3, 102, 51, 0, 542, 543, 5, 85, 0, 0, 543, 544, 3, 102, 51, 0, 544, 545, 5, 85, 0, 0, 545, 546, 3, 80, 40, 0, 546, 555, 1, 0, 0, 0, 547, 548, 5, 5, 0, 0, 548, 549, 3, 102, 51, 0, 549, 550, 5, 85, 0, 0, 550, 552, 3, 102, 51, 0, 551, 553, 3, 82, 41, 0, 552, 551, 1, 0, 0, 0, 552, 553, 1, 0, 0, 0, 553, 555, 1, 0, 0, 0, 554, 535, 1, 0, 0, 0, 554, 540, 1, 0, 0, 0, 554, 547, 1, 0, 0, 0, 555, 77, 1, 0, 0, 0, 556, 557, 7, 2, 0, 0, 557, 79, 1, 0, 0, 0, 558, 559, 7, 3, 0, 0, 559, 81, 1, 0, 0, 0, 560, 561, 5, 21, 0, 0, 561, 565, 5, 86, 0, 0, 562, 564, 3, 84, 42, 0, 563, 562, 1, 0, 0, 0, 564, 567, 1, 0, 0, 0, 565, 563, 1, 0, 0, 0, 565, 566, 1, 0, 0, 0, 566, 568, 1, 0, 0, 0, 567, 565, 1, 0, 0, 0, 568, 569, 5, 87, 0, 0, 569, 83, 1, 0, 0, 0, 570, 571, 3, 102, 51, 0, 571, 572, 5, 15, 0, 0, 572, 573, 5, 18, 0, 0, 573, 580, 3, 102, 51, 0, 574, 575, 5, 23, 0, 0, 575, 576, 5, 19, 0, 0, 576, 577, 3, 102, 51, 0, 577, 578, 5, 85, 0, 0, 578, 579, 3, 102, 51, 0, 579, 581, 1, 0, 0, 0, 580, 574, 1, 0, 0, 0, 580, 581, 1, 0, 0, 0, 581, 582, 1, 0, 0, 0, 582, 583, 5, 83, 0, 0, 583, 613, 1, 0, 0, 0, 584, 585, 3, 102, 51, 0, 585, 586, 5, 15, 0, 0, 586, 587, 5, 19, 0, 0, 587, 588, 3, 102, 51, 0, 588, 589, 5, 85, 0, 0, 589, 596, 3, 102, 51, 0, 590, 591, 5, 23, 0, 0, 591, 592, 5, 19, 0, 0, 592, 593, 3, 102, 51, 0, 593, 594, 5, 85, 0, 0, 594, 595, 3, 102, 51, 0, 595, 597, 1, 0, 0, 0, 596, 590, 1, 0, 0, 0, 596, 597, 1, 0, 0, 0, 597, 598, 1, 0, 0, 0, 598, 599, 5, 83, 0, 0, 599, 613, 1, 0, 0, 0, 600, 601, 3, 102, 51, 0, 601, 602, 5, 15, 0, 0, 602, 603, 5, 3, 0, 0, 603, 604, 3, 102, 51, 0, 604, 605, 5, 83, 0, 0, 605, 613, 1, 0, 0, 0, 606, 607, 3, 102, 51, 0, 607, 608, 5, 15, 0, 0, 608, 609, 5, 10, 0, 0, 609, 610, 3, 102, 51, 0, 610, 611, 5, 83, 0, 0, 611, 613, 1, 0, 0, 0, 612, 570, 1, 0, 0, 0, 612, 584, 1, 0, 0, 0, 612, 600, 1, 0, 0, 0, 612, 606, 1, 0, 0, 0, 613, 85, 1, 0, 0, 0, 614, 615, 5, 10, 0, 0, 615, 616, 3, 102, 51, 0, 616, 617, 5, 15, 0, 0, 617, 618, 3, 102, 51, 0, 618, 619, 5, 85, 0, 0, 619, 621, 3, 102, 51, 0, 620, 622, 3, 82, 41, 0, 621, 620, 1, 0, 0, 0, 621, 622, 1, 0, 0, 0, 622, 623, 1, 0, 0, 0, 623, 624, 5, 83, 0, 0, 624, 87, 1, 0, 0, 0, 625, 651, 3, 90, 45, 0, 626, 651, 5, 63, 0, 0, 627, 651, 5, 64, 0, 0, 628, 629, 5, 65, 0, 0, 629, 651, 3, 104, 52, 0, 630, 631, 5, 66, 0, 0, 631, 632, 5, 92, 0, 0, 632, 633, 3, 102, 51, 0, 633, 634, 5, 93, 0, 0, 634, 651, 1, 0, 0, 0, 635, 636, 5, 67, 0, 0, 636, 637, 5, 92, 0, 0, 637, 638, 3, 102, 51, 0, 638, 639, 5, 93, 0, 0, 639, 651, 1, 0, 0, 0, 640, 641, 5, 68, 0, 0, 641, 642, 5, 92, 0, 0, 642, 643, 3, 88, 44, 0, 643, 644, 5, 93, 0, 0, 644, 651, 1, 0, 0, 0, 645, 646, 5, 69, 0, 0, 646, 647, 5, 92, 0, 0, 647, 648, 3, 88, 44, 0, 648, 649, 5, 93, 0, 0, 649, 651, 1, 0, 0, 0, 650, 625, 1, 0, 0, 0, 650, 626, 1, 0, 0, 0, 650, 627, 1, 0, 0, 0, 650, 628, 1, 0, 0, 0, 650, 630, 1, 0, 0, 0, 650, 635, 1, 0, 0, 0, 650, 640, 1, 0, 0, 0, 650, 645, 1, 0, 0, 0, 651, 89, 1, 0, 0, 0, 652, 653, 7, 4, 0, 0, 653, 91, 1, 0, 0, 0, 654, 655, 7, 5, 0, 0, 655, 93, 1, 0, 0, 0, 656, 665, 3, 104, 52, 0, 657, 665, 5, 94, 0, 0, 658, 665, 5, 95, 0, 0, 659, 665, 5, 78, 0, 0, 660, 665, 5, 79, 0, 0, 661, 665, 5, 80, 0, 0, 662, 665, 3, 96, 48, 0, 663, 665, 3, 100, 50, 0, 664, 656, 1, 0, 0, 0, 664, 657, 1, 0, 0, 0, 664, 658, 1, 0, 0, 0, 664, 659, 1, 0, 0, 0, 664, 660, 1, 0, 0, 0, 664, 661, 1, 0, 0, 0, 664, 662, 1, 0, 0, 0, 664, 663, 1, 0, 0, 0, 665, 95, 1, 0, 0, 0, 666, 675, 5, 86, 0, 0, 667, 672, 3, 98, 49, 0, 668, 669, 5, 84, 0, 0, 669, 671, 3, 98, 49, 0, 670, 668, 1, 0, 0, 0, 671, 674, 1, 0, 0, 0, 672, 670, 1, 0, 0, 0, 672, 673, 1, 0, 0, 0, 673, 676, 1, 0, 0, 0, 674, 672, 1, 0, 0, 0, 675, 667, 1, 0, 0, 0, 675, 676, 1, 0, 0, 0, 676, 677, 1, 0, 0, 0, 677, 678, 5, 87, 0, 0, 678, 97, 1, 0, 0, 0, 679, 680, 3, 104, 52, 0, 680, 681, 5, 82, 0, 0, 681, 682, 3, 94, 47, 0, 682, 99, 1, 0, 0, 0, 683, 692, 5, 88, 0, 0, 684, 689, 3, 94, 47, 0, 685, 686, 5, 84, 0, 0, 686, 688, 3, 94, 47, 0, 687, 685, 1, 0, 0, 0, 688, 691, 1, 0, 0, 0, 689, 687, 1, 0, 0, 0, 689, 690, 1, 0, 0, 0, 690, 693, 1, 0, 0, 0, 691, 689, 1, 0, 0, 0, 692, 684, 1, 0, 0, 0, 692, 693, 1, 0, 0, 0, 693, 694, 1, 0, 0, 0, 694, 695, 5, 89, 0, 0, 695, 101, 1, 0, 0, 0, 696, 697, 7, 6, 0, 0, 697, 103, 1, 0, 0, 0, 698, 699, 5, 97, 0, 0, 699, 105, 1, 0, 0, 0, 43, 121, 132, 140, 155, 173, 200, 224, 234, 240, 269, 275, 288, 296, 309, 314, 327, 340, 355, 358, 365, 373, 413, 421, 433, 447, 457, 475, 487, 496, 533, 552, 554, 565, 580, 596, 612, 621, 650, 664, 672, 675, 689, 692] \ No newline at end of file +[4, 1, 102, 753, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 122, 8, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 134, 8, 1, 10, 1, 12, 1, 137, 9, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 3, 2, 146, 8, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 3, 3, 158, 8, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 3, 6, 177, 8, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 3, 7, 185, 8, 7, 1, 7, 1, 7, 1, 8, 5, 8, 190, 8, 8, 10, 8, 12, 8, 193, 9, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 5, 8, 203, 8, 8, 10, 8, 12, 8, 206, 9, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 3, 9, 213, 8, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 238, 8, 11, 10, 11, 12, 11, 241, 9, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 3, 12, 264, 8, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 3, 13, 274, 8, 13, 1, 13, 1, 13, 5, 13, 278, 8, 13, 10, 13, 12, 13, 281, 9, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 3, 14, 309, 8, 14, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 315, 8, 15, 1, 16, 5, 16, 318, 8, 16, 10, 16, 12, 16, 321, 9, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 5, 16, 331, 8, 16, 10, 16, 12, 16, 334, 9, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 3, 17, 341, 8, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 3, 18, 354, 8, 18, 1, 18, 1, 18, 1, 18, 3, 18, 359, 8, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 3, 19, 372, 8, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 385, 8, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 400, 8, 23, 1, 23, 3, 23, 403, 8, 23, 1, 24, 1, 24, 1, 24, 5, 24, 408, 8, 24, 10, 24, 12, 24, 411, 9, 24, 1, 25, 1, 25, 1, 25, 5, 25, 416, 8, 25, 10, 25, 12, 25, 419, 9, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 3, 26, 458, 8, 26, 1, 27, 1, 27, 1, 27, 1, 27, 5, 27, 464, 8, 27, 10, 27, 12, 27, 467, 9, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 3, 30, 478, 8, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 3, 31, 492, 8, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 3, 32, 502, 8, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 3, 34, 520, 8, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 5, 35, 530, 8, 35, 10, 35, 12, 35, 533, 9, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 3, 36, 541, 8, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 3, 40, 578, 8, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 3, 41, 597, 8, 41, 3, 41, 599, 8, 41, 1, 42, 1, 42, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 5, 44, 608, 8, 44, 10, 44, 12, 44, 611, 9, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 3, 45, 625, 8, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 3, 45, 641, 8, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 3, 45, 655, 8, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 3, 45, 665, 8, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 3, 46, 674, 8, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 3, 47, 703, 8, 47, 1, 48, 1, 48, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 3, 50, 717, 8, 50, 1, 51, 1, 51, 1, 51, 1, 51, 5, 51, 723, 8, 51, 10, 51, 12, 51, 726, 9, 51, 3, 51, 728, 8, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 5, 53, 740, 8, 53, 10, 53, 12, 53, 743, 9, 53, 3, 53, 745, 8, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 0, 0, 56, 0, 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, 0, 7, 1, 0, 53, 57, 2, 0, 48, 52, 54, 55, 2, 0, 48, 49, 54, 55, 2, 0, 50, 52, 54, 55, 1, 0, 72, 79, 1, 0, 60, 63, 2, 0, 32, 32, 98, 98, 783, 0, 121, 1, 0, 0, 0, 2, 123, 1, 0, 0, 0, 4, 145, 1, 0, 0, 0, 6, 157, 1, 0, 0, 0, 8, 159, 1, 0, 0, 0, 10, 166, 1, 0, 0, 0, 12, 176, 1, 0, 0, 0, 14, 178, 1, 0, 0, 0, 16, 191, 1, 0, 0, 0, 18, 212, 1, 0, 0, 0, 20, 214, 1, 0, 0, 0, 22, 229, 1, 0, 0, 0, 24, 263, 1, 0, 0, 0, 26, 265, 1, 0, 0, 0, 28, 308, 1, 0, 0, 0, 30, 314, 1, 0, 0, 0, 32, 319, 1, 0, 0, 0, 34, 340, 1, 0, 0, 0, 36, 342, 1, 0, 0, 0, 38, 362, 1, 0, 0, 0, 40, 375, 1, 0, 0, 0, 42, 388, 1, 0, 0, 0, 44, 391, 1, 0, 0, 0, 46, 402, 1, 0, 0, 0, 48, 404, 1, 0, 0, 0, 50, 412, 1, 0, 0, 0, 52, 457, 1, 0, 0, 0, 54, 459, 1, 0, 0, 0, 56, 470, 1, 0, 0, 0, 58, 472, 1, 0, 0, 0, 60, 477, 1, 0, 0, 0, 62, 479, 1, 0, 0, 0, 64, 501, 1, 0, 0, 0, 66, 503, 1, 0, 0, 0, 68, 512, 1, 0, 0, 0, 70, 523, 1, 0, 0, 0, 72, 540, 1, 0, 0, 0, 74, 542, 1, 0, 0, 0, 76, 556, 1, 0, 0, 0, 78, 562, 1, 0, 0, 0, 80, 577, 1, 0, 0, 0, 82, 598, 1, 0, 0, 0, 84, 600, 1, 0, 0, 0, 86, 602, 1, 0, 0, 0, 88, 604, 1, 0, 0, 0, 90, 664, 1, 0, 0, 0, 92, 666, 1, 0, 0, 0, 94, 702, 1, 0, 0, 0, 96, 704, 1, 0, 0, 0, 98, 706, 1, 0, 0, 0, 100, 716, 1, 0, 0, 0, 102, 718, 1, 0, 0, 0, 104, 731, 1, 0, 0, 0, 106, 735, 1, 0, 0, 0, 108, 748, 1, 0, 0, 0, 110, 750, 1, 0, 0, 0, 112, 113, 3, 2, 1, 0, 113, 114, 5, 0, 0, 1, 114, 122, 1, 0, 0, 0, 115, 116, 3, 16, 8, 0, 116, 117, 5, 0, 0, 1, 117, 122, 1, 0, 0, 0, 118, 119, 3, 32, 16, 0, 119, 120, 5, 0, 0, 1, 120, 122, 1, 0, 0, 0, 121, 112, 1, 0, 0, 0, 121, 115, 1, 0, 0, 0, 121, 118, 1, 0, 0, 0, 122, 1, 1, 0, 0, 0, 123, 124, 5, 1, 0, 0, 124, 125, 3, 108, 54, 0, 125, 126, 5, 36, 0, 0, 126, 127, 3, 110, 55, 0, 127, 128, 5, 35, 0, 0, 128, 129, 3, 110, 55, 0, 129, 130, 5, 34, 0, 0, 130, 131, 3, 110, 55, 0, 131, 135, 5, 88, 0, 0, 132, 134, 3, 4, 2, 0, 133, 132, 1, 0, 0, 0, 134, 137, 1, 0, 0, 0, 135, 133, 1, 0, 0, 0, 135, 136, 1, 0, 0, 0, 136, 138, 1, 0, 0, 0, 137, 135, 1, 0, 0, 0, 138, 139, 5, 89, 0, 0, 139, 3, 1, 0, 0, 0, 140, 146, 3, 14, 7, 0, 141, 146, 3, 6, 3, 0, 142, 146, 3, 58, 29, 0, 143, 146, 3, 70, 35, 0, 144, 146, 3, 92, 46, 0, 145, 140, 1, 0, 0, 0, 145, 141, 1, 0, 0, 0, 145, 142, 1, 0, 0, 0, 145, 143, 1, 0, 0, 0, 145, 144, 1, 0, 0, 0, 146, 5, 1, 0, 0, 0, 147, 148, 5, 2, 0, 0, 148, 149, 5, 5, 0, 0, 149, 150, 3, 108, 54, 0, 150, 151, 5, 85, 0, 0, 151, 158, 1, 0, 0, 0, 152, 153, 5, 2, 0, 0, 153, 154, 5, 7, 0, 0, 154, 155, 3, 108, 54, 0, 155, 156, 5, 85, 0, 0, 156, 158, 1, 0, 0, 0, 157, 147, 1, 0, 0, 0, 157, 152, 1, 0, 0, 0, 158, 7, 1, 0, 0, 0, 159, 160, 5, 3, 0, 0, 160, 161, 5, 4, 0, 0, 161, 162, 3, 108, 54, 0, 162, 163, 5, 36, 0, 0, 163, 164, 3, 110, 55, 0, 164, 165, 5, 85, 0, 0, 165, 9, 1, 0, 0, 0, 166, 167, 5, 3, 0, 0, 167, 168, 5, 5, 0, 0, 168, 169, 3, 108, 54, 0, 169, 170, 5, 35, 0, 0, 170, 171, 3, 110, 55, 0, 171, 172, 5, 85, 0, 0, 172, 11, 1, 0, 0, 0, 173, 177, 3, 6, 3, 0, 174, 177, 3, 8, 4, 0, 175, 177, 3, 10, 5, 0, 176, 173, 1, 0, 0, 0, 176, 174, 1, 0, 0, 0, 176, 175, 1, 0, 0, 0, 177, 13, 1, 0, 0, 0, 178, 179, 5, 4, 0, 0, 179, 180, 3, 108, 54, 0, 180, 181, 5, 36, 0, 0, 181, 184, 3, 110, 55, 0, 182, 183, 5, 37, 0, 0, 183, 185, 3, 110, 55, 0, 184, 182, 1, 0, 0, 0, 184, 185, 1, 0, 0, 0, 185, 186, 1, 0, 0, 0, 186, 187, 5, 85, 0, 0, 187, 15, 1, 0, 0, 0, 188, 190, 3, 12, 6, 0, 189, 188, 1, 0, 0, 0, 190, 193, 1, 0, 0, 0, 191, 189, 1, 0, 0, 0, 191, 192, 1, 0, 0, 0, 192, 194, 1, 0, 0, 0, 193, 191, 1, 0, 0, 0, 194, 195, 5, 5, 0, 0, 195, 196, 3, 108, 54, 0, 196, 197, 5, 36, 0, 0, 197, 198, 3, 110, 55, 0, 198, 199, 5, 35, 0, 0, 199, 200, 3, 110, 55, 0, 200, 204, 5, 88, 0, 0, 201, 203, 3, 18, 9, 0, 202, 201, 1, 0, 0, 0, 203, 206, 1, 0, 0, 0, 204, 202, 1, 0, 0, 0, 204, 205, 1, 0, 0, 0, 205, 207, 1, 0, 0, 0, 206, 204, 1, 0, 0, 0, 207, 208, 5, 89, 0, 0, 208, 17, 1, 0, 0, 0, 209, 213, 3, 22, 11, 0, 210, 213, 3, 26, 13, 0, 211, 213, 3, 20, 10, 0, 212, 209, 1, 0, 0, 0, 212, 210, 1, 0, 0, 0, 212, 211, 1, 0, 0, 0, 213, 19, 1, 0, 0, 0, 214, 215, 5, 10, 0, 0, 215, 216, 3, 108, 54, 0, 216, 217, 5, 36, 0, 0, 217, 218, 3, 110, 55, 0, 218, 219, 5, 84, 0, 0, 219, 220, 3, 94, 47, 0, 220, 221, 5, 83, 0, 0, 221, 222, 3, 94, 47, 0, 222, 223, 5, 88, 0, 0, 223, 224, 5, 53, 0, 0, 224, 225, 5, 36, 0, 0, 225, 226, 3, 110, 55, 0, 226, 227, 5, 85, 0, 0, 227, 228, 5, 89, 0, 0, 228, 21, 1, 0, 0, 0, 229, 230, 5, 8, 0, 0, 230, 231, 3, 108, 54, 0, 231, 232, 5, 36, 0, 0, 232, 233, 3, 110, 55, 0, 233, 234, 5, 84, 0, 0, 234, 235, 3, 94, 47, 0, 235, 239, 5, 88, 0, 0, 236, 238, 3, 24, 12, 0, 237, 236, 1, 0, 0, 0, 238, 241, 1, 0, 0, 0, 239, 237, 1, 0, 0, 0, 239, 240, 1, 0, 0, 0, 240, 242, 1, 0, 0, 0, 241, 239, 1, 0, 0, 0, 242, 243, 5, 89, 0, 0, 243, 23, 1, 0, 0, 0, 244, 245, 5, 43, 0, 0, 245, 246, 5, 36, 0, 0, 246, 247, 3, 110, 55, 0, 247, 248, 5, 85, 0, 0, 248, 264, 1, 0, 0, 0, 249, 250, 5, 44, 0, 0, 250, 251, 5, 36, 0, 0, 251, 252, 3, 110, 55, 0, 252, 253, 5, 85, 0, 0, 253, 264, 1, 0, 0, 0, 254, 255, 5, 45, 0, 0, 255, 256, 5, 46, 0, 0, 256, 257, 5, 36, 0, 0, 257, 258, 3, 110, 55, 0, 258, 259, 5, 47, 0, 0, 259, 260, 5, 36, 0, 0, 260, 261, 3, 110, 55, 0, 261, 262, 5, 85, 0, 0, 262, 264, 1, 0, 0, 0, 263, 244, 1, 0, 0, 0, 263, 249, 1, 0, 0, 0, 263, 254, 1, 0, 0, 0, 264, 25, 1, 0, 0, 0, 265, 266, 5, 9, 0, 0, 266, 267, 3, 108, 54, 0, 267, 268, 5, 36, 0, 0, 268, 269, 3, 110, 55, 0, 269, 270, 5, 84, 0, 0, 270, 271, 3, 98, 49, 0, 271, 273, 3, 30, 15, 0, 272, 274, 5, 64, 0, 0, 273, 272, 1, 0, 0, 0, 273, 274, 1, 0, 0, 0, 274, 275, 1, 0, 0, 0, 275, 279, 5, 88, 0, 0, 276, 278, 3, 28, 14, 0, 277, 276, 1, 0, 0, 0, 278, 281, 1, 0, 0, 0, 279, 277, 1, 0, 0, 0, 279, 280, 1, 0, 0, 0, 280, 282, 1, 0, 0, 0, 281, 279, 1, 0, 0, 0, 282, 283, 5, 89, 0, 0, 283, 27, 1, 0, 0, 0, 284, 285, 5, 50, 0, 0, 285, 286, 5, 36, 0, 0, 286, 287, 3, 110, 55, 0, 287, 288, 5, 85, 0, 0, 288, 309, 1, 0, 0, 0, 289, 290, 5, 51, 0, 0, 290, 291, 5, 36, 0, 0, 291, 292, 3, 110, 55, 0, 292, 293, 5, 85, 0, 0, 293, 309, 1, 0, 0, 0, 294, 295, 5, 52, 0, 0, 295, 296, 5, 36, 0, 0, 296, 297, 3, 110, 55, 0, 297, 298, 5, 85, 0, 0, 298, 309, 1, 0, 0, 0, 299, 300, 5, 45, 0, 0, 300, 301, 5, 46, 0, 0, 301, 302, 5, 36, 0, 0, 302, 303, 3, 110, 55, 0, 303, 304, 5, 47, 0, 0, 304, 305, 5, 36, 0, 0, 305, 306, 3, 110, 55, 0, 306, 307, 5, 85, 0, 0, 307, 309, 1, 0, 0, 0, 308, 284, 1, 0, 0, 0, 308, 289, 1, 0, 0, 0, 308, 294, 1, 0, 0, 0, 308, 299, 1, 0, 0, 0, 309, 29, 1, 0, 0, 0, 310, 311, 5, 4, 0, 0, 311, 315, 3, 108, 54, 0, 312, 313, 5, 5, 0, 0, 313, 315, 3, 108, 54, 0, 314, 310, 1, 0, 0, 0, 314, 312, 1, 0, 0, 0, 315, 31, 1, 0, 0, 0, 316, 318, 3, 12, 6, 0, 317, 316, 1, 0, 0, 0, 318, 321, 1, 0, 0, 0, 319, 317, 1, 0, 0, 0, 319, 320, 1, 0, 0, 0, 320, 322, 1, 0, 0, 0, 321, 319, 1, 0, 0, 0, 322, 323, 5, 7, 0, 0, 323, 324, 3, 108, 54, 0, 324, 325, 5, 36, 0, 0, 325, 326, 3, 110, 55, 0, 326, 327, 5, 35, 0, 0, 327, 328, 3, 110, 55, 0, 328, 332, 5, 88, 0, 0, 329, 331, 3, 34, 17, 0, 330, 329, 1, 0, 0, 0, 331, 334, 1, 0, 0, 0, 332, 330, 1, 0, 0, 0, 332, 333, 1, 0, 0, 0, 333, 335, 1, 0, 0, 0, 334, 332, 1, 0, 0, 0, 335, 336, 5, 89, 0, 0, 336, 33, 1, 0, 0, 0, 337, 341, 3, 36, 18, 0, 338, 341, 3, 38, 19, 0, 339, 341, 3, 40, 20, 0, 340, 337, 1, 0, 0, 0, 340, 338, 1, 0, 0, 0, 340, 339, 1, 0, 0, 0, 341, 35, 1, 0, 0, 0, 342, 343, 5, 10, 0, 0, 343, 344, 3, 108, 54, 0, 344, 345, 5, 36, 0, 0, 345, 346, 3, 110, 55, 0, 346, 347, 5, 84, 0, 0, 347, 348, 3, 94, 47, 0, 348, 349, 5, 83, 0, 0, 349, 350, 3, 94, 47, 0, 350, 351, 5, 38, 0, 0, 351, 353, 3, 44, 22, 0, 352, 354, 3, 42, 21, 0, 353, 352, 1, 0, 0, 0, 353, 354, 1, 0, 0, 0, 354, 355, 1, 0, 0, 0, 355, 356, 5, 40, 0, 0, 356, 358, 3, 46, 23, 0, 357, 359, 3, 50, 25, 0, 358, 357, 1, 0, 0, 0, 358, 359, 1, 0, 0, 0, 359, 360, 1, 0, 0, 0, 360, 361, 5, 85, 0, 0, 361, 37, 1, 0, 0, 0, 362, 363, 5, 11, 0, 0, 363, 364, 3, 108, 54, 0, 364, 365, 5, 36, 0, 0, 365, 366, 3, 110, 55, 0, 366, 367, 5, 84, 0, 0, 367, 368, 3, 94, 47, 0, 368, 369, 5, 83, 0, 0, 369, 371, 3, 94, 47, 0, 370, 372, 3, 50, 25, 0, 371, 370, 1, 0, 0, 0, 371, 372, 1, 0, 0, 0, 372, 373, 1, 0, 0, 0, 373, 374, 5, 85, 0, 0, 374, 39, 1, 0, 0, 0, 375, 376, 5, 12, 0, 0, 376, 377, 3, 108, 54, 0, 377, 378, 5, 36, 0, 0, 378, 379, 3, 110, 55, 0, 379, 380, 5, 13, 0, 0, 380, 381, 3, 108, 54, 0, 381, 382, 5, 84, 0, 0, 382, 384, 3, 94, 47, 0, 383, 385, 3, 50, 25, 0, 384, 383, 1, 0, 0, 0, 384, 385, 1, 0, 0, 0, 385, 386, 1, 0, 0, 0, 386, 387, 5, 85, 0, 0, 387, 41, 1, 0, 0, 0, 388, 389, 5, 39, 0, 0, 389, 390, 3, 94, 47, 0, 390, 43, 1, 0, 0, 0, 391, 392, 7, 0, 0, 0, 392, 45, 1, 0, 0, 0, 393, 403, 5, 42, 0, 0, 394, 395, 5, 4, 0, 0, 395, 403, 3, 108, 54, 0, 396, 397, 5, 6, 0, 0, 397, 399, 5, 90, 0, 0, 398, 400, 3, 48, 24, 0, 399, 398, 1, 0, 0, 0, 399, 400, 1, 0, 0, 0, 400, 401, 1, 0, 0, 0, 401, 403, 5, 91, 0, 0, 402, 393, 1, 0, 0, 0, 402, 394, 1, 0, 0, 0, 402, 396, 1, 0, 0, 0, 403, 47, 1, 0, 0, 0, 404, 409, 3, 108, 54, 0, 405, 406, 5, 86, 0, 0, 406, 408, 3, 108, 54, 0, 407, 405, 1, 0, 0, 0, 408, 411, 1, 0, 0, 0, 409, 407, 1, 0, 0, 0, 409, 410, 1, 0, 0, 0, 410, 49, 1, 0, 0, 0, 411, 409, 1, 0, 0, 0, 412, 413, 5, 41, 0, 0, 413, 417, 5, 88, 0, 0, 414, 416, 3, 52, 26, 0, 415, 414, 1, 0, 0, 0, 416, 419, 1, 0, 0, 0, 417, 415, 1, 0, 0, 0, 417, 418, 1, 0, 0, 0, 418, 420, 1, 0, 0, 0, 419, 417, 1, 0, 0, 0, 420, 421, 5, 89, 0, 0, 421, 51, 1, 0, 0, 0, 422, 423, 5, 20, 0, 0, 423, 424, 3, 108, 54, 0, 424, 425, 5, 36, 0, 0, 425, 426, 3, 110, 55, 0, 426, 427, 5, 84, 0, 0, 427, 428, 3, 94, 47, 0, 428, 429, 3, 54, 27, 0, 429, 430, 5, 85, 0, 0, 430, 458, 1, 0, 0, 0, 431, 432, 5, 21, 0, 0, 432, 433, 3, 108, 54, 0, 433, 434, 5, 36, 0, 0, 434, 435, 3, 110, 55, 0, 435, 436, 5, 84, 0, 0, 436, 437, 3, 98, 49, 0, 437, 438, 3, 30, 15, 0, 438, 439, 3, 54, 27, 0, 439, 440, 5, 85, 0, 0, 440, 458, 1, 0, 0, 0, 441, 442, 5, 5, 0, 0, 442, 443, 3, 108, 54, 0, 443, 444, 5, 36, 0, 0, 444, 445, 3, 110, 55, 0, 445, 446, 5, 84, 0, 0, 446, 447, 3, 108, 54, 0, 447, 448, 5, 85, 0, 0, 448, 458, 1, 0, 0, 0, 449, 450, 5, 12, 0, 0, 450, 451, 3, 108, 54, 0, 451, 452, 5, 36, 0, 0, 452, 453, 3, 110, 55, 0, 453, 454, 5, 84, 0, 0, 454, 455, 3, 108, 54, 0, 455, 456, 5, 85, 0, 0, 456, 458, 1, 0, 0, 0, 457, 422, 1, 0, 0, 0, 457, 431, 1, 0, 0, 0, 457, 441, 1, 0, 0, 0, 457, 449, 1, 0, 0, 0, 458, 53, 1, 0, 0, 0, 459, 460, 5, 90, 0, 0, 460, 465, 3, 56, 28, 0, 461, 462, 5, 86, 0, 0, 462, 464, 3, 56, 28, 0, 463, 461, 1, 0, 0, 0, 464, 467, 1, 0, 0, 0, 465, 463, 1, 0, 0, 0, 465, 466, 1, 0, 0, 0, 466, 468, 1, 0, 0, 0, 467, 465, 1, 0, 0, 0, 468, 469, 5, 91, 0, 0, 469, 55, 1, 0, 0, 0, 470, 471, 7, 1, 0, 0, 471, 57, 1, 0, 0, 0, 472, 473, 5, 19, 0, 0, 473, 474, 3, 60, 30, 0, 474, 59, 1, 0, 0, 0, 475, 478, 3, 62, 31, 0, 476, 478, 3, 66, 33, 0, 477, 475, 1, 0, 0, 0, 477, 476, 1, 0, 0, 0, 478, 61, 1, 0, 0, 0, 479, 480, 5, 20, 0, 0, 480, 481, 3, 108, 54, 0, 481, 482, 5, 36, 0, 0, 482, 483, 3, 110, 55, 0, 483, 484, 5, 29, 0, 0, 484, 485, 3, 108, 54, 0, 485, 486, 5, 84, 0, 0, 486, 487, 3, 94, 47, 0, 487, 488, 5, 30, 0, 0, 488, 491, 3, 64, 32, 0, 489, 490, 5, 31, 0, 0, 490, 492, 3, 100, 50, 0, 491, 489, 1, 0, 0, 0, 491, 492, 1, 0, 0, 0, 492, 493, 1, 0, 0, 0, 493, 494, 5, 85, 0, 0, 494, 63, 1, 0, 0, 0, 495, 502, 5, 58, 0, 0, 496, 497, 5, 59, 0, 0, 497, 498, 5, 92, 0, 0, 498, 499, 3, 94, 47, 0, 499, 500, 5, 93, 0, 0, 500, 502, 1, 0, 0, 0, 501, 495, 1, 0, 0, 0, 501, 496, 1, 0, 0, 0, 502, 65, 1, 0, 0, 0, 503, 504, 5, 21, 0, 0, 504, 505, 3, 108, 54, 0, 505, 506, 5, 36, 0, 0, 506, 507, 3, 110, 55, 0, 507, 508, 5, 88, 0, 0, 508, 509, 3, 68, 34, 0, 509, 510, 3, 68, 34, 0, 510, 511, 5, 89, 0, 0, 511, 67, 1, 0, 0, 0, 512, 513, 3, 30, 15, 0, 513, 514, 5, 22, 0, 0, 514, 515, 3, 108, 54, 0, 515, 516, 5, 36, 0, 0, 516, 517, 3, 110, 55, 0, 517, 519, 3, 98, 49, 0, 518, 520, 5, 64, 0, 0, 519, 518, 1, 0, 0, 0, 519, 520, 1, 0, 0, 0, 520, 521, 1, 0, 0, 0, 521, 522, 5, 85, 0, 0, 522, 69, 1, 0, 0, 0, 523, 524, 5, 14, 0, 0, 524, 525, 3, 108, 54, 0, 525, 526, 5, 15, 0, 0, 526, 527, 3, 108, 54, 0, 527, 531, 5, 88, 0, 0, 528, 530, 3, 72, 36, 0, 529, 528, 1, 0, 0, 0, 530, 533, 1, 0, 0, 0, 531, 529, 1, 0, 0, 0, 531, 532, 1, 0, 0, 0, 532, 534, 1, 0, 0, 0, 533, 531, 1, 0, 0, 0, 534, 535, 5, 89, 0, 0, 535, 71, 1, 0, 0, 0, 536, 537, 5, 18, 0, 0, 537, 541, 3, 60, 30, 0, 538, 541, 3, 76, 38, 0, 539, 541, 3, 74, 37, 0, 540, 536, 1, 0, 0, 0, 540, 538, 1, 0, 0, 0, 540, 539, 1, 0, 0, 0, 541, 73, 1, 0, 0, 0, 542, 543, 5, 26, 0, 0, 543, 544, 3, 108, 54, 0, 544, 545, 5, 27, 0, 0, 545, 546, 5, 28, 0, 0, 546, 547, 5, 24, 0, 0, 547, 548, 5, 12, 0, 0, 548, 549, 3, 108, 54, 0, 549, 550, 5, 25, 0, 0, 550, 551, 5, 21, 0, 0, 551, 552, 3, 108, 54, 0, 552, 553, 5, 87, 0, 0, 553, 554, 3, 108, 54, 0, 554, 555, 5, 85, 0, 0, 555, 75, 1, 0, 0, 0, 556, 557, 5, 16, 0, 0, 557, 558, 3, 78, 39, 0, 558, 559, 5, 17, 0, 0, 559, 560, 3, 82, 41, 0, 560, 561, 5, 85, 0, 0, 561, 77, 1, 0, 0, 0, 562, 563, 3, 108, 54, 0, 563, 564, 5, 87, 0, 0, 564, 565, 3, 80, 40, 0, 565, 79, 1, 0, 0, 0, 566, 578, 3, 108, 54, 0, 567, 578, 5, 53, 0, 0, 568, 578, 5, 43, 0, 0, 569, 578, 5, 44, 0, 0, 570, 578, 5, 50, 0, 0, 571, 578, 5, 51, 0, 0, 572, 578, 5, 52, 0, 0, 573, 578, 5, 54, 0, 0, 574, 578, 5, 55, 0, 0, 575, 578, 5, 56, 0, 0, 576, 578, 5, 57, 0, 0, 577, 566, 1, 0, 0, 0, 577, 567, 1, 0, 0, 0, 577, 568, 1, 0, 0, 0, 577, 569, 1, 0, 0, 0, 577, 570, 1, 0, 0, 0, 577, 571, 1, 0, 0, 0, 577, 572, 1, 0, 0, 0, 577, 573, 1, 0, 0, 0, 577, 574, 1, 0, 0, 0, 577, 575, 1, 0, 0, 0, 577, 576, 1, 0, 0, 0, 578, 81, 1, 0, 0, 0, 579, 580, 5, 20, 0, 0, 580, 581, 3, 108, 54, 0, 581, 582, 5, 87, 0, 0, 582, 583, 3, 84, 42, 0, 583, 599, 1, 0, 0, 0, 584, 585, 5, 21, 0, 0, 585, 586, 3, 108, 54, 0, 586, 587, 5, 87, 0, 0, 587, 588, 3, 108, 54, 0, 588, 589, 5, 87, 0, 0, 589, 590, 3, 86, 43, 0, 590, 599, 1, 0, 0, 0, 591, 592, 5, 7, 0, 0, 592, 593, 3, 108, 54, 0, 593, 594, 5, 87, 0, 0, 594, 596, 3, 108, 54, 0, 595, 597, 3, 88, 44, 0, 596, 595, 1, 0, 0, 0, 596, 597, 1, 0, 0, 0, 597, 599, 1, 0, 0, 0, 598, 579, 1, 0, 0, 0, 598, 584, 1, 0, 0, 0, 598, 591, 1, 0, 0, 0, 599, 83, 1, 0, 0, 0, 600, 601, 7, 2, 0, 0, 601, 85, 1, 0, 0, 0, 602, 603, 7, 3, 0, 0, 603, 87, 1, 0, 0, 0, 604, 605, 5, 23, 0, 0, 605, 609, 5, 88, 0, 0, 606, 608, 3, 90, 45, 0, 607, 606, 1, 0, 0, 0, 608, 611, 1, 0, 0, 0, 609, 607, 1, 0, 0, 0, 609, 610, 1, 0, 0, 0, 610, 612, 1, 0, 0, 0, 611, 609, 1, 0, 0, 0, 612, 613, 5, 89, 0, 0, 613, 89, 1, 0, 0, 0, 614, 615, 3, 108, 54, 0, 615, 616, 5, 17, 0, 0, 616, 617, 5, 20, 0, 0, 617, 624, 3, 108, 54, 0, 618, 619, 5, 25, 0, 0, 619, 620, 5, 21, 0, 0, 620, 621, 3, 108, 54, 0, 621, 622, 5, 87, 0, 0, 622, 623, 3, 108, 54, 0, 623, 625, 1, 0, 0, 0, 624, 618, 1, 0, 0, 0, 624, 625, 1, 0, 0, 0, 625, 626, 1, 0, 0, 0, 626, 627, 5, 85, 0, 0, 627, 665, 1, 0, 0, 0, 628, 629, 3, 108, 54, 0, 629, 630, 5, 17, 0, 0, 630, 631, 5, 21, 0, 0, 631, 632, 3, 108, 54, 0, 632, 633, 5, 87, 0, 0, 633, 640, 3, 108, 54, 0, 634, 635, 5, 25, 0, 0, 635, 636, 5, 21, 0, 0, 636, 637, 3, 108, 54, 0, 637, 638, 5, 87, 0, 0, 638, 639, 3, 108, 54, 0, 639, 641, 1, 0, 0, 0, 640, 634, 1, 0, 0, 0, 640, 641, 1, 0, 0, 0, 641, 642, 1, 0, 0, 0, 642, 643, 5, 85, 0, 0, 643, 665, 1, 0, 0, 0, 644, 645, 3, 108, 54, 0, 645, 646, 5, 17, 0, 0, 646, 647, 5, 5, 0, 0, 647, 654, 3, 108, 54, 0, 648, 649, 5, 25, 0, 0, 649, 650, 5, 21, 0, 0, 650, 651, 3, 108, 54, 0, 651, 652, 5, 87, 0, 0, 652, 653, 3, 108, 54, 0, 653, 655, 1, 0, 0, 0, 654, 648, 1, 0, 0, 0, 654, 655, 1, 0, 0, 0, 655, 656, 1, 0, 0, 0, 656, 657, 5, 85, 0, 0, 657, 665, 1, 0, 0, 0, 658, 659, 3, 108, 54, 0, 659, 660, 5, 17, 0, 0, 660, 661, 5, 12, 0, 0, 661, 662, 3, 108, 54, 0, 662, 663, 5, 85, 0, 0, 663, 665, 1, 0, 0, 0, 664, 614, 1, 0, 0, 0, 664, 628, 1, 0, 0, 0, 664, 644, 1, 0, 0, 0, 664, 658, 1, 0, 0, 0, 665, 91, 1, 0, 0, 0, 666, 667, 5, 12, 0, 0, 667, 668, 3, 108, 54, 0, 668, 669, 5, 17, 0, 0, 669, 670, 3, 108, 54, 0, 670, 671, 5, 87, 0, 0, 671, 673, 3, 108, 54, 0, 672, 674, 3, 88, 44, 0, 673, 672, 1, 0, 0, 0, 673, 674, 1, 0, 0, 0, 674, 675, 1, 0, 0, 0, 675, 676, 5, 85, 0, 0, 676, 93, 1, 0, 0, 0, 677, 703, 3, 96, 48, 0, 678, 703, 5, 65, 0, 0, 679, 703, 5, 66, 0, 0, 680, 681, 5, 67, 0, 0, 681, 703, 3, 110, 55, 0, 682, 683, 5, 68, 0, 0, 683, 684, 5, 94, 0, 0, 684, 685, 3, 108, 54, 0, 685, 686, 5, 95, 0, 0, 686, 703, 1, 0, 0, 0, 687, 688, 5, 69, 0, 0, 688, 689, 5, 94, 0, 0, 689, 690, 3, 108, 54, 0, 690, 691, 5, 95, 0, 0, 691, 703, 1, 0, 0, 0, 692, 693, 5, 70, 0, 0, 693, 694, 5, 94, 0, 0, 694, 695, 3, 94, 47, 0, 695, 696, 5, 95, 0, 0, 696, 703, 1, 0, 0, 0, 697, 698, 5, 71, 0, 0, 698, 699, 5, 94, 0, 0, 699, 700, 3, 94, 47, 0, 700, 701, 5, 95, 0, 0, 701, 703, 1, 0, 0, 0, 702, 677, 1, 0, 0, 0, 702, 678, 1, 0, 0, 0, 702, 679, 1, 0, 0, 0, 702, 680, 1, 0, 0, 0, 702, 682, 1, 0, 0, 0, 702, 687, 1, 0, 0, 0, 702, 692, 1, 0, 0, 0, 702, 697, 1, 0, 0, 0, 703, 95, 1, 0, 0, 0, 704, 705, 7, 4, 0, 0, 705, 97, 1, 0, 0, 0, 706, 707, 7, 5, 0, 0, 707, 99, 1, 0, 0, 0, 708, 717, 3, 110, 55, 0, 709, 717, 5, 96, 0, 0, 710, 717, 5, 97, 0, 0, 711, 717, 5, 80, 0, 0, 712, 717, 5, 81, 0, 0, 713, 717, 5, 82, 0, 0, 714, 717, 3, 102, 51, 0, 715, 717, 3, 106, 53, 0, 716, 708, 1, 0, 0, 0, 716, 709, 1, 0, 0, 0, 716, 710, 1, 0, 0, 0, 716, 711, 1, 0, 0, 0, 716, 712, 1, 0, 0, 0, 716, 713, 1, 0, 0, 0, 716, 714, 1, 0, 0, 0, 716, 715, 1, 0, 0, 0, 717, 101, 1, 0, 0, 0, 718, 727, 5, 88, 0, 0, 719, 724, 3, 104, 52, 0, 720, 721, 5, 86, 0, 0, 721, 723, 3, 104, 52, 0, 722, 720, 1, 0, 0, 0, 723, 726, 1, 0, 0, 0, 724, 722, 1, 0, 0, 0, 724, 725, 1, 0, 0, 0, 725, 728, 1, 0, 0, 0, 726, 724, 1, 0, 0, 0, 727, 719, 1, 0, 0, 0, 727, 728, 1, 0, 0, 0, 728, 729, 1, 0, 0, 0, 729, 730, 5, 89, 0, 0, 730, 103, 1, 0, 0, 0, 731, 732, 3, 110, 55, 0, 732, 733, 5, 84, 0, 0, 733, 734, 3, 100, 50, 0, 734, 105, 1, 0, 0, 0, 735, 744, 5, 90, 0, 0, 736, 741, 3, 100, 50, 0, 737, 738, 5, 86, 0, 0, 738, 740, 3, 100, 50, 0, 739, 737, 1, 0, 0, 0, 740, 743, 1, 0, 0, 0, 741, 739, 1, 0, 0, 0, 741, 742, 1, 0, 0, 0, 742, 745, 1, 0, 0, 0, 743, 741, 1, 0, 0, 0, 744, 736, 1, 0, 0, 0, 744, 745, 1, 0, 0, 0, 745, 746, 1, 0, 0, 0, 746, 747, 5, 91, 0, 0, 747, 107, 1, 0, 0, 0, 748, 749, 7, 6, 0, 0, 749, 109, 1, 0, 0, 0, 750, 751, 5, 99, 0, 0, 751, 111, 1, 0, 0, 0, 49, 121, 135, 145, 157, 176, 184, 191, 204, 212, 239, 263, 273, 279, 308, 314, 319, 332, 340, 353, 358, 371, 384, 399, 402, 409, 417, 457, 465, 477, 491, 501, 519, 531, 540, 577, 596, 598, 609, 624, 640, 654, 664, 673, 702, 716, 724, 727, 741, 744] \ No newline at end of file diff --git a/src/capability-language/generated/QuixosCapability.tokens b/src/capability-language/generated/QuixosCapability.tokens index 22f078e..a2f4274 100644 --- a/src/capability-language/generated/QuixosCapability.tokens +++ b/src/capability-language/generated/QuixosCapability.tokens @@ -1,193 +1,197 @@ WORKSPACE=1 -ATOM=2 -INTERFACE=3 -INTERFACES=4 -PACKAGE=5 -VALUE=6 -RELATION=7 -OPERATION=8 -FUNCTION=9 -CONSTRUCTOR=10 -CONSTRUCTS=11 -CONFORM=12 -AS=13 -BIND=14 -TO=15 -PRIVATE=16 -SHARED=17 -STATE=18 -EDGE=19 -PROJECTION=20 -WITH=21 -USING=22 -VIA=23 -MATERIALIZE=24 -IF=25 -ABSENT=26 -ON=27 -POLICY=28 -DEFAULT=29 -SOURCE=30 -REPOSITORY=31 -COMMIT=32 -REVISION=33 -ID=34 -DOC=35 -MODE=36 -EMITS=37 -RECEIVER=38 -REQUIRES=39 -ANY=40 -GET=41 -SET=42 -WATCH=43 -START=44 -STOP=45 -READ=46 -WRITE=47 -RESOLVE=48 -CONNECT=49 -DISCONNECT=50 -CALL=51 -WATCH_START=52 -WATCH_STOP=53 -SUBSCRIBE=54 -UNSUBSCRIBE=55 -OPTIMISTIC_REGISTER=56 -CRDT=57 -OPTIONAL_ONE=58 -EXACTLY_ONE=59 -MANY_UNIQUE=60 -MANY=61 -ORDERED=62 -UNIT=63 -WATCH_HANDLE=64 -MESSAGE=65 -ATOM_REF=66 -INTERFACE_REF=67 -OPTIONAL=68 -LIST=69 -BOOL=70 -BYTES=71 -DOUBLE=72 -INT32=73 -INT64=74 -STRING=75 -UINT32=76 -UINT64=77 -TRUE=78 -FALSE=79 -NULL=80 -ARROW=81 -COLON=82 -SEMI=83 -COMMA=84 -DOT=85 -LBRACE=86 -RBRACE=87 -LBRACK=88 -RBRACK=89 -LPAREN=90 -RPAREN=91 -LT=92 -GT=93 -INTEGER=94 -JSON_NUMBER=95 -IDENTIFIER=96 -STRING_LITERAL=97 -LINE_COMMENT=98 -BLOCK_COMMENT=99 -WS=100 +IMPORT=2 +EXTERNAL=3 +ATOM=4 +INTERFACE=5 +INTERFACES=6 +PACKAGE=7 +VALUE=8 +RELATION=9 +OPERATION=10 +FUNCTION=11 +CONSTRUCTOR=12 +CONSTRUCTS=13 +CONFORM=14 +AS=15 +BIND=16 +TO=17 +PRIVATE=18 +SHARED=19 +STATE=20 +EDGE=21 +PROJECTION=22 +WITH=23 +USING=24 +VIA=25 +MATERIALIZE=26 +IF=27 +ABSENT=28 +ON=29 +POLICY=30 +DEFAULT=31 +SOURCE=32 +REPOSITORY=33 +COMMIT=34 +REVISION=35 +ID=36 +DOC=37 +MODE=38 +EMITS=39 +RECEIVER=40 +REQUIRES=41 +ANY=42 +GET=43 +SET=44 +WATCH=45 +START=46 +STOP=47 +READ=48 +WRITE=49 +RESOLVE=50 +CONNECT=51 +DISCONNECT=52 +CALL=53 +WATCH_START=54 +WATCH_STOP=55 +SUBSCRIBE=56 +UNSUBSCRIBE=57 +OPTIMISTIC_REGISTER=58 +CRDT=59 +OPTIONAL_ONE=60 +EXACTLY_ONE=61 +MANY_UNIQUE=62 +MANY=63 +ORDERED=64 +UNIT=65 +WATCH_HANDLE=66 +MESSAGE=67 +ATOM_REF=68 +INTERFACE_REF=69 +OPTIONAL=70 +LIST=71 +BOOL=72 +BYTES=73 +DOUBLE=74 +INT32=75 +INT64=76 +STRING=77 +UINT32=78 +UINT64=79 +TRUE=80 +FALSE=81 +NULL=82 +ARROW=83 +COLON=84 +SEMI=85 +COMMA=86 +DOT=87 +LBRACE=88 +RBRACE=89 +LBRACK=90 +RBRACK=91 +LPAREN=92 +RPAREN=93 +LT=94 +GT=95 +INTEGER=96 +JSON_NUMBER=97 +IDENTIFIER=98 +STRING_LITERAL=99 +LINE_COMMENT=100 +BLOCK_COMMENT=101 +WS=102 'workspace'=1 -'atom'=2 -'interface'=3 -'interfaces'=4 -'package'=5 -'value'=6 -'relation'=7 -'operation'=8 -'function'=9 -'constructor'=10 -'constructs'=11 -'conform'=12 -'as'=13 -'bind'=14 -'to'=15 -'private'=16 -'shared'=17 -'state'=18 -'edge'=19 -'projection'=20 -'with'=21 -'using'=22 -'via'=23 -'materialize'=24 -'if'=25 -'absent'=26 -'on'=27 -'policy'=28 -'default'=29 -'source'=30 -'repository'=31 -'commit'=32 -'revision'=33 -'id'=34 -'doc'=35 -'mode'=36 -'emits'=37 -'receiver'=38 -'requires'=39 -'any'=40 -'get'=41 -'set'=42 -'watch'=43 -'start'=44 -'stop'=45 -'read'=46 -'write'=47 -'resolve'=48 -'connect'=49 -'disconnect'=50 -'call'=51 -'watch-start'=52 -'watch-stop'=53 -'subscribe'=54 -'unsubscribe'=55 -'optimistic-register'=56 -'crdt'=57 -'optional-one'=58 -'exactly-one'=59 -'many-unique'=60 -'many'=61 -'ordered'=62 -'unit'=63 -'watch-handle'=64 -'message'=65 -'atom-ref'=66 -'interface-ref'=67 -'optional'=68 -'list'=69 -'bool'=70 -'bytes'=71 -'double'=72 -'int32'=73 -'int64'=74 -'string'=75 -'uint32'=76 -'uint64'=77 -'true'=78 -'false'=79 -'null'=80 -'->'=81 -':'=82 -';'=83 -','=84 -'.'=85 -'{'=86 -'}'=87 -'['=88 -']'=89 -'('=90 -')'=91 -'<'=92 -'>'=93 +'import'=2 +'external'=3 +'atom'=4 +'interface'=5 +'interfaces'=6 +'package'=7 +'value'=8 +'relation'=9 +'operation'=10 +'function'=11 +'constructor'=12 +'constructs'=13 +'conform'=14 +'as'=15 +'bind'=16 +'to'=17 +'private'=18 +'shared'=19 +'state'=20 +'edge'=21 +'projection'=22 +'with'=23 +'using'=24 +'via'=25 +'materialize'=26 +'if'=27 +'absent'=28 +'on'=29 +'policy'=30 +'default'=31 +'source'=32 +'repository'=33 +'commit'=34 +'revision'=35 +'id'=36 +'doc'=37 +'mode'=38 +'emits'=39 +'receiver'=40 +'requires'=41 +'any'=42 +'get'=43 +'set'=44 +'watch'=45 +'start'=46 +'stop'=47 +'read'=48 +'write'=49 +'resolve'=50 +'connect'=51 +'disconnect'=52 +'call'=53 +'watch-start'=54 +'watch-stop'=55 +'subscribe'=56 +'unsubscribe'=57 +'optimistic-register'=58 +'crdt'=59 +'optional-one'=60 +'exactly-one'=61 +'many-unique'=62 +'many'=63 +'ordered'=64 +'unit'=65 +'watch-handle'=66 +'message'=67 +'atom-ref'=68 +'interface-ref'=69 +'optional'=70 +'list'=71 +'bool'=72 +'bytes'=73 +'double'=74 +'int32'=75 +'int64'=76 +'string'=77 +'uint32'=78 +'uint64'=79 +'true'=80 +'false'=81 +'null'=82 +'->'=83 +':'=84 +';'=85 +','=86 +'.'=87 +'{'=88 +'}'=89 +'['=90 +']'=91 +'('=92 +')'=93 +'<'=94 +'>'=95 diff --git a/src/capability-language/generated/QuixosCapabilityLexer.interp b/src/capability-language/generated/QuixosCapabilityLexer.interp index cd06e15..c4e5faf 100644 --- a/src/capability-language/generated/QuixosCapabilityLexer.interp +++ b/src/capability-language/generated/QuixosCapabilityLexer.interp @@ -1,6 +1,8 @@ token literal names: null 'workspace' +'import' +'external' 'atom' 'interface' 'interfaces' @@ -104,6 +106,8 @@ null token symbolic names: null WORKSPACE +IMPORT +EXTERNAL ATOM INTERFACE INTERFACES @@ -206,6 +210,8 @@ WS rule names: WORKSPACE +IMPORT +EXTERNAL ATOM INTERFACE INTERFACES @@ -316,4 +322,4 @@ mode names: DEFAULT_MODE atn: -[4, 0, 100, 937, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 82, 1, 82, 1, 83, 1, 83, 1, 84, 1, 84, 1, 85, 1, 85, 1, 86, 1, 86, 1, 87, 1, 87, 1, 88, 1, 88, 1, 89, 1, 89, 1, 90, 1, 90, 1, 91, 1, 91, 1, 92, 1, 92, 1, 93, 3, 93, 838, 8, 93, 1, 93, 4, 93, 841, 8, 93, 11, 93, 12, 93, 842, 1, 94, 3, 94, 846, 8, 94, 1, 94, 1, 94, 1, 94, 5, 94, 851, 8, 94, 10, 94, 12, 94, 854, 9, 94, 3, 94, 856, 8, 94, 1, 94, 1, 94, 4, 94, 860, 8, 94, 11, 94, 12, 94, 861, 3, 94, 864, 8, 94, 1, 94, 1, 94, 3, 94, 868, 8, 94, 1, 94, 4, 94, 871, 8, 94, 11, 94, 12, 94, 872, 3, 94, 875, 8, 94, 1, 95, 1, 95, 5, 95, 879, 8, 95, 10, 95, 12, 95, 882, 9, 95, 1, 96, 1, 96, 1, 96, 5, 96, 887, 8, 96, 10, 96, 12, 96, 890, 9, 96, 1, 96, 1, 96, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 3, 97, 902, 8, 97, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 99, 5, 99, 910, 8, 99, 10, 99, 12, 99, 913, 9, 99, 1, 99, 1, 99, 1, 100, 1, 100, 1, 100, 1, 100, 5, 100, 921, 8, 100, 10, 100, 12, 100, 924, 9, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 101, 4, 101, 932, 8, 101, 11, 101, 12, 101, 933, 1, 101, 1, 101, 1, 922, 0, 102, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 29, 59, 30, 61, 31, 63, 32, 65, 33, 67, 34, 69, 35, 71, 36, 73, 37, 75, 38, 77, 39, 79, 40, 81, 41, 83, 42, 85, 43, 87, 44, 89, 45, 91, 46, 93, 47, 95, 48, 97, 49, 99, 50, 101, 51, 103, 52, 105, 53, 107, 54, 109, 55, 111, 56, 113, 57, 115, 58, 117, 59, 119, 60, 121, 61, 123, 62, 125, 63, 127, 64, 129, 65, 131, 66, 133, 67, 135, 68, 137, 69, 139, 70, 141, 71, 143, 72, 145, 73, 147, 74, 149, 75, 151, 76, 153, 77, 155, 78, 157, 79, 159, 80, 161, 81, 163, 82, 165, 83, 167, 84, 169, 85, 171, 86, 173, 87, 175, 88, 177, 89, 179, 90, 181, 91, 183, 92, 185, 93, 187, 94, 189, 95, 191, 96, 193, 97, 195, 0, 197, 0, 199, 98, 201, 99, 203, 100, 1, 0, 11, 1, 0, 48, 57, 1, 0, 49, 57, 2, 0, 69, 69, 101, 101, 2, 0, 43, 43, 45, 45, 3, 0, 65, 90, 95, 95, 97, 122, 4, 0, 48, 57, 65, 90, 95, 95, 97, 122, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 8, 0, 34, 34, 47, 47, 92, 92, 98, 98, 102, 102, 110, 110, 114, 114, 116, 116, 3, 0, 48, 57, 65, 70, 97, 102, 2, 0, 10, 10, 13, 13, 3, 0, 9, 10, 13, 13, 32, 32, 951, 0, 1, 1, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, 0, 0, 45, 1, 0, 0, 0, 0, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 53, 1, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 57, 1, 0, 0, 0, 0, 59, 1, 0, 0, 0, 0, 61, 1, 0, 0, 0, 0, 63, 1, 0, 0, 0, 0, 65, 1, 0, 0, 0, 0, 67, 1, 0, 0, 0, 0, 69, 1, 0, 0, 0, 0, 71, 1, 0, 0, 0, 0, 73, 1, 0, 0, 0, 0, 75, 1, 0, 0, 0, 0, 77, 1, 0, 0, 0, 0, 79, 1, 0, 0, 0, 0, 81, 1, 0, 0, 0, 0, 83, 1, 0, 0, 0, 0, 85, 1, 0, 0, 0, 0, 87, 1, 0, 0, 0, 0, 89, 1, 0, 0, 0, 0, 91, 1, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 95, 1, 0, 0, 0, 0, 97, 1, 0, 0, 0, 0, 99, 1, 0, 0, 0, 0, 101, 1, 0, 0, 0, 0, 103, 1, 0, 0, 0, 0, 105, 1, 0, 0, 0, 0, 107, 1, 0, 0, 0, 0, 109, 1, 0, 0, 0, 0, 111, 1, 0, 0, 0, 0, 113, 1, 0, 0, 0, 0, 115, 1, 0, 0, 0, 0, 117, 1, 0, 0, 0, 0, 119, 1, 0, 0, 0, 0, 121, 1, 0, 0, 0, 0, 123, 1, 0, 0, 0, 0, 125, 1, 0, 0, 0, 0, 127, 1, 0, 0, 0, 0, 129, 1, 0, 0, 0, 0, 131, 1, 0, 0, 0, 0, 133, 1, 0, 0, 0, 0, 135, 1, 0, 0, 0, 0, 137, 1, 0, 0, 0, 0, 139, 1, 0, 0, 0, 0, 141, 1, 0, 0, 0, 0, 143, 1, 0, 0, 0, 0, 145, 1, 0, 0, 0, 0, 147, 1, 0, 0, 0, 0, 149, 1, 0, 0, 0, 0, 151, 1, 0, 0, 0, 0, 153, 1, 0, 0, 0, 0, 155, 1, 0, 0, 0, 0, 157, 1, 0, 0, 0, 0, 159, 1, 0, 0, 0, 0, 161, 1, 0, 0, 0, 0, 163, 1, 0, 0, 0, 0, 165, 1, 0, 0, 0, 0, 167, 1, 0, 0, 0, 0, 169, 1, 0, 0, 0, 0, 171, 1, 0, 0, 0, 0, 173, 1, 0, 0, 0, 0, 175, 1, 0, 0, 0, 0, 177, 1, 0, 0, 0, 0, 179, 1, 0, 0, 0, 0, 181, 1, 0, 0, 0, 0, 183, 1, 0, 0, 0, 0, 185, 1, 0, 0, 0, 0, 187, 1, 0, 0, 0, 0, 189, 1, 0, 0, 0, 0, 191, 1, 0, 0, 0, 0, 193, 1, 0, 0, 0, 0, 199, 1, 0, 0, 0, 0, 201, 1, 0, 0, 0, 0, 203, 1, 0, 0, 0, 1, 205, 1, 0, 0, 0, 3, 215, 1, 0, 0, 0, 5, 220, 1, 0, 0, 0, 7, 230, 1, 0, 0, 0, 9, 241, 1, 0, 0, 0, 11, 249, 1, 0, 0, 0, 13, 255, 1, 0, 0, 0, 15, 264, 1, 0, 0, 0, 17, 274, 1, 0, 0, 0, 19, 283, 1, 0, 0, 0, 21, 295, 1, 0, 0, 0, 23, 306, 1, 0, 0, 0, 25, 314, 1, 0, 0, 0, 27, 317, 1, 0, 0, 0, 29, 322, 1, 0, 0, 0, 31, 325, 1, 0, 0, 0, 33, 333, 1, 0, 0, 0, 35, 340, 1, 0, 0, 0, 37, 346, 1, 0, 0, 0, 39, 351, 1, 0, 0, 0, 41, 362, 1, 0, 0, 0, 43, 367, 1, 0, 0, 0, 45, 373, 1, 0, 0, 0, 47, 377, 1, 0, 0, 0, 49, 389, 1, 0, 0, 0, 51, 392, 1, 0, 0, 0, 53, 399, 1, 0, 0, 0, 55, 402, 1, 0, 0, 0, 57, 409, 1, 0, 0, 0, 59, 417, 1, 0, 0, 0, 61, 424, 1, 0, 0, 0, 63, 435, 1, 0, 0, 0, 65, 442, 1, 0, 0, 0, 67, 451, 1, 0, 0, 0, 69, 454, 1, 0, 0, 0, 71, 458, 1, 0, 0, 0, 73, 463, 1, 0, 0, 0, 75, 469, 1, 0, 0, 0, 77, 478, 1, 0, 0, 0, 79, 487, 1, 0, 0, 0, 81, 491, 1, 0, 0, 0, 83, 495, 1, 0, 0, 0, 85, 499, 1, 0, 0, 0, 87, 505, 1, 0, 0, 0, 89, 511, 1, 0, 0, 0, 91, 516, 1, 0, 0, 0, 93, 521, 1, 0, 0, 0, 95, 527, 1, 0, 0, 0, 97, 535, 1, 0, 0, 0, 99, 543, 1, 0, 0, 0, 101, 554, 1, 0, 0, 0, 103, 559, 1, 0, 0, 0, 105, 571, 1, 0, 0, 0, 107, 582, 1, 0, 0, 0, 109, 592, 1, 0, 0, 0, 111, 604, 1, 0, 0, 0, 113, 624, 1, 0, 0, 0, 115, 629, 1, 0, 0, 0, 117, 642, 1, 0, 0, 0, 119, 654, 1, 0, 0, 0, 121, 666, 1, 0, 0, 0, 123, 671, 1, 0, 0, 0, 125, 679, 1, 0, 0, 0, 127, 684, 1, 0, 0, 0, 129, 697, 1, 0, 0, 0, 131, 705, 1, 0, 0, 0, 133, 714, 1, 0, 0, 0, 135, 728, 1, 0, 0, 0, 137, 737, 1, 0, 0, 0, 139, 742, 1, 0, 0, 0, 141, 747, 1, 0, 0, 0, 143, 753, 1, 0, 0, 0, 145, 760, 1, 0, 0, 0, 147, 766, 1, 0, 0, 0, 149, 772, 1, 0, 0, 0, 151, 779, 1, 0, 0, 0, 153, 786, 1, 0, 0, 0, 155, 793, 1, 0, 0, 0, 157, 798, 1, 0, 0, 0, 159, 804, 1, 0, 0, 0, 161, 809, 1, 0, 0, 0, 163, 812, 1, 0, 0, 0, 165, 814, 1, 0, 0, 0, 167, 816, 1, 0, 0, 0, 169, 818, 1, 0, 0, 0, 171, 820, 1, 0, 0, 0, 173, 822, 1, 0, 0, 0, 175, 824, 1, 0, 0, 0, 177, 826, 1, 0, 0, 0, 179, 828, 1, 0, 0, 0, 181, 830, 1, 0, 0, 0, 183, 832, 1, 0, 0, 0, 185, 834, 1, 0, 0, 0, 187, 837, 1, 0, 0, 0, 189, 845, 1, 0, 0, 0, 191, 876, 1, 0, 0, 0, 193, 883, 1, 0, 0, 0, 195, 893, 1, 0, 0, 0, 197, 903, 1, 0, 0, 0, 199, 905, 1, 0, 0, 0, 201, 916, 1, 0, 0, 0, 203, 931, 1, 0, 0, 0, 205, 206, 5, 119, 0, 0, 206, 207, 5, 111, 0, 0, 207, 208, 5, 114, 0, 0, 208, 209, 5, 107, 0, 0, 209, 210, 5, 115, 0, 0, 210, 211, 5, 112, 0, 0, 211, 212, 5, 97, 0, 0, 212, 213, 5, 99, 0, 0, 213, 214, 5, 101, 0, 0, 214, 2, 1, 0, 0, 0, 215, 216, 5, 97, 0, 0, 216, 217, 5, 116, 0, 0, 217, 218, 5, 111, 0, 0, 218, 219, 5, 109, 0, 0, 219, 4, 1, 0, 0, 0, 220, 221, 5, 105, 0, 0, 221, 222, 5, 110, 0, 0, 222, 223, 5, 116, 0, 0, 223, 224, 5, 101, 0, 0, 224, 225, 5, 114, 0, 0, 225, 226, 5, 102, 0, 0, 226, 227, 5, 97, 0, 0, 227, 228, 5, 99, 0, 0, 228, 229, 5, 101, 0, 0, 229, 6, 1, 0, 0, 0, 230, 231, 5, 105, 0, 0, 231, 232, 5, 110, 0, 0, 232, 233, 5, 116, 0, 0, 233, 234, 5, 101, 0, 0, 234, 235, 5, 114, 0, 0, 235, 236, 5, 102, 0, 0, 236, 237, 5, 97, 0, 0, 237, 238, 5, 99, 0, 0, 238, 239, 5, 101, 0, 0, 239, 240, 5, 115, 0, 0, 240, 8, 1, 0, 0, 0, 241, 242, 5, 112, 0, 0, 242, 243, 5, 97, 0, 0, 243, 244, 5, 99, 0, 0, 244, 245, 5, 107, 0, 0, 245, 246, 5, 97, 0, 0, 246, 247, 5, 103, 0, 0, 247, 248, 5, 101, 0, 0, 248, 10, 1, 0, 0, 0, 249, 250, 5, 118, 0, 0, 250, 251, 5, 97, 0, 0, 251, 252, 5, 108, 0, 0, 252, 253, 5, 117, 0, 0, 253, 254, 5, 101, 0, 0, 254, 12, 1, 0, 0, 0, 255, 256, 5, 114, 0, 0, 256, 257, 5, 101, 0, 0, 257, 258, 5, 108, 0, 0, 258, 259, 5, 97, 0, 0, 259, 260, 5, 116, 0, 0, 260, 261, 5, 105, 0, 0, 261, 262, 5, 111, 0, 0, 262, 263, 5, 110, 0, 0, 263, 14, 1, 0, 0, 0, 264, 265, 5, 111, 0, 0, 265, 266, 5, 112, 0, 0, 266, 267, 5, 101, 0, 0, 267, 268, 5, 114, 0, 0, 268, 269, 5, 97, 0, 0, 269, 270, 5, 116, 0, 0, 270, 271, 5, 105, 0, 0, 271, 272, 5, 111, 0, 0, 272, 273, 5, 110, 0, 0, 273, 16, 1, 0, 0, 0, 274, 275, 5, 102, 0, 0, 275, 276, 5, 117, 0, 0, 276, 277, 5, 110, 0, 0, 277, 278, 5, 99, 0, 0, 278, 279, 5, 116, 0, 0, 279, 280, 5, 105, 0, 0, 280, 281, 5, 111, 0, 0, 281, 282, 5, 110, 0, 0, 282, 18, 1, 0, 0, 0, 283, 284, 5, 99, 0, 0, 284, 285, 5, 111, 0, 0, 285, 286, 5, 110, 0, 0, 286, 287, 5, 115, 0, 0, 287, 288, 5, 116, 0, 0, 288, 289, 5, 114, 0, 0, 289, 290, 5, 117, 0, 0, 290, 291, 5, 99, 0, 0, 291, 292, 5, 116, 0, 0, 292, 293, 5, 111, 0, 0, 293, 294, 5, 114, 0, 0, 294, 20, 1, 0, 0, 0, 295, 296, 5, 99, 0, 0, 296, 297, 5, 111, 0, 0, 297, 298, 5, 110, 0, 0, 298, 299, 5, 115, 0, 0, 299, 300, 5, 116, 0, 0, 300, 301, 5, 114, 0, 0, 301, 302, 5, 117, 0, 0, 302, 303, 5, 99, 0, 0, 303, 304, 5, 116, 0, 0, 304, 305, 5, 115, 0, 0, 305, 22, 1, 0, 0, 0, 306, 307, 5, 99, 0, 0, 307, 308, 5, 111, 0, 0, 308, 309, 5, 110, 0, 0, 309, 310, 5, 102, 0, 0, 310, 311, 5, 111, 0, 0, 311, 312, 5, 114, 0, 0, 312, 313, 5, 109, 0, 0, 313, 24, 1, 0, 0, 0, 314, 315, 5, 97, 0, 0, 315, 316, 5, 115, 0, 0, 316, 26, 1, 0, 0, 0, 317, 318, 5, 98, 0, 0, 318, 319, 5, 105, 0, 0, 319, 320, 5, 110, 0, 0, 320, 321, 5, 100, 0, 0, 321, 28, 1, 0, 0, 0, 322, 323, 5, 116, 0, 0, 323, 324, 5, 111, 0, 0, 324, 30, 1, 0, 0, 0, 325, 326, 5, 112, 0, 0, 326, 327, 5, 114, 0, 0, 327, 328, 5, 105, 0, 0, 328, 329, 5, 118, 0, 0, 329, 330, 5, 97, 0, 0, 330, 331, 5, 116, 0, 0, 331, 332, 5, 101, 0, 0, 332, 32, 1, 0, 0, 0, 333, 334, 5, 115, 0, 0, 334, 335, 5, 104, 0, 0, 335, 336, 5, 97, 0, 0, 336, 337, 5, 114, 0, 0, 337, 338, 5, 101, 0, 0, 338, 339, 5, 100, 0, 0, 339, 34, 1, 0, 0, 0, 340, 341, 5, 115, 0, 0, 341, 342, 5, 116, 0, 0, 342, 343, 5, 97, 0, 0, 343, 344, 5, 116, 0, 0, 344, 345, 5, 101, 0, 0, 345, 36, 1, 0, 0, 0, 346, 347, 5, 101, 0, 0, 347, 348, 5, 100, 0, 0, 348, 349, 5, 103, 0, 0, 349, 350, 5, 101, 0, 0, 350, 38, 1, 0, 0, 0, 351, 352, 5, 112, 0, 0, 352, 353, 5, 114, 0, 0, 353, 354, 5, 111, 0, 0, 354, 355, 5, 106, 0, 0, 355, 356, 5, 101, 0, 0, 356, 357, 5, 99, 0, 0, 357, 358, 5, 116, 0, 0, 358, 359, 5, 105, 0, 0, 359, 360, 5, 111, 0, 0, 360, 361, 5, 110, 0, 0, 361, 40, 1, 0, 0, 0, 362, 363, 5, 119, 0, 0, 363, 364, 5, 105, 0, 0, 364, 365, 5, 116, 0, 0, 365, 366, 5, 104, 0, 0, 366, 42, 1, 0, 0, 0, 367, 368, 5, 117, 0, 0, 368, 369, 5, 115, 0, 0, 369, 370, 5, 105, 0, 0, 370, 371, 5, 110, 0, 0, 371, 372, 5, 103, 0, 0, 372, 44, 1, 0, 0, 0, 373, 374, 5, 118, 0, 0, 374, 375, 5, 105, 0, 0, 375, 376, 5, 97, 0, 0, 376, 46, 1, 0, 0, 0, 377, 378, 5, 109, 0, 0, 378, 379, 5, 97, 0, 0, 379, 380, 5, 116, 0, 0, 380, 381, 5, 101, 0, 0, 381, 382, 5, 114, 0, 0, 382, 383, 5, 105, 0, 0, 383, 384, 5, 97, 0, 0, 384, 385, 5, 108, 0, 0, 385, 386, 5, 105, 0, 0, 386, 387, 5, 122, 0, 0, 387, 388, 5, 101, 0, 0, 388, 48, 1, 0, 0, 0, 389, 390, 5, 105, 0, 0, 390, 391, 5, 102, 0, 0, 391, 50, 1, 0, 0, 0, 392, 393, 5, 97, 0, 0, 393, 394, 5, 98, 0, 0, 394, 395, 5, 115, 0, 0, 395, 396, 5, 101, 0, 0, 396, 397, 5, 110, 0, 0, 397, 398, 5, 116, 0, 0, 398, 52, 1, 0, 0, 0, 399, 400, 5, 111, 0, 0, 400, 401, 5, 110, 0, 0, 401, 54, 1, 0, 0, 0, 402, 403, 5, 112, 0, 0, 403, 404, 5, 111, 0, 0, 404, 405, 5, 108, 0, 0, 405, 406, 5, 105, 0, 0, 406, 407, 5, 99, 0, 0, 407, 408, 5, 121, 0, 0, 408, 56, 1, 0, 0, 0, 409, 410, 5, 100, 0, 0, 410, 411, 5, 101, 0, 0, 411, 412, 5, 102, 0, 0, 412, 413, 5, 97, 0, 0, 413, 414, 5, 117, 0, 0, 414, 415, 5, 108, 0, 0, 415, 416, 5, 116, 0, 0, 416, 58, 1, 0, 0, 0, 417, 418, 5, 115, 0, 0, 418, 419, 5, 111, 0, 0, 419, 420, 5, 117, 0, 0, 420, 421, 5, 114, 0, 0, 421, 422, 5, 99, 0, 0, 422, 423, 5, 101, 0, 0, 423, 60, 1, 0, 0, 0, 424, 425, 5, 114, 0, 0, 425, 426, 5, 101, 0, 0, 426, 427, 5, 112, 0, 0, 427, 428, 5, 111, 0, 0, 428, 429, 5, 115, 0, 0, 429, 430, 5, 105, 0, 0, 430, 431, 5, 116, 0, 0, 431, 432, 5, 111, 0, 0, 432, 433, 5, 114, 0, 0, 433, 434, 5, 121, 0, 0, 434, 62, 1, 0, 0, 0, 435, 436, 5, 99, 0, 0, 436, 437, 5, 111, 0, 0, 437, 438, 5, 109, 0, 0, 438, 439, 5, 109, 0, 0, 439, 440, 5, 105, 0, 0, 440, 441, 5, 116, 0, 0, 441, 64, 1, 0, 0, 0, 442, 443, 5, 114, 0, 0, 443, 444, 5, 101, 0, 0, 444, 445, 5, 118, 0, 0, 445, 446, 5, 105, 0, 0, 446, 447, 5, 115, 0, 0, 447, 448, 5, 105, 0, 0, 448, 449, 5, 111, 0, 0, 449, 450, 5, 110, 0, 0, 450, 66, 1, 0, 0, 0, 451, 452, 5, 105, 0, 0, 452, 453, 5, 100, 0, 0, 453, 68, 1, 0, 0, 0, 454, 455, 5, 100, 0, 0, 455, 456, 5, 111, 0, 0, 456, 457, 5, 99, 0, 0, 457, 70, 1, 0, 0, 0, 458, 459, 5, 109, 0, 0, 459, 460, 5, 111, 0, 0, 460, 461, 5, 100, 0, 0, 461, 462, 5, 101, 0, 0, 462, 72, 1, 0, 0, 0, 463, 464, 5, 101, 0, 0, 464, 465, 5, 109, 0, 0, 465, 466, 5, 105, 0, 0, 466, 467, 5, 116, 0, 0, 467, 468, 5, 115, 0, 0, 468, 74, 1, 0, 0, 0, 469, 470, 5, 114, 0, 0, 470, 471, 5, 101, 0, 0, 471, 472, 5, 99, 0, 0, 472, 473, 5, 101, 0, 0, 473, 474, 5, 105, 0, 0, 474, 475, 5, 118, 0, 0, 475, 476, 5, 101, 0, 0, 476, 477, 5, 114, 0, 0, 477, 76, 1, 0, 0, 0, 478, 479, 5, 114, 0, 0, 479, 480, 5, 101, 0, 0, 480, 481, 5, 113, 0, 0, 481, 482, 5, 117, 0, 0, 482, 483, 5, 105, 0, 0, 483, 484, 5, 114, 0, 0, 484, 485, 5, 101, 0, 0, 485, 486, 5, 115, 0, 0, 486, 78, 1, 0, 0, 0, 487, 488, 5, 97, 0, 0, 488, 489, 5, 110, 0, 0, 489, 490, 5, 121, 0, 0, 490, 80, 1, 0, 0, 0, 491, 492, 5, 103, 0, 0, 492, 493, 5, 101, 0, 0, 493, 494, 5, 116, 0, 0, 494, 82, 1, 0, 0, 0, 495, 496, 5, 115, 0, 0, 496, 497, 5, 101, 0, 0, 497, 498, 5, 116, 0, 0, 498, 84, 1, 0, 0, 0, 499, 500, 5, 119, 0, 0, 500, 501, 5, 97, 0, 0, 501, 502, 5, 116, 0, 0, 502, 503, 5, 99, 0, 0, 503, 504, 5, 104, 0, 0, 504, 86, 1, 0, 0, 0, 505, 506, 5, 115, 0, 0, 506, 507, 5, 116, 0, 0, 507, 508, 5, 97, 0, 0, 508, 509, 5, 114, 0, 0, 509, 510, 5, 116, 0, 0, 510, 88, 1, 0, 0, 0, 511, 512, 5, 115, 0, 0, 512, 513, 5, 116, 0, 0, 513, 514, 5, 111, 0, 0, 514, 515, 5, 112, 0, 0, 515, 90, 1, 0, 0, 0, 516, 517, 5, 114, 0, 0, 517, 518, 5, 101, 0, 0, 518, 519, 5, 97, 0, 0, 519, 520, 5, 100, 0, 0, 520, 92, 1, 0, 0, 0, 521, 522, 5, 119, 0, 0, 522, 523, 5, 114, 0, 0, 523, 524, 5, 105, 0, 0, 524, 525, 5, 116, 0, 0, 525, 526, 5, 101, 0, 0, 526, 94, 1, 0, 0, 0, 527, 528, 5, 114, 0, 0, 528, 529, 5, 101, 0, 0, 529, 530, 5, 115, 0, 0, 530, 531, 5, 111, 0, 0, 531, 532, 5, 108, 0, 0, 532, 533, 5, 118, 0, 0, 533, 534, 5, 101, 0, 0, 534, 96, 1, 0, 0, 0, 535, 536, 5, 99, 0, 0, 536, 537, 5, 111, 0, 0, 537, 538, 5, 110, 0, 0, 538, 539, 5, 110, 0, 0, 539, 540, 5, 101, 0, 0, 540, 541, 5, 99, 0, 0, 541, 542, 5, 116, 0, 0, 542, 98, 1, 0, 0, 0, 543, 544, 5, 100, 0, 0, 544, 545, 5, 105, 0, 0, 545, 546, 5, 115, 0, 0, 546, 547, 5, 99, 0, 0, 547, 548, 5, 111, 0, 0, 548, 549, 5, 110, 0, 0, 549, 550, 5, 110, 0, 0, 550, 551, 5, 101, 0, 0, 551, 552, 5, 99, 0, 0, 552, 553, 5, 116, 0, 0, 553, 100, 1, 0, 0, 0, 554, 555, 5, 99, 0, 0, 555, 556, 5, 97, 0, 0, 556, 557, 5, 108, 0, 0, 557, 558, 5, 108, 0, 0, 558, 102, 1, 0, 0, 0, 559, 560, 5, 119, 0, 0, 560, 561, 5, 97, 0, 0, 561, 562, 5, 116, 0, 0, 562, 563, 5, 99, 0, 0, 563, 564, 5, 104, 0, 0, 564, 565, 5, 45, 0, 0, 565, 566, 5, 115, 0, 0, 566, 567, 5, 116, 0, 0, 567, 568, 5, 97, 0, 0, 568, 569, 5, 114, 0, 0, 569, 570, 5, 116, 0, 0, 570, 104, 1, 0, 0, 0, 571, 572, 5, 119, 0, 0, 572, 573, 5, 97, 0, 0, 573, 574, 5, 116, 0, 0, 574, 575, 5, 99, 0, 0, 575, 576, 5, 104, 0, 0, 576, 577, 5, 45, 0, 0, 577, 578, 5, 115, 0, 0, 578, 579, 5, 116, 0, 0, 579, 580, 5, 111, 0, 0, 580, 581, 5, 112, 0, 0, 581, 106, 1, 0, 0, 0, 582, 583, 5, 115, 0, 0, 583, 584, 5, 117, 0, 0, 584, 585, 5, 98, 0, 0, 585, 586, 5, 115, 0, 0, 586, 587, 5, 99, 0, 0, 587, 588, 5, 114, 0, 0, 588, 589, 5, 105, 0, 0, 589, 590, 5, 98, 0, 0, 590, 591, 5, 101, 0, 0, 591, 108, 1, 0, 0, 0, 592, 593, 5, 117, 0, 0, 593, 594, 5, 110, 0, 0, 594, 595, 5, 115, 0, 0, 595, 596, 5, 117, 0, 0, 596, 597, 5, 98, 0, 0, 597, 598, 5, 115, 0, 0, 598, 599, 5, 99, 0, 0, 599, 600, 5, 114, 0, 0, 600, 601, 5, 105, 0, 0, 601, 602, 5, 98, 0, 0, 602, 603, 5, 101, 0, 0, 603, 110, 1, 0, 0, 0, 604, 605, 5, 111, 0, 0, 605, 606, 5, 112, 0, 0, 606, 607, 5, 116, 0, 0, 607, 608, 5, 105, 0, 0, 608, 609, 5, 109, 0, 0, 609, 610, 5, 105, 0, 0, 610, 611, 5, 115, 0, 0, 611, 612, 5, 116, 0, 0, 612, 613, 5, 105, 0, 0, 613, 614, 5, 99, 0, 0, 614, 615, 5, 45, 0, 0, 615, 616, 5, 114, 0, 0, 616, 617, 5, 101, 0, 0, 617, 618, 5, 103, 0, 0, 618, 619, 5, 105, 0, 0, 619, 620, 5, 115, 0, 0, 620, 621, 5, 116, 0, 0, 621, 622, 5, 101, 0, 0, 622, 623, 5, 114, 0, 0, 623, 112, 1, 0, 0, 0, 624, 625, 5, 99, 0, 0, 625, 626, 5, 114, 0, 0, 626, 627, 5, 100, 0, 0, 627, 628, 5, 116, 0, 0, 628, 114, 1, 0, 0, 0, 629, 630, 5, 111, 0, 0, 630, 631, 5, 112, 0, 0, 631, 632, 5, 116, 0, 0, 632, 633, 5, 105, 0, 0, 633, 634, 5, 111, 0, 0, 634, 635, 5, 110, 0, 0, 635, 636, 5, 97, 0, 0, 636, 637, 5, 108, 0, 0, 637, 638, 5, 45, 0, 0, 638, 639, 5, 111, 0, 0, 639, 640, 5, 110, 0, 0, 640, 641, 5, 101, 0, 0, 641, 116, 1, 0, 0, 0, 642, 643, 5, 101, 0, 0, 643, 644, 5, 120, 0, 0, 644, 645, 5, 97, 0, 0, 645, 646, 5, 99, 0, 0, 646, 647, 5, 116, 0, 0, 647, 648, 5, 108, 0, 0, 648, 649, 5, 121, 0, 0, 649, 650, 5, 45, 0, 0, 650, 651, 5, 111, 0, 0, 651, 652, 5, 110, 0, 0, 652, 653, 5, 101, 0, 0, 653, 118, 1, 0, 0, 0, 654, 655, 5, 109, 0, 0, 655, 656, 5, 97, 0, 0, 656, 657, 5, 110, 0, 0, 657, 658, 5, 121, 0, 0, 658, 659, 5, 45, 0, 0, 659, 660, 5, 117, 0, 0, 660, 661, 5, 110, 0, 0, 661, 662, 5, 105, 0, 0, 662, 663, 5, 113, 0, 0, 663, 664, 5, 117, 0, 0, 664, 665, 5, 101, 0, 0, 665, 120, 1, 0, 0, 0, 666, 667, 5, 109, 0, 0, 667, 668, 5, 97, 0, 0, 668, 669, 5, 110, 0, 0, 669, 670, 5, 121, 0, 0, 670, 122, 1, 0, 0, 0, 671, 672, 5, 111, 0, 0, 672, 673, 5, 114, 0, 0, 673, 674, 5, 100, 0, 0, 674, 675, 5, 101, 0, 0, 675, 676, 5, 114, 0, 0, 676, 677, 5, 101, 0, 0, 677, 678, 5, 100, 0, 0, 678, 124, 1, 0, 0, 0, 679, 680, 5, 117, 0, 0, 680, 681, 5, 110, 0, 0, 681, 682, 5, 105, 0, 0, 682, 683, 5, 116, 0, 0, 683, 126, 1, 0, 0, 0, 684, 685, 5, 119, 0, 0, 685, 686, 5, 97, 0, 0, 686, 687, 5, 116, 0, 0, 687, 688, 5, 99, 0, 0, 688, 689, 5, 104, 0, 0, 689, 690, 5, 45, 0, 0, 690, 691, 5, 104, 0, 0, 691, 692, 5, 97, 0, 0, 692, 693, 5, 110, 0, 0, 693, 694, 5, 100, 0, 0, 694, 695, 5, 108, 0, 0, 695, 696, 5, 101, 0, 0, 696, 128, 1, 0, 0, 0, 697, 698, 5, 109, 0, 0, 698, 699, 5, 101, 0, 0, 699, 700, 5, 115, 0, 0, 700, 701, 5, 115, 0, 0, 701, 702, 5, 97, 0, 0, 702, 703, 5, 103, 0, 0, 703, 704, 5, 101, 0, 0, 704, 130, 1, 0, 0, 0, 705, 706, 5, 97, 0, 0, 706, 707, 5, 116, 0, 0, 707, 708, 5, 111, 0, 0, 708, 709, 5, 109, 0, 0, 709, 710, 5, 45, 0, 0, 710, 711, 5, 114, 0, 0, 711, 712, 5, 101, 0, 0, 712, 713, 5, 102, 0, 0, 713, 132, 1, 0, 0, 0, 714, 715, 5, 105, 0, 0, 715, 716, 5, 110, 0, 0, 716, 717, 5, 116, 0, 0, 717, 718, 5, 101, 0, 0, 718, 719, 5, 114, 0, 0, 719, 720, 5, 102, 0, 0, 720, 721, 5, 97, 0, 0, 721, 722, 5, 99, 0, 0, 722, 723, 5, 101, 0, 0, 723, 724, 5, 45, 0, 0, 724, 725, 5, 114, 0, 0, 725, 726, 5, 101, 0, 0, 726, 727, 5, 102, 0, 0, 727, 134, 1, 0, 0, 0, 728, 729, 5, 111, 0, 0, 729, 730, 5, 112, 0, 0, 730, 731, 5, 116, 0, 0, 731, 732, 5, 105, 0, 0, 732, 733, 5, 111, 0, 0, 733, 734, 5, 110, 0, 0, 734, 735, 5, 97, 0, 0, 735, 736, 5, 108, 0, 0, 736, 136, 1, 0, 0, 0, 737, 738, 5, 108, 0, 0, 738, 739, 5, 105, 0, 0, 739, 740, 5, 115, 0, 0, 740, 741, 5, 116, 0, 0, 741, 138, 1, 0, 0, 0, 742, 743, 5, 98, 0, 0, 743, 744, 5, 111, 0, 0, 744, 745, 5, 111, 0, 0, 745, 746, 5, 108, 0, 0, 746, 140, 1, 0, 0, 0, 747, 748, 5, 98, 0, 0, 748, 749, 5, 121, 0, 0, 749, 750, 5, 116, 0, 0, 750, 751, 5, 101, 0, 0, 751, 752, 5, 115, 0, 0, 752, 142, 1, 0, 0, 0, 753, 754, 5, 100, 0, 0, 754, 755, 5, 111, 0, 0, 755, 756, 5, 117, 0, 0, 756, 757, 5, 98, 0, 0, 757, 758, 5, 108, 0, 0, 758, 759, 5, 101, 0, 0, 759, 144, 1, 0, 0, 0, 760, 761, 5, 105, 0, 0, 761, 762, 5, 110, 0, 0, 762, 763, 5, 116, 0, 0, 763, 764, 5, 51, 0, 0, 764, 765, 5, 50, 0, 0, 765, 146, 1, 0, 0, 0, 766, 767, 5, 105, 0, 0, 767, 768, 5, 110, 0, 0, 768, 769, 5, 116, 0, 0, 769, 770, 5, 54, 0, 0, 770, 771, 5, 52, 0, 0, 771, 148, 1, 0, 0, 0, 772, 773, 5, 115, 0, 0, 773, 774, 5, 116, 0, 0, 774, 775, 5, 114, 0, 0, 775, 776, 5, 105, 0, 0, 776, 777, 5, 110, 0, 0, 777, 778, 5, 103, 0, 0, 778, 150, 1, 0, 0, 0, 779, 780, 5, 117, 0, 0, 780, 781, 5, 105, 0, 0, 781, 782, 5, 110, 0, 0, 782, 783, 5, 116, 0, 0, 783, 784, 5, 51, 0, 0, 784, 785, 5, 50, 0, 0, 785, 152, 1, 0, 0, 0, 786, 787, 5, 117, 0, 0, 787, 788, 5, 105, 0, 0, 788, 789, 5, 110, 0, 0, 789, 790, 5, 116, 0, 0, 790, 791, 5, 54, 0, 0, 791, 792, 5, 52, 0, 0, 792, 154, 1, 0, 0, 0, 793, 794, 5, 116, 0, 0, 794, 795, 5, 114, 0, 0, 795, 796, 5, 117, 0, 0, 796, 797, 5, 101, 0, 0, 797, 156, 1, 0, 0, 0, 798, 799, 5, 102, 0, 0, 799, 800, 5, 97, 0, 0, 800, 801, 5, 108, 0, 0, 801, 802, 5, 115, 0, 0, 802, 803, 5, 101, 0, 0, 803, 158, 1, 0, 0, 0, 804, 805, 5, 110, 0, 0, 805, 806, 5, 117, 0, 0, 806, 807, 5, 108, 0, 0, 807, 808, 5, 108, 0, 0, 808, 160, 1, 0, 0, 0, 809, 810, 5, 45, 0, 0, 810, 811, 5, 62, 0, 0, 811, 162, 1, 0, 0, 0, 812, 813, 5, 58, 0, 0, 813, 164, 1, 0, 0, 0, 814, 815, 5, 59, 0, 0, 815, 166, 1, 0, 0, 0, 816, 817, 5, 44, 0, 0, 817, 168, 1, 0, 0, 0, 818, 819, 5, 46, 0, 0, 819, 170, 1, 0, 0, 0, 820, 821, 5, 123, 0, 0, 821, 172, 1, 0, 0, 0, 822, 823, 5, 125, 0, 0, 823, 174, 1, 0, 0, 0, 824, 825, 5, 91, 0, 0, 825, 176, 1, 0, 0, 0, 826, 827, 5, 93, 0, 0, 827, 178, 1, 0, 0, 0, 828, 829, 5, 40, 0, 0, 829, 180, 1, 0, 0, 0, 830, 831, 5, 41, 0, 0, 831, 182, 1, 0, 0, 0, 832, 833, 5, 60, 0, 0, 833, 184, 1, 0, 0, 0, 834, 835, 5, 62, 0, 0, 835, 186, 1, 0, 0, 0, 836, 838, 5, 45, 0, 0, 837, 836, 1, 0, 0, 0, 837, 838, 1, 0, 0, 0, 838, 840, 1, 0, 0, 0, 839, 841, 7, 0, 0, 0, 840, 839, 1, 0, 0, 0, 841, 842, 1, 0, 0, 0, 842, 840, 1, 0, 0, 0, 842, 843, 1, 0, 0, 0, 843, 188, 1, 0, 0, 0, 844, 846, 5, 45, 0, 0, 845, 844, 1, 0, 0, 0, 845, 846, 1, 0, 0, 0, 846, 855, 1, 0, 0, 0, 847, 856, 5, 48, 0, 0, 848, 852, 7, 1, 0, 0, 849, 851, 7, 0, 0, 0, 850, 849, 1, 0, 0, 0, 851, 854, 1, 0, 0, 0, 852, 850, 1, 0, 0, 0, 852, 853, 1, 0, 0, 0, 853, 856, 1, 0, 0, 0, 854, 852, 1, 0, 0, 0, 855, 847, 1, 0, 0, 0, 855, 848, 1, 0, 0, 0, 856, 863, 1, 0, 0, 0, 857, 859, 5, 46, 0, 0, 858, 860, 7, 0, 0, 0, 859, 858, 1, 0, 0, 0, 860, 861, 1, 0, 0, 0, 861, 859, 1, 0, 0, 0, 861, 862, 1, 0, 0, 0, 862, 864, 1, 0, 0, 0, 863, 857, 1, 0, 0, 0, 863, 864, 1, 0, 0, 0, 864, 874, 1, 0, 0, 0, 865, 867, 7, 2, 0, 0, 866, 868, 7, 3, 0, 0, 867, 866, 1, 0, 0, 0, 867, 868, 1, 0, 0, 0, 868, 870, 1, 0, 0, 0, 869, 871, 7, 0, 0, 0, 870, 869, 1, 0, 0, 0, 871, 872, 1, 0, 0, 0, 872, 870, 1, 0, 0, 0, 872, 873, 1, 0, 0, 0, 873, 875, 1, 0, 0, 0, 874, 865, 1, 0, 0, 0, 874, 875, 1, 0, 0, 0, 875, 190, 1, 0, 0, 0, 876, 880, 7, 4, 0, 0, 877, 879, 7, 5, 0, 0, 878, 877, 1, 0, 0, 0, 879, 882, 1, 0, 0, 0, 880, 878, 1, 0, 0, 0, 880, 881, 1, 0, 0, 0, 881, 192, 1, 0, 0, 0, 882, 880, 1, 0, 0, 0, 883, 888, 5, 34, 0, 0, 884, 887, 3, 195, 97, 0, 885, 887, 8, 6, 0, 0, 886, 884, 1, 0, 0, 0, 886, 885, 1, 0, 0, 0, 887, 890, 1, 0, 0, 0, 888, 886, 1, 0, 0, 0, 888, 889, 1, 0, 0, 0, 889, 891, 1, 0, 0, 0, 890, 888, 1, 0, 0, 0, 891, 892, 5, 34, 0, 0, 892, 194, 1, 0, 0, 0, 893, 901, 5, 92, 0, 0, 894, 902, 7, 7, 0, 0, 895, 896, 5, 117, 0, 0, 896, 897, 3, 197, 98, 0, 897, 898, 3, 197, 98, 0, 898, 899, 3, 197, 98, 0, 899, 900, 3, 197, 98, 0, 900, 902, 1, 0, 0, 0, 901, 894, 1, 0, 0, 0, 901, 895, 1, 0, 0, 0, 902, 196, 1, 0, 0, 0, 903, 904, 7, 8, 0, 0, 904, 198, 1, 0, 0, 0, 905, 906, 5, 47, 0, 0, 906, 907, 5, 47, 0, 0, 907, 911, 1, 0, 0, 0, 908, 910, 8, 9, 0, 0, 909, 908, 1, 0, 0, 0, 910, 913, 1, 0, 0, 0, 911, 909, 1, 0, 0, 0, 911, 912, 1, 0, 0, 0, 912, 914, 1, 0, 0, 0, 913, 911, 1, 0, 0, 0, 914, 915, 6, 99, 0, 0, 915, 200, 1, 0, 0, 0, 916, 917, 5, 47, 0, 0, 917, 918, 5, 42, 0, 0, 918, 922, 1, 0, 0, 0, 919, 921, 9, 0, 0, 0, 920, 919, 1, 0, 0, 0, 921, 924, 1, 0, 0, 0, 922, 923, 1, 0, 0, 0, 922, 920, 1, 0, 0, 0, 923, 925, 1, 0, 0, 0, 924, 922, 1, 0, 0, 0, 925, 926, 5, 42, 0, 0, 926, 927, 5, 47, 0, 0, 927, 928, 1, 0, 0, 0, 928, 929, 6, 100, 0, 0, 929, 202, 1, 0, 0, 0, 930, 932, 7, 10, 0, 0, 931, 930, 1, 0, 0, 0, 932, 933, 1, 0, 0, 0, 933, 931, 1, 0, 0, 0, 933, 934, 1, 0, 0, 0, 934, 935, 1, 0, 0, 0, 935, 936, 6, 101, 0, 0, 936, 204, 1, 0, 0, 0, 18, 0, 837, 842, 845, 852, 855, 861, 863, 867, 872, 874, 880, 886, 888, 901, 911, 922, 933, 1, 6, 0, 0] \ No newline at end of file +[4, 0, 102, 957, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 84, 1, 84, 1, 85, 1, 85, 1, 86, 1, 86, 1, 87, 1, 87, 1, 88, 1, 88, 1, 89, 1, 89, 1, 90, 1, 90, 1, 91, 1, 91, 1, 92, 1, 92, 1, 93, 1, 93, 1, 94, 1, 94, 1, 95, 3, 95, 858, 8, 95, 1, 95, 4, 95, 861, 8, 95, 11, 95, 12, 95, 862, 1, 96, 3, 96, 866, 8, 96, 1, 96, 1, 96, 1, 96, 5, 96, 871, 8, 96, 10, 96, 12, 96, 874, 9, 96, 3, 96, 876, 8, 96, 1, 96, 1, 96, 4, 96, 880, 8, 96, 11, 96, 12, 96, 881, 3, 96, 884, 8, 96, 1, 96, 1, 96, 3, 96, 888, 8, 96, 1, 96, 4, 96, 891, 8, 96, 11, 96, 12, 96, 892, 3, 96, 895, 8, 96, 1, 97, 1, 97, 5, 97, 899, 8, 97, 10, 97, 12, 97, 902, 9, 97, 1, 98, 1, 98, 1, 98, 5, 98, 907, 8, 98, 10, 98, 12, 98, 910, 9, 98, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 3, 99, 922, 8, 99, 1, 100, 1, 100, 1, 101, 1, 101, 1, 101, 1, 101, 5, 101, 930, 8, 101, 10, 101, 12, 101, 933, 9, 101, 1, 101, 1, 101, 1, 102, 1, 102, 1, 102, 1, 102, 5, 102, 941, 8, 102, 10, 102, 12, 102, 944, 9, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 103, 4, 103, 952, 8, 103, 11, 103, 12, 103, 953, 1, 103, 1, 103, 1, 942, 0, 104, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 29, 59, 30, 61, 31, 63, 32, 65, 33, 67, 34, 69, 35, 71, 36, 73, 37, 75, 38, 77, 39, 79, 40, 81, 41, 83, 42, 85, 43, 87, 44, 89, 45, 91, 46, 93, 47, 95, 48, 97, 49, 99, 50, 101, 51, 103, 52, 105, 53, 107, 54, 109, 55, 111, 56, 113, 57, 115, 58, 117, 59, 119, 60, 121, 61, 123, 62, 125, 63, 127, 64, 129, 65, 131, 66, 133, 67, 135, 68, 137, 69, 139, 70, 141, 71, 143, 72, 145, 73, 147, 74, 149, 75, 151, 76, 153, 77, 155, 78, 157, 79, 159, 80, 161, 81, 163, 82, 165, 83, 167, 84, 169, 85, 171, 86, 173, 87, 175, 88, 177, 89, 179, 90, 181, 91, 183, 92, 185, 93, 187, 94, 189, 95, 191, 96, 193, 97, 195, 98, 197, 99, 199, 0, 201, 0, 203, 100, 205, 101, 207, 102, 1, 0, 11, 1, 0, 48, 57, 1, 0, 49, 57, 2, 0, 69, 69, 101, 101, 2, 0, 43, 43, 45, 45, 3, 0, 65, 90, 95, 95, 97, 122, 4, 0, 48, 57, 65, 90, 95, 95, 97, 122, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 8, 0, 34, 34, 47, 47, 92, 92, 98, 98, 102, 102, 110, 110, 114, 114, 116, 116, 3, 0, 48, 57, 65, 70, 97, 102, 2, 0, 10, 10, 13, 13, 3, 0, 9, 10, 13, 13, 32, 32, 971, 0, 1, 1, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, 0, 0, 45, 1, 0, 0, 0, 0, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 53, 1, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 57, 1, 0, 0, 0, 0, 59, 1, 0, 0, 0, 0, 61, 1, 0, 0, 0, 0, 63, 1, 0, 0, 0, 0, 65, 1, 0, 0, 0, 0, 67, 1, 0, 0, 0, 0, 69, 1, 0, 0, 0, 0, 71, 1, 0, 0, 0, 0, 73, 1, 0, 0, 0, 0, 75, 1, 0, 0, 0, 0, 77, 1, 0, 0, 0, 0, 79, 1, 0, 0, 0, 0, 81, 1, 0, 0, 0, 0, 83, 1, 0, 0, 0, 0, 85, 1, 0, 0, 0, 0, 87, 1, 0, 0, 0, 0, 89, 1, 0, 0, 0, 0, 91, 1, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 95, 1, 0, 0, 0, 0, 97, 1, 0, 0, 0, 0, 99, 1, 0, 0, 0, 0, 101, 1, 0, 0, 0, 0, 103, 1, 0, 0, 0, 0, 105, 1, 0, 0, 0, 0, 107, 1, 0, 0, 0, 0, 109, 1, 0, 0, 0, 0, 111, 1, 0, 0, 0, 0, 113, 1, 0, 0, 0, 0, 115, 1, 0, 0, 0, 0, 117, 1, 0, 0, 0, 0, 119, 1, 0, 0, 0, 0, 121, 1, 0, 0, 0, 0, 123, 1, 0, 0, 0, 0, 125, 1, 0, 0, 0, 0, 127, 1, 0, 0, 0, 0, 129, 1, 0, 0, 0, 0, 131, 1, 0, 0, 0, 0, 133, 1, 0, 0, 0, 0, 135, 1, 0, 0, 0, 0, 137, 1, 0, 0, 0, 0, 139, 1, 0, 0, 0, 0, 141, 1, 0, 0, 0, 0, 143, 1, 0, 0, 0, 0, 145, 1, 0, 0, 0, 0, 147, 1, 0, 0, 0, 0, 149, 1, 0, 0, 0, 0, 151, 1, 0, 0, 0, 0, 153, 1, 0, 0, 0, 0, 155, 1, 0, 0, 0, 0, 157, 1, 0, 0, 0, 0, 159, 1, 0, 0, 0, 0, 161, 1, 0, 0, 0, 0, 163, 1, 0, 0, 0, 0, 165, 1, 0, 0, 0, 0, 167, 1, 0, 0, 0, 0, 169, 1, 0, 0, 0, 0, 171, 1, 0, 0, 0, 0, 173, 1, 0, 0, 0, 0, 175, 1, 0, 0, 0, 0, 177, 1, 0, 0, 0, 0, 179, 1, 0, 0, 0, 0, 181, 1, 0, 0, 0, 0, 183, 1, 0, 0, 0, 0, 185, 1, 0, 0, 0, 0, 187, 1, 0, 0, 0, 0, 189, 1, 0, 0, 0, 0, 191, 1, 0, 0, 0, 0, 193, 1, 0, 0, 0, 0, 195, 1, 0, 0, 0, 0, 197, 1, 0, 0, 0, 0, 203, 1, 0, 0, 0, 0, 205, 1, 0, 0, 0, 0, 207, 1, 0, 0, 0, 1, 209, 1, 0, 0, 0, 3, 219, 1, 0, 0, 0, 5, 226, 1, 0, 0, 0, 7, 235, 1, 0, 0, 0, 9, 240, 1, 0, 0, 0, 11, 250, 1, 0, 0, 0, 13, 261, 1, 0, 0, 0, 15, 269, 1, 0, 0, 0, 17, 275, 1, 0, 0, 0, 19, 284, 1, 0, 0, 0, 21, 294, 1, 0, 0, 0, 23, 303, 1, 0, 0, 0, 25, 315, 1, 0, 0, 0, 27, 326, 1, 0, 0, 0, 29, 334, 1, 0, 0, 0, 31, 337, 1, 0, 0, 0, 33, 342, 1, 0, 0, 0, 35, 345, 1, 0, 0, 0, 37, 353, 1, 0, 0, 0, 39, 360, 1, 0, 0, 0, 41, 366, 1, 0, 0, 0, 43, 371, 1, 0, 0, 0, 45, 382, 1, 0, 0, 0, 47, 387, 1, 0, 0, 0, 49, 393, 1, 0, 0, 0, 51, 397, 1, 0, 0, 0, 53, 409, 1, 0, 0, 0, 55, 412, 1, 0, 0, 0, 57, 419, 1, 0, 0, 0, 59, 422, 1, 0, 0, 0, 61, 429, 1, 0, 0, 0, 63, 437, 1, 0, 0, 0, 65, 444, 1, 0, 0, 0, 67, 455, 1, 0, 0, 0, 69, 462, 1, 0, 0, 0, 71, 471, 1, 0, 0, 0, 73, 474, 1, 0, 0, 0, 75, 478, 1, 0, 0, 0, 77, 483, 1, 0, 0, 0, 79, 489, 1, 0, 0, 0, 81, 498, 1, 0, 0, 0, 83, 507, 1, 0, 0, 0, 85, 511, 1, 0, 0, 0, 87, 515, 1, 0, 0, 0, 89, 519, 1, 0, 0, 0, 91, 525, 1, 0, 0, 0, 93, 531, 1, 0, 0, 0, 95, 536, 1, 0, 0, 0, 97, 541, 1, 0, 0, 0, 99, 547, 1, 0, 0, 0, 101, 555, 1, 0, 0, 0, 103, 563, 1, 0, 0, 0, 105, 574, 1, 0, 0, 0, 107, 579, 1, 0, 0, 0, 109, 591, 1, 0, 0, 0, 111, 602, 1, 0, 0, 0, 113, 612, 1, 0, 0, 0, 115, 624, 1, 0, 0, 0, 117, 644, 1, 0, 0, 0, 119, 649, 1, 0, 0, 0, 121, 662, 1, 0, 0, 0, 123, 674, 1, 0, 0, 0, 125, 686, 1, 0, 0, 0, 127, 691, 1, 0, 0, 0, 129, 699, 1, 0, 0, 0, 131, 704, 1, 0, 0, 0, 133, 717, 1, 0, 0, 0, 135, 725, 1, 0, 0, 0, 137, 734, 1, 0, 0, 0, 139, 748, 1, 0, 0, 0, 141, 757, 1, 0, 0, 0, 143, 762, 1, 0, 0, 0, 145, 767, 1, 0, 0, 0, 147, 773, 1, 0, 0, 0, 149, 780, 1, 0, 0, 0, 151, 786, 1, 0, 0, 0, 153, 792, 1, 0, 0, 0, 155, 799, 1, 0, 0, 0, 157, 806, 1, 0, 0, 0, 159, 813, 1, 0, 0, 0, 161, 818, 1, 0, 0, 0, 163, 824, 1, 0, 0, 0, 165, 829, 1, 0, 0, 0, 167, 832, 1, 0, 0, 0, 169, 834, 1, 0, 0, 0, 171, 836, 1, 0, 0, 0, 173, 838, 1, 0, 0, 0, 175, 840, 1, 0, 0, 0, 177, 842, 1, 0, 0, 0, 179, 844, 1, 0, 0, 0, 181, 846, 1, 0, 0, 0, 183, 848, 1, 0, 0, 0, 185, 850, 1, 0, 0, 0, 187, 852, 1, 0, 0, 0, 189, 854, 1, 0, 0, 0, 191, 857, 1, 0, 0, 0, 193, 865, 1, 0, 0, 0, 195, 896, 1, 0, 0, 0, 197, 903, 1, 0, 0, 0, 199, 913, 1, 0, 0, 0, 201, 923, 1, 0, 0, 0, 203, 925, 1, 0, 0, 0, 205, 936, 1, 0, 0, 0, 207, 951, 1, 0, 0, 0, 209, 210, 5, 119, 0, 0, 210, 211, 5, 111, 0, 0, 211, 212, 5, 114, 0, 0, 212, 213, 5, 107, 0, 0, 213, 214, 5, 115, 0, 0, 214, 215, 5, 112, 0, 0, 215, 216, 5, 97, 0, 0, 216, 217, 5, 99, 0, 0, 217, 218, 5, 101, 0, 0, 218, 2, 1, 0, 0, 0, 219, 220, 5, 105, 0, 0, 220, 221, 5, 109, 0, 0, 221, 222, 5, 112, 0, 0, 222, 223, 5, 111, 0, 0, 223, 224, 5, 114, 0, 0, 224, 225, 5, 116, 0, 0, 225, 4, 1, 0, 0, 0, 226, 227, 5, 101, 0, 0, 227, 228, 5, 120, 0, 0, 228, 229, 5, 116, 0, 0, 229, 230, 5, 101, 0, 0, 230, 231, 5, 114, 0, 0, 231, 232, 5, 110, 0, 0, 232, 233, 5, 97, 0, 0, 233, 234, 5, 108, 0, 0, 234, 6, 1, 0, 0, 0, 235, 236, 5, 97, 0, 0, 236, 237, 5, 116, 0, 0, 237, 238, 5, 111, 0, 0, 238, 239, 5, 109, 0, 0, 239, 8, 1, 0, 0, 0, 240, 241, 5, 105, 0, 0, 241, 242, 5, 110, 0, 0, 242, 243, 5, 116, 0, 0, 243, 244, 5, 101, 0, 0, 244, 245, 5, 114, 0, 0, 245, 246, 5, 102, 0, 0, 246, 247, 5, 97, 0, 0, 247, 248, 5, 99, 0, 0, 248, 249, 5, 101, 0, 0, 249, 10, 1, 0, 0, 0, 250, 251, 5, 105, 0, 0, 251, 252, 5, 110, 0, 0, 252, 253, 5, 116, 0, 0, 253, 254, 5, 101, 0, 0, 254, 255, 5, 114, 0, 0, 255, 256, 5, 102, 0, 0, 256, 257, 5, 97, 0, 0, 257, 258, 5, 99, 0, 0, 258, 259, 5, 101, 0, 0, 259, 260, 5, 115, 0, 0, 260, 12, 1, 0, 0, 0, 261, 262, 5, 112, 0, 0, 262, 263, 5, 97, 0, 0, 263, 264, 5, 99, 0, 0, 264, 265, 5, 107, 0, 0, 265, 266, 5, 97, 0, 0, 266, 267, 5, 103, 0, 0, 267, 268, 5, 101, 0, 0, 268, 14, 1, 0, 0, 0, 269, 270, 5, 118, 0, 0, 270, 271, 5, 97, 0, 0, 271, 272, 5, 108, 0, 0, 272, 273, 5, 117, 0, 0, 273, 274, 5, 101, 0, 0, 274, 16, 1, 0, 0, 0, 275, 276, 5, 114, 0, 0, 276, 277, 5, 101, 0, 0, 277, 278, 5, 108, 0, 0, 278, 279, 5, 97, 0, 0, 279, 280, 5, 116, 0, 0, 280, 281, 5, 105, 0, 0, 281, 282, 5, 111, 0, 0, 282, 283, 5, 110, 0, 0, 283, 18, 1, 0, 0, 0, 284, 285, 5, 111, 0, 0, 285, 286, 5, 112, 0, 0, 286, 287, 5, 101, 0, 0, 287, 288, 5, 114, 0, 0, 288, 289, 5, 97, 0, 0, 289, 290, 5, 116, 0, 0, 290, 291, 5, 105, 0, 0, 291, 292, 5, 111, 0, 0, 292, 293, 5, 110, 0, 0, 293, 20, 1, 0, 0, 0, 294, 295, 5, 102, 0, 0, 295, 296, 5, 117, 0, 0, 296, 297, 5, 110, 0, 0, 297, 298, 5, 99, 0, 0, 298, 299, 5, 116, 0, 0, 299, 300, 5, 105, 0, 0, 300, 301, 5, 111, 0, 0, 301, 302, 5, 110, 0, 0, 302, 22, 1, 0, 0, 0, 303, 304, 5, 99, 0, 0, 304, 305, 5, 111, 0, 0, 305, 306, 5, 110, 0, 0, 306, 307, 5, 115, 0, 0, 307, 308, 5, 116, 0, 0, 308, 309, 5, 114, 0, 0, 309, 310, 5, 117, 0, 0, 310, 311, 5, 99, 0, 0, 311, 312, 5, 116, 0, 0, 312, 313, 5, 111, 0, 0, 313, 314, 5, 114, 0, 0, 314, 24, 1, 0, 0, 0, 315, 316, 5, 99, 0, 0, 316, 317, 5, 111, 0, 0, 317, 318, 5, 110, 0, 0, 318, 319, 5, 115, 0, 0, 319, 320, 5, 116, 0, 0, 320, 321, 5, 114, 0, 0, 321, 322, 5, 117, 0, 0, 322, 323, 5, 99, 0, 0, 323, 324, 5, 116, 0, 0, 324, 325, 5, 115, 0, 0, 325, 26, 1, 0, 0, 0, 326, 327, 5, 99, 0, 0, 327, 328, 5, 111, 0, 0, 328, 329, 5, 110, 0, 0, 329, 330, 5, 102, 0, 0, 330, 331, 5, 111, 0, 0, 331, 332, 5, 114, 0, 0, 332, 333, 5, 109, 0, 0, 333, 28, 1, 0, 0, 0, 334, 335, 5, 97, 0, 0, 335, 336, 5, 115, 0, 0, 336, 30, 1, 0, 0, 0, 337, 338, 5, 98, 0, 0, 338, 339, 5, 105, 0, 0, 339, 340, 5, 110, 0, 0, 340, 341, 5, 100, 0, 0, 341, 32, 1, 0, 0, 0, 342, 343, 5, 116, 0, 0, 343, 344, 5, 111, 0, 0, 344, 34, 1, 0, 0, 0, 345, 346, 5, 112, 0, 0, 346, 347, 5, 114, 0, 0, 347, 348, 5, 105, 0, 0, 348, 349, 5, 118, 0, 0, 349, 350, 5, 97, 0, 0, 350, 351, 5, 116, 0, 0, 351, 352, 5, 101, 0, 0, 352, 36, 1, 0, 0, 0, 353, 354, 5, 115, 0, 0, 354, 355, 5, 104, 0, 0, 355, 356, 5, 97, 0, 0, 356, 357, 5, 114, 0, 0, 357, 358, 5, 101, 0, 0, 358, 359, 5, 100, 0, 0, 359, 38, 1, 0, 0, 0, 360, 361, 5, 115, 0, 0, 361, 362, 5, 116, 0, 0, 362, 363, 5, 97, 0, 0, 363, 364, 5, 116, 0, 0, 364, 365, 5, 101, 0, 0, 365, 40, 1, 0, 0, 0, 366, 367, 5, 101, 0, 0, 367, 368, 5, 100, 0, 0, 368, 369, 5, 103, 0, 0, 369, 370, 5, 101, 0, 0, 370, 42, 1, 0, 0, 0, 371, 372, 5, 112, 0, 0, 372, 373, 5, 114, 0, 0, 373, 374, 5, 111, 0, 0, 374, 375, 5, 106, 0, 0, 375, 376, 5, 101, 0, 0, 376, 377, 5, 99, 0, 0, 377, 378, 5, 116, 0, 0, 378, 379, 5, 105, 0, 0, 379, 380, 5, 111, 0, 0, 380, 381, 5, 110, 0, 0, 381, 44, 1, 0, 0, 0, 382, 383, 5, 119, 0, 0, 383, 384, 5, 105, 0, 0, 384, 385, 5, 116, 0, 0, 385, 386, 5, 104, 0, 0, 386, 46, 1, 0, 0, 0, 387, 388, 5, 117, 0, 0, 388, 389, 5, 115, 0, 0, 389, 390, 5, 105, 0, 0, 390, 391, 5, 110, 0, 0, 391, 392, 5, 103, 0, 0, 392, 48, 1, 0, 0, 0, 393, 394, 5, 118, 0, 0, 394, 395, 5, 105, 0, 0, 395, 396, 5, 97, 0, 0, 396, 50, 1, 0, 0, 0, 397, 398, 5, 109, 0, 0, 398, 399, 5, 97, 0, 0, 399, 400, 5, 116, 0, 0, 400, 401, 5, 101, 0, 0, 401, 402, 5, 114, 0, 0, 402, 403, 5, 105, 0, 0, 403, 404, 5, 97, 0, 0, 404, 405, 5, 108, 0, 0, 405, 406, 5, 105, 0, 0, 406, 407, 5, 122, 0, 0, 407, 408, 5, 101, 0, 0, 408, 52, 1, 0, 0, 0, 409, 410, 5, 105, 0, 0, 410, 411, 5, 102, 0, 0, 411, 54, 1, 0, 0, 0, 412, 413, 5, 97, 0, 0, 413, 414, 5, 98, 0, 0, 414, 415, 5, 115, 0, 0, 415, 416, 5, 101, 0, 0, 416, 417, 5, 110, 0, 0, 417, 418, 5, 116, 0, 0, 418, 56, 1, 0, 0, 0, 419, 420, 5, 111, 0, 0, 420, 421, 5, 110, 0, 0, 421, 58, 1, 0, 0, 0, 422, 423, 5, 112, 0, 0, 423, 424, 5, 111, 0, 0, 424, 425, 5, 108, 0, 0, 425, 426, 5, 105, 0, 0, 426, 427, 5, 99, 0, 0, 427, 428, 5, 121, 0, 0, 428, 60, 1, 0, 0, 0, 429, 430, 5, 100, 0, 0, 430, 431, 5, 101, 0, 0, 431, 432, 5, 102, 0, 0, 432, 433, 5, 97, 0, 0, 433, 434, 5, 117, 0, 0, 434, 435, 5, 108, 0, 0, 435, 436, 5, 116, 0, 0, 436, 62, 1, 0, 0, 0, 437, 438, 5, 115, 0, 0, 438, 439, 5, 111, 0, 0, 439, 440, 5, 117, 0, 0, 440, 441, 5, 114, 0, 0, 441, 442, 5, 99, 0, 0, 442, 443, 5, 101, 0, 0, 443, 64, 1, 0, 0, 0, 444, 445, 5, 114, 0, 0, 445, 446, 5, 101, 0, 0, 446, 447, 5, 112, 0, 0, 447, 448, 5, 111, 0, 0, 448, 449, 5, 115, 0, 0, 449, 450, 5, 105, 0, 0, 450, 451, 5, 116, 0, 0, 451, 452, 5, 111, 0, 0, 452, 453, 5, 114, 0, 0, 453, 454, 5, 121, 0, 0, 454, 66, 1, 0, 0, 0, 455, 456, 5, 99, 0, 0, 456, 457, 5, 111, 0, 0, 457, 458, 5, 109, 0, 0, 458, 459, 5, 109, 0, 0, 459, 460, 5, 105, 0, 0, 460, 461, 5, 116, 0, 0, 461, 68, 1, 0, 0, 0, 462, 463, 5, 114, 0, 0, 463, 464, 5, 101, 0, 0, 464, 465, 5, 118, 0, 0, 465, 466, 5, 105, 0, 0, 466, 467, 5, 115, 0, 0, 467, 468, 5, 105, 0, 0, 468, 469, 5, 111, 0, 0, 469, 470, 5, 110, 0, 0, 470, 70, 1, 0, 0, 0, 471, 472, 5, 105, 0, 0, 472, 473, 5, 100, 0, 0, 473, 72, 1, 0, 0, 0, 474, 475, 5, 100, 0, 0, 475, 476, 5, 111, 0, 0, 476, 477, 5, 99, 0, 0, 477, 74, 1, 0, 0, 0, 478, 479, 5, 109, 0, 0, 479, 480, 5, 111, 0, 0, 480, 481, 5, 100, 0, 0, 481, 482, 5, 101, 0, 0, 482, 76, 1, 0, 0, 0, 483, 484, 5, 101, 0, 0, 484, 485, 5, 109, 0, 0, 485, 486, 5, 105, 0, 0, 486, 487, 5, 116, 0, 0, 487, 488, 5, 115, 0, 0, 488, 78, 1, 0, 0, 0, 489, 490, 5, 114, 0, 0, 490, 491, 5, 101, 0, 0, 491, 492, 5, 99, 0, 0, 492, 493, 5, 101, 0, 0, 493, 494, 5, 105, 0, 0, 494, 495, 5, 118, 0, 0, 495, 496, 5, 101, 0, 0, 496, 497, 5, 114, 0, 0, 497, 80, 1, 0, 0, 0, 498, 499, 5, 114, 0, 0, 499, 500, 5, 101, 0, 0, 500, 501, 5, 113, 0, 0, 501, 502, 5, 117, 0, 0, 502, 503, 5, 105, 0, 0, 503, 504, 5, 114, 0, 0, 504, 505, 5, 101, 0, 0, 505, 506, 5, 115, 0, 0, 506, 82, 1, 0, 0, 0, 507, 508, 5, 97, 0, 0, 508, 509, 5, 110, 0, 0, 509, 510, 5, 121, 0, 0, 510, 84, 1, 0, 0, 0, 511, 512, 5, 103, 0, 0, 512, 513, 5, 101, 0, 0, 513, 514, 5, 116, 0, 0, 514, 86, 1, 0, 0, 0, 515, 516, 5, 115, 0, 0, 516, 517, 5, 101, 0, 0, 517, 518, 5, 116, 0, 0, 518, 88, 1, 0, 0, 0, 519, 520, 5, 119, 0, 0, 520, 521, 5, 97, 0, 0, 521, 522, 5, 116, 0, 0, 522, 523, 5, 99, 0, 0, 523, 524, 5, 104, 0, 0, 524, 90, 1, 0, 0, 0, 525, 526, 5, 115, 0, 0, 526, 527, 5, 116, 0, 0, 527, 528, 5, 97, 0, 0, 528, 529, 5, 114, 0, 0, 529, 530, 5, 116, 0, 0, 530, 92, 1, 0, 0, 0, 531, 532, 5, 115, 0, 0, 532, 533, 5, 116, 0, 0, 533, 534, 5, 111, 0, 0, 534, 535, 5, 112, 0, 0, 535, 94, 1, 0, 0, 0, 536, 537, 5, 114, 0, 0, 537, 538, 5, 101, 0, 0, 538, 539, 5, 97, 0, 0, 539, 540, 5, 100, 0, 0, 540, 96, 1, 0, 0, 0, 541, 542, 5, 119, 0, 0, 542, 543, 5, 114, 0, 0, 543, 544, 5, 105, 0, 0, 544, 545, 5, 116, 0, 0, 545, 546, 5, 101, 0, 0, 546, 98, 1, 0, 0, 0, 547, 548, 5, 114, 0, 0, 548, 549, 5, 101, 0, 0, 549, 550, 5, 115, 0, 0, 550, 551, 5, 111, 0, 0, 551, 552, 5, 108, 0, 0, 552, 553, 5, 118, 0, 0, 553, 554, 5, 101, 0, 0, 554, 100, 1, 0, 0, 0, 555, 556, 5, 99, 0, 0, 556, 557, 5, 111, 0, 0, 557, 558, 5, 110, 0, 0, 558, 559, 5, 110, 0, 0, 559, 560, 5, 101, 0, 0, 560, 561, 5, 99, 0, 0, 561, 562, 5, 116, 0, 0, 562, 102, 1, 0, 0, 0, 563, 564, 5, 100, 0, 0, 564, 565, 5, 105, 0, 0, 565, 566, 5, 115, 0, 0, 566, 567, 5, 99, 0, 0, 567, 568, 5, 111, 0, 0, 568, 569, 5, 110, 0, 0, 569, 570, 5, 110, 0, 0, 570, 571, 5, 101, 0, 0, 571, 572, 5, 99, 0, 0, 572, 573, 5, 116, 0, 0, 573, 104, 1, 0, 0, 0, 574, 575, 5, 99, 0, 0, 575, 576, 5, 97, 0, 0, 576, 577, 5, 108, 0, 0, 577, 578, 5, 108, 0, 0, 578, 106, 1, 0, 0, 0, 579, 580, 5, 119, 0, 0, 580, 581, 5, 97, 0, 0, 581, 582, 5, 116, 0, 0, 582, 583, 5, 99, 0, 0, 583, 584, 5, 104, 0, 0, 584, 585, 5, 45, 0, 0, 585, 586, 5, 115, 0, 0, 586, 587, 5, 116, 0, 0, 587, 588, 5, 97, 0, 0, 588, 589, 5, 114, 0, 0, 589, 590, 5, 116, 0, 0, 590, 108, 1, 0, 0, 0, 591, 592, 5, 119, 0, 0, 592, 593, 5, 97, 0, 0, 593, 594, 5, 116, 0, 0, 594, 595, 5, 99, 0, 0, 595, 596, 5, 104, 0, 0, 596, 597, 5, 45, 0, 0, 597, 598, 5, 115, 0, 0, 598, 599, 5, 116, 0, 0, 599, 600, 5, 111, 0, 0, 600, 601, 5, 112, 0, 0, 601, 110, 1, 0, 0, 0, 602, 603, 5, 115, 0, 0, 603, 604, 5, 117, 0, 0, 604, 605, 5, 98, 0, 0, 605, 606, 5, 115, 0, 0, 606, 607, 5, 99, 0, 0, 607, 608, 5, 114, 0, 0, 608, 609, 5, 105, 0, 0, 609, 610, 5, 98, 0, 0, 610, 611, 5, 101, 0, 0, 611, 112, 1, 0, 0, 0, 612, 613, 5, 117, 0, 0, 613, 614, 5, 110, 0, 0, 614, 615, 5, 115, 0, 0, 615, 616, 5, 117, 0, 0, 616, 617, 5, 98, 0, 0, 617, 618, 5, 115, 0, 0, 618, 619, 5, 99, 0, 0, 619, 620, 5, 114, 0, 0, 620, 621, 5, 105, 0, 0, 621, 622, 5, 98, 0, 0, 622, 623, 5, 101, 0, 0, 623, 114, 1, 0, 0, 0, 624, 625, 5, 111, 0, 0, 625, 626, 5, 112, 0, 0, 626, 627, 5, 116, 0, 0, 627, 628, 5, 105, 0, 0, 628, 629, 5, 109, 0, 0, 629, 630, 5, 105, 0, 0, 630, 631, 5, 115, 0, 0, 631, 632, 5, 116, 0, 0, 632, 633, 5, 105, 0, 0, 633, 634, 5, 99, 0, 0, 634, 635, 5, 45, 0, 0, 635, 636, 5, 114, 0, 0, 636, 637, 5, 101, 0, 0, 637, 638, 5, 103, 0, 0, 638, 639, 5, 105, 0, 0, 639, 640, 5, 115, 0, 0, 640, 641, 5, 116, 0, 0, 641, 642, 5, 101, 0, 0, 642, 643, 5, 114, 0, 0, 643, 116, 1, 0, 0, 0, 644, 645, 5, 99, 0, 0, 645, 646, 5, 114, 0, 0, 646, 647, 5, 100, 0, 0, 647, 648, 5, 116, 0, 0, 648, 118, 1, 0, 0, 0, 649, 650, 5, 111, 0, 0, 650, 651, 5, 112, 0, 0, 651, 652, 5, 116, 0, 0, 652, 653, 5, 105, 0, 0, 653, 654, 5, 111, 0, 0, 654, 655, 5, 110, 0, 0, 655, 656, 5, 97, 0, 0, 656, 657, 5, 108, 0, 0, 657, 658, 5, 45, 0, 0, 658, 659, 5, 111, 0, 0, 659, 660, 5, 110, 0, 0, 660, 661, 5, 101, 0, 0, 661, 120, 1, 0, 0, 0, 662, 663, 5, 101, 0, 0, 663, 664, 5, 120, 0, 0, 664, 665, 5, 97, 0, 0, 665, 666, 5, 99, 0, 0, 666, 667, 5, 116, 0, 0, 667, 668, 5, 108, 0, 0, 668, 669, 5, 121, 0, 0, 669, 670, 5, 45, 0, 0, 670, 671, 5, 111, 0, 0, 671, 672, 5, 110, 0, 0, 672, 673, 5, 101, 0, 0, 673, 122, 1, 0, 0, 0, 674, 675, 5, 109, 0, 0, 675, 676, 5, 97, 0, 0, 676, 677, 5, 110, 0, 0, 677, 678, 5, 121, 0, 0, 678, 679, 5, 45, 0, 0, 679, 680, 5, 117, 0, 0, 680, 681, 5, 110, 0, 0, 681, 682, 5, 105, 0, 0, 682, 683, 5, 113, 0, 0, 683, 684, 5, 117, 0, 0, 684, 685, 5, 101, 0, 0, 685, 124, 1, 0, 0, 0, 686, 687, 5, 109, 0, 0, 687, 688, 5, 97, 0, 0, 688, 689, 5, 110, 0, 0, 689, 690, 5, 121, 0, 0, 690, 126, 1, 0, 0, 0, 691, 692, 5, 111, 0, 0, 692, 693, 5, 114, 0, 0, 693, 694, 5, 100, 0, 0, 694, 695, 5, 101, 0, 0, 695, 696, 5, 114, 0, 0, 696, 697, 5, 101, 0, 0, 697, 698, 5, 100, 0, 0, 698, 128, 1, 0, 0, 0, 699, 700, 5, 117, 0, 0, 700, 701, 5, 110, 0, 0, 701, 702, 5, 105, 0, 0, 702, 703, 5, 116, 0, 0, 703, 130, 1, 0, 0, 0, 704, 705, 5, 119, 0, 0, 705, 706, 5, 97, 0, 0, 706, 707, 5, 116, 0, 0, 707, 708, 5, 99, 0, 0, 708, 709, 5, 104, 0, 0, 709, 710, 5, 45, 0, 0, 710, 711, 5, 104, 0, 0, 711, 712, 5, 97, 0, 0, 712, 713, 5, 110, 0, 0, 713, 714, 5, 100, 0, 0, 714, 715, 5, 108, 0, 0, 715, 716, 5, 101, 0, 0, 716, 132, 1, 0, 0, 0, 717, 718, 5, 109, 0, 0, 718, 719, 5, 101, 0, 0, 719, 720, 5, 115, 0, 0, 720, 721, 5, 115, 0, 0, 721, 722, 5, 97, 0, 0, 722, 723, 5, 103, 0, 0, 723, 724, 5, 101, 0, 0, 724, 134, 1, 0, 0, 0, 725, 726, 5, 97, 0, 0, 726, 727, 5, 116, 0, 0, 727, 728, 5, 111, 0, 0, 728, 729, 5, 109, 0, 0, 729, 730, 5, 45, 0, 0, 730, 731, 5, 114, 0, 0, 731, 732, 5, 101, 0, 0, 732, 733, 5, 102, 0, 0, 733, 136, 1, 0, 0, 0, 734, 735, 5, 105, 0, 0, 735, 736, 5, 110, 0, 0, 736, 737, 5, 116, 0, 0, 737, 738, 5, 101, 0, 0, 738, 739, 5, 114, 0, 0, 739, 740, 5, 102, 0, 0, 740, 741, 5, 97, 0, 0, 741, 742, 5, 99, 0, 0, 742, 743, 5, 101, 0, 0, 743, 744, 5, 45, 0, 0, 744, 745, 5, 114, 0, 0, 745, 746, 5, 101, 0, 0, 746, 747, 5, 102, 0, 0, 747, 138, 1, 0, 0, 0, 748, 749, 5, 111, 0, 0, 749, 750, 5, 112, 0, 0, 750, 751, 5, 116, 0, 0, 751, 752, 5, 105, 0, 0, 752, 753, 5, 111, 0, 0, 753, 754, 5, 110, 0, 0, 754, 755, 5, 97, 0, 0, 755, 756, 5, 108, 0, 0, 756, 140, 1, 0, 0, 0, 757, 758, 5, 108, 0, 0, 758, 759, 5, 105, 0, 0, 759, 760, 5, 115, 0, 0, 760, 761, 5, 116, 0, 0, 761, 142, 1, 0, 0, 0, 762, 763, 5, 98, 0, 0, 763, 764, 5, 111, 0, 0, 764, 765, 5, 111, 0, 0, 765, 766, 5, 108, 0, 0, 766, 144, 1, 0, 0, 0, 767, 768, 5, 98, 0, 0, 768, 769, 5, 121, 0, 0, 769, 770, 5, 116, 0, 0, 770, 771, 5, 101, 0, 0, 771, 772, 5, 115, 0, 0, 772, 146, 1, 0, 0, 0, 773, 774, 5, 100, 0, 0, 774, 775, 5, 111, 0, 0, 775, 776, 5, 117, 0, 0, 776, 777, 5, 98, 0, 0, 777, 778, 5, 108, 0, 0, 778, 779, 5, 101, 0, 0, 779, 148, 1, 0, 0, 0, 780, 781, 5, 105, 0, 0, 781, 782, 5, 110, 0, 0, 782, 783, 5, 116, 0, 0, 783, 784, 5, 51, 0, 0, 784, 785, 5, 50, 0, 0, 785, 150, 1, 0, 0, 0, 786, 787, 5, 105, 0, 0, 787, 788, 5, 110, 0, 0, 788, 789, 5, 116, 0, 0, 789, 790, 5, 54, 0, 0, 790, 791, 5, 52, 0, 0, 791, 152, 1, 0, 0, 0, 792, 793, 5, 115, 0, 0, 793, 794, 5, 116, 0, 0, 794, 795, 5, 114, 0, 0, 795, 796, 5, 105, 0, 0, 796, 797, 5, 110, 0, 0, 797, 798, 5, 103, 0, 0, 798, 154, 1, 0, 0, 0, 799, 800, 5, 117, 0, 0, 800, 801, 5, 105, 0, 0, 801, 802, 5, 110, 0, 0, 802, 803, 5, 116, 0, 0, 803, 804, 5, 51, 0, 0, 804, 805, 5, 50, 0, 0, 805, 156, 1, 0, 0, 0, 806, 807, 5, 117, 0, 0, 807, 808, 5, 105, 0, 0, 808, 809, 5, 110, 0, 0, 809, 810, 5, 116, 0, 0, 810, 811, 5, 54, 0, 0, 811, 812, 5, 52, 0, 0, 812, 158, 1, 0, 0, 0, 813, 814, 5, 116, 0, 0, 814, 815, 5, 114, 0, 0, 815, 816, 5, 117, 0, 0, 816, 817, 5, 101, 0, 0, 817, 160, 1, 0, 0, 0, 818, 819, 5, 102, 0, 0, 819, 820, 5, 97, 0, 0, 820, 821, 5, 108, 0, 0, 821, 822, 5, 115, 0, 0, 822, 823, 5, 101, 0, 0, 823, 162, 1, 0, 0, 0, 824, 825, 5, 110, 0, 0, 825, 826, 5, 117, 0, 0, 826, 827, 5, 108, 0, 0, 827, 828, 5, 108, 0, 0, 828, 164, 1, 0, 0, 0, 829, 830, 5, 45, 0, 0, 830, 831, 5, 62, 0, 0, 831, 166, 1, 0, 0, 0, 832, 833, 5, 58, 0, 0, 833, 168, 1, 0, 0, 0, 834, 835, 5, 59, 0, 0, 835, 170, 1, 0, 0, 0, 836, 837, 5, 44, 0, 0, 837, 172, 1, 0, 0, 0, 838, 839, 5, 46, 0, 0, 839, 174, 1, 0, 0, 0, 840, 841, 5, 123, 0, 0, 841, 176, 1, 0, 0, 0, 842, 843, 5, 125, 0, 0, 843, 178, 1, 0, 0, 0, 844, 845, 5, 91, 0, 0, 845, 180, 1, 0, 0, 0, 846, 847, 5, 93, 0, 0, 847, 182, 1, 0, 0, 0, 848, 849, 5, 40, 0, 0, 849, 184, 1, 0, 0, 0, 850, 851, 5, 41, 0, 0, 851, 186, 1, 0, 0, 0, 852, 853, 5, 60, 0, 0, 853, 188, 1, 0, 0, 0, 854, 855, 5, 62, 0, 0, 855, 190, 1, 0, 0, 0, 856, 858, 5, 45, 0, 0, 857, 856, 1, 0, 0, 0, 857, 858, 1, 0, 0, 0, 858, 860, 1, 0, 0, 0, 859, 861, 7, 0, 0, 0, 860, 859, 1, 0, 0, 0, 861, 862, 1, 0, 0, 0, 862, 860, 1, 0, 0, 0, 862, 863, 1, 0, 0, 0, 863, 192, 1, 0, 0, 0, 864, 866, 5, 45, 0, 0, 865, 864, 1, 0, 0, 0, 865, 866, 1, 0, 0, 0, 866, 875, 1, 0, 0, 0, 867, 876, 5, 48, 0, 0, 868, 872, 7, 1, 0, 0, 869, 871, 7, 0, 0, 0, 870, 869, 1, 0, 0, 0, 871, 874, 1, 0, 0, 0, 872, 870, 1, 0, 0, 0, 872, 873, 1, 0, 0, 0, 873, 876, 1, 0, 0, 0, 874, 872, 1, 0, 0, 0, 875, 867, 1, 0, 0, 0, 875, 868, 1, 0, 0, 0, 876, 883, 1, 0, 0, 0, 877, 879, 5, 46, 0, 0, 878, 880, 7, 0, 0, 0, 879, 878, 1, 0, 0, 0, 880, 881, 1, 0, 0, 0, 881, 879, 1, 0, 0, 0, 881, 882, 1, 0, 0, 0, 882, 884, 1, 0, 0, 0, 883, 877, 1, 0, 0, 0, 883, 884, 1, 0, 0, 0, 884, 894, 1, 0, 0, 0, 885, 887, 7, 2, 0, 0, 886, 888, 7, 3, 0, 0, 887, 886, 1, 0, 0, 0, 887, 888, 1, 0, 0, 0, 888, 890, 1, 0, 0, 0, 889, 891, 7, 0, 0, 0, 890, 889, 1, 0, 0, 0, 891, 892, 1, 0, 0, 0, 892, 890, 1, 0, 0, 0, 892, 893, 1, 0, 0, 0, 893, 895, 1, 0, 0, 0, 894, 885, 1, 0, 0, 0, 894, 895, 1, 0, 0, 0, 895, 194, 1, 0, 0, 0, 896, 900, 7, 4, 0, 0, 897, 899, 7, 5, 0, 0, 898, 897, 1, 0, 0, 0, 899, 902, 1, 0, 0, 0, 900, 898, 1, 0, 0, 0, 900, 901, 1, 0, 0, 0, 901, 196, 1, 0, 0, 0, 902, 900, 1, 0, 0, 0, 903, 908, 5, 34, 0, 0, 904, 907, 3, 199, 99, 0, 905, 907, 8, 6, 0, 0, 906, 904, 1, 0, 0, 0, 906, 905, 1, 0, 0, 0, 907, 910, 1, 0, 0, 0, 908, 906, 1, 0, 0, 0, 908, 909, 1, 0, 0, 0, 909, 911, 1, 0, 0, 0, 910, 908, 1, 0, 0, 0, 911, 912, 5, 34, 0, 0, 912, 198, 1, 0, 0, 0, 913, 921, 5, 92, 0, 0, 914, 922, 7, 7, 0, 0, 915, 916, 5, 117, 0, 0, 916, 917, 3, 201, 100, 0, 917, 918, 3, 201, 100, 0, 918, 919, 3, 201, 100, 0, 919, 920, 3, 201, 100, 0, 920, 922, 1, 0, 0, 0, 921, 914, 1, 0, 0, 0, 921, 915, 1, 0, 0, 0, 922, 200, 1, 0, 0, 0, 923, 924, 7, 8, 0, 0, 924, 202, 1, 0, 0, 0, 925, 926, 5, 47, 0, 0, 926, 927, 5, 47, 0, 0, 927, 931, 1, 0, 0, 0, 928, 930, 8, 9, 0, 0, 929, 928, 1, 0, 0, 0, 930, 933, 1, 0, 0, 0, 931, 929, 1, 0, 0, 0, 931, 932, 1, 0, 0, 0, 932, 934, 1, 0, 0, 0, 933, 931, 1, 0, 0, 0, 934, 935, 6, 101, 0, 0, 935, 204, 1, 0, 0, 0, 936, 937, 5, 47, 0, 0, 937, 938, 5, 42, 0, 0, 938, 942, 1, 0, 0, 0, 939, 941, 9, 0, 0, 0, 940, 939, 1, 0, 0, 0, 941, 944, 1, 0, 0, 0, 942, 943, 1, 0, 0, 0, 942, 940, 1, 0, 0, 0, 943, 945, 1, 0, 0, 0, 944, 942, 1, 0, 0, 0, 945, 946, 5, 42, 0, 0, 946, 947, 5, 47, 0, 0, 947, 948, 1, 0, 0, 0, 948, 949, 6, 102, 0, 0, 949, 206, 1, 0, 0, 0, 950, 952, 7, 10, 0, 0, 951, 950, 1, 0, 0, 0, 952, 953, 1, 0, 0, 0, 953, 951, 1, 0, 0, 0, 953, 954, 1, 0, 0, 0, 954, 955, 1, 0, 0, 0, 955, 956, 6, 103, 0, 0, 956, 208, 1, 0, 0, 0, 18, 0, 857, 862, 865, 872, 875, 881, 883, 887, 892, 894, 900, 906, 908, 921, 931, 942, 953, 1, 6, 0, 0] \ No newline at end of file diff --git a/src/capability-language/generated/QuixosCapabilityLexer.tokens b/src/capability-language/generated/QuixosCapabilityLexer.tokens index 22f078e..a2f4274 100644 --- a/src/capability-language/generated/QuixosCapabilityLexer.tokens +++ b/src/capability-language/generated/QuixosCapabilityLexer.tokens @@ -1,193 +1,197 @@ WORKSPACE=1 -ATOM=2 -INTERFACE=3 -INTERFACES=4 -PACKAGE=5 -VALUE=6 -RELATION=7 -OPERATION=8 -FUNCTION=9 -CONSTRUCTOR=10 -CONSTRUCTS=11 -CONFORM=12 -AS=13 -BIND=14 -TO=15 -PRIVATE=16 -SHARED=17 -STATE=18 -EDGE=19 -PROJECTION=20 -WITH=21 -USING=22 -VIA=23 -MATERIALIZE=24 -IF=25 -ABSENT=26 -ON=27 -POLICY=28 -DEFAULT=29 -SOURCE=30 -REPOSITORY=31 -COMMIT=32 -REVISION=33 -ID=34 -DOC=35 -MODE=36 -EMITS=37 -RECEIVER=38 -REQUIRES=39 -ANY=40 -GET=41 -SET=42 -WATCH=43 -START=44 -STOP=45 -READ=46 -WRITE=47 -RESOLVE=48 -CONNECT=49 -DISCONNECT=50 -CALL=51 -WATCH_START=52 -WATCH_STOP=53 -SUBSCRIBE=54 -UNSUBSCRIBE=55 -OPTIMISTIC_REGISTER=56 -CRDT=57 -OPTIONAL_ONE=58 -EXACTLY_ONE=59 -MANY_UNIQUE=60 -MANY=61 -ORDERED=62 -UNIT=63 -WATCH_HANDLE=64 -MESSAGE=65 -ATOM_REF=66 -INTERFACE_REF=67 -OPTIONAL=68 -LIST=69 -BOOL=70 -BYTES=71 -DOUBLE=72 -INT32=73 -INT64=74 -STRING=75 -UINT32=76 -UINT64=77 -TRUE=78 -FALSE=79 -NULL=80 -ARROW=81 -COLON=82 -SEMI=83 -COMMA=84 -DOT=85 -LBRACE=86 -RBRACE=87 -LBRACK=88 -RBRACK=89 -LPAREN=90 -RPAREN=91 -LT=92 -GT=93 -INTEGER=94 -JSON_NUMBER=95 -IDENTIFIER=96 -STRING_LITERAL=97 -LINE_COMMENT=98 -BLOCK_COMMENT=99 -WS=100 +IMPORT=2 +EXTERNAL=3 +ATOM=4 +INTERFACE=5 +INTERFACES=6 +PACKAGE=7 +VALUE=8 +RELATION=9 +OPERATION=10 +FUNCTION=11 +CONSTRUCTOR=12 +CONSTRUCTS=13 +CONFORM=14 +AS=15 +BIND=16 +TO=17 +PRIVATE=18 +SHARED=19 +STATE=20 +EDGE=21 +PROJECTION=22 +WITH=23 +USING=24 +VIA=25 +MATERIALIZE=26 +IF=27 +ABSENT=28 +ON=29 +POLICY=30 +DEFAULT=31 +SOURCE=32 +REPOSITORY=33 +COMMIT=34 +REVISION=35 +ID=36 +DOC=37 +MODE=38 +EMITS=39 +RECEIVER=40 +REQUIRES=41 +ANY=42 +GET=43 +SET=44 +WATCH=45 +START=46 +STOP=47 +READ=48 +WRITE=49 +RESOLVE=50 +CONNECT=51 +DISCONNECT=52 +CALL=53 +WATCH_START=54 +WATCH_STOP=55 +SUBSCRIBE=56 +UNSUBSCRIBE=57 +OPTIMISTIC_REGISTER=58 +CRDT=59 +OPTIONAL_ONE=60 +EXACTLY_ONE=61 +MANY_UNIQUE=62 +MANY=63 +ORDERED=64 +UNIT=65 +WATCH_HANDLE=66 +MESSAGE=67 +ATOM_REF=68 +INTERFACE_REF=69 +OPTIONAL=70 +LIST=71 +BOOL=72 +BYTES=73 +DOUBLE=74 +INT32=75 +INT64=76 +STRING=77 +UINT32=78 +UINT64=79 +TRUE=80 +FALSE=81 +NULL=82 +ARROW=83 +COLON=84 +SEMI=85 +COMMA=86 +DOT=87 +LBRACE=88 +RBRACE=89 +LBRACK=90 +RBRACK=91 +LPAREN=92 +RPAREN=93 +LT=94 +GT=95 +INTEGER=96 +JSON_NUMBER=97 +IDENTIFIER=98 +STRING_LITERAL=99 +LINE_COMMENT=100 +BLOCK_COMMENT=101 +WS=102 'workspace'=1 -'atom'=2 -'interface'=3 -'interfaces'=4 -'package'=5 -'value'=6 -'relation'=7 -'operation'=8 -'function'=9 -'constructor'=10 -'constructs'=11 -'conform'=12 -'as'=13 -'bind'=14 -'to'=15 -'private'=16 -'shared'=17 -'state'=18 -'edge'=19 -'projection'=20 -'with'=21 -'using'=22 -'via'=23 -'materialize'=24 -'if'=25 -'absent'=26 -'on'=27 -'policy'=28 -'default'=29 -'source'=30 -'repository'=31 -'commit'=32 -'revision'=33 -'id'=34 -'doc'=35 -'mode'=36 -'emits'=37 -'receiver'=38 -'requires'=39 -'any'=40 -'get'=41 -'set'=42 -'watch'=43 -'start'=44 -'stop'=45 -'read'=46 -'write'=47 -'resolve'=48 -'connect'=49 -'disconnect'=50 -'call'=51 -'watch-start'=52 -'watch-stop'=53 -'subscribe'=54 -'unsubscribe'=55 -'optimistic-register'=56 -'crdt'=57 -'optional-one'=58 -'exactly-one'=59 -'many-unique'=60 -'many'=61 -'ordered'=62 -'unit'=63 -'watch-handle'=64 -'message'=65 -'atom-ref'=66 -'interface-ref'=67 -'optional'=68 -'list'=69 -'bool'=70 -'bytes'=71 -'double'=72 -'int32'=73 -'int64'=74 -'string'=75 -'uint32'=76 -'uint64'=77 -'true'=78 -'false'=79 -'null'=80 -'->'=81 -':'=82 -';'=83 -','=84 -'.'=85 -'{'=86 -'}'=87 -'['=88 -']'=89 -'('=90 -')'=91 -'<'=92 -'>'=93 +'import'=2 +'external'=3 +'atom'=4 +'interface'=5 +'interfaces'=6 +'package'=7 +'value'=8 +'relation'=9 +'operation'=10 +'function'=11 +'constructor'=12 +'constructs'=13 +'conform'=14 +'as'=15 +'bind'=16 +'to'=17 +'private'=18 +'shared'=19 +'state'=20 +'edge'=21 +'projection'=22 +'with'=23 +'using'=24 +'via'=25 +'materialize'=26 +'if'=27 +'absent'=28 +'on'=29 +'policy'=30 +'default'=31 +'source'=32 +'repository'=33 +'commit'=34 +'revision'=35 +'id'=36 +'doc'=37 +'mode'=38 +'emits'=39 +'receiver'=40 +'requires'=41 +'any'=42 +'get'=43 +'set'=44 +'watch'=45 +'start'=46 +'stop'=47 +'read'=48 +'write'=49 +'resolve'=50 +'connect'=51 +'disconnect'=52 +'call'=53 +'watch-start'=54 +'watch-stop'=55 +'subscribe'=56 +'unsubscribe'=57 +'optimistic-register'=58 +'crdt'=59 +'optional-one'=60 +'exactly-one'=61 +'many-unique'=62 +'many'=63 +'ordered'=64 +'unit'=65 +'watch-handle'=66 +'message'=67 +'atom-ref'=68 +'interface-ref'=69 +'optional'=70 +'list'=71 +'bool'=72 +'bytes'=73 +'double'=74 +'int32'=75 +'int64'=76 +'string'=77 +'uint32'=78 +'uint64'=79 +'true'=80 +'false'=81 +'null'=82 +'->'=83 +':'=84 +';'=85 +','=86 +'.'=87 +'{'=88 +'}'=89 +'['=90 +']'=91 +'('=92 +')'=93 +'<'=94 +'>'=95 diff --git a/src/capability-language/generated/QuixosCapabilityLexer.ts b/src/capability-language/generated/QuixosCapabilityLexer.ts index b00eebb..c62675a 100644 --- a/src/capability-language/generated/QuixosCapabilityLexer.ts +++ b/src/capability-language/generated/QuixosCapabilityLexer.ts @@ -5,146 +5,149 @@ import { Token } from "antlr4ng"; export class QuixosCapabilityLexer extends antlr.Lexer { public static readonly WORKSPACE = 1; - public static readonly ATOM = 2; - public static readonly INTERFACE = 3; - public static readonly INTERFACES = 4; - public static readonly PACKAGE = 5; - public static readonly VALUE = 6; - public static readonly RELATION = 7; - public static readonly OPERATION = 8; - public static readonly FUNCTION = 9; - public static readonly CONSTRUCTOR = 10; - public static readonly CONSTRUCTS = 11; - public static readonly CONFORM = 12; - public static readonly AS = 13; - public static readonly BIND = 14; - public static readonly TO = 15; - public static readonly PRIVATE = 16; - public static readonly SHARED = 17; - public static readonly STATE = 18; - public static readonly EDGE = 19; - public static readonly PROJECTION = 20; - public static readonly WITH = 21; - public static readonly USING = 22; - public static readonly VIA = 23; - public static readonly MATERIALIZE = 24; - public static readonly IF = 25; - public static readonly ABSENT = 26; - public static readonly ON = 27; - public static readonly POLICY = 28; - public static readonly DEFAULT = 29; - public static readonly SOURCE = 30; - public static readonly REPOSITORY = 31; - public static readonly COMMIT = 32; - public static readonly REVISION = 33; - public static readonly ID = 34; - public static readonly DOC = 35; - public static readonly MODE = 36; - public static readonly EMITS = 37; - public static readonly RECEIVER = 38; - public static readonly REQUIRES = 39; - public static readonly ANY = 40; - public static readonly GET = 41; - public static readonly SET = 42; - public static readonly WATCH = 43; - public static readonly START = 44; - public static readonly STOP = 45; - public static readonly READ = 46; - public static readonly WRITE = 47; - public static readonly RESOLVE = 48; - public static readonly CONNECT = 49; - public static readonly DISCONNECT = 50; - public static readonly CALL = 51; - public static readonly WATCH_START = 52; - public static readonly WATCH_STOP = 53; - public static readonly SUBSCRIBE = 54; - public static readonly UNSUBSCRIBE = 55; - public static readonly OPTIMISTIC_REGISTER = 56; - public static readonly CRDT = 57; - public static readonly OPTIONAL_ONE = 58; - public static readonly EXACTLY_ONE = 59; - public static readonly MANY_UNIQUE = 60; - public static readonly MANY = 61; - public static readonly ORDERED = 62; - public static readonly UNIT = 63; - public static readonly WATCH_HANDLE = 64; - public static readonly MESSAGE = 65; - public static readonly ATOM_REF = 66; - public static readonly INTERFACE_REF = 67; - public static readonly OPTIONAL = 68; - public static readonly LIST = 69; - public static readonly BOOL = 70; - public static readonly BYTES = 71; - public static readonly DOUBLE = 72; - public static readonly INT32 = 73; - public static readonly INT64 = 74; - public static readonly STRING = 75; - public static readonly UINT32 = 76; - public static readonly UINT64 = 77; - public static readonly TRUE = 78; - public static readonly FALSE = 79; - public static readonly NULL = 80; - public static readonly ARROW = 81; - public static readonly COLON = 82; - public static readonly SEMI = 83; - public static readonly COMMA = 84; - public static readonly DOT = 85; - public static readonly LBRACE = 86; - public static readonly RBRACE = 87; - public static readonly LBRACK = 88; - public static readonly RBRACK = 89; - public static readonly LPAREN = 90; - public static readonly RPAREN = 91; - public static readonly LT = 92; - public static readonly GT = 93; - public static readonly INTEGER = 94; - public static readonly JSON_NUMBER = 95; - public static readonly IDENTIFIER = 96; - public static readonly STRING_LITERAL = 97; - public static readonly LINE_COMMENT = 98; - public static readonly BLOCK_COMMENT = 99; - public static readonly WS = 100; + public static readonly IMPORT = 2; + public static readonly EXTERNAL = 3; + public static readonly ATOM = 4; + public static readonly INTERFACE = 5; + public static readonly INTERFACES = 6; + public static readonly PACKAGE = 7; + public static readonly VALUE = 8; + public static readonly RELATION = 9; + public static readonly OPERATION = 10; + public static readonly FUNCTION = 11; + public static readonly CONSTRUCTOR = 12; + public static readonly CONSTRUCTS = 13; + public static readonly CONFORM = 14; + public static readonly AS = 15; + public static readonly BIND = 16; + public static readonly TO = 17; + public static readonly PRIVATE = 18; + public static readonly SHARED = 19; + public static readonly STATE = 20; + public static readonly EDGE = 21; + public static readonly PROJECTION = 22; + public static readonly WITH = 23; + public static readonly USING = 24; + public static readonly VIA = 25; + public static readonly MATERIALIZE = 26; + public static readonly IF = 27; + public static readonly ABSENT = 28; + public static readonly ON = 29; + public static readonly POLICY = 30; + public static readonly DEFAULT = 31; + public static readonly SOURCE = 32; + public static readonly REPOSITORY = 33; + public static readonly COMMIT = 34; + public static readonly REVISION = 35; + public static readonly ID = 36; + public static readonly DOC = 37; + public static readonly MODE = 38; + public static readonly EMITS = 39; + public static readonly RECEIVER = 40; + public static readonly REQUIRES = 41; + public static readonly ANY = 42; + public static readonly GET = 43; + public static readonly SET = 44; + public static readonly WATCH = 45; + public static readonly START = 46; + public static readonly STOP = 47; + public static readonly READ = 48; + public static readonly WRITE = 49; + public static readonly RESOLVE = 50; + public static readonly CONNECT = 51; + public static readonly DISCONNECT = 52; + public static readonly CALL = 53; + public static readonly WATCH_START = 54; + public static readonly WATCH_STOP = 55; + public static readonly SUBSCRIBE = 56; + public static readonly UNSUBSCRIBE = 57; + public static readonly OPTIMISTIC_REGISTER = 58; + public static readonly CRDT = 59; + public static readonly OPTIONAL_ONE = 60; + public static readonly EXACTLY_ONE = 61; + public static readonly MANY_UNIQUE = 62; + public static readonly MANY = 63; + public static readonly ORDERED = 64; + public static readonly UNIT = 65; + public static readonly WATCH_HANDLE = 66; + public static readonly MESSAGE = 67; + public static readonly ATOM_REF = 68; + public static readonly INTERFACE_REF = 69; + public static readonly OPTIONAL = 70; + public static readonly LIST = 71; + public static readonly BOOL = 72; + public static readonly BYTES = 73; + public static readonly DOUBLE = 74; + public static readonly INT32 = 75; + public static readonly INT64 = 76; + public static readonly STRING = 77; + public static readonly UINT32 = 78; + public static readonly UINT64 = 79; + public static readonly TRUE = 80; + public static readonly FALSE = 81; + public static readonly NULL = 82; + public static readonly ARROW = 83; + public static readonly COLON = 84; + public static readonly SEMI = 85; + public static readonly COMMA = 86; + public static readonly DOT = 87; + public static readonly LBRACE = 88; + public static readonly RBRACE = 89; + public static readonly LBRACK = 90; + public static readonly RBRACK = 91; + public static readonly LPAREN = 92; + public static readonly RPAREN = 93; + public static readonly LT = 94; + public static readonly GT = 95; + public static readonly INTEGER = 96; + public static readonly JSON_NUMBER = 97; + public static readonly IDENTIFIER = 98; + public static readonly STRING_LITERAL = 99; + public static readonly LINE_COMMENT = 100; + public static readonly BLOCK_COMMENT = 101; + public static readonly WS = 102; public static readonly channelNames = [ "DEFAULT_TOKEN_CHANNEL", "HIDDEN" ]; public static readonly literalNames = [ - null, "'workspace'", "'atom'", "'interface'", "'interfaces'", "'package'", - "'value'", "'relation'", "'operation'", "'function'", "'constructor'", - "'constructs'", "'conform'", "'as'", "'bind'", "'to'", "'private'", - "'shared'", "'state'", "'edge'", "'projection'", "'with'", "'using'", - "'via'", "'materialize'", "'if'", "'absent'", "'on'", "'policy'", - "'default'", "'source'", "'repository'", "'commit'", "'revision'", - "'id'", "'doc'", "'mode'", "'emits'", "'receiver'", "'requires'", - "'any'", "'get'", "'set'", "'watch'", "'start'", "'stop'", "'read'", - "'write'", "'resolve'", "'connect'", "'disconnect'", "'call'", "'watch-start'", - "'watch-stop'", "'subscribe'", "'unsubscribe'", "'optimistic-register'", - "'crdt'", "'optional-one'", "'exactly-one'", "'many-unique'", "'many'", - "'ordered'", "'unit'", "'watch-handle'", "'message'", "'atom-ref'", - "'interface-ref'", "'optional'", "'list'", "'bool'", "'bytes'", - "'double'", "'int32'", "'int64'", "'string'", "'uint32'", "'uint64'", - "'true'", "'false'", "'null'", "'->'", "':'", "';'", "','", "'.'", - "'{'", "'}'", "'['", "']'", "'('", "')'", "'<'", "'>'" + null, "'workspace'", "'import'", "'external'", "'atom'", "'interface'", + "'interfaces'", "'package'", "'value'", "'relation'", "'operation'", + "'function'", "'constructor'", "'constructs'", "'conform'", "'as'", + "'bind'", "'to'", "'private'", "'shared'", "'state'", "'edge'", + "'projection'", "'with'", "'using'", "'via'", "'materialize'", "'if'", + "'absent'", "'on'", "'policy'", "'default'", "'source'", "'repository'", + "'commit'", "'revision'", "'id'", "'doc'", "'mode'", "'emits'", + "'receiver'", "'requires'", "'any'", "'get'", "'set'", "'watch'", + "'start'", "'stop'", "'read'", "'write'", "'resolve'", "'connect'", + "'disconnect'", "'call'", "'watch-start'", "'watch-stop'", "'subscribe'", + "'unsubscribe'", "'optimistic-register'", "'crdt'", "'optional-one'", + "'exactly-one'", "'many-unique'", "'many'", "'ordered'", "'unit'", + "'watch-handle'", "'message'", "'atom-ref'", "'interface-ref'", + "'optional'", "'list'", "'bool'", "'bytes'", "'double'", "'int32'", + "'int64'", "'string'", "'uint32'", "'uint64'", "'true'", "'false'", + "'null'", "'->'", "':'", "';'", "','", "'.'", "'{'", "'}'", "'['", + "']'", "'('", "')'", "'<'", "'>'" ]; public static readonly symbolicNames = [ - null, "WORKSPACE", "ATOM", "INTERFACE", "INTERFACES", "PACKAGE", - "VALUE", "RELATION", "OPERATION", "FUNCTION", "CONSTRUCTOR", "CONSTRUCTS", - "CONFORM", "AS", "BIND", "TO", "PRIVATE", "SHARED", "STATE", "EDGE", - "PROJECTION", "WITH", "USING", "VIA", "MATERIALIZE", "IF", "ABSENT", - "ON", "POLICY", "DEFAULT", "SOURCE", "REPOSITORY", "COMMIT", "REVISION", - "ID", "DOC", "MODE", "EMITS", "RECEIVER", "REQUIRES", "ANY", "GET", - "SET", "WATCH", "START", "STOP", "READ", "WRITE", "RESOLVE", "CONNECT", - "DISCONNECT", "CALL", "WATCH_START", "WATCH_STOP", "SUBSCRIBE", - "UNSUBSCRIBE", "OPTIMISTIC_REGISTER", "CRDT", "OPTIONAL_ONE", "EXACTLY_ONE", - "MANY_UNIQUE", "MANY", "ORDERED", "UNIT", "WATCH_HANDLE", "MESSAGE", - "ATOM_REF", "INTERFACE_REF", "OPTIONAL", "LIST", "BOOL", "BYTES", - "DOUBLE", "INT32", "INT64", "STRING", "UINT32", "UINT64", "TRUE", - "FALSE", "NULL", "ARROW", "COLON", "SEMI", "COMMA", "DOT", "LBRACE", - "RBRACE", "LBRACK", "RBRACK", "LPAREN", "RPAREN", "LT", "GT", "INTEGER", - "JSON_NUMBER", "IDENTIFIER", "STRING_LITERAL", "LINE_COMMENT", "BLOCK_COMMENT", - "WS" + null, "WORKSPACE", "IMPORT", "EXTERNAL", "ATOM", "INTERFACE", "INTERFACES", + "PACKAGE", "VALUE", "RELATION", "OPERATION", "FUNCTION", "CONSTRUCTOR", + "CONSTRUCTS", "CONFORM", "AS", "BIND", "TO", "PRIVATE", "SHARED", + "STATE", "EDGE", "PROJECTION", "WITH", "USING", "VIA", "MATERIALIZE", + "IF", "ABSENT", "ON", "POLICY", "DEFAULT", "SOURCE", "REPOSITORY", + "COMMIT", "REVISION", "ID", "DOC", "MODE", "EMITS", "RECEIVER", + "REQUIRES", "ANY", "GET", "SET", "WATCH", "START", "STOP", "READ", + "WRITE", "RESOLVE", "CONNECT", "DISCONNECT", "CALL", "WATCH_START", + "WATCH_STOP", "SUBSCRIBE", "UNSUBSCRIBE", "OPTIMISTIC_REGISTER", + "CRDT", "OPTIONAL_ONE", "EXACTLY_ONE", "MANY_UNIQUE", "MANY", "ORDERED", + "UNIT", "WATCH_HANDLE", "MESSAGE", "ATOM_REF", "INTERFACE_REF", + "OPTIONAL", "LIST", "BOOL", "BYTES", "DOUBLE", "INT32", "INT64", + "STRING", "UINT32", "UINT64", "TRUE", "FALSE", "NULL", "ARROW", + "COLON", "SEMI", "COMMA", "DOT", "LBRACE", "RBRACE", "LBRACK", "RBRACK", + "LPAREN", "RPAREN", "LT", "GT", "INTEGER", "JSON_NUMBER", "IDENTIFIER", + "STRING_LITERAL", "LINE_COMMENT", "BLOCK_COMMENT", "WS" ]; public static readonly modeNames = [ @@ -152,22 +155,23 @@ export class QuixosCapabilityLexer extends antlr.Lexer { ]; public static readonly ruleNames = [ - "WORKSPACE", "ATOM", "INTERFACE", "INTERFACES", "PACKAGE", "VALUE", - "RELATION", "OPERATION", "FUNCTION", "CONSTRUCTOR", "CONSTRUCTS", - "CONFORM", "AS", "BIND", "TO", "PRIVATE", "SHARED", "STATE", "EDGE", - "PROJECTION", "WITH", "USING", "VIA", "MATERIALIZE", "IF", "ABSENT", - "ON", "POLICY", "DEFAULT", "SOURCE", "REPOSITORY", "COMMIT", "REVISION", - "ID", "DOC", "MODE", "EMITS", "RECEIVER", "REQUIRES", "ANY", "GET", - "SET", "WATCH", "START", "STOP", "READ", "WRITE", "RESOLVE", "CONNECT", - "DISCONNECT", "CALL", "WATCH_START", "WATCH_STOP", "SUBSCRIBE", - "UNSUBSCRIBE", "OPTIMISTIC_REGISTER", "CRDT", "OPTIONAL_ONE", "EXACTLY_ONE", - "MANY_UNIQUE", "MANY", "ORDERED", "UNIT", "WATCH_HANDLE", "MESSAGE", - "ATOM_REF", "INTERFACE_REF", "OPTIONAL", "LIST", "BOOL", "BYTES", - "DOUBLE", "INT32", "INT64", "STRING", "UINT32", "UINT64", "TRUE", - "FALSE", "NULL", "ARROW", "COLON", "SEMI", "COMMA", "DOT", "LBRACE", - "RBRACE", "LBRACK", "RBRACK", "LPAREN", "RPAREN", "LT", "GT", "INTEGER", - "JSON_NUMBER", "IDENTIFIER", "STRING_LITERAL", "ESC", "HEX", "LINE_COMMENT", - "BLOCK_COMMENT", "WS", + "WORKSPACE", "IMPORT", "EXTERNAL", "ATOM", "INTERFACE", "INTERFACES", + "PACKAGE", "VALUE", "RELATION", "OPERATION", "FUNCTION", "CONSTRUCTOR", + "CONSTRUCTS", "CONFORM", "AS", "BIND", "TO", "PRIVATE", "SHARED", + "STATE", "EDGE", "PROJECTION", "WITH", "USING", "VIA", "MATERIALIZE", + "IF", "ABSENT", "ON", "POLICY", "DEFAULT", "SOURCE", "REPOSITORY", + "COMMIT", "REVISION", "ID", "DOC", "MODE", "EMITS", "RECEIVER", + "REQUIRES", "ANY", "GET", "SET", "WATCH", "START", "STOP", "READ", + "WRITE", "RESOLVE", "CONNECT", "DISCONNECT", "CALL", "WATCH_START", + "WATCH_STOP", "SUBSCRIBE", "UNSUBSCRIBE", "OPTIMISTIC_REGISTER", + "CRDT", "OPTIONAL_ONE", "EXACTLY_ONE", "MANY_UNIQUE", "MANY", "ORDERED", + "UNIT", "WATCH_HANDLE", "MESSAGE", "ATOM_REF", "INTERFACE_REF", + "OPTIONAL", "LIST", "BOOL", "BYTES", "DOUBLE", "INT32", "INT64", + "STRING", "UINT32", "UINT64", "TRUE", "FALSE", "NULL", "ARROW", + "COLON", "SEMI", "COMMA", "DOT", "LBRACE", "RBRACE", "LBRACK", "RBRACK", + "LPAREN", "RPAREN", "LT", "GT", "INTEGER", "JSON_NUMBER", "IDENTIFIER", + "STRING_LITERAL", "ESC", "HEX", "LINE_COMMENT", "BLOCK_COMMENT", + "WS", ]; @@ -189,7 +193,7 @@ export class QuixosCapabilityLexer extends antlr.Lexer { public get modeNames(): string[] { return QuixosCapabilityLexer.modeNames; } public static readonly _serializedATN: number[] = [ - 4,0,100,937,6,-1,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5, + 4,0,102,957,6,-1,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5, 2,6,7,6,2,7,7,7,2,8,7,8,2,9,7,9,2,10,7,10,2,11,7,11,2,12,7,12,2, 13,7,13,2,14,7,14,2,15,7,15,2,16,7,16,2,17,7,17,2,18,7,18,2,19,7, 19,2,20,7,20,2,21,7,21,2,22,7,22,2,23,7,23,2,24,7,24,2,25,7,25,2, @@ -204,324 +208,332 @@ export class QuixosCapabilityLexer extends antlr.Lexer { 78,7,78,2,79,7,79,2,80,7,80,2,81,7,81,2,82,7,82,2,83,7,83,2,84,7, 84,2,85,7,85,2,86,7,86,2,87,7,87,2,88,7,88,2,89,7,89,2,90,7,90,2, 91,7,91,2,92,7,92,2,93,7,93,2,94,7,94,2,95,7,95,2,96,7,96,2,97,7, - 97,2,98,7,98,2,99,7,99,2,100,7,100,2,101,7,101,1,0,1,0,1,0,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,2,1,2,1,2,1,2,1,2,1, - 2,1,2,1,2,1,2,1,2,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1, - 4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,5,1,5,1,5,1,5,1,5,1,5,1,6,1,6,1, - 6,1,6,1,6,1,6,1,6,1,6,1,6,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1, - 7,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,9,1,9,1,9,1,9,1,9,1,9,1, - 9,1,9,1,9,1,9,1,9,1,9,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1, - 10,1,10,1,10,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,12,1,12,1, - 12,1,13,1,13,1,13,1,13,1,13,1,14,1,14,1,14,1,15,1,15,1,15,1,15,1, - 15,1,15,1,15,1,15,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,17,1,17,1, - 17,1,17,1,17,1,17,1,18,1,18,1,18,1,18,1,18,1,19,1,19,1,19,1,19,1, - 19,1,19,1,19,1,19,1,19,1,19,1,19,1,20,1,20,1,20,1,20,1,20,1,21,1, - 21,1,21,1,21,1,21,1,21,1,22,1,22,1,22,1,22,1,23,1,23,1,23,1,23,1, - 23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,24,1,24,1,24,1,25,1,25,1, - 25,1,25,1,25,1,25,1,25,1,26,1,26,1,26,1,27,1,27,1,27,1,27,1,27,1, - 27,1,27,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,29,1,29,1,29,1, - 29,1,29,1,29,1,29,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1, - 30,1,30,1,31,1,31,1,31,1,31,1,31,1,31,1,31,1,32,1,32,1,32,1,32,1, - 32,1,32,1,32,1,32,1,32,1,33,1,33,1,33,1,34,1,34,1,34,1,34,1,35,1, - 35,1,35,1,35,1,35,1,36,1,36,1,36,1,36,1,36,1,36,1,37,1,37,1,37,1, - 37,1,37,1,37,1,37,1,37,1,37,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1, - 38,1,38,1,39,1,39,1,39,1,39,1,40,1,40,1,40,1,40,1,41,1,41,1,41,1, - 41,1,42,1,42,1,42,1,42,1,42,1,42,1,43,1,43,1,43,1,43,1,43,1,43,1, - 44,1,44,1,44,1,44,1,44,1,45,1,45,1,45,1,45,1,45,1,46,1,46,1,46,1, - 46,1,46,1,46,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,48,1,48,1, - 48,1,48,1,48,1,48,1,48,1,48,1,49,1,49,1,49,1,49,1,49,1,49,1,49,1, - 49,1,49,1,49,1,49,1,50,1,50,1,50,1,50,1,50,1,51,1,51,1,51,1,51,1, - 51,1,51,1,51,1,51,1,51,1,51,1,51,1,51,1,52,1,52,1,52,1,52,1,52,1, - 52,1,52,1,52,1,52,1,52,1,52,1,53,1,53,1,53,1,53,1,53,1,53,1,53,1, - 53,1,53,1,53,1,54,1,54,1,54,1,54,1,54,1,54,1,54,1,54,1,54,1,54,1, - 54,1,54,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1, - 55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,56,1,56,1,56,1,56,1, - 56,1,57,1,57,1,57,1,57,1,57,1,57,1,57,1,57,1,57,1,57,1,57,1,57,1, - 57,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1, - 59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,60,1, - 60,1,60,1,60,1,60,1,61,1,61,1,61,1,61,1,61,1,61,1,61,1,61,1,62,1, - 62,1,62,1,62,1,62,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1, - 63,1,63,1,63,1,63,1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,65,1, - 65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,66,1,66,1,66,1,66,1,66,1, - 66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,67,1,67,1,67,1,67,1, - 67,1,67,1,67,1,67,1,67,1,68,1,68,1,68,1,68,1,68,1,69,1,69,1,69,1, - 69,1,69,1,70,1,70,1,70,1,70,1,70,1,70,1,71,1,71,1,71,1,71,1,71,1, - 71,1,71,1,72,1,72,1,72,1,72,1,72,1,72,1,73,1,73,1,73,1,73,1,73,1, - 73,1,74,1,74,1,74,1,74,1,74,1,74,1,74,1,75,1,75,1,75,1,75,1,75,1, - 75,1,75,1,76,1,76,1,76,1,76,1,76,1,76,1,76,1,77,1,77,1,77,1,77,1, - 77,1,78,1,78,1,78,1,78,1,78,1,78,1,79,1,79,1,79,1,79,1,79,1,80,1, - 80,1,80,1,81,1,81,1,82,1,82,1,83,1,83,1,84,1,84,1,85,1,85,1,86,1, - 86,1,87,1,87,1,88,1,88,1,89,1,89,1,90,1,90,1,91,1,91,1,92,1,92,1, - 93,3,93,838,8,93,1,93,4,93,841,8,93,11,93,12,93,842,1,94,3,94,846, - 8,94,1,94,1,94,1,94,5,94,851,8,94,10,94,12,94,854,9,94,3,94,856, - 8,94,1,94,1,94,4,94,860,8,94,11,94,12,94,861,3,94,864,8,94,1,94, - 1,94,3,94,868,8,94,1,94,4,94,871,8,94,11,94,12,94,872,3,94,875,8, - 94,1,95,1,95,5,95,879,8,95,10,95,12,95,882,9,95,1,96,1,96,1,96,5, - 96,887,8,96,10,96,12,96,890,9,96,1,96,1,96,1,97,1,97,1,97,1,97,1, - 97,1,97,1,97,1,97,3,97,902,8,97,1,98,1,98,1,99,1,99,1,99,1,99,5, - 99,910,8,99,10,99,12,99,913,9,99,1,99,1,99,1,100,1,100,1,100,1,100, - 5,100,921,8,100,10,100,12,100,924,9,100,1,100,1,100,1,100,1,100, - 1,100,1,101,4,101,932,8,101,11,101,12,101,933,1,101,1,101,1,922, - 0,102,1,1,3,2,5,3,7,4,9,5,11,6,13,7,15,8,17,9,19,10,21,11,23,12, - 25,13,27,14,29,15,31,16,33,17,35,18,37,19,39,20,41,21,43,22,45,23, - 47,24,49,25,51,26,53,27,55,28,57,29,59,30,61,31,63,32,65,33,67,34, - 69,35,71,36,73,37,75,38,77,39,79,40,81,41,83,42,85,43,87,44,89,45, - 91,46,93,47,95,48,97,49,99,50,101,51,103,52,105,53,107,54,109,55, - 111,56,113,57,115,58,117,59,119,60,121,61,123,62,125,63,127,64,129, - 65,131,66,133,67,135,68,137,69,139,70,141,71,143,72,145,73,147,74, - 149,75,151,76,153,77,155,78,157,79,159,80,161,81,163,82,165,83,167, - 84,169,85,171,86,173,87,175,88,177,89,179,90,181,91,183,92,185,93, - 187,94,189,95,191,96,193,97,195,0,197,0,199,98,201,99,203,100,1, - 0,11,1,0,48,57,1,0,49,57,2,0,69,69,101,101,2,0,43,43,45,45,3,0,65, - 90,95,95,97,122,4,0,48,57,65,90,95,95,97,122,4,0,10,10,13,13,34, - 34,92,92,8,0,34,34,47,47,92,92,98,98,102,102,110,110,114,114,116, - 116,3,0,48,57,65,70,97,102,2,0,10,10,13,13,3,0,9,10,13,13,32,32, - 951,0,1,1,0,0,0,0,3,1,0,0,0,0,5,1,0,0,0,0,7,1,0,0,0,0,9,1,0,0,0, - 0,11,1,0,0,0,0,13,1,0,0,0,0,15,1,0,0,0,0,17,1,0,0,0,0,19,1,0,0,0, - 0,21,1,0,0,0,0,23,1,0,0,0,0,25,1,0,0,0,0,27,1,0,0,0,0,29,1,0,0,0, - 0,31,1,0,0,0,0,33,1,0,0,0,0,35,1,0,0,0,0,37,1,0,0,0,0,39,1,0,0,0, - 0,41,1,0,0,0,0,43,1,0,0,0,0,45,1,0,0,0,0,47,1,0,0,0,0,49,1,0,0,0, - 0,51,1,0,0,0,0,53,1,0,0,0,0,55,1,0,0,0,0,57,1,0,0,0,0,59,1,0,0,0, - 0,61,1,0,0,0,0,63,1,0,0,0,0,65,1,0,0,0,0,67,1,0,0,0,0,69,1,0,0,0, - 0,71,1,0,0,0,0,73,1,0,0,0,0,75,1,0,0,0,0,77,1,0,0,0,0,79,1,0,0,0, - 0,81,1,0,0,0,0,83,1,0,0,0,0,85,1,0,0,0,0,87,1,0,0,0,0,89,1,0,0,0, - 0,91,1,0,0,0,0,93,1,0,0,0,0,95,1,0,0,0,0,97,1,0,0,0,0,99,1,0,0,0, - 0,101,1,0,0,0,0,103,1,0,0,0,0,105,1,0,0,0,0,107,1,0,0,0,0,109,1, - 0,0,0,0,111,1,0,0,0,0,113,1,0,0,0,0,115,1,0,0,0,0,117,1,0,0,0,0, - 119,1,0,0,0,0,121,1,0,0,0,0,123,1,0,0,0,0,125,1,0,0,0,0,127,1,0, - 0,0,0,129,1,0,0,0,0,131,1,0,0,0,0,133,1,0,0,0,0,135,1,0,0,0,0,137, - 1,0,0,0,0,139,1,0,0,0,0,141,1,0,0,0,0,143,1,0,0,0,0,145,1,0,0,0, - 0,147,1,0,0,0,0,149,1,0,0,0,0,151,1,0,0,0,0,153,1,0,0,0,0,155,1, - 0,0,0,0,157,1,0,0,0,0,159,1,0,0,0,0,161,1,0,0,0,0,163,1,0,0,0,0, - 165,1,0,0,0,0,167,1,0,0,0,0,169,1,0,0,0,0,171,1,0,0,0,0,173,1,0, - 0,0,0,175,1,0,0,0,0,177,1,0,0,0,0,179,1,0,0,0,0,181,1,0,0,0,0,183, - 1,0,0,0,0,185,1,0,0,0,0,187,1,0,0,0,0,189,1,0,0,0,0,191,1,0,0,0, - 0,193,1,0,0,0,0,199,1,0,0,0,0,201,1,0,0,0,0,203,1,0,0,0,1,205,1, - 0,0,0,3,215,1,0,0,0,5,220,1,0,0,0,7,230,1,0,0,0,9,241,1,0,0,0,11, - 249,1,0,0,0,13,255,1,0,0,0,15,264,1,0,0,0,17,274,1,0,0,0,19,283, - 1,0,0,0,21,295,1,0,0,0,23,306,1,0,0,0,25,314,1,0,0,0,27,317,1,0, - 0,0,29,322,1,0,0,0,31,325,1,0,0,0,33,333,1,0,0,0,35,340,1,0,0,0, - 37,346,1,0,0,0,39,351,1,0,0,0,41,362,1,0,0,0,43,367,1,0,0,0,45,373, - 1,0,0,0,47,377,1,0,0,0,49,389,1,0,0,0,51,392,1,0,0,0,53,399,1,0, - 0,0,55,402,1,0,0,0,57,409,1,0,0,0,59,417,1,0,0,0,61,424,1,0,0,0, - 63,435,1,0,0,0,65,442,1,0,0,0,67,451,1,0,0,0,69,454,1,0,0,0,71,458, - 1,0,0,0,73,463,1,0,0,0,75,469,1,0,0,0,77,478,1,0,0,0,79,487,1,0, - 0,0,81,491,1,0,0,0,83,495,1,0,0,0,85,499,1,0,0,0,87,505,1,0,0,0, - 89,511,1,0,0,0,91,516,1,0,0,0,93,521,1,0,0,0,95,527,1,0,0,0,97,535, - 1,0,0,0,99,543,1,0,0,0,101,554,1,0,0,0,103,559,1,0,0,0,105,571,1, - 0,0,0,107,582,1,0,0,0,109,592,1,0,0,0,111,604,1,0,0,0,113,624,1, - 0,0,0,115,629,1,0,0,0,117,642,1,0,0,0,119,654,1,0,0,0,121,666,1, - 0,0,0,123,671,1,0,0,0,125,679,1,0,0,0,127,684,1,0,0,0,129,697,1, - 0,0,0,131,705,1,0,0,0,133,714,1,0,0,0,135,728,1,0,0,0,137,737,1, - 0,0,0,139,742,1,0,0,0,141,747,1,0,0,0,143,753,1,0,0,0,145,760,1, - 0,0,0,147,766,1,0,0,0,149,772,1,0,0,0,151,779,1,0,0,0,153,786,1, - 0,0,0,155,793,1,0,0,0,157,798,1,0,0,0,159,804,1,0,0,0,161,809,1, - 0,0,0,163,812,1,0,0,0,165,814,1,0,0,0,167,816,1,0,0,0,169,818,1, - 0,0,0,171,820,1,0,0,0,173,822,1,0,0,0,175,824,1,0,0,0,177,826,1, - 0,0,0,179,828,1,0,0,0,181,830,1,0,0,0,183,832,1,0,0,0,185,834,1, - 0,0,0,187,837,1,0,0,0,189,845,1,0,0,0,191,876,1,0,0,0,193,883,1, - 0,0,0,195,893,1,0,0,0,197,903,1,0,0,0,199,905,1,0,0,0,201,916,1, - 0,0,0,203,931,1,0,0,0,205,206,5,119,0,0,206,207,5,111,0,0,207,208, - 5,114,0,0,208,209,5,107,0,0,209,210,5,115,0,0,210,211,5,112,0,0, - 211,212,5,97,0,0,212,213,5,99,0,0,213,214,5,101,0,0,214,2,1,0,0, - 0,215,216,5,97,0,0,216,217,5,116,0,0,217,218,5,111,0,0,218,219,5, - 109,0,0,219,4,1,0,0,0,220,221,5,105,0,0,221,222,5,110,0,0,222,223, - 5,116,0,0,223,224,5,101,0,0,224,225,5,114,0,0,225,226,5,102,0,0, - 226,227,5,97,0,0,227,228,5,99,0,0,228,229,5,101,0,0,229,6,1,0,0, - 0,230,231,5,105,0,0,231,232,5,110,0,0,232,233,5,116,0,0,233,234, - 5,101,0,0,234,235,5,114,0,0,235,236,5,102,0,0,236,237,5,97,0,0,237, - 238,5,99,0,0,238,239,5,101,0,0,239,240,5,115,0,0,240,8,1,0,0,0,241, - 242,5,112,0,0,242,243,5,97,0,0,243,244,5,99,0,0,244,245,5,107,0, - 0,245,246,5,97,0,0,246,247,5,103,0,0,247,248,5,101,0,0,248,10,1, - 0,0,0,249,250,5,118,0,0,250,251,5,97,0,0,251,252,5,108,0,0,252,253, - 5,117,0,0,253,254,5,101,0,0,254,12,1,0,0,0,255,256,5,114,0,0,256, - 257,5,101,0,0,257,258,5,108,0,0,258,259,5,97,0,0,259,260,5,116,0, - 0,260,261,5,105,0,0,261,262,5,111,0,0,262,263,5,110,0,0,263,14,1, - 0,0,0,264,265,5,111,0,0,265,266,5,112,0,0,266,267,5,101,0,0,267, - 268,5,114,0,0,268,269,5,97,0,0,269,270,5,116,0,0,270,271,5,105,0, - 0,271,272,5,111,0,0,272,273,5,110,0,0,273,16,1,0,0,0,274,275,5,102, - 0,0,275,276,5,117,0,0,276,277,5,110,0,0,277,278,5,99,0,0,278,279, - 5,116,0,0,279,280,5,105,0,0,280,281,5,111,0,0,281,282,5,110,0,0, - 282,18,1,0,0,0,283,284,5,99,0,0,284,285,5,111,0,0,285,286,5,110, - 0,0,286,287,5,115,0,0,287,288,5,116,0,0,288,289,5,114,0,0,289,290, - 5,117,0,0,290,291,5,99,0,0,291,292,5,116,0,0,292,293,5,111,0,0,293, - 294,5,114,0,0,294,20,1,0,0,0,295,296,5,99,0,0,296,297,5,111,0,0, - 297,298,5,110,0,0,298,299,5,115,0,0,299,300,5,116,0,0,300,301,5, - 114,0,0,301,302,5,117,0,0,302,303,5,99,0,0,303,304,5,116,0,0,304, - 305,5,115,0,0,305,22,1,0,0,0,306,307,5,99,0,0,307,308,5,111,0,0, - 308,309,5,110,0,0,309,310,5,102,0,0,310,311,5,111,0,0,311,312,5, - 114,0,0,312,313,5,109,0,0,313,24,1,0,0,0,314,315,5,97,0,0,315,316, - 5,115,0,0,316,26,1,0,0,0,317,318,5,98,0,0,318,319,5,105,0,0,319, - 320,5,110,0,0,320,321,5,100,0,0,321,28,1,0,0,0,322,323,5,116,0,0, - 323,324,5,111,0,0,324,30,1,0,0,0,325,326,5,112,0,0,326,327,5,114, - 0,0,327,328,5,105,0,0,328,329,5,118,0,0,329,330,5,97,0,0,330,331, - 5,116,0,0,331,332,5,101,0,0,332,32,1,0,0,0,333,334,5,115,0,0,334, - 335,5,104,0,0,335,336,5,97,0,0,336,337,5,114,0,0,337,338,5,101,0, - 0,338,339,5,100,0,0,339,34,1,0,0,0,340,341,5,115,0,0,341,342,5,116, - 0,0,342,343,5,97,0,0,343,344,5,116,0,0,344,345,5,101,0,0,345,36, - 1,0,0,0,346,347,5,101,0,0,347,348,5,100,0,0,348,349,5,103,0,0,349, - 350,5,101,0,0,350,38,1,0,0,0,351,352,5,112,0,0,352,353,5,114,0,0, - 353,354,5,111,0,0,354,355,5,106,0,0,355,356,5,101,0,0,356,357,5, - 99,0,0,357,358,5,116,0,0,358,359,5,105,0,0,359,360,5,111,0,0,360, - 361,5,110,0,0,361,40,1,0,0,0,362,363,5,119,0,0,363,364,5,105,0,0, - 364,365,5,116,0,0,365,366,5,104,0,0,366,42,1,0,0,0,367,368,5,117, - 0,0,368,369,5,115,0,0,369,370,5,105,0,0,370,371,5,110,0,0,371,372, - 5,103,0,0,372,44,1,0,0,0,373,374,5,118,0,0,374,375,5,105,0,0,375, - 376,5,97,0,0,376,46,1,0,0,0,377,378,5,109,0,0,378,379,5,97,0,0,379, - 380,5,116,0,0,380,381,5,101,0,0,381,382,5,114,0,0,382,383,5,105, - 0,0,383,384,5,97,0,0,384,385,5,108,0,0,385,386,5,105,0,0,386,387, - 5,122,0,0,387,388,5,101,0,0,388,48,1,0,0,0,389,390,5,105,0,0,390, - 391,5,102,0,0,391,50,1,0,0,0,392,393,5,97,0,0,393,394,5,98,0,0,394, - 395,5,115,0,0,395,396,5,101,0,0,396,397,5,110,0,0,397,398,5,116, - 0,0,398,52,1,0,0,0,399,400,5,111,0,0,400,401,5,110,0,0,401,54,1, - 0,0,0,402,403,5,112,0,0,403,404,5,111,0,0,404,405,5,108,0,0,405, - 406,5,105,0,0,406,407,5,99,0,0,407,408,5,121,0,0,408,56,1,0,0,0, - 409,410,5,100,0,0,410,411,5,101,0,0,411,412,5,102,0,0,412,413,5, - 97,0,0,413,414,5,117,0,0,414,415,5,108,0,0,415,416,5,116,0,0,416, - 58,1,0,0,0,417,418,5,115,0,0,418,419,5,111,0,0,419,420,5,117,0,0, - 420,421,5,114,0,0,421,422,5,99,0,0,422,423,5,101,0,0,423,60,1,0, - 0,0,424,425,5,114,0,0,425,426,5,101,0,0,426,427,5,112,0,0,427,428, - 5,111,0,0,428,429,5,115,0,0,429,430,5,105,0,0,430,431,5,116,0,0, - 431,432,5,111,0,0,432,433,5,114,0,0,433,434,5,121,0,0,434,62,1,0, - 0,0,435,436,5,99,0,0,436,437,5,111,0,0,437,438,5,109,0,0,438,439, - 5,109,0,0,439,440,5,105,0,0,440,441,5,116,0,0,441,64,1,0,0,0,442, - 443,5,114,0,0,443,444,5,101,0,0,444,445,5,118,0,0,445,446,5,105, - 0,0,446,447,5,115,0,0,447,448,5,105,0,0,448,449,5,111,0,0,449,450, - 5,110,0,0,450,66,1,0,0,0,451,452,5,105,0,0,452,453,5,100,0,0,453, - 68,1,0,0,0,454,455,5,100,0,0,455,456,5,111,0,0,456,457,5,99,0,0, - 457,70,1,0,0,0,458,459,5,109,0,0,459,460,5,111,0,0,460,461,5,100, - 0,0,461,462,5,101,0,0,462,72,1,0,0,0,463,464,5,101,0,0,464,465,5, - 109,0,0,465,466,5,105,0,0,466,467,5,116,0,0,467,468,5,115,0,0,468, - 74,1,0,0,0,469,470,5,114,0,0,470,471,5,101,0,0,471,472,5,99,0,0, - 472,473,5,101,0,0,473,474,5,105,0,0,474,475,5,118,0,0,475,476,5, - 101,0,0,476,477,5,114,0,0,477,76,1,0,0,0,478,479,5,114,0,0,479,480, - 5,101,0,0,480,481,5,113,0,0,481,482,5,117,0,0,482,483,5,105,0,0, - 483,484,5,114,0,0,484,485,5,101,0,0,485,486,5,115,0,0,486,78,1,0, - 0,0,487,488,5,97,0,0,488,489,5,110,0,0,489,490,5,121,0,0,490,80, - 1,0,0,0,491,492,5,103,0,0,492,493,5,101,0,0,493,494,5,116,0,0,494, - 82,1,0,0,0,495,496,5,115,0,0,496,497,5,101,0,0,497,498,5,116,0,0, - 498,84,1,0,0,0,499,500,5,119,0,0,500,501,5,97,0,0,501,502,5,116, - 0,0,502,503,5,99,0,0,503,504,5,104,0,0,504,86,1,0,0,0,505,506,5, - 115,0,0,506,507,5,116,0,0,507,508,5,97,0,0,508,509,5,114,0,0,509, - 510,5,116,0,0,510,88,1,0,0,0,511,512,5,115,0,0,512,513,5,116,0,0, - 513,514,5,111,0,0,514,515,5,112,0,0,515,90,1,0,0,0,516,517,5,114, - 0,0,517,518,5,101,0,0,518,519,5,97,0,0,519,520,5,100,0,0,520,92, - 1,0,0,0,521,522,5,119,0,0,522,523,5,114,0,0,523,524,5,105,0,0,524, - 525,5,116,0,0,525,526,5,101,0,0,526,94,1,0,0,0,527,528,5,114,0,0, - 528,529,5,101,0,0,529,530,5,115,0,0,530,531,5,111,0,0,531,532,5, - 108,0,0,532,533,5,118,0,0,533,534,5,101,0,0,534,96,1,0,0,0,535,536, - 5,99,0,0,536,537,5,111,0,0,537,538,5,110,0,0,538,539,5,110,0,0,539, - 540,5,101,0,0,540,541,5,99,0,0,541,542,5,116,0,0,542,98,1,0,0,0, - 543,544,5,100,0,0,544,545,5,105,0,0,545,546,5,115,0,0,546,547,5, - 99,0,0,547,548,5,111,0,0,548,549,5,110,0,0,549,550,5,110,0,0,550, - 551,5,101,0,0,551,552,5,99,0,0,552,553,5,116,0,0,553,100,1,0,0,0, - 554,555,5,99,0,0,555,556,5,97,0,0,556,557,5,108,0,0,557,558,5,108, - 0,0,558,102,1,0,0,0,559,560,5,119,0,0,560,561,5,97,0,0,561,562,5, - 116,0,0,562,563,5,99,0,0,563,564,5,104,0,0,564,565,5,45,0,0,565, - 566,5,115,0,0,566,567,5,116,0,0,567,568,5,97,0,0,568,569,5,114,0, - 0,569,570,5,116,0,0,570,104,1,0,0,0,571,572,5,119,0,0,572,573,5, - 97,0,0,573,574,5,116,0,0,574,575,5,99,0,0,575,576,5,104,0,0,576, - 577,5,45,0,0,577,578,5,115,0,0,578,579,5,116,0,0,579,580,5,111,0, - 0,580,581,5,112,0,0,581,106,1,0,0,0,582,583,5,115,0,0,583,584,5, - 117,0,0,584,585,5,98,0,0,585,586,5,115,0,0,586,587,5,99,0,0,587, - 588,5,114,0,0,588,589,5,105,0,0,589,590,5,98,0,0,590,591,5,101,0, - 0,591,108,1,0,0,0,592,593,5,117,0,0,593,594,5,110,0,0,594,595,5, - 115,0,0,595,596,5,117,0,0,596,597,5,98,0,0,597,598,5,115,0,0,598, - 599,5,99,0,0,599,600,5,114,0,0,600,601,5,105,0,0,601,602,5,98,0, - 0,602,603,5,101,0,0,603,110,1,0,0,0,604,605,5,111,0,0,605,606,5, - 112,0,0,606,607,5,116,0,0,607,608,5,105,0,0,608,609,5,109,0,0,609, - 610,5,105,0,0,610,611,5,115,0,0,611,612,5,116,0,0,612,613,5,105, - 0,0,613,614,5,99,0,0,614,615,5,45,0,0,615,616,5,114,0,0,616,617, - 5,101,0,0,617,618,5,103,0,0,618,619,5,105,0,0,619,620,5,115,0,0, - 620,621,5,116,0,0,621,622,5,101,0,0,622,623,5,114,0,0,623,112,1, - 0,0,0,624,625,5,99,0,0,625,626,5,114,0,0,626,627,5,100,0,0,627,628, - 5,116,0,0,628,114,1,0,0,0,629,630,5,111,0,0,630,631,5,112,0,0,631, - 632,5,116,0,0,632,633,5,105,0,0,633,634,5,111,0,0,634,635,5,110, - 0,0,635,636,5,97,0,0,636,637,5,108,0,0,637,638,5,45,0,0,638,639, - 5,111,0,0,639,640,5,110,0,0,640,641,5,101,0,0,641,116,1,0,0,0,642, - 643,5,101,0,0,643,644,5,120,0,0,644,645,5,97,0,0,645,646,5,99,0, - 0,646,647,5,116,0,0,647,648,5,108,0,0,648,649,5,121,0,0,649,650, - 5,45,0,0,650,651,5,111,0,0,651,652,5,110,0,0,652,653,5,101,0,0,653, - 118,1,0,0,0,654,655,5,109,0,0,655,656,5,97,0,0,656,657,5,110,0,0, - 657,658,5,121,0,0,658,659,5,45,0,0,659,660,5,117,0,0,660,661,5,110, - 0,0,661,662,5,105,0,0,662,663,5,113,0,0,663,664,5,117,0,0,664,665, - 5,101,0,0,665,120,1,0,0,0,666,667,5,109,0,0,667,668,5,97,0,0,668, - 669,5,110,0,0,669,670,5,121,0,0,670,122,1,0,0,0,671,672,5,111,0, - 0,672,673,5,114,0,0,673,674,5,100,0,0,674,675,5,101,0,0,675,676, - 5,114,0,0,676,677,5,101,0,0,677,678,5,100,0,0,678,124,1,0,0,0,679, - 680,5,117,0,0,680,681,5,110,0,0,681,682,5,105,0,0,682,683,5,116, - 0,0,683,126,1,0,0,0,684,685,5,119,0,0,685,686,5,97,0,0,686,687,5, - 116,0,0,687,688,5,99,0,0,688,689,5,104,0,0,689,690,5,45,0,0,690, - 691,5,104,0,0,691,692,5,97,0,0,692,693,5,110,0,0,693,694,5,100,0, - 0,694,695,5,108,0,0,695,696,5,101,0,0,696,128,1,0,0,0,697,698,5, - 109,0,0,698,699,5,101,0,0,699,700,5,115,0,0,700,701,5,115,0,0,701, - 702,5,97,0,0,702,703,5,103,0,0,703,704,5,101,0,0,704,130,1,0,0,0, - 705,706,5,97,0,0,706,707,5,116,0,0,707,708,5,111,0,0,708,709,5,109, - 0,0,709,710,5,45,0,0,710,711,5,114,0,0,711,712,5,101,0,0,712,713, - 5,102,0,0,713,132,1,0,0,0,714,715,5,105,0,0,715,716,5,110,0,0,716, - 717,5,116,0,0,717,718,5,101,0,0,718,719,5,114,0,0,719,720,5,102, - 0,0,720,721,5,97,0,0,721,722,5,99,0,0,722,723,5,101,0,0,723,724, - 5,45,0,0,724,725,5,114,0,0,725,726,5,101,0,0,726,727,5,102,0,0,727, - 134,1,0,0,0,728,729,5,111,0,0,729,730,5,112,0,0,730,731,5,116,0, - 0,731,732,5,105,0,0,732,733,5,111,0,0,733,734,5,110,0,0,734,735, - 5,97,0,0,735,736,5,108,0,0,736,136,1,0,0,0,737,738,5,108,0,0,738, - 739,5,105,0,0,739,740,5,115,0,0,740,741,5,116,0,0,741,138,1,0,0, - 0,742,743,5,98,0,0,743,744,5,111,0,0,744,745,5,111,0,0,745,746,5, - 108,0,0,746,140,1,0,0,0,747,748,5,98,0,0,748,749,5,121,0,0,749,750, - 5,116,0,0,750,751,5,101,0,0,751,752,5,115,0,0,752,142,1,0,0,0,753, - 754,5,100,0,0,754,755,5,111,0,0,755,756,5,117,0,0,756,757,5,98,0, - 0,757,758,5,108,0,0,758,759,5,101,0,0,759,144,1,0,0,0,760,761,5, - 105,0,0,761,762,5,110,0,0,762,763,5,116,0,0,763,764,5,51,0,0,764, - 765,5,50,0,0,765,146,1,0,0,0,766,767,5,105,0,0,767,768,5,110,0,0, - 768,769,5,116,0,0,769,770,5,54,0,0,770,771,5,52,0,0,771,148,1,0, - 0,0,772,773,5,115,0,0,773,774,5,116,0,0,774,775,5,114,0,0,775,776, - 5,105,0,0,776,777,5,110,0,0,777,778,5,103,0,0,778,150,1,0,0,0,779, - 780,5,117,0,0,780,781,5,105,0,0,781,782,5,110,0,0,782,783,5,116, - 0,0,783,784,5,51,0,0,784,785,5,50,0,0,785,152,1,0,0,0,786,787,5, - 117,0,0,787,788,5,105,0,0,788,789,5,110,0,0,789,790,5,116,0,0,790, - 791,5,54,0,0,791,792,5,52,0,0,792,154,1,0,0,0,793,794,5,116,0,0, - 794,795,5,114,0,0,795,796,5,117,0,0,796,797,5,101,0,0,797,156,1, - 0,0,0,798,799,5,102,0,0,799,800,5,97,0,0,800,801,5,108,0,0,801,802, - 5,115,0,0,802,803,5,101,0,0,803,158,1,0,0,0,804,805,5,110,0,0,805, - 806,5,117,0,0,806,807,5,108,0,0,807,808,5,108,0,0,808,160,1,0,0, - 0,809,810,5,45,0,0,810,811,5,62,0,0,811,162,1,0,0,0,812,813,5,58, - 0,0,813,164,1,0,0,0,814,815,5,59,0,0,815,166,1,0,0,0,816,817,5,44, - 0,0,817,168,1,0,0,0,818,819,5,46,0,0,819,170,1,0,0,0,820,821,5,123, - 0,0,821,172,1,0,0,0,822,823,5,125,0,0,823,174,1,0,0,0,824,825,5, - 91,0,0,825,176,1,0,0,0,826,827,5,93,0,0,827,178,1,0,0,0,828,829, - 5,40,0,0,829,180,1,0,0,0,830,831,5,41,0,0,831,182,1,0,0,0,832,833, - 5,60,0,0,833,184,1,0,0,0,834,835,5,62,0,0,835,186,1,0,0,0,836,838, - 5,45,0,0,837,836,1,0,0,0,837,838,1,0,0,0,838,840,1,0,0,0,839,841, - 7,0,0,0,840,839,1,0,0,0,841,842,1,0,0,0,842,840,1,0,0,0,842,843, - 1,0,0,0,843,188,1,0,0,0,844,846,5,45,0,0,845,844,1,0,0,0,845,846, - 1,0,0,0,846,855,1,0,0,0,847,856,5,48,0,0,848,852,7,1,0,0,849,851, - 7,0,0,0,850,849,1,0,0,0,851,854,1,0,0,0,852,850,1,0,0,0,852,853, - 1,0,0,0,853,856,1,0,0,0,854,852,1,0,0,0,855,847,1,0,0,0,855,848, - 1,0,0,0,856,863,1,0,0,0,857,859,5,46,0,0,858,860,7,0,0,0,859,858, - 1,0,0,0,860,861,1,0,0,0,861,859,1,0,0,0,861,862,1,0,0,0,862,864, - 1,0,0,0,863,857,1,0,0,0,863,864,1,0,0,0,864,874,1,0,0,0,865,867, - 7,2,0,0,866,868,7,3,0,0,867,866,1,0,0,0,867,868,1,0,0,0,868,870, - 1,0,0,0,869,871,7,0,0,0,870,869,1,0,0,0,871,872,1,0,0,0,872,870, - 1,0,0,0,872,873,1,0,0,0,873,875,1,0,0,0,874,865,1,0,0,0,874,875, - 1,0,0,0,875,190,1,0,0,0,876,880,7,4,0,0,877,879,7,5,0,0,878,877, - 1,0,0,0,879,882,1,0,0,0,880,878,1,0,0,0,880,881,1,0,0,0,881,192, - 1,0,0,0,882,880,1,0,0,0,883,888,5,34,0,0,884,887,3,195,97,0,885, - 887,8,6,0,0,886,884,1,0,0,0,886,885,1,0,0,0,887,890,1,0,0,0,888, - 886,1,0,0,0,888,889,1,0,0,0,889,891,1,0,0,0,890,888,1,0,0,0,891, - 892,5,34,0,0,892,194,1,0,0,0,893,901,5,92,0,0,894,902,7,7,0,0,895, - 896,5,117,0,0,896,897,3,197,98,0,897,898,3,197,98,0,898,899,3,197, - 98,0,899,900,3,197,98,0,900,902,1,0,0,0,901,894,1,0,0,0,901,895, - 1,0,0,0,902,196,1,0,0,0,903,904,7,8,0,0,904,198,1,0,0,0,905,906, - 5,47,0,0,906,907,5,47,0,0,907,911,1,0,0,0,908,910,8,9,0,0,909,908, - 1,0,0,0,910,913,1,0,0,0,911,909,1,0,0,0,911,912,1,0,0,0,912,914, - 1,0,0,0,913,911,1,0,0,0,914,915,6,99,0,0,915,200,1,0,0,0,916,917, - 5,47,0,0,917,918,5,42,0,0,918,922,1,0,0,0,919,921,9,0,0,0,920,919, - 1,0,0,0,921,924,1,0,0,0,922,923,1,0,0,0,922,920,1,0,0,0,923,925, - 1,0,0,0,924,922,1,0,0,0,925,926,5,42,0,0,926,927,5,47,0,0,927,928, - 1,0,0,0,928,929,6,100,0,0,929,202,1,0,0,0,930,932,7,10,0,0,931,930, - 1,0,0,0,932,933,1,0,0,0,933,931,1,0,0,0,933,934,1,0,0,0,934,935, - 1,0,0,0,935,936,6,101,0,0,936,204,1,0,0,0,18,0,837,842,845,852,855, - 861,863,867,872,874,880,886,888,901,911,922,933,1,6,0,0 + 97,2,98,7,98,2,99,7,99,2,100,7,100,2,101,7,101,2,102,7,102,2,103, + 7,103,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,3,1,3,1,3,1,3,1, + 3,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,5,1,5,1,5,1,5,1,5,1, + 5,1,5,1,5,1,5,1,5,1,5,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,7,1,7,1, + 7,1,7,1,7,1,7,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,9,1,9,1,9,1, + 9,1,9,1,9,1,9,1,9,1,9,1,9,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10, + 1,10,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11, + 1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,13,1,13, + 1,13,1,13,1,13,1,13,1,13,1,13,1,14,1,14,1,14,1,15,1,15,1,15,1,15, + 1,15,1,16,1,16,1,16,1,17,1,17,1,17,1,17,1,17,1,17,1,17,1,17,1,18, + 1,18,1,18,1,18,1,18,1,18,1,18,1,19,1,19,1,19,1,19,1,19,1,19,1,20, + 1,20,1,20,1,20,1,20,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21, + 1,21,1,21,1,22,1,22,1,22,1,22,1,22,1,23,1,23,1,23,1,23,1,23,1,23, + 1,24,1,24,1,24,1,24,1,25,1,25,1,25,1,25,1,25,1,25,1,25,1,25,1,25, + 1,25,1,25,1,25,1,26,1,26,1,26,1,27,1,27,1,27,1,27,1,27,1,27,1,27, + 1,28,1,28,1,28,1,29,1,29,1,29,1,29,1,29,1,29,1,29,1,30,1,30,1,30, + 1,30,1,30,1,30,1,30,1,30,1,31,1,31,1,31,1,31,1,31,1,31,1,31,1,32, + 1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,33,1,33,1,33, + 1,33,1,33,1,33,1,33,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34, + 1,35,1,35,1,35,1,36,1,36,1,36,1,36,1,37,1,37,1,37,1,37,1,37,1,38, + 1,38,1,38,1,38,1,38,1,38,1,39,1,39,1,39,1,39,1,39,1,39,1,39,1,39, + 1,39,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,41,1,41,1,41, + 1,41,1,42,1,42,1,42,1,42,1,43,1,43,1,43,1,43,1,44,1,44,1,44,1,44, + 1,44,1,44,1,45,1,45,1,45,1,45,1,45,1,45,1,46,1,46,1,46,1,46,1,46, + 1,47,1,47,1,47,1,47,1,47,1,48,1,48,1,48,1,48,1,48,1,48,1,49,1,49, + 1,49,1,49,1,49,1,49,1,49,1,49,1,50,1,50,1,50,1,50,1,50,1,50,1,50, + 1,50,1,51,1,51,1,51,1,51,1,51,1,51,1,51,1,51,1,51,1,51,1,51,1,52, + 1,52,1,52,1,52,1,52,1,53,1,53,1,53,1,53,1,53,1,53,1,53,1,53,1,53, + 1,53,1,53,1,53,1,54,1,54,1,54,1,54,1,54,1,54,1,54,1,54,1,54,1,54, + 1,54,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,56,1,56, + 1,56,1,56,1,56,1,56,1,56,1,56,1,56,1,56,1,56,1,56,1,57,1,57,1,57, + 1,57,1,57,1,57,1,57,1,57,1,57,1,57,1,57,1,57,1,57,1,57,1,57,1,57, + 1,57,1,57,1,57,1,57,1,58,1,58,1,58,1,58,1,58,1,59,1,59,1,59,1,59, + 1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,60,1,60,1,60,1,60, + 1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,61,1,61,1,61,1,61,1,61, + 1,61,1,61,1,61,1,61,1,61,1,61,1,61,1,62,1,62,1,62,1,62,1,62,1,63, + 1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,64,1,64,1,64,1,64,1,64,1,65, + 1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,66, + 1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,67,1,67,1,67,1,67,1,67,1,67, + 1,67,1,67,1,67,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68, + 1,68,1,68,1,68,1,68,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69, + 1,70,1,70,1,70,1,70,1,70,1,71,1,71,1,71,1,71,1,71,1,72,1,72,1,72, + 1,72,1,72,1,72,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,74,1,74,1,74, + 1,74,1,74,1,74,1,75,1,75,1,75,1,75,1,75,1,75,1,76,1,76,1,76,1,76, + 1,76,1,76,1,76,1,77,1,77,1,77,1,77,1,77,1,77,1,77,1,78,1,78,1,78, + 1,78,1,78,1,78,1,78,1,79,1,79,1,79,1,79,1,79,1,80,1,80,1,80,1,80, + 1,80,1,80,1,81,1,81,1,81,1,81,1,81,1,82,1,82,1,82,1,83,1,83,1,84, + 1,84,1,85,1,85,1,86,1,86,1,87,1,87,1,88,1,88,1,89,1,89,1,90,1,90, + 1,91,1,91,1,92,1,92,1,93,1,93,1,94,1,94,1,95,3,95,858,8,95,1,95, + 4,95,861,8,95,11,95,12,95,862,1,96,3,96,866,8,96,1,96,1,96,1,96, + 5,96,871,8,96,10,96,12,96,874,9,96,3,96,876,8,96,1,96,1,96,4,96, + 880,8,96,11,96,12,96,881,3,96,884,8,96,1,96,1,96,3,96,888,8,96,1, + 96,4,96,891,8,96,11,96,12,96,892,3,96,895,8,96,1,97,1,97,5,97,899, + 8,97,10,97,12,97,902,9,97,1,98,1,98,1,98,5,98,907,8,98,10,98,12, + 98,910,9,98,1,98,1,98,1,99,1,99,1,99,1,99,1,99,1,99,1,99,1,99,3, + 99,922,8,99,1,100,1,100,1,101,1,101,1,101,1,101,5,101,930,8,101, + 10,101,12,101,933,9,101,1,101,1,101,1,102,1,102,1,102,1,102,5,102, + 941,8,102,10,102,12,102,944,9,102,1,102,1,102,1,102,1,102,1,102, + 1,103,4,103,952,8,103,11,103,12,103,953,1,103,1,103,1,942,0,104, + 1,1,3,2,5,3,7,4,9,5,11,6,13,7,15,8,17,9,19,10,21,11,23,12,25,13, + 27,14,29,15,31,16,33,17,35,18,37,19,39,20,41,21,43,22,45,23,47,24, + 49,25,51,26,53,27,55,28,57,29,59,30,61,31,63,32,65,33,67,34,69,35, + 71,36,73,37,75,38,77,39,79,40,81,41,83,42,85,43,87,44,89,45,91,46, + 93,47,95,48,97,49,99,50,101,51,103,52,105,53,107,54,109,55,111,56, + 113,57,115,58,117,59,119,60,121,61,123,62,125,63,127,64,129,65,131, + 66,133,67,135,68,137,69,139,70,141,71,143,72,145,73,147,74,149,75, + 151,76,153,77,155,78,157,79,159,80,161,81,163,82,165,83,167,84,169, + 85,171,86,173,87,175,88,177,89,179,90,181,91,183,92,185,93,187,94, + 189,95,191,96,193,97,195,98,197,99,199,0,201,0,203,100,205,101,207, + 102,1,0,11,1,0,48,57,1,0,49,57,2,0,69,69,101,101,2,0,43,43,45,45, + 3,0,65,90,95,95,97,122,4,0,48,57,65,90,95,95,97,122,4,0,10,10,13, + 13,34,34,92,92,8,0,34,34,47,47,92,92,98,98,102,102,110,110,114,114, + 116,116,3,0,48,57,65,70,97,102,2,0,10,10,13,13,3,0,9,10,13,13,32, + 32,971,0,1,1,0,0,0,0,3,1,0,0,0,0,5,1,0,0,0,0,7,1,0,0,0,0,9,1,0,0, + 0,0,11,1,0,0,0,0,13,1,0,0,0,0,15,1,0,0,0,0,17,1,0,0,0,0,19,1,0,0, + 0,0,21,1,0,0,0,0,23,1,0,0,0,0,25,1,0,0,0,0,27,1,0,0,0,0,29,1,0,0, + 0,0,31,1,0,0,0,0,33,1,0,0,0,0,35,1,0,0,0,0,37,1,0,0,0,0,39,1,0,0, + 0,0,41,1,0,0,0,0,43,1,0,0,0,0,45,1,0,0,0,0,47,1,0,0,0,0,49,1,0,0, + 0,0,51,1,0,0,0,0,53,1,0,0,0,0,55,1,0,0,0,0,57,1,0,0,0,0,59,1,0,0, + 0,0,61,1,0,0,0,0,63,1,0,0,0,0,65,1,0,0,0,0,67,1,0,0,0,0,69,1,0,0, + 0,0,71,1,0,0,0,0,73,1,0,0,0,0,75,1,0,0,0,0,77,1,0,0,0,0,79,1,0,0, + 0,0,81,1,0,0,0,0,83,1,0,0,0,0,85,1,0,0,0,0,87,1,0,0,0,0,89,1,0,0, + 0,0,91,1,0,0,0,0,93,1,0,0,0,0,95,1,0,0,0,0,97,1,0,0,0,0,99,1,0,0, + 0,0,101,1,0,0,0,0,103,1,0,0,0,0,105,1,0,0,0,0,107,1,0,0,0,0,109, + 1,0,0,0,0,111,1,0,0,0,0,113,1,0,0,0,0,115,1,0,0,0,0,117,1,0,0,0, + 0,119,1,0,0,0,0,121,1,0,0,0,0,123,1,0,0,0,0,125,1,0,0,0,0,127,1, + 0,0,0,0,129,1,0,0,0,0,131,1,0,0,0,0,133,1,0,0,0,0,135,1,0,0,0,0, + 137,1,0,0,0,0,139,1,0,0,0,0,141,1,0,0,0,0,143,1,0,0,0,0,145,1,0, + 0,0,0,147,1,0,0,0,0,149,1,0,0,0,0,151,1,0,0,0,0,153,1,0,0,0,0,155, + 1,0,0,0,0,157,1,0,0,0,0,159,1,0,0,0,0,161,1,0,0,0,0,163,1,0,0,0, + 0,165,1,0,0,0,0,167,1,0,0,0,0,169,1,0,0,0,0,171,1,0,0,0,0,173,1, + 0,0,0,0,175,1,0,0,0,0,177,1,0,0,0,0,179,1,0,0,0,0,181,1,0,0,0,0, + 183,1,0,0,0,0,185,1,0,0,0,0,187,1,0,0,0,0,189,1,0,0,0,0,191,1,0, + 0,0,0,193,1,0,0,0,0,195,1,0,0,0,0,197,1,0,0,0,0,203,1,0,0,0,0,205, + 1,0,0,0,0,207,1,0,0,0,1,209,1,0,0,0,3,219,1,0,0,0,5,226,1,0,0,0, + 7,235,1,0,0,0,9,240,1,0,0,0,11,250,1,0,0,0,13,261,1,0,0,0,15,269, + 1,0,0,0,17,275,1,0,0,0,19,284,1,0,0,0,21,294,1,0,0,0,23,303,1,0, + 0,0,25,315,1,0,0,0,27,326,1,0,0,0,29,334,1,0,0,0,31,337,1,0,0,0, + 33,342,1,0,0,0,35,345,1,0,0,0,37,353,1,0,0,0,39,360,1,0,0,0,41,366, + 1,0,0,0,43,371,1,0,0,0,45,382,1,0,0,0,47,387,1,0,0,0,49,393,1,0, + 0,0,51,397,1,0,0,0,53,409,1,0,0,0,55,412,1,0,0,0,57,419,1,0,0,0, + 59,422,1,0,0,0,61,429,1,0,0,0,63,437,1,0,0,0,65,444,1,0,0,0,67,455, + 1,0,0,0,69,462,1,0,0,0,71,471,1,0,0,0,73,474,1,0,0,0,75,478,1,0, + 0,0,77,483,1,0,0,0,79,489,1,0,0,0,81,498,1,0,0,0,83,507,1,0,0,0, + 85,511,1,0,0,0,87,515,1,0,0,0,89,519,1,0,0,0,91,525,1,0,0,0,93,531, + 1,0,0,0,95,536,1,0,0,0,97,541,1,0,0,0,99,547,1,0,0,0,101,555,1,0, + 0,0,103,563,1,0,0,0,105,574,1,0,0,0,107,579,1,0,0,0,109,591,1,0, + 0,0,111,602,1,0,0,0,113,612,1,0,0,0,115,624,1,0,0,0,117,644,1,0, + 0,0,119,649,1,0,0,0,121,662,1,0,0,0,123,674,1,0,0,0,125,686,1,0, + 0,0,127,691,1,0,0,0,129,699,1,0,0,0,131,704,1,0,0,0,133,717,1,0, + 0,0,135,725,1,0,0,0,137,734,1,0,0,0,139,748,1,0,0,0,141,757,1,0, + 0,0,143,762,1,0,0,0,145,767,1,0,0,0,147,773,1,0,0,0,149,780,1,0, + 0,0,151,786,1,0,0,0,153,792,1,0,0,0,155,799,1,0,0,0,157,806,1,0, + 0,0,159,813,1,0,0,0,161,818,1,0,0,0,163,824,1,0,0,0,165,829,1,0, + 0,0,167,832,1,0,0,0,169,834,1,0,0,0,171,836,1,0,0,0,173,838,1,0, + 0,0,175,840,1,0,0,0,177,842,1,0,0,0,179,844,1,0,0,0,181,846,1,0, + 0,0,183,848,1,0,0,0,185,850,1,0,0,0,187,852,1,0,0,0,189,854,1,0, + 0,0,191,857,1,0,0,0,193,865,1,0,0,0,195,896,1,0,0,0,197,903,1,0, + 0,0,199,913,1,0,0,0,201,923,1,0,0,0,203,925,1,0,0,0,205,936,1,0, + 0,0,207,951,1,0,0,0,209,210,5,119,0,0,210,211,5,111,0,0,211,212, + 5,114,0,0,212,213,5,107,0,0,213,214,5,115,0,0,214,215,5,112,0,0, + 215,216,5,97,0,0,216,217,5,99,0,0,217,218,5,101,0,0,218,2,1,0,0, + 0,219,220,5,105,0,0,220,221,5,109,0,0,221,222,5,112,0,0,222,223, + 5,111,0,0,223,224,5,114,0,0,224,225,5,116,0,0,225,4,1,0,0,0,226, + 227,5,101,0,0,227,228,5,120,0,0,228,229,5,116,0,0,229,230,5,101, + 0,0,230,231,5,114,0,0,231,232,5,110,0,0,232,233,5,97,0,0,233,234, + 5,108,0,0,234,6,1,0,0,0,235,236,5,97,0,0,236,237,5,116,0,0,237,238, + 5,111,0,0,238,239,5,109,0,0,239,8,1,0,0,0,240,241,5,105,0,0,241, + 242,5,110,0,0,242,243,5,116,0,0,243,244,5,101,0,0,244,245,5,114, + 0,0,245,246,5,102,0,0,246,247,5,97,0,0,247,248,5,99,0,0,248,249, + 5,101,0,0,249,10,1,0,0,0,250,251,5,105,0,0,251,252,5,110,0,0,252, + 253,5,116,0,0,253,254,5,101,0,0,254,255,5,114,0,0,255,256,5,102, + 0,0,256,257,5,97,0,0,257,258,5,99,0,0,258,259,5,101,0,0,259,260, + 5,115,0,0,260,12,1,0,0,0,261,262,5,112,0,0,262,263,5,97,0,0,263, + 264,5,99,0,0,264,265,5,107,0,0,265,266,5,97,0,0,266,267,5,103,0, + 0,267,268,5,101,0,0,268,14,1,0,0,0,269,270,5,118,0,0,270,271,5,97, + 0,0,271,272,5,108,0,0,272,273,5,117,0,0,273,274,5,101,0,0,274,16, + 1,0,0,0,275,276,5,114,0,0,276,277,5,101,0,0,277,278,5,108,0,0,278, + 279,5,97,0,0,279,280,5,116,0,0,280,281,5,105,0,0,281,282,5,111,0, + 0,282,283,5,110,0,0,283,18,1,0,0,0,284,285,5,111,0,0,285,286,5,112, + 0,0,286,287,5,101,0,0,287,288,5,114,0,0,288,289,5,97,0,0,289,290, + 5,116,0,0,290,291,5,105,0,0,291,292,5,111,0,0,292,293,5,110,0,0, + 293,20,1,0,0,0,294,295,5,102,0,0,295,296,5,117,0,0,296,297,5,110, + 0,0,297,298,5,99,0,0,298,299,5,116,0,0,299,300,5,105,0,0,300,301, + 5,111,0,0,301,302,5,110,0,0,302,22,1,0,0,0,303,304,5,99,0,0,304, + 305,5,111,0,0,305,306,5,110,0,0,306,307,5,115,0,0,307,308,5,116, + 0,0,308,309,5,114,0,0,309,310,5,117,0,0,310,311,5,99,0,0,311,312, + 5,116,0,0,312,313,5,111,0,0,313,314,5,114,0,0,314,24,1,0,0,0,315, + 316,5,99,0,0,316,317,5,111,0,0,317,318,5,110,0,0,318,319,5,115,0, + 0,319,320,5,116,0,0,320,321,5,114,0,0,321,322,5,117,0,0,322,323, + 5,99,0,0,323,324,5,116,0,0,324,325,5,115,0,0,325,26,1,0,0,0,326, + 327,5,99,0,0,327,328,5,111,0,0,328,329,5,110,0,0,329,330,5,102,0, + 0,330,331,5,111,0,0,331,332,5,114,0,0,332,333,5,109,0,0,333,28,1, + 0,0,0,334,335,5,97,0,0,335,336,5,115,0,0,336,30,1,0,0,0,337,338, + 5,98,0,0,338,339,5,105,0,0,339,340,5,110,0,0,340,341,5,100,0,0,341, + 32,1,0,0,0,342,343,5,116,0,0,343,344,5,111,0,0,344,34,1,0,0,0,345, + 346,5,112,0,0,346,347,5,114,0,0,347,348,5,105,0,0,348,349,5,118, + 0,0,349,350,5,97,0,0,350,351,5,116,0,0,351,352,5,101,0,0,352,36, + 1,0,0,0,353,354,5,115,0,0,354,355,5,104,0,0,355,356,5,97,0,0,356, + 357,5,114,0,0,357,358,5,101,0,0,358,359,5,100,0,0,359,38,1,0,0,0, + 360,361,5,115,0,0,361,362,5,116,0,0,362,363,5,97,0,0,363,364,5,116, + 0,0,364,365,5,101,0,0,365,40,1,0,0,0,366,367,5,101,0,0,367,368,5, + 100,0,0,368,369,5,103,0,0,369,370,5,101,0,0,370,42,1,0,0,0,371,372, + 5,112,0,0,372,373,5,114,0,0,373,374,5,111,0,0,374,375,5,106,0,0, + 375,376,5,101,0,0,376,377,5,99,0,0,377,378,5,116,0,0,378,379,5,105, + 0,0,379,380,5,111,0,0,380,381,5,110,0,0,381,44,1,0,0,0,382,383,5, + 119,0,0,383,384,5,105,0,0,384,385,5,116,0,0,385,386,5,104,0,0,386, + 46,1,0,0,0,387,388,5,117,0,0,388,389,5,115,0,0,389,390,5,105,0,0, + 390,391,5,110,0,0,391,392,5,103,0,0,392,48,1,0,0,0,393,394,5,118, + 0,0,394,395,5,105,0,0,395,396,5,97,0,0,396,50,1,0,0,0,397,398,5, + 109,0,0,398,399,5,97,0,0,399,400,5,116,0,0,400,401,5,101,0,0,401, + 402,5,114,0,0,402,403,5,105,0,0,403,404,5,97,0,0,404,405,5,108,0, + 0,405,406,5,105,0,0,406,407,5,122,0,0,407,408,5,101,0,0,408,52,1, + 0,0,0,409,410,5,105,0,0,410,411,5,102,0,0,411,54,1,0,0,0,412,413, + 5,97,0,0,413,414,5,98,0,0,414,415,5,115,0,0,415,416,5,101,0,0,416, + 417,5,110,0,0,417,418,5,116,0,0,418,56,1,0,0,0,419,420,5,111,0,0, + 420,421,5,110,0,0,421,58,1,0,0,0,422,423,5,112,0,0,423,424,5,111, + 0,0,424,425,5,108,0,0,425,426,5,105,0,0,426,427,5,99,0,0,427,428, + 5,121,0,0,428,60,1,0,0,0,429,430,5,100,0,0,430,431,5,101,0,0,431, + 432,5,102,0,0,432,433,5,97,0,0,433,434,5,117,0,0,434,435,5,108,0, + 0,435,436,5,116,0,0,436,62,1,0,0,0,437,438,5,115,0,0,438,439,5,111, + 0,0,439,440,5,117,0,0,440,441,5,114,0,0,441,442,5,99,0,0,442,443, + 5,101,0,0,443,64,1,0,0,0,444,445,5,114,0,0,445,446,5,101,0,0,446, + 447,5,112,0,0,447,448,5,111,0,0,448,449,5,115,0,0,449,450,5,105, + 0,0,450,451,5,116,0,0,451,452,5,111,0,0,452,453,5,114,0,0,453,454, + 5,121,0,0,454,66,1,0,0,0,455,456,5,99,0,0,456,457,5,111,0,0,457, + 458,5,109,0,0,458,459,5,109,0,0,459,460,5,105,0,0,460,461,5,116, + 0,0,461,68,1,0,0,0,462,463,5,114,0,0,463,464,5,101,0,0,464,465,5, + 118,0,0,465,466,5,105,0,0,466,467,5,115,0,0,467,468,5,105,0,0,468, + 469,5,111,0,0,469,470,5,110,0,0,470,70,1,0,0,0,471,472,5,105,0,0, + 472,473,5,100,0,0,473,72,1,0,0,0,474,475,5,100,0,0,475,476,5,111, + 0,0,476,477,5,99,0,0,477,74,1,0,0,0,478,479,5,109,0,0,479,480,5, + 111,0,0,480,481,5,100,0,0,481,482,5,101,0,0,482,76,1,0,0,0,483,484, + 5,101,0,0,484,485,5,109,0,0,485,486,5,105,0,0,486,487,5,116,0,0, + 487,488,5,115,0,0,488,78,1,0,0,0,489,490,5,114,0,0,490,491,5,101, + 0,0,491,492,5,99,0,0,492,493,5,101,0,0,493,494,5,105,0,0,494,495, + 5,118,0,0,495,496,5,101,0,0,496,497,5,114,0,0,497,80,1,0,0,0,498, + 499,5,114,0,0,499,500,5,101,0,0,500,501,5,113,0,0,501,502,5,117, + 0,0,502,503,5,105,0,0,503,504,5,114,0,0,504,505,5,101,0,0,505,506, + 5,115,0,0,506,82,1,0,0,0,507,508,5,97,0,0,508,509,5,110,0,0,509, + 510,5,121,0,0,510,84,1,0,0,0,511,512,5,103,0,0,512,513,5,101,0,0, + 513,514,5,116,0,0,514,86,1,0,0,0,515,516,5,115,0,0,516,517,5,101, + 0,0,517,518,5,116,0,0,518,88,1,0,0,0,519,520,5,119,0,0,520,521,5, + 97,0,0,521,522,5,116,0,0,522,523,5,99,0,0,523,524,5,104,0,0,524, + 90,1,0,0,0,525,526,5,115,0,0,526,527,5,116,0,0,527,528,5,97,0,0, + 528,529,5,114,0,0,529,530,5,116,0,0,530,92,1,0,0,0,531,532,5,115, + 0,0,532,533,5,116,0,0,533,534,5,111,0,0,534,535,5,112,0,0,535,94, + 1,0,0,0,536,537,5,114,0,0,537,538,5,101,0,0,538,539,5,97,0,0,539, + 540,5,100,0,0,540,96,1,0,0,0,541,542,5,119,0,0,542,543,5,114,0,0, + 543,544,5,105,0,0,544,545,5,116,0,0,545,546,5,101,0,0,546,98,1,0, + 0,0,547,548,5,114,0,0,548,549,5,101,0,0,549,550,5,115,0,0,550,551, + 5,111,0,0,551,552,5,108,0,0,552,553,5,118,0,0,553,554,5,101,0,0, + 554,100,1,0,0,0,555,556,5,99,0,0,556,557,5,111,0,0,557,558,5,110, + 0,0,558,559,5,110,0,0,559,560,5,101,0,0,560,561,5,99,0,0,561,562, + 5,116,0,0,562,102,1,0,0,0,563,564,5,100,0,0,564,565,5,105,0,0,565, + 566,5,115,0,0,566,567,5,99,0,0,567,568,5,111,0,0,568,569,5,110,0, + 0,569,570,5,110,0,0,570,571,5,101,0,0,571,572,5,99,0,0,572,573,5, + 116,0,0,573,104,1,0,0,0,574,575,5,99,0,0,575,576,5,97,0,0,576,577, + 5,108,0,0,577,578,5,108,0,0,578,106,1,0,0,0,579,580,5,119,0,0,580, + 581,5,97,0,0,581,582,5,116,0,0,582,583,5,99,0,0,583,584,5,104,0, + 0,584,585,5,45,0,0,585,586,5,115,0,0,586,587,5,116,0,0,587,588,5, + 97,0,0,588,589,5,114,0,0,589,590,5,116,0,0,590,108,1,0,0,0,591,592, + 5,119,0,0,592,593,5,97,0,0,593,594,5,116,0,0,594,595,5,99,0,0,595, + 596,5,104,0,0,596,597,5,45,0,0,597,598,5,115,0,0,598,599,5,116,0, + 0,599,600,5,111,0,0,600,601,5,112,0,0,601,110,1,0,0,0,602,603,5, + 115,0,0,603,604,5,117,0,0,604,605,5,98,0,0,605,606,5,115,0,0,606, + 607,5,99,0,0,607,608,5,114,0,0,608,609,5,105,0,0,609,610,5,98,0, + 0,610,611,5,101,0,0,611,112,1,0,0,0,612,613,5,117,0,0,613,614,5, + 110,0,0,614,615,5,115,0,0,615,616,5,117,0,0,616,617,5,98,0,0,617, + 618,5,115,0,0,618,619,5,99,0,0,619,620,5,114,0,0,620,621,5,105,0, + 0,621,622,5,98,0,0,622,623,5,101,0,0,623,114,1,0,0,0,624,625,5,111, + 0,0,625,626,5,112,0,0,626,627,5,116,0,0,627,628,5,105,0,0,628,629, + 5,109,0,0,629,630,5,105,0,0,630,631,5,115,0,0,631,632,5,116,0,0, + 632,633,5,105,0,0,633,634,5,99,0,0,634,635,5,45,0,0,635,636,5,114, + 0,0,636,637,5,101,0,0,637,638,5,103,0,0,638,639,5,105,0,0,639,640, + 5,115,0,0,640,641,5,116,0,0,641,642,5,101,0,0,642,643,5,114,0,0, + 643,116,1,0,0,0,644,645,5,99,0,0,645,646,5,114,0,0,646,647,5,100, + 0,0,647,648,5,116,0,0,648,118,1,0,0,0,649,650,5,111,0,0,650,651, + 5,112,0,0,651,652,5,116,0,0,652,653,5,105,0,0,653,654,5,111,0,0, + 654,655,5,110,0,0,655,656,5,97,0,0,656,657,5,108,0,0,657,658,5,45, + 0,0,658,659,5,111,0,0,659,660,5,110,0,0,660,661,5,101,0,0,661,120, + 1,0,0,0,662,663,5,101,0,0,663,664,5,120,0,0,664,665,5,97,0,0,665, + 666,5,99,0,0,666,667,5,116,0,0,667,668,5,108,0,0,668,669,5,121,0, + 0,669,670,5,45,0,0,670,671,5,111,0,0,671,672,5,110,0,0,672,673,5, + 101,0,0,673,122,1,0,0,0,674,675,5,109,0,0,675,676,5,97,0,0,676,677, + 5,110,0,0,677,678,5,121,0,0,678,679,5,45,0,0,679,680,5,117,0,0,680, + 681,5,110,0,0,681,682,5,105,0,0,682,683,5,113,0,0,683,684,5,117, + 0,0,684,685,5,101,0,0,685,124,1,0,0,0,686,687,5,109,0,0,687,688, + 5,97,0,0,688,689,5,110,0,0,689,690,5,121,0,0,690,126,1,0,0,0,691, + 692,5,111,0,0,692,693,5,114,0,0,693,694,5,100,0,0,694,695,5,101, + 0,0,695,696,5,114,0,0,696,697,5,101,0,0,697,698,5,100,0,0,698,128, + 1,0,0,0,699,700,5,117,0,0,700,701,5,110,0,0,701,702,5,105,0,0,702, + 703,5,116,0,0,703,130,1,0,0,0,704,705,5,119,0,0,705,706,5,97,0,0, + 706,707,5,116,0,0,707,708,5,99,0,0,708,709,5,104,0,0,709,710,5,45, + 0,0,710,711,5,104,0,0,711,712,5,97,0,0,712,713,5,110,0,0,713,714, + 5,100,0,0,714,715,5,108,0,0,715,716,5,101,0,0,716,132,1,0,0,0,717, + 718,5,109,0,0,718,719,5,101,0,0,719,720,5,115,0,0,720,721,5,115, + 0,0,721,722,5,97,0,0,722,723,5,103,0,0,723,724,5,101,0,0,724,134, + 1,0,0,0,725,726,5,97,0,0,726,727,5,116,0,0,727,728,5,111,0,0,728, + 729,5,109,0,0,729,730,5,45,0,0,730,731,5,114,0,0,731,732,5,101,0, + 0,732,733,5,102,0,0,733,136,1,0,0,0,734,735,5,105,0,0,735,736,5, + 110,0,0,736,737,5,116,0,0,737,738,5,101,0,0,738,739,5,114,0,0,739, + 740,5,102,0,0,740,741,5,97,0,0,741,742,5,99,0,0,742,743,5,101,0, + 0,743,744,5,45,0,0,744,745,5,114,0,0,745,746,5,101,0,0,746,747,5, + 102,0,0,747,138,1,0,0,0,748,749,5,111,0,0,749,750,5,112,0,0,750, + 751,5,116,0,0,751,752,5,105,0,0,752,753,5,111,0,0,753,754,5,110, + 0,0,754,755,5,97,0,0,755,756,5,108,0,0,756,140,1,0,0,0,757,758,5, + 108,0,0,758,759,5,105,0,0,759,760,5,115,0,0,760,761,5,116,0,0,761, + 142,1,0,0,0,762,763,5,98,0,0,763,764,5,111,0,0,764,765,5,111,0,0, + 765,766,5,108,0,0,766,144,1,0,0,0,767,768,5,98,0,0,768,769,5,121, + 0,0,769,770,5,116,0,0,770,771,5,101,0,0,771,772,5,115,0,0,772,146, + 1,0,0,0,773,774,5,100,0,0,774,775,5,111,0,0,775,776,5,117,0,0,776, + 777,5,98,0,0,777,778,5,108,0,0,778,779,5,101,0,0,779,148,1,0,0,0, + 780,781,5,105,0,0,781,782,5,110,0,0,782,783,5,116,0,0,783,784,5, + 51,0,0,784,785,5,50,0,0,785,150,1,0,0,0,786,787,5,105,0,0,787,788, + 5,110,0,0,788,789,5,116,0,0,789,790,5,54,0,0,790,791,5,52,0,0,791, + 152,1,0,0,0,792,793,5,115,0,0,793,794,5,116,0,0,794,795,5,114,0, + 0,795,796,5,105,0,0,796,797,5,110,0,0,797,798,5,103,0,0,798,154, + 1,0,0,0,799,800,5,117,0,0,800,801,5,105,0,0,801,802,5,110,0,0,802, + 803,5,116,0,0,803,804,5,51,0,0,804,805,5,50,0,0,805,156,1,0,0,0, + 806,807,5,117,0,0,807,808,5,105,0,0,808,809,5,110,0,0,809,810,5, + 116,0,0,810,811,5,54,0,0,811,812,5,52,0,0,812,158,1,0,0,0,813,814, + 5,116,0,0,814,815,5,114,0,0,815,816,5,117,0,0,816,817,5,101,0,0, + 817,160,1,0,0,0,818,819,5,102,0,0,819,820,5,97,0,0,820,821,5,108, + 0,0,821,822,5,115,0,0,822,823,5,101,0,0,823,162,1,0,0,0,824,825, + 5,110,0,0,825,826,5,117,0,0,826,827,5,108,0,0,827,828,5,108,0,0, + 828,164,1,0,0,0,829,830,5,45,0,0,830,831,5,62,0,0,831,166,1,0,0, + 0,832,833,5,58,0,0,833,168,1,0,0,0,834,835,5,59,0,0,835,170,1,0, + 0,0,836,837,5,44,0,0,837,172,1,0,0,0,838,839,5,46,0,0,839,174,1, + 0,0,0,840,841,5,123,0,0,841,176,1,0,0,0,842,843,5,125,0,0,843,178, + 1,0,0,0,844,845,5,91,0,0,845,180,1,0,0,0,846,847,5,93,0,0,847,182, + 1,0,0,0,848,849,5,40,0,0,849,184,1,0,0,0,850,851,5,41,0,0,851,186, + 1,0,0,0,852,853,5,60,0,0,853,188,1,0,0,0,854,855,5,62,0,0,855,190, + 1,0,0,0,856,858,5,45,0,0,857,856,1,0,0,0,857,858,1,0,0,0,858,860, + 1,0,0,0,859,861,7,0,0,0,860,859,1,0,0,0,861,862,1,0,0,0,862,860, + 1,0,0,0,862,863,1,0,0,0,863,192,1,0,0,0,864,866,5,45,0,0,865,864, + 1,0,0,0,865,866,1,0,0,0,866,875,1,0,0,0,867,876,5,48,0,0,868,872, + 7,1,0,0,869,871,7,0,0,0,870,869,1,0,0,0,871,874,1,0,0,0,872,870, + 1,0,0,0,872,873,1,0,0,0,873,876,1,0,0,0,874,872,1,0,0,0,875,867, + 1,0,0,0,875,868,1,0,0,0,876,883,1,0,0,0,877,879,5,46,0,0,878,880, + 7,0,0,0,879,878,1,0,0,0,880,881,1,0,0,0,881,879,1,0,0,0,881,882, + 1,0,0,0,882,884,1,0,0,0,883,877,1,0,0,0,883,884,1,0,0,0,884,894, + 1,0,0,0,885,887,7,2,0,0,886,888,7,3,0,0,887,886,1,0,0,0,887,888, + 1,0,0,0,888,890,1,0,0,0,889,891,7,0,0,0,890,889,1,0,0,0,891,892, + 1,0,0,0,892,890,1,0,0,0,892,893,1,0,0,0,893,895,1,0,0,0,894,885, + 1,0,0,0,894,895,1,0,0,0,895,194,1,0,0,0,896,900,7,4,0,0,897,899, + 7,5,0,0,898,897,1,0,0,0,899,902,1,0,0,0,900,898,1,0,0,0,900,901, + 1,0,0,0,901,196,1,0,0,0,902,900,1,0,0,0,903,908,5,34,0,0,904,907, + 3,199,99,0,905,907,8,6,0,0,906,904,1,0,0,0,906,905,1,0,0,0,907,910, + 1,0,0,0,908,906,1,0,0,0,908,909,1,0,0,0,909,911,1,0,0,0,910,908, + 1,0,0,0,911,912,5,34,0,0,912,198,1,0,0,0,913,921,5,92,0,0,914,922, + 7,7,0,0,915,916,5,117,0,0,916,917,3,201,100,0,917,918,3,201,100, + 0,918,919,3,201,100,0,919,920,3,201,100,0,920,922,1,0,0,0,921,914, + 1,0,0,0,921,915,1,0,0,0,922,200,1,0,0,0,923,924,7,8,0,0,924,202, + 1,0,0,0,925,926,5,47,0,0,926,927,5,47,0,0,927,931,1,0,0,0,928,930, + 8,9,0,0,929,928,1,0,0,0,930,933,1,0,0,0,931,929,1,0,0,0,931,932, + 1,0,0,0,932,934,1,0,0,0,933,931,1,0,0,0,934,935,6,101,0,0,935,204, + 1,0,0,0,936,937,5,47,0,0,937,938,5,42,0,0,938,942,1,0,0,0,939,941, + 9,0,0,0,940,939,1,0,0,0,941,944,1,0,0,0,942,943,1,0,0,0,942,940, + 1,0,0,0,943,945,1,0,0,0,944,942,1,0,0,0,945,946,5,42,0,0,946,947, + 5,47,0,0,947,948,1,0,0,0,948,949,6,102,0,0,949,206,1,0,0,0,950,952, + 7,10,0,0,951,950,1,0,0,0,952,953,1,0,0,0,953,951,1,0,0,0,953,954, + 1,0,0,0,954,955,1,0,0,0,955,956,6,103,0,0,956,208,1,0,0,0,18,0,857, + 862,865,872,875,881,883,887,892,894,900,906,908,921,931,942,953, + 1,6,0,0 ]; private static __ATN: antlr.ATN; diff --git a/src/capability-language/generated/QuixosCapabilityParser.ts b/src/capability-language/generated/QuixosCapabilityParser.ts index 8b4cd85..b6b4762 100644 --- a/src/capability-language/generated/QuixosCapabilityParser.ts +++ b/src/capability-language/generated/QuixosCapabilityParser.ts @@ -11,201 +11,208 @@ type int = number; export class QuixosCapabilityParser extends antlr.Parser { public static readonly WORKSPACE = 1; - public static readonly ATOM = 2; - public static readonly INTERFACE = 3; - public static readonly INTERFACES = 4; - public static readonly PACKAGE = 5; - public static readonly VALUE = 6; - public static readonly RELATION = 7; - public static readonly OPERATION = 8; - public static readonly FUNCTION = 9; - public static readonly CONSTRUCTOR = 10; - public static readonly CONSTRUCTS = 11; - public static readonly CONFORM = 12; - public static readonly AS = 13; - public static readonly BIND = 14; - public static readonly TO = 15; - public static readonly PRIVATE = 16; - public static readonly SHARED = 17; - public static readonly STATE = 18; - public static readonly EDGE = 19; - public static readonly PROJECTION = 20; - public static readonly WITH = 21; - public static readonly USING = 22; - public static readonly VIA = 23; - public static readonly MATERIALIZE = 24; - public static readonly IF = 25; - public static readonly ABSENT = 26; - public static readonly ON = 27; - public static readonly POLICY = 28; - public static readonly DEFAULT = 29; - public static readonly SOURCE = 30; - public static readonly REPOSITORY = 31; - public static readonly COMMIT = 32; - public static readonly REVISION = 33; - public static readonly ID = 34; - public static readonly DOC = 35; - public static readonly MODE = 36; - public static readonly EMITS = 37; - public static readonly RECEIVER = 38; - public static readonly REQUIRES = 39; - public static readonly ANY = 40; - public static readonly GET = 41; - public static readonly SET = 42; - public static readonly WATCH = 43; - public static readonly START = 44; - public static readonly STOP = 45; - public static readonly READ = 46; - public static readonly WRITE = 47; - public static readonly RESOLVE = 48; - public static readonly CONNECT = 49; - public static readonly DISCONNECT = 50; - public static readonly CALL = 51; - public static readonly WATCH_START = 52; - public static readonly WATCH_STOP = 53; - public static readonly SUBSCRIBE = 54; - public static readonly UNSUBSCRIBE = 55; - public static readonly OPTIMISTIC_REGISTER = 56; - public static readonly CRDT = 57; - public static readonly OPTIONAL_ONE = 58; - public static readonly EXACTLY_ONE = 59; - public static readonly MANY_UNIQUE = 60; - public static readonly MANY = 61; - public static readonly ORDERED = 62; - public static readonly UNIT = 63; - public static readonly WATCH_HANDLE = 64; - public static readonly MESSAGE = 65; - public static readonly ATOM_REF = 66; - public static readonly INTERFACE_REF = 67; - public static readonly OPTIONAL = 68; - public static readonly LIST = 69; - public static readonly BOOL = 70; - public static readonly BYTES = 71; - public static readonly DOUBLE = 72; - public static readonly INT32 = 73; - public static readonly INT64 = 74; - public static readonly STRING = 75; - public static readonly UINT32 = 76; - public static readonly UINT64 = 77; - public static readonly TRUE = 78; - public static readonly FALSE = 79; - public static readonly NULL = 80; - public static readonly ARROW = 81; - public static readonly COLON = 82; - public static readonly SEMI = 83; - public static readonly COMMA = 84; - public static readonly DOT = 85; - public static readonly LBRACE = 86; - public static readonly RBRACE = 87; - public static readonly LBRACK = 88; - public static readonly RBRACK = 89; - public static readonly LPAREN = 90; - public static readonly RPAREN = 91; - public static readonly LT = 92; - public static readonly GT = 93; - public static readonly INTEGER = 94; - public static readonly JSON_NUMBER = 95; - public static readonly IDENTIFIER = 96; - public static readonly STRING_LITERAL = 97; - public static readonly LINE_COMMENT = 98; - public static readonly BLOCK_COMMENT = 99; - public static readonly WS = 100; + public static readonly IMPORT = 2; + public static readonly EXTERNAL = 3; + public static readonly ATOM = 4; + public static readonly INTERFACE = 5; + public static readonly INTERFACES = 6; + public static readonly PACKAGE = 7; + public static readonly VALUE = 8; + public static readonly RELATION = 9; + public static readonly OPERATION = 10; + public static readonly FUNCTION = 11; + public static readonly CONSTRUCTOR = 12; + public static readonly CONSTRUCTS = 13; + public static readonly CONFORM = 14; + public static readonly AS = 15; + public static readonly BIND = 16; + public static readonly TO = 17; + public static readonly PRIVATE = 18; + public static readonly SHARED = 19; + public static readonly STATE = 20; + public static readonly EDGE = 21; + public static readonly PROJECTION = 22; + public static readonly WITH = 23; + public static readonly USING = 24; + public static readonly VIA = 25; + public static readonly MATERIALIZE = 26; + public static readonly IF = 27; + public static readonly ABSENT = 28; + public static readonly ON = 29; + public static readonly POLICY = 30; + public static readonly DEFAULT = 31; + public static readonly SOURCE = 32; + public static readonly REPOSITORY = 33; + public static readonly COMMIT = 34; + public static readonly REVISION = 35; + public static readonly ID = 36; + public static readonly DOC = 37; + public static readonly MODE = 38; + public static readonly EMITS = 39; + public static readonly RECEIVER = 40; + public static readonly REQUIRES = 41; + public static readonly ANY = 42; + public static readonly GET = 43; + public static readonly SET = 44; + public static readonly WATCH = 45; + public static readonly START = 46; + public static readonly STOP = 47; + public static readonly READ = 48; + public static readonly WRITE = 49; + public static readonly RESOLVE = 50; + public static readonly CONNECT = 51; + public static readonly DISCONNECT = 52; + public static readonly CALL = 53; + public static readonly WATCH_START = 54; + public static readonly WATCH_STOP = 55; + public static readonly SUBSCRIBE = 56; + public static readonly UNSUBSCRIBE = 57; + public static readonly OPTIMISTIC_REGISTER = 58; + public static readonly CRDT = 59; + public static readonly OPTIONAL_ONE = 60; + public static readonly EXACTLY_ONE = 61; + public static readonly MANY_UNIQUE = 62; + public static readonly MANY = 63; + public static readonly ORDERED = 64; + public static readonly UNIT = 65; + public static readonly WATCH_HANDLE = 66; + public static readonly MESSAGE = 67; + public static readonly ATOM_REF = 68; + public static readonly INTERFACE_REF = 69; + public static readonly OPTIONAL = 70; + public static readonly LIST = 71; + public static readonly BOOL = 72; + public static readonly BYTES = 73; + public static readonly DOUBLE = 74; + public static readonly INT32 = 75; + public static readonly INT64 = 76; + public static readonly STRING = 77; + public static readonly UINT32 = 78; + public static readonly UINT64 = 79; + public static readonly TRUE = 80; + public static readonly FALSE = 81; + public static readonly NULL = 82; + public static readonly ARROW = 83; + public static readonly COLON = 84; + public static readonly SEMI = 85; + public static readonly COMMA = 86; + public static readonly DOT = 87; + public static readonly LBRACE = 88; + public static readonly RBRACE = 89; + public static readonly LBRACK = 90; + public static readonly RBRACK = 91; + public static readonly LPAREN = 92; + public static readonly RPAREN = 93; + public static readonly LT = 94; + public static readonly GT = 95; + public static readonly INTEGER = 96; + public static readonly JSON_NUMBER = 97; + public static readonly IDENTIFIER = 98; + public static readonly STRING_LITERAL = 99; + public static readonly LINE_COMMENT = 100; + public static readonly BLOCK_COMMENT = 101; + public static readonly WS = 102; public static readonly RULE_document = 0; public static readonly RULE_workspaceDecl = 1; public static readonly RULE_workspaceItem = 2; - public static readonly RULE_atomDecl = 3; - public static readonly RULE_interfaceDecl = 4; - public static readonly RULE_sourceBlock = 5; - public static readonly RULE_interfaceMember = 6; - public static readonly RULE_operationMember = 7; - public static readonly RULE_valueMember = 8; - public static readonly RULE_valueMemberOperation = 9; - public static readonly RULE_relationshipMember = 10; - public static readonly RULE_relationshipOperation = 11; - public static readonly RULE_targetConstraint = 12; - public static readonly RULE_packageDecl = 13; - public static readonly RULE_packageExport = 14; - public static readonly RULE_packageOperationExport = 15; - public static readonly RULE_packageFunctionExport = 16; - public static readonly RULE_packageConstructorExport = 17; - public static readonly RULE_eventClause = 18; - public static readonly RULE_operationMode = 19; - public static readonly RULE_receiverRequirement = 20; - public static readonly RULE_identifierList = 21; - public static readonly RULE_dependencyBlock = 22; - public static readonly RULE_dependencyPort = 23; - public static readonly RULE_primitiveList = 24; - public static readonly RULE_primitive = 25; - public static readonly RULE_sharedAttachmentDecl = 26; - public static readonly RULE_attachmentDecl = 27; - public static readonly RULE_stateDecl = 28; - public static readonly RULE_storagePolicy = 29; - public static readonly RULE_edgeDecl = 30; - public static readonly RULE_edgeEndpoint = 31; - public static readonly RULE_conformanceDecl = 32; - public static readonly RULE_conformanceItem = 33; - public static readonly RULE_relationshipMaterializationDecl = 34; - public static readonly RULE_operationBindingDecl = 35; - public static readonly RULE_memberOperationRef = 36; - public static readonly RULE_operationName = 37; - public static readonly RULE_operationProvider = 38; - public static readonly RULE_statePrimitive = 39; - public static readonly RULE_edgePrimitive = 40; - public static readonly RULE_dependencyBindingBlock = 41; - public static readonly RULE_dependencyBinding = 42; - public static readonly RULE_constructorBindingDecl = 43; - public static readonly RULE_valueType = 44; - public static readonly RULE_scalarType = 45; - public static readonly RULE_cardinality = 46; - public static readonly RULE_jsonLiteral = 47; - public static readonly RULE_jsonObject = 48; - public static readonly RULE_jsonMember = 49; - public static readonly RULE_jsonArray = 50; - public static readonly RULE_identifier = 51; - public static readonly RULE_stringLiteral = 52; + public static readonly RULE_resourceImportDecl = 3; + public static readonly RULE_externalAtomDecl = 4; + public static readonly RULE_externalInterfaceDecl = 5; + public static readonly RULE_resourcePreamble = 6; + public static readonly RULE_atomDecl = 7; + public static readonly RULE_interfaceResourceDecl = 8; + public static readonly RULE_interfaceMember = 9; + public static readonly RULE_operationMember = 10; + public static readonly RULE_valueMember = 11; + public static readonly RULE_valueMemberOperation = 12; + public static readonly RULE_relationshipMember = 13; + public static readonly RULE_relationshipOperation = 14; + public static readonly RULE_targetConstraint = 15; + public static readonly RULE_packageResourceDecl = 16; + public static readonly RULE_packageExport = 17; + public static readonly RULE_packageOperationExport = 18; + public static readonly RULE_packageFunctionExport = 19; + public static readonly RULE_packageConstructorExport = 20; + public static readonly RULE_eventClause = 21; + public static readonly RULE_operationMode = 22; + public static readonly RULE_receiverRequirement = 23; + public static readonly RULE_identifierList = 24; + public static readonly RULE_dependencyBlock = 25; + public static readonly RULE_dependencyPort = 26; + public static readonly RULE_primitiveList = 27; + public static readonly RULE_primitive = 28; + public static readonly RULE_sharedAttachmentDecl = 29; + public static readonly RULE_attachmentDecl = 30; + public static readonly RULE_stateDecl = 31; + public static readonly RULE_storagePolicy = 32; + public static readonly RULE_edgeDecl = 33; + public static readonly RULE_edgeEndpoint = 34; + public static readonly RULE_conformanceDecl = 35; + public static readonly RULE_conformanceItem = 36; + public static readonly RULE_relationshipMaterializationDecl = 37; + public static readonly RULE_operationBindingDecl = 38; + public static readonly RULE_memberOperationRef = 39; + public static readonly RULE_operationName = 40; + public static readonly RULE_operationProvider = 41; + public static readonly RULE_statePrimitive = 42; + public static readonly RULE_edgePrimitive = 43; + public static readonly RULE_dependencyBindingBlock = 44; + public static readonly RULE_dependencyBinding = 45; + public static readonly RULE_constructorBindingDecl = 46; + public static readonly RULE_valueType = 47; + public static readonly RULE_scalarType = 48; + public static readonly RULE_cardinality = 49; + public static readonly RULE_jsonLiteral = 50; + public static readonly RULE_jsonObject = 51; + public static readonly RULE_jsonMember = 52; + public static readonly RULE_jsonArray = 53; + public static readonly RULE_identifier = 54; + public static readonly RULE_stringLiteral = 55; public static readonly literalNames = [ - null, "'workspace'", "'atom'", "'interface'", "'interfaces'", "'package'", - "'value'", "'relation'", "'operation'", "'function'", "'constructor'", - "'constructs'", "'conform'", "'as'", "'bind'", "'to'", "'private'", - "'shared'", "'state'", "'edge'", "'projection'", "'with'", "'using'", - "'via'", "'materialize'", "'if'", "'absent'", "'on'", "'policy'", - "'default'", "'source'", "'repository'", "'commit'", "'revision'", - "'id'", "'doc'", "'mode'", "'emits'", "'receiver'", "'requires'", - "'any'", "'get'", "'set'", "'watch'", "'start'", "'stop'", "'read'", - "'write'", "'resolve'", "'connect'", "'disconnect'", "'call'", "'watch-start'", - "'watch-stop'", "'subscribe'", "'unsubscribe'", "'optimistic-register'", - "'crdt'", "'optional-one'", "'exactly-one'", "'many-unique'", "'many'", - "'ordered'", "'unit'", "'watch-handle'", "'message'", "'atom-ref'", - "'interface-ref'", "'optional'", "'list'", "'bool'", "'bytes'", - "'double'", "'int32'", "'int64'", "'string'", "'uint32'", "'uint64'", - "'true'", "'false'", "'null'", "'->'", "':'", "';'", "','", "'.'", - "'{'", "'}'", "'['", "']'", "'('", "')'", "'<'", "'>'" + null, "'workspace'", "'import'", "'external'", "'atom'", "'interface'", + "'interfaces'", "'package'", "'value'", "'relation'", "'operation'", + "'function'", "'constructor'", "'constructs'", "'conform'", "'as'", + "'bind'", "'to'", "'private'", "'shared'", "'state'", "'edge'", + "'projection'", "'with'", "'using'", "'via'", "'materialize'", "'if'", + "'absent'", "'on'", "'policy'", "'default'", "'source'", "'repository'", + "'commit'", "'revision'", "'id'", "'doc'", "'mode'", "'emits'", + "'receiver'", "'requires'", "'any'", "'get'", "'set'", "'watch'", + "'start'", "'stop'", "'read'", "'write'", "'resolve'", "'connect'", + "'disconnect'", "'call'", "'watch-start'", "'watch-stop'", "'subscribe'", + "'unsubscribe'", "'optimistic-register'", "'crdt'", "'optional-one'", + "'exactly-one'", "'many-unique'", "'many'", "'ordered'", "'unit'", + "'watch-handle'", "'message'", "'atom-ref'", "'interface-ref'", + "'optional'", "'list'", "'bool'", "'bytes'", "'double'", "'int32'", + "'int64'", "'string'", "'uint32'", "'uint64'", "'true'", "'false'", + "'null'", "'->'", "':'", "';'", "','", "'.'", "'{'", "'}'", "'['", + "']'", "'('", "')'", "'<'", "'>'" ]; public static readonly symbolicNames = [ - null, "WORKSPACE", "ATOM", "INTERFACE", "INTERFACES", "PACKAGE", - "VALUE", "RELATION", "OPERATION", "FUNCTION", "CONSTRUCTOR", "CONSTRUCTS", - "CONFORM", "AS", "BIND", "TO", "PRIVATE", "SHARED", "STATE", "EDGE", - "PROJECTION", "WITH", "USING", "VIA", "MATERIALIZE", "IF", "ABSENT", - "ON", "POLICY", "DEFAULT", "SOURCE", "REPOSITORY", "COMMIT", "REVISION", - "ID", "DOC", "MODE", "EMITS", "RECEIVER", "REQUIRES", "ANY", "GET", - "SET", "WATCH", "START", "STOP", "READ", "WRITE", "RESOLVE", "CONNECT", - "DISCONNECT", "CALL", "WATCH_START", "WATCH_STOP", "SUBSCRIBE", - "UNSUBSCRIBE", "OPTIMISTIC_REGISTER", "CRDT", "OPTIONAL_ONE", "EXACTLY_ONE", - "MANY_UNIQUE", "MANY", "ORDERED", "UNIT", "WATCH_HANDLE", "MESSAGE", - "ATOM_REF", "INTERFACE_REF", "OPTIONAL", "LIST", "BOOL", "BYTES", - "DOUBLE", "INT32", "INT64", "STRING", "UINT32", "UINT64", "TRUE", - "FALSE", "NULL", "ARROW", "COLON", "SEMI", "COMMA", "DOT", "LBRACE", - "RBRACE", "LBRACK", "RBRACK", "LPAREN", "RPAREN", "LT", "GT", "INTEGER", - "JSON_NUMBER", "IDENTIFIER", "STRING_LITERAL", "LINE_COMMENT", "BLOCK_COMMENT", - "WS" + null, "WORKSPACE", "IMPORT", "EXTERNAL", "ATOM", "INTERFACE", "INTERFACES", + "PACKAGE", "VALUE", "RELATION", "OPERATION", "FUNCTION", "CONSTRUCTOR", + "CONSTRUCTS", "CONFORM", "AS", "BIND", "TO", "PRIVATE", "SHARED", + "STATE", "EDGE", "PROJECTION", "WITH", "USING", "VIA", "MATERIALIZE", + "IF", "ABSENT", "ON", "POLICY", "DEFAULT", "SOURCE", "REPOSITORY", + "COMMIT", "REVISION", "ID", "DOC", "MODE", "EMITS", "RECEIVER", + "REQUIRES", "ANY", "GET", "SET", "WATCH", "START", "STOP", "READ", + "WRITE", "RESOLVE", "CONNECT", "DISCONNECT", "CALL", "WATCH_START", + "WATCH_STOP", "SUBSCRIBE", "UNSUBSCRIBE", "OPTIMISTIC_REGISTER", + "CRDT", "OPTIONAL_ONE", "EXACTLY_ONE", "MANY_UNIQUE", "MANY", "ORDERED", + "UNIT", "WATCH_HANDLE", "MESSAGE", "ATOM_REF", "INTERFACE_REF", + "OPTIONAL", "LIST", "BOOL", "BYTES", "DOUBLE", "INT32", "INT64", + "STRING", "UINT32", "UINT64", "TRUE", "FALSE", "NULL", "ARROW", + "COLON", "SEMI", "COMMA", "DOT", "LBRACE", "RBRACE", "LBRACK", "RBRACK", + "LPAREN", "RPAREN", "LT", "GT", "INTEGER", "JSON_NUMBER", "IDENTIFIER", + "STRING_LITERAL", "LINE_COMMENT", "BLOCK_COMMENT", "WS" ]; public static readonly ruleNames = [ - "document", "workspaceDecl", "workspaceItem", "atomDecl", "interfaceDecl", - "sourceBlock", "interfaceMember", "operationMember", "valueMember", - "valueMemberOperation", "relationshipMember", "relationshipOperation", - "targetConstraint", "packageDecl", "packageExport", "packageOperationExport", + "document", "workspaceDecl", "workspaceItem", "resourceImportDecl", + "externalAtomDecl", "externalInterfaceDecl", "resourcePreamble", + "atomDecl", "interfaceResourceDecl", "interfaceMember", "operationMember", + "valueMember", "valueMemberOperation", "relationshipMember", "relationshipOperation", + "targetConstraint", "packageResourceDecl", "packageExport", "packageOperationExport", "packageFunctionExport", "packageConstructorExport", "eventClause", "operationMode", "receiverRequirement", "identifierList", "dependencyBlock", "dependencyPort", "primitiveList", "primitive", "sharedAttachmentDecl", @@ -236,12 +243,36 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new DocumentContext(this.context, this.state); this.enterRule(localContext, 0, QuixosCapabilityParser.RULE_document); try { - this.enterOuterAlt(localContext, 1); - { - this.state = 106; - this.workspaceDecl(); - this.state = 107; - this.match(QuixosCapabilityParser.EOF); + this.state = 121; + this.errorHandler.sync(this); + switch (this.interpreter.adaptivePredict(this.tokenStream, 0, this.context) ) { + case 1: + this.enterOuterAlt(localContext, 1); + { + this.state = 112; + this.workspaceDecl(); + this.state = 113; + this.match(QuixosCapabilityParser.EOF); + } + break; + case 2: + this.enterOuterAlt(localContext, 2); + { + this.state = 115; + this.interfaceResourceDecl(); + this.state = 116; + this.match(QuixosCapabilityParser.EOF); + } + break; + case 3: + this.enterOuterAlt(localContext, 3); + { + this.state = 118; + this.packageResourceDecl(); + this.state = 119; + this.match(QuixosCapabilityParser.EOF); + } + break; } } catch (re) { @@ -264,39 +295,39 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 109; + this.state = 123; this.match(QuixosCapabilityParser.WORKSPACE); - this.state = 110; + this.state = 124; this.identifier(); - this.state = 111; + this.state = 125; this.match(QuixosCapabilityParser.ID); - this.state = 112; + this.state = 126; this.stringLiteral(); - this.state = 113; + this.state = 127; this.match(QuixosCapabilityParser.REVISION); - this.state = 114; + this.state = 128; this.stringLiteral(); - this.state = 115; + this.state = 129; this.match(QuixosCapabilityParser.COMMIT); - this.state = 116; + this.state = 130; this.stringLiteral(); - this.state = 117; + this.state = 131; this.match(QuixosCapabilityParser.LBRACE); - this.state = 121; + this.state = 135; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 136236) !== 0)) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 544788) !== 0)) { { { - this.state = 118; + this.state = 132; this.workspaceItem(); } } - this.state = 123; + this.state = 137; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 124; + this.state = 138; this.match(QuixosCapabilityParser.RBRACE); } } @@ -317,48 +348,41 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new WorkspaceItemContext(this.context, this.state); this.enterRule(localContext, 4, QuixosCapabilityParser.RULE_workspaceItem); try { - this.state = 132; + this.state = 145; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.ATOM: this.enterOuterAlt(localContext, 1); { - this.state = 126; + this.state = 140; this.atomDecl(); } break; - case QuixosCapabilityParser.INTERFACE: + case QuixosCapabilityParser.IMPORT: this.enterOuterAlt(localContext, 2); { - this.state = 127; - this.interfaceDecl(); - } - break; - case QuixosCapabilityParser.PACKAGE: - this.enterOuterAlt(localContext, 3); - { - this.state = 128; - this.packageDecl(); + this.state = 141; + this.resourceImportDecl(); } break; case QuixosCapabilityParser.SHARED: - this.enterOuterAlt(localContext, 4); + this.enterOuterAlt(localContext, 3); { - this.state = 129; + this.state = 142; this.sharedAttachmentDecl(); } break; case QuixosCapabilityParser.CONFORM: - this.enterOuterAlt(localContext, 5); + this.enterOuterAlt(localContext, 4); { - this.state = 130; + this.state = 143; this.conformanceDecl(); } break; case QuixosCapabilityParser.CONSTRUCTOR: - this.enterOuterAlt(localContext, 6); + this.enterOuterAlt(localContext, 5); { - this.state = 131; + this.state = 144; this.constructorBindingDecl(); } break; @@ -379,89 +403,39 @@ export class QuixosCapabilityParser extends antlr.Parser { } return localContext; } - public atomDecl(): AtomDeclContext { - let localContext = new AtomDeclContext(this.context, this.state); - this.enterRule(localContext, 6, QuixosCapabilityParser.RULE_atomDecl); - let _la: number; + public resourceImportDecl(): ResourceImportDeclContext { + let localContext = new ResourceImportDeclContext(this.context, this.state); + this.enterRule(localContext, 6, QuixosCapabilityParser.RULE_resourceImportDecl); try { - this.enterOuterAlt(localContext, 1); - { - this.state = 134; - this.match(QuixosCapabilityParser.ATOM); - this.state = 135; - this.identifier(); - this.state = 136; - this.match(QuixosCapabilityParser.ID); - this.state = 137; - this.stringLiteral(); - this.state = 140; + this.state = 157; this.errorHandler.sync(this); - _la = this.tokenStream.LA(1); - if (_la === 35) { + switch (this.interpreter.adaptivePredict(this.tokenStream, 3, this.context) ) { + case 1: + this.enterOuterAlt(localContext, 1); { - this.state = 138; - this.match(QuixosCapabilityParser.DOC); - this.state = 139; - this.stringLiteral(); + this.state = 147; + this.match(QuixosCapabilityParser.IMPORT); + this.state = 148; + this.match(QuixosCapabilityParser.INTERFACE); + this.state = 149; + this.identifier(); + this.state = 150; + this.match(QuixosCapabilityParser.SEMI); } - } - - this.state = 142; - this.match(QuixosCapabilityParser.SEMI); - } - } - catch (re) { - if (re instanceof antlr.RecognitionException) { - this.errorHandler.reportError(this, re); - this.errorHandler.recover(this, re); - } else { - throw re; - } - } - finally { - this.exitRule(); - } - return localContext; - } - public interfaceDecl(): InterfaceDeclContext { - let localContext = new InterfaceDeclContext(this.context, this.state); - this.enterRule(localContext, 8, QuixosCapabilityParser.RULE_interfaceDecl); - let _la: number; - try { - this.enterOuterAlt(localContext, 1); - { - this.state = 144; - this.match(QuixosCapabilityParser.INTERFACE); - this.state = 145; - this.identifier(); - this.state = 146; - this.match(QuixosCapabilityParser.ID); - this.state = 147; - this.stringLiteral(); - this.state = 148; - this.match(QuixosCapabilityParser.REVISION); - this.state = 149; - this.stringLiteral(); - this.state = 150; - this.sourceBlock(); - this.state = 151; - this.match(QuixosCapabilityParser.LBRACE); - this.state = 155; - this.errorHandler.sync(this); - _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 448) !== 0)) { - { + break; + case 2: + this.enterOuterAlt(localContext, 2); { this.state = 152; - this.interfaceMember(); + this.match(QuixosCapabilityParser.IMPORT); + this.state = 153; + this.match(QuixosCapabilityParser.PACKAGE); + this.state = 154; + this.identifier(); + this.state = 155; + this.match(QuixosCapabilityParser.SEMI); } - } - this.state = 157; - this.errorHandler.sync(this); - _la = this.tokenStream.LA(1); - } - this.state = 158; - this.match(QuixosCapabilityParser.RBRACE); + break; } } catch (re) { @@ -477,29 +451,209 @@ export class QuixosCapabilityParser extends antlr.Parser { } return localContext; } - public sourceBlock(): SourceBlockContext { - let localContext = new SourceBlockContext(this.context, this.state); - this.enterRule(localContext, 10, QuixosCapabilityParser.RULE_sourceBlock); + public externalAtomDecl(): ExternalAtomDeclContext { + let localContext = new ExternalAtomDeclContext(this.context, this.state); + this.enterRule(localContext, 8, QuixosCapabilityParser.RULE_externalAtomDecl); try { this.enterOuterAlt(localContext, 1); { + this.state = 159; + this.match(QuixosCapabilityParser.EXTERNAL); this.state = 160; - this.match(QuixosCapabilityParser.SOURCE); + this.match(QuixosCapabilityParser.ATOM); this.state = 161; - this.match(QuixosCapabilityParser.LBRACE); + this.identifier(); this.state = 162; - this.match(QuixosCapabilityParser.REPOSITORY); + this.match(QuixosCapabilityParser.ID); this.state = 163; this.stringLiteral(); this.state = 164; this.match(QuixosCapabilityParser.SEMI); - this.state = 165; - this.match(QuixosCapabilityParser.COMMIT); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public externalInterfaceDecl(): ExternalInterfaceDeclContext { + let localContext = new ExternalInterfaceDeclContext(this.context, this.state); + this.enterRule(localContext, 10, QuixosCapabilityParser.RULE_externalInterfaceDecl); + try { + this.enterOuterAlt(localContext, 1); + { this.state = 166; - this.stringLiteral(); + this.match(QuixosCapabilityParser.EXTERNAL); this.state = 167; - this.match(QuixosCapabilityParser.SEMI); + this.match(QuixosCapabilityParser.INTERFACE); this.state = 168; + this.identifier(); + this.state = 169; + this.match(QuixosCapabilityParser.REVISION); + this.state = 170; + this.stringLiteral(); + this.state = 171; + this.match(QuixosCapabilityParser.SEMI); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public resourcePreamble(): ResourcePreambleContext { + let localContext = new ResourcePreambleContext(this.context, this.state); + this.enterRule(localContext, 12, QuixosCapabilityParser.RULE_resourcePreamble); + try { + this.state = 176; + this.errorHandler.sync(this); + switch (this.interpreter.adaptivePredict(this.tokenStream, 4, this.context) ) { + case 1: + this.enterOuterAlt(localContext, 1); + { + this.state = 173; + this.resourceImportDecl(); + } + break; + case 2: + this.enterOuterAlt(localContext, 2); + { + this.state = 174; + this.externalAtomDecl(); + } + break; + case 3: + this.enterOuterAlt(localContext, 3); + { + this.state = 175; + this.externalInterfaceDecl(); + } + break; + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public atomDecl(): AtomDeclContext { + let localContext = new AtomDeclContext(this.context, this.state); + this.enterRule(localContext, 14, QuixosCapabilityParser.RULE_atomDecl); + let _la: number; + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 178; + this.match(QuixosCapabilityParser.ATOM); + this.state = 179; + this.identifier(); + this.state = 180; + this.match(QuixosCapabilityParser.ID); + this.state = 181; + this.stringLiteral(); + this.state = 184; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 37) { + { + this.state = 182; + this.match(QuixosCapabilityParser.DOC); + this.state = 183; + this.stringLiteral(); + } + } + + this.state = 186; + this.match(QuixosCapabilityParser.SEMI); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public interfaceResourceDecl(): InterfaceResourceDeclContext { + let localContext = new InterfaceResourceDeclContext(this.context, this.state); + this.enterRule(localContext, 16, QuixosCapabilityParser.RULE_interfaceResourceDecl); + let _la: number; + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 191; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + while (_la === 2 || _la === 3) { + { + { + this.state = 188; + this.resourcePreamble(); + } + } + this.state = 193; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + } + this.state = 194; + this.match(QuixosCapabilityParser.INTERFACE); + this.state = 195; + this.identifier(); + this.state = 196; + this.match(QuixosCapabilityParser.ID); + this.state = 197; + this.stringLiteral(); + this.state = 198; + this.match(QuixosCapabilityParser.REVISION); + this.state = 199; + this.stringLiteral(); + this.state = 200; + this.match(QuixosCapabilityParser.LBRACE); + this.state = 204; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 1792) !== 0)) { + { + { + this.state = 201; + this.interfaceMember(); + } + } + this.state = 206; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + } + this.state = 207; this.match(QuixosCapabilityParser.RBRACE); } } @@ -518,29 +672,29 @@ export class QuixosCapabilityParser extends antlr.Parser { } public interfaceMember(): InterfaceMemberContext { let localContext = new InterfaceMemberContext(this.context, this.state); - this.enterRule(localContext, 12, QuixosCapabilityParser.RULE_interfaceMember); + this.enterRule(localContext, 18, QuixosCapabilityParser.RULE_interfaceMember); try { - this.state = 173; + this.state = 212; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.VALUE: this.enterOuterAlt(localContext, 1); { - this.state = 170; + this.state = 209; this.valueMember(); } break; case QuixosCapabilityParser.RELATION: this.enterOuterAlt(localContext, 2); { - this.state = 171; + this.state = 210; this.relationshipMember(); } break; case QuixosCapabilityParser.OPERATION: this.enterOuterAlt(localContext, 3); { - this.state = 172; + this.state = 211; this.operationMember(); } break; @@ -563,37 +717,37 @@ export class QuixosCapabilityParser extends antlr.Parser { } public operationMember(): OperationMemberContext { let localContext = new OperationMemberContext(this.context, this.state); - this.enterRule(localContext, 14, QuixosCapabilityParser.RULE_operationMember); + this.enterRule(localContext, 20, QuixosCapabilityParser.RULE_operationMember); try { this.enterOuterAlt(localContext, 1); { - this.state = 175; + this.state = 214; this.match(QuixosCapabilityParser.OPERATION); - this.state = 176; + this.state = 215; this.identifier(); - this.state = 177; + this.state = 216; this.match(QuixosCapabilityParser.ID); - this.state = 178; + this.state = 217; this.stringLiteral(); - this.state = 179; + this.state = 218; this.match(QuixosCapabilityParser.COLON); - this.state = 180; + this.state = 219; this.valueType(); - this.state = 181; + this.state = 220; this.match(QuixosCapabilityParser.ARROW); - this.state = 182; + this.state = 221; this.valueType(); - this.state = 183; + this.state = 222; this.match(QuixosCapabilityParser.LBRACE); - this.state = 184; + this.state = 223; this.match(QuixosCapabilityParser.CALL); - this.state = 185; + this.state = 224; this.match(QuixosCapabilityParser.ID); - this.state = 186; + this.state = 225; this.stringLiteral(); - this.state = 187; + this.state = 226; this.match(QuixosCapabilityParser.SEMI); - this.state = 188; + this.state = 227; this.match(QuixosCapabilityParser.RBRACE); } } @@ -612,40 +766,40 @@ export class QuixosCapabilityParser extends antlr.Parser { } public valueMember(): ValueMemberContext { let localContext = new ValueMemberContext(this.context, this.state); - this.enterRule(localContext, 16, QuixosCapabilityParser.RULE_valueMember); + this.enterRule(localContext, 22, QuixosCapabilityParser.RULE_valueMember); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 190; + this.state = 229; this.match(QuixosCapabilityParser.VALUE); - this.state = 191; + this.state = 230; this.identifier(); - this.state = 192; + this.state = 231; this.match(QuixosCapabilityParser.ID); - this.state = 193; + this.state = 232; this.stringLiteral(); - this.state = 194; + this.state = 233; this.match(QuixosCapabilityParser.COLON); - this.state = 195; + this.state = 234; this.valueType(); - this.state = 196; + this.state = 235; this.match(QuixosCapabilityParser.LBRACE); - this.state = 200; + this.state = 239; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (((((_la - 41)) & ~0x1F) === 0 && ((1 << (_la - 41)) & 7) !== 0)) { + while (((((_la - 43)) & ~0x1F) === 0 && ((1 << (_la - 43)) & 7) !== 0)) { { { - this.state = 197; + this.state = 236; this.valueMemberOperation(); } } - this.state = 202; + this.state = 241; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 203; + this.state = 242; this.match(QuixosCapabilityParser.RBRACE); } } @@ -664,55 +818,55 @@ export class QuixosCapabilityParser extends antlr.Parser { } public valueMemberOperation(): ValueMemberOperationContext { let localContext = new ValueMemberOperationContext(this.context, this.state); - this.enterRule(localContext, 18, QuixosCapabilityParser.RULE_valueMemberOperation); + this.enterRule(localContext, 24, QuixosCapabilityParser.RULE_valueMemberOperation); try { - this.state = 224; + this.state = 263; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.GET: this.enterOuterAlt(localContext, 1); { - this.state = 205; + this.state = 244; this.match(QuixosCapabilityParser.GET); - this.state = 206; + this.state = 245; this.match(QuixosCapabilityParser.ID); - this.state = 207; + this.state = 246; this.stringLiteral(); - this.state = 208; + this.state = 247; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.SET: this.enterOuterAlt(localContext, 2); { - this.state = 210; + this.state = 249; this.match(QuixosCapabilityParser.SET); - this.state = 211; + this.state = 250; this.match(QuixosCapabilityParser.ID); - this.state = 212; + this.state = 251; this.stringLiteral(); - this.state = 213; + this.state = 252; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.WATCH: this.enterOuterAlt(localContext, 3); { - this.state = 215; + this.state = 254; this.match(QuixosCapabilityParser.WATCH); - this.state = 216; + this.state = 255; this.match(QuixosCapabilityParser.START); - this.state = 217; + this.state = 256; this.match(QuixosCapabilityParser.ID); - this.state = 218; + this.state = 257; this.stringLiteral(); - this.state = 219; + this.state = 258; this.match(QuixosCapabilityParser.STOP); - this.state = 220; + this.state = 259; this.match(QuixosCapabilityParser.ID); - this.state = 221; + this.state = 260; this.stringLiteral(); - this.state = 222; + this.state = 261; this.match(QuixosCapabilityParser.SEMI); } break; @@ -735,52 +889,52 @@ export class QuixosCapabilityParser extends antlr.Parser { } public relationshipMember(): RelationshipMemberContext { let localContext = new RelationshipMemberContext(this.context, this.state); - this.enterRule(localContext, 20, QuixosCapabilityParser.RULE_relationshipMember); + this.enterRule(localContext, 26, QuixosCapabilityParser.RULE_relationshipMember); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 226; + this.state = 265; this.match(QuixosCapabilityParser.RELATION); - this.state = 227; + this.state = 266; this.identifier(); - this.state = 228; + this.state = 267; this.match(QuixosCapabilityParser.ID); - this.state = 229; + this.state = 268; this.stringLiteral(); - this.state = 230; + this.state = 269; this.match(QuixosCapabilityParser.COLON); - this.state = 231; + this.state = 270; this.cardinality(); - this.state = 232; + this.state = 271; this.targetConstraint(); - this.state = 234; + this.state = 273; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 62) { + if (_la === 64) { { - this.state = 233; + this.state = 272; this.match(QuixosCapabilityParser.ORDERED); } } - this.state = 236; + this.state = 275; this.match(QuixosCapabilityParser.LBRACE); - this.state = 240; + this.state = 279; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (((((_la - 43)) & ~0x1F) === 0 && ((1 << (_la - 43)) & 225) !== 0)) { + while (((((_la - 45)) & ~0x1F) === 0 && ((1 << (_la - 45)) & 225) !== 0)) { { { - this.state = 237; + this.state = 276; this.relationshipOperation(); } } - this.state = 242; + this.state = 281; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 243; + this.state = 282; this.match(QuixosCapabilityParser.RBRACE); } } @@ -799,68 +953,68 @@ export class QuixosCapabilityParser extends antlr.Parser { } public relationshipOperation(): RelationshipOperationContext { let localContext = new RelationshipOperationContext(this.context, this.state); - this.enterRule(localContext, 22, QuixosCapabilityParser.RULE_relationshipOperation); + this.enterRule(localContext, 28, QuixosCapabilityParser.RULE_relationshipOperation); try { - this.state = 269; + this.state = 308; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.RESOLVE: this.enterOuterAlt(localContext, 1); { - this.state = 245; + this.state = 284; this.match(QuixosCapabilityParser.RESOLVE); - this.state = 246; + this.state = 285; this.match(QuixosCapabilityParser.ID); - this.state = 247; + this.state = 286; this.stringLiteral(); - this.state = 248; + this.state = 287; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.CONNECT: this.enterOuterAlt(localContext, 2); { - this.state = 250; + this.state = 289; this.match(QuixosCapabilityParser.CONNECT); - this.state = 251; + this.state = 290; this.match(QuixosCapabilityParser.ID); - this.state = 252; + this.state = 291; this.stringLiteral(); - this.state = 253; + this.state = 292; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.DISCONNECT: this.enterOuterAlt(localContext, 3); { - this.state = 255; + this.state = 294; this.match(QuixosCapabilityParser.DISCONNECT); - this.state = 256; + this.state = 295; this.match(QuixosCapabilityParser.ID); - this.state = 257; + this.state = 296; this.stringLiteral(); - this.state = 258; + this.state = 297; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.WATCH: this.enterOuterAlt(localContext, 4); { - this.state = 260; + this.state = 299; this.match(QuixosCapabilityParser.WATCH); - this.state = 261; + this.state = 300; this.match(QuixosCapabilityParser.START); - this.state = 262; + this.state = 301; this.match(QuixosCapabilityParser.ID); - this.state = 263; + this.state = 302; this.stringLiteral(); - this.state = 264; + this.state = 303; this.match(QuixosCapabilityParser.STOP); - this.state = 265; + this.state = 304; this.match(QuixosCapabilityParser.ID); - this.state = 266; + this.state = 305; this.stringLiteral(); - this.state = 267; + this.state = 306; this.match(QuixosCapabilityParser.SEMI); } break; @@ -883,26 +1037,26 @@ export class QuixosCapabilityParser extends antlr.Parser { } public targetConstraint(): TargetConstraintContext { let localContext = new TargetConstraintContext(this.context, this.state); - this.enterRule(localContext, 24, QuixosCapabilityParser.RULE_targetConstraint); + this.enterRule(localContext, 30, QuixosCapabilityParser.RULE_targetConstraint); try { - this.state = 275; + this.state = 314; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.ATOM: this.enterOuterAlt(localContext, 1); { - this.state = 271; + this.state = 310; this.match(QuixosCapabilityParser.ATOM); - this.state = 272; + this.state = 311; this.identifier(); } break; case QuixosCapabilityParser.INTERFACE: this.enterOuterAlt(localContext, 2); { - this.state = 273; + this.state = 312; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 274; + this.state = 313; this.identifier(); } break; @@ -923,44 +1077,56 @@ export class QuixosCapabilityParser extends antlr.Parser { } return localContext; } - public packageDecl(): PackageDeclContext { - let localContext = new PackageDeclContext(this.context, this.state); - this.enterRule(localContext, 26, QuixosCapabilityParser.RULE_packageDecl); + public packageResourceDecl(): PackageResourceDeclContext { + let localContext = new PackageResourceDeclContext(this.context, this.state); + this.enterRule(localContext, 32, QuixosCapabilityParser.RULE_packageResourceDecl); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 277; - this.match(QuixosCapabilityParser.PACKAGE); - this.state = 278; - this.identifier(); - this.state = 279; - this.match(QuixosCapabilityParser.ID); - this.state = 280; - this.stringLiteral(); - this.state = 281; - this.match(QuixosCapabilityParser.REVISION); - this.state = 282; - this.stringLiteral(); - this.state = 283; - this.sourceBlock(); - this.state = 284; - this.match(QuixosCapabilityParser.LBRACE); - this.state = 288; + this.state = 319; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 1792) !== 0)) { + while (_la === 2 || _la === 3) { { { - this.state = 285; - this.packageExport(); + this.state = 316; + this.resourcePreamble(); } } - this.state = 290; + this.state = 321; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 291; + this.state = 322; + this.match(QuixosCapabilityParser.PACKAGE); + this.state = 323; + this.identifier(); + this.state = 324; + this.match(QuixosCapabilityParser.ID); + this.state = 325; + this.stringLiteral(); + this.state = 326; + this.match(QuixosCapabilityParser.REVISION); + this.state = 327; + this.stringLiteral(); + this.state = 328; + this.match(QuixosCapabilityParser.LBRACE); + this.state = 332; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 7168) !== 0)) { + { + { + this.state = 329; + this.packageExport(); + } + } + this.state = 334; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + } + this.state = 335; this.match(QuixosCapabilityParser.RBRACE); } } @@ -979,29 +1145,29 @@ export class QuixosCapabilityParser extends antlr.Parser { } public packageExport(): PackageExportContext { let localContext = new PackageExportContext(this.context, this.state); - this.enterRule(localContext, 28, QuixosCapabilityParser.RULE_packageExport); + this.enterRule(localContext, 34, QuixosCapabilityParser.RULE_packageExport); try { - this.state = 296; + this.state = 340; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.OPERATION: this.enterOuterAlt(localContext, 1); { - this.state = 293; + this.state = 337; this.packageOperationExport(); } break; case QuixosCapabilityParser.FUNCTION: this.enterOuterAlt(localContext, 2); { - this.state = 294; + this.state = 338; this.packageFunctionExport(); } break; case QuixosCapabilityParser.CONSTRUCTOR: this.enterOuterAlt(localContext, 3); { - this.state = 295; + this.state = 339; this.packageConstructorExport(); } break; @@ -1024,56 +1190,56 @@ export class QuixosCapabilityParser extends antlr.Parser { } public packageOperationExport(): PackageOperationExportContext { let localContext = new PackageOperationExportContext(this.context, this.state); - this.enterRule(localContext, 30, QuixosCapabilityParser.RULE_packageOperationExport); + this.enterRule(localContext, 36, QuixosCapabilityParser.RULE_packageOperationExport); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 298; + this.state = 342; this.match(QuixosCapabilityParser.OPERATION); - this.state = 299; + this.state = 343; this.identifier(); - this.state = 300; + this.state = 344; this.match(QuixosCapabilityParser.ID); - this.state = 301; + this.state = 345; this.stringLiteral(); - this.state = 302; + this.state = 346; this.match(QuixosCapabilityParser.COLON); - this.state = 303; + this.state = 347; this.valueType(); - this.state = 304; + this.state = 348; this.match(QuixosCapabilityParser.ARROW); - this.state = 305; + this.state = 349; this.valueType(); - this.state = 306; + this.state = 350; this.match(QuixosCapabilityParser.MODE); - this.state = 307; + this.state = 351; this.operationMode(); - this.state = 309; - this.errorHandler.sync(this); - _la = this.tokenStream.LA(1); - if (_la === 37) { - { - this.state = 308; - this.eventClause(); - } - } - - this.state = 311; - this.match(QuixosCapabilityParser.RECEIVER); - this.state = 312; - this.receiverRequirement(); - this.state = 314; + this.state = 353; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 39) { { - this.state = 313; + this.state = 352; + this.eventClause(); + } + } + + this.state = 355; + this.match(QuixosCapabilityParser.RECEIVER); + this.state = 356; + this.receiverRequirement(); + this.state = 358; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 41) { + { + this.state = 357; this.dependencyBlock(); } } - this.state = 316; + this.state = 360; this.match(QuixosCapabilityParser.SEMI); } } @@ -1092,38 +1258,38 @@ export class QuixosCapabilityParser extends antlr.Parser { } public packageFunctionExport(): PackageFunctionExportContext { let localContext = new PackageFunctionExportContext(this.context, this.state); - this.enterRule(localContext, 32, QuixosCapabilityParser.RULE_packageFunctionExport); + this.enterRule(localContext, 38, QuixosCapabilityParser.RULE_packageFunctionExport); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 318; + this.state = 362; this.match(QuixosCapabilityParser.FUNCTION); - this.state = 319; + this.state = 363; this.identifier(); - this.state = 320; + this.state = 364; this.match(QuixosCapabilityParser.ID); - this.state = 321; + this.state = 365; this.stringLiteral(); - this.state = 322; + this.state = 366; this.match(QuixosCapabilityParser.COLON); - this.state = 323; + this.state = 367; this.valueType(); - this.state = 324; + this.state = 368; this.match(QuixosCapabilityParser.ARROW); - this.state = 325; + this.state = 369; this.valueType(); - this.state = 327; + this.state = 371; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 39) { + if (_la === 41) { { - this.state = 326; + this.state = 370; this.dependencyBlock(); } } - this.state = 329; + this.state = 373; this.match(QuixosCapabilityParser.SEMI); } } @@ -1142,38 +1308,38 @@ export class QuixosCapabilityParser extends antlr.Parser { } public packageConstructorExport(): PackageConstructorExportContext { let localContext = new PackageConstructorExportContext(this.context, this.state); - this.enterRule(localContext, 34, QuixosCapabilityParser.RULE_packageConstructorExport); + this.enterRule(localContext, 40, QuixosCapabilityParser.RULE_packageConstructorExport); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 331; + this.state = 375; this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 332; + this.state = 376; this.identifier(); - this.state = 333; + this.state = 377; this.match(QuixosCapabilityParser.ID); - this.state = 334; + this.state = 378; this.stringLiteral(); - this.state = 335; + this.state = 379; this.match(QuixosCapabilityParser.CONSTRUCTS); - this.state = 336; + this.state = 380; this.identifier(); - this.state = 337; + this.state = 381; this.match(QuixosCapabilityParser.COLON); - this.state = 338; + this.state = 382; this.valueType(); - this.state = 340; + this.state = 384; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 39) { + if (_la === 41) { { - this.state = 339; + this.state = 383; this.dependencyBlock(); } } - this.state = 342; + this.state = 386; this.match(QuixosCapabilityParser.SEMI); } } @@ -1192,13 +1358,13 @@ export class QuixosCapabilityParser extends antlr.Parser { } public eventClause(): EventClauseContext { let localContext = new EventClauseContext(this.context, this.state); - this.enterRule(localContext, 36, QuixosCapabilityParser.RULE_eventClause); + this.enterRule(localContext, 42, QuixosCapabilityParser.RULE_eventClause); try { this.enterOuterAlt(localContext, 1); { - this.state = 344; + this.state = 388; this.match(QuixosCapabilityParser.EMITS); - this.state = 345; + this.state = 389; this.valueType(); } } @@ -1217,14 +1383,14 @@ export class QuixosCapabilityParser extends antlr.Parser { } public operationMode(): OperationModeContext { let localContext = new OperationModeContext(this.context, this.state); - this.enterRule(localContext, 38, QuixosCapabilityParser.RULE_operationMode); + this.enterRule(localContext, 44, QuixosCapabilityParser.RULE_operationMode); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 347; + this.state = 391; _la = this.tokenStream.LA(1); - if(!(((((_la - 51)) & ~0x1F) === 0 && ((1 << (_la - 51)) & 31) !== 0))) { + if(!(((((_la - 53)) & ~0x1F) === 0 && ((1 << (_la - 53)) & 31) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -1248,46 +1414,46 @@ export class QuixosCapabilityParser extends antlr.Parser { } public receiverRequirement(): ReceiverRequirementContext { let localContext = new ReceiverRequirementContext(this.context, this.state); - this.enterRule(localContext, 40, QuixosCapabilityParser.RULE_receiverRequirement); + this.enterRule(localContext, 46, QuixosCapabilityParser.RULE_receiverRequirement); let _la: number; try { - this.state = 358; + this.state = 402; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.ANY: this.enterOuterAlt(localContext, 1); { - this.state = 349; + this.state = 393; this.match(QuixosCapabilityParser.ANY); } break; case QuixosCapabilityParser.ATOM: this.enterOuterAlt(localContext, 2); { - this.state = 350; + this.state = 394; this.match(QuixosCapabilityParser.ATOM); - this.state = 351; + this.state = 395; this.identifier(); } break; case QuixosCapabilityParser.INTERFACES: this.enterOuterAlt(localContext, 3); { - this.state = 352; + this.state = 396; this.match(QuixosCapabilityParser.INTERFACES); - this.state = 353; + this.state = 397; this.match(QuixosCapabilityParser.LBRACK); - this.state = 355; + this.state = 399; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 30 || _la === 96) { + if (_la === 32 || _la === 98) { { - this.state = 354; + this.state = 398; this.identifierList(); } } - this.state = 357; + this.state = 401; this.match(QuixosCapabilityParser.RBRACK); } break; @@ -1310,26 +1476,26 @@ export class QuixosCapabilityParser extends antlr.Parser { } public identifierList(): IdentifierListContext { let localContext = new IdentifierListContext(this.context, this.state); - this.enterRule(localContext, 42, QuixosCapabilityParser.RULE_identifierList); + this.enterRule(localContext, 48, QuixosCapabilityParser.RULE_identifierList); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 360; + this.state = 404; this.identifier(); - this.state = 365; + this.state = 409; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 84) { + while (_la === 86) { { { - this.state = 361; + this.state = 405; this.match(QuixosCapabilityParser.COMMA); - this.state = 362; + this.state = 406; this.identifier(); } } - this.state = 367; + this.state = 411; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } @@ -1350,30 +1516,30 @@ export class QuixosCapabilityParser extends antlr.Parser { } public dependencyBlock(): DependencyBlockContext { let localContext = new DependencyBlockContext(this.context, this.state); - this.enterRule(localContext, 44, QuixosCapabilityParser.RULE_dependencyBlock); + this.enterRule(localContext, 50, QuixosCapabilityParser.RULE_dependencyBlock); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 368; + this.state = 412; this.match(QuixosCapabilityParser.REQUIRES); - this.state = 369; + this.state = 413; this.match(QuixosCapabilityParser.LBRACE); - this.state = 373; + this.state = 417; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 787464) !== 0)) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 3149856) !== 0)) { { { - this.state = 370; + this.state = 414; this.dependencyPort(); } } - this.state = 375; + this.state = 419; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 376; + this.state = 420; this.match(QuixosCapabilityParser.RBRACE); } } @@ -1392,90 +1558,90 @@ export class QuixosCapabilityParser extends antlr.Parser { } public dependencyPort(): DependencyPortContext { let localContext = new DependencyPortContext(this.context, this.state); - this.enterRule(localContext, 46, QuixosCapabilityParser.RULE_dependencyPort); + this.enterRule(localContext, 52, QuixosCapabilityParser.RULE_dependencyPort); try { - this.state = 413; + this.state = 457; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.STATE: this.enterOuterAlt(localContext, 1); { - this.state = 378; + this.state = 422; this.match(QuixosCapabilityParser.STATE); - this.state = 379; + this.state = 423; this.identifier(); - this.state = 380; + this.state = 424; this.match(QuixosCapabilityParser.ID); - this.state = 381; + this.state = 425; this.stringLiteral(); - this.state = 382; + this.state = 426; this.match(QuixosCapabilityParser.COLON); - this.state = 383; + this.state = 427; this.valueType(); - this.state = 384; + this.state = 428; this.primitiveList(); - this.state = 385; + this.state = 429; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.EDGE: this.enterOuterAlt(localContext, 2); { - this.state = 387; + this.state = 431; this.match(QuixosCapabilityParser.EDGE); - this.state = 388; + this.state = 432; this.identifier(); - this.state = 389; + this.state = 433; this.match(QuixosCapabilityParser.ID); - this.state = 390; + this.state = 434; this.stringLiteral(); - this.state = 391; + this.state = 435; this.match(QuixosCapabilityParser.COLON); - this.state = 392; + this.state = 436; this.cardinality(); - this.state = 393; + this.state = 437; this.targetConstraint(); - this.state = 394; + this.state = 438; this.primitiveList(); - this.state = 395; + this.state = 439; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.INTERFACE: this.enterOuterAlt(localContext, 3); { - this.state = 397; + this.state = 441; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 398; + this.state = 442; this.identifier(); - this.state = 399; + this.state = 443; this.match(QuixosCapabilityParser.ID); - this.state = 400; + this.state = 444; this.stringLiteral(); - this.state = 401; + this.state = 445; this.match(QuixosCapabilityParser.COLON); - this.state = 402; + this.state = 446; this.identifier(); - this.state = 403; + this.state = 447; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.CONSTRUCTOR: this.enterOuterAlt(localContext, 4); { - this.state = 405; + this.state = 449; this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 406; + this.state = 450; this.identifier(); - this.state = 407; + this.state = 451; this.match(QuixosCapabilityParser.ID); - this.state = 408; + this.state = 452; this.stringLiteral(); - this.state = 409; + this.state = 453; this.match(QuixosCapabilityParser.COLON); - this.state = 410; + this.state = 454; this.identifier(); - this.state = 411; + this.state = 455; this.match(QuixosCapabilityParser.SEMI); } break; @@ -1498,32 +1664,32 @@ export class QuixosCapabilityParser extends antlr.Parser { } public primitiveList(): PrimitiveListContext { let localContext = new PrimitiveListContext(this.context, this.state); - this.enterRule(localContext, 48, QuixosCapabilityParser.RULE_primitiveList); + this.enterRule(localContext, 54, QuixosCapabilityParser.RULE_primitiveList); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 415; + this.state = 459; this.match(QuixosCapabilityParser.LBRACK); - this.state = 416; + this.state = 460; this.primitive(); - this.state = 421; + this.state = 465; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 84) { + while (_la === 86) { { { - this.state = 417; + this.state = 461; this.match(QuixosCapabilityParser.COMMA); - this.state = 418; + this.state = 462; this.primitive(); } } - this.state = 423; + this.state = 467; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 424; + this.state = 468; this.match(QuixosCapabilityParser.RBRACK); } } @@ -1542,14 +1708,14 @@ export class QuixosCapabilityParser extends antlr.Parser { } public primitive(): PrimitiveContext { let localContext = new PrimitiveContext(this.context, this.state); - this.enterRule(localContext, 50, QuixosCapabilityParser.RULE_primitive); + this.enterRule(localContext, 56, QuixosCapabilityParser.RULE_primitive); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 426; + this.state = 470; _la = this.tokenStream.LA(1); - if(!(((((_la - 46)) & ~0x1F) === 0 && ((1 << (_la - 46)) & 223) !== 0))) { + if(!(((((_la - 48)) & ~0x1F) === 0 && ((1 << (_la - 48)) & 223) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -1573,13 +1739,13 @@ export class QuixosCapabilityParser extends antlr.Parser { } public sharedAttachmentDecl(): SharedAttachmentDeclContext { let localContext = new SharedAttachmentDeclContext(this.context, this.state); - this.enterRule(localContext, 52, QuixosCapabilityParser.RULE_sharedAttachmentDecl); + this.enterRule(localContext, 58, QuixosCapabilityParser.RULE_sharedAttachmentDecl); try { this.enterOuterAlt(localContext, 1); { - this.state = 428; + this.state = 472; this.match(QuixosCapabilityParser.SHARED); - this.state = 429; + this.state = 473; this.attachmentDecl(); } } @@ -1598,22 +1764,22 @@ export class QuixosCapabilityParser extends antlr.Parser { } public attachmentDecl(): AttachmentDeclContext { let localContext = new AttachmentDeclContext(this.context, this.state); - this.enterRule(localContext, 54, QuixosCapabilityParser.RULE_attachmentDecl); + this.enterRule(localContext, 60, QuixosCapabilityParser.RULE_attachmentDecl); try { - this.state = 433; + this.state = 477; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.STATE: this.enterOuterAlt(localContext, 1); { - this.state = 431; + this.state = 475; this.stateDecl(); } break; case QuixosCapabilityParser.EDGE: this.enterOuterAlt(localContext, 2); { - this.state = 432; + this.state = 476; this.edgeDecl(); } break; @@ -1636,44 +1802,44 @@ export class QuixosCapabilityParser extends antlr.Parser { } public stateDecl(): StateDeclContext { let localContext = new StateDeclContext(this.context, this.state); - this.enterRule(localContext, 56, QuixosCapabilityParser.RULE_stateDecl); + this.enterRule(localContext, 62, QuixosCapabilityParser.RULE_stateDecl); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 435; + this.state = 479; this.match(QuixosCapabilityParser.STATE); - this.state = 436; + this.state = 480; this.identifier(); - this.state = 437; + this.state = 481; this.match(QuixosCapabilityParser.ID); - this.state = 438; + this.state = 482; this.stringLiteral(); - this.state = 439; + this.state = 483; this.match(QuixosCapabilityParser.ON); - this.state = 440; + this.state = 484; this.identifier(); - this.state = 441; + this.state = 485; this.match(QuixosCapabilityParser.COLON); - this.state = 442; + this.state = 486; this.valueType(); - this.state = 443; + this.state = 487; this.match(QuixosCapabilityParser.POLICY); - this.state = 444; + this.state = 488; this.storagePolicy(); - this.state = 447; + this.state = 491; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 29) { + if (_la === 31) { { - this.state = 445; + this.state = 489; this.match(QuixosCapabilityParser.DEFAULT); - this.state = 446; + this.state = 490; this.jsonLiteral(); } } - this.state = 449; + this.state = 493; this.match(QuixosCapabilityParser.SEMI); } } @@ -1692,28 +1858,28 @@ export class QuixosCapabilityParser extends antlr.Parser { } public storagePolicy(): StoragePolicyContext { let localContext = new StoragePolicyContext(this.context, this.state); - this.enterRule(localContext, 58, QuixosCapabilityParser.RULE_storagePolicy); + this.enterRule(localContext, 64, QuixosCapabilityParser.RULE_storagePolicy); try { - this.state = 457; + this.state = 501; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.OPTIMISTIC_REGISTER: this.enterOuterAlt(localContext, 1); { - this.state = 451; + this.state = 495; this.match(QuixosCapabilityParser.OPTIMISTIC_REGISTER); } break; case QuixosCapabilityParser.CRDT: this.enterOuterAlt(localContext, 2); { - this.state = 452; + this.state = 496; this.match(QuixosCapabilityParser.CRDT); - this.state = 453; + this.state = 497; this.match(QuixosCapabilityParser.LPAREN); - this.state = 454; + this.state = 498; this.valueType(); - this.state = 455; + this.state = 499; this.match(QuixosCapabilityParser.RPAREN); } break; @@ -1736,25 +1902,25 @@ export class QuixosCapabilityParser extends antlr.Parser { } public edgeDecl(): EdgeDeclContext { let localContext = new EdgeDeclContext(this.context, this.state); - this.enterRule(localContext, 60, QuixosCapabilityParser.RULE_edgeDecl); + this.enterRule(localContext, 66, QuixosCapabilityParser.RULE_edgeDecl); try { this.enterOuterAlt(localContext, 1); { - this.state = 459; + this.state = 503; this.match(QuixosCapabilityParser.EDGE); - this.state = 460; + this.state = 504; this.identifier(); - this.state = 461; + this.state = 505; this.match(QuixosCapabilityParser.ID); - this.state = 462; + this.state = 506; this.stringLiteral(); - this.state = 463; + this.state = 507; this.match(QuixosCapabilityParser.LBRACE); - this.state = 464; + this.state = 508; this.edgeEndpoint(); - this.state = 465; + this.state = 509; this.edgeEndpoint(); - this.state = 466; + this.state = 510; this.match(QuixosCapabilityParser.RBRACE); } } @@ -1773,34 +1939,34 @@ export class QuixosCapabilityParser extends antlr.Parser { } public edgeEndpoint(): EdgeEndpointContext { let localContext = new EdgeEndpointContext(this.context, this.state); - this.enterRule(localContext, 62, QuixosCapabilityParser.RULE_edgeEndpoint); + this.enterRule(localContext, 68, QuixosCapabilityParser.RULE_edgeEndpoint); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 468; + this.state = 512; this.targetConstraint(); - this.state = 469; + this.state = 513; this.match(QuixosCapabilityParser.PROJECTION); - this.state = 470; + this.state = 514; this.identifier(); - this.state = 471; + this.state = 515; this.match(QuixosCapabilityParser.ID); - this.state = 472; + this.state = 516; this.stringLiteral(); - this.state = 473; + this.state = 517; this.cardinality(); - this.state = 475; + this.state = 519; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 62) { + if (_la === 64) { { - this.state = 474; + this.state = 518; this.match(QuixosCapabilityParser.ORDERED); } } - this.state = 477; + this.state = 521; this.match(QuixosCapabilityParser.SEMI); } } @@ -1819,36 +1985,36 @@ export class QuixosCapabilityParser extends antlr.Parser { } public conformanceDecl(): ConformanceDeclContext { let localContext = new ConformanceDeclContext(this.context, this.state); - this.enterRule(localContext, 64, QuixosCapabilityParser.RULE_conformanceDecl); + this.enterRule(localContext, 70, QuixosCapabilityParser.RULE_conformanceDecl); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 479; + this.state = 523; this.match(QuixosCapabilityParser.CONFORM); - this.state = 480; + this.state = 524; this.identifier(); - this.state = 481; + this.state = 525; this.match(QuixosCapabilityParser.AS); - this.state = 482; + this.state = 526; this.identifier(); - this.state = 483; + this.state = 527; this.match(QuixosCapabilityParser.LBRACE); - this.state = 487; + this.state = 531; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 16859136) !== 0)) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 67436544) !== 0)) { { { - this.state = 484; + this.state = 528; this.conformanceItem(); } } - this.state = 489; + this.state = 533; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 490; + this.state = 534; this.match(QuixosCapabilityParser.RBRACE); } } @@ -1867,31 +2033,31 @@ export class QuixosCapabilityParser extends antlr.Parser { } public conformanceItem(): ConformanceItemContext { let localContext = new ConformanceItemContext(this.context, this.state); - this.enterRule(localContext, 66, QuixosCapabilityParser.RULE_conformanceItem); + this.enterRule(localContext, 72, QuixosCapabilityParser.RULE_conformanceItem); try { - this.state = 496; + this.state = 540; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.PRIVATE: this.enterOuterAlt(localContext, 1); { - this.state = 492; + this.state = 536; this.match(QuixosCapabilityParser.PRIVATE); - this.state = 493; + this.state = 537; this.attachmentDecl(); } break; case QuixosCapabilityParser.BIND: this.enterOuterAlt(localContext, 2); { - this.state = 494; + this.state = 538; this.operationBindingDecl(); } break; case QuixosCapabilityParser.MATERIALIZE: this.enterOuterAlt(localContext, 3); { - this.state = 495; + this.state = 539; this.relationshipMaterializationDecl(); } break; @@ -1914,35 +2080,35 @@ export class QuixosCapabilityParser extends antlr.Parser { } public relationshipMaterializationDecl(): RelationshipMaterializationDeclContext { let localContext = new RelationshipMaterializationDeclContext(this.context, this.state); - this.enterRule(localContext, 68, QuixosCapabilityParser.RULE_relationshipMaterializationDecl); + this.enterRule(localContext, 74, QuixosCapabilityParser.RULE_relationshipMaterializationDecl); try { this.enterOuterAlt(localContext, 1); { - this.state = 498; + this.state = 542; this.match(QuixosCapabilityParser.MATERIALIZE); - this.state = 499; + this.state = 543; this.identifier(); - this.state = 500; + this.state = 544; this.match(QuixosCapabilityParser.IF); - this.state = 501; + this.state = 545; this.match(QuixosCapabilityParser.ABSENT); - this.state = 502; + this.state = 546; this.match(QuixosCapabilityParser.USING); - this.state = 503; + this.state = 547; this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 504; + this.state = 548; this.identifier(); - this.state = 505; + this.state = 549; this.match(QuixosCapabilityParser.VIA); - this.state = 506; + this.state = 550; this.match(QuixosCapabilityParser.EDGE); - this.state = 507; + this.state = 551; this.identifier(); - this.state = 508; + this.state = 552; this.match(QuixosCapabilityParser.DOT); - this.state = 509; + this.state = 553; this.identifier(); - this.state = 510; + this.state = 554; this.match(QuixosCapabilityParser.SEMI); } } @@ -1961,19 +2127,19 @@ export class QuixosCapabilityParser extends antlr.Parser { } public operationBindingDecl(): OperationBindingDeclContext { let localContext = new OperationBindingDeclContext(this.context, this.state); - this.enterRule(localContext, 70, QuixosCapabilityParser.RULE_operationBindingDecl); + this.enterRule(localContext, 76, QuixosCapabilityParser.RULE_operationBindingDecl); try { this.enterOuterAlt(localContext, 1); { - this.state = 512; + this.state = 556; this.match(QuixosCapabilityParser.BIND); - this.state = 513; + this.state = 557; this.memberOperationRef(); - this.state = 514; + this.state = 558; this.match(QuixosCapabilityParser.TO); - this.state = 515; + this.state = 559; this.operationProvider(); - this.state = 516; + this.state = 560; this.match(QuixosCapabilityParser.SEMI); } } @@ -1992,15 +2158,15 @@ export class QuixosCapabilityParser extends antlr.Parser { } public memberOperationRef(): MemberOperationRefContext { let localContext = new MemberOperationRefContext(this.context, this.state); - this.enterRule(localContext, 72, QuixosCapabilityParser.RULE_memberOperationRef); + this.enterRule(localContext, 78, QuixosCapabilityParser.RULE_memberOperationRef); try { this.enterOuterAlt(localContext, 1); { - this.state = 518; + this.state = 562; this.identifier(); - this.state = 519; + this.state = 563; this.match(QuixosCapabilityParser.DOT); - this.state = 520; + this.state = 564; this.operationName(); } } @@ -2019,86 +2185,86 @@ export class QuixosCapabilityParser extends antlr.Parser { } public operationName(): OperationNameContext { let localContext = new OperationNameContext(this.context, this.state); - this.enterRule(localContext, 74, QuixosCapabilityParser.RULE_operationName); + this.enterRule(localContext, 80, QuixosCapabilityParser.RULE_operationName); try { - this.state = 533; + this.state = 577; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.SOURCE: case QuixosCapabilityParser.IDENTIFIER: this.enterOuterAlt(localContext, 1); { - this.state = 522; + this.state = 566; this.identifier(); } break; case QuixosCapabilityParser.CALL: this.enterOuterAlt(localContext, 2); { - this.state = 523; + this.state = 567; this.match(QuixosCapabilityParser.CALL); } break; case QuixosCapabilityParser.GET: this.enterOuterAlt(localContext, 3); { - this.state = 524; + this.state = 568; this.match(QuixosCapabilityParser.GET); } break; case QuixosCapabilityParser.SET: this.enterOuterAlt(localContext, 4); { - this.state = 525; + this.state = 569; this.match(QuixosCapabilityParser.SET); } break; case QuixosCapabilityParser.RESOLVE: this.enterOuterAlt(localContext, 5); { - this.state = 526; + this.state = 570; this.match(QuixosCapabilityParser.RESOLVE); } break; case QuixosCapabilityParser.CONNECT: this.enterOuterAlt(localContext, 6); { - this.state = 527; + this.state = 571; this.match(QuixosCapabilityParser.CONNECT); } break; case QuixosCapabilityParser.DISCONNECT: this.enterOuterAlt(localContext, 7); { - this.state = 528; + this.state = 572; this.match(QuixosCapabilityParser.DISCONNECT); } break; case QuixosCapabilityParser.WATCH_START: this.enterOuterAlt(localContext, 8); { - this.state = 529; + this.state = 573; this.match(QuixosCapabilityParser.WATCH_START); } break; case QuixosCapabilityParser.WATCH_STOP: this.enterOuterAlt(localContext, 9); { - this.state = 530; + this.state = 574; this.match(QuixosCapabilityParser.WATCH_STOP); } break; case QuixosCapabilityParser.SUBSCRIBE: this.enterOuterAlt(localContext, 10); { - this.state = 531; + this.state = 575; this.match(QuixosCapabilityParser.SUBSCRIBE); } break; case QuixosCapabilityParser.UNSUBSCRIBE: this.enterOuterAlt(localContext, 11); { - this.state = 532; + this.state = 576; this.match(QuixosCapabilityParser.UNSUBSCRIBE); } break; @@ -2121,59 +2287,59 @@ export class QuixosCapabilityParser extends antlr.Parser { } public operationProvider(): OperationProviderContext { let localContext = new OperationProviderContext(this.context, this.state); - this.enterRule(localContext, 76, QuixosCapabilityParser.RULE_operationProvider); + this.enterRule(localContext, 82, QuixosCapabilityParser.RULE_operationProvider); let _la: number; try { - this.state = 554; + this.state = 598; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.STATE: this.enterOuterAlt(localContext, 1); { - this.state = 535; + this.state = 579; this.match(QuixosCapabilityParser.STATE); - this.state = 536; + this.state = 580; this.identifier(); - this.state = 537; + this.state = 581; this.match(QuixosCapabilityParser.DOT); - this.state = 538; + this.state = 582; this.statePrimitive(); } break; case QuixosCapabilityParser.EDGE: this.enterOuterAlt(localContext, 2); { - this.state = 540; + this.state = 584; this.match(QuixosCapabilityParser.EDGE); - this.state = 541; + this.state = 585; this.identifier(); - this.state = 542; + this.state = 586; this.match(QuixosCapabilityParser.DOT); - this.state = 543; + this.state = 587; this.identifier(); - this.state = 544; + this.state = 588; this.match(QuixosCapabilityParser.DOT); - this.state = 545; + this.state = 589; this.edgePrimitive(); } break; case QuixosCapabilityParser.PACKAGE: this.enterOuterAlt(localContext, 3); { - this.state = 547; + this.state = 591; this.match(QuixosCapabilityParser.PACKAGE); - this.state = 548; + this.state = 592; this.identifier(); - this.state = 549; + this.state = 593; this.match(QuixosCapabilityParser.DOT); - this.state = 550; + this.state = 594; this.identifier(); - this.state = 552; + this.state = 596; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 21) { + if (_la === 23) { { - this.state = 551; + this.state = 595; this.dependencyBindingBlock(); } } @@ -2199,14 +2365,14 @@ export class QuixosCapabilityParser extends antlr.Parser { } public statePrimitive(): StatePrimitiveContext { let localContext = new StatePrimitiveContext(this.context, this.state); - this.enterRule(localContext, 78, QuixosCapabilityParser.RULE_statePrimitive); + this.enterRule(localContext, 84, QuixosCapabilityParser.RULE_statePrimitive); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 556; + this.state = 600; _la = this.tokenStream.LA(1); - if(!(((((_la - 46)) & ~0x1F) === 0 && ((1 << (_la - 46)) & 195) !== 0))) { + if(!(((((_la - 48)) & ~0x1F) === 0 && ((1 << (_la - 48)) & 195) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -2230,14 +2396,14 @@ export class QuixosCapabilityParser extends antlr.Parser { } public edgePrimitive(): EdgePrimitiveContext { let localContext = new EdgePrimitiveContext(this.context, this.state); - this.enterRule(localContext, 80, QuixosCapabilityParser.RULE_edgePrimitive); + this.enterRule(localContext, 86, QuixosCapabilityParser.RULE_edgePrimitive); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 558; + this.state = 602; _la = this.tokenStream.LA(1); - if(!(((((_la - 48)) & ~0x1F) === 0 && ((1 << (_la - 48)) & 55) !== 0))) { + if(!(((((_la - 50)) & ~0x1F) === 0 && ((1 << (_la - 50)) & 55) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -2261,30 +2427,30 @@ export class QuixosCapabilityParser extends antlr.Parser { } public dependencyBindingBlock(): DependencyBindingBlockContext { let localContext = new DependencyBindingBlockContext(this.context, this.state); - this.enterRule(localContext, 82, QuixosCapabilityParser.RULE_dependencyBindingBlock); + this.enterRule(localContext, 88, QuixosCapabilityParser.RULE_dependencyBindingBlock); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 560; + this.state = 604; this.match(QuixosCapabilityParser.WITH); - this.state = 561; + this.state = 605; this.match(QuixosCapabilityParser.LBRACE); - this.state = 565; + this.state = 609; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 30 || _la === 96) { + while (_la === 32 || _la === 98) { { { - this.state = 562; + this.state = 606; this.dependencyBinding(); } } - this.state = 567; + this.state = 611; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 568; + this.state = 612; this.match(QuixosCapabilityParser.RBRACE); } } @@ -2303,109 +2469,127 @@ export class QuixosCapabilityParser extends antlr.Parser { } public dependencyBinding(): DependencyBindingContext { let localContext = new DependencyBindingContext(this.context, this.state); - this.enterRule(localContext, 84, QuixosCapabilityParser.RULE_dependencyBinding); + this.enterRule(localContext, 90, QuixosCapabilityParser.RULE_dependencyBinding); let _la: number; try { - this.state = 612; + this.state = 664; this.errorHandler.sync(this); - switch (this.interpreter.adaptivePredict(this.tokenStream, 35, this.context) ) { + switch (this.interpreter.adaptivePredict(this.tokenStream, 41, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 570; + this.state = 614; this.identifier(); - this.state = 571; + this.state = 615; this.match(QuixosCapabilityParser.TO); - this.state = 572; + this.state = 616; this.match(QuixosCapabilityParser.STATE); - this.state = 573; + this.state = 617; this.identifier(); - this.state = 580; + this.state = 624; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 23) { + if (_la === 25) { { - this.state = 574; + this.state = 618; this.match(QuixosCapabilityParser.VIA); - this.state = 575; + this.state = 619; this.match(QuixosCapabilityParser.EDGE); - this.state = 576; + this.state = 620; this.identifier(); - this.state = 577; + this.state = 621; this.match(QuixosCapabilityParser.DOT); - this.state = 578; + this.state = 622; this.identifier(); } } - this.state = 582; + this.state = 626; this.match(QuixosCapabilityParser.SEMI); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 584; + this.state = 628; this.identifier(); - this.state = 585; + this.state = 629; this.match(QuixosCapabilityParser.TO); - this.state = 586; + this.state = 630; this.match(QuixosCapabilityParser.EDGE); - this.state = 587; + this.state = 631; this.identifier(); - this.state = 588; + this.state = 632; this.match(QuixosCapabilityParser.DOT); - this.state = 589; + this.state = 633; this.identifier(); - this.state = 596; + this.state = 640; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 23) { + if (_la === 25) { { - this.state = 590; + this.state = 634; this.match(QuixosCapabilityParser.VIA); - this.state = 591; + this.state = 635; this.match(QuixosCapabilityParser.EDGE); - this.state = 592; + this.state = 636; this.identifier(); - this.state = 593; + this.state = 637; this.match(QuixosCapabilityParser.DOT); - this.state = 594; + this.state = 638; this.identifier(); } } - this.state = 598; + this.state = 642; this.match(QuixosCapabilityParser.SEMI); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 600; + this.state = 644; this.identifier(); - this.state = 601; + this.state = 645; this.match(QuixosCapabilityParser.TO); - this.state = 602; + this.state = 646; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 603; + this.state = 647; this.identifier(); - this.state = 604; + this.state = 654; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 25) { + { + this.state = 648; + this.match(QuixosCapabilityParser.VIA); + this.state = 649; + this.match(QuixosCapabilityParser.EDGE); + this.state = 650; + this.identifier(); + this.state = 651; + this.match(QuixosCapabilityParser.DOT); + this.state = 652; + this.identifier(); + } + } + + this.state = 656; this.match(QuixosCapabilityParser.SEMI); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 606; + this.state = 658; this.identifier(); - this.state = 607; + this.state = 659; this.match(QuixosCapabilityParser.TO); - this.state = 608; + this.state = 660; this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 609; + this.state = 661; this.identifier(); - this.state = 610; + this.state = 662; this.match(QuixosCapabilityParser.SEMI); } break; @@ -2426,34 +2610,34 @@ export class QuixosCapabilityParser extends antlr.Parser { } public constructorBindingDecl(): ConstructorBindingDeclContext { let localContext = new ConstructorBindingDeclContext(this.context, this.state); - this.enterRule(localContext, 86, QuixosCapabilityParser.RULE_constructorBindingDecl); + this.enterRule(localContext, 92, QuixosCapabilityParser.RULE_constructorBindingDecl); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 614; + this.state = 666; this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 615; + this.state = 667; this.identifier(); - this.state = 616; + this.state = 668; this.match(QuixosCapabilityParser.TO); - this.state = 617; + this.state = 669; this.identifier(); - this.state = 618; + this.state = 670; this.match(QuixosCapabilityParser.DOT); - this.state = 619; + this.state = 671; this.identifier(); - this.state = 621; + this.state = 673; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 21) { + if (_la === 23) { { - this.state = 620; + this.state = 672; this.dependencyBindingBlock(); } } - this.state = 623; + this.state = 675; this.match(QuixosCapabilityParser.SEMI); } } @@ -2472,9 +2656,9 @@ export class QuixosCapabilityParser extends antlr.Parser { } public valueType(): ValueTypeContext { let localContext = new ValueTypeContext(this.context, this.state); - this.enterRule(localContext, 88, QuixosCapabilityParser.RULE_valueType); + this.enterRule(localContext, 94, QuixosCapabilityParser.RULE_valueType); try { - this.state = 650; + this.state = 702; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.BOOL: @@ -2487,82 +2671,82 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.UINT64: this.enterOuterAlt(localContext, 1); { - this.state = 625; + this.state = 677; this.scalarType(); } break; case QuixosCapabilityParser.UNIT: this.enterOuterAlt(localContext, 2); { - this.state = 626; + this.state = 678; this.match(QuixosCapabilityParser.UNIT); } break; case QuixosCapabilityParser.WATCH_HANDLE: this.enterOuterAlt(localContext, 3); { - this.state = 627; + this.state = 679; this.match(QuixosCapabilityParser.WATCH_HANDLE); } break; case QuixosCapabilityParser.MESSAGE: this.enterOuterAlt(localContext, 4); { - this.state = 628; + this.state = 680; this.match(QuixosCapabilityParser.MESSAGE); - this.state = 629; + this.state = 681; this.stringLiteral(); } break; case QuixosCapabilityParser.ATOM_REF: this.enterOuterAlt(localContext, 5); { - this.state = 630; + this.state = 682; this.match(QuixosCapabilityParser.ATOM_REF); - this.state = 631; + this.state = 683; this.match(QuixosCapabilityParser.LT); - this.state = 632; + this.state = 684; this.identifier(); - this.state = 633; + this.state = 685; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.INTERFACE_REF: this.enterOuterAlt(localContext, 6); { - this.state = 635; + this.state = 687; this.match(QuixosCapabilityParser.INTERFACE_REF); - this.state = 636; + this.state = 688; this.match(QuixosCapabilityParser.LT); - this.state = 637; + this.state = 689; this.identifier(); - this.state = 638; + this.state = 690; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.OPTIONAL: this.enterOuterAlt(localContext, 7); { - this.state = 640; + this.state = 692; this.match(QuixosCapabilityParser.OPTIONAL); - this.state = 641; + this.state = 693; this.match(QuixosCapabilityParser.LT); - this.state = 642; + this.state = 694; this.valueType(); - this.state = 643; + this.state = 695; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.LIST: this.enterOuterAlt(localContext, 8); { - this.state = 645; + this.state = 697; this.match(QuixosCapabilityParser.LIST); - this.state = 646; + this.state = 698; this.match(QuixosCapabilityParser.LT); - this.state = 647; + this.state = 699; this.valueType(); - this.state = 648; + this.state = 700; this.match(QuixosCapabilityParser.GT); } break; @@ -2585,14 +2769,14 @@ export class QuixosCapabilityParser extends antlr.Parser { } public scalarType(): ScalarTypeContext { let localContext = new ScalarTypeContext(this.context, this.state); - this.enterRule(localContext, 90, QuixosCapabilityParser.RULE_scalarType); + this.enterRule(localContext, 96, QuixosCapabilityParser.RULE_scalarType); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 652; + this.state = 704; _la = this.tokenStream.LA(1); - if(!(((((_la - 70)) & ~0x1F) === 0 && ((1 << (_la - 70)) & 255) !== 0))) { + if(!(((((_la - 72)) & ~0x1F) === 0 && ((1 << (_la - 72)) & 255) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -2616,14 +2800,14 @@ export class QuixosCapabilityParser extends antlr.Parser { } public cardinality(): CardinalityContext { let localContext = new CardinalityContext(this.context, this.state); - this.enterRule(localContext, 92, QuixosCapabilityParser.RULE_cardinality); + this.enterRule(localContext, 98, QuixosCapabilityParser.RULE_cardinality); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 654; + this.state = 706; _la = this.tokenStream.LA(1); - if(!(((((_la - 58)) & ~0x1F) === 0 && ((1 << (_la - 58)) & 15) !== 0))) { + if(!(((((_la - 60)) & ~0x1F) === 0 && ((1 << (_la - 60)) & 15) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -2647,64 +2831,64 @@ export class QuixosCapabilityParser extends antlr.Parser { } public jsonLiteral(): JsonLiteralContext { let localContext = new JsonLiteralContext(this.context, this.state); - this.enterRule(localContext, 94, QuixosCapabilityParser.RULE_jsonLiteral); + this.enterRule(localContext, 100, QuixosCapabilityParser.RULE_jsonLiteral); try { - this.state = 664; + this.state = 716; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.STRING_LITERAL: this.enterOuterAlt(localContext, 1); { - this.state = 656; + this.state = 708; this.stringLiteral(); } break; case QuixosCapabilityParser.INTEGER: this.enterOuterAlt(localContext, 2); { - this.state = 657; + this.state = 709; this.match(QuixosCapabilityParser.INTEGER); } break; case QuixosCapabilityParser.JSON_NUMBER: this.enterOuterAlt(localContext, 3); { - this.state = 658; + this.state = 710; this.match(QuixosCapabilityParser.JSON_NUMBER); } break; case QuixosCapabilityParser.TRUE: this.enterOuterAlt(localContext, 4); { - this.state = 659; + this.state = 711; this.match(QuixosCapabilityParser.TRUE); } break; case QuixosCapabilityParser.FALSE: this.enterOuterAlt(localContext, 5); { - this.state = 660; + this.state = 712; this.match(QuixosCapabilityParser.FALSE); } break; case QuixosCapabilityParser.NULL: this.enterOuterAlt(localContext, 6); { - this.state = 661; + this.state = 713; this.match(QuixosCapabilityParser.NULL); } break; case QuixosCapabilityParser.LBRACE: this.enterOuterAlt(localContext, 7); { - this.state = 662; + this.state = 714; this.jsonObject(); } break; case QuixosCapabilityParser.LBRACK: this.enterOuterAlt(localContext, 8); { - this.state = 663; + this.state = 715; this.jsonArray(); } break; @@ -2727,40 +2911,40 @@ export class QuixosCapabilityParser extends antlr.Parser { } public jsonObject(): JsonObjectContext { let localContext = new JsonObjectContext(this.context, this.state); - this.enterRule(localContext, 96, QuixosCapabilityParser.RULE_jsonObject); + this.enterRule(localContext, 102, QuixosCapabilityParser.RULE_jsonObject); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 666; + this.state = 718; this.match(QuixosCapabilityParser.LBRACE); - this.state = 675; + this.state = 727; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 97) { + if (_la === 99) { { - this.state = 667; + this.state = 719; this.jsonMember(); - this.state = 672; + this.state = 724; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 84) { + while (_la === 86) { { { - this.state = 668; + this.state = 720; this.match(QuixosCapabilityParser.COMMA); - this.state = 669; + this.state = 721; this.jsonMember(); } } - this.state = 674; + this.state = 726; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } } } - this.state = 677; + this.state = 729; this.match(QuixosCapabilityParser.RBRACE); } } @@ -2779,15 +2963,15 @@ export class QuixosCapabilityParser extends antlr.Parser { } public jsonMember(): JsonMemberContext { let localContext = new JsonMemberContext(this.context, this.state); - this.enterRule(localContext, 98, QuixosCapabilityParser.RULE_jsonMember); + this.enterRule(localContext, 104, QuixosCapabilityParser.RULE_jsonMember); try { this.enterOuterAlt(localContext, 1); { - this.state = 679; + this.state = 731; this.stringLiteral(); - this.state = 680; + this.state = 732; this.match(QuixosCapabilityParser.COLON); - this.state = 681; + this.state = 733; this.jsonLiteral(); } } @@ -2806,40 +2990,40 @@ export class QuixosCapabilityParser extends antlr.Parser { } public jsonArray(): JsonArrayContext { let localContext = new JsonArrayContext(this.context, this.state); - this.enterRule(localContext, 100, QuixosCapabilityParser.RULE_jsonArray); + this.enterRule(localContext, 106, QuixosCapabilityParser.RULE_jsonArray); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 683; + this.state = 735; this.match(QuixosCapabilityParser.LBRACK); - this.state = 692; + this.state = 744; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (((((_la - 78)) & ~0x1F) === 0 && ((1 << (_la - 78)) & 722183) !== 0)) { + if (((((_la - 80)) & ~0x1F) === 0 && ((1 << (_la - 80)) & 722183) !== 0)) { { - this.state = 684; + this.state = 736; this.jsonLiteral(); - this.state = 689; + this.state = 741; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 84) { + while (_la === 86) { { { - this.state = 685; + this.state = 737; this.match(QuixosCapabilityParser.COMMA); - this.state = 686; + this.state = 738; this.jsonLiteral(); } } - this.state = 691; + this.state = 743; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } } } - this.state = 694; + this.state = 746; this.match(QuixosCapabilityParser.RBRACK); } } @@ -2858,14 +3042,14 @@ export class QuixosCapabilityParser extends antlr.Parser { } public identifier(): IdentifierContext { let localContext = new IdentifierContext(this.context, this.state); - this.enterRule(localContext, 102, QuixosCapabilityParser.RULE_identifier); + this.enterRule(localContext, 108, QuixosCapabilityParser.RULE_identifier); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 696; + this.state = 748; _la = this.tokenStream.LA(1); - if(!(_la === 30 || _la === 96)) { + if(!(_la === 32 || _la === 98)) { this.errorHandler.recoverInline(this); } else { @@ -2889,11 +3073,11 @@ export class QuixosCapabilityParser extends antlr.Parser { } public stringLiteral(): StringLiteralContext { let localContext = new StringLiteralContext(this.context, this.state); - this.enterRule(localContext, 104, QuixosCapabilityParser.RULE_stringLiteral); + this.enterRule(localContext, 110, QuixosCapabilityParser.RULE_stringLiteral); try { this.enterOuterAlt(localContext, 1); { - this.state = 698; + this.state = 750; this.match(QuixosCapabilityParser.STRING_LITERAL); } } @@ -2912,7 +3096,7 @@ export class QuixosCapabilityParser extends antlr.Parser { } public static readonly _serializedATN: number[] = [ - 4,1,100,701,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6, + 4,1,102,753,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6, 7,6,2,7,7,7,2,8,7,8,2,9,7,9,2,10,7,10,2,11,7,11,2,12,7,12,2,13,7, 13,2,14,7,14,2,15,7,15,2,16,7,16,2,17,7,17,2,18,7,18,2,19,7,19,2, 20,7,20,2,21,7,21,2,22,7,22,2,23,7,23,2,24,7,24,2,25,7,25,2,26,7, @@ -2920,249 +3104,268 @@ export class QuixosCapabilityParser extends antlr.Parser { 33,7,33,2,34,7,34,2,35,7,35,2,36,7,36,2,37,7,37,2,38,7,38,2,39,7, 39,2,40,7,40,2,41,7,41,2,42,7,42,2,43,7,43,2,44,7,44,2,45,7,45,2, 46,7,46,2,47,7,47,2,48,7,48,2,49,7,49,2,50,7,50,2,51,7,51,2,52,7, - 52,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,1,120,8, - 1,10,1,12,1,123,9,1,1,1,1,1,1,2,1,2,1,2,1,2,1,2,1,2,3,2,133,8,2, - 1,3,1,3,1,3,1,3,1,3,1,3,3,3,141,8,3,1,3,1,3,1,4,1,4,1,4,1,4,1,4, - 1,4,1,4,1,4,1,4,5,4,154,8,4,10,4,12,4,157,9,4,1,4,1,4,1,5,1,5,1, - 5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,6,1,6,1,6,3,6,174,8,6,1,7,1,7,1, - 7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,8,1,8,1,8,1, - 8,1,8,1,8,1,8,1,8,5,8,199,8,8,10,8,12,8,202,9,8,1,8,1,8,1,9,1,9, - 1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9, - 1,9,3,9,225,8,9,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,3,10,235, - 8,10,1,10,1,10,5,10,239,8,10,10,10,12,10,242,9,10,1,10,1,10,1,11, - 1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11, - 1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,3,11,270,8,11, - 1,12,1,12,1,12,1,12,3,12,276,8,12,1,13,1,13,1,13,1,13,1,13,1,13, - 1,13,1,13,1,13,5,13,287,8,13,10,13,12,13,290,9,13,1,13,1,13,1,14, - 1,14,1,14,3,14,297,8,14,1,15,1,15,1,15,1,15,1,15,1,15,1,15,1,15, - 1,15,1,15,1,15,3,15,310,8,15,1,15,1,15,1,15,3,15,315,8,15,1,15,1, - 15,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,16,3,16,328,8,16,1, - 16,1,16,1,17,1,17,1,17,1,17,1,17,1,17,1,17,1,17,1,17,3,17,341,8, - 17,1,17,1,17,1,18,1,18,1,18,1,19,1,19,1,20,1,20,1,20,1,20,1,20,1, - 20,3,20,356,8,20,1,20,3,20,359,8,20,1,21,1,21,1,21,5,21,364,8,21, - 10,21,12,21,367,9,21,1,22,1,22,1,22,5,22,372,8,22,10,22,12,22,375, - 9,22,1,22,1,22,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23, - 1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23, - 1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,3,23, - 414,8,23,1,24,1,24,1,24,1,24,5,24,420,8,24,10,24,12,24,423,9,24, - 1,24,1,24,1,25,1,25,1,26,1,26,1,26,1,27,1,27,3,27,434,8,27,1,28, - 1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,3,28,448, - 8,28,1,28,1,28,1,29,1,29,1,29,1,29,1,29,1,29,3,29,458,8,29,1,30, - 1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,31,1,31,1,31,1,31,1,31, - 1,31,1,31,3,31,476,8,31,1,31,1,31,1,32,1,32,1,32,1,32,1,32,1,32, - 5,32,486,8,32,10,32,12,32,489,9,32,1,32,1,32,1,33,1,33,1,33,1,33, - 3,33,497,8,33,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34, - 1,34,1,34,1,34,1,34,1,35,1,35,1,35,1,35,1,35,1,35,1,36,1,36,1,36, - 1,36,1,37,1,37,1,37,1,37,1,37,1,37,1,37,1,37,1,37,1,37,1,37,3,37, - 534,8,37,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,38, - 1,38,1,38,1,38,1,38,1,38,1,38,3,38,553,8,38,3,38,555,8,38,1,39,1, - 39,1,40,1,40,1,41,1,41,1,41,5,41,564,8,41,10,41,12,41,567,9,41,1, - 41,1,41,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,3,42,581, - 8,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42, - 1,42,1,42,3,42,597,8,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42, - 1,42,1,42,1,42,1,42,1,42,1,42,3,42,613,8,42,1,43,1,43,1,43,1,43, - 1,43,1,43,1,43,3,43,622,8,43,1,43,1,43,1,44,1,44,1,44,1,44,1,44, - 1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44, - 1,44,1,44,1,44,1,44,1,44,1,44,1,44,3,44,651,8,44,1,45,1,45,1,46, - 1,46,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,3,47,665,8,47,1,48, - 1,48,1,48,1,48,5,48,671,8,48,10,48,12,48,674,9,48,3,48,676,8,48, - 1,48,1,48,1,49,1,49,1,49,1,49,1,50,1,50,1,50,1,50,5,50,688,8,50, - 10,50,12,50,691,9,50,3,50,693,8,50,1,50,1,50,1,51,1,51,1,52,1,52, - 1,52,0,0,53,0,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,0,7,1,0,51,55,2,0,46,50,52, - 53,2,0,46,47,52,53,2,0,48,50,52,53,1,0,70,77,1,0,58,61,2,0,30,30, - 96,96,727,0,106,1,0,0,0,2,109,1,0,0,0,4,132,1,0,0,0,6,134,1,0,0, - 0,8,144,1,0,0,0,10,160,1,0,0,0,12,173,1,0,0,0,14,175,1,0,0,0,16, - 190,1,0,0,0,18,224,1,0,0,0,20,226,1,0,0,0,22,269,1,0,0,0,24,275, - 1,0,0,0,26,277,1,0,0,0,28,296,1,0,0,0,30,298,1,0,0,0,32,318,1,0, - 0,0,34,331,1,0,0,0,36,344,1,0,0,0,38,347,1,0,0,0,40,358,1,0,0,0, - 42,360,1,0,0,0,44,368,1,0,0,0,46,413,1,0,0,0,48,415,1,0,0,0,50,426, - 1,0,0,0,52,428,1,0,0,0,54,433,1,0,0,0,56,435,1,0,0,0,58,457,1,0, - 0,0,60,459,1,0,0,0,62,468,1,0,0,0,64,479,1,0,0,0,66,496,1,0,0,0, - 68,498,1,0,0,0,70,512,1,0,0,0,72,518,1,0,0,0,74,533,1,0,0,0,76,554, - 1,0,0,0,78,556,1,0,0,0,80,558,1,0,0,0,82,560,1,0,0,0,84,612,1,0, - 0,0,86,614,1,0,0,0,88,650,1,0,0,0,90,652,1,0,0,0,92,654,1,0,0,0, - 94,664,1,0,0,0,96,666,1,0,0,0,98,679,1,0,0,0,100,683,1,0,0,0,102, - 696,1,0,0,0,104,698,1,0,0,0,106,107,3,2,1,0,107,108,5,0,0,1,108, - 1,1,0,0,0,109,110,5,1,0,0,110,111,3,102,51,0,111,112,5,34,0,0,112, - 113,3,104,52,0,113,114,5,33,0,0,114,115,3,104,52,0,115,116,5,32, - 0,0,116,117,3,104,52,0,117,121,5,86,0,0,118,120,3,4,2,0,119,118, - 1,0,0,0,120,123,1,0,0,0,121,119,1,0,0,0,121,122,1,0,0,0,122,124, - 1,0,0,0,123,121,1,0,0,0,124,125,5,87,0,0,125,3,1,0,0,0,126,133,3, - 6,3,0,127,133,3,8,4,0,128,133,3,26,13,0,129,133,3,52,26,0,130,133, - 3,64,32,0,131,133,3,86,43,0,132,126,1,0,0,0,132,127,1,0,0,0,132, - 128,1,0,0,0,132,129,1,0,0,0,132,130,1,0,0,0,132,131,1,0,0,0,133, - 5,1,0,0,0,134,135,5,2,0,0,135,136,3,102,51,0,136,137,5,34,0,0,137, - 140,3,104,52,0,138,139,5,35,0,0,139,141,3,104,52,0,140,138,1,0,0, - 0,140,141,1,0,0,0,141,142,1,0,0,0,142,143,5,83,0,0,143,7,1,0,0,0, - 144,145,5,3,0,0,145,146,3,102,51,0,146,147,5,34,0,0,147,148,3,104, - 52,0,148,149,5,33,0,0,149,150,3,104,52,0,150,151,3,10,5,0,151,155, - 5,86,0,0,152,154,3,12,6,0,153,152,1,0,0,0,154,157,1,0,0,0,155,153, - 1,0,0,0,155,156,1,0,0,0,156,158,1,0,0,0,157,155,1,0,0,0,158,159, - 5,87,0,0,159,9,1,0,0,0,160,161,5,30,0,0,161,162,5,86,0,0,162,163, - 5,31,0,0,163,164,3,104,52,0,164,165,5,83,0,0,165,166,5,32,0,0,166, - 167,3,104,52,0,167,168,5,83,0,0,168,169,5,87,0,0,169,11,1,0,0,0, - 170,174,3,16,8,0,171,174,3,20,10,0,172,174,3,14,7,0,173,170,1,0, - 0,0,173,171,1,0,0,0,173,172,1,0,0,0,174,13,1,0,0,0,175,176,5,8,0, - 0,176,177,3,102,51,0,177,178,5,34,0,0,178,179,3,104,52,0,179,180, - 5,82,0,0,180,181,3,88,44,0,181,182,5,81,0,0,182,183,3,88,44,0,183, - 184,5,86,0,0,184,185,5,51,0,0,185,186,5,34,0,0,186,187,3,104,52, - 0,187,188,5,83,0,0,188,189,5,87,0,0,189,15,1,0,0,0,190,191,5,6,0, - 0,191,192,3,102,51,0,192,193,5,34,0,0,193,194,3,104,52,0,194,195, - 5,82,0,0,195,196,3,88,44,0,196,200,5,86,0,0,197,199,3,18,9,0,198, - 197,1,0,0,0,199,202,1,0,0,0,200,198,1,0,0,0,200,201,1,0,0,0,201, - 203,1,0,0,0,202,200,1,0,0,0,203,204,5,87,0,0,204,17,1,0,0,0,205, - 206,5,41,0,0,206,207,5,34,0,0,207,208,3,104,52,0,208,209,5,83,0, - 0,209,225,1,0,0,0,210,211,5,42,0,0,211,212,5,34,0,0,212,213,3,104, - 52,0,213,214,5,83,0,0,214,225,1,0,0,0,215,216,5,43,0,0,216,217,5, - 44,0,0,217,218,5,34,0,0,218,219,3,104,52,0,219,220,5,45,0,0,220, - 221,5,34,0,0,221,222,3,104,52,0,222,223,5,83,0,0,223,225,1,0,0,0, - 224,205,1,0,0,0,224,210,1,0,0,0,224,215,1,0,0,0,225,19,1,0,0,0,226, - 227,5,7,0,0,227,228,3,102,51,0,228,229,5,34,0,0,229,230,3,104,52, - 0,230,231,5,82,0,0,231,232,3,92,46,0,232,234,3,24,12,0,233,235,5, - 62,0,0,234,233,1,0,0,0,234,235,1,0,0,0,235,236,1,0,0,0,236,240,5, - 86,0,0,237,239,3,22,11,0,238,237,1,0,0,0,239,242,1,0,0,0,240,238, - 1,0,0,0,240,241,1,0,0,0,241,243,1,0,0,0,242,240,1,0,0,0,243,244, - 5,87,0,0,244,21,1,0,0,0,245,246,5,48,0,0,246,247,5,34,0,0,247,248, - 3,104,52,0,248,249,5,83,0,0,249,270,1,0,0,0,250,251,5,49,0,0,251, - 252,5,34,0,0,252,253,3,104,52,0,253,254,5,83,0,0,254,270,1,0,0,0, - 255,256,5,50,0,0,256,257,5,34,0,0,257,258,3,104,52,0,258,259,5,83, - 0,0,259,270,1,0,0,0,260,261,5,43,0,0,261,262,5,44,0,0,262,263,5, - 34,0,0,263,264,3,104,52,0,264,265,5,45,0,0,265,266,5,34,0,0,266, - 267,3,104,52,0,267,268,5,83,0,0,268,270,1,0,0,0,269,245,1,0,0,0, - 269,250,1,0,0,0,269,255,1,0,0,0,269,260,1,0,0,0,270,23,1,0,0,0,271, - 272,5,2,0,0,272,276,3,102,51,0,273,274,5,3,0,0,274,276,3,102,51, - 0,275,271,1,0,0,0,275,273,1,0,0,0,276,25,1,0,0,0,277,278,5,5,0,0, - 278,279,3,102,51,0,279,280,5,34,0,0,280,281,3,104,52,0,281,282,5, - 33,0,0,282,283,3,104,52,0,283,284,3,10,5,0,284,288,5,86,0,0,285, - 287,3,28,14,0,286,285,1,0,0,0,287,290,1,0,0,0,288,286,1,0,0,0,288, - 289,1,0,0,0,289,291,1,0,0,0,290,288,1,0,0,0,291,292,5,87,0,0,292, - 27,1,0,0,0,293,297,3,30,15,0,294,297,3,32,16,0,295,297,3,34,17,0, - 296,293,1,0,0,0,296,294,1,0,0,0,296,295,1,0,0,0,297,29,1,0,0,0,298, - 299,5,8,0,0,299,300,3,102,51,0,300,301,5,34,0,0,301,302,3,104,52, - 0,302,303,5,82,0,0,303,304,3,88,44,0,304,305,5,81,0,0,305,306,3, - 88,44,0,306,307,5,36,0,0,307,309,3,38,19,0,308,310,3,36,18,0,309, - 308,1,0,0,0,309,310,1,0,0,0,310,311,1,0,0,0,311,312,5,38,0,0,312, - 314,3,40,20,0,313,315,3,44,22,0,314,313,1,0,0,0,314,315,1,0,0,0, - 315,316,1,0,0,0,316,317,5,83,0,0,317,31,1,0,0,0,318,319,5,9,0,0, - 319,320,3,102,51,0,320,321,5,34,0,0,321,322,3,104,52,0,322,323,5, - 82,0,0,323,324,3,88,44,0,324,325,5,81,0,0,325,327,3,88,44,0,326, - 328,3,44,22,0,327,326,1,0,0,0,327,328,1,0,0,0,328,329,1,0,0,0,329, - 330,5,83,0,0,330,33,1,0,0,0,331,332,5,10,0,0,332,333,3,102,51,0, - 333,334,5,34,0,0,334,335,3,104,52,0,335,336,5,11,0,0,336,337,3,102, - 51,0,337,338,5,82,0,0,338,340,3,88,44,0,339,341,3,44,22,0,340,339, - 1,0,0,0,340,341,1,0,0,0,341,342,1,0,0,0,342,343,5,83,0,0,343,35, - 1,0,0,0,344,345,5,37,0,0,345,346,3,88,44,0,346,37,1,0,0,0,347,348, - 7,0,0,0,348,39,1,0,0,0,349,359,5,40,0,0,350,351,5,2,0,0,351,359, - 3,102,51,0,352,353,5,4,0,0,353,355,5,88,0,0,354,356,3,42,21,0,355, - 354,1,0,0,0,355,356,1,0,0,0,356,357,1,0,0,0,357,359,5,89,0,0,358, - 349,1,0,0,0,358,350,1,0,0,0,358,352,1,0,0,0,359,41,1,0,0,0,360,365, - 3,102,51,0,361,362,5,84,0,0,362,364,3,102,51,0,363,361,1,0,0,0,364, - 367,1,0,0,0,365,363,1,0,0,0,365,366,1,0,0,0,366,43,1,0,0,0,367,365, - 1,0,0,0,368,369,5,39,0,0,369,373,5,86,0,0,370,372,3,46,23,0,371, - 370,1,0,0,0,372,375,1,0,0,0,373,371,1,0,0,0,373,374,1,0,0,0,374, - 376,1,0,0,0,375,373,1,0,0,0,376,377,5,87,0,0,377,45,1,0,0,0,378, - 379,5,18,0,0,379,380,3,102,51,0,380,381,5,34,0,0,381,382,3,104,52, - 0,382,383,5,82,0,0,383,384,3,88,44,0,384,385,3,48,24,0,385,386,5, - 83,0,0,386,414,1,0,0,0,387,388,5,19,0,0,388,389,3,102,51,0,389,390, - 5,34,0,0,390,391,3,104,52,0,391,392,5,82,0,0,392,393,3,92,46,0,393, - 394,3,24,12,0,394,395,3,48,24,0,395,396,5,83,0,0,396,414,1,0,0,0, - 397,398,5,3,0,0,398,399,3,102,51,0,399,400,5,34,0,0,400,401,3,104, - 52,0,401,402,5,82,0,0,402,403,3,102,51,0,403,404,5,83,0,0,404,414, - 1,0,0,0,405,406,5,10,0,0,406,407,3,102,51,0,407,408,5,34,0,0,408, - 409,3,104,52,0,409,410,5,82,0,0,410,411,3,102,51,0,411,412,5,83, - 0,0,412,414,1,0,0,0,413,378,1,0,0,0,413,387,1,0,0,0,413,397,1,0, - 0,0,413,405,1,0,0,0,414,47,1,0,0,0,415,416,5,88,0,0,416,421,3,50, - 25,0,417,418,5,84,0,0,418,420,3,50,25,0,419,417,1,0,0,0,420,423, - 1,0,0,0,421,419,1,0,0,0,421,422,1,0,0,0,422,424,1,0,0,0,423,421, - 1,0,0,0,424,425,5,89,0,0,425,49,1,0,0,0,426,427,7,1,0,0,427,51,1, - 0,0,0,428,429,5,17,0,0,429,430,3,54,27,0,430,53,1,0,0,0,431,434, - 3,56,28,0,432,434,3,60,30,0,433,431,1,0,0,0,433,432,1,0,0,0,434, - 55,1,0,0,0,435,436,5,18,0,0,436,437,3,102,51,0,437,438,5,34,0,0, - 438,439,3,104,52,0,439,440,5,27,0,0,440,441,3,102,51,0,441,442,5, - 82,0,0,442,443,3,88,44,0,443,444,5,28,0,0,444,447,3,58,29,0,445, - 446,5,29,0,0,446,448,3,94,47,0,447,445,1,0,0,0,447,448,1,0,0,0,448, - 449,1,0,0,0,449,450,5,83,0,0,450,57,1,0,0,0,451,458,5,56,0,0,452, - 453,5,57,0,0,453,454,5,90,0,0,454,455,3,88,44,0,455,456,5,91,0,0, - 456,458,1,0,0,0,457,451,1,0,0,0,457,452,1,0,0,0,458,59,1,0,0,0,459, - 460,5,19,0,0,460,461,3,102,51,0,461,462,5,34,0,0,462,463,3,104,52, - 0,463,464,5,86,0,0,464,465,3,62,31,0,465,466,3,62,31,0,466,467,5, - 87,0,0,467,61,1,0,0,0,468,469,3,24,12,0,469,470,5,20,0,0,470,471, - 3,102,51,0,471,472,5,34,0,0,472,473,3,104,52,0,473,475,3,92,46,0, - 474,476,5,62,0,0,475,474,1,0,0,0,475,476,1,0,0,0,476,477,1,0,0,0, - 477,478,5,83,0,0,478,63,1,0,0,0,479,480,5,12,0,0,480,481,3,102,51, - 0,481,482,5,13,0,0,482,483,3,102,51,0,483,487,5,86,0,0,484,486,3, - 66,33,0,485,484,1,0,0,0,486,489,1,0,0,0,487,485,1,0,0,0,487,488, - 1,0,0,0,488,490,1,0,0,0,489,487,1,0,0,0,490,491,5,87,0,0,491,65, - 1,0,0,0,492,493,5,16,0,0,493,497,3,54,27,0,494,497,3,70,35,0,495, - 497,3,68,34,0,496,492,1,0,0,0,496,494,1,0,0,0,496,495,1,0,0,0,497, - 67,1,0,0,0,498,499,5,24,0,0,499,500,3,102,51,0,500,501,5,25,0,0, - 501,502,5,26,0,0,502,503,5,22,0,0,503,504,5,10,0,0,504,505,3,102, - 51,0,505,506,5,23,0,0,506,507,5,19,0,0,507,508,3,102,51,0,508,509, - 5,85,0,0,509,510,3,102,51,0,510,511,5,83,0,0,511,69,1,0,0,0,512, - 513,5,14,0,0,513,514,3,72,36,0,514,515,5,15,0,0,515,516,3,76,38, - 0,516,517,5,83,0,0,517,71,1,0,0,0,518,519,3,102,51,0,519,520,5,85, - 0,0,520,521,3,74,37,0,521,73,1,0,0,0,522,534,3,102,51,0,523,534, - 5,51,0,0,524,534,5,41,0,0,525,534,5,42,0,0,526,534,5,48,0,0,527, - 534,5,49,0,0,528,534,5,50,0,0,529,534,5,52,0,0,530,534,5,53,0,0, - 531,534,5,54,0,0,532,534,5,55,0,0,533,522,1,0,0,0,533,523,1,0,0, - 0,533,524,1,0,0,0,533,525,1,0,0,0,533,526,1,0,0,0,533,527,1,0,0, - 0,533,528,1,0,0,0,533,529,1,0,0,0,533,530,1,0,0,0,533,531,1,0,0, - 0,533,532,1,0,0,0,534,75,1,0,0,0,535,536,5,18,0,0,536,537,3,102, - 51,0,537,538,5,85,0,0,538,539,3,78,39,0,539,555,1,0,0,0,540,541, - 5,19,0,0,541,542,3,102,51,0,542,543,5,85,0,0,543,544,3,102,51,0, - 544,545,5,85,0,0,545,546,3,80,40,0,546,555,1,0,0,0,547,548,5,5,0, - 0,548,549,3,102,51,0,549,550,5,85,0,0,550,552,3,102,51,0,551,553, - 3,82,41,0,552,551,1,0,0,0,552,553,1,0,0,0,553,555,1,0,0,0,554,535, - 1,0,0,0,554,540,1,0,0,0,554,547,1,0,0,0,555,77,1,0,0,0,556,557,7, - 2,0,0,557,79,1,0,0,0,558,559,7,3,0,0,559,81,1,0,0,0,560,561,5,21, - 0,0,561,565,5,86,0,0,562,564,3,84,42,0,563,562,1,0,0,0,564,567,1, - 0,0,0,565,563,1,0,0,0,565,566,1,0,0,0,566,568,1,0,0,0,567,565,1, - 0,0,0,568,569,5,87,0,0,569,83,1,0,0,0,570,571,3,102,51,0,571,572, - 5,15,0,0,572,573,5,18,0,0,573,580,3,102,51,0,574,575,5,23,0,0,575, - 576,5,19,0,0,576,577,3,102,51,0,577,578,5,85,0,0,578,579,3,102,51, - 0,579,581,1,0,0,0,580,574,1,0,0,0,580,581,1,0,0,0,581,582,1,0,0, - 0,582,583,5,83,0,0,583,613,1,0,0,0,584,585,3,102,51,0,585,586,5, - 15,0,0,586,587,5,19,0,0,587,588,3,102,51,0,588,589,5,85,0,0,589, - 596,3,102,51,0,590,591,5,23,0,0,591,592,5,19,0,0,592,593,3,102,51, - 0,593,594,5,85,0,0,594,595,3,102,51,0,595,597,1,0,0,0,596,590,1, - 0,0,0,596,597,1,0,0,0,597,598,1,0,0,0,598,599,5,83,0,0,599,613,1, - 0,0,0,600,601,3,102,51,0,601,602,5,15,0,0,602,603,5,3,0,0,603,604, - 3,102,51,0,604,605,5,83,0,0,605,613,1,0,0,0,606,607,3,102,51,0,607, - 608,5,15,0,0,608,609,5,10,0,0,609,610,3,102,51,0,610,611,5,83,0, - 0,611,613,1,0,0,0,612,570,1,0,0,0,612,584,1,0,0,0,612,600,1,0,0, - 0,612,606,1,0,0,0,613,85,1,0,0,0,614,615,5,10,0,0,615,616,3,102, - 51,0,616,617,5,15,0,0,617,618,3,102,51,0,618,619,5,85,0,0,619,621, - 3,102,51,0,620,622,3,82,41,0,621,620,1,0,0,0,621,622,1,0,0,0,622, - 623,1,0,0,0,623,624,5,83,0,0,624,87,1,0,0,0,625,651,3,90,45,0,626, - 651,5,63,0,0,627,651,5,64,0,0,628,629,5,65,0,0,629,651,3,104,52, - 0,630,631,5,66,0,0,631,632,5,92,0,0,632,633,3,102,51,0,633,634,5, - 93,0,0,634,651,1,0,0,0,635,636,5,67,0,0,636,637,5,92,0,0,637,638, - 3,102,51,0,638,639,5,93,0,0,639,651,1,0,0,0,640,641,5,68,0,0,641, - 642,5,92,0,0,642,643,3,88,44,0,643,644,5,93,0,0,644,651,1,0,0,0, - 645,646,5,69,0,0,646,647,5,92,0,0,647,648,3,88,44,0,648,649,5,93, - 0,0,649,651,1,0,0,0,650,625,1,0,0,0,650,626,1,0,0,0,650,627,1,0, - 0,0,650,628,1,0,0,0,650,630,1,0,0,0,650,635,1,0,0,0,650,640,1,0, - 0,0,650,645,1,0,0,0,651,89,1,0,0,0,652,653,7,4,0,0,653,91,1,0,0, - 0,654,655,7,5,0,0,655,93,1,0,0,0,656,665,3,104,52,0,657,665,5,94, - 0,0,658,665,5,95,0,0,659,665,5,78,0,0,660,665,5,79,0,0,661,665,5, - 80,0,0,662,665,3,96,48,0,663,665,3,100,50,0,664,656,1,0,0,0,664, - 657,1,0,0,0,664,658,1,0,0,0,664,659,1,0,0,0,664,660,1,0,0,0,664, - 661,1,0,0,0,664,662,1,0,0,0,664,663,1,0,0,0,665,95,1,0,0,0,666,675, - 5,86,0,0,667,672,3,98,49,0,668,669,5,84,0,0,669,671,3,98,49,0,670, - 668,1,0,0,0,671,674,1,0,0,0,672,670,1,0,0,0,672,673,1,0,0,0,673, - 676,1,0,0,0,674,672,1,0,0,0,675,667,1,0,0,0,675,676,1,0,0,0,676, - 677,1,0,0,0,677,678,5,87,0,0,678,97,1,0,0,0,679,680,3,104,52,0,680, - 681,5,82,0,0,681,682,3,94,47,0,682,99,1,0,0,0,683,692,5,88,0,0,684, - 689,3,94,47,0,685,686,5,84,0,0,686,688,3,94,47,0,687,685,1,0,0,0, - 688,691,1,0,0,0,689,687,1,0,0,0,689,690,1,0,0,0,690,693,1,0,0,0, - 691,689,1,0,0,0,692,684,1,0,0,0,692,693,1,0,0,0,693,694,1,0,0,0, - 694,695,5,89,0,0,695,101,1,0,0,0,696,697,7,6,0,0,697,103,1,0,0,0, - 698,699,5,97,0,0,699,105,1,0,0,0,43,121,132,140,155,173,200,224, - 234,240,269,275,288,296,309,314,327,340,355,358,365,373,413,421, - 433,447,457,475,487,496,533,552,554,565,580,596,612,621,650,664, - 672,675,689,692 + 52,2,53,7,53,2,54,7,54,2,55,7,55,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0, + 1,0,3,0,122,8,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,1,134, + 8,1,10,1,12,1,137,9,1,1,1,1,1,1,2,1,2,1,2,1,2,1,2,3,2,146,8,2,1, + 3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,3,3,158,8,3,1,4,1,4,1,4,1, + 4,1,4,1,4,1,4,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,6,1,6,1,6,3,6,177,8, + 6,1,7,1,7,1,7,1,7,1,7,1,7,3,7,185,8,7,1,7,1,7,1,8,5,8,190,8,8,10, + 8,12,8,193,9,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,5,8,203,8,8,10,8, + 12,8,206,9,8,1,8,1,8,1,9,1,9,1,9,3,9,213,8,9,1,10,1,10,1,10,1,10, + 1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,11,1,11, + 1,11,1,11,1,11,1,11,1,11,1,11,5,11,238,8,11,10,11,12,11,241,9,11, + 1,11,1,11,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12, + 1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,3,12,264,8,12,1,13,1,13, + 1,13,1,13,1,13,1,13,1,13,1,13,3,13,274,8,13,1,13,1,13,5,13,278,8, + 13,10,13,12,13,281,9,13,1,13,1,13,1,14,1,14,1,14,1,14,1,14,1,14, + 1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,14, + 1,14,1,14,1,14,1,14,1,14,3,14,309,8,14,1,15,1,15,1,15,1,15,3,15, + 315,8,15,1,16,5,16,318,8,16,10,16,12,16,321,9,16,1,16,1,16,1,16, + 1,16,1,16,1,16,1,16,1,16,5,16,331,8,16,10,16,12,16,334,9,16,1,16, + 1,16,1,17,1,17,1,17,3,17,341,8,17,1,18,1,18,1,18,1,18,1,18,1,18, + 1,18,1,18,1,18,1,18,1,18,3,18,354,8,18,1,18,1,18,1,18,3,18,359,8, + 18,1,18,1,18,1,19,1,19,1,19,1,19,1,19,1,19,1,19,1,19,1,19,3,19,372, + 8,19,1,19,1,19,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,3,20, + 385,8,20,1,20,1,20,1,21,1,21,1,21,1,22,1,22,1,23,1,23,1,23,1,23, + 1,23,1,23,3,23,400,8,23,1,23,3,23,403,8,23,1,24,1,24,1,24,5,24,408, + 8,24,10,24,12,24,411,9,24,1,25,1,25,1,25,5,25,416,8,25,10,25,12, + 25,419,9,25,1,25,1,25,1,26,1,26,1,26,1,26,1,26,1,26,1,26,1,26,1, + 26,1,26,1,26,1,26,1,26,1,26,1,26,1,26,1,26,1,26,1,26,1,26,1,26,1, + 26,1,26,1,26,1,26,1,26,1,26,1,26,1,26,1,26,1,26,1,26,1,26,1,26,1, + 26,3,26,458,8,26,1,27,1,27,1,27,1,27,5,27,464,8,27,10,27,12,27,467, + 9,27,1,27,1,27,1,28,1,28,1,29,1,29,1,29,1,30,1,30,3,30,478,8,30, + 1,31,1,31,1,31,1,31,1,31,1,31,1,31,1,31,1,31,1,31,1,31,1,31,3,31, + 492,8,31,1,31,1,31,1,32,1,32,1,32,1,32,1,32,1,32,3,32,502,8,32,1, + 33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,34,1,34,1,34,1,34,1, + 34,1,34,1,34,3,34,520,8,34,1,34,1,34,1,35,1,35,1,35,1,35,1,35,1, + 35,5,35,530,8,35,10,35,12,35,533,9,35,1,35,1,35,1,36,1,36,1,36,1, + 36,3,36,541,8,36,1,37,1,37,1,37,1,37,1,37,1,37,1,37,1,37,1,37,1, + 37,1,37,1,37,1,37,1,37,1,38,1,38,1,38,1,38,1,38,1,38,1,39,1,39,1, + 39,1,39,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,3, + 40,578,8,40,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1, + 41,1,41,1,41,1,41,1,41,1,41,1,41,3,41,597,8,41,3,41,599,8,41,1,42, + 1,42,1,43,1,43,1,44,1,44,1,44,5,44,608,8,44,10,44,12,44,611,9,44, + 1,44,1,44,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,3,45, + 625,8,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45, + 1,45,1,45,1,45,3,45,641,8,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45, + 1,45,1,45,1,45,1,45,1,45,3,45,655,8,45,1,45,1,45,1,45,1,45,1,45, + 1,45,1,45,1,45,3,45,665,8,45,1,46,1,46,1,46,1,46,1,46,1,46,1,46, + 3,46,674,8,46,1,46,1,46,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47, + 1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47, + 1,47,1,47,1,47,1,47,3,47,703,8,47,1,48,1,48,1,49,1,49,1,50,1,50, + 1,50,1,50,1,50,1,50,1,50,1,50,3,50,717,8,50,1,51,1,51,1,51,1,51, + 5,51,723,8,51,10,51,12,51,726,9,51,3,51,728,8,51,1,51,1,51,1,52, + 1,52,1,52,1,52,1,53,1,53,1,53,1,53,5,53,740,8,53,10,53,12,53,743, + 9,53,3,53,745,8,53,1,53,1,53,1,54,1,54,1,55,1,55,1,55,0,0,56,0,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,0,7,1,0,53,57,2,0,48,52,54,55,2, + 0,48,49,54,55,2,0,50,52,54,55,1,0,72,79,1,0,60,63,2,0,32,32,98,98, + 783,0,121,1,0,0,0,2,123,1,0,0,0,4,145,1,0,0,0,6,157,1,0,0,0,8,159, + 1,0,0,0,10,166,1,0,0,0,12,176,1,0,0,0,14,178,1,0,0,0,16,191,1,0, + 0,0,18,212,1,0,0,0,20,214,1,0,0,0,22,229,1,0,0,0,24,263,1,0,0,0, + 26,265,1,0,0,0,28,308,1,0,0,0,30,314,1,0,0,0,32,319,1,0,0,0,34,340, + 1,0,0,0,36,342,1,0,0,0,38,362,1,0,0,0,40,375,1,0,0,0,42,388,1,0, + 0,0,44,391,1,0,0,0,46,402,1,0,0,0,48,404,1,0,0,0,50,412,1,0,0,0, + 52,457,1,0,0,0,54,459,1,0,0,0,56,470,1,0,0,0,58,472,1,0,0,0,60,477, + 1,0,0,0,62,479,1,0,0,0,64,501,1,0,0,0,66,503,1,0,0,0,68,512,1,0, + 0,0,70,523,1,0,0,0,72,540,1,0,0,0,74,542,1,0,0,0,76,556,1,0,0,0, + 78,562,1,0,0,0,80,577,1,0,0,0,82,598,1,0,0,0,84,600,1,0,0,0,86,602, + 1,0,0,0,88,604,1,0,0,0,90,664,1,0,0,0,92,666,1,0,0,0,94,702,1,0, + 0,0,96,704,1,0,0,0,98,706,1,0,0,0,100,716,1,0,0,0,102,718,1,0,0, + 0,104,731,1,0,0,0,106,735,1,0,0,0,108,748,1,0,0,0,110,750,1,0,0, + 0,112,113,3,2,1,0,113,114,5,0,0,1,114,122,1,0,0,0,115,116,3,16,8, + 0,116,117,5,0,0,1,117,122,1,0,0,0,118,119,3,32,16,0,119,120,5,0, + 0,1,120,122,1,0,0,0,121,112,1,0,0,0,121,115,1,0,0,0,121,118,1,0, + 0,0,122,1,1,0,0,0,123,124,5,1,0,0,124,125,3,108,54,0,125,126,5,36, + 0,0,126,127,3,110,55,0,127,128,5,35,0,0,128,129,3,110,55,0,129,130, + 5,34,0,0,130,131,3,110,55,0,131,135,5,88,0,0,132,134,3,4,2,0,133, + 132,1,0,0,0,134,137,1,0,0,0,135,133,1,0,0,0,135,136,1,0,0,0,136, + 138,1,0,0,0,137,135,1,0,0,0,138,139,5,89,0,0,139,3,1,0,0,0,140,146, + 3,14,7,0,141,146,3,6,3,0,142,146,3,58,29,0,143,146,3,70,35,0,144, + 146,3,92,46,0,145,140,1,0,0,0,145,141,1,0,0,0,145,142,1,0,0,0,145, + 143,1,0,0,0,145,144,1,0,0,0,146,5,1,0,0,0,147,148,5,2,0,0,148,149, + 5,5,0,0,149,150,3,108,54,0,150,151,5,85,0,0,151,158,1,0,0,0,152, + 153,5,2,0,0,153,154,5,7,0,0,154,155,3,108,54,0,155,156,5,85,0,0, + 156,158,1,0,0,0,157,147,1,0,0,0,157,152,1,0,0,0,158,7,1,0,0,0,159, + 160,5,3,0,0,160,161,5,4,0,0,161,162,3,108,54,0,162,163,5,36,0,0, + 163,164,3,110,55,0,164,165,5,85,0,0,165,9,1,0,0,0,166,167,5,3,0, + 0,167,168,5,5,0,0,168,169,3,108,54,0,169,170,5,35,0,0,170,171,3, + 110,55,0,171,172,5,85,0,0,172,11,1,0,0,0,173,177,3,6,3,0,174,177, + 3,8,4,0,175,177,3,10,5,0,176,173,1,0,0,0,176,174,1,0,0,0,176,175, + 1,0,0,0,177,13,1,0,0,0,178,179,5,4,0,0,179,180,3,108,54,0,180,181, + 5,36,0,0,181,184,3,110,55,0,182,183,5,37,0,0,183,185,3,110,55,0, + 184,182,1,0,0,0,184,185,1,0,0,0,185,186,1,0,0,0,186,187,5,85,0,0, + 187,15,1,0,0,0,188,190,3,12,6,0,189,188,1,0,0,0,190,193,1,0,0,0, + 191,189,1,0,0,0,191,192,1,0,0,0,192,194,1,0,0,0,193,191,1,0,0,0, + 194,195,5,5,0,0,195,196,3,108,54,0,196,197,5,36,0,0,197,198,3,110, + 55,0,198,199,5,35,0,0,199,200,3,110,55,0,200,204,5,88,0,0,201,203, + 3,18,9,0,202,201,1,0,0,0,203,206,1,0,0,0,204,202,1,0,0,0,204,205, + 1,0,0,0,205,207,1,0,0,0,206,204,1,0,0,0,207,208,5,89,0,0,208,17, + 1,0,0,0,209,213,3,22,11,0,210,213,3,26,13,0,211,213,3,20,10,0,212, + 209,1,0,0,0,212,210,1,0,0,0,212,211,1,0,0,0,213,19,1,0,0,0,214,215, + 5,10,0,0,215,216,3,108,54,0,216,217,5,36,0,0,217,218,3,110,55,0, + 218,219,5,84,0,0,219,220,3,94,47,0,220,221,5,83,0,0,221,222,3,94, + 47,0,222,223,5,88,0,0,223,224,5,53,0,0,224,225,5,36,0,0,225,226, + 3,110,55,0,226,227,5,85,0,0,227,228,5,89,0,0,228,21,1,0,0,0,229, + 230,5,8,0,0,230,231,3,108,54,0,231,232,5,36,0,0,232,233,3,110,55, + 0,233,234,5,84,0,0,234,235,3,94,47,0,235,239,5,88,0,0,236,238,3, + 24,12,0,237,236,1,0,0,0,238,241,1,0,0,0,239,237,1,0,0,0,239,240, + 1,0,0,0,240,242,1,0,0,0,241,239,1,0,0,0,242,243,5,89,0,0,243,23, + 1,0,0,0,244,245,5,43,0,0,245,246,5,36,0,0,246,247,3,110,55,0,247, + 248,5,85,0,0,248,264,1,0,0,0,249,250,5,44,0,0,250,251,5,36,0,0,251, + 252,3,110,55,0,252,253,5,85,0,0,253,264,1,0,0,0,254,255,5,45,0,0, + 255,256,5,46,0,0,256,257,5,36,0,0,257,258,3,110,55,0,258,259,5,47, + 0,0,259,260,5,36,0,0,260,261,3,110,55,0,261,262,5,85,0,0,262,264, + 1,0,0,0,263,244,1,0,0,0,263,249,1,0,0,0,263,254,1,0,0,0,264,25,1, + 0,0,0,265,266,5,9,0,0,266,267,3,108,54,0,267,268,5,36,0,0,268,269, + 3,110,55,0,269,270,5,84,0,0,270,271,3,98,49,0,271,273,3,30,15,0, + 272,274,5,64,0,0,273,272,1,0,0,0,273,274,1,0,0,0,274,275,1,0,0,0, + 275,279,5,88,0,0,276,278,3,28,14,0,277,276,1,0,0,0,278,281,1,0,0, + 0,279,277,1,0,0,0,279,280,1,0,0,0,280,282,1,0,0,0,281,279,1,0,0, + 0,282,283,5,89,0,0,283,27,1,0,0,0,284,285,5,50,0,0,285,286,5,36, + 0,0,286,287,3,110,55,0,287,288,5,85,0,0,288,309,1,0,0,0,289,290, + 5,51,0,0,290,291,5,36,0,0,291,292,3,110,55,0,292,293,5,85,0,0,293, + 309,1,0,0,0,294,295,5,52,0,0,295,296,5,36,0,0,296,297,3,110,55,0, + 297,298,5,85,0,0,298,309,1,0,0,0,299,300,5,45,0,0,300,301,5,46,0, + 0,301,302,5,36,0,0,302,303,3,110,55,0,303,304,5,47,0,0,304,305,5, + 36,0,0,305,306,3,110,55,0,306,307,5,85,0,0,307,309,1,0,0,0,308,284, + 1,0,0,0,308,289,1,0,0,0,308,294,1,0,0,0,308,299,1,0,0,0,309,29,1, + 0,0,0,310,311,5,4,0,0,311,315,3,108,54,0,312,313,5,5,0,0,313,315, + 3,108,54,0,314,310,1,0,0,0,314,312,1,0,0,0,315,31,1,0,0,0,316,318, + 3,12,6,0,317,316,1,0,0,0,318,321,1,0,0,0,319,317,1,0,0,0,319,320, + 1,0,0,0,320,322,1,0,0,0,321,319,1,0,0,0,322,323,5,7,0,0,323,324, + 3,108,54,0,324,325,5,36,0,0,325,326,3,110,55,0,326,327,5,35,0,0, + 327,328,3,110,55,0,328,332,5,88,0,0,329,331,3,34,17,0,330,329,1, + 0,0,0,331,334,1,0,0,0,332,330,1,0,0,0,332,333,1,0,0,0,333,335,1, + 0,0,0,334,332,1,0,0,0,335,336,5,89,0,0,336,33,1,0,0,0,337,341,3, + 36,18,0,338,341,3,38,19,0,339,341,3,40,20,0,340,337,1,0,0,0,340, + 338,1,0,0,0,340,339,1,0,0,0,341,35,1,0,0,0,342,343,5,10,0,0,343, + 344,3,108,54,0,344,345,5,36,0,0,345,346,3,110,55,0,346,347,5,84, + 0,0,347,348,3,94,47,0,348,349,5,83,0,0,349,350,3,94,47,0,350,351, + 5,38,0,0,351,353,3,44,22,0,352,354,3,42,21,0,353,352,1,0,0,0,353, + 354,1,0,0,0,354,355,1,0,0,0,355,356,5,40,0,0,356,358,3,46,23,0,357, + 359,3,50,25,0,358,357,1,0,0,0,358,359,1,0,0,0,359,360,1,0,0,0,360, + 361,5,85,0,0,361,37,1,0,0,0,362,363,5,11,0,0,363,364,3,108,54,0, + 364,365,5,36,0,0,365,366,3,110,55,0,366,367,5,84,0,0,367,368,3,94, + 47,0,368,369,5,83,0,0,369,371,3,94,47,0,370,372,3,50,25,0,371,370, + 1,0,0,0,371,372,1,0,0,0,372,373,1,0,0,0,373,374,5,85,0,0,374,39, + 1,0,0,0,375,376,5,12,0,0,376,377,3,108,54,0,377,378,5,36,0,0,378, + 379,3,110,55,0,379,380,5,13,0,0,380,381,3,108,54,0,381,382,5,84, + 0,0,382,384,3,94,47,0,383,385,3,50,25,0,384,383,1,0,0,0,384,385, + 1,0,0,0,385,386,1,0,0,0,386,387,5,85,0,0,387,41,1,0,0,0,388,389, + 5,39,0,0,389,390,3,94,47,0,390,43,1,0,0,0,391,392,7,0,0,0,392,45, + 1,0,0,0,393,403,5,42,0,0,394,395,5,4,0,0,395,403,3,108,54,0,396, + 397,5,6,0,0,397,399,5,90,0,0,398,400,3,48,24,0,399,398,1,0,0,0,399, + 400,1,0,0,0,400,401,1,0,0,0,401,403,5,91,0,0,402,393,1,0,0,0,402, + 394,1,0,0,0,402,396,1,0,0,0,403,47,1,0,0,0,404,409,3,108,54,0,405, + 406,5,86,0,0,406,408,3,108,54,0,407,405,1,0,0,0,408,411,1,0,0,0, + 409,407,1,0,0,0,409,410,1,0,0,0,410,49,1,0,0,0,411,409,1,0,0,0,412, + 413,5,41,0,0,413,417,5,88,0,0,414,416,3,52,26,0,415,414,1,0,0,0, + 416,419,1,0,0,0,417,415,1,0,0,0,417,418,1,0,0,0,418,420,1,0,0,0, + 419,417,1,0,0,0,420,421,5,89,0,0,421,51,1,0,0,0,422,423,5,20,0,0, + 423,424,3,108,54,0,424,425,5,36,0,0,425,426,3,110,55,0,426,427,5, + 84,0,0,427,428,3,94,47,0,428,429,3,54,27,0,429,430,5,85,0,0,430, + 458,1,0,0,0,431,432,5,21,0,0,432,433,3,108,54,0,433,434,5,36,0,0, + 434,435,3,110,55,0,435,436,5,84,0,0,436,437,3,98,49,0,437,438,3, + 30,15,0,438,439,3,54,27,0,439,440,5,85,0,0,440,458,1,0,0,0,441,442, + 5,5,0,0,442,443,3,108,54,0,443,444,5,36,0,0,444,445,3,110,55,0,445, + 446,5,84,0,0,446,447,3,108,54,0,447,448,5,85,0,0,448,458,1,0,0,0, + 449,450,5,12,0,0,450,451,3,108,54,0,451,452,5,36,0,0,452,453,3,110, + 55,0,453,454,5,84,0,0,454,455,3,108,54,0,455,456,5,85,0,0,456,458, + 1,0,0,0,457,422,1,0,0,0,457,431,1,0,0,0,457,441,1,0,0,0,457,449, + 1,0,0,0,458,53,1,0,0,0,459,460,5,90,0,0,460,465,3,56,28,0,461,462, + 5,86,0,0,462,464,3,56,28,0,463,461,1,0,0,0,464,467,1,0,0,0,465,463, + 1,0,0,0,465,466,1,0,0,0,466,468,1,0,0,0,467,465,1,0,0,0,468,469, + 5,91,0,0,469,55,1,0,0,0,470,471,7,1,0,0,471,57,1,0,0,0,472,473,5, + 19,0,0,473,474,3,60,30,0,474,59,1,0,0,0,475,478,3,62,31,0,476,478, + 3,66,33,0,477,475,1,0,0,0,477,476,1,0,0,0,478,61,1,0,0,0,479,480, + 5,20,0,0,480,481,3,108,54,0,481,482,5,36,0,0,482,483,3,110,55,0, + 483,484,5,29,0,0,484,485,3,108,54,0,485,486,5,84,0,0,486,487,3,94, + 47,0,487,488,5,30,0,0,488,491,3,64,32,0,489,490,5,31,0,0,490,492, + 3,100,50,0,491,489,1,0,0,0,491,492,1,0,0,0,492,493,1,0,0,0,493,494, + 5,85,0,0,494,63,1,0,0,0,495,502,5,58,0,0,496,497,5,59,0,0,497,498, + 5,92,0,0,498,499,3,94,47,0,499,500,5,93,0,0,500,502,1,0,0,0,501, + 495,1,0,0,0,501,496,1,0,0,0,502,65,1,0,0,0,503,504,5,21,0,0,504, + 505,3,108,54,0,505,506,5,36,0,0,506,507,3,110,55,0,507,508,5,88, + 0,0,508,509,3,68,34,0,509,510,3,68,34,0,510,511,5,89,0,0,511,67, + 1,0,0,0,512,513,3,30,15,0,513,514,5,22,0,0,514,515,3,108,54,0,515, + 516,5,36,0,0,516,517,3,110,55,0,517,519,3,98,49,0,518,520,5,64,0, + 0,519,518,1,0,0,0,519,520,1,0,0,0,520,521,1,0,0,0,521,522,5,85,0, + 0,522,69,1,0,0,0,523,524,5,14,0,0,524,525,3,108,54,0,525,526,5,15, + 0,0,526,527,3,108,54,0,527,531,5,88,0,0,528,530,3,72,36,0,529,528, + 1,0,0,0,530,533,1,0,0,0,531,529,1,0,0,0,531,532,1,0,0,0,532,534, + 1,0,0,0,533,531,1,0,0,0,534,535,5,89,0,0,535,71,1,0,0,0,536,537, + 5,18,0,0,537,541,3,60,30,0,538,541,3,76,38,0,539,541,3,74,37,0,540, + 536,1,0,0,0,540,538,1,0,0,0,540,539,1,0,0,0,541,73,1,0,0,0,542,543, + 5,26,0,0,543,544,3,108,54,0,544,545,5,27,0,0,545,546,5,28,0,0,546, + 547,5,24,0,0,547,548,5,12,0,0,548,549,3,108,54,0,549,550,5,25,0, + 0,550,551,5,21,0,0,551,552,3,108,54,0,552,553,5,87,0,0,553,554,3, + 108,54,0,554,555,5,85,0,0,555,75,1,0,0,0,556,557,5,16,0,0,557,558, + 3,78,39,0,558,559,5,17,0,0,559,560,3,82,41,0,560,561,5,85,0,0,561, + 77,1,0,0,0,562,563,3,108,54,0,563,564,5,87,0,0,564,565,3,80,40,0, + 565,79,1,0,0,0,566,578,3,108,54,0,567,578,5,53,0,0,568,578,5,43, + 0,0,569,578,5,44,0,0,570,578,5,50,0,0,571,578,5,51,0,0,572,578,5, + 52,0,0,573,578,5,54,0,0,574,578,5,55,0,0,575,578,5,56,0,0,576,578, + 5,57,0,0,577,566,1,0,0,0,577,567,1,0,0,0,577,568,1,0,0,0,577,569, + 1,0,0,0,577,570,1,0,0,0,577,571,1,0,0,0,577,572,1,0,0,0,577,573, + 1,0,0,0,577,574,1,0,0,0,577,575,1,0,0,0,577,576,1,0,0,0,578,81,1, + 0,0,0,579,580,5,20,0,0,580,581,3,108,54,0,581,582,5,87,0,0,582,583, + 3,84,42,0,583,599,1,0,0,0,584,585,5,21,0,0,585,586,3,108,54,0,586, + 587,5,87,0,0,587,588,3,108,54,0,588,589,5,87,0,0,589,590,3,86,43, + 0,590,599,1,0,0,0,591,592,5,7,0,0,592,593,3,108,54,0,593,594,5,87, + 0,0,594,596,3,108,54,0,595,597,3,88,44,0,596,595,1,0,0,0,596,597, + 1,0,0,0,597,599,1,0,0,0,598,579,1,0,0,0,598,584,1,0,0,0,598,591, + 1,0,0,0,599,83,1,0,0,0,600,601,7,2,0,0,601,85,1,0,0,0,602,603,7, + 3,0,0,603,87,1,0,0,0,604,605,5,23,0,0,605,609,5,88,0,0,606,608,3, + 90,45,0,607,606,1,0,0,0,608,611,1,0,0,0,609,607,1,0,0,0,609,610, + 1,0,0,0,610,612,1,0,0,0,611,609,1,0,0,0,612,613,5,89,0,0,613,89, + 1,0,0,0,614,615,3,108,54,0,615,616,5,17,0,0,616,617,5,20,0,0,617, + 624,3,108,54,0,618,619,5,25,0,0,619,620,5,21,0,0,620,621,3,108,54, + 0,621,622,5,87,0,0,622,623,3,108,54,0,623,625,1,0,0,0,624,618,1, + 0,0,0,624,625,1,0,0,0,625,626,1,0,0,0,626,627,5,85,0,0,627,665,1, + 0,0,0,628,629,3,108,54,0,629,630,5,17,0,0,630,631,5,21,0,0,631,632, + 3,108,54,0,632,633,5,87,0,0,633,640,3,108,54,0,634,635,5,25,0,0, + 635,636,5,21,0,0,636,637,3,108,54,0,637,638,5,87,0,0,638,639,3,108, + 54,0,639,641,1,0,0,0,640,634,1,0,0,0,640,641,1,0,0,0,641,642,1,0, + 0,0,642,643,5,85,0,0,643,665,1,0,0,0,644,645,3,108,54,0,645,646, + 5,17,0,0,646,647,5,5,0,0,647,654,3,108,54,0,648,649,5,25,0,0,649, + 650,5,21,0,0,650,651,3,108,54,0,651,652,5,87,0,0,652,653,3,108,54, + 0,653,655,1,0,0,0,654,648,1,0,0,0,654,655,1,0,0,0,655,656,1,0,0, + 0,656,657,5,85,0,0,657,665,1,0,0,0,658,659,3,108,54,0,659,660,5, + 17,0,0,660,661,5,12,0,0,661,662,3,108,54,0,662,663,5,85,0,0,663, + 665,1,0,0,0,664,614,1,0,0,0,664,628,1,0,0,0,664,644,1,0,0,0,664, + 658,1,0,0,0,665,91,1,0,0,0,666,667,5,12,0,0,667,668,3,108,54,0,668, + 669,5,17,0,0,669,670,3,108,54,0,670,671,5,87,0,0,671,673,3,108,54, + 0,672,674,3,88,44,0,673,672,1,0,0,0,673,674,1,0,0,0,674,675,1,0, + 0,0,675,676,5,85,0,0,676,93,1,0,0,0,677,703,3,96,48,0,678,703,5, + 65,0,0,679,703,5,66,0,0,680,681,5,67,0,0,681,703,3,110,55,0,682, + 683,5,68,0,0,683,684,5,94,0,0,684,685,3,108,54,0,685,686,5,95,0, + 0,686,703,1,0,0,0,687,688,5,69,0,0,688,689,5,94,0,0,689,690,3,108, + 54,0,690,691,5,95,0,0,691,703,1,0,0,0,692,693,5,70,0,0,693,694,5, + 94,0,0,694,695,3,94,47,0,695,696,5,95,0,0,696,703,1,0,0,0,697,698, + 5,71,0,0,698,699,5,94,0,0,699,700,3,94,47,0,700,701,5,95,0,0,701, + 703,1,0,0,0,702,677,1,0,0,0,702,678,1,0,0,0,702,679,1,0,0,0,702, + 680,1,0,0,0,702,682,1,0,0,0,702,687,1,0,0,0,702,692,1,0,0,0,702, + 697,1,0,0,0,703,95,1,0,0,0,704,705,7,4,0,0,705,97,1,0,0,0,706,707, + 7,5,0,0,707,99,1,0,0,0,708,717,3,110,55,0,709,717,5,96,0,0,710,717, + 5,97,0,0,711,717,5,80,0,0,712,717,5,81,0,0,713,717,5,82,0,0,714, + 717,3,102,51,0,715,717,3,106,53,0,716,708,1,0,0,0,716,709,1,0,0, + 0,716,710,1,0,0,0,716,711,1,0,0,0,716,712,1,0,0,0,716,713,1,0,0, + 0,716,714,1,0,0,0,716,715,1,0,0,0,717,101,1,0,0,0,718,727,5,88,0, + 0,719,724,3,104,52,0,720,721,5,86,0,0,721,723,3,104,52,0,722,720, + 1,0,0,0,723,726,1,0,0,0,724,722,1,0,0,0,724,725,1,0,0,0,725,728, + 1,0,0,0,726,724,1,0,0,0,727,719,1,0,0,0,727,728,1,0,0,0,728,729, + 1,0,0,0,729,730,5,89,0,0,730,103,1,0,0,0,731,732,3,110,55,0,732, + 733,5,84,0,0,733,734,3,100,50,0,734,105,1,0,0,0,735,744,5,90,0,0, + 736,741,3,100,50,0,737,738,5,86,0,0,738,740,3,100,50,0,739,737,1, + 0,0,0,740,743,1,0,0,0,741,739,1,0,0,0,741,742,1,0,0,0,742,745,1, + 0,0,0,743,741,1,0,0,0,744,736,1,0,0,0,744,745,1,0,0,0,745,746,1, + 0,0,0,746,747,5,91,0,0,747,107,1,0,0,0,748,749,7,6,0,0,749,109,1, + 0,0,0,750,751,5,99,0,0,751,111,1,0,0,0,49,121,135,145,157,176,184, + 191,204,212,239,263,273,279,308,314,319,332,340,353,358,371,384, + 399,402,409,417,457,465,477,491,501,519,531,540,577,596,598,609, + 624,640,654,664,673,702,716,724,727,741,744 ]; private static __ATN: antlr.ATN; @@ -3188,12 +3391,18 @@ export class DocumentContext extends antlr.ParserRuleContext { public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { super(parent, invokingState); } - public workspaceDecl(): WorkspaceDeclContext { - return this.getRuleContext(0, WorkspaceDeclContext)!; + public workspaceDecl(): WorkspaceDeclContext | null { + return this.getRuleContext(0, WorkspaceDeclContext); } public EOF(): antlr.TerminalNode { return this.getToken(QuixosCapabilityParser.EOF, 0)!; } + public interfaceResourceDecl(): InterfaceResourceDeclContext | null { + return this.getRuleContext(0, InterfaceResourceDeclContext); + } + public packageResourceDecl(): PackageResourceDeclContext | null { + return this.getRuleContext(0, PackageResourceDeclContext); + } public override get ruleIndex(): number { return QuixosCapabilityParser.RULE_document; } @@ -3270,11 +3479,8 @@ export class WorkspaceItemContext extends antlr.ParserRuleContext { public atomDecl(): AtomDeclContext | null { return this.getRuleContext(0, AtomDeclContext); } - public interfaceDecl(): InterfaceDeclContext | null { - return this.getRuleContext(0, InterfaceDeclContext); - } - public packageDecl(): PackageDeclContext | null { - return this.getRuleContext(0, PackageDeclContext); + public resourceImportDecl(): ResourceImportDeclContext | null { + return this.getRuleContext(0, ResourceImportDeclContext); } public sharedAttachmentDecl(): SharedAttachmentDeclContext | null { return this.getRuleContext(0, SharedAttachmentDeclContext); @@ -3298,6 +3504,134 @@ export class WorkspaceItemContext extends antlr.ParserRuleContext { } +export class ResourceImportDeclContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public IMPORT(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.IMPORT, 0)!; + } + public INTERFACE(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.INTERFACE, 0); + } + public identifier(): IdentifierContext { + return this.getRuleContext(0, IdentifierContext)!; + } + public SEMI(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.SEMI, 0)!; + } + public PACKAGE(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.PACKAGE, 0); + } + public override get ruleIndex(): number { + return QuixosCapabilityParser.RULE_resourceImportDecl; + } + public override accept(visitor: QuixosCapabilityVisitor): Result | null { + if (visitor.visitResourceImportDecl) { + return visitor.visitResourceImportDecl(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class ExternalAtomDeclContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public EXTERNAL(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.EXTERNAL, 0)!; + } + public ATOM(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.ATOM, 0)!; + } + public identifier(): IdentifierContext { + return this.getRuleContext(0, IdentifierContext)!; + } + public ID(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.ID, 0)!; + } + public stringLiteral(): StringLiteralContext { + return this.getRuleContext(0, StringLiteralContext)!; + } + public SEMI(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.SEMI, 0)!; + } + public override get ruleIndex(): number { + return QuixosCapabilityParser.RULE_externalAtomDecl; + } + public override accept(visitor: QuixosCapabilityVisitor): Result | null { + if (visitor.visitExternalAtomDecl) { + return visitor.visitExternalAtomDecl(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class ExternalInterfaceDeclContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public EXTERNAL(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.EXTERNAL, 0)!; + } + public INTERFACE(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.INTERFACE, 0)!; + } + public identifier(): IdentifierContext { + return this.getRuleContext(0, IdentifierContext)!; + } + public REVISION(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.REVISION, 0)!; + } + public stringLiteral(): StringLiteralContext { + return this.getRuleContext(0, StringLiteralContext)!; + } + public SEMI(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.SEMI, 0)!; + } + public override get ruleIndex(): number { + return QuixosCapabilityParser.RULE_externalInterfaceDecl; + } + public override accept(visitor: QuixosCapabilityVisitor): Result | null { + if (visitor.visitExternalInterfaceDecl) { + return visitor.visitExternalInterfaceDecl(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class ResourcePreambleContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public resourceImportDecl(): ResourceImportDeclContext | null { + return this.getRuleContext(0, ResourceImportDeclContext); + } + public externalAtomDecl(): ExternalAtomDeclContext | null { + return this.getRuleContext(0, ExternalAtomDeclContext); + } + public externalInterfaceDecl(): ExternalInterfaceDeclContext | null { + return this.getRuleContext(0, ExternalInterfaceDeclContext); + } + public override get ruleIndex(): number { + return QuixosCapabilityParser.RULE_resourcePreamble; + } + public override accept(visitor: QuixosCapabilityVisitor): Result | null { + if (visitor.visitResourcePreamble) { + return visitor.visitResourcePreamble(this); + } else { + return visitor.visitChildren(this); + } + } +} + + export class AtomDeclContext extends antlr.ParserRuleContext { public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { super(parent, invokingState); @@ -3339,7 +3673,7 @@ export class AtomDeclContext extends antlr.ParserRuleContext { } -export class InterfaceDeclContext extends antlr.ParserRuleContext { +export class InterfaceResourceDeclContext extends antlr.ParserRuleContext { public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { super(parent, invokingState); } @@ -3364,15 +3698,21 @@ export class InterfaceDeclContext extends antlr.ParserRuleContext { public REVISION(): antlr.TerminalNode { return this.getToken(QuixosCapabilityParser.REVISION, 0)!; } - public sourceBlock(): SourceBlockContext { - return this.getRuleContext(0, SourceBlockContext)!; - } public LBRACE(): antlr.TerminalNode { return this.getToken(QuixosCapabilityParser.LBRACE, 0)!; } public RBRACE(): antlr.TerminalNode { return this.getToken(QuixosCapabilityParser.RBRACE, 0)!; } + public resourcePreamble(): ResourcePreambleContext[]; + public resourcePreamble(i: number): ResourcePreambleContext | null; + public resourcePreamble(i?: number): ResourcePreambleContext[] | ResourcePreambleContext | null { + if (i === undefined) { + return this.getRuleContexts(ResourcePreambleContext); + } + + return this.getRuleContext(i, ResourcePreambleContext); + } public interfaceMember(): InterfaceMemberContext[]; public interfaceMember(i: number): InterfaceMemberContext | null; public interfaceMember(i?: number): InterfaceMemberContext[] | InterfaceMemberContext | null { @@ -3383,61 +3723,11 @@ export class InterfaceDeclContext extends antlr.ParserRuleContext { return this.getRuleContext(i, InterfaceMemberContext); } public override get ruleIndex(): number { - return QuixosCapabilityParser.RULE_interfaceDecl; + return QuixosCapabilityParser.RULE_interfaceResourceDecl; } public override accept(visitor: QuixosCapabilityVisitor): Result | null { - if (visitor.visitInterfaceDecl) { - return visitor.visitInterfaceDecl(this); - } else { - return visitor.visitChildren(this); - } - } -} - - -export class SourceBlockContext extends antlr.ParserRuleContext { - public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { - super(parent, invokingState); - } - public SOURCE(): antlr.TerminalNode { - return this.getToken(QuixosCapabilityParser.SOURCE, 0)!; - } - public LBRACE(): antlr.TerminalNode { - return this.getToken(QuixosCapabilityParser.LBRACE, 0)!; - } - public REPOSITORY(): antlr.TerminalNode { - return this.getToken(QuixosCapabilityParser.REPOSITORY, 0)!; - } - public stringLiteral(): StringLiteralContext[]; - public stringLiteral(i: number): StringLiteralContext | null; - public stringLiteral(i?: number): StringLiteralContext[] | StringLiteralContext | null { - if (i === undefined) { - return this.getRuleContexts(StringLiteralContext); - } - - return this.getRuleContext(i, StringLiteralContext); - } - public SEMI(): antlr.TerminalNode[]; - public SEMI(i: number): antlr.TerminalNode | null; - public SEMI(i?: number): antlr.TerminalNode | null | antlr.TerminalNode[] { - if (i === undefined) { - return this.getTokens(QuixosCapabilityParser.SEMI); - } else { - return this.getToken(QuixosCapabilityParser.SEMI, i); - } - } - public COMMIT(): antlr.TerminalNode { - return this.getToken(QuixosCapabilityParser.COMMIT, 0)!; - } - public RBRACE(): antlr.TerminalNode { - return this.getToken(QuixosCapabilityParser.RBRACE, 0)!; - } - public override get ruleIndex(): number { - return QuixosCapabilityParser.RULE_sourceBlock; - } - public override accept(visitor: QuixosCapabilityVisitor): Result | null { - if (visitor.visitSourceBlock) { - return visitor.visitSourceBlock(this); + if (visitor.visitInterfaceResourceDecl) { + return visitor.visitInterfaceResourceDecl(this); } else { return visitor.visitChildren(this); } @@ -3780,7 +4070,7 @@ export class TargetConstraintContext extends antlr.ParserRuleContext { } -export class PackageDeclContext extends antlr.ParserRuleContext { +export class PackageResourceDeclContext extends antlr.ParserRuleContext { public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { super(parent, invokingState); } @@ -3805,15 +4095,21 @@ export class PackageDeclContext extends antlr.ParserRuleContext { public REVISION(): antlr.TerminalNode { return this.getToken(QuixosCapabilityParser.REVISION, 0)!; } - public sourceBlock(): SourceBlockContext { - return this.getRuleContext(0, SourceBlockContext)!; - } public LBRACE(): antlr.TerminalNode { return this.getToken(QuixosCapabilityParser.LBRACE, 0)!; } public RBRACE(): antlr.TerminalNode { return this.getToken(QuixosCapabilityParser.RBRACE, 0)!; } + public resourcePreamble(): ResourcePreambleContext[]; + public resourcePreamble(i: number): ResourcePreambleContext | null; + public resourcePreamble(i?: number): ResourcePreambleContext[] | ResourcePreambleContext | null { + if (i === undefined) { + return this.getRuleContexts(ResourcePreambleContext); + } + + return this.getRuleContext(i, ResourcePreambleContext); + } public packageExport(): PackageExportContext[]; public packageExport(i: number): PackageExportContext | null; public packageExport(i?: number): PackageExportContext[] | PackageExportContext | null { @@ -3824,11 +4120,11 @@ export class PackageDeclContext extends antlr.ParserRuleContext { return this.getRuleContext(i, PackageExportContext); } public override get ruleIndex(): number { - return QuixosCapabilityParser.RULE_packageDecl; + return QuixosCapabilityParser.RULE_packageResourceDecl; } public override accept(visitor: QuixosCapabilityVisitor): Result | null { - if (visitor.visitPackageDecl) { - return visitor.visitPackageDecl(this); + if (visitor.visitPackageResourceDecl) { + return visitor.visitPackageResourceDecl(this); } else { return visitor.visitChildren(this); } diff --git a/src/capability-language/generated/QuixosCapabilityVisitor.ts b/src/capability-language/generated/QuixosCapabilityVisitor.ts index f95efea..d21bfb9 100644 --- a/src/capability-language/generated/QuixosCapabilityVisitor.ts +++ b/src/capability-language/generated/QuixosCapabilityVisitor.ts @@ -5,9 +5,12 @@ import { AbstractParseTreeVisitor } from "antlr4ng"; import { DocumentContext } from "./QuixosCapabilityParser.js"; import { WorkspaceDeclContext } from "./QuixosCapabilityParser.js"; import { WorkspaceItemContext } from "./QuixosCapabilityParser.js"; +import { ResourceImportDeclContext } from "./QuixosCapabilityParser.js"; +import { ExternalAtomDeclContext } from "./QuixosCapabilityParser.js"; +import { ExternalInterfaceDeclContext } from "./QuixosCapabilityParser.js"; +import { ResourcePreambleContext } from "./QuixosCapabilityParser.js"; import { AtomDeclContext } from "./QuixosCapabilityParser.js"; -import { InterfaceDeclContext } from "./QuixosCapabilityParser.js"; -import { SourceBlockContext } from "./QuixosCapabilityParser.js"; +import { InterfaceResourceDeclContext } from "./QuixosCapabilityParser.js"; import { InterfaceMemberContext } from "./QuixosCapabilityParser.js"; import { OperationMemberContext } from "./QuixosCapabilityParser.js"; import { ValueMemberContext } from "./QuixosCapabilityParser.js"; @@ -15,7 +18,7 @@ import { ValueMemberOperationContext } from "./QuixosCapabilityParser.js"; import { RelationshipMemberContext } from "./QuixosCapabilityParser.js"; import { RelationshipOperationContext } from "./QuixosCapabilityParser.js"; import { TargetConstraintContext } from "./QuixosCapabilityParser.js"; -import { PackageDeclContext } from "./QuixosCapabilityParser.js"; +import { PackageResourceDeclContext } from "./QuixosCapabilityParser.js"; import { PackageExportContext } from "./QuixosCapabilityParser.js"; import { PackageOperationExportContext } from "./QuixosCapabilityParser.js"; import { PackageFunctionExportContext } from "./QuixosCapabilityParser.js"; @@ -83,6 +86,30 @@ export class QuixosCapabilityVisitor extends AbstractParseTreeVisitor Result; + /** + * Visit a parse tree produced by `QuixosCapabilityParser.resourceImportDecl`. + * @param ctx the parse tree + * @return the visitor result + */ + visitResourceImportDecl?: (ctx: ResourceImportDeclContext) => Result; + /** + * Visit a parse tree produced by `QuixosCapabilityParser.externalAtomDecl`. + * @param ctx the parse tree + * @return the visitor result + */ + visitExternalAtomDecl?: (ctx: ExternalAtomDeclContext) => Result; + /** + * Visit a parse tree produced by `QuixosCapabilityParser.externalInterfaceDecl`. + * @param ctx the parse tree + * @return the visitor result + */ + visitExternalInterfaceDecl?: (ctx: ExternalInterfaceDeclContext) => Result; + /** + * Visit a parse tree produced by `QuixosCapabilityParser.resourcePreamble`. + * @param ctx the parse tree + * @return the visitor result + */ + visitResourcePreamble?: (ctx: ResourcePreambleContext) => Result; /** * Visit a parse tree produced by `QuixosCapabilityParser.atomDecl`. * @param ctx the parse tree @@ -90,17 +117,11 @@ export class QuixosCapabilityVisitor extends AbstractParseTreeVisitor Result; /** - * Visit a parse tree produced by `QuixosCapabilityParser.interfaceDecl`. + * Visit a parse tree produced by `QuixosCapabilityParser.interfaceResourceDecl`. * @param ctx the parse tree * @return the visitor result */ - visitInterfaceDecl?: (ctx: InterfaceDeclContext) => Result; - /** - * Visit a parse tree produced by `QuixosCapabilityParser.sourceBlock`. - * @param ctx the parse tree - * @return the visitor result - */ - visitSourceBlock?: (ctx: SourceBlockContext) => Result; + visitInterfaceResourceDecl?: (ctx: InterfaceResourceDeclContext) => Result; /** * Visit a parse tree produced by `QuixosCapabilityParser.interfaceMember`. * @param ctx the parse tree @@ -144,11 +165,11 @@ export class QuixosCapabilityVisitor extends AbstractParseTreeVisitor Result; /** - * Visit a parse tree produced by `QuixosCapabilityParser.packageDecl`. + * Visit a parse tree produced by `QuixosCapabilityParser.packageResourceDecl`. * @param ctx the parse tree * @return the visitor result */ - visitPackageDecl?: (ctx: PackageDeclContext) => Result; + visitPackageResourceDecl?: (ctx: PackageResourceDeclContext) => Result; /** * Visit a parse tree produced by `QuixosCapabilityParser.packageExport`. * @param ctx the parse tree diff --git a/src/capability-language/git-resolver.ts b/src/capability-language/git-resolver.ts new file mode 100644 index 0000000..2902b57 --- /dev/null +++ b/src/capability-language/git-resolver.ts @@ -0,0 +1,86 @@ +import childProcess from "node:child_process"; +import crypto from "node:crypto"; +import { mkdir, readFile, realpath } from "node:fs/promises"; +import path from "node:path"; +import { promisify } from "node:util"; +import type { CapabilityRepositoryResolver } from "./assembly.js"; + +const execFile = promisify(childProcess.execFile); + +const sourceKey = (kind: string, repository: string, commit: string) => + `${kind}\0${repository}\0${commit.toLowerCase()}`; + +const checkoutName = (kind: string, repository: string, commit: string) => { + const digest = crypto + .createHash("sha256") + .update(sourceKey(kind, repository, commit)) + .digest("hex") + .slice(0, 24); + return `${kind}-${digest}`; +}; + +export const createGitCapabilityResolver = async (options: { + checkoutRoot: string; + snapshotMap?: string; +}): Promise => { + await mkdir(options.checkoutRoot, { recursive: true }); + const checkoutRoot = await realpath(options.checkoutRoot); + const snapshots = new Map(); + if (options.snapshotMap) { + const snapshotMapPath = await realpath(options.snapshotMap); + const document = JSON.parse(await readFile(snapshotMapPath, "utf8")) as { + resources?: Array<{ + kind: string; + repository: string; + commit: string; + directory: string; + }>; + }; + for (const entry of document.resources ?? []) { + if (entry.kind !== "interface" && entry.kind !== "package") { + throw new Error(`Snapshot map has unsupported resource kind ${entry.kind}`); + } + const key = sourceKey(entry.kind, entry.repository, entry.commit); + if (snapshots.has(key)) throw new Error(`Snapshot map repeats ${key}`); + const directory = path.resolve(path.dirname(snapshotMapPath), entry.directory); + snapshots.set(key, await realpath(directory)); + } + } + + const checkouts = new Map>(); + return async (source, kind) => { + const key = sourceKey(kind, source.repository, source.commit); + const snapshot = snapshots.get(key); + if (snapshot) return { directory: snapshot }; + const existing = checkouts.get(key); + if (existing) return await existing; + const pending = (async () => { + const directory = path.join( + checkoutRoot, + checkoutName(kind, source.repository, source.commit), + ); + await execFile("git", [ + "-c", + "advice.detachedHead=false", + "clone", + "--depth", + "1", + "--single-branch", + "--branch", + `quixos-reachability/${source.commit.toLowerCase()}`, + source.repository, + directory, + ]); + const { stdout } = await execFile("git", ["-C", directory, "rev-parse", "HEAD"]); + if (stdout.trim().toLowerCase() !== source.commit.toLowerCase()) { + throw new Error( + `Locked commit mismatch for ${source.repository}: ` + + `wanted ${source.commit}, fetched ${stdout.trim()}`, + ); + } + return { directory }; + })(); + checkouts.set(key, pending); + return await pending; + }; +}; diff --git a/src/capability-language/index.ts b/src/capability-language/index.ts index 32f5645..472be63 100644 --- a/src/capability-language/index.ts +++ b/src/capability-language/index.ts @@ -1 +1,2 @@ export * from "./parser.js"; +export * from "./assembly.js"; diff --git a/src/capability-language/parser.ts b/src/capability-language/parser.ts index 7a25071..d47110c 100644 --- a/src/capability-language/parser.ts +++ b/src/capability-language/parser.ts @@ -27,6 +27,7 @@ import { type InterfaceOperation, type InterfaceOperationMode, type InterfaceRevision, + type AtomDefinition, type PackageExport, type PackageReceiverRequirement, type PackageRevision, @@ -43,15 +44,19 @@ import { QuixosCapabilityParser, type ConformanceDeclContext, type DependencyBindingBlockContext, type DependencyPortContext, + type DocumentContext, type EdgeDeclContext, type EdgeEndpointContext, - type InterfaceDeclContext, + type ExternalAtomDeclContext, + type ExternalInterfaceDeclContext, + type InterfaceResourceDeclContext, type PackageConstructorExportContext, - type PackageDeclContext, + type PackageResourceDeclContext, type PackageFunctionExportContext, type PackageOperationExportContext, type OperationMemberContext, - type SourceBlockContext, + type ResourceImportDeclContext, + type ResourcePreambleContext, type StateDeclContext, type TargetConstraintContext, type ValueMemberContext, @@ -61,6 +66,50 @@ import { QuixosCapabilityParser, type WorkspaceDeclContext, } from "./generated/QuixosCapabilityParser.js"; +export type CapabilityResourceKind = "interface" | "package"; + +export type CapabilityResourceImport = { + kind: CapabilityResourceKind; + binding: string; +}; + +export type CapabilityExternalInterface = { + binding: string; + revisionId: InterfaceRevision["revisionId"]; +}; + +export type CapabilityImportEnvironment = { + interfaces?: ReadonlyMap; + packages?: ReadonlyMap; + /** Complete resolved closure; direct maps above provide local authoring names. */ + interfaceClosure?: readonly InterfaceRevision[]; + packageClosure?: readonly PackageRevision[]; + /** External nominal atoms required by imported resources. */ + externalAtoms?: readonly AtomDefinition[]; + /** External nominal interfaces supplied by the importing workspace. */ + externalInterfaces?: readonly CapabilityExternalInterface[]; +}; + +export type CapabilityResource = + | { + kind: "interface"; + imports: CapabilityResourceImport[]; + externalAtoms: AtomDefinition[]; + externalInterfaces: CapabilityExternalInterface[]; + revision: InterfaceRevision; + } + | { + kind: "package"; + imports: CapabilityResourceImport[]; + externalAtoms: AtomDefinition[]; + externalInterfaces: CapabilityExternalInterface[]; + revision: PackageRevision; + }; + +export type CapabilityResourceCompileResult = + | { ok: true; resource: CapabilityResource; diagnostics: [] } + | { ok: false; diagnostics: CapabilitySourceDiagnostic[] }; + export type CapabilitySourceDiagnosticPhase = | "syntax" | "lowering" @@ -81,6 +130,7 @@ export type CapabilitySourceCompileResult = ok: true; workspace: WorkspaceRevision; plan: CompiledWorkspaceRevision; + imports: CapabilityResourceImport[]; diagnostics: []; } | { @@ -90,6 +140,7 @@ export type CapabilitySourceCompileResult = interface InterfaceSymbol { revisionId: InterfaceRevision["revisionId"]; + contractAvailable: boolean; members: Map< string, { @@ -220,11 +271,6 @@ const requireSymbol = ( return value; }; -const lowerSource = (context: SourceBlockContext): SourceRevision => ({ - repository: stringValue(context.stringLiteral(0)), - commit: stringValue(context.stringLiteral(1)), -}); - const lowerCardinality = ( context: { getText(): string } | null, ): EdgeCardinality => text(context) as EdgeCardinality; @@ -534,7 +580,8 @@ const lowerOperationMember = ( const lowerInterface = ( state: LoweringState, - context: InterfaceDeclContext, + context: InterfaceResourceDeclContext, + source: SourceRevision, ): InterfaceRevision => { const alias = identifier(context.identifier()); const members = context.interfaceMember().flatMap((entry) => { @@ -572,7 +619,7 @@ const lowerInterface = ( interfaceId: capabilityId.interface(stringValue(context.stringLiteral(0))), revisionId: symbol.revisionId, displayName: alias, - source: lowerSource(context.sourceBlock()), + source, members, }; }; @@ -652,12 +699,21 @@ const lowerDependencyPort = ( context, "interface", ); + if (target && !target.contractAvailable) { + loweringIssue( + state, + context, + "nominal-interface-port", + `Interface port ${name} needs the full ${targetName} contract; use import interface ${targetName}`, + ); + return undefined; + } return target ? { id, displayName: name, requirement: { - kind: "receiver-interface", + kind: "interface", interfaceRevisionId: target.revisionId, }, } @@ -815,7 +871,8 @@ const lowerPackageConstructor = ( const lowerPackage = ( state: LoweringState, - context: PackageDeclContext, + context: PackageResourceDeclContext, + source: SourceRevision, ): PackageRevision => { const alias = identifier(context.identifier()); const exports = context.packageExport().map((exportContext) => { @@ -837,7 +894,7 @@ const lowerPackage = ( packageId: capabilityId.package(stringValue(context.stringLiteral(0))), revisionId: state.packages.get(alias)!.revisionId, displayName: alias, - source: lowerSource(context.sourceBlock()), + source, exports, }; }; @@ -1064,7 +1121,7 @@ const lowerBoundDependencies = ( binding: { kind: "state", slotId: attachment.attachment.id, ...(via ? { via } : {}) }, }]; } - if (entry.EDGE(0)) { + if (entry.EDGE(0) && !entry.INTERFACE()) { const attachmentName = identifier(entry.identifier(1)); const projectionName = identifier(entry.identifier(2)); const attachment = requireSymbol( @@ -1119,13 +1176,18 @@ const lowerBoundDependencies = ( entry, "interface", ); + const via = entry.VIA() + ? traversal(identifier(entry.identifier(2)), identifier(entry.identifier(3))) + : undefined; + if (entry.VIA() && !via) return []; return interfaceSymbol ? [ { portId, binding: { - kind: "receiver-interface", + kind: "interface", interfaceRevisionId: interfaceSymbol.revisionId, + ...(via ? { via } : {}), }, }, ] @@ -1349,10 +1411,117 @@ const lowerConformance = ( }; }; +const interfaceSymbolFor = (revision: InterfaceRevision): InterfaceSymbol => ({ + revisionId: revision.revisionId, + contractAvailable: true, + members: new Map(revision.members.map((member) => [ + member.displayName, + { + memberId: member.id, + operations: new Map(member.operations.map((operation) => [ + operation.displayName, + operation.id, + ])), + }, + ])), +}); + +const packageSymbolFor = (revision: PackageRevision): PackageSymbol => ({ + revisionId: revision.revisionId, + exports: new Map(revision.exports.map((entry) => [ + entry.displayName, + { + exportId: entry.id, + ports: new Map(entry.dependencyPorts.map((port) => [ + port.displayName, + port.id, + ])), + }, + ])), +}); + +const resourceImport = ( + context: ResourceImportDeclContext, +): CapabilityResourceImport => ({ + kind: context.INTERFACE() ? "interface" : "package", + binding: identifier(context.identifier()), +}); + +const registerImports = ( + state: LoweringState, + contexts: readonly ResourceImportDeclContext[], + environment: CapabilityImportEnvironment, +) => contexts.map((context) => { + const imported = resourceImport(context); + if (imported.kind === "interface") { + const revision = environment.interfaces?.get(imported.binding); + if (!revision) { + loweringIssue( + state, + context, + "missing-import", + `No resolved interface is available for lock binding ${imported.binding}`, + ); + } else { + declareSymbol( + state, + state.interfaces, + imported.binding, + interfaceSymbolFor(revision), + context, + "interface", + ); + } + } else { + const revision = environment.packages?.get(imported.binding); + if (!revision) { + loweringIssue( + state, + context, + "missing-import", + `No resolved package is available for lock binding ${imported.binding}`, + ); + } else { + declareSymbol( + state, + state.packages, + imported.binding, + packageSymbolFor(revision), + context, + "package", + ); + } + } + return imported; +}); + +const uniqueExactRevisions = (revisions: readonly Revision[]): Revision[] => { + const seen = new Set(); + return revisions.filter((revision) => { + const key = `${revision.revisionId}\0${revision.source.repository}\0${revision.source.commit}`; + if (seen.has(key)) return false; + seen.add(key); + return true; + }); +}; + +const uniqueAtoms = (atoms: readonly AtomDefinition[]): AtomDefinition[] => { + const seen = new Set(); + return atoms.filter((atom) => { + if (seen.has(atom.id)) return false; + seen.add(atom.id); + return true; + }); +}; + const lowerWorkspace = ( state: LoweringState, context: WorkspaceDeclContext, -): WorkspaceRevision => { + environment: CapabilityImportEnvironment, +): { workspace: WorkspaceRevision; imports: CapabilityResourceImport[] } => { const items = context.workspaceItem(); for (const item of items) { @@ -1368,41 +1537,14 @@ const lowerWorkspace = ( ); continue; } - const interfaceContext = item.interfaceDecl(); - if (interfaceContext) { - declareSymbol( - state, - state.interfaces, - identifier(interfaceContext.identifier()), - { - revisionId: capabilityId.interfaceRevision( - stringValue(interfaceContext.stringLiteral(1)), - ), - members: new Map(), - }, - interfaceContext, - "interface", - ); - continue; - } - const packageContext = item.packageDecl(); - if (packageContext) { - declareSymbol( - state, - state.packages, - identifier(packageContext.identifier()), - { - revisionId: capabilityId.packageRevision( - stringValue(packageContext.stringLiteral(1)), - ), - exports: new Map(), - }, - packageContext, - "package", - ); - } } + const imports = registerImports( + state, + items.flatMap((item) => item.resourceImportDecl() ?? []), + environment, + ); + const atoms = items.flatMap((item) => { const atom = item.atomDecl(); if (!atom) { @@ -1422,15 +1564,15 @@ const lowerWorkspace = ( : []; }); - const interfaceImports = items.flatMap((item) => { - const interfaceContext = item.interfaceDecl(); - return interfaceContext ? [lowerInterface(state, interfaceContext)] : []; - }); + const interfaceImports = uniqueExactRevisions([ + ...(environment.interfaceClosure ?? []), + ...[...(environment.interfaces?.values() ?? [])], + ]); - const packageImports = items.flatMap((item) => { - const packageContext = item.packageDecl(); - return packageContext ? [lowerPackage(state, packageContext)] : []; - }); + const packageImports = uniqueExactRevisions([ + ...(environment.packageClosure ?? []), + ...[...(environment.packages?.values() ?? [])], + ]); const sharedAttachments: PersistentAttachment[] = []; const privateAttachments = new Map< @@ -1520,23 +1662,26 @@ const lowerWorkspace = ( }); return { - id: capabilityId.workspaceRevision(stringValue(context.stringLiteral(1))), - workspaceId: capabilityId.workspace(stringValue(context.stringLiteral(0))), - parentRevisionIds: [], - sourceRootCommit: stringValue(context.stringLiteral(2)), - atoms, - sharedAttachments, - interfaceImports, - packageImports, - conformances, - constructors, + imports, + workspace: { + id: capabilityId.workspaceRevision(stringValue(context.stringLiteral(1))), + workspaceId: capabilityId.workspace(stringValue(context.stringLiteral(0))), + parentRevisionIds: [], + sourceRootCommit: stringValue(context.stringLiteral(2)), + atoms, + sharedAttachments, + interfaceImports, + packageImports, + conformances, + constructors, + }, }; }; -export const compileCapabilitySource = ( +const parseDocument = ( source: string, - fileName = "", -): CapabilitySourceCompileResult => { + fileName: string, +): { tree: DocumentContext; diagnostics: CapabilitySourceDiagnostic[] } => { const diagnostics: CapabilitySourceDiagnostic[] = []; const listener = new SyntaxErrorListener(fileName, diagnostics); const lexer = new QuixosCapabilityLexer(CharStream.fromString(source)); @@ -1548,36 +1693,274 @@ export const compileCapabilitySource = ( parser.removeErrorListeners(); parser.addErrorListener(listener); const tree = parser.document(); + return { tree, diagnostics }; +}; + +const newLoweringState = ( + fileName: string, + diagnostics: CapabilitySourceDiagnostic[], +): LoweringState => ({ + fileName, + diagnostics, + atoms: new Map(), + interfaces: new Map(), + packages: new Map(), + attachments: new Map(), +}); + +const validationDiagnostics = ( + fileName: string, + issues: ReturnType extends infer _Result + ? Array<{ code: string; message: string; path: string }> + : never, +): CapabilitySourceDiagnostic[] => issues.map((entry) => ({ + phase: "validation", + code: entry.code, + message: entry.message, + fileName, + line: 0, + column: 0, + path: entry.path, +})); + +const externalAtomsFrom = ( + state: LoweringState, + contexts: readonly ExternalAtomDeclContext[], +): AtomDefinition[] => contexts.map((context) => { + const atom: AtomDefinition = { + id: capabilityId.atom(stringValue(context.stringLiteral())), + displayName: identifier(context.identifier()), + }; + declareSymbol( + state, + state.atoms, + atom.displayName, + atom.id, + context, + "external atom", + ); + return atom; +}); + +const externalInterfacesFrom = ( + state: LoweringState, + contexts: readonly ExternalInterfaceDeclContext[], +): CapabilityExternalInterface[] => contexts.map((context) => { + const requirement: CapabilityExternalInterface = { + binding: identifier(context.identifier()), + revisionId: capabilityId.interfaceRevision(stringValue(context.stringLiteral())), + }; + declareSymbol( + state, + state.interfaces, + requirement.binding, + { + revisionId: requirement.revisionId, + contractAvailable: false, + members: new Map(), + }, + context, + "external interface", + ); + return requirement; +}); + +const resourcePreambleParts = (contexts: readonly ResourcePreambleContext[]) => ({ + imports: contexts.flatMap((context) => context.resourceImportDecl() ?? []), + atoms: contexts.flatMap((context) => context.externalAtomDecl() ?? []), + interfaces: contexts.flatMap((context) => context.externalInterfaceDecl() ?? []), +}); + +const resourceValidationWorkspace = ( + resource: CapabilityResource, + environment: CapabilityImportEnvironment, +): WorkspaceRevision => { + const resolvedInterfaceIds = new Set([ + ...(environment.interfaceClosure ?? []).map((revision) => revision.revisionId), + ...[...(environment.interfaces?.values() ?? [])].map((revision) => revision.revisionId), + ...(resource.kind === "interface" ? [resource.revision.revisionId] : []), + ]); + return ({ + id: capabilityId.workspaceRevision("workspace-revision:resource-validation"), + workspaceId: capabilityId.workspace("workspace:resource-validation"), + parentRevisionIds: [], + sourceRootCommit: resource.revision.source.commit, + atoms: uniqueAtoms([ + ...(environment.externalAtoms ?? []), + ...resource.externalAtoms, + ]), + sharedAttachments: [], + interfaceImports: uniqueExactRevisions([ + ...(environment.interfaceClosure ?? []), + ...[...(environment.interfaces?.values() ?? [])], + ...(resource.kind === "interface" ? [resource.revision] : []), + ...resource.externalInterfaces + .filter((requirement) => !resolvedInterfaceIds.has(requirement.revisionId)) + .map((requirement): InterfaceRevision => ({ + interfaceId: capabilityId.interface(`external:${requirement.revisionId}`), + revisionId: requirement.revisionId, + displayName: requirement.binding, + source: { + repository: `https://external.invalid/${encodeURIComponent(requirement.revisionId)}.git`, + commit: "0".repeat(40), + }, + members: [], + })), + ]), + packageImports: uniqueExactRevisions([ + ...(environment.packageClosure ?? []), + ...[...(environment.packages?.values() ?? [])], + ...(resource.kind === "package" ? [resource.revision] : []), + ]), + conformances: [], + constructors: [], + }); +}; + +export const compileCapabilityResourceSource = ( + sourceText: string, + options: { + source: SourceRevision; + fileName?: string; + environment?: CapabilityImportEnvironment; + }, +): CapabilityResourceCompileResult => { + const fileName = options.fileName ?? ""; + const environment = options.environment ?? {}; + const { tree, diagnostics } = parseDocument(sourceText, fileName); if (diagnostics.length > 0) { return { ok: false, diagnostics }; } - const state: LoweringState = { - fileName, - diagnostics, - atoms: new Map(), - interfaces: new Map(), - packages: new Map(), - attachments: new Map(), - }; - const workspace = lowerWorkspace(state, tree.workspaceDecl()); + const interfaceContext = tree.interfaceResourceDecl(); + const packageContext = tree.packageResourceDecl(); + if (!interfaceContext && !packageContext) { + return { + ok: false, + diagnostics: [{ + phase: "lowering", + code: "expected-resource", + message: "Expected a standalone interface or package resource document", + fileName, + line: 1, + column: 0, + }], + }; + } + + const state = newLoweringState(fileName, diagnostics); + const preamble = resourcePreambleParts( + (interfaceContext ?? packageContext)!.resourcePreamble(), + ); + const externalAtoms = externalAtomsFrom(state, preamble.atoms); + const imports = registerImports(state, preamble.imports, environment); + const externalInterfaces = externalInterfacesFrom(state, preamble.interfaces); + + let resource: CapabilityResource; + if (interfaceContext) { + const alias = identifier(interfaceContext.identifier()); + declareSymbol( + state, + state.interfaces, + alias, + { + revisionId: capabilityId.interfaceRevision( + stringValue(interfaceContext.stringLiteral(1)), + ), + contractAvailable: true, + members: new Map(), + }, + interfaceContext, + "interface", + ); + resource = { + kind: "interface", + imports, + externalAtoms, + externalInterfaces, + revision: lowerInterface(state, interfaceContext, options.source), + }; + } else { + const context = packageContext!; + const alias = identifier(context.identifier()); + declareSymbol( + state, + state.packages, + alias, + { + revisionId: capabilityId.packageRevision( + stringValue(context.stringLiteral(1)), + ), + exports: new Map(), + }, + context, + "package", + ); + resource = { + kind: "package", + imports, + externalAtoms, + externalInterfaces, + revision: lowerPackage(state, context, options.source), + }; + } + if (diagnostics.length > 0) { return { ok: false, diagnostics }; } - const compiled = compileWorkspaceRevision(workspace); + const compiled = compileWorkspaceRevision( + resourceValidationWorkspace(resource, environment), + ); if (!compiled.ok) { return { ok: false, - diagnostics: compiled.issues.map((entry) => ({ - phase: "validation", - code: entry.code, - message: entry.message, - fileName, - line: 0, - column: 0, - path: entry.path, - })), + diagnostics: validationDiagnostics(fileName, compiled.issues), }; } - return { ok: true, workspace, plan: compiled.plan, diagnostics: [] }; + return { ok: true, resource, diagnostics: [] }; +}; + +export const compileCapabilitySource = ( + source: string, + fileName = "", + environment: CapabilityImportEnvironment = {}, +): CapabilitySourceCompileResult => { + const { tree, diagnostics } = parseDocument(source, fileName); + if (diagnostics.length > 0) { + return { ok: false, diagnostics }; + } + const workspaceContext = tree.workspaceDecl(); + if (!workspaceContext) { + return { + ok: false, + diagnostics: [{ + phase: "lowering", + code: "expected-workspace", + message: "Expected a workspace document", + fileName, + line: 1, + column: 0, + }], + }; + } + + const state = newLoweringState(fileName, diagnostics); + const lowered = lowerWorkspace(state, workspaceContext, environment); + if (diagnostics.length > 0) { + return { ok: false, diagnostics }; + } + const compiled = compileWorkspaceRevision(lowered.workspace); + if (!compiled.ok) { + return { + ok: false, + diagnostics: validationDiagnostics(fileName, compiled.issues), + }; + } + return { + ok: true, + workspace: lowered.workspace, + plan: compiled.plan, + imports: lowered.imports, + diagnostics: [], + }; }; diff --git a/src/capability-language/resource-cli.ts b/src/capability-language/resource-cli.ts new file mode 100644 index 0000000..55ec4e4 --- /dev/null +++ b/src/capability-language/resource-cli.ts @@ -0,0 +1,101 @@ +#!/usr/bin/env node + +import { writeFile } from "node:fs/promises"; +import process from "node:process"; +import { + compileCapabilityResourceRepository, + type ResolvedCapabilityResource, +} from "./assembly.js"; +import { createGitCapabilityResolver } from "./git-resolver.js"; + +const usage = `usage: quixos-resource-compile --root DIRECTORY --kind interface|package + --repository URL --commit GIT_REV --checkout-root DIRECTORY + [--snapshot-map PATH] [--graph-out PATH] + +Resolves a standalone resource's recursive dependency-lock graph, validates +its interface.qx or package.qx manifest, and emits the checked resource as JSON.`; + +const parseArgs = (args: string[]) => { + const values = new Map(); + for (let index = 0; index < args.length; index += 2) { + const key = args[index]; + const value = args[index + 1]; + if (!key?.startsWith("--") || !value) throw new Error(usage); + values.set(key, value); + } + const rootDirectory = values.get("--root"); + const kind = values.get("--kind"); + const repository = values.get("--repository"); + const commit = values.get("--commit")?.toLowerCase(); + const checkoutRoot = values.get("--checkout-root"); + if (!rootDirectory || !repository || !commit || !checkoutRoot || + (kind !== "interface" && kind !== "package")) { + throw new Error(usage); + } + if (!/^([0-9a-f]{40}|[0-9a-f]{64})$/.test(commit)) { + throw new Error("--commit must be a full Git object ID"); + } + return { + rootDirectory, + kind, + repository, + commit, + checkoutRoot, + snapshotMap: values.get("--snapshot-map"), + graphOut: values.get("--graph-out"), + } as const; +}; + +const graphEntry = (node: ResolvedCapabilityResource) => ({ + key: node.key, + kind: node.kind, + source: node.source, + directory: node.directory, + resourceId: node.resource.kind === "interface" + ? node.resource.revision.interfaceId + : node.resource.revision.packageId, + revisionId: node.resource.revision.revisionId, + dependencies: [...node.dependencies.entries()].map(([binding, dependency]) => ({ + binding, + resourceKey: dependency.key, + })), +}); + +const main = async () => { + if (process.argv.includes("--help") || process.argv.includes("-h")) { + process.stdout.write(`${usage}\n`); + return; + } + const options = parseArgs(process.argv.slice(2)); + const resolveResource = await createGitCapabilityResolver({ + checkoutRoot: options.checkoutRoot, + snapshotMap: options.snapshotMap, + }); + const compiled = await compileCapabilityResourceRepository({ + rootDirectory: options.rootDirectory, + kind: options.kind, + source: { + resolver: "git", + repository: options.repository, + commit: options.commit, + }, + resolveResource, + }); + if (options.graphOut) { + await writeFile(options.graphOut, `${JSON.stringify({ + formatVersion: 1, + quixos: compiled.lock.quixos, + root: graphEntry(compiled.resources.find((node) => + node.source.repository === options.repository && + node.source.commit === options.commit && + node.kind === options.kind)!), + resources: compiled.resources.map(graphEntry), + }, null, 2)}\n`); + } + process.stdout.write(`${JSON.stringify(compiled.resource, null, 2)}\n`); +}; + +main().catch((error: unknown) => { + process.stderr.write(`${error instanceof Error ? error.stack ?? error.message : String(error)}\n`); + process.exitCode = 1; +}); diff --git a/src/capability-language/workspace-cli.ts b/src/capability-language/workspace-cli.ts new file mode 100644 index 0000000..178b8d7 --- /dev/null +++ b/src/capability-language/workspace-cli.ts @@ -0,0 +1,86 @@ +#!/usr/bin/env node + +import { writeFile } from "node:fs/promises"; +import process from "node:process"; +import { compileWorkspaceRepository } from "./assembly.js"; +import { createGitCapabilityResolver } from "./git-resolver.js"; + +const usage = `usage: quixos-workspace-compile --root DIRECTORY --checkout-root DIRECTORY + [--snapshot-map PATH] [--graph-out PATH] [--workspace-id ID] [--workspace-revision-id ID] + [--source-root-commit GIT_REV] + +Resolves a workspace's recursive resource-lock graph, clones every exact +resource revision, validates standalone interface/package manifests, and emits +the checked workspace plan as JSON.`; + +const parseArgs = (args: string[]) => { + const values = new Map(); + for (let index = 0; index < args.length; index += 2) { + const key = args[index]; + const value = args[index + 1]; + if (!key?.startsWith("--") || !value) throw new Error(usage); + values.set(key, value); + } + const rootDirectory = values.get("--root"); + const checkoutRoot = values.get("--checkout-root"); + if (!rootDirectory || !checkoutRoot) throw new Error(usage); + return { + rootDirectory, + checkoutRoot, + graphOut: values.get("--graph-out"), + snapshotMap: values.get("--snapshot-map"), + workspaceId: values.get("--workspace-id"), + workspaceRevisionId: values.get("--workspace-revision-id"), + sourceRootCommit: values.get("--source-root-commit"), + }; +}; + +const main = async () => { + if (process.argv.includes("--help") || process.argv.includes("-h")) { + process.stdout.write(`${usage}\n`); + return; + } + const options = parseArgs(process.argv.slice(2)); + const resolveResource = await createGitCapabilityResolver({ + checkoutRoot: options.checkoutRoot, + snapshotMap: options.snapshotMap, + }); + const assembled = await compileWorkspaceRepository({ + rootDirectory: options.rootDirectory, + workspaceId: options.workspaceId, + workspaceRevisionId: options.workspaceRevisionId, + sourceRootCommit: options.sourceRootCommit, + resolveResource, + }); + + if (options.graphOut) { + await writeFile(options.graphOut, `${JSON.stringify({ + formatVersion: 1, + quixos: assembled.lock.quixos, + directResources: [...assembled.directResources.entries()].map(([bindingKey, node]) => { + const [kind, binding] = bindingKey.split("\0"); + return { kind, binding, resourceKey: node.key, directory: node.directory }; + }), + resources: assembled.resources.map((node) => ({ + key: node.key, + kind: node.kind, + source: node.source, + directory: node.directory, + resourceId: node.resource.kind === "interface" + ? node.resource.revision.interfaceId + : node.resource.revision.packageId, + revisionId: node.resource.revision.revisionId, + dependencies: [...node.dependencies.entries()].map(([binding, dependency]) => ({ + binding, + resourceKey: dependency.key, + })), + })), + }, null, 2)}\n`); + } + process.stdout.write(`${JSON.stringify(assembled.workspace, null, 2)}\n`); +}; + +main().catch((error: unknown) => { + process.stderr.write(`${error instanceof Error ? error.stack ?? error.message : String(error)}\n`); + process.exitCode = 1; +}); diff --git a/src/capability-model/types.ts b/src/capability-model/types.ts index 18d8b78..2cc0918 100644 --- a/src/capability-model/types.ts +++ b/src/capability-model/types.ts @@ -242,7 +242,7 @@ export type DependencyPortRequirement = primitives: EdgePrimitive[]; } | { - kind: "receiver-interface"; + kind: "interface"; interfaceRevisionId: InterfaceRevisionId; } | { kind: "constructor"; atomId: AtomId }; @@ -299,8 +299,9 @@ export type DependencyBinding = via?: EdgeTraversal; } | { - kind: "receiver-interface"; + kind: "interface"; interfaceRevisionId: InterfaceRevisionId; + via?: EdgeTraversal; } | { kind: "constructor"; atomId: AtomId }; diff --git a/src/capability-model/validation.ts b/src/capability-model/validation.ts index 01f99b3..0d87978 100644 --- a/src/capability-model/validation.ts +++ b/src/capability-model/validation.ts @@ -61,7 +61,7 @@ export type CapabilityValidationIssueCode = | "invalid-dependency-binding" | "private-attachment-access" | "incompatible-package-receiver" - | "unsatisfied-receiver-interface" + | "unsatisfied-interface" | "cyclic-conformance-requirement" | "missing-operation-binding" | "unknown-operation-binding" @@ -917,7 +917,7 @@ const validatePackages = ( validateConstraint(issues, port.requirement.target, `${portPath}.requirement.target`, indexes); uniquePrimitiveList(issues, port.requirement.primitives, `${portPath}.requirement.primitives`); break; - case "receiver-interface": + case "interface": if (!indexes.interfaces.has(port.requirement.interfaceRevisionId)) { issue( issues, @@ -976,6 +976,7 @@ const validateTraversal = ( atomId: AtomId, traversal: { edgeTypeId: EdgeTypeId; projectionId: EdgeProjectionId }, path: string, + conformance?: Pick, ) => { const attachment = findAttachment(indexes, "edge", traversal.edgeTypeId); if (!attachment || attachment.attachment.kind !== "edge") { @@ -987,6 +988,7 @@ const validateTraversal = ( ); return undefined; } + validateAttachmentAccess(issues, attachment, conformance, `${path}.edgeTypeId`); const projection = edgeProjection(attachment.attachment, traversal.projectionId); if (!projection) { issue( @@ -1085,6 +1087,7 @@ const validateBoundDependencies = ( params.atomId, stateBinding.via, `${path}.binding.via`, + params.conformance, ) : undefined; if ( @@ -1145,6 +1148,7 @@ const validateBoundDependencies = ( params.atomId, edgeBinding.via, `${path}.binding.via`, + params.conformance, ) : undefined; const originMatches = edgeBinding.via @@ -1189,10 +1193,10 @@ const validateBoundDependencies = ( } break; } - case "receiver-interface": { + case "interface": { const interfaceBinding = binding as Extract< DependencyBinding, - { kind: "receiver-interface" } + { kind: "interface" } >; if (interfaceBinding.interfaceRevisionId !== requirement.interfaceRevisionId) { issue( @@ -1203,16 +1207,38 @@ const validateBoundDependencies = ( ); break; } - const targetKey = conformanceKey(params.atomId, requirement.interfaceRevisionId); - if (!params.indexes.conformances.has(targetKey)) { - issue( - issues, - "unsatisfied-receiver-interface", - `${path}.binding.interfaceRevisionId`, - `Receiver atom ${params.atomId} does not conform to ${requirement.interfaceRevisionId}`, - ); - } else if (params.graphSourceKey) { - params.requirementGraph.get(params.graphSourceKey)?.add(targetKey); + const traversal = interfaceBinding.via + ? validateTraversal( + issues, + params.indexes, + params.atomId, + interfaceBinding.via, + `${path}.binding.via`, + params.conformance, + ) + : undefined; + const candidateAtoms = interfaceBinding.via + ? traversal + ? [...params.indexes.atoms.keys()].filter((atomId) => + atomSatisfiesConstraint( + atomId as AtomId, + traversal.target.constraint, + params.indexes.conformances, + )) as AtomId[] + : [] + : [params.atomId]; + for (const atomId of candidateAtoms) { + const targetKey = conformanceKey(atomId, requirement.interfaceRevisionId); + if (!params.indexes.conformances.has(targetKey)) { + issue( + issues, + "unsatisfied-interface", + `${path}.binding.interfaceRevisionId`, + `${interfaceBinding.via ? "Related" : "Receiver"} atom ${atomId} does not conform to ${requirement.interfaceRevisionId}`, + ); + } else if (params.graphSourceKey) { + params.requirementGraph.get(params.graphSourceKey)?.add(targetKey); + } } break; } @@ -1276,7 +1302,7 @@ const validatePackageReceiver = ( if (!params.indexes.conformances.has(targetKey)) { issue( issues, - "unsatisfied-receiver-interface", + "unsatisfied-interface", params.path, `Atom ${params.atomId} does not conform to ${requiredInterface}`, ); @@ -1971,6 +1997,9 @@ export const computeCapabilityClosure = ( const constructors = new Set(); const queued = [...roots]; const visited = new Set(); + const sourceConformances = new Map( + [...plan.conformances].map(([key, value]) => [key, value.source]), + ); const includeDependencies = ( atomId: AtomId, @@ -1990,12 +2019,38 @@ export const computeCapabilityClosure = ( attachments.add(dependency.binding.via.edgeTypeId); } break; - case "receiver-interface": - queued.push({ - atomId, - interfaceRevisionId: dependency.binding.interfaceRevisionId, - }); + case "interface": { + if (dependency.binding.via) { + attachments.add(dependency.binding.via.edgeTypeId); + } + const targetAtoms = dependency.binding.via + ? (() => { + const attachment = plan.attachments.get( + `edge\u0000${dependency.binding.via!.edgeTypeId}`, + )?.attachment; + if (!attachment || attachment.kind !== "edge") return []; + const projection = edgeProjection( + attachment, + dependency.binding.via!.projectionId, + ); + return projection + ? [...plan.atoms.keys()].filter((candidate) => + atomSatisfiesConstraint( + candidate, + projection.target.constraint, + sourceConformances, + )) + : []; + })() + : [atomId]; + for (const targetAtom of targetAtoms) { + queued.push({ + atomId: targetAtom, + interfaceRevisionId: dependency.binding.interfaceRevisionId, + }); + } break; + } case "constructor": { constructors.add(dependency.binding.atomId); const constructor = plan.constructors.get(dependency.binding.atomId); diff --git a/src/gen/quixos/orch_pb.ts b/src/gen/quixos/orch_pb.ts index 7077fe8..01117f0 100644 --- a/src/gen/quixos/orch_pb.ts +++ b/src/gen/quixos/orch_pb.ts @@ -18,7 +18,7 @@ import type { Message } from "@bufbuild/protobuf"; * Describes the file quixos/orch.proto. */ export const file_quixos_orch: GenFile = /*@__PURE__*/ - fileDesc("ChFxdWl4b3Mvb3JjaC5wcm90bxILcXVpeG9zLm9yY2gipQEKFkNvbnN0cnVjdE9iamVjdFJlcXVlc3QSDwoHYXRvbV9pZBgBIAEoCRI9CgVpbnB1dBgCIAMoCzIuLnF1aXhvcy5vcmNoLkNvbnN0cnVjdE9iamVjdFJlcXVlc3QuSW5wdXRFbnRyeRo7CgpJbnB1dEVudHJ5EgsKA2tleRgBIAEoCRIcCgV2YWx1ZRgCIAEoCzINLmNhbWluby5WYWx1ZToCOAEiPwoXQ29uc3RydWN0T2JqZWN0UmVzcG9uc2USJAoGb2JqZWN0GAEgASgLMhQuY2FtaW5vLkNhbWlub09iamVjdCJtCiZSZXNvbHZlT3JDb25zdHJ1Y3RSZWxhdGVkT2JqZWN0UmVxdWVzdBIRCglvYmplY3RfaWQYASABKAkSHQoVaW50ZXJmYWNlX3JldmlzaW9uX2lkGAIgASgJEhEKCW1lbWJlcl9pZBgDIAEoCSJkCidSZXNvbHZlT3JDb25zdHJ1Y3RSZWxhdGVkT2JqZWN0UmVzcG9uc2USJAoGb2JqZWN0GAEgASgLMhQuY2FtaW5vLkNhbWlub09iamVjdBITCgtjb25zdHJ1Y3RlZBgCIAEoCCLwAQoXSW52b2tlQ2FwYWJpbGl0eVJlcXVlc3QSKQoKY2FwYWJpbGl0eRgBIAEoCzIVLnF1aXhvcy5DYXBhYmlsaXR5UmVmEhEKCW9iamVjdF9pZBgCIAEoCRI+CgVpbnB1dBgDIAMoCzIvLnF1aXhvcy5vcmNoLkludm9rZUNhcGFiaWxpdHlSZXF1ZXN0LklucHV0RW50cnkSGgoSY2xpZW50X211dGF0aW9uX2lkGAQgASgJGjsKCklucHV0RW50cnkSCwoDa2V5GAEgASgJEhwKBXZhbHVlGAIgASgLMg0uY2FtaW5vLlZhbHVlOgI4ASKYAQoYSW52b2tlQ2FwYWJpbGl0eVJlc3BvbnNlEhUKDWludm9jYXRpb25faWQYASABKAkSKwoKYWN0aXZhdGlvbhgCIAEoCzIXLnF1aXhvcy5vcmNoLkFjdGl2YXRpb24SCgoCb2sYAyABKAgSHQoGcmVzdWx0GAQgASgLMg0uY2FtaW5vLlZhbHVlEg0KBWVycm9yGAUgASgJItIBChZXYXRjaENhcGFiaWxpdHlSZXF1ZXN0EikKCmNhcGFiaWxpdHkYASABKAsyFS5xdWl4b3MuQ2FwYWJpbGl0eVJlZhIRCglvYmplY3RfaWQYAiABKAkSPQoFaW5wdXQYAyADKAsyLi5xdWl4b3Mub3JjaC5XYXRjaENhcGFiaWxpdHlSZXF1ZXN0LklucHV0RW50cnkaOwoKSW5wdXRFbnRyeRILCgNrZXkYASABKAkSHAoFdmFsdWUYAiABKAsyDS5jYW1pbm8uVmFsdWU6AjgBIuMBChRXYXRjaENhcGFiaWxpdHlFdmVudBIVCg1pbnZvY2F0aW9uX2lkGAEgASgJEisKCmFjdGl2YXRpb24YAiABKAsyFy5xdWl4b3Mub3JjaC5BY3RpdmF0aW9uEhAKCHdhdGNoX2lkGAMgASgJEhwKBXZhbHVlGAQgASgLMg0uY2FtaW5vLlZhbHVlEjcKDGRlcGVuZGVuY2llcxgFIAMoCzIhLnF1aXhvcy5ydW50aW1lLkRlcml2ZWREZXBlbmRlbmN5Eg0KBWVycm9yGAYgASgJEg8KB2luaXRpYWwYByABKAgiFQoTR2V0V29ya3NwYWNlUmVxdWVzdCJnChRHZXRXb3Jrc3BhY2VSZXNwb25zZRIUCgx3b3Jrc3BhY2VfaWQYASABKAkSHQoVd29ya3NwYWNlX3JldmlzaW9uX2lkGAIgASgJEhoKEnNvdXJjZV9yb290X2NvbW1pdBgDIAEoCSIYChZMaXN0QWN0aXZhdGlvbnNSZXF1ZXN0Ih8KHUxpc3RQYWNrYWdlRGVzY3JpcHRvcnNSZXF1ZXN0IlAKHkxpc3RQYWNrYWdlRGVzY3JpcHRvcnNSZXNwb25zZRIuCgtkZXNjcmlwdG9ycxgBIAMoCzIZLnF1aXhvcy5QYWNrYWdlRGVzY3JpcHRvciIcChpMaXN0UGFja2FnZVJ1bnRpbWVzUmVxdWVzdCJSChtMaXN0UGFja2FnZVJ1bnRpbWVzUmVzcG9uc2USMwoIcnVudGltZXMYASADKAsyIS5xdWl4b3Mub3JjaC5QYWNrYWdlUnVudGltZVN0YXR1cyJHChdMaXN0QWN0aXZhdGlvbnNSZXNwb25zZRIsCgthY3RpdmF0aW9ucxgBIAMoCzIXLnF1aXhvcy5vcmNoLkFjdGl2YXRpb24iPwoWQ2xvc2VBY3RpdmF0aW9uUmVxdWVzdBIVCg1hY3RpdmF0aW9uX2lkGAEgASgJEg4KBnJlYXNvbhgCIAEoCSJGChdDbG9zZUFjdGl2YXRpb25SZXNwb25zZRIrCgphY3RpdmF0aW9uGAEgASgLMhcucXVpeG9zLm9yY2guQWN0aXZhdGlvbiLrAQoKQWN0aXZhdGlvbhIVCg1hY3RpdmF0aW9uX2lkGAEgASgJEigKBmV4cG9ydBgCIAEoCzIYLnF1aXhvcy5QYWNrYWdlRXhwb3J0UmVmEhEKCW9iamVjdF9pZBgDIAEoCRINCgVzdGF0ZRgEIAEoCRIOCgZkZW1hbmQYBSABKA0SEQoJb3BlbmVkX2F0GAYgASgJEhQKDGxhc3RfdXNlZF9hdBgHIAEoCRIYChBpZGxlX2RlYWRsaW5lX2F0GAggASgJEhEKCWNsb3NlZF9hdBgJIAEoCRIUCgxjbG9zZV9yZWFzb24YCiABKAkiswIKFFBhY2thZ2VSdW50aW1lU3RhdHVzEhMKC3J1bnRpbWVfa2V5GAEgASgJEhsKE3BhY2thZ2VfcmV2aXNpb25faWQYAiABKAkSGQoRc291cmNlX3JlcG9zaXRvcnkYAyABKAkSFQoNc291cmNlX2NvbW1pdBgEIAEoCRIUCgxidWlsZF90YXJnZXQYBSABKAkSEwoLc2VydmVyX3BhdGgYBiABKAkSCwoDcGlkGAcgASgNEg0KBXN0YXRlGAggASgJEhIKCnN0YXJ0ZWRfYXQYCSABKAkSGQoRbGFzdF9oYW5kc2hha2VfYXQYCiABKAkSIAoYcnVudGltZV9wcm90b2NvbF92ZXJzaW9uGAsgASgJEh8KF2FkdmVydGlzZWRfZXhwb3J0X2NvdW50GAwgASgNMq4HChNPcmNoZXN0cmF0b3JSdW50aW1lEl8KEEludm9rZUNhcGFiaWxpdHkSJC5xdWl4b3Mub3JjaC5JbnZva2VDYXBhYmlsaXR5UmVxdWVzdBolLnF1aXhvcy5vcmNoLkludm9rZUNhcGFiaWxpdHlSZXNwb25zZRJbCg9XYXRjaENhcGFiaWxpdHkSIy5xdWl4b3Mub3JjaC5XYXRjaENhcGFiaWxpdHlSZXF1ZXN0GiEucXVpeG9zLm9yY2guV2F0Y2hDYXBhYmlsaXR5RXZlbnQwARJcCg9Db25zdHJ1Y3RPYmplY3QSIy5xdWl4b3Mub3JjaC5Db25zdHJ1Y3RPYmplY3RSZXF1ZXN0GiQucXVpeG9zLm9yY2guQ29uc3RydWN0T2JqZWN0UmVzcG9uc2USjAEKH1Jlc29sdmVPckNvbnN0cnVjdFJlbGF0ZWRPYmplY3QSMy5xdWl4b3Mub3JjaC5SZXNvbHZlT3JDb25zdHJ1Y3RSZWxhdGVkT2JqZWN0UmVxdWVzdBo0LnF1aXhvcy5vcmNoLlJlc29sdmVPckNvbnN0cnVjdFJlbGF0ZWRPYmplY3RSZXNwb25zZRJTCgxHZXRXb3Jrc3BhY2USIC5xdWl4b3Mub3JjaC5HZXRXb3Jrc3BhY2VSZXF1ZXN0GiEucXVpeG9zLm9yY2guR2V0V29ya3NwYWNlUmVzcG9uc2UScQoWTGlzdFBhY2thZ2VEZXNjcmlwdG9ycxIqLnF1aXhvcy5vcmNoLkxpc3RQYWNrYWdlRGVzY3JpcHRvcnNSZXF1ZXN0GisucXVpeG9zLm9yY2guTGlzdFBhY2thZ2VEZXNjcmlwdG9yc1Jlc3BvbnNlEmgKE0xpc3RQYWNrYWdlUnVudGltZXMSJy5xdWl4b3Mub3JjaC5MaXN0UGFja2FnZVJ1bnRpbWVzUmVxdWVzdBooLnF1aXhvcy5vcmNoLkxpc3RQYWNrYWdlUnVudGltZXNSZXNwb25zZRJcCg9MaXN0QWN0aXZhdGlvbnMSIy5xdWl4b3Mub3JjaC5MaXN0QWN0aXZhdGlvbnNSZXF1ZXN0GiQucXVpeG9zLm9yY2guTGlzdEFjdGl2YXRpb25zUmVzcG9uc2USXAoPQ2xvc2VBY3RpdmF0aW9uEiMucXVpeG9zLm9yY2guQ2xvc2VBY3RpdmF0aW9uUmVxdWVzdBokLnF1aXhvcy5vcmNoLkNsb3NlQWN0aXZhdGlvblJlc3BvbnNlYgZwcm90bzM", [file_camino_api, file_quixos_package, file_quixos_refs, file_quixos_runtime]); + fileDesc("ChFxdWl4b3Mvb3JjaC5wcm90bxILcXVpeG9zLm9yY2gipQEKFkNvbnN0cnVjdE9iamVjdFJlcXVlc3QSDwoHYXRvbV9pZBgBIAEoCRI9CgVpbnB1dBgCIAMoCzIuLnF1aXhvcy5vcmNoLkNvbnN0cnVjdE9iamVjdFJlcXVlc3QuSW5wdXRFbnRyeRo7CgpJbnB1dEVudHJ5EgsKA2tleRgBIAEoCRIcCgV2YWx1ZRgCIAEoCzINLmNhbWluby5WYWx1ZToCOAEiPwoXQ29uc3RydWN0T2JqZWN0UmVzcG9uc2USJAoGb2JqZWN0GAEgASgLMhQuY2FtaW5vLkNhbWlub09iamVjdCJtCiZSZXNvbHZlT3JDb25zdHJ1Y3RSZWxhdGVkT2JqZWN0UmVxdWVzdBIRCglvYmplY3RfaWQYASABKAkSHQoVaW50ZXJmYWNlX3JldmlzaW9uX2lkGAIgASgJEhEKCW1lbWJlcl9pZBgDIAEoCSJkCidSZXNvbHZlT3JDb25zdHJ1Y3RSZWxhdGVkT2JqZWN0UmVzcG9uc2USJAoGb2JqZWN0GAEgASgLMhQuY2FtaW5vLkNhbWlub09iamVjdBITCgtjb25zdHJ1Y3RlZBgCIAEoCCLwAQoXSW52b2tlQ2FwYWJpbGl0eVJlcXVlc3QSKQoKY2FwYWJpbGl0eRgBIAEoCzIVLnF1aXhvcy5DYXBhYmlsaXR5UmVmEhEKCW9iamVjdF9pZBgCIAEoCRI+CgVpbnB1dBgDIAMoCzIvLnF1aXhvcy5vcmNoLkludm9rZUNhcGFiaWxpdHlSZXF1ZXN0LklucHV0RW50cnkSGgoSY2xpZW50X211dGF0aW9uX2lkGAQgASgJGjsKCklucHV0RW50cnkSCwoDa2V5GAEgASgJEhwKBXZhbHVlGAIgASgLMg0uY2FtaW5vLlZhbHVlOgI4ASLRAQoYSW52b2tlQ2FwYWJpbGl0eVJlc3BvbnNlEhUKDWludm9jYXRpb25faWQYASABKAkSKwoKYWN0aXZhdGlvbhgCIAEoCzIXLnF1aXhvcy5vcmNoLkFjdGl2YXRpb24SCgoCb2sYAyABKAgSHQoGcmVzdWx0GAQgASgLMg0uY2FtaW5vLlZhbHVlEg0KBWVycm9yGAUgASgJEjcKDGRlcGVuZGVuY2llcxgGIAMoCzIhLnF1aXhvcy5ydW50aW1lLkRlcml2ZWREZXBlbmRlbmN5ItIBChZXYXRjaENhcGFiaWxpdHlSZXF1ZXN0EikKCmNhcGFiaWxpdHkYASABKAsyFS5xdWl4b3MuQ2FwYWJpbGl0eVJlZhIRCglvYmplY3RfaWQYAiABKAkSPQoFaW5wdXQYAyADKAsyLi5xdWl4b3Mub3JjaC5XYXRjaENhcGFiaWxpdHlSZXF1ZXN0LklucHV0RW50cnkaOwoKSW5wdXRFbnRyeRILCgNrZXkYASABKAkSHAoFdmFsdWUYAiABKAsyDS5jYW1pbm8uVmFsdWU6AjgBIuMBChRXYXRjaENhcGFiaWxpdHlFdmVudBIVCg1pbnZvY2F0aW9uX2lkGAEgASgJEisKCmFjdGl2YXRpb24YAiABKAsyFy5xdWl4b3Mub3JjaC5BY3RpdmF0aW9uEhAKCHdhdGNoX2lkGAMgASgJEhwKBXZhbHVlGAQgASgLMg0uY2FtaW5vLlZhbHVlEjcKDGRlcGVuZGVuY2llcxgFIAMoCzIhLnF1aXhvcy5ydW50aW1lLkRlcml2ZWREZXBlbmRlbmN5Eg0KBWVycm9yGAYgASgJEg8KB2luaXRpYWwYByABKAgiFQoTR2V0V29ya3NwYWNlUmVxdWVzdCJnChRHZXRXb3Jrc3BhY2VSZXNwb25zZRIUCgx3b3Jrc3BhY2VfaWQYASABKAkSHQoVd29ya3NwYWNlX3JldmlzaW9uX2lkGAIgASgJEhoKEnNvdXJjZV9yb290X2NvbW1pdBgDIAEoCSIYChZMaXN0QWN0aXZhdGlvbnNSZXF1ZXN0Ih8KHUxpc3RQYWNrYWdlRGVzY3JpcHRvcnNSZXF1ZXN0IlAKHkxpc3RQYWNrYWdlRGVzY3JpcHRvcnNSZXNwb25zZRIuCgtkZXNjcmlwdG9ycxgBIAMoCzIZLnF1aXhvcy5QYWNrYWdlRGVzY3JpcHRvciIcChpMaXN0UGFja2FnZVJ1bnRpbWVzUmVxdWVzdCJSChtMaXN0UGFja2FnZVJ1bnRpbWVzUmVzcG9uc2USMwoIcnVudGltZXMYASADKAsyIS5xdWl4b3Mub3JjaC5QYWNrYWdlUnVudGltZVN0YXR1cyJHChdMaXN0QWN0aXZhdGlvbnNSZXNwb25zZRIsCgthY3RpdmF0aW9ucxgBIAMoCzIXLnF1aXhvcy5vcmNoLkFjdGl2YXRpb24iPwoWQ2xvc2VBY3RpdmF0aW9uUmVxdWVzdBIVCg1hY3RpdmF0aW9uX2lkGAEgASgJEg4KBnJlYXNvbhgCIAEoCSJGChdDbG9zZUFjdGl2YXRpb25SZXNwb25zZRIrCgphY3RpdmF0aW9uGAEgASgLMhcucXVpeG9zLm9yY2guQWN0aXZhdGlvbiLrAQoKQWN0aXZhdGlvbhIVCg1hY3RpdmF0aW9uX2lkGAEgASgJEigKBmV4cG9ydBgCIAEoCzIYLnF1aXhvcy5QYWNrYWdlRXhwb3J0UmVmEhEKCW9iamVjdF9pZBgDIAEoCRINCgVzdGF0ZRgEIAEoCRIOCgZkZW1hbmQYBSABKA0SEQoJb3BlbmVkX2F0GAYgASgJEhQKDGxhc3RfdXNlZF9hdBgHIAEoCRIYChBpZGxlX2RlYWRsaW5lX2F0GAggASgJEhEKCWNsb3NlZF9hdBgJIAEoCRIUCgxjbG9zZV9yZWFzb24YCiABKAkiswIKFFBhY2thZ2VSdW50aW1lU3RhdHVzEhMKC3J1bnRpbWVfa2V5GAEgASgJEhsKE3BhY2thZ2VfcmV2aXNpb25faWQYAiABKAkSGQoRc291cmNlX3JlcG9zaXRvcnkYAyABKAkSFQoNc291cmNlX2NvbW1pdBgEIAEoCRIUCgxidWlsZF90YXJnZXQYBSABKAkSEwoLc2VydmVyX3BhdGgYBiABKAkSCwoDcGlkGAcgASgNEg0KBXN0YXRlGAggASgJEhIKCnN0YXJ0ZWRfYXQYCSABKAkSGQoRbGFzdF9oYW5kc2hha2VfYXQYCiABKAkSIAoYcnVudGltZV9wcm90b2NvbF92ZXJzaW9uGAsgASgJEh8KF2FkdmVydGlzZWRfZXhwb3J0X2NvdW50GAwgASgNMq4HChNPcmNoZXN0cmF0b3JSdW50aW1lEl8KEEludm9rZUNhcGFiaWxpdHkSJC5xdWl4b3Mub3JjaC5JbnZva2VDYXBhYmlsaXR5UmVxdWVzdBolLnF1aXhvcy5vcmNoLkludm9rZUNhcGFiaWxpdHlSZXNwb25zZRJbCg9XYXRjaENhcGFiaWxpdHkSIy5xdWl4b3Mub3JjaC5XYXRjaENhcGFiaWxpdHlSZXF1ZXN0GiEucXVpeG9zLm9yY2guV2F0Y2hDYXBhYmlsaXR5RXZlbnQwARJcCg9Db25zdHJ1Y3RPYmplY3QSIy5xdWl4b3Mub3JjaC5Db25zdHJ1Y3RPYmplY3RSZXF1ZXN0GiQucXVpeG9zLm9yY2guQ29uc3RydWN0T2JqZWN0UmVzcG9uc2USjAEKH1Jlc29sdmVPckNvbnN0cnVjdFJlbGF0ZWRPYmplY3QSMy5xdWl4b3Mub3JjaC5SZXNvbHZlT3JDb25zdHJ1Y3RSZWxhdGVkT2JqZWN0UmVxdWVzdBo0LnF1aXhvcy5vcmNoLlJlc29sdmVPckNvbnN0cnVjdFJlbGF0ZWRPYmplY3RSZXNwb25zZRJTCgxHZXRXb3Jrc3BhY2USIC5xdWl4b3Mub3JjaC5HZXRXb3Jrc3BhY2VSZXF1ZXN0GiEucXVpeG9zLm9yY2guR2V0V29ya3NwYWNlUmVzcG9uc2UScQoWTGlzdFBhY2thZ2VEZXNjcmlwdG9ycxIqLnF1aXhvcy5vcmNoLkxpc3RQYWNrYWdlRGVzY3JpcHRvcnNSZXF1ZXN0GisucXVpeG9zLm9yY2guTGlzdFBhY2thZ2VEZXNjcmlwdG9yc1Jlc3BvbnNlEmgKE0xpc3RQYWNrYWdlUnVudGltZXMSJy5xdWl4b3Mub3JjaC5MaXN0UGFja2FnZVJ1bnRpbWVzUmVxdWVzdBooLnF1aXhvcy5vcmNoLkxpc3RQYWNrYWdlUnVudGltZXNSZXNwb25zZRJcCg9MaXN0QWN0aXZhdGlvbnMSIy5xdWl4b3Mub3JjaC5MaXN0QWN0aXZhdGlvbnNSZXF1ZXN0GiQucXVpeG9zLm9yY2guTGlzdEFjdGl2YXRpb25zUmVzcG9uc2USXAoPQ2xvc2VBY3RpdmF0aW9uEiMucXVpeG9zLm9yY2guQ2xvc2VBY3RpdmF0aW9uUmVxdWVzdBokLnF1aXhvcy5vcmNoLkNsb3NlQWN0aXZhdGlvblJlc3BvbnNlYgZwcm90bzM", [file_camino_api, file_quixos_package, file_quixos_refs, file_quixos_runtime]); /** * @generated from message quixos.orch.ConstructObjectRequest @@ -171,6 +171,11 @@ export type InvokeCapabilityResponse = Message<"quixos.orch.InvokeCapabilityResp * @generated from field: string error = 5; */ error: string; + + /** + * @generated from field: repeated quixos.runtime.DerivedDependency dependencies = 6; + */ + dependencies: DerivedDependency[]; }; /** diff --git a/src/gen/quixos/refs_pb.ts b/src/gen/quixos/refs_pb.ts index 89650d9..bdc9302 100644 --- a/src/gen/quixos/refs_pb.ts +++ b/src/gen/quixos/refs_pb.ts @@ -10,7 +10,7 @@ import type { Message } from "@bufbuild/protobuf"; * Describes the file quixos/refs.proto. */ export const file_quixos_refs: GenFile = /*@__PURE__*/ - fileDesc("ChFxdWl4b3MvcmVmcy5wcm90bxIGcXVpeG9zIkQKDUNhcGFiaWxpdHlSZWYSHQoVaW50ZXJmYWNlX3JldmlzaW9uX2lkGAEgASgJEhQKDG9wZXJhdGlvbl9pZBgCIAEoCSJCChBQYWNrYWdlRXhwb3J0UmVmEhsKE3BhY2thZ2VfcmV2aXNpb25faWQYASABKAkSEQoJZXhwb3J0X2lkGAIgASgJIs0BChJJbmplY3RlZERlcGVuZGVuY3kSDwoHcG9ydF9pZBgBIAEoCRIXCg1zdGF0ZV9zbG90X2lkGAIgASgJSAASJgoEZWRnZRgDIAEoCzIWLnF1aXhvcy5FZGdlRGVwZW5kZW5jeUgAEigKHnJlY2VpdmVyX2ludGVyZmFjZV9yZXZpc2lvbl9pZBgEIAEoCUgAEh0KE2NvbnN0cnVjdG9yX2F0b21faWQYBSABKAlIABIRCglvYmplY3RfaWQYBiABKAlCCQoHYmluZGluZyI9Cg5FZGdlRGVwZW5kZW5jeRIUCgxlZGdlX3R5cGVfaWQYASABKAkSFQoNcHJvamVjdGlvbl9pZBgCIAEoCWIGcHJvdG8z"); + fileDesc("ChFxdWl4b3MvcmVmcy5wcm90bxIGcXVpeG9zIkQKDUNhcGFiaWxpdHlSZWYSHQoVaW50ZXJmYWNlX3JldmlzaW9uX2lkGAEgASgJEhQKDG9wZXJhdGlvbl9pZBgCIAEoCSJCChBQYWNrYWdlRXhwb3J0UmVmEhsKE3BhY2thZ2VfcmV2aXNpb25faWQYASABKAkSEQoJZXhwb3J0X2lkGAIgASgJIsQBChJJbmplY3RlZERlcGVuZGVuY3kSDwoHcG9ydF9pZBgBIAEoCRIXCg1zdGF0ZV9zbG90X2lkGAIgASgJSAASJgoEZWRnZRgDIAEoCzIWLnF1aXhvcy5FZGdlRGVwZW5kZW5jeUgAEh8KFWludGVyZmFjZV9yZXZpc2lvbl9pZBgEIAEoCUgAEh0KE2NvbnN0cnVjdG9yX2F0b21faWQYBSABKAlIABIRCglvYmplY3RfaWQYBiABKAlCCQoHYmluZGluZyI9Cg5FZGdlRGVwZW5kZW5jeRIUCgxlZGdlX3R5cGVfaWQYASABKAkSFQoNcHJvamVjdGlvbl9pZBgCIAEoCWIGcHJvdG8z"); /** * @generated from message quixos.CapabilityRef @@ -82,10 +82,10 @@ export type InjectedDependency = Message<"quixos.InjectedDependency"> & { case: "edge"; } | { /** - * @generated from field: string receiver_interface_revision_id = 4; + * @generated from field: string interface_revision_id = 4; */ value: string; - case: "receiverInterfaceRevisionId"; + case: "interfaceRevisionId"; } | { /** * @generated from field: string constructor_atom_id = 5; diff --git a/src/gen/quixos/runtime_pb.ts b/src/gen/quixos/runtime_pb.ts index 82c9b05..b274479 100644 --- a/src/gen/quixos/runtime_pb.ts +++ b/src/gen/quixos/runtime_pb.ts @@ -14,7 +14,7 @@ import type { Message } from "@bufbuild/protobuf"; * Describes the file quixos/runtime.proto. */ export const file_quixos_runtime: GenFile = /*@__PURE__*/ - fileDesc("ChRxdWl4b3MvcnVudGltZS5wcm90bxIOcXVpeG9zLnJ1bnRpbWUiMQoQSGFuZHNoYWtlUmVxdWVzdBIdChVvcmNoX3Byb3RvY29sX3ZlcnNpb24YASABKAkiZgoRSGFuZHNoYWtlUmVzcG9uc2USGwoTcGFja2FnZV9yZXZpc2lvbl9pZBgBIAEoCRIgChhydW50aW1lX3Byb3RvY29sX3ZlcnNpb24YAiABKAkSEgoKZXhwb3J0X2lkcxgDIAMoCSKLAgoNSW52b2tlUmVxdWVzdBIVCg1pbnZvY2F0aW9uX2lkGAEgASgJEigKBmV4cG9ydBgCIAEoCzIYLnF1aXhvcy5QYWNrYWdlRXhwb3J0UmVmEhEKCW9iamVjdF9pZBgDIAEoCRI3CgVpbnB1dBgEIAMoCzIoLnF1aXhvcy5ydW50aW1lLkludm9rZVJlcXVlc3QuSW5wdXRFbnRyeRIwCgxkZXBlbmRlbmNpZXMYBSADKAsyGi5xdWl4b3MuSW5qZWN0ZWREZXBlbmRlbmN5GjsKCklucHV0RW50cnkSCwoDa2V5GAEgASgJEhwKBXZhbHVlGAIgASgLMg0uY2FtaW5vLlZhbHVlOgI4ASJKCg5JbnZva2VSZXNwb25zZRIKCgJvaxgBIAEoCBIdCgZyZXN1bHQYAiABKAsyDS5jYW1pbm8uVmFsdWUSDQoFZXJyb3IYAyABKAkiiQIKDFdhdGNoUmVxdWVzdBIVCg1pbnZvY2F0aW9uX2lkGAEgASgJEigKBmV4cG9ydBgCIAEoCzIYLnF1aXhvcy5QYWNrYWdlRXhwb3J0UmVmEhEKCW9iamVjdF9pZBgDIAEoCRI2CgVpbnB1dBgEIAMoCzInLnF1aXhvcy5ydW50aW1lLldhdGNoUmVxdWVzdC5JbnB1dEVudHJ5EjAKDGRlcGVuZGVuY2llcxgFIAMoCzIaLnF1aXhvcy5JbmplY3RlZERlcGVuZGVuY3kaOwoKSW5wdXRFbnRyeRILCgNrZXkYASABKAkSHAoFdmFsdWUYAiABKAsyDS5jYW1pbm8uVmFsdWU6AjgBImIKEURlcml2ZWREZXBlbmRlbmN5EgwKBGtpbmQYASABKAkSEQoJb2JqZWN0X2lkGAIgASgJEhUKDWF0dGFjaG1lbnRfaWQYAyABKAkSFQoNcHJvamVjdGlvbl9pZBgEIAEoCSKVAQoKV2F0Y2hFdmVudBIQCgh3YXRjaF9pZBgBIAEoCRIcCgV2YWx1ZRgCIAEoCzINLmNhbWluby5WYWx1ZRI3CgxkZXBlbmRlbmNpZXMYAyADKAsyIS5xdWl4b3MucnVudGltZS5EZXJpdmVkRGVwZW5kZW5jeRINCgVlcnJvchgEIAEoCRIPCgdpbml0aWFsGAUgASgIMvABCg5QYWNrYWdlUnVudGltZRJQCglIYW5kc2hha2USIC5xdWl4b3MucnVudGltZS5IYW5kc2hha2VSZXF1ZXN0GiEucXVpeG9zLnJ1bnRpbWUuSGFuZHNoYWtlUmVzcG9uc2USRwoGSW52b2tlEh0ucXVpeG9zLnJ1bnRpbWUuSW52b2tlUmVxdWVzdBoeLnF1aXhvcy5ydW50aW1lLkludm9rZVJlc3BvbnNlEkMKBVdhdGNoEhwucXVpeG9zLnJ1bnRpbWUuV2F0Y2hSZXF1ZXN0GhoucXVpeG9zLnJ1bnRpbWUuV2F0Y2hFdmVudDABYgZwcm90bzM", [file_camino_api, file_quixos_refs]); + fileDesc("ChRxdWl4b3MvcnVudGltZS5wcm90bxIOcXVpeG9zLnJ1bnRpbWUiMQoQSGFuZHNoYWtlUmVxdWVzdBIdChVvcmNoX3Byb3RvY29sX3ZlcnNpb24YASABKAkiZgoRSGFuZHNoYWtlUmVzcG9uc2USGwoTcGFja2FnZV9yZXZpc2lvbl9pZBgBIAEoCRIgChhydW50aW1lX3Byb3RvY29sX3ZlcnNpb24YAiABKAkSEgoKZXhwb3J0X2lkcxgDIAMoCSKLAgoNSW52b2tlUmVxdWVzdBIVCg1pbnZvY2F0aW9uX2lkGAEgASgJEigKBmV4cG9ydBgCIAEoCzIYLnF1aXhvcy5QYWNrYWdlRXhwb3J0UmVmEhEKCW9iamVjdF9pZBgDIAEoCRI3CgVpbnB1dBgEIAMoCzIoLnF1aXhvcy5ydW50aW1lLkludm9rZVJlcXVlc3QuSW5wdXRFbnRyeRIwCgxkZXBlbmRlbmNpZXMYBSADKAsyGi5xdWl4b3MuSW5qZWN0ZWREZXBlbmRlbmN5GjsKCklucHV0RW50cnkSCwoDa2V5GAEgASgJEhwKBXZhbHVlGAIgASgLMg0uY2FtaW5vLlZhbHVlOgI4ASKDAQoOSW52b2tlUmVzcG9uc2USCgoCb2sYASABKAgSHQoGcmVzdWx0GAIgASgLMg0uY2FtaW5vLlZhbHVlEg0KBWVycm9yGAMgASgJEjcKDGRlcGVuZGVuY2llcxgEIAMoCzIhLnF1aXhvcy5ydW50aW1lLkRlcml2ZWREZXBlbmRlbmN5IokCCgxXYXRjaFJlcXVlc3QSFQoNaW52b2NhdGlvbl9pZBgBIAEoCRIoCgZleHBvcnQYAiABKAsyGC5xdWl4b3MuUGFja2FnZUV4cG9ydFJlZhIRCglvYmplY3RfaWQYAyABKAkSNgoFaW5wdXQYBCADKAsyJy5xdWl4b3MucnVudGltZS5XYXRjaFJlcXVlc3QuSW5wdXRFbnRyeRIwCgxkZXBlbmRlbmNpZXMYBSADKAsyGi5xdWl4b3MuSW5qZWN0ZWREZXBlbmRlbmN5GjsKCklucHV0RW50cnkSCwoDa2V5GAEgASgJEhwKBXZhbHVlGAIgASgLMg0uY2FtaW5vLlZhbHVlOgI4ASJiChFEZXJpdmVkRGVwZW5kZW5jeRIMCgRraW5kGAEgASgJEhEKCW9iamVjdF9pZBgCIAEoCRIVCg1hdHRhY2htZW50X2lkGAMgASgJEhUKDXByb2plY3Rpb25faWQYBCABKAkilQEKCldhdGNoRXZlbnQSEAoId2F0Y2hfaWQYASABKAkSHAoFdmFsdWUYAiABKAsyDS5jYW1pbm8uVmFsdWUSNwoMZGVwZW5kZW5jaWVzGAMgAygLMiEucXVpeG9zLnJ1bnRpbWUuRGVyaXZlZERlcGVuZGVuY3kSDQoFZXJyb3IYBCABKAkSDwoHaW5pdGlhbBgFIAEoCDLwAQoOUGFja2FnZVJ1bnRpbWUSUAoJSGFuZHNoYWtlEiAucXVpeG9zLnJ1bnRpbWUuSGFuZHNoYWtlUmVxdWVzdBohLnF1aXhvcy5ydW50aW1lLkhhbmRzaGFrZVJlc3BvbnNlEkcKBkludm9rZRIdLnF1aXhvcy5ydW50aW1lLkludm9rZVJlcXVlc3QaHi5xdWl4b3MucnVudGltZS5JbnZva2VSZXNwb25zZRJDCgVXYXRjaBIcLnF1aXhvcy5ydW50aW1lLldhdGNoUmVxdWVzdBoaLnF1aXhvcy5ydW50aW1lLldhdGNoRXZlbnQwAWIGcHJvdG8z", [file_camino_api, file_quixos_refs]); /** * @generated from message quixos.runtime.HandshakeRequest @@ -115,6 +115,11 @@ export type InvokeResponse = Message<"quixos.runtime.InvokeResponse"> & { * @generated from field: string error = 3; */ error: string; + + /** + * @generated from field: repeated quixos.runtime.DerivedDependency dependencies = 4; + */ + dependencies: DerivedDependency[]; }; /** diff --git a/src/resource-lock/cli.ts b/src/resource-lock/cli.ts index 3c816d4..3562ed8 100644 --- a/src/resource-lock/cli.ts +++ b/src/resource-lock/cli.ts @@ -1,6 +1,5 @@ #!/usr/bin/env node -import { readFile } from "node:fs/promises"; -import { parseQuixosLock } from "./parser.js"; +import { loadQuixosLock } from "./loader.js"; const fileName = process.argv[2]; if (!fileName || process.argv.length !== 3) { @@ -8,7 +7,7 @@ if (!fileName || process.argv.length !== 3) { process.exit(2); } -const result = parseQuixosLock(await readFile(fileName, "utf8"), fileName); +const result = await loadQuixosLock(fileName); if (!result.ok) { for (const diagnostic of result.diagnostics) { console.error( diff --git a/src/resource-lock/generated/QuixosLock.interp b/src/resource-lock/generated/QuixosLock.interp index 0c14731..256f43b 100644 --- a/src/resource-lock/generated/QuixosLock.interp +++ b/src/resource-lock/generated/QuixosLock.interp @@ -1,6 +1,7 @@ token literal names: null 'quixos-lock' +'fragment' 'version' 'quixos' 'source' @@ -8,6 +9,12 @@ null 'package' 'repository' 'commit' +'policy' +'ref' +'pinned' +'track-release' +'track-development' +'import' '{' '}' ';' @@ -21,6 +28,7 @@ null token symbolic names: null QUIXOS_LOCK +FRAGMENT VERSION QUIXOS SOURCE @@ -28,6 +36,12 @@ INTERFACE PACKAGE REPOSITORY COMMIT +POLICY +REF +PINNED +TRACK_RELEASE +TRACK_DEVELOPMENT +IMPORT LBRACE RBRACE SEMI @@ -42,11 +56,14 @@ rule names: document quixosEntry resourceEntry +importEntry resourceKind sourceBlock +quixosSourceBlock +sourcePolicy identifier stringLiteral atn: -[4, 1, 17, 53, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 5, 0, 21, 8, 0, 10, 0, 12, 0, 24, 9, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 0, 0, 7, 0, 2, 4, 6, 8, 10, 12, 0, 1, 1, 0, 5, 6, 46, 0, 14, 1, 0, 0, 0, 2, 28, 1, 0, 0, 0, 4, 32, 1, 0, 0, 0, 6, 37, 1, 0, 0, 0, 8, 39, 1, 0, 0, 0, 10, 48, 1, 0, 0, 0, 12, 50, 1, 0, 0, 0, 14, 15, 5, 1, 0, 0, 15, 16, 5, 2, 0, 0, 16, 17, 5, 12, 0, 0, 17, 18, 5, 9, 0, 0, 18, 22, 3, 2, 1, 0, 19, 21, 3, 4, 2, 0, 20, 19, 1, 0, 0, 0, 21, 24, 1, 0, 0, 0, 22, 20, 1, 0, 0, 0, 22, 23, 1, 0, 0, 0, 23, 25, 1, 0, 0, 0, 24, 22, 1, 0, 0, 0, 25, 26, 5, 10, 0, 0, 26, 27, 5, 0, 0, 1, 27, 1, 1, 0, 0, 0, 28, 29, 5, 3, 0, 0, 29, 30, 5, 4, 0, 0, 30, 31, 3, 8, 4, 0, 31, 3, 1, 0, 0, 0, 32, 33, 3, 6, 3, 0, 33, 34, 3, 10, 5, 0, 34, 35, 5, 4, 0, 0, 35, 36, 3, 8, 4, 0, 36, 5, 1, 0, 0, 0, 37, 38, 7, 0, 0, 0, 38, 7, 1, 0, 0, 0, 39, 40, 5, 9, 0, 0, 40, 41, 5, 7, 0, 0, 41, 42, 3, 12, 6, 0, 42, 43, 5, 11, 0, 0, 43, 44, 5, 8, 0, 0, 44, 45, 3, 12, 6, 0, 45, 46, 5, 11, 0, 0, 46, 47, 5, 10, 0, 0, 47, 9, 1, 0, 0, 0, 48, 49, 5, 13, 0, 0, 49, 11, 1, 0, 0, 0, 50, 51, 5, 14, 0, 0, 51, 13, 1, 0, 0, 0, 1, 22] \ No newline at end of file +[4, 1, 24, 87, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 1, 0, 1, 0, 3, 0, 23, 8, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 5, 0, 31, 8, 0, 10, 0, 12, 0, 34, 9, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 3, 6, 74, 8, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 0, 0, 10, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 0, 2, 1, 0, 6, 7, 1, 0, 12, 14, 81, 0, 20, 1, 0, 0, 0, 2, 38, 1, 0, 0, 0, 4, 42, 1, 0, 0, 0, 6, 47, 1, 0, 0, 0, 8, 51, 1, 0, 0, 0, 10, 53, 1, 0, 0, 0, 12, 62, 1, 0, 0, 0, 14, 80, 1, 0, 0, 0, 16, 82, 1, 0, 0, 0, 18, 84, 1, 0, 0, 0, 20, 22, 5, 1, 0, 0, 21, 23, 5, 2, 0, 0, 22, 21, 1, 0, 0, 0, 22, 23, 1, 0, 0, 0, 23, 24, 1, 0, 0, 0, 24, 25, 5, 3, 0, 0, 25, 26, 5, 19, 0, 0, 26, 32, 5, 16, 0, 0, 27, 31, 3, 2, 1, 0, 28, 31, 3, 6, 3, 0, 29, 31, 3, 4, 2, 0, 30, 27, 1, 0, 0, 0, 30, 28, 1, 0, 0, 0, 30, 29, 1, 0, 0, 0, 31, 34, 1, 0, 0, 0, 32, 30, 1, 0, 0, 0, 32, 33, 1, 0, 0, 0, 33, 35, 1, 0, 0, 0, 34, 32, 1, 0, 0, 0, 35, 36, 5, 17, 0, 0, 36, 37, 5, 0, 0, 1, 37, 1, 1, 0, 0, 0, 38, 39, 5, 4, 0, 0, 39, 40, 5, 5, 0, 0, 40, 41, 3, 12, 6, 0, 41, 3, 1, 0, 0, 0, 42, 43, 3, 8, 4, 0, 43, 44, 3, 16, 8, 0, 44, 45, 5, 5, 0, 0, 45, 46, 3, 10, 5, 0, 46, 5, 1, 0, 0, 0, 47, 48, 5, 15, 0, 0, 48, 49, 3, 18, 9, 0, 49, 50, 5, 18, 0, 0, 50, 7, 1, 0, 0, 0, 51, 52, 7, 0, 0, 0, 52, 9, 1, 0, 0, 0, 53, 54, 5, 16, 0, 0, 54, 55, 5, 8, 0, 0, 55, 56, 3, 18, 9, 0, 56, 57, 5, 18, 0, 0, 57, 58, 5, 9, 0, 0, 58, 59, 3, 18, 9, 0, 59, 60, 5, 18, 0, 0, 60, 61, 5, 17, 0, 0, 61, 11, 1, 0, 0, 0, 62, 63, 5, 16, 0, 0, 63, 64, 5, 8, 0, 0, 64, 65, 3, 18, 9, 0, 65, 73, 5, 18, 0, 0, 66, 67, 5, 10, 0, 0, 67, 68, 3, 14, 7, 0, 68, 69, 5, 18, 0, 0, 69, 70, 5, 11, 0, 0, 70, 71, 3, 18, 9, 0, 71, 72, 5, 18, 0, 0, 72, 74, 1, 0, 0, 0, 73, 66, 1, 0, 0, 0, 73, 74, 1, 0, 0, 0, 74, 75, 1, 0, 0, 0, 75, 76, 5, 9, 0, 0, 76, 77, 3, 18, 9, 0, 77, 78, 5, 18, 0, 0, 78, 79, 5, 17, 0, 0, 79, 13, 1, 0, 0, 0, 80, 81, 7, 1, 0, 0, 81, 15, 1, 0, 0, 0, 82, 83, 5, 20, 0, 0, 83, 17, 1, 0, 0, 0, 84, 85, 5, 21, 0, 0, 85, 19, 1, 0, 0, 0, 4, 22, 30, 32, 73] \ No newline at end of file diff --git a/src/resource-lock/generated/QuixosLock.tokens b/src/resource-lock/generated/QuixosLock.tokens index cdb2ae8..fe6ae89 100644 --- a/src/resource-lock/generated/QuixosLock.tokens +++ b/src/resource-lock/generated/QuixosLock.tokens @@ -1,28 +1,42 @@ QUIXOS_LOCK=1 -VERSION=2 -QUIXOS=3 -SOURCE=4 -INTERFACE=5 -PACKAGE=6 -REPOSITORY=7 -COMMIT=8 -LBRACE=9 -RBRACE=10 -SEMI=11 -INTEGER=12 -IDENTIFIER=13 -STRING_LITERAL=14 -LINE_COMMENT=15 -BLOCK_COMMENT=16 -WS=17 +FRAGMENT=2 +VERSION=3 +QUIXOS=4 +SOURCE=5 +INTERFACE=6 +PACKAGE=7 +REPOSITORY=8 +COMMIT=9 +POLICY=10 +REF=11 +PINNED=12 +TRACK_RELEASE=13 +TRACK_DEVELOPMENT=14 +IMPORT=15 +LBRACE=16 +RBRACE=17 +SEMI=18 +INTEGER=19 +IDENTIFIER=20 +STRING_LITERAL=21 +LINE_COMMENT=22 +BLOCK_COMMENT=23 +WS=24 'quixos-lock'=1 -'version'=2 -'quixos'=3 -'source'=4 -'interface'=5 -'package'=6 -'repository'=7 -'commit'=8 -'{'=9 -'}'=10 -';'=11 +'fragment'=2 +'version'=3 +'quixos'=4 +'source'=5 +'interface'=6 +'package'=7 +'repository'=8 +'commit'=9 +'policy'=10 +'ref'=11 +'pinned'=12 +'track-release'=13 +'track-development'=14 +'import'=15 +'{'=16 +'}'=17 +';'=18 diff --git a/src/resource-lock/generated/QuixosLockLexer.interp b/src/resource-lock/generated/QuixosLockLexer.interp index 2616f7f..81c332d 100644 --- a/src/resource-lock/generated/QuixosLockLexer.interp +++ b/src/resource-lock/generated/QuixosLockLexer.interp @@ -1,6 +1,7 @@ token literal names: null 'quixos-lock' +'fragment' 'version' 'quixos' 'source' @@ -8,6 +9,12 @@ null 'package' 'repository' 'commit' +'policy' +'ref' +'pinned' +'track-release' +'track-development' +'import' '{' '}' ';' @@ -21,6 +28,7 @@ null token symbolic names: null QUIXOS_LOCK +FRAGMENT VERSION QUIXOS SOURCE @@ -28,6 +36,12 @@ INTERFACE PACKAGE REPOSITORY COMMIT +POLICY +REF +PINNED +TRACK_RELEASE +TRACK_DEVELOPMENT +IMPORT LBRACE RBRACE SEMI @@ -40,6 +54,7 @@ WS rule names: QUIXOS_LOCK +FRAGMENT VERSION QUIXOS SOURCE @@ -47,6 +62,12 @@ INTERFACE PACKAGE REPOSITORY COMMIT +POLICY +REF +PINNED +TRACK_RELEASE +TRACK_DEVELOPMENT +IMPORT LBRACE RBRACE SEMI @@ -67,4 +88,4 @@ mode names: DEFAULT_MODE atn: -[4, 0, 17, 181, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 9, 1, 9, 1, 10, 1, 10, 1, 11, 4, 11, 117, 8, 11, 11, 11, 12, 11, 118, 1, 12, 1, 12, 5, 12, 123, 8, 12, 10, 12, 12, 12, 126, 9, 12, 1, 13, 1, 13, 1, 13, 5, 13, 131, 8, 13, 10, 13, 12, 13, 134, 9, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 3, 14, 146, 8, 14, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 5, 16, 154, 8, 16, 10, 16, 12, 16, 157, 9, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 5, 17, 165, 8, 17, 10, 17, 12, 17, 168, 9, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 4, 18, 176, 8, 18, 11, 18, 12, 18, 177, 1, 18, 1, 18, 1, 166, 0, 19, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 0, 31, 0, 33, 15, 35, 16, 37, 17, 1, 0, 8, 1, 0, 48, 57, 3, 0, 65, 90, 95, 95, 97, 122, 4, 0, 48, 57, 65, 90, 95, 95, 97, 122, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 8, 0, 34, 34, 47, 47, 92, 92, 98, 98, 102, 102, 110, 110, 114, 114, 116, 116, 3, 0, 48, 57, 65, 70, 97, 102, 2, 0, 10, 10, 13, 13, 3, 0, 9, 10, 13, 13, 32, 32, 186, 0, 1, 1, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 1, 39, 1, 0, 0, 0, 3, 51, 1, 0, 0, 0, 5, 59, 1, 0, 0, 0, 7, 66, 1, 0, 0, 0, 9, 73, 1, 0, 0, 0, 11, 83, 1, 0, 0, 0, 13, 91, 1, 0, 0, 0, 15, 102, 1, 0, 0, 0, 17, 109, 1, 0, 0, 0, 19, 111, 1, 0, 0, 0, 21, 113, 1, 0, 0, 0, 23, 116, 1, 0, 0, 0, 25, 120, 1, 0, 0, 0, 27, 127, 1, 0, 0, 0, 29, 137, 1, 0, 0, 0, 31, 147, 1, 0, 0, 0, 33, 149, 1, 0, 0, 0, 35, 160, 1, 0, 0, 0, 37, 175, 1, 0, 0, 0, 39, 40, 5, 113, 0, 0, 40, 41, 5, 117, 0, 0, 41, 42, 5, 105, 0, 0, 42, 43, 5, 120, 0, 0, 43, 44, 5, 111, 0, 0, 44, 45, 5, 115, 0, 0, 45, 46, 5, 45, 0, 0, 46, 47, 5, 108, 0, 0, 47, 48, 5, 111, 0, 0, 48, 49, 5, 99, 0, 0, 49, 50, 5, 107, 0, 0, 50, 2, 1, 0, 0, 0, 51, 52, 5, 118, 0, 0, 52, 53, 5, 101, 0, 0, 53, 54, 5, 114, 0, 0, 54, 55, 5, 115, 0, 0, 55, 56, 5, 105, 0, 0, 56, 57, 5, 111, 0, 0, 57, 58, 5, 110, 0, 0, 58, 4, 1, 0, 0, 0, 59, 60, 5, 113, 0, 0, 60, 61, 5, 117, 0, 0, 61, 62, 5, 105, 0, 0, 62, 63, 5, 120, 0, 0, 63, 64, 5, 111, 0, 0, 64, 65, 5, 115, 0, 0, 65, 6, 1, 0, 0, 0, 66, 67, 5, 115, 0, 0, 67, 68, 5, 111, 0, 0, 68, 69, 5, 117, 0, 0, 69, 70, 5, 114, 0, 0, 70, 71, 5, 99, 0, 0, 71, 72, 5, 101, 0, 0, 72, 8, 1, 0, 0, 0, 73, 74, 5, 105, 0, 0, 74, 75, 5, 110, 0, 0, 75, 76, 5, 116, 0, 0, 76, 77, 5, 101, 0, 0, 77, 78, 5, 114, 0, 0, 78, 79, 5, 102, 0, 0, 79, 80, 5, 97, 0, 0, 80, 81, 5, 99, 0, 0, 81, 82, 5, 101, 0, 0, 82, 10, 1, 0, 0, 0, 83, 84, 5, 112, 0, 0, 84, 85, 5, 97, 0, 0, 85, 86, 5, 99, 0, 0, 86, 87, 5, 107, 0, 0, 87, 88, 5, 97, 0, 0, 88, 89, 5, 103, 0, 0, 89, 90, 5, 101, 0, 0, 90, 12, 1, 0, 0, 0, 91, 92, 5, 114, 0, 0, 92, 93, 5, 101, 0, 0, 93, 94, 5, 112, 0, 0, 94, 95, 5, 111, 0, 0, 95, 96, 5, 115, 0, 0, 96, 97, 5, 105, 0, 0, 97, 98, 5, 116, 0, 0, 98, 99, 5, 111, 0, 0, 99, 100, 5, 114, 0, 0, 100, 101, 5, 121, 0, 0, 101, 14, 1, 0, 0, 0, 102, 103, 5, 99, 0, 0, 103, 104, 5, 111, 0, 0, 104, 105, 5, 109, 0, 0, 105, 106, 5, 109, 0, 0, 106, 107, 5, 105, 0, 0, 107, 108, 5, 116, 0, 0, 108, 16, 1, 0, 0, 0, 109, 110, 5, 123, 0, 0, 110, 18, 1, 0, 0, 0, 111, 112, 5, 125, 0, 0, 112, 20, 1, 0, 0, 0, 113, 114, 5, 59, 0, 0, 114, 22, 1, 0, 0, 0, 115, 117, 7, 0, 0, 0, 116, 115, 1, 0, 0, 0, 117, 118, 1, 0, 0, 0, 118, 116, 1, 0, 0, 0, 118, 119, 1, 0, 0, 0, 119, 24, 1, 0, 0, 0, 120, 124, 7, 1, 0, 0, 121, 123, 7, 2, 0, 0, 122, 121, 1, 0, 0, 0, 123, 126, 1, 0, 0, 0, 124, 122, 1, 0, 0, 0, 124, 125, 1, 0, 0, 0, 125, 26, 1, 0, 0, 0, 126, 124, 1, 0, 0, 0, 127, 132, 5, 34, 0, 0, 128, 131, 3, 29, 14, 0, 129, 131, 8, 3, 0, 0, 130, 128, 1, 0, 0, 0, 130, 129, 1, 0, 0, 0, 131, 134, 1, 0, 0, 0, 132, 130, 1, 0, 0, 0, 132, 133, 1, 0, 0, 0, 133, 135, 1, 0, 0, 0, 134, 132, 1, 0, 0, 0, 135, 136, 5, 34, 0, 0, 136, 28, 1, 0, 0, 0, 137, 145, 5, 92, 0, 0, 138, 146, 7, 4, 0, 0, 139, 140, 5, 117, 0, 0, 140, 141, 3, 31, 15, 0, 141, 142, 3, 31, 15, 0, 142, 143, 3, 31, 15, 0, 143, 144, 3, 31, 15, 0, 144, 146, 1, 0, 0, 0, 145, 138, 1, 0, 0, 0, 145, 139, 1, 0, 0, 0, 146, 30, 1, 0, 0, 0, 147, 148, 7, 5, 0, 0, 148, 32, 1, 0, 0, 0, 149, 150, 5, 47, 0, 0, 150, 151, 5, 47, 0, 0, 151, 155, 1, 0, 0, 0, 152, 154, 8, 6, 0, 0, 153, 152, 1, 0, 0, 0, 154, 157, 1, 0, 0, 0, 155, 153, 1, 0, 0, 0, 155, 156, 1, 0, 0, 0, 156, 158, 1, 0, 0, 0, 157, 155, 1, 0, 0, 0, 158, 159, 6, 16, 0, 0, 159, 34, 1, 0, 0, 0, 160, 161, 5, 47, 0, 0, 161, 162, 5, 42, 0, 0, 162, 166, 1, 0, 0, 0, 163, 165, 9, 0, 0, 0, 164, 163, 1, 0, 0, 0, 165, 168, 1, 0, 0, 0, 166, 167, 1, 0, 0, 0, 166, 164, 1, 0, 0, 0, 167, 169, 1, 0, 0, 0, 168, 166, 1, 0, 0, 0, 169, 170, 5, 42, 0, 0, 170, 171, 5, 47, 0, 0, 171, 172, 1, 0, 0, 0, 172, 173, 6, 17, 0, 0, 173, 36, 1, 0, 0, 0, 174, 176, 7, 7, 0, 0, 175, 174, 1, 0, 0, 0, 176, 177, 1, 0, 0, 0, 177, 175, 1, 0, 0, 0, 177, 178, 1, 0, 0, 0, 178, 179, 1, 0, 0, 0, 179, 180, 6, 18, 0, 0, 180, 38, 1, 0, 0, 0, 9, 0, 118, 124, 130, 132, 145, 155, 166, 177, 1, 6, 0, 0] \ No newline at end of file +[4, 0, 24, 261, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 16, 1, 16, 1, 17, 1, 17, 1, 18, 4, 18, 197, 8, 18, 11, 18, 12, 18, 198, 1, 19, 1, 19, 5, 19, 203, 8, 19, 10, 19, 12, 19, 206, 9, 19, 1, 20, 1, 20, 1, 20, 5, 20, 211, 8, 20, 10, 20, 12, 20, 214, 9, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 226, 8, 21, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 5, 23, 234, 8, 23, 10, 23, 12, 23, 237, 9, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 5, 24, 245, 8, 24, 10, 24, 12, 24, 248, 9, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 4, 25, 256, 8, 25, 11, 25, 12, 25, 257, 1, 25, 1, 25, 1, 246, 0, 26, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 0, 45, 0, 47, 22, 49, 23, 51, 24, 1, 0, 8, 1, 0, 48, 57, 3, 0, 65, 90, 95, 95, 97, 122, 4, 0, 48, 57, 65, 90, 95, 95, 97, 122, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 8, 0, 34, 34, 47, 47, 92, 92, 98, 98, 102, 102, 110, 110, 114, 114, 116, 116, 3, 0, 48, 57, 65, 70, 97, 102, 2, 0, 10, 10, 13, 13, 3, 0, 9, 10, 13, 13, 32, 32, 266, 0, 1, 1, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, 0, 0, 0, 1, 53, 1, 0, 0, 0, 3, 65, 1, 0, 0, 0, 5, 74, 1, 0, 0, 0, 7, 82, 1, 0, 0, 0, 9, 89, 1, 0, 0, 0, 11, 96, 1, 0, 0, 0, 13, 106, 1, 0, 0, 0, 15, 114, 1, 0, 0, 0, 17, 125, 1, 0, 0, 0, 19, 132, 1, 0, 0, 0, 21, 139, 1, 0, 0, 0, 23, 143, 1, 0, 0, 0, 25, 150, 1, 0, 0, 0, 27, 164, 1, 0, 0, 0, 29, 182, 1, 0, 0, 0, 31, 189, 1, 0, 0, 0, 33, 191, 1, 0, 0, 0, 35, 193, 1, 0, 0, 0, 37, 196, 1, 0, 0, 0, 39, 200, 1, 0, 0, 0, 41, 207, 1, 0, 0, 0, 43, 217, 1, 0, 0, 0, 45, 227, 1, 0, 0, 0, 47, 229, 1, 0, 0, 0, 49, 240, 1, 0, 0, 0, 51, 255, 1, 0, 0, 0, 53, 54, 5, 113, 0, 0, 54, 55, 5, 117, 0, 0, 55, 56, 5, 105, 0, 0, 56, 57, 5, 120, 0, 0, 57, 58, 5, 111, 0, 0, 58, 59, 5, 115, 0, 0, 59, 60, 5, 45, 0, 0, 60, 61, 5, 108, 0, 0, 61, 62, 5, 111, 0, 0, 62, 63, 5, 99, 0, 0, 63, 64, 5, 107, 0, 0, 64, 2, 1, 0, 0, 0, 65, 66, 5, 102, 0, 0, 66, 67, 5, 114, 0, 0, 67, 68, 5, 97, 0, 0, 68, 69, 5, 103, 0, 0, 69, 70, 5, 109, 0, 0, 70, 71, 5, 101, 0, 0, 71, 72, 5, 110, 0, 0, 72, 73, 5, 116, 0, 0, 73, 4, 1, 0, 0, 0, 74, 75, 5, 118, 0, 0, 75, 76, 5, 101, 0, 0, 76, 77, 5, 114, 0, 0, 77, 78, 5, 115, 0, 0, 78, 79, 5, 105, 0, 0, 79, 80, 5, 111, 0, 0, 80, 81, 5, 110, 0, 0, 81, 6, 1, 0, 0, 0, 82, 83, 5, 113, 0, 0, 83, 84, 5, 117, 0, 0, 84, 85, 5, 105, 0, 0, 85, 86, 5, 120, 0, 0, 86, 87, 5, 111, 0, 0, 87, 88, 5, 115, 0, 0, 88, 8, 1, 0, 0, 0, 89, 90, 5, 115, 0, 0, 90, 91, 5, 111, 0, 0, 91, 92, 5, 117, 0, 0, 92, 93, 5, 114, 0, 0, 93, 94, 5, 99, 0, 0, 94, 95, 5, 101, 0, 0, 95, 10, 1, 0, 0, 0, 96, 97, 5, 105, 0, 0, 97, 98, 5, 110, 0, 0, 98, 99, 5, 116, 0, 0, 99, 100, 5, 101, 0, 0, 100, 101, 5, 114, 0, 0, 101, 102, 5, 102, 0, 0, 102, 103, 5, 97, 0, 0, 103, 104, 5, 99, 0, 0, 104, 105, 5, 101, 0, 0, 105, 12, 1, 0, 0, 0, 106, 107, 5, 112, 0, 0, 107, 108, 5, 97, 0, 0, 108, 109, 5, 99, 0, 0, 109, 110, 5, 107, 0, 0, 110, 111, 5, 97, 0, 0, 111, 112, 5, 103, 0, 0, 112, 113, 5, 101, 0, 0, 113, 14, 1, 0, 0, 0, 114, 115, 5, 114, 0, 0, 115, 116, 5, 101, 0, 0, 116, 117, 5, 112, 0, 0, 117, 118, 5, 111, 0, 0, 118, 119, 5, 115, 0, 0, 119, 120, 5, 105, 0, 0, 120, 121, 5, 116, 0, 0, 121, 122, 5, 111, 0, 0, 122, 123, 5, 114, 0, 0, 123, 124, 5, 121, 0, 0, 124, 16, 1, 0, 0, 0, 125, 126, 5, 99, 0, 0, 126, 127, 5, 111, 0, 0, 127, 128, 5, 109, 0, 0, 128, 129, 5, 109, 0, 0, 129, 130, 5, 105, 0, 0, 130, 131, 5, 116, 0, 0, 131, 18, 1, 0, 0, 0, 132, 133, 5, 112, 0, 0, 133, 134, 5, 111, 0, 0, 134, 135, 5, 108, 0, 0, 135, 136, 5, 105, 0, 0, 136, 137, 5, 99, 0, 0, 137, 138, 5, 121, 0, 0, 138, 20, 1, 0, 0, 0, 139, 140, 5, 114, 0, 0, 140, 141, 5, 101, 0, 0, 141, 142, 5, 102, 0, 0, 142, 22, 1, 0, 0, 0, 143, 144, 5, 112, 0, 0, 144, 145, 5, 105, 0, 0, 145, 146, 5, 110, 0, 0, 146, 147, 5, 110, 0, 0, 147, 148, 5, 101, 0, 0, 148, 149, 5, 100, 0, 0, 149, 24, 1, 0, 0, 0, 150, 151, 5, 116, 0, 0, 151, 152, 5, 114, 0, 0, 152, 153, 5, 97, 0, 0, 153, 154, 5, 99, 0, 0, 154, 155, 5, 107, 0, 0, 155, 156, 5, 45, 0, 0, 156, 157, 5, 114, 0, 0, 157, 158, 5, 101, 0, 0, 158, 159, 5, 108, 0, 0, 159, 160, 5, 101, 0, 0, 160, 161, 5, 97, 0, 0, 161, 162, 5, 115, 0, 0, 162, 163, 5, 101, 0, 0, 163, 26, 1, 0, 0, 0, 164, 165, 5, 116, 0, 0, 165, 166, 5, 114, 0, 0, 166, 167, 5, 97, 0, 0, 167, 168, 5, 99, 0, 0, 168, 169, 5, 107, 0, 0, 169, 170, 5, 45, 0, 0, 170, 171, 5, 100, 0, 0, 171, 172, 5, 101, 0, 0, 172, 173, 5, 118, 0, 0, 173, 174, 5, 101, 0, 0, 174, 175, 5, 108, 0, 0, 175, 176, 5, 111, 0, 0, 176, 177, 5, 112, 0, 0, 177, 178, 5, 109, 0, 0, 178, 179, 5, 101, 0, 0, 179, 180, 5, 110, 0, 0, 180, 181, 5, 116, 0, 0, 181, 28, 1, 0, 0, 0, 182, 183, 5, 105, 0, 0, 183, 184, 5, 109, 0, 0, 184, 185, 5, 112, 0, 0, 185, 186, 5, 111, 0, 0, 186, 187, 5, 114, 0, 0, 187, 188, 5, 116, 0, 0, 188, 30, 1, 0, 0, 0, 189, 190, 5, 123, 0, 0, 190, 32, 1, 0, 0, 0, 191, 192, 5, 125, 0, 0, 192, 34, 1, 0, 0, 0, 193, 194, 5, 59, 0, 0, 194, 36, 1, 0, 0, 0, 195, 197, 7, 0, 0, 0, 196, 195, 1, 0, 0, 0, 197, 198, 1, 0, 0, 0, 198, 196, 1, 0, 0, 0, 198, 199, 1, 0, 0, 0, 199, 38, 1, 0, 0, 0, 200, 204, 7, 1, 0, 0, 201, 203, 7, 2, 0, 0, 202, 201, 1, 0, 0, 0, 203, 206, 1, 0, 0, 0, 204, 202, 1, 0, 0, 0, 204, 205, 1, 0, 0, 0, 205, 40, 1, 0, 0, 0, 206, 204, 1, 0, 0, 0, 207, 212, 5, 34, 0, 0, 208, 211, 3, 43, 21, 0, 209, 211, 8, 3, 0, 0, 210, 208, 1, 0, 0, 0, 210, 209, 1, 0, 0, 0, 211, 214, 1, 0, 0, 0, 212, 210, 1, 0, 0, 0, 212, 213, 1, 0, 0, 0, 213, 215, 1, 0, 0, 0, 214, 212, 1, 0, 0, 0, 215, 216, 5, 34, 0, 0, 216, 42, 1, 0, 0, 0, 217, 225, 5, 92, 0, 0, 218, 226, 7, 4, 0, 0, 219, 220, 5, 117, 0, 0, 220, 221, 3, 45, 22, 0, 221, 222, 3, 45, 22, 0, 222, 223, 3, 45, 22, 0, 223, 224, 3, 45, 22, 0, 224, 226, 1, 0, 0, 0, 225, 218, 1, 0, 0, 0, 225, 219, 1, 0, 0, 0, 226, 44, 1, 0, 0, 0, 227, 228, 7, 5, 0, 0, 228, 46, 1, 0, 0, 0, 229, 230, 5, 47, 0, 0, 230, 231, 5, 47, 0, 0, 231, 235, 1, 0, 0, 0, 232, 234, 8, 6, 0, 0, 233, 232, 1, 0, 0, 0, 234, 237, 1, 0, 0, 0, 235, 233, 1, 0, 0, 0, 235, 236, 1, 0, 0, 0, 236, 238, 1, 0, 0, 0, 237, 235, 1, 0, 0, 0, 238, 239, 6, 23, 0, 0, 239, 48, 1, 0, 0, 0, 240, 241, 5, 47, 0, 0, 241, 242, 5, 42, 0, 0, 242, 246, 1, 0, 0, 0, 243, 245, 9, 0, 0, 0, 244, 243, 1, 0, 0, 0, 245, 248, 1, 0, 0, 0, 246, 247, 1, 0, 0, 0, 246, 244, 1, 0, 0, 0, 247, 249, 1, 0, 0, 0, 248, 246, 1, 0, 0, 0, 249, 250, 5, 42, 0, 0, 250, 251, 5, 47, 0, 0, 251, 252, 1, 0, 0, 0, 252, 253, 6, 24, 0, 0, 253, 50, 1, 0, 0, 0, 254, 256, 7, 7, 0, 0, 255, 254, 1, 0, 0, 0, 256, 257, 1, 0, 0, 0, 257, 255, 1, 0, 0, 0, 257, 258, 1, 0, 0, 0, 258, 259, 1, 0, 0, 0, 259, 260, 6, 25, 0, 0, 260, 52, 1, 0, 0, 0, 9, 0, 198, 204, 210, 212, 225, 235, 246, 257, 1, 6, 0, 0] \ No newline at end of file diff --git a/src/resource-lock/generated/QuixosLockLexer.tokens b/src/resource-lock/generated/QuixosLockLexer.tokens index cdb2ae8..fe6ae89 100644 --- a/src/resource-lock/generated/QuixosLockLexer.tokens +++ b/src/resource-lock/generated/QuixosLockLexer.tokens @@ -1,28 +1,42 @@ QUIXOS_LOCK=1 -VERSION=2 -QUIXOS=3 -SOURCE=4 -INTERFACE=5 -PACKAGE=6 -REPOSITORY=7 -COMMIT=8 -LBRACE=9 -RBRACE=10 -SEMI=11 -INTEGER=12 -IDENTIFIER=13 -STRING_LITERAL=14 -LINE_COMMENT=15 -BLOCK_COMMENT=16 -WS=17 +FRAGMENT=2 +VERSION=3 +QUIXOS=4 +SOURCE=5 +INTERFACE=6 +PACKAGE=7 +REPOSITORY=8 +COMMIT=9 +POLICY=10 +REF=11 +PINNED=12 +TRACK_RELEASE=13 +TRACK_DEVELOPMENT=14 +IMPORT=15 +LBRACE=16 +RBRACE=17 +SEMI=18 +INTEGER=19 +IDENTIFIER=20 +STRING_LITERAL=21 +LINE_COMMENT=22 +BLOCK_COMMENT=23 +WS=24 'quixos-lock'=1 -'version'=2 -'quixos'=3 -'source'=4 -'interface'=5 -'package'=6 -'repository'=7 -'commit'=8 -'{'=9 -'}'=10 -';'=11 +'fragment'=2 +'version'=3 +'quixos'=4 +'source'=5 +'interface'=6 +'package'=7 +'repository'=8 +'commit'=9 +'policy'=10 +'ref'=11 +'pinned'=12 +'track-release'=13 +'track-development'=14 +'import'=15 +'{'=16 +'}'=17 +';'=18 diff --git a/src/resource-lock/generated/QuixosLockLexer.ts b/src/resource-lock/generated/QuixosLockLexer.ts index 6d007bf..30003f3 100644 --- a/src/resource-lock/generated/QuixosLockLexer.ts +++ b/src/resource-lock/generated/QuixosLockLexer.ts @@ -5,37 +5,47 @@ import { Token } from "antlr4ng"; export class QuixosLockLexer extends antlr.Lexer { public static readonly QUIXOS_LOCK = 1; - public static readonly VERSION = 2; - public static readonly QUIXOS = 3; - public static readonly SOURCE = 4; - public static readonly INTERFACE = 5; - public static readonly PACKAGE = 6; - public static readonly REPOSITORY = 7; - public static readonly COMMIT = 8; - public static readonly LBRACE = 9; - public static readonly RBRACE = 10; - public static readonly SEMI = 11; - public static readonly INTEGER = 12; - public static readonly IDENTIFIER = 13; - public static readonly STRING_LITERAL = 14; - public static readonly LINE_COMMENT = 15; - public static readonly BLOCK_COMMENT = 16; - public static readonly WS = 17; + public static readonly FRAGMENT = 2; + public static readonly VERSION = 3; + public static readonly QUIXOS = 4; + public static readonly SOURCE = 5; + public static readonly INTERFACE = 6; + public static readonly PACKAGE = 7; + public static readonly REPOSITORY = 8; + public static readonly COMMIT = 9; + public static readonly POLICY = 10; + public static readonly REF = 11; + public static readonly PINNED = 12; + public static readonly TRACK_RELEASE = 13; + public static readonly TRACK_DEVELOPMENT = 14; + public static readonly IMPORT = 15; + public static readonly LBRACE = 16; + public static readonly RBRACE = 17; + public static readonly SEMI = 18; + public static readonly INTEGER = 19; + public static readonly IDENTIFIER = 20; + public static readonly STRING_LITERAL = 21; + public static readonly LINE_COMMENT = 22; + public static readonly BLOCK_COMMENT = 23; + public static readonly WS = 24; public static readonly channelNames = [ "DEFAULT_TOKEN_CHANNEL", "HIDDEN" ]; public static readonly literalNames = [ - null, "'quixos-lock'", "'version'", "'quixos'", "'source'", "'interface'", - "'package'", "'repository'", "'commit'", "'{'", "'}'", "';'" + null, "'quixos-lock'", "'fragment'", "'version'", "'quixos'", "'source'", + "'interface'", "'package'", "'repository'", "'commit'", "'policy'", + "'ref'", "'pinned'", "'track-release'", "'track-development'", "'import'", + "'{'", "'}'", "';'" ]; public static readonly symbolicNames = [ - null, "QUIXOS_LOCK", "VERSION", "QUIXOS", "SOURCE", "INTERFACE", - "PACKAGE", "REPOSITORY", "COMMIT", "LBRACE", "RBRACE", "SEMI", "INTEGER", - "IDENTIFIER", "STRING_LITERAL", "LINE_COMMENT", "BLOCK_COMMENT", - "WS" + null, "QUIXOS_LOCK", "FRAGMENT", "VERSION", "QUIXOS", "SOURCE", + "INTERFACE", "PACKAGE", "REPOSITORY", "COMMIT", "POLICY", "REF", + "PINNED", "TRACK_RELEASE", "TRACK_DEVELOPMENT", "IMPORT", "LBRACE", + "RBRACE", "SEMI", "INTEGER", "IDENTIFIER", "STRING_LITERAL", "LINE_COMMENT", + "BLOCK_COMMENT", "WS" ]; public static readonly modeNames = [ @@ -43,9 +53,10 @@ export class QuixosLockLexer extends antlr.Lexer { ]; public static readonly ruleNames = [ - "QUIXOS_LOCK", "VERSION", "QUIXOS", "SOURCE", "INTERFACE", "PACKAGE", - "REPOSITORY", "COMMIT", "LBRACE", "RBRACE", "SEMI", "INTEGER", "IDENTIFIER", - "STRING_LITERAL", "ESC", "HEX", "LINE_COMMENT", "BLOCK_COMMENT", + "QUIXOS_LOCK", "FRAGMENT", "VERSION", "QUIXOS", "SOURCE", "INTERFACE", + "PACKAGE", "REPOSITORY", "COMMIT", "POLICY", "REF", "PINNED", "TRACK_RELEASE", + "TRACK_DEVELOPMENT", "IMPORT", "LBRACE", "RBRACE", "SEMI", "INTEGER", + "IDENTIFIER", "STRING_LITERAL", "ESC", "HEX", "LINE_COMMENT", "BLOCK_COMMENT", "WS", ]; @@ -68,70 +79,98 @@ export class QuixosLockLexer extends antlr.Lexer { public get modeNames(): string[] { return QuixosLockLexer.modeNames; } public static readonly _serializedATN: number[] = [ - 4,0,17,181,6,-1,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5, + 4,0,24,261,6,-1,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5, 2,6,7,6,2,7,7,7,2,8,7,8,2,9,7,9,2,10,7,10,2,11,7,11,2,12,7,12,2, - 13,7,13,2,14,7,14,2,15,7,15,2,16,7,16,2,17,7,17,2,18,7,18,1,0,1, - 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,3,1,3,1,3,1,3,1,3,1,3,1, - 3,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,5,1,5,1,5,1,5,1,5,1, - 5,1,5,1,5,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,7,1,7,1, - 7,1,7,1,7,1,7,1,7,1,8,1,8,1,9,1,9,1,10,1,10,1,11,4,11,117,8,11,11, - 11,12,11,118,1,12,1,12,5,12,123,8,12,10,12,12,12,126,9,12,1,13,1, - 13,1,13,5,13,131,8,13,10,13,12,13,134,9,13,1,13,1,13,1,14,1,14,1, - 14,1,14,1,14,1,14,1,14,1,14,3,14,146,8,14,1,15,1,15,1,16,1,16,1, - 16,1,16,5,16,154,8,16,10,16,12,16,157,9,16,1,16,1,16,1,17,1,17,1, - 17,1,17,5,17,165,8,17,10,17,12,17,168,9,17,1,17,1,17,1,17,1,17,1, - 17,1,18,4,18,176,8,18,11,18,12,18,177,1,18,1,18,1,166,0,19,1,1,3, + 13,7,13,2,14,7,14,2,15,7,15,2,16,7,16,2,17,7,17,2,18,7,18,2,19,7, + 19,2,20,7,20,2,21,7,21,2,22,7,22,2,23,7,23,2,24,7,24,2,25,7,25,1, + 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,3,1,3,1,3,1, + 3,1,3,1,3,1,3,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,5,1,5,1,5,1,5,1,5,1, + 5,1,5,1,5,1,5,1,5,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,7,1,7,1,7,1, + 7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,9,1, + 9,1,9,1,9,1,9,1,9,1,9,1,10,1,10,1,10,1,10,1,11,1,11,1,11,1,11,1, + 11,1,11,1,11,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1, + 12,1,12,1,12,1,12,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1, + 13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,14,1,14,1,14,1,14,1, + 14,1,14,1,14,1,15,1,15,1,16,1,16,1,17,1,17,1,18,4,18,197,8,18,11, + 18,12,18,198,1,19,1,19,5,19,203,8,19,10,19,12,19,206,9,19,1,20,1, + 20,1,20,5,20,211,8,20,10,20,12,20,214,9,20,1,20,1,20,1,21,1,21,1, + 21,1,21,1,21,1,21,1,21,1,21,3,21,226,8,21,1,22,1,22,1,23,1,23,1, + 23,1,23,5,23,234,8,23,10,23,12,23,237,9,23,1,23,1,23,1,24,1,24,1, + 24,1,24,5,24,245,8,24,10,24,12,24,248,9,24,1,24,1,24,1,24,1,24,1, + 24,1,25,4,25,256,8,25,11,25,12,25,257,1,25,1,25,1,246,0,26,1,1,3, 2,5,3,7,4,9,5,11,6,13,7,15,8,17,9,19,10,21,11,23,12,25,13,27,14, - 29,0,31,0,33,15,35,16,37,17,1,0,8,1,0,48,57,3,0,65,90,95,95,97,122, - 4,0,48,57,65,90,95,95,97,122,4,0,10,10,13,13,34,34,92,92,8,0,34, - 34,47,47,92,92,98,98,102,102,110,110,114,114,116,116,3,0,48,57,65, - 70,97,102,2,0,10,10,13,13,3,0,9,10,13,13,32,32,186,0,1,1,0,0,0,0, - 3,1,0,0,0,0,5,1,0,0,0,0,7,1,0,0,0,0,9,1,0,0,0,0,11,1,0,0,0,0,13, - 1,0,0,0,0,15,1,0,0,0,0,17,1,0,0,0,0,19,1,0,0,0,0,21,1,0,0,0,0,23, - 1,0,0,0,0,25,1,0,0,0,0,27,1,0,0,0,0,33,1,0,0,0,0,35,1,0,0,0,0,37, - 1,0,0,0,1,39,1,0,0,0,3,51,1,0,0,0,5,59,1,0,0,0,7,66,1,0,0,0,9,73, - 1,0,0,0,11,83,1,0,0,0,13,91,1,0,0,0,15,102,1,0,0,0,17,109,1,0,0, - 0,19,111,1,0,0,0,21,113,1,0,0,0,23,116,1,0,0,0,25,120,1,0,0,0,27, - 127,1,0,0,0,29,137,1,0,0,0,31,147,1,0,0,0,33,149,1,0,0,0,35,160, - 1,0,0,0,37,175,1,0,0,0,39,40,5,113,0,0,40,41,5,117,0,0,41,42,5,105, - 0,0,42,43,5,120,0,0,43,44,5,111,0,0,44,45,5,115,0,0,45,46,5,45,0, - 0,46,47,5,108,0,0,47,48,5,111,0,0,48,49,5,99,0,0,49,50,5,107,0,0, - 50,2,1,0,0,0,51,52,5,118,0,0,52,53,5,101,0,0,53,54,5,114,0,0,54, - 55,5,115,0,0,55,56,5,105,0,0,56,57,5,111,0,0,57,58,5,110,0,0,58, - 4,1,0,0,0,59,60,5,113,0,0,60,61,5,117,0,0,61,62,5,105,0,0,62,63, - 5,120,0,0,63,64,5,111,0,0,64,65,5,115,0,0,65,6,1,0,0,0,66,67,5,115, - 0,0,67,68,5,111,0,0,68,69,5,117,0,0,69,70,5,114,0,0,70,71,5,99,0, - 0,71,72,5,101,0,0,72,8,1,0,0,0,73,74,5,105,0,0,74,75,5,110,0,0,75, - 76,5,116,0,0,76,77,5,101,0,0,77,78,5,114,0,0,78,79,5,102,0,0,79, - 80,5,97,0,0,80,81,5,99,0,0,81,82,5,101,0,0,82,10,1,0,0,0,83,84,5, - 112,0,0,84,85,5,97,0,0,85,86,5,99,0,0,86,87,5,107,0,0,87,88,5,97, - 0,0,88,89,5,103,0,0,89,90,5,101,0,0,90,12,1,0,0,0,91,92,5,114,0, - 0,92,93,5,101,0,0,93,94,5,112,0,0,94,95,5,111,0,0,95,96,5,115,0, - 0,96,97,5,105,0,0,97,98,5,116,0,0,98,99,5,111,0,0,99,100,5,114,0, - 0,100,101,5,121,0,0,101,14,1,0,0,0,102,103,5,99,0,0,103,104,5,111, - 0,0,104,105,5,109,0,0,105,106,5,109,0,0,106,107,5,105,0,0,107,108, - 5,116,0,0,108,16,1,0,0,0,109,110,5,123,0,0,110,18,1,0,0,0,111,112, - 5,125,0,0,112,20,1,0,0,0,113,114,5,59,0,0,114,22,1,0,0,0,115,117, - 7,0,0,0,116,115,1,0,0,0,117,118,1,0,0,0,118,116,1,0,0,0,118,119, - 1,0,0,0,119,24,1,0,0,0,120,124,7,1,0,0,121,123,7,2,0,0,122,121,1, - 0,0,0,123,126,1,0,0,0,124,122,1,0,0,0,124,125,1,0,0,0,125,26,1,0, - 0,0,126,124,1,0,0,0,127,132,5,34,0,0,128,131,3,29,14,0,129,131,8, - 3,0,0,130,128,1,0,0,0,130,129,1,0,0,0,131,134,1,0,0,0,132,130,1, - 0,0,0,132,133,1,0,0,0,133,135,1,0,0,0,134,132,1,0,0,0,135,136,5, - 34,0,0,136,28,1,0,0,0,137,145,5,92,0,0,138,146,7,4,0,0,139,140,5, - 117,0,0,140,141,3,31,15,0,141,142,3,31,15,0,142,143,3,31,15,0,143, - 144,3,31,15,0,144,146,1,0,0,0,145,138,1,0,0,0,145,139,1,0,0,0,146, - 30,1,0,0,0,147,148,7,5,0,0,148,32,1,0,0,0,149,150,5,47,0,0,150,151, - 5,47,0,0,151,155,1,0,0,0,152,154,8,6,0,0,153,152,1,0,0,0,154,157, - 1,0,0,0,155,153,1,0,0,0,155,156,1,0,0,0,156,158,1,0,0,0,157,155, - 1,0,0,0,158,159,6,16,0,0,159,34,1,0,0,0,160,161,5,47,0,0,161,162, - 5,42,0,0,162,166,1,0,0,0,163,165,9,0,0,0,164,163,1,0,0,0,165,168, - 1,0,0,0,166,167,1,0,0,0,166,164,1,0,0,0,167,169,1,0,0,0,168,166, - 1,0,0,0,169,170,5,42,0,0,170,171,5,47,0,0,171,172,1,0,0,0,172,173, - 6,17,0,0,173,36,1,0,0,0,174,176,7,7,0,0,175,174,1,0,0,0,176,177, - 1,0,0,0,177,175,1,0,0,0,177,178,1,0,0,0,178,179,1,0,0,0,179,180, - 6,18,0,0,180,38,1,0,0,0,9,0,118,124,130,132,145,155,166,177,1,6, + 29,15,31,16,33,17,35,18,37,19,39,20,41,21,43,0,45,0,47,22,49,23, + 51,24,1,0,8,1,0,48,57,3,0,65,90,95,95,97,122,4,0,48,57,65,90,95, + 95,97,122,4,0,10,10,13,13,34,34,92,92,8,0,34,34,47,47,92,92,98,98, + 102,102,110,110,114,114,116,116,3,0,48,57,65,70,97,102,2,0,10,10, + 13,13,3,0,9,10,13,13,32,32,266,0,1,1,0,0,0,0,3,1,0,0,0,0,5,1,0,0, + 0,0,7,1,0,0,0,0,9,1,0,0,0,0,11,1,0,0,0,0,13,1,0,0,0,0,15,1,0,0,0, + 0,17,1,0,0,0,0,19,1,0,0,0,0,21,1,0,0,0,0,23,1,0,0,0,0,25,1,0,0,0, + 0,27,1,0,0,0,0,29,1,0,0,0,0,31,1,0,0,0,0,33,1,0,0,0,0,35,1,0,0,0, + 0,37,1,0,0,0,0,39,1,0,0,0,0,41,1,0,0,0,0,47,1,0,0,0,0,49,1,0,0,0, + 0,51,1,0,0,0,1,53,1,0,0,0,3,65,1,0,0,0,5,74,1,0,0,0,7,82,1,0,0,0, + 9,89,1,0,0,0,11,96,1,0,0,0,13,106,1,0,0,0,15,114,1,0,0,0,17,125, + 1,0,0,0,19,132,1,0,0,0,21,139,1,0,0,0,23,143,1,0,0,0,25,150,1,0, + 0,0,27,164,1,0,0,0,29,182,1,0,0,0,31,189,1,0,0,0,33,191,1,0,0,0, + 35,193,1,0,0,0,37,196,1,0,0,0,39,200,1,0,0,0,41,207,1,0,0,0,43,217, + 1,0,0,0,45,227,1,0,0,0,47,229,1,0,0,0,49,240,1,0,0,0,51,255,1,0, + 0,0,53,54,5,113,0,0,54,55,5,117,0,0,55,56,5,105,0,0,56,57,5,120, + 0,0,57,58,5,111,0,0,58,59,5,115,0,0,59,60,5,45,0,0,60,61,5,108,0, + 0,61,62,5,111,0,0,62,63,5,99,0,0,63,64,5,107,0,0,64,2,1,0,0,0,65, + 66,5,102,0,0,66,67,5,114,0,0,67,68,5,97,0,0,68,69,5,103,0,0,69,70, + 5,109,0,0,70,71,5,101,0,0,71,72,5,110,0,0,72,73,5,116,0,0,73,4,1, + 0,0,0,74,75,5,118,0,0,75,76,5,101,0,0,76,77,5,114,0,0,77,78,5,115, + 0,0,78,79,5,105,0,0,79,80,5,111,0,0,80,81,5,110,0,0,81,6,1,0,0,0, + 82,83,5,113,0,0,83,84,5,117,0,0,84,85,5,105,0,0,85,86,5,120,0,0, + 86,87,5,111,0,0,87,88,5,115,0,0,88,8,1,0,0,0,89,90,5,115,0,0,90, + 91,5,111,0,0,91,92,5,117,0,0,92,93,5,114,0,0,93,94,5,99,0,0,94,95, + 5,101,0,0,95,10,1,0,0,0,96,97,5,105,0,0,97,98,5,110,0,0,98,99,5, + 116,0,0,99,100,5,101,0,0,100,101,5,114,0,0,101,102,5,102,0,0,102, + 103,5,97,0,0,103,104,5,99,0,0,104,105,5,101,0,0,105,12,1,0,0,0,106, + 107,5,112,0,0,107,108,5,97,0,0,108,109,5,99,0,0,109,110,5,107,0, + 0,110,111,5,97,0,0,111,112,5,103,0,0,112,113,5,101,0,0,113,14,1, + 0,0,0,114,115,5,114,0,0,115,116,5,101,0,0,116,117,5,112,0,0,117, + 118,5,111,0,0,118,119,5,115,0,0,119,120,5,105,0,0,120,121,5,116, + 0,0,121,122,5,111,0,0,122,123,5,114,0,0,123,124,5,121,0,0,124,16, + 1,0,0,0,125,126,5,99,0,0,126,127,5,111,0,0,127,128,5,109,0,0,128, + 129,5,109,0,0,129,130,5,105,0,0,130,131,5,116,0,0,131,18,1,0,0,0, + 132,133,5,112,0,0,133,134,5,111,0,0,134,135,5,108,0,0,135,136,5, + 105,0,0,136,137,5,99,0,0,137,138,5,121,0,0,138,20,1,0,0,0,139,140, + 5,114,0,0,140,141,5,101,0,0,141,142,5,102,0,0,142,22,1,0,0,0,143, + 144,5,112,0,0,144,145,5,105,0,0,145,146,5,110,0,0,146,147,5,110, + 0,0,147,148,5,101,0,0,148,149,5,100,0,0,149,24,1,0,0,0,150,151,5, + 116,0,0,151,152,5,114,0,0,152,153,5,97,0,0,153,154,5,99,0,0,154, + 155,5,107,0,0,155,156,5,45,0,0,156,157,5,114,0,0,157,158,5,101,0, + 0,158,159,5,108,0,0,159,160,5,101,0,0,160,161,5,97,0,0,161,162,5, + 115,0,0,162,163,5,101,0,0,163,26,1,0,0,0,164,165,5,116,0,0,165,166, + 5,114,0,0,166,167,5,97,0,0,167,168,5,99,0,0,168,169,5,107,0,0,169, + 170,5,45,0,0,170,171,5,100,0,0,171,172,5,101,0,0,172,173,5,118,0, + 0,173,174,5,101,0,0,174,175,5,108,0,0,175,176,5,111,0,0,176,177, + 5,112,0,0,177,178,5,109,0,0,178,179,5,101,0,0,179,180,5,110,0,0, + 180,181,5,116,0,0,181,28,1,0,0,0,182,183,5,105,0,0,183,184,5,109, + 0,0,184,185,5,112,0,0,185,186,5,111,0,0,186,187,5,114,0,0,187,188, + 5,116,0,0,188,30,1,0,0,0,189,190,5,123,0,0,190,32,1,0,0,0,191,192, + 5,125,0,0,192,34,1,0,0,0,193,194,5,59,0,0,194,36,1,0,0,0,195,197, + 7,0,0,0,196,195,1,0,0,0,197,198,1,0,0,0,198,196,1,0,0,0,198,199, + 1,0,0,0,199,38,1,0,0,0,200,204,7,1,0,0,201,203,7,2,0,0,202,201,1, + 0,0,0,203,206,1,0,0,0,204,202,1,0,0,0,204,205,1,0,0,0,205,40,1,0, + 0,0,206,204,1,0,0,0,207,212,5,34,0,0,208,211,3,43,21,0,209,211,8, + 3,0,0,210,208,1,0,0,0,210,209,1,0,0,0,211,214,1,0,0,0,212,210,1, + 0,0,0,212,213,1,0,0,0,213,215,1,0,0,0,214,212,1,0,0,0,215,216,5, + 34,0,0,216,42,1,0,0,0,217,225,5,92,0,0,218,226,7,4,0,0,219,220,5, + 117,0,0,220,221,3,45,22,0,221,222,3,45,22,0,222,223,3,45,22,0,223, + 224,3,45,22,0,224,226,1,0,0,0,225,218,1,0,0,0,225,219,1,0,0,0,226, + 44,1,0,0,0,227,228,7,5,0,0,228,46,1,0,0,0,229,230,5,47,0,0,230,231, + 5,47,0,0,231,235,1,0,0,0,232,234,8,6,0,0,233,232,1,0,0,0,234,237, + 1,0,0,0,235,233,1,0,0,0,235,236,1,0,0,0,236,238,1,0,0,0,237,235, + 1,0,0,0,238,239,6,23,0,0,239,48,1,0,0,0,240,241,5,47,0,0,241,242, + 5,42,0,0,242,246,1,0,0,0,243,245,9,0,0,0,244,243,1,0,0,0,245,248, + 1,0,0,0,246,247,1,0,0,0,246,244,1,0,0,0,247,249,1,0,0,0,248,246, + 1,0,0,0,249,250,5,42,0,0,250,251,5,47,0,0,251,252,1,0,0,0,252,253, + 6,24,0,0,253,50,1,0,0,0,254,256,7,7,0,0,255,254,1,0,0,0,256,257, + 1,0,0,0,257,255,1,0,0,0,257,258,1,0,0,0,258,259,1,0,0,0,259,260, + 6,25,0,0,260,52,1,0,0,0,9,0,198,204,210,212,225,235,246,257,1,6, 0,0 ]; diff --git a/src/resource-lock/generated/QuixosLockParser.ts b/src/resource-lock/generated/QuixosLockParser.ts index ada6180..7f413ef 100644 --- a/src/resource-lock/generated/QuixosLockParser.ts +++ b/src/resource-lock/generated/QuixosLockParser.ts @@ -11,44 +11,58 @@ type int = number; export class QuixosLockParser extends antlr.Parser { public static readonly QUIXOS_LOCK = 1; - public static readonly VERSION = 2; - public static readonly QUIXOS = 3; - public static readonly SOURCE = 4; - public static readonly INTERFACE = 5; - public static readonly PACKAGE = 6; - public static readonly REPOSITORY = 7; - public static readonly COMMIT = 8; - public static readonly LBRACE = 9; - public static readonly RBRACE = 10; - public static readonly SEMI = 11; - public static readonly INTEGER = 12; - public static readonly IDENTIFIER = 13; - public static readonly STRING_LITERAL = 14; - public static readonly LINE_COMMENT = 15; - public static readonly BLOCK_COMMENT = 16; - public static readonly WS = 17; + public static readonly FRAGMENT = 2; + public static readonly VERSION = 3; + public static readonly QUIXOS = 4; + public static readonly SOURCE = 5; + public static readonly INTERFACE = 6; + public static readonly PACKAGE = 7; + public static readonly REPOSITORY = 8; + public static readonly COMMIT = 9; + public static readonly POLICY = 10; + public static readonly REF = 11; + public static readonly PINNED = 12; + public static readonly TRACK_RELEASE = 13; + public static readonly TRACK_DEVELOPMENT = 14; + public static readonly IMPORT = 15; + public static readonly LBRACE = 16; + public static readonly RBRACE = 17; + public static readonly SEMI = 18; + public static readonly INTEGER = 19; + public static readonly IDENTIFIER = 20; + public static readonly STRING_LITERAL = 21; + public static readonly LINE_COMMENT = 22; + public static readonly BLOCK_COMMENT = 23; + public static readonly WS = 24; public static readonly RULE_document = 0; public static readonly RULE_quixosEntry = 1; public static readonly RULE_resourceEntry = 2; - public static readonly RULE_resourceKind = 3; - public static readonly RULE_sourceBlock = 4; - public static readonly RULE_identifier = 5; - public static readonly RULE_stringLiteral = 6; + public static readonly RULE_importEntry = 3; + public static readonly RULE_resourceKind = 4; + public static readonly RULE_sourceBlock = 5; + public static readonly RULE_quixosSourceBlock = 6; + public static readonly RULE_sourcePolicy = 7; + public static readonly RULE_identifier = 8; + public static readonly RULE_stringLiteral = 9; public static readonly literalNames = [ - null, "'quixos-lock'", "'version'", "'quixos'", "'source'", "'interface'", - "'package'", "'repository'", "'commit'", "'{'", "'}'", "';'" + null, "'quixos-lock'", "'fragment'", "'version'", "'quixos'", "'source'", + "'interface'", "'package'", "'repository'", "'commit'", "'policy'", + "'ref'", "'pinned'", "'track-release'", "'track-development'", "'import'", + "'{'", "'}'", "';'" ]; public static readonly symbolicNames = [ - null, "QUIXOS_LOCK", "VERSION", "QUIXOS", "SOURCE", "INTERFACE", - "PACKAGE", "REPOSITORY", "COMMIT", "LBRACE", "RBRACE", "SEMI", "INTEGER", - "IDENTIFIER", "STRING_LITERAL", "LINE_COMMENT", "BLOCK_COMMENT", - "WS" + null, "QUIXOS_LOCK", "FRAGMENT", "VERSION", "QUIXOS", "SOURCE", + "INTERFACE", "PACKAGE", "REPOSITORY", "COMMIT", "POLICY", "REF", + "PINNED", "TRACK_RELEASE", "TRACK_DEVELOPMENT", "IMPORT", "LBRACE", + "RBRACE", "SEMI", "INTEGER", "IDENTIFIER", "STRING_LITERAL", "LINE_COMMENT", + "BLOCK_COMMENT", "WS" ]; public static readonly ruleNames = [ - "document", "quixosEntry", "resourceEntry", "resourceKind", "sourceBlock", - "identifier", "stringLiteral", + "document", "quixosEntry", "resourceEntry", "importEntry", "resourceKind", + "sourceBlock", "quixosSourceBlock", "sourcePolicy", "identifier", + "stringLiteral", ]; public get grammarFileName(): string { return "QuixosLock.g4"; } @@ -72,33 +86,62 @@ export class QuixosLockParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 14; + this.state = 20; this.match(QuixosLockParser.QUIXOS_LOCK); - this.state = 15; - this.match(QuixosLockParser.VERSION); - this.state = 16; - this.match(QuixosLockParser.INTEGER); - this.state = 17; - this.match(QuixosLockParser.LBRACE); - this.state = 18; - this.quixosEntry(); this.state = 22; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 5 || _la === 6) { + if (_la === 2) { { + this.state = 21; + this.match(QuixosLockParser.FRAGMENT); + } + } + + this.state = 24; + this.match(QuixosLockParser.VERSION); + this.state = 25; + this.match(QuixosLockParser.INTEGER); + this.state = 26; + this.match(QuixosLockParser.LBRACE); + this.state = 32; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 32976) !== 0)) { { - this.state = 19; - this.resourceEntry(); + this.state = 30; + this.errorHandler.sync(this); + switch (this.tokenStream.LA(1)) { + case QuixosLockParser.QUIXOS: + { + this.state = 27; + this.quixosEntry(); + } + break; + case QuixosLockParser.IMPORT: + { + this.state = 28; + this.importEntry(); + } + break; + case QuixosLockParser.INTERFACE: + case QuixosLockParser.PACKAGE: + { + this.state = 29; + this.resourceEntry(); + } + break; + default: + throw new antlr.NoViableAltException(this); } } - this.state = 24; + this.state = 34; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 25; + this.state = 35; this.match(QuixosLockParser.RBRACE); - this.state = 26; + this.state = 36; this.match(QuixosLockParser.EOF); } } @@ -121,12 +164,12 @@ export class QuixosLockParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 28; + this.state = 38; this.match(QuixosLockParser.QUIXOS); - this.state = 29; + this.state = 39; this.match(QuixosLockParser.SOURCE); - this.state = 30; - this.sourceBlock(); + this.state = 40; + this.quixosSourceBlock(); } } catch (re) { @@ -148,13 +191,13 @@ export class QuixosLockParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 32; + this.state = 42; this.resourceKind(); - this.state = 33; + this.state = 43; this.identifier(); - this.state = 34; + this.state = 44; this.match(QuixosLockParser.SOURCE); - this.state = 35; + this.state = 45; this.sourceBlock(); } } @@ -171,16 +214,43 @@ export class QuixosLockParser extends antlr.Parser { } return localContext; } + public importEntry(): ImportEntryContext { + let localContext = new ImportEntryContext(this.context, this.state); + this.enterRule(localContext, 6, QuixosLockParser.RULE_importEntry); + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 47; + this.match(QuixosLockParser.IMPORT); + this.state = 48; + this.stringLiteral(); + this.state = 49; + this.match(QuixosLockParser.SEMI); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } public resourceKind(): ResourceKindContext { let localContext = new ResourceKindContext(this.context, this.state); - this.enterRule(localContext, 6, QuixosLockParser.RULE_resourceKind); + this.enterRule(localContext, 8, QuixosLockParser.RULE_resourceKind); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 37; + this.state = 51; _la = this.tokenStream.LA(1); - if(!(_la === 5 || _la === 6)) { + if(!(_la === 6 || _la === 7)) { this.errorHandler.recoverInline(this); } else { @@ -204,25 +274,25 @@ export class QuixosLockParser extends antlr.Parser { } public sourceBlock(): SourceBlockContext { let localContext = new SourceBlockContext(this.context, this.state); - this.enterRule(localContext, 8, QuixosLockParser.RULE_sourceBlock); + this.enterRule(localContext, 10, QuixosLockParser.RULE_sourceBlock); try { this.enterOuterAlt(localContext, 1); { - this.state = 39; + this.state = 53; this.match(QuixosLockParser.LBRACE); - this.state = 40; + this.state = 54; this.match(QuixosLockParser.REPOSITORY); - this.state = 41; + this.state = 55; this.stringLiteral(); - this.state = 42; + this.state = 56; this.match(QuixosLockParser.SEMI); - this.state = 43; + this.state = 57; this.match(QuixosLockParser.COMMIT); - this.state = 44; + this.state = 58; this.stringLiteral(); - this.state = 45; + this.state = 59; this.match(QuixosLockParser.SEMI); - this.state = 46; + this.state = 60; this.match(QuixosLockParser.RBRACE); } } @@ -239,13 +309,102 @@ export class QuixosLockParser extends antlr.Parser { } return localContext; } + public quixosSourceBlock(): QuixosSourceBlockContext { + let localContext = new QuixosSourceBlockContext(this.context, this.state); + this.enterRule(localContext, 12, QuixosLockParser.RULE_quixosSourceBlock); + let _la: number; + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 62; + this.match(QuixosLockParser.LBRACE); + this.state = 63; + this.match(QuixosLockParser.REPOSITORY); + this.state = 64; + this.stringLiteral(); + this.state = 65; + this.match(QuixosLockParser.SEMI); + this.state = 73; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 10) { + { + this.state = 66; + this.match(QuixosLockParser.POLICY); + this.state = 67; + this.sourcePolicy(); + this.state = 68; + this.match(QuixosLockParser.SEMI); + this.state = 69; + this.match(QuixosLockParser.REF); + this.state = 70; + this.stringLiteral(); + this.state = 71; + this.match(QuixosLockParser.SEMI); + } + } + + this.state = 75; + this.match(QuixosLockParser.COMMIT); + this.state = 76; + this.stringLiteral(); + this.state = 77; + this.match(QuixosLockParser.SEMI); + this.state = 78; + this.match(QuixosLockParser.RBRACE); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public sourcePolicy(): SourcePolicyContext { + let localContext = new SourcePolicyContext(this.context, this.state); + this.enterRule(localContext, 14, QuixosLockParser.RULE_sourcePolicy); + let _la: number; + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 80; + _la = this.tokenStream.LA(1); + if(!((((_la) & ~0x1F) === 0 && ((1 << _la) & 28672) !== 0))) { + this.errorHandler.recoverInline(this); + } + else { + this.errorHandler.reportMatch(this); + this.consume(); + } + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } public identifier(): IdentifierContext { let localContext = new IdentifierContext(this.context, this.state); - this.enterRule(localContext, 10, QuixosLockParser.RULE_identifier); + this.enterRule(localContext, 16, QuixosLockParser.RULE_identifier); try { this.enterOuterAlt(localContext, 1); { - this.state = 48; + this.state = 82; this.match(QuixosLockParser.IDENTIFIER); } } @@ -264,11 +423,11 @@ export class QuixosLockParser extends antlr.Parser { } public stringLiteral(): StringLiteralContext { let localContext = new StringLiteralContext(this.context, this.state); - this.enterRule(localContext, 12, QuixosLockParser.RULE_stringLiteral); + this.enterRule(localContext, 18, QuixosLockParser.RULE_stringLiteral); try { this.enterOuterAlt(localContext, 1); { - this.state = 50; + this.state = 84; this.match(QuixosLockParser.STRING_LITERAL); } } @@ -287,21 +446,31 @@ export class QuixosLockParser extends antlr.Parser { } public static readonly _serializedATN: number[] = [ - 4,1,17,53,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6,7, - 6,1,0,1,0,1,0,1,0,1,0,1,0,5,0,21,8,0,10,0,12,0,24,9,0,1,0,1,0,1, - 0,1,1,1,1,1,1,1,1,1,2,1,2,1,2,1,2,1,2,1,3,1,3,1,4,1,4,1,4,1,4,1, - 4,1,4,1,4,1,4,1,4,1,5,1,5,1,6,1,6,1,6,0,0,7,0,2,4,6,8,10,12,0,1, - 1,0,5,6,46,0,14,1,0,0,0,2,28,1,0,0,0,4,32,1,0,0,0,6,37,1,0,0,0,8, - 39,1,0,0,0,10,48,1,0,0,0,12,50,1,0,0,0,14,15,5,1,0,0,15,16,5,2,0, - 0,16,17,5,12,0,0,17,18,5,9,0,0,18,22,3,2,1,0,19,21,3,4,2,0,20,19, - 1,0,0,0,21,24,1,0,0,0,22,20,1,0,0,0,22,23,1,0,0,0,23,25,1,0,0,0, - 24,22,1,0,0,0,25,26,5,10,0,0,26,27,5,0,0,1,27,1,1,0,0,0,28,29,5, - 3,0,0,29,30,5,4,0,0,30,31,3,8,4,0,31,3,1,0,0,0,32,33,3,6,3,0,33, - 34,3,10,5,0,34,35,5,4,0,0,35,36,3,8,4,0,36,5,1,0,0,0,37,38,7,0,0, - 0,38,7,1,0,0,0,39,40,5,9,0,0,40,41,5,7,0,0,41,42,3,12,6,0,42,43, - 5,11,0,0,43,44,5,8,0,0,44,45,3,12,6,0,45,46,5,11,0,0,46,47,5,10, - 0,0,47,9,1,0,0,0,48,49,5,13,0,0,49,11,1,0,0,0,50,51,5,14,0,0,51, - 13,1,0,0,0,1,22 + 4,1,24,87,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6,7, + 6,2,7,7,7,2,8,7,8,2,9,7,9,1,0,1,0,3,0,23,8,0,1,0,1,0,1,0,1,0,1,0, + 1,0,5,0,31,8,0,10,0,12,0,34,9,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,2, + 1,2,1,2,1,2,1,2,1,3,1,3,1,3,1,3,1,4,1,4,1,5,1,5,1,5,1,5,1,5,1,5, + 1,5,1,5,1,5,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,3,6,74,8, + 6,1,6,1,6,1,6,1,6,1,6,1,7,1,7,1,8,1,8,1,9,1,9,1,9,0,0,10,0,2,4,6, + 8,10,12,14,16,18,0,2,1,0,6,7,1,0,12,14,81,0,20,1,0,0,0,2,38,1,0, + 0,0,4,42,1,0,0,0,6,47,1,0,0,0,8,51,1,0,0,0,10,53,1,0,0,0,12,62,1, + 0,0,0,14,80,1,0,0,0,16,82,1,0,0,0,18,84,1,0,0,0,20,22,5,1,0,0,21, + 23,5,2,0,0,22,21,1,0,0,0,22,23,1,0,0,0,23,24,1,0,0,0,24,25,5,3,0, + 0,25,26,5,19,0,0,26,32,5,16,0,0,27,31,3,2,1,0,28,31,3,6,3,0,29,31, + 3,4,2,0,30,27,1,0,0,0,30,28,1,0,0,0,30,29,1,0,0,0,31,34,1,0,0,0, + 32,30,1,0,0,0,32,33,1,0,0,0,33,35,1,0,0,0,34,32,1,0,0,0,35,36,5, + 17,0,0,36,37,5,0,0,1,37,1,1,0,0,0,38,39,5,4,0,0,39,40,5,5,0,0,40, + 41,3,12,6,0,41,3,1,0,0,0,42,43,3,8,4,0,43,44,3,16,8,0,44,45,5,5, + 0,0,45,46,3,10,5,0,46,5,1,0,0,0,47,48,5,15,0,0,48,49,3,18,9,0,49, + 50,5,18,0,0,50,7,1,0,0,0,51,52,7,0,0,0,52,9,1,0,0,0,53,54,5,16,0, + 0,54,55,5,8,0,0,55,56,3,18,9,0,56,57,5,18,0,0,57,58,5,9,0,0,58,59, + 3,18,9,0,59,60,5,18,0,0,60,61,5,17,0,0,61,11,1,0,0,0,62,63,5,16, + 0,0,63,64,5,8,0,0,64,65,3,18,9,0,65,73,5,18,0,0,66,67,5,10,0,0,67, + 68,3,14,7,0,68,69,5,18,0,0,69,70,5,11,0,0,70,71,3,18,9,0,71,72,5, + 18,0,0,72,74,1,0,0,0,73,66,1,0,0,0,73,74,1,0,0,0,74,75,1,0,0,0,75, + 76,5,9,0,0,76,77,3,18,9,0,77,78,5,18,0,0,78,79,5,17,0,0,79,13,1, + 0,0,0,80,81,7,1,0,0,81,15,1,0,0,0,82,83,5,20,0,0,83,17,1,0,0,0,84, + 85,5,21,0,0,85,19,1,0,0,0,4,22,30,32,73 ]; private static __ATN: antlr.ATN; @@ -339,15 +508,33 @@ export class DocumentContext extends antlr.ParserRuleContext { public LBRACE(): antlr.TerminalNode { return this.getToken(QuixosLockParser.LBRACE, 0)!; } - public quixosEntry(): QuixosEntryContext { - return this.getRuleContext(0, QuixosEntryContext)!; - } public RBRACE(): antlr.TerminalNode { return this.getToken(QuixosLockParser.RBRACE, 0)!; } public EOF(): antlr.TerminalNode { return this.getToken(QuixosLockParser.EOF, 0)!; } + public FRAGMENT(): antlr.TerminalNode | null { + return this.getToken(QuixosLockParser.FRAGMENT, 0); + } + public quixosEntry(): QuixosEntryContext[]; + public quixosEntry(i: number): QuixosEntryContext | null; + public quixosEntry(i?: number): QuixosEntryContext[] | QuixosEntryContext | null { + if (i === undefined) { + return this.getRuleContexts(QuixosEntryContext); + } + + return this.getRuleContext(i, QuixosEntryContext); + } + public importEntry(): ImportEntryContext[]; + public importEntry(i: number): ImportEntryContext | null; + public importEntry(i?: number): ImportEntryContext[] | ImportEntryContext | null { + if (i === undefined) { + return this.getRuleContexts(ImportEntryContext); + } + + return this.getRuleContext(i, ImportEntryContext); + } public resourceEntry(): ResourceEntryContext[]; public resourceEntry(i: number): ResourceEntryContext | null; public resourceEntry(i?: number): ResourceEntryContext[] | ResourceEntryContext | null { @@ -380,8 +567,8 @@ export class QuixosEntryContext extends antlr.ParserRuleContext { public SOURCE(): antlr.TerminalNode { return this.getToken(QuixosLockParser.SOURCE, 0)!; } - public sourceBlock(): SourceBlockContext { - return this.getRuleContext(0, SourceBlockContext)!; + public quixosSourceBlock(): QuixosSourceBlockContext { + return this.getRuleContext(0, QuixosSourceBlockContext)!; } public override get ruleIndex(): number { return QuixosLockParser.RULE_quixosEntry; @@ -425,6 +612,32 @@ export class ResourceEntryContext extends antlr.ParserRuleContext { } +export class ImportEntryContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public IMPORT(): antlr.TerminalNode { + return this.getToken(QuixosLockParser.IMPORT, 0)!; + } + public stringLiteral(): StringLiteralContext { + return this.getRuleContext(0, StringLiteralContext)!; + } + public SEMI(): antlr.TerminalNode { + return this.getToken(QuixosLockParser.SEMI, 0)!; + } + public override get ruleIndex(): number { + return QuixosLockParser.RULE_importEntry; + } + public override accept(visitor: QuixosLockVisitor): Result | null { + if (visitor.visitImportEntry) { + return visitor.visitImportEntry(this); + } else { + return visitor.visitChildren(this); + } + } +} + + export class ResourceKindContext extends antlr.ParserRuleContext { public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { super(parent, invokingState); @@ -495,6 +708,88 @@ export class SourceBlockContext extends antlr.ParserRuleContext { } +export class QuixosSourceBlockContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public LBRACE(): antlr.TerminalNode { + return this.getToken(QuixosLockParser.LBRACE, 0)!; + } + public REPOSITORY(): antlr.TerminalNode { + return this.getToken(QuixosLockParser.REPOSITORY, 0)!; + } + public stringLiteral(): StringLiteralContext[]; + public stringLiteral(i: number): StringLiteralContext | null; + public stringLiteral(i?: number): StringLiteralContext[] | StringLiteralContext | null { + if (i === undefined) { + return this.getRuleContexts(StringLiteralContext); + } + + return this.getRuleContext(i, StringLiteralContext); + } + public SEMI(): antlr.TerminalNode[]; + public SEMI(i: number): antlr.TerminalNode | null; + public SEMI(i?: number): antlr.TerminalNode | null | antlr.TerminalNode[] { + if (i === undefined) { + return this.getTokens(QuixosLockParser.SEMI); + } else { + return this.getToken(QuixosLockParser.SEMI, i); + } + } + public COMMIT(): antlr.TerminalNode { + return this.getToken(QuixosLockParser.COMMIT, 0)!; + } + public RBRACE(): antlr.TerminalNode { + return this.getToken(QuixosLockParser.RBRACE, 0)!; + } + public POLICY(): antlr.TerminalNode | null { + return this.getToken(QuixosLockParser.POLICY, 0); + } + public sourcePolicy(): SourcePolicyContext | null { + return this.getRuleContext(0, SourcePolicyContext); + } + public REF(): antlr.TerminalNode | null { + return this.getToken(QuixosLockParser.REF, 0); + } + public override get ruleIndex(): number { + return QuixosLockParser.RULE_quixosSourceBlock; + } + public override accept(visitor: QuixosLockVisitor): Result | null { + if (visitor.visitQuixosSourceBlock) { + return visitor.visitQuixosSourceBlock(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class SourcePolicyContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public PINNED(): antlr.TerminalNode | null { + return this.getToken(QuixosLockParser.PINNED, 0); + } + public TRACK_RELEASE(): antlr.TerminalNode | null { + return this.getToken(QuixosLockParser.TRACK_RELEASE, 0); + } + public TRACK_DEVELOPMENT(): antlr.TerminalNode | null { + return this.getToken(QuixosLockParser.TRACK_DEVELOPMENT, 0); + } + public override get ruleIndex(): number { + return QuixosLockParser.RULE_sourcePolicy; + } + public override accept(visitor: QuixosLockVisitor): Result | null { + if (visitor.visitSourcePolicy) { + return visitor.visitSourcePolicy(this); + } else { + return visitor.visitChildren(this); + } + } +} + + export class IdentifierContext extends antlr.ParserRuleContext { public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { super(parent, invokingState); diff --git a/src/resource-lock/generated/QuixosLockVisitor.ts b/src/resource-lock/generated/QuixosLockVisitor.ts index e36baed..f4dd3e3 100644 --- a/src/resource-lock/generated/QuixosLockVisitor.ts +++ b/src/resource-lock/generated/QuixosLockVisitor.ts @@ -5,8 +5,11 @@ import { AbstractParseTreeVisitor } from "antlr4ng"; import { DocumentContext } from "./QuixosLockParser.js"; import { QuixosEntryContext } from "./QuixosLockParser.js"; import { ResourceEntryContext } from "./QuixosLockParser.js"; +import { ImportEntryContext } from "./QuixosLockParser.js"; import { ResourceKindContext } from "./QuixosLockParser.js"; import { SourceBlockContext } from "./QuixosLockParser.js"; +import { QuixosSourceBlockContext } from "./QuixosLockParser.js"; +import { SourcePolicyContext } from "./QuixosLockParser.js"; import { IdentifierContext } from "./QuixosLockParser.js"; import { StringLiteralContext } from "./QuixosLockParser.js"; @@ -37,6 +40,12 @@ export class QuixosLockVisitor extends AbstractParseTreeVisitor * @return the visitor result */ visitResourceEntry?: (ctx: ResourceEntryContext) => Result; + /** + * Visit a parse tree produced by `QuixosLockParser.importEntry`. + * @param ctx the parse tree + * @return the visitor result + */ + visitImportEntry?: (ctx: ImportEntryContext) => Result; /** * Visit a parse tree produced by `QuixosLockParser.resourceKind`. * @param ctx the parse tree @@ -49,6 +58,18 @@ export class QuixosLockVisitor extends AbstractParseTreeVisitor * @return the visitor result */ visitSourceBlock?: (ctx: SourceBlockContext) => Result; + /** + * Visit a parse tree produced by `QuixosLockParser.quixosSourceBlock`. + * @param ctx the parse tree + * @return the visitor result + */ + visitQuixosSourceBlock?: (ctx: QuixosSourceBlockContext) => Result; + /** + * Visit a parse tree produced by `QuixosLockParser.sourcePolicy`. + * @param ctx the parse tree + * @return the visitor result + */ + visitSourcePolicy?: (ctx: SourcePolicyContext) => Result; /** * Visit a parse tree produced by `QuixosLockParser.identifier`. * @param ctx the parse tree diff --git a/src/resource-lock/index.ts b/src/resource-lock/index.ts index fe0c3c6..b2f708a 100644 --- a/src/resource-lock/index.ts +++ b/src/resource-lock/index.ts @@ -1,2 +1,3 @@ +export * from "./loader.js"; export * from "./parser.js"; export * from "./types.js"; diff --git a/src/resource-lock/loader.ts b/src/resource-lock/loader.ts new file mode 100644 index 0000000..fed7c9f --- /dev/null +++ b/src/resource-lock/loader.ts @@ -0,0 +1,150 @@ +import { lstat, readFile } from "node:fs/promises"; +import path from "node:path"; +import { + parseQuixosLockDocument, + type QuixosLockDiagnostic, + type QuixosLockParseResult, +} from "./parser.js"; +import type { + LockedResource, + QuixosLockDocument, + QuixosRepositoryLock, +} from "./types.js"; + +export type QuixosLockSourceReader = (relativePath: string) => Promise; + +const diagnostic = ( + code: string, + message: string, + fileName: string, + path?: string, +): QuixosLockDiagnostic => ({ + phase: "resolution", + code, + message, + fileName, + line: 1, + column: 0, + path, +}); + +export const resolveQuixosLock = async ( + rootSource: string, + readSource: QuixosLockSourceReader, + rootFileName = "quixos.lock", +): Promise => { + const root = parseQuixosLockDocument(rootSource, rootFileName); + if (!root.ok) return root; + if (root.document.kind !== "root") { + return { + ok: false, + diagnostics: [diagnostic( + "expected-root-lock", + "The entrypoint must be a root Quixos lock, not a fragment", + rootFileName, + )], + }; + } + + const diagnostics: QuixosLockDiagnostic[] = []; + const resources: LockedResource[] = []; + const sourceFiles = [rootFileName]; + const visited = new Set(); + const active: string[] = []; + + const addResources = (document: QuixosLockDocument, fileName: string) => { + for (const resource of document.resources) { + const duplicate = resources.find((entry) => + entry.kind === resource.kind && entry.binding === resource.binding); + if (duplicate) { + diagnostics.push(diagnostic( + "duplicate-resource-binding", + `Duplicate ${resource.kind} binding ${resource.binding} across imported lock files`, + fileName, + `${resource.kind}.${resource.binding}`, + )); + } else { + resources.push(resource); + } + } + }; + + const visit = async (importPath: string) => { + if (active.includes(importPath)) { + diagnostics.push(diagnostic( + "import-cycle", + `Lock import cycle: ${[...active, importPath].join(" -> ")}`, + importPath, + )); + return; + } + if (visited.has(importPath)) return; + active.push(importPath); + let source: string; + try { + source = await readSource(importPath); + } catch (cause) { + diagnostics.push(diagnostic( + "import-read-failed", + `Could not read lock import ${importPath}: ${cause instanceof Error ? cause.message : String(cause)}`, + importPath, + )); + active.pop(); + return; + } + const parsed = parseQuixosLockDocument(source, importPath); + if (!parsed.ok) { + diagnostics.push(...parsed.diagnostics); + active.pop(); + return; + } + if (parsed.document.kind !== "fragment") { + diagnostics.push(diagnostic( + "imported-root-lock", + `Imported file ${importPath} must begin with "quixos-lock fragment"`, + importPath, + )); + active.pop(); + return; + } + visited.add(importPath); + sourceFiles.push(importPath); + addResources(parsed.document, importPath); + for (const nested of parsed.document.imports) await visit(nested); + active.pop(); + }; + + addResources(root.document, rootFileName); + for (const importPath of root.document.imports) await visit(importPath); + if (diagnostics.length) return { ok: false, diagnostics }; + const lock: QuixosRepositoryLock = { + formatVersion: 1, + quixos: root.document.quixos, + resources, + sourceFiles, + }; + return { ok: true, lock, diagnostics: [] }; +}; + +export const loadQuixosLock = async (fileName: string): Promise => { + const absoluteRoot = path.resolve(fileName); + const repositoryRoot = path.dirname(absoluteRoot); + const rootName = path.basename(absoluteRoot); + const rootSource = await readFile(absoluteRoot, "utf8"); + return await resolveQuixosLock(rootSource, async (relativePath) => { + let absoluteImport = repositoryRoot; + const segments = relativePath.split("/"); + for (const [index, segment] of segments.entries()) { + absoluteImport = path.join(absoluteImport, segment); + const metadata = await lstat(absoluteImport); + if (metadata.isSymbolicLink()) { + throw new Error("imports must not traverse symbolic links"); + } + const final = index === segments.length - 1; + if ((!final && !metadata.isDirectory()) || (final && !metadata.isFile())) { + throw new Error("imports must be ordinary files beneath ordinary directories"); + } + } + return await readFile(absoluteImport, "utf8"); + }, rootName); +}; diff --git a/src/resource-lock/parser.ts b/src/resource-lock/parser.ts index 2439c94..9d2388a 100644 --- a/src/resource-lock/parser.ts +++ b/src/resource-lock/parser.ts @@ -10,16 +10,19 @@ import { import { QuixosLockLexer } from "./generated/QuixosLockLexer.js"; import { QuixosLockParser, + type QuixosSourceBlockContext, type SourceBlockContext, } from "./generated/QuixosLockParser.js"; import type { GitSource, LockedResource, + QuixosLockDocument, QuixosRepositoryLock, + QuixosSource, } from "./types.js"; export type QuixosLockDiagnostic = { - phase: "syntax" | "validation"; + phase: "syntax" | "validation" | "resolution"; code: string; message: string; fileName: string; @@ -32,6 +35,10 @@ export type QuixosLockParseResult = | { ok: true; lock: QuixosRepositoryLock; diagnostics: [] } | { ok: false; diagnostics: QuixosLockDiagnostic[] }; +export type QuixosLockDocumentParseResult = + | { ok: true; document: QuixosLockDocument; diagnostics: [] } + | { ok: false; diagnostics: QuixosLockDiagnostic[] }; + class SyntaxErrorListener extends BaseErrorListener { constructor( private readonly fileName: string, @@ -68,22 +75,72 @@ const lowerSource = (context: SourceBlockContext): GitSource => ({ commit: stringValue(context.stringLiteral(1)!).toLowerCase(), }); +const lowerQuixosSource = (context: QuixosSourceBlockContext): QuixosSource => { + const source = { + resolver: "git" as const, + repository: stringValue(context.stringLiteral(0)!), + commit: stringValue(context.stringLiteral(context.stringLiteral().length - 1)!).toLowerCase(), + }; + const policyContext = context.sourcePolicy(); + if (!policyContext) return source; + const policy = policyContext.PINNED() + ? "pinned" + : policyContext.TRACK_RELEASE() + ? "track-release" + : "track-development"; + return { + ...source, + policy, + ref: stringValue(context.stringLiteral(1)!), + }; +}; + const issue = ( diagnostics: QuixosLockDiagnostic[], fileName: string, code: string, message: string, path?: string, + line = 1, + column = 0, ) => diagnostics.push({ phase: "validation", code, message, fileName, - line: 1, - column: 0, + line, + column, path, }); +const validateImport = ( + importPath: string, + index: number, + fileName: string, + diagnostics: QuixosLockDiagnostic[], + line: number, + column: number, +) => { + const path = `imports[${index}]`; + if ( + !importPath + || importPath.startsWith("/") + || importPath.includes("\\") + || importPath.split("/").some((segment) => !segment || segment === "." || segment === "..") + || /^[A-Za-z][A-Za-z0-9+.-]*:/.test(importPath) + ) { + issue( + diagnostics, + fileName, + "invalid-import-path", + `${path} must be a normalized relative path beneath the workspace repository root`, + path, + line, + column, + ); + } +}; + const validateSource = ( source: GitSource, path: string, @@ -141,10 +198,59 @@ const validateSource = ( } }; -export const parseQuixosLock = ( +const validateQuixosSource = ( + source: QuixosSource, + fileName: string, + diagnostics: QuixosLockDiagnostic[], +) => { + validateSource(source, "quixos", fileName, diagnostics); + if (!source.policy) return; + const forbiddenRefCharacters = new Set("~^:?*[\\"); + const invalidRef = !source.ref + || [...source.ref].some((character) => { + const code = character.charCodeAt(0); + return code <= 0x20 || code === 0x7f || forbiddenRefCharacters.has(character); + }) + || source.ref.startsWith("/") + || source.ref.endsWith("/") + || source.ref.endsWith(".") + || source.ref.includes("..") + || source.ref.includes("@{") + || source.ref.includes("//"); + if (invalidRef) { + issue( + diagnostics, + fileName, + "invalid-quixos-ref", + "quixos.ref must be a non-empty Git ref without whitespace or Git ref metacharacters", + "quixos.ref", + ); + } + if (source.policy === "pinned") { + if (!/^([0-9a-f]{40}|[0-9a-f]{64})$/.test(source.ref)) { + issue( + diagnostics, + fileName, + "pinned-quixos-ref-not-commit", + "A pinned Quixos source must use an exact commit as its ref", + "quixos.ref", + ); + } else if (source.ref.toLowerCase() !== source.commit) { + issue( + diagnostics, + fileName, + "pinned-quixos-commit-mismatch", + "A pinned Quixos source ref and resolved commit must be identical", + "quixos.commit", + ); + } + } +}; + +export const parseQuixosLockDocument = ( source: string, fileName = "", -): QuixosLockParseResult => { +): QuixosLockDocumentParseResult => { const diagnostics: QuixosLockDiagnostic[] = []; const listener = new SyntaxErrorListener(fileName, diagnostics); const lexer = new QuixosLockLexer(CharStream.fromString(source)); @@ -167,8 +273,55 @@ export const parseQuixosLock = ( ); } - const quixos = lowerSource(tree.quixosEntry().sourceBlock()); - validateSource(quixos, "quixos", fileName, diagnostics); + const fragment = Boolean(tree.FRAGMENT()); + const quixosEntries = tree.quixosEntry(); + let quixos: QuixosSource | undefined; + if (fragment && quixosEntries.length) { + issue( + diagnostics, + fileName, + "fragment-has-quixos-source", + "A lock fragment inherits the root document's Quixos source and must not redeclare it", + "quixos", + ); + } else if (!fragment && quixosEntries.length !== 1) { + issue( + diagnostics, + fileName, + "root-quixos-source-count", + "A root lock document must contain exactly one Quixos source", + "quixos", + ); + } else if (!fragment) { + quixos = lowerQuixosSource(quixosEntries[0]!.quixosSourceBlock()); + validateQuixosSource(quixos, fileName, diagnostics); + } + + const imports = tree.importEntry().map((context, index) => { + const importPath = stringValue(context.stringLiteral()); + validateImport( + importPath, + index, + fileName, + diagnostics, + context.start?.line ?? 1, + context.start?.column ?? 0, + ); + return importPath; + }); + const repeatedImports = new Set(); + imports.forEach((importPath, index) => { + if (repeatedImports.has(importPath)) { + issue( + diagnostics, + fileName, + "duplicate-import", + `Duplicate lock import ${importPath}`, + `imports[${index}]`, + ); + } + repeatedImports.add(importPath); + }); const resources: LockedResource[] = []; const bindings = new Set(); @@ -195,11 +348,56 @@ export const parseQuixosLock = ( ? { ok: false, diagnostics } : { ok: true, - lock: { formatVersion: 1, quixos, resources }, + document: fragment + ? { kind: "fragment", formatVersion: 1, imports, resources } + : { kind: "root", formatVersion: 1, quixos: quixos!, imports, resources }, diagnostics: [], }; }; +export const parseQuixosLock = ( + source: string, + fileName = "", +): QuixosLockParseResult => { + const parsed = parseQuixosLockDocument(source, fileName); + if (!parsed.ok) return parsed; + if (parsed.document.kind === "fragment") { + return { + ok: false, + diagnostics: [{ + phase: "validation", + code: "expected-root-lock", + message: "Expected a root Quixos lock, found a lock fragment", + fileName, + line: 1, + column: 0, + }], + }; + } + if (parsed.document.imports.length) { + return { + ok: false, + diagnostics: [{ + phase: "resolution", + code: "imports-require-file-resolution", + message: "This lock has imports and must be loaded from its repository rather than parsed as an isolated string", + fileName, + line: 1, + column: 0, + }], + }; + } + return { + ok: true, + lock: { + formatVersion: 1, + quixos: parsed.document.quixos, + resources: parsed.document.resources, + }, + diagnostics: [], + }; +}; + const quoted = (value: string) => JSON.stringify(value); const sourceLines = (source: GitSource, indentation: string): string[] => [ @@ -207,11 +405,22 @@ const sourceLines = (source: GitSource, indentation: string): string[] => [ `${indentation}commit ${quoted(source.commit.toLowerCase())};`, ]; +const quixosSourceLines = (source: QuixosSource, indentation: string): string[] => [ + `${indentation}repository ${quoted(source.repository)};`, + ...(source.policy + ? [ + `${indentation}policy ${source.policy};`, + `${indentation}ref ${quoted(source.ref)};`, + ] + : []), + `${indentation}commit ${quoted(source.commit.toLowerCase())};`, +]; + export const formatQuixosLock = (lock: QuixosRepositoryLock): string => { const lines = [ "quixos-lock version 1 {", " quixos source {", - ...sourceLines(lock.quixos, " "), + ...quixosSourceLines(lock.quixos, " "), " }", ]; for (const resource of lock.resources) { @@ -225,3 +434,30 @@ export const formatQuixosLock = (lock: QuixosRepositoryLock): string => { lines.push("}", ""); return lines.join("\n"); }; + +export const formatQuixosLockDocument = (document: QuixosLockDocument): string => { + const lines = [ + `quixos-lock${document.kind === "fragment" ? " fragment" : ""} version 1 {`, + ]; + if (document.kind === "root") { + lines.push( + " quixos source {", + ...quixosSourceLines(document.quixos, " "), + " }", + ); + } + for (const importPath of document.imports) { + if (lines.length > 1) lines.push(""); + lines.push(` import ${quoted(importPath)};`); + } + for (const resource of document.resources) { + if (lines.length > 1) lines.push(""); + lines.push( + ` ${resource.kind} ${resource.binding} source {`, + ...sourceLines(resource.source, " "), + " }", + ); + } + lines.push("}", ""); + return lines.join("\n"); +}; diff --git a/src/resource-lock/types.ts b/src/resource-lock/types.ts index 062833b..c073879 100644 --- a/src/resource-lock/types.ts +++ b/src/resource-lock/types.ts @@ -4,6 +4,19 @@ export type GitSource = { commit: string; }; +export type QuixosSourcePolicy = "pinned" | "track-release" | "track-development"; + +// Resource repositories only need the exact Quixos commit they were authored +// against. A workspace root additionally declares how a runtime may advance +// that exact baseline. +export type QuixosSource = GitSource & ({ + policy: QuixosSourcePolicy; + ref: string; +} | { + policy?: undefined; + ref?: undefined; +}); + export type LockedResourceKind = "interface" | "package"; export type LockedResource = { @@ -12,10 +25,30 @@ export type LockedResource = { source: GitSource; }; +export type QuixosLockRootDocument = { + kind: "root"; + formatVersion: 1; + quixos: QuixosSource; + imports: string[]; + resources: LockedResource[]; +}; + +export type QuixosLockFragmentDocument = { + kind: "fragment"; + formatVersion: 1; + imports: string[]; + resources: LockedResource[]; +}; + +export type QuixosLockDocument = + | QuixosLockRootDocument + | QuixosLockFragmentDocument; + export type QuixosRepositoryLock = { formatVersion: 1; - quixos: GitSource; + quixos: QuixosSource; resources: LockedResource[]; + sourceFiles?: string[]; }; export type NixGitInput = { diff --git a/test/capability-assembly.test.ts b/test/capability-assembly.test.ts new file mode 100644 index 0000000..200ad38 --- /dev/null +++ b/test/capability-assembly.test.ts @@ -0,0 +1,184 @@ +import assert from "node:assert/strict"; +import { mkdtemp, mkdir, rm, writeFile } from "node:fs/promises"; +import os from "node:os"; +import path from "node:path"; +import test from "node:test"; +import { + compileCapabilityResourceRepository, + compileWorkspaceRepository, +} from "../src/capability-language/index.js"; + +const quixosCommit = "1".repeat(40); +const namedCommit = "2".repeat(40); +const packageCommit = "3".repeat(40); + +const lock = (resources = "") => `quixos-lock version 1 { + quixos source { + repository "https://example.test/quixos.git"; + commit "${quixosCommit}"; + } + ${resources} +} +`; + +test("workspace assembly resolves resource-owned dependencies recursively", async (context) => { + const directory = await mkdtemp(path.join(os.tmpdir(), "quixos-assembly-")); + context.after(() => rm(directory, { recursive: true, force: true })); + const root = path.join(directory, "root"); + const named = path.join(directory, "named"); + const runtime = path.join(directory, "runtime"); + await Promise.all([mkdir(root), mkdir(named), mkdir(runtime)]); + await writeFile(path.join(root, "quixos.lock"), lock(`package Runtime source { + repository "https://example.test/package-runtime.git"; + commit "${packageCommit}"; + }`)); + await writeFile(path.join(root, "workspace.qx"), `workspace Test id "workspace:test" revision "workspace:test@1" commit "${"4".repeat(40)}" { + atom Subject id "atom:subject"; + import package Runtime; + } +`); + await writeFile(path.join(named, "quixos.lock"), lock()); + await writeFile(path.join(named, "interface.qx"), `interface Named id "interface:named" revision "interface:named@1" { + value name id "member:named:name" : string { + get id "operation:named:name:get"; + } + } +`); + await writeFile(path.join(runtime, "quixos.lock"), lock(`interface Named source { + repository "https://example.test/interface-named.git"; + commit "${namedCommit}"; + }`)); + await writeFile(path.join(runtime, "package.qx"), `import interface Named; +package Runtime id "package:runtime" revision "package:runtime@1" { + function describe id "export:runtime:describe" : interface-ref -> string; +} +`); + + const directories = new Map([ + [`interface\0https://example.test/interface-named.git\0${namedCommit}`, named], + [`package\0https://example.test/package-runtime.git\0${packageCommit}`, runtime], + ]); + const result = await compileWorkspaceRepository({ + rootDirectory: root, + resolveResource: async (source, kind) => { + const resolved = directories.get(`${kind}\0${source.repository}\0${source.commit}`); + if (!resolved) throw new Error(`Unexpected source ${source.repository}`); + return { directory: resolved }; + }, + }); + + assert.equal(result.resources.length, 2); + assert.deepEqual( + result.workspace.interfaceImports.map((entry) => entry.revisionId), + ["interface:named@1"], + ); + assert.deepEqual( + result.workspace.packageImports.map((entry) => entry.revisionId), + ["package:runtime@1"], + ); + assert.equal(result.directResources.size, 1); + + const resource = await compileCapabilityResourceRepository({ + rootDirectory: runtime, + kind: "package", + source: { + resolver: "git", + repository: "https://example.test/package-runtime.git", + commit: packageCommit, + }, + resolveResource: async (source, kind) => { + const resolved = directories.get(`${kind}\0${source.repository}\0${source.commit}`); + if (!resolved) throw new Error(`Unexpected source ${source.repository}`); + return { directory: resolved }; + }, + }); + assert.equal(resource.resource.kind, "package"); + assert.equal(resource.resources.length, 2); + assert.equal(resource.directResources.size, 1); +}); + +test("resource repositories cannot own workspace Quixos selection policy", async (context) => { + const directory = await mkdtemp(path.join(os.tmpdir(), "quixos-resource-policy-")); + context.after(() => rm(directory, { recursive: true, force: true })); + await writeFile(path.join(directory, "quixos.lock"), `quixos-lock version 1 { + quixos source { + repository "https://example.test/quixos.git"; + policy track-development; + ref "dev/alice/main"; + commit "${quixosCommit}"; + } + }`); + await writeFile(path.join(directory, "package.qx"), `package Runtime id "package:runtime" revision "package:runtime@1" { }\n`); + + await assert.rejects( + compileCapabilityResourceRepository({ + rootDirectory: directory, + kind: "package", + source: { + resolver: "git", + repository: "https://example.test/package-runtime.git", + commit: packageCommit, + }, + resolveResource: async () => ({ directory }), + }), + /resource locks may only declare their exact authored-against commit/, + ); +}); + +test("resource manifests cannot hide lock dependencies", async (context) => { + const directory = await mkdtemp(path.join(os.tmpdir(), "quixos-assembly-mismatch-")); + context.after(() => rm(directory, { recursive: true, force: true })); + const root = path.join(directory, "root"); + const runtime = path.join(directory, "runtime"); + await Promise.all([mkdir(root), mkdir(runtime)]); + await writeFile(path.join(root, "quixos.lock"), lock(`package Runtime source { + repository "https://example.test/package-runtime.git"; + commit "${packageCommit}"; + }`)); + await writeFile(path.join(root, "workspace.qx"), `workspace Test id "workspace:test" revision "workspace:test@1" commit "${"4".repeat(40)}" { + atom Subject id "atom:subject"; + import package Runtime; + } +`); + await writeFile(path.join(runtime, "quixos.lock"), lock()); + await writeFile(path.join(runtime, "package.qx"), `import interface Hidden; +package Runtime id "package:runtime" revision "package:runtime@1" { } +`); + + await assert.rejects( + compileWorkspaceRepository({ + rootDirectory: root, + resolveResource: async () => ({ directory: runtime }), + }), + /No resolved interface is available for lock binding Hidden/, + ); +}); + +test("workspace assembly must satisfy nominal external interfaces", async (context) => { + const directory = await mkdtemp(path.join(os.tmpdir(), "quixos-assembly-external-")); + context.after(() => rm(directory, { recursive: true, force: true })); + const root = path.join(directory, "root"); + const runtime = path.join(directory, "runtime"); + await Promise.all([mkdir(root), mkdir(runtime)]); + await writeFile(path.join(root, "quixos.lock"), lock(`package Runtime source { + repository "https://example.test/package-runtime.git"; + commit "${packageCommit}"; + }`)); + await writeFile(path.join(root, "workspace.qx"), `workspace Test id "workspace:test" revision "workspace:test@1" commit "${"4".repeat(40)}" { + atom Subject id "atom:subject"; + import package Runtime; + } +`); + await writeFile(path.join(runtime, "quixos.lock"), lock()); + await writeFile(path.join(runtime, "package.qx"), `external interface Named revision "interface:named@1"; +package Runtime id "package:runtime" revision "package:runtime@1" { } +`); + + await assert.rejects( + compileWorkspaceRepository({ + rootDirectory: root, + resolveResource: async () => ({ directory: runtime }), + }), + /requires external interface Named \(interface:named@1\)/, + ); +}); diff --git a/test/capability-cli.test.ts b/test/capability-cli.test.ts new file mode 100644 index 0000000..b239f96 --- /dev/null +++ b/test/capability-cli.test.ts @@ -0,0 +1,30 @@ +import assert from "node:assert/strict"; +import { spawnSync } from "node:child_process"; +import { resolve } from "node:path"; +import { test } from "node:test"; + +const cli = resolve(process.cwd(), "dist/src/capability-language/cli.js"); + +const runResourceCheck = (source: string) => spawnSync( + process.execPath, + [cli, "--resource", "--check", "-"], + { input: source, encoding: "utf8" }, +); + +test("capability CLI checks a standalone interface resource", () => { + const result = runResourceCheck(`interface WeatherBase id "interface:weather-base" revision "interface:weather-base@1" { + value temperature id "member:weather:temperature" : double { + get id "operation:weather:temperature:get"; + } +}\n`); + assert.equal(result.status, 0, result.stderr); + assert.equal(result.stdout, ""); +}); + +test("capability CLI reports invalid standalone interface members", () => { + const result = runResourceCheck(`interface WeatherBase id "interface:weather-base" revision "interface:weather-base@1" { + value temperature : definitely-not-a-type; +}\n`); + assert.notEqual(result.status, 0); + assert.match(result.stderr, /syntax-error/); +}); diff --git a/test/capability-language.test.ts b/test/capability-language.test.ts index 44fb93c..918dd8c 100644 --- a/test/capability-language.test.ts +++ b/test/capability-language.test.ts @@ -2,18 +2,96 @@ import assert from "node:assert/strict"; import { readFileSync } from "node:fs"; import { resolve } from "node:path"; import { test } from "node:test"; -import { compileCapabilitySource } from "../src/capability-language/index.js"; import { - capabilityFixturePath, + compileCapabilityResourceSource, + compileCapabilitySource, +} from "../src/capability-language/index.js"; +import { capabilityFixtureSource, + capabilityResourceSources, + compileCapabilityFixture, fixtureId, } from "./fixtures/capability-model.js"; -test("ANTLR parses and validates a complete capability workspace", () => { - const result = compileCapabilitySource( - capabilityFixtureSource, - capabilityFixturePath, +const compileWebStudioFixture = (packageTransform = (source: string) => source) => { + const fixture = (name: string) => readFileSync( + resolve(process.cwd(), "test/fixtures", name), + "utf8", ); + const react = compileCapabilityResourceSource( + fixture("react-component.interface.qx"), + { + source: { + repository: "https://repos.quixos.org/org-quixos-web-studio/interface-react-component.git", + commit: "2".repeat(40), + }, + }, + ); + if (!react.ok || react.resource.kind !== "interface") { + throw new Error("ReactComponent fixture did not compile"); + } + const named = compileCapabilityResourceSource( + fixture("named.interface.qx"), + { + source: { + repository: "https://repos.quixos.org/quixos-test/interface-named.git", + commit: "5".repeat(40), + }, + }, + ); + if (!named.ok || named.resource.kind !== "interface") { + throw new Error("Named fixture did not compile"); + } + const has = compileCapabilityResourceSource( + fixture("has-react-component.interface.qx"), + { + source: { + repository: "https://repos.quixos.org/org-quixos-web-studio/interface-has-react-component.git", + commit: "3".repeat(40), + }, + environment: { + interfaces: new Map([["ReactComponent", react.resource.revision]]), + interfaceClosure: [react.resource.revision], + }, + }, + ); + if (!has.ok || has.resource.kind !== "interface") { + throw new Error("HasReactComponent fixture did not compile"); + } + const component = compileCapabilityResourceSource( + packageTransform(fixture("component-runtime.package.qx")), + { + source: { + repository: "https://repos.quixos.org/quixos-test/package-component-runtime.git", + commit: "4".repeat(40), + }, + environment: { + interfaces: new Map([["Named", named.resource.revision]]), + interfaceClosure: [named.resource.revision], + }, + }, + ); + if (!component.ok || component.resource.kind !== "package") { + throw new Error("ComponentRuntime fixture did not compile"); + } + return compileCapabilitySource( + fixture("web-studio.capabilities.qx"), + "web-studio.capabilities.qx", + { + interfaces: new Map([ + ["Named", named.resource.revision], + ["ReactComponent", react.resource.revision], + ["HasReactComponent", has.resource.revision], + ]), + packages: new Map([["ComponentRuntime", component.resource.revision]]), + interfaceClosure: [named.resource.revision, react.resource.revision, has.resource.revision], + packageClosure: [component.resource.revision], + }, + ); +}; + +test("ANTLR parses and validates a complete capability workspace", () => { + const result = compileCapabilityFixture(); assert.equal(result.ok, true); if (!result.ok) return; assert.equal(result.workspace.workspaceId, fixtureId.workspace); @@ -24,26 +102,24 @@ test("ANTLR parses and validates a complete capability workspace", () => { }); test("conformances do not accept authored IDs", () => { - const result = compileCapabilitySource( - capabilityFixtureSource.replace( + const result = compileCapabilityFixture({ + workspace: capabilityFixtureSource.replace( "conform Project as Named {", 'conform Project as Named id "conformance:project:named" {', ), - "conformance-id.qx", - ); + }); assert.equal(result.ok, false); if (result.ok) return; assert.ok(result.diagnostics.some((entry) => entry.phase === "syntax")); }); test("the v1 language has no implicit relationship materialization rule", () => { - const result = compileCapabilitySource( - capabilityFixtureSource.replace( + const result = compileCapabilityFixture({ + workspace: capabilityFixtureSource.replace( /\n}\s*$/, '\n materialize ProjectOwner.owner if absent with Person;\n}\n', ), - "materialize.qx", - ); + }); assert.equal(result.ok, false); if (result.ok) return; assert.ok(result.diagnostics.some((entry) => entry.phase === "syntax")); @@ -57,21 +133,23 @@ test("forward declarations make source order irrelevant", () => { /\n}\s*$/, '\n atom Project id "atom:project";\n atom Person id "atom:person";\n}\n', ); - assert.equal(compileCapabilitySource(source, "reordered.qx").ok, true); + assert.equal(compileCapabilityFixture({ workspace: source }).ok, true); }); test("interfaces can declare ordinary call operations", () => { - const source = capabilityFixtureSource.replace( - " value summary id \"member:summary:summary\" : string {\n get id \"operation:summary:summary:get\";\n }", - " operation summarize id \"member:summary:summarize\" : string -> string {\n call id \"operation:summary:summarize\";\n }", - ).replace( + const workspace = capabilityFixtureSource.replace( "bind summary.get to package TodoRuntime.summaryGet", "bind summarize.call to package TodoRuntime.summaryGet", - ).replace( + ); + const summary = capabilityResourceSources.summary.replace( + " value summary id \"member:summary:summary\" : string {\n get id \"operation:summary:summary:get\";\n }", + " operation summarize id \"member:summary:summarize\" : string -> string {\n call id \"operation:summary:summarize\";\n }", + ); + const todo = capabilityResourceSources.todo.replace( "operation summaryGet id \"export:todo-runtime:summary-get\" : unit -> string", "operation summaryGet id \"export:todo-runtime:summary-get\" : string -> string", ); - const result = compileCapabilitySource(source, "operation-member.qx"); + const result = compileCapabilityFixture({ workspace, summary, todo }); assert.equal(result.ok, true); if (!result.ok) return; const member = result.workspace.interfaceImports @@ -86,7 +164,7 @@ test("state defaults accept recursive JSON values", () => { shared state ProjectMetadata id "slot:project:metadata" on Project : message "example.Metadata" policy optimistic-register default {"labels":["compiler","runtime"],"score":1.5,"enabled":true,"extra":null};`, ); - const result = compileCapabilitySource(source, "json-default.qx"); + const result = compileCapabilityFixture({ workspace: source }); assert.equal(result.ok, true); if (!result.ok) return; const metadata = result.workspace.sharedAttachments.find( @@ -103,25 +181,23 @@ test("state defaults accept recursive JSON values", () => { }); test("syntax errors retain source locations", () => { - const result = compileCapabilitySource( - capabilityFixtureSource.replace("atom Project", "atom Project ???"), - "broken.qx", - ); + const result = compileCapabilityFixture({ + workspace: capabilityFixtureSource.replace("atom Project", "atom Project ???"), + }); assert.equal(result.ok, false); if (result.ok) return; assert.ok(result.diagnostics.some((entry) => - entry.phase === "syntax" && entry.fileName === "broken.qx" && entry.line > 0 + entry.phase === "syntax" && entry.line > 0 )); }); test("unknown authoring names are lowering errors", () => { - const result = compileCapabilitySource( - capabilityFixtureSource.replace( + const result = compileCapabilityFixture({ + workspace: capabilityFixtureSource.replace( "to state ProjectTitle.read", "to state NotAState.read", ), - "unknown-name.qx", - ); + }); assert.equal(result.ok, false); if (result.ok) return; assert.ok(result.diagnostics.some((entry) => @@ -132,13 +208,12 @@ test("unknown authoring names are lowering errors", () => { }); test("well-formed but invalid programs report semantic paths", () => { - const result = compileCapabilitySource( - capabilityFixtureSource.replace( + const result = compileCapabilityFixture({ + workspace: capabilityFixtureSource.replace( "bind name.get to state ProjectTitle.read", "bind name.get to state ProjectTitle.write", ), - "invalid-binding.qx", - ); + }); assert.equal(result.ok, false); if (result.ok) return; const diagnostic = result.diagnostics.find( @@ -150,11 +225,7 @@ test("well-formed but invalid programs report semantic paths", () => { }); test("Web Studio sidecars declare lazy materialization and checked cross-object ports", () => { - const source = readFileSync( - resolve(process.cwd(), "test/fixtures/web-studio.capabilities.qx"), - "utf8", - ); - const result = compileCapabilitySource(source, "web-studio.capabilities.qx"); + const result = compileWebStudioFixture(); assert.equal(result.ok, true); if (!result.ok) return; @@ -175,9 +246,9 @@ test("Web Studio sidecars declare lazy materialization and checked cross-object const binding = component?.operationBindings[0]?.binding; assert.equal(binding?.kind, "package"); if (binding?.kind !== "package") return; - assert.deepEqual(binding.dependencies[1]?.binding, { - kind: "state", - slotId: "slot:project:name", + assert.deepEqual(binding.dependencies[0]?.binding, { + kind: "interface", + interfaceRevisionId: "interface:named@1", via: { edgeTypeId: "edge:project:component", projectionId: "projection:component:subject", @@ -186,14 +257,10 @@ test("Web Studio sidecars declare lazy materialization and checked cross-object }); test("relationship materializers require a constructor from the host atom", () => { - const source = readFileSync( - resolve(process.cwd(), "test/fixtures/web-studio.capabilities.qx"), - "utf8", - ).replace( + const result = compileWebStudioFixture((source) => source.replace( "constructs ProjectComponent : atom-ref;", "constructs ProjectComponent : unit;", - ); - const result = compileCapabilitySource(source, "invalid-materializer.qx"); + )); assert.equal(result.ok, false); if (result.ok) return; assert.ok(result.diagnostics.some((entry) => @@ -201,3 +268,24 @@ test("relationship materializers require a constructor from the host atom", () = entry.message.includes("must accept") )); }); + +test("callable interface ports require a full source dependency, not a nominal reference", () => { + const result = compileCapabilityResourceSource(` +external interface Named revision "interface:named@1"; +package Runtime id "package:runtime" revision "package:runtime@1" { + function readName id "export:runtime:read-name" : unit -> string requires { + interface named id "port:runtime:named" : Named; + }; +} +`, { + source: { + repository: "https://repos.quixos.org/quixos-test/package-runtime.git", + commit: "6".repeat(40), + }, + }); + assert.equal(result.ok, false); + if (result.ok) return; + assert.ok(result.diagnostics.some((entry) => + entry.code === "nominal-interface-port" && entry.message.includes("import interface Named") + )); +}); diff --git a/test/capability-model.test.ts b/test/capability-model.test.ts index 73f82cc..cf6d17e 100644 --- a/test/capability-model.test.ts +++ b/test/capability-model.test.ts @@ -92,7 +92,7 @@ test("the representative v1 workspace compiles to native and package plans", () summary.dependencies.map((entry) => [entry.port.id, entry.binding.kind]), [ [fixtureId.titlePort, "state"], - [fixtureId.namedPort, "receiver-interface"], + [fixtureId.namedPort, "interface"], [fixtureId.personPort, "constructor"], ], ); @@ -164,6 +164,25 @@ test("private attachments are visible only to their owning conformance", () => { expectIssue(workspace, "private-attachment-access"); }); +test("related-object dependency views cannot traverse another conformance's private edge", () => { + const workspace = makeValidCapabilityWorkspace(); + const packageBinding = conformance( + workspace, + fixtureId.projectSummaryConformance, + ).operationBindings[0]!.binding; + assert.equal(packageBinding.kind, "package"); + if (packageBinding.kind !== "package") return; + const named = packageBinding.dependencies.find( + (dependency) => dependency.portId === fixtureId.namedPort, + ); + assert.ok(named && named.binding.kind === "interface"); + named.binding.via = { + edgeTypeId: fixtureId.projectOwner, + projectionId: fixtureId.projectOwnerProjection, + }; + expectIssue(workspace, "private-attachment-access"); +}); + test("native state and edge providers must match operation shape", () => { const stateWorkspace = makeValidCapabilityWorkspace(); const state = conformance( diff --git a/test/fixtures/capability-model.ts b/test/fixtures/capability-model.ts index e5dc30a..ca51727 100644 --- a/test/fixtures/capability-model.ts +++ b/test/fixtures/capability-model.ts @@ -4,7 +4,15 @@ import { capabilityId, type WorkspaceRevision, } from "../../src/capability-model/index.js"; -import { compileCapabilitySource } from "../../src/capability-language/index.js"; +import { + compileCapabilityResourceSource, + compileCapabilitySource, + type CapabilityImportEnvironment, +} from "../../src/capability-language/index.js"; +import type { + InterfaceRevision, + PackageRevision, +} from "../../src/capability-model/index.js"; export const fixtureId = { workspace: capabilityId.workspace("workspace:todo"), @@ -62,11 +70,119 @@ export const capabilityFixtureSource = readFileSync( "utf8", ); -export const makeValidCapabilityWorkspace = (): WorkspaceRevision => { - const result = compileCapabilitySource( - capabilityFixtureSource, - capabilityFixturePath, +const resourceSource = (name: string) => readFileSync( + resolve(process.cwd(), "test/fixtures", name), + "utf8", +); + +export const capabilityResourceSources = { + named: resourceSource("named.interface.qx"), + owned: resourceSource("owned.interface.qx"), + summary: resourceSource("summary.interface.qx"), + todo: resourceSource("todo.package.qx"), +} as const; + +const source = (repository: string, commit: string) => ({ repository, commit }); + +const interfaceRevision = ( + resource: { kind: "interface"; revision: InterfaceRevision } | + { kind: "package"; revision: PackageRevision }, +) => { + if (resource.kind !== "interface") throw new Error("Expected interface fixture"); + return resource.revision; +}; + +const packageRevision = ( + resource: { kind: "interface"; revision: InterfaceRevision } | + { kind: "package"; revision: PackageRevision }, +) => { + if (resource.kind !== "package") throw new Error("Expected package fixture"); + return resource.revision; +}; + +export const compileCapabilityFixture = (overrides: Partial<{ + workspace: string; + named: string; + owned: string; + summary: string; + todo: string; +}> = {}) => { + const named = compileCapabilityResourceSource( + overrides.named ?? capabilityResourceSources.named, + { + source: source( + "https://repos.quixos.org/quixos-todo/interface-named.git", + "2".repeat(40), + ), + fileName: "named.interface.qx", + }, ); + if (!named.ok) return named; + const namedRevision = interfaceRevision(named.resource); + const namedEnvironment: CapabilityImportEnvironment = { + interfaces: new Map([["Named", namedRevision]]), + interfaceClosure: [namedRevision], + }; + const owned = compileCapabilityResourceSource( + overrides.owned ?? capabilityResourceSources.owned, + { + source: source( + "https://repos.quixos.org/quixos-todo/interface-owned.git", + "3".repeat(40), + ), + fileName: "owned.interface.qx", + environment: namedEnvironment, + }, + ); + if (!owned.ok) return owned; + const ownedRevision = interfaceRevision(owned.resource); + const summary = compileCapabilityResourceSource( + overrides.summary ?? capabilityResourceSources.summary, + { + source: source( + "https://repos.quixos.org/quixos-todo/interface-summary.git", + "4".repeat(40), + ), + fileName: "summary.interface.qx", + }, + ); + if (!summary.ok) return summary; + const summaryRevision = interfaceRevision(summary.resource); + const todo = compileCapabilityResourceSource( + overrides.todo ?? capabilityResourceSources.todo, + { + source: source( + "https://repos.quixos.org/quixos-todo/package-todo-runtime.git", + "5".repeat(40), + ), + fileName: "todo.package.qx", + environment: namedEnvironment, + }, + ); + if (!todo.ok) return todo; + const todoRevision = packageRevision(todo.resource); + return compileCapabilitySource( + overrides.workspace ?? capabilityFixtureSource, + capabilityFixturePath, + { + interfaces: new Map([ + ["Named", namedRevision], + ["Owned", ownedRevision], + ["Summary", summaryRevision], + ]), + packages: new Map([["TodoRuntime", todoRevision]]), + interfaceClosure: [ + namedRevision, + ownedRevision, + summaryRevision, + ], + packageClosure: [todoRevision], + }, + ); +}; + +export const makeValidCapabilityWorkspace = (): WorkspaceRevision => { + const result = compileCapabilityFixture(); if (!result.ok) { throw new Error( result.diagnostics diff --git a/test/fixtures/component-runtime.package.qx b/test/fixtures/component-runtime.package.qx new file mode 100644 index 0000000..d127eeb --- /dev/null +++ b/test/fixtures/component-runtime.package.qx @@ -0,0 +1,10 @@ +import interface Named; +external atom Project id "atom:project"; +external atom ProjectComponent id "atom:project-component"; + +package ComponentRuntime id "package:component-runtime" revision "package:component-runtime@1" { + constructor createComponent id "export:component-runtime:create-component" constructs ProjectComponent : atom-ref; + operation propsGet id "export:component-runtime:props-get" : unit -> string mode call receiver atom ProjectComponent requires { + interface project id "port:component:project" : Named; + }; +} diff --git a/test/fixtures/has-react-component.interface.qx b/test/fixtures/has-react-component.interface.qx new file mode 100644 index 0000000..b9dfb4d --- /dev/null +++ b/test/fixtures/has-react-component.interface.qx @@ -0,0 +1,7 @@ +import interface ReactComponent; + +interface HasReactComponent id "interface:org.quixos.web-studio.has-react-component" revision "interface:org.quixos.web-studio.has-react-component@1" { + relation component id "member:org.quixos.web-studio.has-react-component:component" : optional-one interface ReactComponent { + resolve id "operation:org.quixos.web-studio.has-react-component:component:resolve"; + } +} diff --git a/test/fixtures/named.interface.qx b/test/fixtures/named.interface.qx new file mode 100644 index 0000000..bfc5b1a --- /dev/null +++ b/test/fixtures/named.interface.qx @@ -0,0 +1,7 @@ +interface Named id "interface:named" revision "interface:named@1" { + value name id "member:named:name" : string { + get id "operation:named:name:get"; + set id "operation:named:name:set"; + watch start id "operation:named:name:watch-start" stop id "operation:named:name:watch-stop"; + } +} diff --git a/test/fixtures/owned.interface.qx b/test/fixtures/owned.interface.qx new file mode 100644 index 0000000..a185bad --- /dev/null +++ b/test/fixtures/owned.interface.qx @@ -0,0 +1,10 @@ +import interface Named; + +interface Owned id "interface:owned" revision "interface:owned@1" { + relation owner id "member:owned:owner" : exactly-one interface Named { + resolve id "operation:owned:owner:resolve"; + connect id "operation:owned:owner:connect"; + disconnect id "operation:owned:owner:disconnect"; + watch start id "operation:owned:owner:watch-start" stop id "operation:owned:owner:watch-stop"; + } +} diff --git a/test/fixtures/react-component.interface.qx b/test/fixtures/react-component.interface.qx new file mode 100644 index 0000000..3bf8c95 --- /dev/null +++ b/test/fixtures/react-component.interface.qx @@ -0,0 +1,5 @@ +interface ReactComponent id "interface:org.quixos.web-studio.react-component" revision "interface:org.quixos.web-studio.react-component@1" { + value props id "member:org.quixos.web-studio.react-component:props" : string { + get id "operation:org.quixos.web-studio.react-component:props:get"; + } +} diff --git a/test/fixtures/summary.interface.qx b/test/fixtures/summary.interface.qx new file mode 100644 index 0000000..65b7a6d --- /dev/null +++ b/test/fixtures/summary.interface.qx @@ -0,0 +1,5 @@ +interface Summary id "interface:summary" revision "interface:summary@1" { + value summary id "member:summary:summary" : string { + get id "operation:summary:summary:get"; + } +} diff --git a/test/fixtures/todo.capabilities.qx b/test/fixtures/todo.capabilities.qx index dfe6e1e..2c10fd1 100644 --- a/test/fixtures/todo.capabilities.qx +++ b/test/fixtures/todo.capabilities.qx @@ -2,50 +2,10 @@ workspace Todo id "workspace:todo" revision "workspace:todo@1" commit "111111111 atom Project id "atom:project" doc "A project containing work."; atom Person id "atom:person"; - interface Named id "interface:named" revision "interface:named@1" source { - repository "https://repos.quixos.org/quixos-todo/interface-named.git"; - commit "2222222222222222222222222222222222222222"; - } { - value name id "member:named:name" : string { - get id "operation:named:name:get"; - set id "operation:named:name:set"; - watch start id "operation:named:name:watch-start" stop id "operation:named:name:watch-stop"; - } - } - - interface Owned id "interface:owned" revision "interface:owned@1" source { - repository "https://repos.quixos.org/quixos-todo/interface-owned.git"; - commit "3333333333333333333333333333333333333333"; - } { - relation owner id "member:owned:owner" : exactly-one interface Named { - resolve id "operation:owned:owner:resolve"; - connect id "operation:owned:owner:connect"; - disconnect id "operation:owned:owner:disconnect"; - watch start id "operation:owned:owner:watch-start" stop id "operation:owned:owner:watch-stop"; - } - } - - interface Summary id "interface:summary" revision "interface:summary@1" source { - repository "https://repos.quixos.org/quixos-todo/interface-summary.git"; - commit "4444444444444444444444444444444444444444"; - } { - value summary id "member:summary:summary" : string { - get id "operation:summary:summary:get"; - } - } - - package TodoRuntime id "package:todo-runtime" revision "package:todo-runtime@1" source { - repository "https://repos.quixos.org/quixos-todo/package-todo-runtime.git"; - commit "5555555555555555555555555555555555555555"; - } { - operation summaryGet id "export:todo-runtime:summary-get" : unit -> string - mode call receiver interfaces [Named] requires { - state title id "port:summary:title" : string [read]; - interface named id "port:summary:named" : Named; - constructor person id "port:summary:person" : Person; - }; - constructor createPerson id "export:todo-runtime:create-person" constructs Person : unit; - } + import interface Named; + import interface Owned; + import interface Summary; + import package TodoRuntime; shared state ProjectTitle id "slot:project:title" on Project : string policy optimistic-register default "Untitled project"; diff --git a/test/fixtures/todo.package.qx b/test/fixtures/todo.package.qx new file mode 100644 index 0000000..c1c2143 --- /dev/null +++ b/test/fixtures/todo.package.qx @@ -0,0 +1,12 @@ +import interface Named; +external atom Person id "atom:person"; + +package TodoRuntime id "package:todo-runtime" revision "package:todo-runtime@1" { + operation summaryGet id "export:todo-runtime:summary-get" : unit -> string + mode call receiver interfaces [Named] requires { + state title id "port:summary:title" : string [read]; + interface named id "port:summary:named" : Named; + constructor person id "port:summary:person" : Person; + }; + constructor createPerson id "export:todo-runtime:create-person" constructs Person : unit; +} diff --git a/test/fixtures/web-studio.capabilities.qx b/test/fixtures/web-studio.capabilities.qx index 8f4aed0..6467910 100644 --- a/test/fixtures/web-studio.capabilities.qx +++ b/test/fixtures/web-studio.capabilities.qx @@ -2,34 +2,10 @@ workspace WebStudioFixture id "workspace:web-studio-fixture" revision "workspace atom Project id "atom:project"; atom ProjectComponent id "atom:project-component"; - interface ReactComponent id "interface:org.quixos.web-studio.react-component" revision "interface:org.quixos.web-studio.react-component@1" source { - repository "https://repos.quixos.org/org-quixos-web-studio/interface-react-component.git"; - commit "2222222222222222222222222222222222222222"; - } { - value props id "member:org.quixos.web-studio.react-component:props" : string { - get id "operation:org.quixos.web-studio.react-component:props:get"; - } - } - - interface HasReactComponent id "interface:org.quixos.web-studio.has-react-component" revision "interface:org.quixos.web-studio.has-react-component@1" source { - repository "https://repos.quixos.org/org-quixos-web-studio/interface-has-react-component.git"; - commit "3333333333333333333333333333333333333333"; - } { - relation component id "member:org.quixos.web-studio.has-react-component:component" : optional-one interface ReactComponent { - resolve id "operation:org.quixos.web-studio.has-react-component:component:resolve"; - } - } - - package ComponentRuntime id "package:component-runtime" revision "package:component-runtime@1" source { - repository "https://repos.quixos.org/quixos-test/package-component-runtime.git"; - commit "4444444444444444444444444444444444444444"; - } { - constructor createComponent id "export:component-runtime:create-component" constructs ProjectComponent : atom-ref; - operation propsGet id "export:component-runtime:props-get" : unit -> string mode call receiver atom ProjectComponent requires { - edge subject id "port:component:subject" : exactly-one atom Project [resolve]; - state projectName id "port:component:project-name" : string [read]; - }; - } + import interface Named; + import interface ReactComponent; + import interface HasReactComponent; + import package ComponentRuntime; shared state ProjectName id "slot:project:name" on Project : string policy optimistic-register default "Untitled project"; @@ -38,14 +14,20 @@ workspace WebStudioFixture id "workspace:web-studio-fixture" revision "workspace atom Project projection component id "projection:project:component" optional-one; } + conform Project as Named { + bind name.get to state ProjectName.read; + bind name.set to state ProjectName.write; + bind name.watch-start to state ProjectName.watch-start; + bind name.watch-stop to state ProjectName.watch-stop; + } + conform Project as HasReactComponent { bind component.resolve to edge ProjectComponentEdge.component.resolve; materialize component if absent using constructor ProjectComponent via edge ProjectComponentEdge.subject; } conform ProjectComponent as ReactComponent { bind props.get to package ComponentRuntime.propsGet with { - subject to edge ProjectComponentEdge.subject; - projectName to state ProjectName via edge ProjectComponentEdge.subject; + project to interface Named via edge ProjectComponentEdge.subject; }; } diff --git a/test/resource-lock.test.ts b/test/resource-lock.test.ts index 849f55e..79aed4a 100644 --- a/test/resource-lock.test.ts +++ b/test/resource-lock.test.ts @@ -1,9 +1,16 @@ import assert from "node:assert/strict"; +import { mkdtemp, mkdir, rm, symlink, writeFile } from "node:fs/promises"; +import os from "node:os"; +import path from "node:path"; import test from "node:test"; import { formatQuixosLock, + formatQuixosLockDocument, + loadQuixosLock, nixGitInput, parseQuixosLock, + parseQuixosLockDocument, + resolveQuixosLock, retentionTagForCommit, } from "../src/resource-lock/index.js"; @@ -13,6 +20,8 @@ const packageCommit = "3".repeat(64); const fixture = `quixos-lock version 1 { quixos source { repository "https://gitea.example/quixos/quixos.git"; + policy track-development; + ref "dev/alice/main"; commit "${quixosCommit}"; } @@ -34,6 +43,8 @@ test("parses and canonically formats a Git-only repository lock", () => { if (!parsed.ok) return; assert.equal(parsed.lock.formatVersion, 1); assert.equal(parsed.lock.quixos.commit, quixosCommit); + assert.equal(parsed.lock.quixos.policy, "track-development"); + assert.equal(parsed.lock.quixos.ref, "dev/alice/main"); assert.deepEqual( parsed.lock.resources.map(({ kind, binding }) => ({ kind, binding })), [ @@ -48,6 +59,29 @@ test("parses and canonically formats a Git-only repository lock", () => { }); }); +test("validates pinned Quixos selections without imposing policy on resource locks", () => { + const mismatch = parseQuixosLockDocument(`quixos-lock version 1 { + quixos source { + repository "https://gitea.example/quixos/quixos.git"; + policy pinned; + ref "${namedCommit}"; + commit "${quixosCommit}"; + } + }`); + assert.equal(mismatch.ok, false); + if (!mismatch.ok) { + assert.equal(mismatch.diagnostics[0]?.code, "pinned-quixos-commit-mismatch"); + } + + const resourceBaseline = parseQuixosLockDocument(`quixos-lock version 1 { + quixos source { + repository "https://gitea.example/quixos/quixos.git"; + commit "${quixosCommit}"; + } + }`); + assert.equal(resourceBaseline.ok, true); +}); + test("derives immutable retention and Nix inputs without storing extra identity", () => { const source = { resolver: "git" as const, @@ -92,3 +126,152 @@ test("rejects mutable revisions, embedded credentials, and duplicate bindings", ]), ); }); + +test("resolves root-relative lock fragments into one deterministic resource closure", async () => { + const root = `quixos-lock version 1 { + quixos source { + repository "https://gitea.example/quixos/quixos.git"; + commit "${quixosCommit}"; + } + import "locks/web-studio.lock"; + import "locks/domain.lock"; + package RootRuntime source { + repository "https://repos.example/alice/package-root.git"; + commit "${packageCommit}"; + } + }`; + const sources = new Map([ + ["locks/web-studio.lock", `quixos-lock fragment version 1 { + import "locks/shared.lock"; + interface Placeable source { + repository "https://repos.example/alice/interface-placeable.git"; + commit "${namedCommit}"; + } + }`], + ["locks/shared.lock", `quixos-lock fragment version 1 { + interface Named source { + repository "https://repos.example/alice/interface-named.git"; + commit "${namedCommit}"; + } + }`], + ["locks/domain.lock", `quixos-lock fragment version 1 { + package TodoRuntime source { + repository "https://repos.example/alice/package-todo.git"; + commit "${packageCommit}"; + } + }`], + ]); + const result = await resolveQuixosLock(root, async (relativePath) => { + const source = sources.get(relativePath); + if (!source) throw new Error("missing fixture"); + return source; + }); + assert.equal(result.ok, true); + if (!result.ok) return; + assert.deepEqual(result.lock.sourceFiles, [ + "quixos.lock", + "locks/web-studio.lock", + "locks/shared.lock", + "locks/domain.lock", + ]); + assert.deepEqual(result.lock.resources.map(({ kind, binding }) => ({ kind, binding })), [ + { kind: "package", binding: "RootRuntime" }, + { kind: "interface", binding: "Placeable" }, + { kind: "interface", binding: "Named" }, + { kind: "package", binding: "TodoRuntime" }, + ]); +}); + +test("lock fragments format canonically and cannot redeclare the Quixos source", () => { + const document = { + kind: "fragment" as const, + formatVersion: 1 as const, + imports: ["locks/shared.lock"], + resources: [{ + kind: "interface" as const, + binding: "Named", + source: { + resolver: "git" as const, + repository: "https://repos.example/alice/interface-named.git", + commit: namedCommit, + }, + }], + }; + assert.deepEqual(parseQuixosLockDocument(formatQuixosLockDocument(document)), { + ok: true, + document, + diagnostics: [], + }); + const invalid = parseQuixosLockDocument(`quixos-lock fragment version 1 { + quixos source { + repository "https://gitea.example/quixos/quixos.git"; + commit "${quixosCommit}"; + } + }`, "bad.lock"); + assert.equal(invalid.ok, false); + if (!invalid.ok) assert.equal(invalid.diagnostics[0]?.code, "fragment-has-quixos-source"); +}); + +test("lock imports reject traversal, cycles, root documents, and cross-file binding collisions", async () => { + const invalidPath = parseQuixosLockDocument(`quixos-lock fragment version 1 { + import "../outside.lock"; + }`, "bad-path.lock"); + assert.equal(invalidPath.ok, false); + if (!invalidPath.ok) assert.equal(invalidPath.diagnostics[0]?.code, "invalid-import-path"); + + const root = `quixos-lock version 1 { + quixos source { + repository "https://gitea.example/quixos/quixos.git"; + commit "${quixosCommit}"; + } + import "a.lock"; + import "root-again.lock"; + interface Named source { + repository "https://repos.example/alice/interface-named.git"; + commit "${namedCommit}"; + } + }`; + const sources = new Map([ + ["a.lock", `quixos-lock fragment version 1 { + import "b.lock"; + interface Named source { + repository "https://repos.example/alice/interface-named-copy.git"; + commit "${namedCommit}"; + } + }`], + ["b.lock", `quixos-lock fragment version 1 { import "a.lock"; }`], + ["root-again.lock", root], + ]); + const result = await resolveQuixosLock(root, async (relativePath) => sources.get(relativePath) ?? ""); + assert.equal(result.ok, false); + if (!result.ok) { + assert.deepEqual(new Set(result.diagnostics.map(({ code }) => code)), new Set([ + "duplicate-resource-binding", + "import-cycle", + "imported-root-lock", + ])); + } +}); + +test("file loading rejects a symlink in any import path component", async (context) => { + const directory = await mkdtemp(path.join(os.tmpdir(), "quixos-lock-test-")); + context.after(() => rm(directory, { recursive: true, force: true })); + const outside = path.join(directory, "outside"); + await mkdir(outside); + await writeFile(path.join(outside, "fragment.lock"), "quixos-lock fragment version 1 {}\n"); + await symlink(outside, path.join(directory, "linked"), "dir"); + await writeFile(path.join(directory, "quixos.lock"), `quixos-lock version 1 { + quixos source { + repository "https://gitea.example/quixos/quixos.git"; + commit "${quixosCommit}"; + } + import "linked/fragment.lock"; + }`); + + const result = await loadQuixosLock(path.join(directory, "quixos.lock")); + assert.equal(result.ok, false); + if (!result.ok) { + assert.equal(result.diagnostics[0]?.code, "import-read-failed"); + assert.match(result.diagnostics[0]?.message ?? "", /symbolic links/); + } +}); diff --git a/yarn.lock b/yarn.lock index 5fba4f4..cafe60e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -54,6 +54,8 @@ __metadata: quixos-capability-compile: dist/src/capability-language/cli.js quixos-descriptor-check: dist/src/descriptor-check.js quixos-lock-check: dist/src/resource-lock/cli.js + quixos-resource-compile: dist/src/capability-language/resource-cli.js + quixos-workspace-compile: dist/src/capability-language/workspace-cli.js languageName: unknown linkType: soft From 4e17693d827636dc62cc8b43ad30d358dad1af8c Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Tue, 8 Sep 2026 14:27:24 -0700 Subject: [PATCH 2/4] Generate typed QX bindings and add source editing tools --- README.md | 6 + flake.nix | 7 + grammar/QuixosCapability.g4 | 22 +- package.json | 9 +- src/bindings/cli.ts | 13 + src/bindings/index.ts | 128 + src/capability-language/assembly.ts | 10 +- .../generated/QuixosCapability.interp | 8 +- .../generated/QuixosCapability.tokens | 394 +-- .../generated/QuixosCapabilityLexer.interp | 8 +- .../generated/QuixosCapabilityLexer.tokens | 394 +-- .../generated/QuixosCapabilityLexer.ts | 925 +++---- .../generated/QuixosCapabilityParser.ts | 2319 +++++++++-------- .../generated/QuixosCapabilityVisitor.ts | 14 + src/capability-language/git-resolver.ts | 2 + src/capability-language/index.ts | 3 + src/capability-language/parser.ts | 20 +- src/capability-language/resource-cli.ts | 9 +- src/capability-language/scaffold.ts | 66 + src/capability-language/source-loader.ts | 77 + src/capability-language/source.ts | 128 + src/capability-language/tool-cli.ts | 30 + src/capability-model/types.ts | 2 +- src/capability-model/validation.ts | 9 + test/bindings.test.ts | 30 + test/capability-model.test.ts | 12 + test/fixtures/typed-package/package.qx | 8 + test/fixtures/typed-package/quixos.lock | 6 + test/qx-source.test.ts | 84 + yarn.lock | 2 + 30 files changed, 2806 insertions(+), 1939 deletions(-) create mode 100644 src/bindings/cli.ts create mode 100644 src/bindings/index.ts create mode 100644 src/capability-language/scaffold.ts create mode 100644 src/capability-language/source-loader.ts create mode 100644 src/capability-language/source.ts create mode 100644 src/capability-language/tool-cli.ts create mode 100644 test/bindings.test.ts create mode 100644 test/fixtures/typed-package/package.qx create mode 100644 test/fixtures/typed-package/quixos.lock create mode 100644 test/qx-source.test.ts diff --git a/README.md b/README.md index fd1dddd..7ad63eb 100644 --- a/README.md +++ b/README.md @@ -42,6 +42,12 @@ Generics, interface composition, declarative forwarding, automatic relationship materialization, and first-class bundles are intentionally absent from v1. +Local workspace fragments, source-editing APIs, and generated package contracts +are documented in [QX bindings and tooling](../docs/QX_BINDINGS_AND_TOOLING.md). +`quixos-resource-compile --schema-out` exports the portable generator input; +`quixos-codegen-ts` is the first backend. `quixos-qx` provides parse, lint, +format, and nominal-atom scaffold commands. + ## Repository locks Every workspace, interface, and package repository carries a `quixos.lock`. diff --git a/flake.nix b/flake.nix index 173c303..d6695f8 100644 --- a/flake.nix +++ b/flake.nix @@ -46,6 +46,8 @@ esbuild dist/src/resource-lock/cli.js \ --bundle --platform=node --target=node24 --format=esm \ --outfile=quixos-lock-check.mjs + esbuild dist/src/bindings/cli.js --bundle --platform=node --target=node24 --format=esm --outfile=quixos-codegen-ts.mjs + esbuild dist/src/capability-language/tool-cli.js --bundle --platform=node --target=node24 --format=esm --outfile=quixos-qx.mjs runHook postBuild ''; doCheck = true; @@ -62,6 +64,10 @@ cp --reflink=auto --recursive dist "$out/dist" cp package.json "$out/package.json" mkdir -p "$out/bin" + for tool in quixos-codegen-ts quixos-qx; do + printf '#!/bin/sh\nexec ${pkgs.nodejs_24}/bin/node "%s/libexec/quixos-protocol/%s.mjs" "$@"\n' "$out" "$tool" > "$out/bin/$tool" + chmod +x "$out/bin/$tool" + done cat > "$out/bin/quixos-descriptor-check" < skip; -BLOCK_COMMENT: '/*' .*? '*/' -> skip; -WS: [ \t\r\n]+ -> skip; +LINE_COMMENT: '//' ~[\r\n]* -> channel(HIDDEN); +BLOCK_COMMENT: '/*' .*? '*/' -> channel(HIDDEN); +WS: [ \t\r\n]+ -> channel(HIDDEN); diff --git a/package.json b/package.json index 6e9872a..f16822c 100644 --- a/package.json +++ b/package.json @@ -5,13 +5,16 @@ "packageManager": "yarn@4.18.0", "type": "module", "bin": { + "quixos-qx": "dist/src/capability-language/tool-cli.js", + "quixos-codegen-ts": "dist/src/bindings/cli.js", "quixos-capability-compile": "dist/src/capability-language/cli.js", - "quixos-resource-compile": "dist/src/capability-language/resource-cli.js", - "quixos-workspace-compile": "dist/src/capability-language/workspace-cli.js", "quixos-descriptor-check": "dist/src/descriptor-check.js", - "quixos-lock-check": "dist/src/resource-lock/cli.js" + "quixos-lock-check": "dist/src/resource-lock/cli.js", + "quixos-resource-compile": "dist/src/capability-language/resource-cli.js", + "quixos-workspace-compile": "dist/src/capability-language/workspace-cli.js" }, "exports": { + "./bindings": "./dist/src/bindings/index.js", "./capability-model": "./dist/src/capability-model/index.js", "./capability-language": "./dist/src/capability-language/index.js", "./resource-lock": "./dist/src/resource-lock/index.js", diff --git a/src/bindings/cli.ts b/src/bindings/cli.ts new file mode 100644 index 0000000..f3a0c01 --- /dev/null +++ b/src/bindings/cli.ts @@ -0,0 +1,13 @@ +#!/usr/bin/env node +import { readFile, writeFile } from "node:fs/promises"; +import { generateTypeScriptBindings } from "./index.js"; + +const main = async () => { + const [schema, revision, output, options, ...rest] = process.argv.slice(2); + if (!schema || !revision || !output || rest.length) throw new Error( + "usage: quixos-codegen-ts SCHEMA.json PACKAGE_REVISION OUTPUT.ts [OPTIONS.json]"); + const generated = generateTypeScriptBindings(JSON.parse(await readFile(schema, "utf8")), revision, + options ? JSON.parse(await readFile(options, "utf8")) : {}); + await writeFile(output, generated); +}; +main().catch((error: unknown) => { console.error(error instanceof Error ? error.message : error); process.exitCode = 1; }); diff --git a/src/bindings/index.ts b/src/bindings/index.ts new file mode 100644 index 0000000..9617349 --- /dev/null +++ b/src/bindings/index.ts @@ -0,0 +1,128 @@ +import type { InterfaceRevision, PackageRevision, ValueType, DependencyPort } from "../capability-model/types.js"; +import type { CompiledCapabilityResourceRepository } from "../capability-language/assembly.js"; + +/** Portable generator input. New backends consume this instead of the parser or TS runtime. */ +export type BindingSchema = { + format: "quixos-bindings"; + version: 1; + interfaces: InterfaceRevision[]; + packages: PackageRevision[]; +}; +export const bindingSchema = (compiled: CompiledCapabilityResourceRepository): BindingSchema => ({ + format: "quixos-bindings", version: 1, + interfaces: compiled.resources.flatMap((node) => node.resource.kind === "interface" ? [node.resource.revision] : []), + packages: compiled.resources.flatMap((node) => node.resource.kind === "package" ? [node.resource.revision] : []), +}); +export type TypeScriptBindingOptions = { + runtimeModule?: string; + /** Each export must implement MessageBinding, providing both TS type and wire codec. */ + messages?: Record; +}; +const q = JSON.stringify; +const object = (entries: [string, string][]) => `{ ${entries.map(([key, value]) => `${q(key)}: ${value}`).join("; ")} }`; +const unit = (type: ValueType) => type.kind === "builtin" && type.name === "unit"; + +export const generateTypeScriptBindings = ( + schema: BindingSchema, packageRevisionId: string, options: TypeScriptBindingOptions = {}, +) => { + if (schema.format !== "quixos-bindings" || schema.version !== 1) throw new Error("Unsupported binding schema version"); + const pkg = schema.packages.find((entry) => entry.revisionId === packageRevisionId); + if (!pkg) throw new Error(`Unknown package revision ${packageRevisionId}`); + const messages = new Map(); + const type = (value: ValueType): string => { + switch (value.kind) { + case "builtin": return value.name === "unit" ? "null" : "QxWatchHandle"; + case "scalar": return ({ bool: "boolean", bytes: "Uint8Array", string: "string", int64: "bigint", uint64: "bigint", + double: "number", int32: "number", uint32: "number" })[value.name]; + case "object-ref": return `QxObjectRef<${q(value.expectation.kind === "atom" ? `atom:${value.expectation.atomId}` : `interface:${value.expectation.interfaceRevisionId}`)}>`; + case "optional": return `(${type(value.value)} | null)`; + case "list": return `Array<${type(value.value)}>`; + case "message": { + if (!options.messages?.[value.descriptorId]) throw new Error(`Missing TypeScript message binding for ${value.descriptorId}`); + if (!messages.has(value.descriptorId)) messages.set(value.descriptorId, `message${messages.size}`); + return `BindingValue`; + } + } + }; + const ref = (target: { kind: "atom"; atomId: string } | { kind: "interface"; interfaceRevisionId: string }) => + `QxObjectRef<${q(target.kind === "atom" ? `atom:${target.atomId}` : `interface:${target.interfaceRevisionId}`)}>`; + const params = (input: ValueType) => unit(input) ? "" : `input: ${type(input)}`; + const port = (entry: DependencyPort): { type: string; spec: unknown } => { + const requirement = entry.requirement; + switch (requirement.kind) { + case "state": { + const methods = requirement.primitives.map((primitive): [string, string] => { + if (primitive === "read") return ["get", `() => Promise<${type(requirement.valueType)}>`]; + if (primitive === "write") return ["set", `(value: ${type(requirement.valueType)}) => Promise`]; + throw new Error(`State primitive ${primitive} is not supported by the TypeScript runtime binding yet`); + }); + return { type: object(methods), spec: { ...requirement, id: entry.id } }; + } + case "edge": { + const methods = requirement.primitives.map((primitive): [string, string] => { + if (primitive === "resolve") return [primitive, `() => Promise>`]; + if (primitive === "connect" || primitive === "disconnect") return [primitive, `(target: ${ref(requirement.target)}) => Promise`]; + throw new Error(`Edge primitive ${primitive} is not supported by the TypeScript runtime binding yet`); + }); + return { type: object(methods), spec: { kind: "edge", id: entry.id, primitives: requirement.primitives } }; + } + case "interface": { + const contract = schema.interfaces.find((candidate) => candidate.revisionId === requirement.interfaceRevisionId); + if (!contract) throw new Error(`Missing imported interface contract ${requirement.interfaceRevisionId}`); + // Streaming ports need a future streaming ABI; ordinary calls are fully typed today. + const operations = contract.members.flatMap((member) => member.operations.filter((operation) => operation.mode === "call") + .map((operation) => ({ ...operation, name: `${member.displayName}.${operation.displayName}` }))); + return { type: object(operations.map((operation) => [operation.name, `(${params(operation.inputType)}) => Promise<${type(operation.outputType)}>`])), + spec: { kind: "interface", id: entry.id, operations: Object.fromEntries(operations.map((operation) => [operation.name, operation])) } }; + } + case "constructor": { + const input = requirement.inputType; + if (!input) throw new Error(`Constructor port ${entry.id} needs an explicit input contract: add 'input TYPE' after ${requirement.atomId} in QX`); + return { type: object([["construct", `(${params(input)}) => Promise<${ref({ kind: "atom", atomId: requirement.atomId })}>`]]), + spec: { kind: "constructor", id: entry.id, inputType: input } }; + } + } + }; + const exports = [...pkg.exports].sort((a, b) => a.id < b.id ? -1 : a.id > b.id ? 1 : 0); + const names = new Set(); + const specs: Record = {}; + const contexts: [string, string][] = []; + const handlers: [string, string][] = []; + for (const entry of exports) { + if (names.has(entry.displayName)) throw new Error(`Duplicate export name ${entry.displayName}`); + names.add(entry.displayName); + const ports = entry.dependencyPorts.map((dependency) => ({ name: dependency.displayName, ...port(dependency) })); + if (new Set(ports.map((p) => p.name)).size !== ports.length) throw new Error(`Duplicate dependency name in ${entry.displayName}`); + const receiver = entry.kind === "constructor" ? ref({ kind: "atom", atomId: entry.constructsAtom }) : + entry.kind === "operation" && entry.receiverRequirement.kind === "exact-atom" ? + ref({ kind: "atom", atomId: entry.receiverRequirement.atomId }) : + entry.kind === "operation" && entry.receiverRequirement.kind === "all-interfaces" ? + `QxObjectRef<${entry.receiverRequirement.interfaceRevisionIds.map((id) => q(`interface:${id}`)).join(" | ") || "never"}>` : "string"; + contexts.push([entry.displayName, object([["objectId", receiver], ["input", type(entry.inputType)], + ["ports", object(ports.map((port) => [port.name, port.type]))]])]); + const event = entry.kind === "operation" ? entry.eventType : undefined; + const contextType = `Contexts[${q(entry.displayName)}]`; + const outputType = type(event ?? entry.outputType); + // Watch-start handlers produce events through the runtime's derived stream protocol. + handlers.push([entry.displayName, event ? `QxDerived<${contextType}, ${outputType}>` : + `QxHandler<${contextType}, ${outputType}>${entry.kind === "operation" && entry.mode === "call" ? ` | QxDerived<${contextType}, ${outputType}>` : ""}`]); + specs[entry.displayName] = { inputType: entry.inputType, outputType: entry.outputType, + ...(event ? { eventType: event } : {}), ports: Object.fromEntries(ports.map((port) => [port.name, port.spec])) }; + } + const imports = [...messages].map(([id, alias]) => { + const binding = options.messages![id]!; + if (!/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(binding.export)) throw new Error(`Invalid message binding export ${binding.export}`); + return `import { ${binding.export} as ${alias} } from ${q(binding.module)};`; + }); + const signatures = `${object(contexts)} ${object(handlers)}`; + const typeImports = ["BindingValue", "QxObjectRef", "QxWatchHandle", "QxHandler", "QxDerived"].filter((name) => new RegExp(`\\b${name}\\b`).test(signatures)); + return `// Generated by quixos-codegen-ts. Do not edit. Binding ABI version 1.\n` + + `import { ${exports.length ? "bindQxHandler, " : ""}${[...typeImports, "QxHandlerSpec", "QxMessages"].map((name) => `type ${name}`).join(", ")} } from ${q(options.runtimeModule ?? "@quixos/camino-package-runtime")};\n` + + imports.join("\n") + `\nexport const packageRevisionId = ${q(pkg.revisionId)};\n` + + `export type Contexts = ${object(contexts)};\nexport type Implementation = ${object(handlers)};\n` + + `const messages = { ${[...messages].map(([id, alias]) => `${q(id)}: ${alias}`).join(", ")} } satisfies QxMessages;\n` + + `const specs = ${JSON.stringify(specs, null, 2)} satisfies Record;\n` + + `export const createRuntime = (implementation: Implementation) => ({\n packageRevisionId,\n exports: {\n` + + exports.map((entry) => ` ${q(entry.id)}: bindQxHandler(specs[${q(entry.displayName)}], implementation[${q(entry.displayName)}], messages),`).join("\n") + + `\n },\n});\n`; +}; diff --git a/src/capability-language/assembly.ts b/src/capability-language/assembly.ts index 41cf693..0b814e9 100644 --- a/src/capability-language/assembly.ts +++ b/src/capability-language/assembly.ts @@ -1,5 +1,6 @@ import { readFile } from "node:fs/promises"; import path from "node:path"; +import { loadQxSources, resolveQxSources } from "./source-loader.js"; import { capabilityId, compileWorkspaceRevision, @@ -286,6 +287,8 @@ export const compileWorkspaceRepository = async (options: { workspaceId?: string; workspaceRevisionId?: string; sourceRootCommit?: string; + /** An editor's proposed source snapshot; locks and dependency revisions remain exact. */ + readSource?: (name: string) => Promise; }): Promise => { const rootLockResult = await loadQuixosLock( path.join(options.rootDirectory, "quixos.lock"), @@ -303,10 +306,11 @@ export const compileWorkspaceRepository = async (options: { const nodes = await resolver.nodes(); const environment = environmentFor(directPairs, nodes); const workspacePath = path.join(options.rootDirectory, "workspace.qx"); - const workspaceSource = await readFile(workspacePath, "utf8"); - const compiled = compileCapabilitySource(workspaceSource, workspacePath, environment); + const sources = options.readSource ? await resolveQxSources(options.readSource) : await loadQxSources(options.rootDirectory); + const compiled = compileCapabilitySource(sources.source, workspacePath, environment); if (!compiled.ok) { - throw new Error(diagnosticsMessage("Workspace", compiled.diagnostics)); + throw new Error(diagnosticsMessage("Workspace", compiled.diagnostics.map((diagnostic) => + diagnostic.line > 0 ? { ...diagnostic, ...sources.originalPosition(diagnostic.line, diagnostic.column) } : diagnostic))); } assertImportsMatchLock(workspacePath, compiled.imports, rootLock.resources); const availableInterfaceIds = new Set( diff --git a/src/capability-language/generated/QuixosCapability.interp b/src/capability-language/generated/QuixosCapability.interp index 445a49b..f9a81a4 100644 --- a/src/capability-language/generated/QuixosCapability.interp +++ b/src/capability-language/generated/QuixosCapability.interp @@ -1,6 +1,7 @@ token literal names: null 'workspace' +'fragment' 'import' 'external' 'atom' @@ -13,6 +14,7 @@ null 'function' 'constructor' 'constructs' +'input' 'conform' 'as' 'bind' @@ -106,6 +108,7 @@ null token symbolic names: null WORKSPACE +FRAGMENT IMPORT EXTERNAL ATOM @@ -118,6 +121,7 @@ OPERATION FUNCTION CONSTRUCTOR CONSTRUCTS +INPUT CONFORM AS BIND @@ -210,6 +214,8 @@ WS rule names: document +fragmentDecl +sourceImportDecl workspaceDecl workspaceItem resourceImportDecl @@ -268,4 +274,4 @@ stringLiteral atn: -[4, 1, 102, 753, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 122, 8, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 134, 8, 1, 10, 1, 12, 1, 137, 9, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 3, 2, 146, 8, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 3, 3, 158, 8, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 3, 6, 177, 8, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 3, 7, 185, 8, 7, 1, 7, 1, 7, 1, 8, 5, 8, 190, 8, 8, 10, 8, 12, 8, 193, 9, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 5, 8, 203, 8, 8, 10, 8, 12, 8, 206, 9, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 3, 9, 213, 8, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 238, 8, 11, 10, 11, 12, 11, 241, 9, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 3, 12, 264, 8, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 3, 13, 274, 8, 13, 1, 13, 1, 13, 5, 13, 278, 8, 13, 10, 13, 12, 13, 281, 9, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 3, 14, 309, 8, 14, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 315, 8, 15, 1, 16, 5, 16, 318, 8, 16, 10, 16, 12, 16, 321, 9, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 5, 16, 331, 8, 16, 10, 16, 12, 16, 334, 9, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 3, 17, 341, 8, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 3, 18, 354, 8, 18, 1, 18, 1, 18, 1, 18, 3, 18, 359, 8, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 3, 19, 372, 8, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 385, 8, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 400, 8, 23, 1, 23, 3, 23, 403, 8, 23, 1, 24, 1, 24, 1, 24, 5, 24, 408, 8, 24, 10, 24, 12, 24, 411, 9, 24, 1, 25, 1, 25, 1, 25, 5, 25, 416, 8, 25, 10, 25, 12, 25, 419, 9, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 3, 26, 458, 8, 26, 1, 27, 1, 27, 1, 27, 1, 27, 5, 27, 464, 8, 27, 10, 27, 12, 27, 467, 9, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 3, 30, 478, 8, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 3, 31, 492, 8, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 3, 32, 502, 8, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 3, 34, 520, 8, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 5, 35, 530, 8, 35, 10, 35, 12, 35, 533, 9, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 3, 36, 541, 8, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 3, 40, 578, 8, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 3, 41, 597, 8, 41, 3, 41, 599, 8, 41, 1, 42, 1, 42, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 5, 44, 608, 8, 44, 10, 44, 12, 44, 611, 9, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 3, 45, 625, 8, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 3, 45, 641, 8, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 3, 45, 655, 8, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 3, 45, 665, 8, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 3, 46, 674, 8, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 3, 47, 703, 8, 47, 1, 48, 1, 48, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 3, 50, 717, 8, 50, 1, 51, 1, 51, 1, 51, 1, 51, 5, 51, 723, 8, 51, 10, 51, 12, 51, 726, 9, 51, 3, 51, 728, 8, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 5, 53, 740, 8, 53, 10, 53, 12, 53, 743, 9, 53, 3, 53, 745, 8, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 0, 0, 56, 0, 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, 0, 7, 1, 0, 53, 57, 2, 0, 48, 52, 54, 55, 2, 0, 48, 49, 54, 55, 2, 0, 50, 52, 54, 55, 1, 0, 72, 79, 1, 0, 60, 63, 2, 0, 32, 32, 98, 98, 783, 0, 121, 1, 0, 0, 0, 2, 123, 1, 0, 0, 0, 4, 145, 1, 0, 0, 0, 6, 157, 1, 0, 0, 0, 8, 159, 1, 0, 0, 0, 10, 166, 1, 0, 0, 0, 12, 176, 1, 0, 0, 0, 14, 178, 1, 0, 0, 0, 16, 191, 1, 0, 0, 0, 18, 212, 1, 0, 0, 0, 20, 214, 1, 0, 0, 0, 22, 229, 1, 0, 0, 0, 24, 263, 1, 0, 0, 0, 26, 265, 1, 0, 0, 0, 28, 308, 1, 0, 0, 0, 30, 314, 1, 0, 0, 0, 32, 319, 1, 0, 0, 0, 34, 340, 1, 0, 0, 0, 36, 342, 1, 0, 0, 0, 38, 362, 1, 0, 0, 0, 40, 375, 1, 0, 0, 0, 42, 388, 1, 0, 0, 0, 44, 391, 1, 0, 0, 0, 46, 402, 1, 0, 0, 0, 48, 404, 1, 0, 0, 0, 50, 412, 1, 0, 0, 0, 52, 457, 1, 0, 0, 0, 54, 459, 1, 0, 0, 0, 56, 470, 1, 0, 0, 0, 58, 472, 1, 0, 0, 0, 60, 477, 1, 0, 0, 0, 62, 479, 1, 0, 0, 0, 64, 501, 1, 0, 0, 0, 66, 503, 1, 0, 0, 0, 68, 512, 1, 0, 0, 0, 70, 523, 1, 0, 0, 0, 72, 540, 1, 0, 0, 0, 74, 542, 1, 0, 0, 0, 76, 556, 1, 0, 0, 0, 78, 562, 1, 0, 0, 0, 80, 577, 1, 0, 0, 0, 82, 598, 1, 0, 0, 0, 84, 600, 1, 0, 0, 0, 86, 602, 1, 0, 0, 0, 88, 604, 1, 0, 0, 0, 90, 664, 1, 0, 0, 0, 92, 666, 1, 0, 0, 0, 94, 702, 1, 0, 0, 0, 96, 704, 1, 0, 0, 0, 98, 706, 1, 0, 0, 0, 100, 716, 1, 0, 0, 0, 102, 718, 1, 0, 0, 0, 104, 731, 1, 0, 0, 0, 106, 735, 1, 0, 0, 0, 108, 748, 1, 0, 0, 0, 110, 750, 1, 0, 0, 0, 112, 113, 3, 2, 1, 0, 113, 114, 5, 0, 0, 1, 114, 122, 1, 0, 0, 0, 115, 116, 3, 16, 8, 0, 116, 117, 5, 0, 0, 1, 117, 122, 1, 0, 0, 0, 118, 119, 3, 32, 16, 0, 119, 120, 5, 0, 0, 1, 120, 122, 1, 0, 0, 0, 121, 112, 1, 0, 0, 0, 121, 115, 1, 0, 0, 0, 121, 118, 1, 0, 0, 0, 122, 1, 1, 0, 0, 0, 123, 124, 5, 1, 0, 0, 124, 125, 3, 108, 54, 0, 125, 126, 5, 36, 0, 0, 126, 127, 3, 110, 55, 0, 127, 128, 5, 35, 0, 0, 128, 129, 3, 110, 55, 0, 129, 130, 5, 34, 0, 0, 130, 131, 3, 110, 55, 0, 131, 135, 5, 88, 0, 0, 132, 134, 3, 4, 2, 0, 133, 132, 1, 0, 0, 0, 134, 137, 1, 0, 0, 0, 135, 133, 1, 0, 0, 0, 135, 136, 1, 0, 0, 0, 136, 138, 1, 0, 0, 0, 137, 135, 1, 0, 0, 0, 138, 139, 5, 89, 0, 0, 139, 3, 1, 0, 0, 0, 140, 146, 3, 14, 7, 0, 141, 146, 3, 6, 3, 0, 142, 146, 3, 58, 29, 0, 143, 146, 3, 70, 35, 0, 144, 146, 3, 92, 46, 0, 145, 140, 1, 0, 0, 0, 145, 141, 1, 0, 0, 0, 145, 142, 1, 0, 0, 0, 145, 143, 1, 0, 0, 0, 145, 144, 1, 0, 0, 0, 146, 5, 1, 0, 0, 0, 147, 148, 5, 2, 0, 0, 148, 149, 5, 5, 0, 0, 149, 150, 3, 108, 54, 0, 150, 151, 5, 85, 0, 0, 151, 158, 1, 0, 0, 0, 152, 153, 5, 2, 0, 0, 153, 154, 5, 7, 0, 0, 154, 155, 3, 108, 54, 0, 155, 156, 5, 85, 0, 0, 156, 158, 1, 0, 0, 0, 157, 147, 1, 0, 0, 0, 157, 152, 1, 0, 0, 0, 158, 7, 1, 0, 0, 0, 159, 160, 5, 3, 0, 0, 160, 161, 5, 4, 0, 0, 161, 162, 3, 108, 54, 0, 162, 163, 5, 36, 0, 0, 163, 164, 3, 110, 55, 0, 164, 165, 5, 85, 0, 0, 165, 9, 1, 0, 0, 0, 166, 167, 5, 3, 0, 0, 167, 168, 5, 5, 0, 0, 168, 169, 3, 108, 54, 0, 169, 170, 5, 35, 0, 0, 170, 171, 3, 110, 55, 0, 171, 172, 5, 85, 0, 0, 172, 11, 1, 0, 0, 0, 173, 177, 3, 6, 3, 0, 174, 177, 3, 8, 4, 0, 175, 177, 3, 10, 5, 0, 176, 173, 1, 0, 0, 0, 176, 174, 1, 0, 0, 0, 176, 175, 1, 0, 0, 0, 177, 13, 1, 0, 0, 0, 178, 179, 5, 4, 0, 0, 179, 180, 3, 108, 54, 0, 180, 181, 5, 36, 0, 0, 181, 184, 3, 110, 55, 0, 182, 183, 5, 37, 0, 0, 183, 185, 3, 110, 55, 0, 184, 182, 1, 0, 0, 0, 184, 185, 1, 0, 0, 0, 185, 186, 1, 0, 0, 0, 186, 187, 5, 85, 0, 0, 187, 15, 1, 0, 0, 0, 188, 190, 3, 12, 6, 0, 189, 188, 1, 0, 0, 0, 190, 193, 1, 0, 0, 0, 191, 189, 1, 0, 0, 0, 191, 192, 1, 0, 0, 0, 192, 194, 1, 0, 0, 0, 193, 191, 1, 0, 0, 0, 194, 195, 5, 5, 0, 0, 195, 196, 3, 108, 54, 0, 196, 197, 5, 36, 0, 0, 197, 198, 3, 110, 55, 0, 198, 199, 5, 35, 0, 0, 199, 200, 3, 110, 55, 0, 200, 204, 5, 88, 0, 0, 201, 203, 3, 18, 9, 0, 202, 201, 1, 0, 0, 0, 203, 206, 1, 0, 0, 0, 204, 202, 1, 0, 0, 0, 204, 205, 1, 0, 0, 0, 205, 207, 1, 0, 0, 0, 206, 204, 1, 0, 0, 0, 207, 208, 5, 89, 0, 0, 208, 17, 1, 0, 0, 0, 209, 213, 3, 22, 11, 0, 210, 213, 3, 26, 13, 0, 211, 213, 3, 20, 10, 0, 212, 209, 1, 0, 0, 0, 212, 210, 1, 0, 0, 0, 212, 211, 1, 0, 0, 0, 213, 19, 1, 0, 0, 0, 214, 215, 5, 10, 0, 0, 215, 216, 3, 108, 54, 0, 216, 217, 5, 36, 0, 0, 217, 218, 3, 110, 55, 0, 218, 219, 5, 84, 0, 0, 219, 220, 3, 94, 47, 0, 220, 221, 5, 83, 0, 0, 221, 222, 3, 94, 47, 0, 222, 223, 5, 88, 0, 0, 223, 224, 5, 53, 0, 0, 224, 225, 5, 36, 0, 0, 225, 226, 3, 110, 55, 0, 226, 227, 5, 85, 0, 0, 227, 228, 5, 89, 0, 0, 228, 21, 1, 0, 0, 0, 229, 230, 5, 8, 0, 0, 230, 231, 3, 108, 54, 0, 231, 232, 5, 36, 0, 0, 232, 233, 3, 110, 55, 0, 233, 234, 5, 84, 0, 0, 234, 235, 3, 94, 47, 0, 235, 239, 5, 88, 0, 0, 236, 238, 3, 24, 12, 0, 237, 236, 1, 0, 0, 0, 238, 241, 1, 0, 0, 0, 239, 237, 1, 0, 0, 0, 239, 240, 1, 0, 0, 0, 240, 242, 1, 0, 0, 0, 241, 239, 1, 0, 0, 0, 242, 243, 5, 89, 0, 0, 243, 23, 1, 0, 0, 0, 244, 245, 5, 43, 0, 0, 245, 246, 5, 36, 0, 0, 246, 247, 3, 110, 55, 0, 247, 248, 5, 85, 0, 0, 248, 264, 1, 0, 0, 0, 249, 250, 5, 44, 0, 0, 250, 251, 5, 36, 0, 0, 251, 252, 3, 110, 55, 0, 252, 253, 5, 85, 0, 0, 253, 264, 1, 0, 0, 0, 254, 255, 5, 45, 0, 0, 255, 256, 5, 46, 0, 0, 256, 257, 5, 36, 0, 0, 257, 258, 3, 110, 55, 0, 258, 259, 5, 47, 0, 0, 259, 260, 5, 36, 0, 0, 260, 261, 3, 110, 55, 0, 261, 262, 5, 85, 0, 0, 262, 264, 1, 0, 0, 0, 263, 244, 1, 0, 0, 0, 263, 249, 1, 0, 0, 0, 263, 254, 1, 0, 0, 0, 264, 25, 1, 0, 0, 0, 265, 266, 5, 9, 0, 0, 266, 267, 3, 108, 54, 0, 267, 268, 5, 36, 0, 0, 268, 269, 3, 110, 55, 0, 269, 270, 5, 84, 0, 0, 270, 271, 3, 98, 49, 0, 271, 273, 3, 30, 15, 0, 272, 274, 5, 64, 0, 0, 273, 272, 1, 0, 0, 0, 273, 274, 1, 0, 0, 0, 274, 275, 1, 0, 0, 0, 275, 279, 5, 88, 0, 0, 276, 278, 3, 28, 14, 0, 277, 276, 1, 0, 0, 0, 278, 281, 1, 0, 0, 0, 279, 277, 1, 0, 0, 0, 279, 280, 1, 0, 0, 0, 280, 282, 1, 0, 0, 0, 281, 279, 1, 0, 0, 0, 282, 283, 5, 89, 0, 0, 283, 27, 1, 0, 0, 0, 284, 285, 5, 50, 0, 0, 285, 286, 5, 36, 0, 0, 286, 287, 3, 110, 55, 0, 287, 288, 5, 85, 0, 0, 288, 309, 1, 0, 0, 0, 289, 290, 5, 51, 0, 0, 290, 291, 5, 36, 0, 0, 291, 292, 3, 110, 55, 0, 292, 293, 5, 85, 0, 0, 293, 309, 1, 0, 0, 0, 294, 295, 5, 52, 0, 0, 295, 296, 5, 36, 0, 0, 296, 297, 3, 110, 55, 0, 297, 298, 5, 85, 0, 0, 298, 309, 1, 0, 0, 0, 299, 300, 5, 45, 0, 0, 300, 301, 5, 46, 0, 0, 301, 302, 5, 36, 0, 0, 302, 303, 3, 110, 55, 0, 303, 304, 5, 47, 0, 0, 304, 305, 5, 36, 0, 0, 305, 306, 3, 110, 55, 0, 306, 307, 5, 85, 0, 0, 307, 309, 1, 0, 0, 0, 308, 284, 1, 0, 0, 0, 308, 289, 1, 0, 0, 0, 308, 294, 1, 0, 0, 0, 308, 299, 1, 0, 0, 0, 309, 29, 1, 0, 0, 0, 310, 311, 5, 4, 0, 0, 311, 315, 3, 108, 54, 0, 312, 313, 5, 5, 0, 0, 313, 315, 3, 108, 54, 0, 314, 310, 1, 0, 0, 0, 314, 312, 1, 0, 0, 0, 315, 31, 1, 0, 0, 0, 316, 318, 3, 12, 6, 0, 317, 316, 1, 0, 0, 0, 318, 321, 1, 0, 0, 0, 319, 317, 1, 0, 0, 0, 319, 320, 1, 0, 0, 0, 320, 322, 1, 0, 0, 0, 321, 319, 1, 0, 0, 0, 322, 323, 5, 7, 0, 0, 323, 324, 3, 108, 54, 0, 324, 325, 5, 36, 0, 0, 325, 326, 3, 110, 55, 0, 326, 327, 5, 35, 0, 0, 327, 328, 3, 110, 55, 0, 328, 332, 5, 88, 0, 0, 329, 331, 3, 34, 17, 0, 330, 329, 1, 0, 0, 0, 331, 334, 1, 0, 0, 0, 332, 330, 1, 0, 0, 0, 332, 333, 1, 0, 0, 0, 333, 335, 1, 0, 0, 0, 334, 332, 1, 0, 0, 0, 335, 336, 5, 89, 0, 0, 336, 33, 1, 0, 0, 0, 337, 341, 3, 36, 18, 0, 338, 341, 3, 38, 19, 0, 339, 341, 3, 40, 20, 0, 340, 337, 1, 0, 0, 0, 340, 338, 1, 0, 0, 0, 340, 339, 1, 0, 0, 0, 341, 35, 1, 0, 0, 0, 342, 343, 5, 10, 0, 0, 343, 344, 3, 108, 54, 0, 344, 345, 5, 36, 0, 0, 345, 346, 3, 110, 55, 0, 346, 347, 5, 84, 0, 0, 347, 348, 3, 94, 47, 0, 348, 349, 5, 83, 0, 0, 349, 350, 3, 94, 47, 0, 350, 351, 5, 38, 0, 0, 351, 353, 3, 44, 22, 0, 352, 354, 3, 42, 21, 0, 353, 352, 1, 0, 0, 0, 353, 354, 1, 0, 0, 0, 354, 355, 1, 0, 0, 0, 355, 356, 5, 40, 0, 0, 356, 358, 3, 46, 23, 0, 357, 359, 3, 50, 25, 0, 358, 357, 1, 0, 0, 0, 358, 359, 1, 0, 0, 0, 359, 360, 1, 0, 0, 0, 360, 361, 5, 85, 0, 0, 361, 37, 1, 0, 0, 0, 362, 363, 5, 11, 0, 0, 363, 364, 3, 108, 54, 0, 364, 365, 5, 36, 0, 0, 365, 366, 3, 110, 55, 0, 366, 367, 5, 84, 0, 0, 367, 368, 3, 94, 47, 0, 368, 369, 5, 83, 0, 0, 369, 371, 3, 94, 47, 0, 370, 372, 3, 50, 25, 0, 371, 370, 1, 0, 0, 0, 371, 372, 1, 0, 0, 0, 372, 373, 1, 0, 0, 0, 373, 374, 5, 85, 0, 0, 374, 39, 1, 0, 0, 0, 375, 376, 5, 12, 0, 0, 376, 377, 3, 108, 54, 0, 377, 378, 5, 36, 0, 0, 378, 379, 3, 110, 55, 0, 379, 380, 5, 13, 0, 0, 380, 381, 3, 108, 54, 0, 381, 382, 5, 84, 0, 0, 382, 384, 3, 94, 47, 0, 383, 385, 3, 50, 25, 0, 384, 383, 1, 0, 0, 0, 384, 385, 1, 0, 0, 0, 385, 386, 1, 0, 0, 0, 386, 387, 5, 85, 0, 0, 387, 41, 1, 0, 0, 0, 388, 389, 5, 39, 0, 0, 389, 390, 3, 94, 47, 0, 390, 43, 1, 0, 0, 0, 391, 392, 7, 0, 0, 0, 392, 45, 1, 0, 0, 0, 393, 403, 5, 42, 0, 0, 394, 395, 5, 4, 0, 0, 395, 403, 3, 108, 54, 0, 396, 397, 5, 6, 0, 0, 397, 399, 5, 90, 0, 0, 398, 400, 3, 48, 24, 0, 399, 398, 1, 0, 0, 0, 399, 400, 1, 0, 0, 0, 400, 401, 1, 0, 0, 0, 401, 403, 5, 91, 0, 0, 402, 393, 1, 0, 0, 0, 402, 394, 1, 0, 0, 0, 402, 396, 1, 0, 0, 0, 403, 47, 1, 0, 0, 0, 404, 409, 3, 108, 54, 0, 405, 406, 5, 86, 0, 0, 406, 408, 3, 108, 54, 0, 407, 405, 1, 0, 0, 0, 408, 411, 1, 0, 0, 0, 409, 407, 1, 0, 0, 0, 409, 410, 1, 0, 0, 0, 410, 49, 1, 0, 0, 0, 411, 409, 1, 0, 0, 0, 412, 413, 5, 41, 0, 0, 413, 417, 5, 88, 0, 0, 414, 416, 3, 52, 26, 0, 415, 414, 1, 0, 0, 0, 416, 419, 1, 0, 0, 0, 417, 415, 1, 0, 0, 0, 417, 418, 1, 0, 0, 0, 418, 420, 1, 0, 0, 0, 419, 417, 1, 0, 0, 0, 420, 421, 5, 89, 0, 0, 421, 51, 1, 0, 0, 0, 422, 423, 5, 20, 0, 0, 423, 424, 3, 108, 54, 0, 424, 425, 5, 36, 0, 0, 425, 426, 3, 110, 55, 0, 426, 427, 5, 84, 0, 0, 427, 428, 3, 94, 47, 0, 428, 429, 3, 54, 27, 0, 429, 430, 5, 85, 0, 0, 430, 458, 1, 0, 0, 0, 431, 432, 5, 21, 0, 0, 432, 433, 3, 108, 54, 0, 433, 434, 5, 36, 0, 0, 434, 435, 3, 110, 55, 0, 435, 436, 5, 84, 0, 0, 436, 437, 3, 98, 49, 0, 437, 438, 3, 30, 15, 0, 438, 439, 3, 54, 27, 0, 439, 440, 5, 85, 0, 0, 440, 458, 1, 0, 0, 0, 441, 442, 5, 5, 0, 0, 442, 443, 3, 108, 54, 0, 443, 444, 5, 36, 0, 0, 444, 445, 3, 110, 55, 0, 445, 446, 5, 84, 0, 0, 446, 447, 3, 108, 54, 0, 447, 448, 5, 85, 0, 0, 448, 458, 1, 0, 0, 0, 449, 450, 5, 12, 0, 0, 450, 451, 3, 108, 54, 0, 451, 452, 5, 36, 0, 0, 452, 453, 3, 110, 55, 0, 453, 454, 5, 84, 0, 0, 454, 455, 3, 108, 54, 0, 455, 456, 5, 85, 0, 0, 456, 458, 1, 0, 0, 0, 457, 422, 1, 0, 0, 0, 457, 431, 1, 0, 0, 0, 457, 441, 1, 0, 0, 0, 457, 449, 1, 0, 0, 0, 458, 53, 1, 0, 0, 0, 459, 460, 5, 90, 0, 0, 460, 465, 3, 56, 28, 0, 461, 462, 5, 86, 0, 0, 462, 464, 3, 56, 28, 0, 463, 461, 1, 0, 0, 0, 464, 467, 1, 0, 0, 0, 465, 463, 1, 0, 0, 0, 465, 466, 1, 0, 0, 0, 466, 468, 1, 0, 0, 0, 467, 465, 1, 0, 0, 0, 468, 469, 5, 91, 0, 0, 469, 55, 1, 0, 0, 0, 470, 471, 7, 1, 0, 0, 471, 57, 1, 0, 0, 0, 472, 473, 5, 19, 0, 0, 473, 474, 3, 60, 30, 0, 474, 59, 1, 0, 0, 0, 475, 478, 3, 62, 31, 0, 476, 478, 3, 66, 33, 0, 477, 475, 1, 0, 0, 0, 477, 476, 1, 0, 0, 0, 478, 61, 1, 0, 0, 0, 479, 480, 5, 20, 0, 0, 480, 481, 3, 108, 54, 0, 481, 482, 5, 36, 0, 0, 482, 483, 3, 110, 55, 0, 483, 484, 5, 29, 0, 0, 484, 485, 3, 108, 54, 0, 485, 486, 5, 84, 0, 0, 486, 487, 3, 94, 47, 0, 487, 488, 5, 30, 0, 0, 488, 491, 3, 64, 32, 0, 489, 490, 5, 31, 0, 0, 490, 492, 3, 100, 50, 0, 491, 489, 1, 0, 0, 0, 491, 492, 1, 0, 0, 0, 492, 493, 1, 0, 0, 0, 493, 494, 5, 85, 0, 0, 494, 63, 1, 0, 0, 0, 495, 502, 5, 58, 0, 0, 496, 497, 5, 59, 0, 0, 497, 498, 5, 92, 0, 0, 498, 499, 3, 94, 47, 0, 499, 500, 5, 93, 0, 0, 500, 502, 1, 0, 0, 0, 501, 495, 1, 0, 0, 0, 501, 496, 1, 0, 0, 0, 502, 65, 1, 0, 0, 0, 503, 504, 5, 21, 0, 0, 504, 505, 3, 108, 54, 0, 505, 506, 5, 36, 0, 0, 506, 507, 3, 110, 55, 0, 507, 508, 5, 88, 0, 0, 508, 509, 3, 68, 34, 0, 509, 510, 3, 68, 34, 0, 510, 511, 5, 89, 0, 0, 511, 67, 1, 0, 0, 0, 512, 513, 3, 30, 15, 0, 513, 514, 5, 22, 0, 0, 514, 515, 3, 108, 54, 0, 515, 516, 5, 36, 0, 0, 516, 517, 3, 110, 55, 0, 517, 519, 3, 98, 49, 0, 518, 520, 5, 64, 0, 0, 519, 518, 1, 0, 0, 0, 519, 520, 1, 0, 0, 0, 520, 521, 1, 0, 0, 0, 521, 522, 5, 85, 0, 0, 522, 69, 1, 0, 0, 0, 523, 524, 5, 14, 0, 0, 524, 525, 3, 108, 54, 0, 525, 526, 5, 15, 0, 0, 526, 527, 3, 108, 54, 0, 527, 531, 5, 88, 0, 0, 528, 530, 3, 72, 36, 0, 529, 528, 1, 0, 0, 0, 530, 533, 1, 0, 0, 0, 531, 529, 1, 0, 0, 0, 531, 532, 1, 0, 0, 0, 532, 534, 1, 0, 0, 0, 533, 531, 1, 0, 0, 0, 534, 535, 5, 89, 0, 0, 535, 71, 1, 0, 0, 0, 536, 537, 5, 18, 0, 0, 537, 541, 3, 60, 30, 0, 538, 541, 3, 76, 38, 0, 539, 541, 3, 74, 37, 0, 540, 536, 1, 0, 0, 0, 540, 538, 1, 0, 0, 0, 540, 539, 1, 0, 0, 0, 541, 73, 1, 0, 0, 0, 542, 543, 5, 26, 0, 0, 543, 544, 3, 108, 54, 0, 544, 545, 5, 27, 0, 0, 545, 546, 5, 28, 0, 0, 546, 547, 5, 24, 0, 0, 547, 548, 5, 12, 0, 0, 548, 549, 3, 108, 54, 0, 549, 550, 5, 25, 0, 0, 550, 551, 5, 21, 0, 0, 551, 552, 3, 108, 54, 0, 552, 553, 5, 87, 0, 0, 553, 554, 3, 108, 54, 0, 554, 555, 5, 85, 0, 0, 555, 75, 1, 0, 0, 0, 556, 557, 5, 16, 0, 0, 557, 558, 3, 78, 39, 0, 558, 559, 5, 17, 0, 0, 559, 560, 3, 82, 41, 0, 560, 561, 5, 85, 0, 0, 561, 77, 1, 0, 0, 0, 562, 563, 3, 108, 54, 0, 563, 564, 5, 87, 0, 0, 564, 565, 3, 80, 40, 0, 565, 79, 1, 0, 0, 0, 566, 578, 3, 108, 54, 0, 567, 578, 5, 53, 0, 0, 568, 578, 5, 43, 0, 0, 569, 578, 5, 44, 0, 0, 570, 578, 5, 50, 0, 0, 571, 578, 5, 51, 0, 0, 572, 578, 5, 52, 0, 0, 573, 578, 5, 54, 0, 0, 574, 578, 5, 55, 0, 0, 575, 578, 5, 56, 0, 0, 576, 578, 5, 57, 0, 0, 577, 566, 1, 0, 0, 0, 577, 567, 1, 0, 0, 0, 577, 568, 1, 0, 0, 0, 577, 569, 1, 0, 0, 0, 577, 570, 1, 0, 0, 0, 577, 571, 1, 0, 0, 0, 577, 572, 1, 0, 0, 0, 577, 573, 1, 0, 0, 0, 577, 574, 1, 0, 0, 0, 577, 575, 1, 0, 0, 0, 577, 576, 1, 0, 0, 0, 578, 81, 1, 0, 0, 0, 579, 580, 5, 20, 0, 0, 580, 581, 3, 108, 54, 0, 581, 582, 5, 87, 0, 0, 582, 583, 3, 84, 42, 0, 583, 599, 1, 0, 0, 0, 584, 585, 5, 21, 0, 0, 585, 586, 3, 108, 54, 0, 586, 587, 5, 87, 0, 0, 587, 588, 3, 108, 54, 0, 588, 589, 5, 87, 0, 0, 589, 590, 3, 86, 43, 0, 590, 599, 1, 0, 0, 0, 591, 592, 5, 7, 0, 0, 592, 593, 3, 108, 54, 0, 593, 594, 5, 87, 0, 0, 594, 596, 3, 108, 54, 0, 595, 597, 3, 88, 44, 0, 596, 595, 1, 0, 0, 0, 596, 597, 1, 0, 0, 0, 597, 599, 1, 0, 0, 0, 598, 579, 1, 0, 0, 0, 598, 584, 1, 0, 0, 0, 598, 591, 1, 0, 0, 0, 599, 83, 1, 0, 0, 0, 600, 601, 7, 2, 0, 0, 601, 85, 1, 0, 0, 0, 602, 603, 7, 3, 0, 0, 603, 87, 1, 0, 0, 0, 604, 605, 5, 23, 0, 0, 605, 609, 5, 88, 0, 0, 606, 608, 3, 90, 45, 0, 607, 606, 1, 0, 0, 0, 608, 611, 1, 0, 0, 0, 609, 607, 1, 0, 0, 0, 609, 610, 1, 0, 0, 0, 610, 612, 1, 0, 0, 0, 611, 609, 1, 0, 0, 0, 612, 613, 5, 89, 0, 0, 613, 89, 1, 0, 0, 0, 614, 615, 3, 108, 54, 0, 615, 616, 5, 17, 0, 0, 616, 617, 5, 20, 0, 0, 617, 624, 3, 108, 54, 0, 618, 619, 5, 25, 0, 0, 619, 620, 5, 21, 0, 0, 620, 621, 3, 108, 54, 0, 621, 622, 5, 87, 0, 0, 622, 623, 3, 108, 54, 0, 623, 625, 1, 0, 0, 0, 624, 618, 1, 0, 0, 0, 624, 625, 1, 0, 0, 0, 625, 626, 1, 0, 0, 0, 626, 627, 5, 85, 0, 0, 627, 665, 1, 0, 0, 0, 628, 629, 3, 108, 54, 0, 629, 630, 5, 17, 0, 0, 630, 631, 5, 21, 0, 0, 631, 632, 3, 108, 54, 0, 632, 633, 5, 87, 0, 0, 633, 640, 3, 108, 54, 0, 634, 635, 5, 25, 0, 0, 635, 636, 5, 21, 0, 0, 636, 637, 3, 108, 54, 0, 637, 638, 5, 87, 0, 0, 638, 639, 3, 108, 54, 0, 639, 641, 1, 0, 0, 0, 640, 634, 1, 0, 0, 0, 640, 641, 1, 0, 0, 0, 641, 642, 1, 0, 0, 0, 642, 643, 5, 85, 0, 0, 643, 665, 1, 0, 0, 0, 644, 645, 3, 108, 54, 0, 645, 646, 5, 17, 0, 0, 646, 647, 5, 5, 0, 0, 647, 654, 3, 108, 54, 0, 648, 649, 5, 25, 0, 0, 649, 650, 5, 21, 0, 0, 650, 651, 3, 108, 54, 0, 651, 652, 5, 87, 0, 0, 652, 653, 3, 108, 54, 0, 653, 655, 1, 0, 0, 0, 654, 648, 1, 0, 0, 0, 654, 655, 1, 0, 0, 0, 655, 656, 1, 0, 0, 0, 656, 657, 5, 85, 0, 0, 657, 665, 1, 0, 0, 0, 658, 659, 3, 108, 54, 0, 659, 660, 5, 17, 0, 0, 660, 661, 5, 12, 0, 0, 661, 662, 3, 108, 54, 0, 662, 663, 5, 85, 0, 0, 663, 665, 1, 0, 0, 0, 664, 614, 1, 0, 0, 0, 664, 628, 1, 0, 0, 0, 664, 644, 1, 0, 0, 0, 664, 658, 1, 0, 0, 0, 665, 91, 1, 0, 0, 0, 666, 667, 5, 12, 0, 0, 667, 668, 3, 108, 54, 0, 668, 669, 5, 17, 0, 0, 669, 670, 3, 108, 54, 0, 670, 671, 5, 87, 0, 0, 671, 673, 3, 108, 54, 0, 672, 674, 3, 88, 44, 0, 673, 672, 1, 0, 0, 0, 673, 674, 1, 0, 0, 0, 674, 675, 1, 0, 0, 0, 675, 676, 5, 85, 0, 0, 676, 93, 1, 0, 0, 0, 677, 703, 3, 96, 48, 0, 678, 703, 5, 65, 0, 0, 679, 703, 5, 66, 0, 0, 680, 681, 5, 67, 0, 0, 681, 703, 3, 110, 55, 0, 682, 683, 5, 68, 0, 0, 683, 684, 5, 94, 0, 0, 684, 685, 3, 108, 54, 0, 685, 686, 5, 95, 0, 0, 686, 703, 1, 0, 0, 0, 687, 688, 5, 69, 0, 0, 688, 689, 5, 94, 0, 0, 689, 690, 3, 108, 54, 0, 690, 691, 5, 95, 0, 0, 691, 703, 1, 0, 0, 0, 692, 693, 5, 70, 0, 0, 693, 694, 5, 94, 0, 0, 694, 695, 3, 94, 47, 0, 695, 696, 5, 95, 0, 0, 696, 703, 1, 0, 0, 0, 697, 698, 5, 71, 0, 0, 698, 699, 5, 94, 0, 0, 699, 700, 3, 94, 47, 0, 700, 701, 5, 95, 0, 0, 701, 703, 1, 0, 0, 0, 702, 677, 1, 0, 0, 0, 702, 678, 1, 0, 0, 0, 702, 679, 1, 0, 0, 0, 702, 680, 1, 0, 0, 0, 702, 682, 1, 0, 0, 0, 702, 687, 1, 0, 0, 0, 702, 692, 1, 0, 0, 0, 702, 697, 1, 0, 0, 0, 703, 95, 1, 0, 0, 0, 704, 705, 7, 4, 0, 0, 705, 97, 1, 0, 0, 0, 706, 707, 7, 5, 0, 0, 707, 99, 1, 0, 0, 0, 708, 717, 3, 110, 55, 0, 709, 717, 5, 96, 0, 0, 710, 717, 5, 97, 0, 0, 711, 717, 5, 80, 0, 0, 712, 717, 5, 81, 0, 0, 713, 717, 5, 82, 0, 0, 714, 717, 3, 102, 51, 0, 715, 717, 3, 106, 53, 0, 716, 708, 1, 0, 0, 0, 716, 709, 1, 0, 0, 0, 716, 710, 1, 0, 0, 0, 716, 711, 1, 0, 0, 0, 716, 712, 1, 0, 0, 0, 716, 713, 1, 0, 0, 0, 716, 714, 1, 0, 0, 0, 716, 715, 1, 0, 0, 0, 717, 101, 1, 0, 0, 0, 718, 727, 5, 88, 0, 0, 719, 724, 3, 104, 52, 0, 720, 721, 5, 86, 0, 0, 721, 723, 3, 104, 52, 0, 722, 720, 1, 0, 0, 0, 723, 726, 1, 0, 0, 0, 724, 722, 1, 0, 0, 0, 724, 725, 1, 0, 0, 0, 725, 728, 1, 0, 0, 0, 726, 724, 1, 0, 0, 0, 727, 719, 1, 0, 0, 0, 727, 728, 1, 0, 0, 0, 728, 729, 1, 0, 0, 0, 729, 730, 5, 89, 0, 0, 730, 103, 1, 0, 0, 0, 731, 732, 3, 110, 55, 0, 732, 733, 5, 84, 0, 0, 733, 734, 3, 100, 50, 0, 734, 105, 1, 0, 0, 0, 735, 744, 5, 90, 0, 0, 736, 741, 3, 100, 50, 0, 737, 738, 5, 86, 0, 0, 738, 740, 3, 100, 50, 0, 739, 737, 1, 0, 0, 0, 740, 743, 1, 0, 0, 0, 741, 739, 1, 0, 0, 0, 741, 742, 1, 0, 0, 0, 742, 745, 1, 0, 0, 0, 743, 741, 1, 0, 0, 0, 744, 736, 1, 0, 0, 0, 744, 745, 1, 0, 0, 0, 745, 746, 1, 0, 0, 0, 746, 747, 5, 91, 0, 0, 747, 107, 1, 0, 0, 0, 748, 749, 7, 6, 0, 0, 749, 109, 1, 0, 0, 0, 750, 751, 5, 99, 0, 0, 751, 111, 1, 0, 0, 0, 49, 121, 135, 145, 157, 176, 184, 191, 204, 212, 239, 263, 273, 279, 308, 314, 319, 332, 340, 353, 358, 371, 384, 399, 402, 409, 417, 457, 465, 477, 491, 501, 519, 531, 540, 577, 596, 598, 609, 624, 640, 654, 664, 673, 702, 716, 724, 727, 741, 744] \ No newline at end of file +[4, 1, 104, 779, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 129, 8, 0, 1, 1, 1, 1, 1, 1, 5, 1, 134, 8, 1, 10, 1, 12, 1, 137, 9, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 5, 3, 155, 8, 3, 10, 3, 12, 3, 158, 9, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 3, 4, 168, 8, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 180, 8, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 3, 8, 199, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 207, 8, 9, 1, 9, 1, 9, 1, 10, 5, 10, 212, 8, 10, 10, 10, 12, 10, 215, 9, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 5, 10, 225, 8, 10, 10, 10, 12, 10, 228, 9, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 3, 11, 235, 8, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 5, 13, 260, 8, 13, 10, 13, 12, 13, 263, 9, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 3, 14, 286, 8, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 296, 8, 15, 1, 15, 1, 15, 5, 15, 300, 8, 15, 10, 15, 12, 15, 303, 9, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 3, 16, 331, 8, 16, 1, 17, 1, 17, 1, 17, 1, 17, 3, 17, 337, 8, 17, 1, 18, 5, 18, 340, 8, 18, 10, 18, 12, 18, 343, 9, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 5, 18, 353, 8, 18, 10, 18, 12, 18, 356, 9, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 3, 19, 363, 8, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 376, 8, 20, 1, 20, 1, 20, 1, 20, 3, 20, 381, 8, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 394, 8, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 3, 22, 407, 8, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 3, 25, 422, 8, 25, 1, 25, 3, 25, 425, 8, 25, 1, 26, 1, 26, 1, 26, 5, 26, 430, 8, 26, 10, 26, 12, 26, 433, 9, 26, 1, 27, 1, 27, 1, 27, 5, 27, 438, 8, 27, 10, 27, 12, 27, 441, 9, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 3, 28, 480, 8, 28, 1, 28, 1, 28, 3, 28, 484, 8, 28, 1, 29, 1, 29, 1, 29, 1, 29, 5, 29, 490, 8, 29, 10, 29, 12, 29, 493, 9, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 3, 32, 504, 8, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 3, 33, 518, 8, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 3, 34, 528, 8, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 3, 36, 546, 8, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 5, 37, 556, 8, 37, 10, 37, 12, 37, 559, 9, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 3, 38, 567, 8, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 3, 42, 604, 8, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 3, 43, 623, 8, 43, 3, 43, 625, 8, 43, 1, 44, 1, 44, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 5, 46, 634, 8, 46, 10, 46, 12, 46, 637, 9, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 3, 47, 651, 8, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 3, 47, 667, 8, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 3, 47, 681, 8, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 3, 47, 691, 8, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 3, 48, 700, 8, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 3, 49, 729, 8, 49, 1, 50, 1, 50, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 3, 52, 743, 8, 52, 1, 53, 1, 53, 1, 53, 1, 53, 5, 53, 749, 8, 53, 10, 53, 12, 53, 752, 9, 53, 3, 53, 754, 8, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 5, 55, 766, 8, 55, 10, 55, 12, 55, 769, 9, 55, 3, 55, 771, 8, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 0, 0, 58, 0, 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, 0, 7, 1, 0, 55, 59, 2, 0, 50, 54, 56, 57, 2, 0, 50, 51, 56, 57, 2, 0, 52, 54, 56, 57, 1, 0, 74, 81, 1, 0, 62, 65, 2, 0, 34, 34, 100, 100, 811, 0, 128, 1, 0, 0, 0, 2, 130, 1, 0, 0, 0, 4, 140, 1, 0, 0, 0, 6, 144, 1, 0, 0, 0, 8, 167, 1, 0, 0, 0, 10, 179, 1, 0, 0, 0, 12, 181, 1, 0, 0, 0, 14, 188, 1, 0, 0, 0, 16, 198, 1, 0, 0, 0, 18, 200, 1, 0, 0, 0, 20, 213, 1, 0, 0, 0, 22, 234, 1, 0, 0, 0, 24, 236, 1, 0, 0, 0, 26, 251, 1, 0, 0, 0, 28, 285, 1, 0, 0, 0, 30, 287, 1, 0, 0, 0, 32, 330, 1, 0, 0, 0, 34, 336, 1, 0, 0, 0, 36, 341, 1, 0, 0, 0, 38, 362, 1, 0, 0, 0, 40, 364, 1, 0, 0, 0, 42, 384, 1, 0, 0, 0, 44, 397, 1, 0, 0, 0, 46, 410, 1, 0, 0, 0, 48, 413, 1, 0, 0, 0, 50, 424, 1, 0, 0, 0, 52, 426, 1, 0, 0, 0, 54, 434, 1, 0, 0, 0, 56, 483, 1, 0, 0, 0, 58, 485, 1, 0, 0, 0, 60, 496, 1, 0, 0, 0, 62, 498, 1, 0, 0, 0, 64, 503, 1, 0, 0, 0, 66, 505, 1, 0, 0, 0, 68, 527, 1, 0, 0, 0, 70, 529, 1, 0, 0, 0, 72, 538, 1, 0, 0, 0, 74, 549, 1, 0, 0, 0, 76, 566, 1, 0, 0, 0, 78, 568, 1, 0, 0, 0, 80, 582, 1, 0, 0, 0, 82, 588, 1, 0, 0, 0, 84, 603, 1, 0, 0, 0, 86, 624, 1, 0, 0, 0, 88, 626, 1, 0, 0, 0, 90, 628, 1, 0, 0, 0, 92, 630, 1, 0, 0, 0, 94, 690, 1, 0, 0, 0, 96, 692, 1, 0, 0, 0, 98, 728, 1, 0, 0, 0, 100, 730, 1, 0, 0, 0, 102, 732, 1, 0, 0, 0, 104, 742, 1, 0, 0, 0, 106, 744, 1, 0, 0, 0, 108, 757, 1, 0, 0, 0, 110, 761, 1, 0, 0, 0, 112, 774, 1, 0, 0, 0, 114, 776, 1, 0, 0, 0, 116, 117, 3, 6, 3, 0, 117, 118, 5, 0, 0, 1, 118, 129, 1, 0, 0, 0, 119, 120, 3, 20, 10, 0, 120, 121, 5, 0, 0, 1, 121, 129, 1, 0, 0, 0, 122, 123, 3, 36, 18, 0, 123, 124, 5, 0, 0, 1, 124, 129, 1, 0, 0, 0, 125, 126, 3, 2, 1, 0, 126, 127, 5, 0, 0, 1, 127, 129, 1, 0, 0, 0, 128, 116, 1, 0, 0, 0, 128, 119, 1, 0, 0, 0, 128, 122, 1, 0, 0, 0, 128, 125, 1, 0, 0, 0, 129, 1, 1, 0, 0, 0, 130, 131, 5, 2, 0, 0, 131, 135, 5, 90, 0, 0, 132, 134, 3, 8, 4, 0, 133, 132, 1, 0, 0, 0, 134, 137, 1, 0, 0, 0, 135, 133, 1, 0, 0, 0, 135, 136, 1, 0, 0, 0, 136, 138, 1, 0, 0, 0, 137, 135, 1, 0, 0, 0, 138, 139, 5, 91, 0, 0, 139, 3, 1, 0, 0, 0, 140, 141, 5, 3, 0, 0, 141, 142, 3, 114, 57, 0, 142, 143, 5, 87, 0, 0, 143, 5, 1, 0, 0, 0, 144, 145, 5, 1, 0, 0, 145, 146, 3, 112, 56, 0, 146, 147, 5, 38, 0, 0, 147, 148, 3, 114, 57, 0, 148, 149, 5, 37, 0, 0, 149, 150, 3, 114, 57, 0, 150, 151, 5, 36, 0, 0, 151, 152, 3, 114, 57, 0, 152, 156, 5, 90, 0, 0, 153, 155, 3, 8, 4, 0, 154, 153, 1, 0, 0, 0, 155, 158, 1, 0, 0, 0, 156, 154, 1, 0, 0, 0, 156, 157, 1, 0, 0, 0, 157, 159, 1, 0, 0, 0, 158, 156, 1, 0, 0, 0, 159, 160, 5, 91, 0, 0, 160, 7, 1, 0, 0, 0, 161, 168, 3, 4, 2, 0, 162, 168, 3, 18, 9, 0, 163, 168, 3, 10, 5, 0, 164, 168, 3, 62, 31, 0, 165, 168, 3, 74, 37, 0, 166, 168, 3, 96, 48, 0, 167, 161, 1, 0, 0, 0, 167, 162, 1, 0, 0, 0, 167, 163, 1, 0, 0, 0, 167, 164, 1, 0, 0, 0, 167, 165, 1, 0, 0, 0, 167, 166, 1, 0, 0, 0, 168, 9, 1, 0, 0, 0, 169, 170, 5, 3, 0, 0, 170, 171, 5, 6, 0, 0, 171, 172, 3, 112, 56, 0, 172, 173, 5, 87, 0, 0, 173, 180, 1, 0, 0, 0, 174, 175, 5, 3, 0, 0, 175, 176, 5, 8, 0, 0, 176, 177, 3, 112, 56, 0, 177, 178, 5, 87, 0, 0, 178, 180, 1, 0, 0, 0, 179, 169, 1, 0, 0, 0, 179, 174, 1, 0, 0, 0, 180, 11, 1, 0, 0, 0, 181, 182, 5, 4, 0, 0, 182, 183, 5, 5, 0, 0, 183, 184, 3, 112, 56, 0, 184, 185, 5, 38, 0, 0, 185, 186, 3, 114, 57, 0, 186, 187, 5, 87, 0, 0, 187, 13, 1, 0, 0, 0, 188, 189, 5, 4, 0, 0, 189, 190, 5, 6, 0, 0, 190, 191, 3, 112, 56, 0, 191, 192, 5, 37, 0, 0, 192, 193, 3, 114, 57, 0, 193, 194, 5, 87, 0, 0, 194, 15, 1, 0, 0, 0, 195, 199, 3, 10, 5, 0, 196, 199, 3, 12, 6, 0, 197, 199, 3, 14, 7, 0, 198, 195, 1, 0, 0, 0, 198, 196, 1, 0, 0, 0, 198, 197, 1, 0, 0, 0, 199, 17, 1, 0, 0, 0, 200, 201, 5, 5, 0, 0, 201, 202, 3, 112, 56, 0, 202, 203, 5, 38, 0, 0, 203, 206, 3, 114, 57, 0, 204, 205, 5, 39, 0, 0, 205, 207, 3, 114, 57, 0, 206, 204, 1, 0, 0, 0, 206, 207, 1, 0, 0, 0, 207, 208, 1, 0, 0, 0, 208, 209, 5, 87, 0, 0, 209, 19, 1, 0, 0, 0, 210, 212, 3, 16, 8, 0, 211, 210, 1, 0, 0, 0, 212, 215, 1, 0, 0, 0, 213, 211, 1, 0, 0, 0, 213, 214, 1, 0, 0, 0, 214, 216, 1, 0, 0, 0, 215, 213, 1, 0, 0, 0, 216, 217, 5, 6, 0, 0, 217, 218, 3, 112, 56, 0, 218, 219, 5, 38, 0, 0, 219, 220, 3, 114, 57, 0, 220, 221, 5, 37, 0, 0, 221, 222, 3, 114, 57, 0, 222, 226, 5, 90, 0, 0, 223, 225, 3, 22, 11, 0, 224, 223, 1, 0, 0, 0, 225, 228, 1, 0, 0, 0, 226, 224, 1, 0, 0, 0, 226, 227, 1, 0, 0, 0, 227, 229, 1, 0, 0, 0, 228, 226, 1, 0, 0, 0, 229, 230, 5, 91, 0, 0, 230, 21, 1, 0, 0, 0, 231, 235, 3, 26, 13, 0, 232, 235, 3, 30, 15, 0, 233, 235, 3, 24, 12, 0, 234, 231, 1, 0, 0, 0, 234, 232, 1, 0, 0, 0, 234, 233, 1, 0, 0, 0, 235, 23, 1, 0, 0, 0, 236, 237, 5, 11, 0, 0, 237, 238, 3, 112, 56, 0, 238, 239, 5, 38, 0, 0, 239, 240, 3, 114, 57, 0, 240, 241, 5, 86, 0, 0, 241, 242, 3, 98, 49, 0, 242, 243, 5, 85, 0, 0, 243, 244, 3, 98, 49, 0, 244, 245, 5, 90, 0, 0, 245, 246, 5, 55, 0, 0, 246, 247, 5, 38, 0, 0, 247, 248, 3, 114, 57, 0, 248, 249, 5, 87, 0, 0, 249, 250, 5, 91, 0, 0, 250, 25, 1, 0, 0, 0, 251, 252, 5, 9, 0, 0, 252, 253, 3, 112, 56, 0, 253, 254, 5, 38, 0, 0, 254, 255, 3, 114, 57, 0, 255, 256, 5, 86, 0, 0, 256, 257, 3, 98, 49, 0, 257, 261, 5, 90, 0, 0, 258, 260, 3, 28, 14, 0, 259, 258, 1, 0, 0, 0, 260, 263, 1, 0, 0, 0, 261, 259, 1, 0, 0, 0, 261, 262, 1, 0, 0, 0, 262, 264, 1, 0, 0, 0, 263, 261, 1, 0, 0, 0, 264, 265, 5, 91, 0, 0, 265, 27, 1, 0, 0, 0, 266, 267, 5, 45, 0, 0, 267, 268, 5, 38, 0, 0, 268, 269, 3, 114, 57, 0, 269, 270, 5, 87, 0, 0, 270, 286, 1, 0, 0, 0, 271, 272, 5, 46, 0, 0, 272, 273, 5, 38, 0, 0, 273, 274, 3, 114, 57, 0, 274, 275, 5, 87, 0, 0, 275, 286, 1, 0, 0, 0, 276, 277, 5, 47, 0, 0, 277, 278, 5, 48, 0, 0, 278, 279, 5, 38, 0, 0, 279, 280, 3, 114, 57, 0, 280, 281, 5, 49, 0, 0, 281, 282, 5, 38, 0, 0, 282, 283, 3, 114, 57, 0, 283, 284, 5, 87, 0, 0, 284, 286, 1, 0, 0, 0, 285, 266, 1, 0, 0, 0, 285, 271, 1, 0, 0, 0, 285, 276, 1, 0, 0, 0, 286, 29, 1, 0, 0, 0, 287, 288, 5, 10, 0, 0, 288, 289, 3, 112, 56, 0, 289, 290, 5, 38, 0, 0, 290, 291, 3, 114, 57, 0, 291, 292, 5, 86, 0, 0, 292, 293, 3, 102, 51, 0, 293, 295, 3, 34, 17, 0, 294, 296, 5, 66, 0, 0, 295, 294, 1, 0, 0, 0, 295, 296, 1, 0, 0, 0, 296, 297, 1, 0, 0, 0, 297, 301, 5, 90, 0, 0, 298, 300, 3, 32, 16, 0, 299, 298, 1, 0, 0, 0, 300, 303, 1, 0, 0, 0, 301, 299, 1, 0, 0, 0, 301, 302, 1, 0, 0, 0, 302, 304, 1, 0, 0, 0, 303, 301, 1, 0, 0, 0, 304, 305, 5, 91, 0, 0, 305, 31, 1, 0, 0, 0, 306, 307, 5, 52, 0, 0, 307, 308, 5, 38, 0, 0, 308, 309, 3, 114, 57, 0, 309, 310, 5, 87, 0, 0, 310, 331, 1, 0, 0, 0, 311, 312, 5, 53, 0, 0, 312, 313, 5, 38, 0, 0, 313, 314, 3, 114, 57, 0, 314, 315, 5, 87, 0, 0, 315, 331, 1, 0, 0, 0, 316, 317, 5, 54, 0, 0, 317, 318, 5, 38, 0, 0, 318, 319, 3, 114, 57, 0, 319, 320, 5, 87, 0, 0, 320, 331, 1, 0, 0, 0, 321, 322, 5, 47, 0, 0, 322, 323, 5, 48, 0, 0, 323, 324, 5, 38, 0, 0, 324, 325, 3, 114, 57, 0, 325, 326, 5, 49, 0, 0, 326, 327, 5, 38, 0, 0, 327, 328, 3, 114, 57, 0, 328, 329, 5, 87, 0, 0, 329, 331, 1, 0, 0, 0, 330, 306, 1, 0, 0, 0, 330, 311, 1, 0, 0, 0, 330, 316, 1, 0, 0, 0, 330, 321, 1, 0, 0, 0, 331, 33, 1, 0, 0, 0, 332, 333, 5, 5, 0, 0, 333, 337, 3, 112, 56, 0, 334, 335, 5, 6, 0, 0, 335, 337, 3, 112, 56, 0, 336, 332, 1, 0, 0, 0, 336, 334, 1, 0, 0, 0, 337, 35, 1, 0, 0, 0, 338, 340, 3, 16, 8, 0, 339, 338, 1, 0, 0, 0, 340, 343, 1, 0, 0, 0, 341, 339, 1, 0, 0, 0, 341, 342, 1, 0, 0, 0, 342, 344, 1, 0, 0, 0, 343, 341, 1, 0, 0, 0, 344, 345, 5, 8, 0, 0, 345, 346, 3, 112, 56, 0, 346, 347, 5, 38, 0, 0, 347, 348, 3, 114, 57, 0, 348, 349, 5, 37, 0, 0, 349, 350, 3, 114, 57, 0, 350, 354, 5, 90, 0, 0, 351, 353, 3, 38, 19, 0, 352, 351, 1, 0, 0, 0, 353, 356, 1, 0, 0, 0, 354, 352, 1, 0, 0, 0, 354, 355, 1, 0, 0, 0, 355, 357, 1, 0, 0, 0, 356, 354, 1, 0, 0, 0, 357, 358, 5, 91, 0, 0, 358, 37, 1, 0, 0, 0, 359, 363, 3, 40, 20, 0, 360, 363, 3, 42, 21, 0, 361, 363, 3, 44, 22, 0, 362, 359, 1, 0, 0, 0, 362, 360, 1, 0, 0, 0, 362, 361, 1, 0, 0, 0, 363, 39, 1, 0, 0, 0, 364, 365, 5, 11, 0, 0, 365, 366, 3, 112, 56, 0, 366, 367, 5, 38, 0, 0, 367, 368, 3, 114, 57, 0, 368, 369, 5, 86, 0, 0, 369, 370, 3, 98, 49, 0, 370, 371, 5, 85, 0, 0, 371, 372, 3, 98, 49, 0, 372, 373, 5, 40, 0, 0, 373, 375, 3, 48, 24, 0, 374, 376, 3, 46, 23, 0, 375, 374, 1, 0, 0, 0, 375, 376, 1, 0, 0, 0, 376, 377, 1, 0, 0, 0, 377, 378, 5, 42, 0, 0, 378, 380, 3, 50, 25, 0, 379, 381, 3, 54, 27, 0, 380, 379, 1, 0, 0, 0, 380, 381, 1, 0, 0, 0, 381, 382, 1, 0, 0, 0, 382, 383, 5, 87, 0, 0, 383, 41, 1, 0, 0, 0, 384, 385, 5, 12, 0, 0, 385, 386, 3, 112, 56, 0, 386, 387, 5, 38, 0, 0, 387, 388, 3, 114, 57, 0, 388, 389, 5, 86, 0, 0, 389, 390, 3, 98, 49, 0, 390, 391, 5, 85, 0, 0, 391, 393, 3, 98, 49, 0, 392, 394, 3, 54, 27, 0, 393, 392, 1, 0, 0, 0, 393, 394, 1, 0, 0, 0, 394, 395, 1, 0, 0, 0, 395, 396, 5, 87, 0, 0, 396, 43, 1, 0, 0, 0, 397, 398, 5, 13, 0, 0, 398, 399, 3, 112, 56, 0, 399, 400, 5, 38, 0, 0, 400, 401, 3, 114, 57, 0, 401, 402, 5, 14, 0, 0, 402, 403, 3, 112, 56, 0, 403, 404, 5, 86, 0, 0, 404, 406, 3, 98, 49, 0, 405, 407, 3, 54, 27, 0, 406, 405, 1, 0, 0, 0, 406, 407, 1, 0, 0, 0, 407, 408, 1, 0, 0, 0, 408, 409, 5, 87, 0, 0, 409, 45, 1, 0, 0, 0, 410, 411, 5, 41, 0, 0, 411, 412, 3, 98, 49, 0, 412, 47, 1, 0, 0, 0, 413, 414, 7, 0, 0, 0, 414, 49, 1, 0, 0, 0, 415, 425, 5, 44, 0, 0, 416, 417, 5, 5, 0, 0, 417, 425, 3, 112, 56, 0, 418, 419, 5, 7, 0, 0, 419, 421, 5, 92, 0, 0, 420, 422, 3, 52, 26, 0, 421, 420, 1, 0, 0, 0, 421, 422, 1, 0, 0, 0, 422, 423, 1, 0, 0, 0, 423, 425, 5, 93, 0, 0, 424, 415, 1, 0, 0, 0, 424, 416, 1, 0, 0, 0, 424, 418, 1, 0, 0, 0, 425, 51, 1, 0, 0, 0, 426, 431, 3, 112, 56, 0, 427, 428, 5, 88, 0, 0, 428, 430, 3, 112, 56, 0, 429, 427, 1, 0, 0, 0, 430, 433, 1, 0, 0, 0, 431, 429, 1, 0, 0, 0, 431, 432, 1, 0, 0, 0, 432, 53, 1, 0, 0, 0, 433, 431, 1, 0, 0, 0, 434, 435, 5, 43, 0, 0, 435, 439, 5, 90, 0, 0, 436, 438, 3, 56, 28, 0, 437, 436, 1, 0, 0, 0, 438, 441, 1, 0, 0, 0, 439, 437, 1, 0, 0, 0, 439, 440, 1, 0, 0, 0, 440, 442, 1, 0, 0, 0, 441, 439, 1, 0, 0, 0, 442, 443, 5, 91, 0, 0, 443, 55, 1, 0, 0, 0, 444, 445, 5, 22, 0, 0, 445, 446, 3, 112, 56, 0, 446, 447, 5, 38, 0, 0, 447, 448, 3, 114, 57, 0, 448, 449, 5, 86, 0, 0, 449, 450, 3, 98, 49, 0, 450, 451, 3, 58, 29, 0, 451, 452, 5, 87, 0, 0, 452, 484, 1, 0, 0, 0, 453, 454, 5, 23, 0, 0, 454, 455, 3, 112, 56, 0, 455, 456, 5, 38, 0, 0, 456, 457, 3, 114, 57, 0, 457, 458, 5, 86, 0, 0, 458, 459, 3, 102, 51, 0, 459, 460, 3, 34, 17, 0, 460, 461, 3, 58, 29, 0, 461, 462, 5, 87, 0, 0, 462, 484, 1, 0, 0, 0, 463, 464, 5, 6, 0, 0, 464, 465, 3, 112, 56, 0, 465, 466, 5, 38, 0, 0, 466, 467, 3, 114, 57, 0, 467, 468, 5, 86, 0, 0, 468, 469, 3, 112, 56, 0, 469, 470, 5, 87, 0, 0, 470, 484, 1, 0, 0, 0, 471, 472, 5, 13, 0, 0, 472, 473, 3, 112, 56, 0, 473, 474, 5, 38, 0, 0, 474, 475, 3, 114, 57, 0, 475, 476, 5, 86, 0, 0, 476, 479, 3, 112, 56, 0, 477, 478, 5, 15, 0, 0, 478, 480, 3, 98, 49, 0, 479, 477, 1, 0, 0, 0, 479, 480, 1, 0, 0, 0, 480, 481, 1, 0, 0, 0, 481, 482, 5, 87, 0, 0, 482, 484, 1, 0, 0, 0, 483, 444, 1, 0, 0, 0, 483, 453, 1, 0, 0, 0, 483, 463, 1, 0, 0, 0, 483, 471, 1, 0, 0, 0, 484, 57, 1, 0, 0, 0, 485, 486, 5, 92, 0, 0, 486, 491, 3, 60, 30, 0, 487, 488, 5, 88, 0, 0, 488, 490, 3, 60, 30, 0, 489, 487, 1, 0, 0, 0, 490, 493, 1, 0, 0, 0, 491, 489, 1, 0, 0, 0, 491, 492, 1, 0, 0, 0, 492, 494, 1, 0, 0, 0, 493, 491, 1, 0, 0, 0, 494, 495, 5, 93, 0, 0, 495, 59, 1, 0, 0, 0, 496, 497, 7, 1, 0, 0, 497, 61, 1, 0, 0, 0, 498, 499, 5, 21, 0, 0, 499, 500, 3, 64, 32, 0, 500, 63, 1, 0, 0, 0, 501, 504, 3, 66, 33, 0, 502, 504, 3, 70, 35, 0, 503, 501, 1, 0, 0, 0, 503, 502, 1, 0, 0, 0, 504, 65, 1, 0, 0, 0, 505, 506, 5, 22, 0, 0, 506, 507, 3, 112, 56, 0, 507, 508, 5, 38, 0, 0, 508, 509, 3, 114, 57, 0, 509, 510, 5, 31, 0, 0, 510, 511, 3, 112, 56, 0, 511, 512, 5, 86, 0, 0, 512, 513, 3, 98, 49, 0, 513, 514, 5, 32, 0, 0, 514, 517, 3, 68, 34, 0, 515, 516, 5, 33, 0, 0, 516, 518, 3, 104, 52, 0, 517, 515, 1, 0, 0, 0, 517, 518, 1, 0, 0, 0, 518, 519, 1, 0, 0, 0, 519, 520, 5, 87, 0, 0, 520, 67, 1, 0, 0, 0, 521, 528, 5, 60, 0, 0, 522, 523, 5, 61, 0, 0, 523, 524, 5, 94, 0, 0, 524, 525, 3, 98, 49, 0, 525, 526, 5, 95, 0, 0, 526, 528, 1, 0, 0, 0, 527, 521, 1, 0, 0, 0, 527, 522, 1, 0, 0, 0, 528, 69, 1, 0, 0, 0, 529, 530, 5, 23, 0, 0, 530, 531, 3, 112, 56, 0, 531, 532, 5, 38, 0, 0, 532, 533, 3, 114, 57, 0, 533, 534, 5, 90, 0, 0, 534, 535, 3, 72, 36, 0, 535, 536, 3, 72, 36, 0, 536, 537, 5, 91, 0, 0, 537, 71, 1, 0, 0, 0, 538, 539, 3, 34, 17, 0, 539, 540, 5, 24, 0, 0, 540, 541, 3, 112, 56, 0, 541, 542, 5, 38, 0, 0, 542, 543, 3, 114, 57, 0, 543, 545, 3, 102, 51, 0, 544, 546, 5, 66, 0, 0, 545, 544, 1, 0, 0, 0, 545, 546, 1, 0, 0, 0, 546, 547, 1, 0, 0, 0, 547, 548, 5, 87, 0, 0, 548, 73, 1, 0, 0, 0, 549, 550, 5, 16, 0, 0, 550, 551, 3, 112, 56, 0, 551, 552, 5, 17, 0, 0, 552, 553, 3, 112, 56, 0, 553, 557, 5, 90, 0, 0, 554, 556, 3, 76, 38, 0, 555, 554, 1, 0, 0, 0, 556, 559, 1, 0, 0, 0, 557, 555, 1, 0, 0, 0, 557, 558, 1, 0, 0, 0, 558, 560, 1, 0, 0, 0, 559, 557, 1, 0, 0, 0, 560, 561, 5, 91, 0, 0, 561, 75, 1, 0, 0, 0, 562, 563, 5, 20, 0, 0, 563, 567, 3, 64, 32, 0, 564, 567, 3, 80, 40, 0, 565, 567, 3, 78, 39, 0, 566, 562, 1, 0, 0, 0, 566, 564, 1, 0, 0, 0, 566, 565, 1, 0, 0, 0, 567, 77, 1, 0, 0, 0, 568, 569, 5, 28, 0, 0, 569, 570, 3, 112, 56, 0, 570, 571, 5, 29, 0, 0, 571, 572, 5, 30, 0, 0, 572, 573, 5, 26, 0, 0, 573, 574, 5, 13, 0, 0, 574, 575, 3, 112, 56, 0, 575, 576, 5, 27, 0, 0, 576, 577, 5, 23, 0, 0, 577, 578, 3, 112, 56, 0, 578, 579, 5, 89, 0, 0, 579, 580, 3, 112, 56, 0, 580, 581, 5, 87, 0, 0, 581, 79, 1, 0, 0, 0, 582, 583, 5, 18, 0, 0, 583, 584, 3, 82, 41, 0, 584, 585, 5, 19, 0, 0, 585, 586, 3, 86, 43, 0, 586, 587, 5, 87, 0, 0, 587, 81, 1, 0, 0, 0, 588, 589, 3, 112, 56, 0, 589, 590, 5, 89, 0, 0, 590, 591, 3, 84, 42, 0, 591, 83, 1, 0, 0, 0, 592, 604, 3, 112, 56, 0, 593, 604, 5, 55, 0, 0, 594, 604, 5, 45, 0, 0, 595, 604, 5, 46, 0, 0, 596, 604, 5, 52, 0, 0, 597, 604, 5, 53, 0, 0, 598, 604, 5, 54, 0, 0, 599, 604, 5, 56, 0, 0, 600, 604, 5, 57, 0, 0, 601, 604, 5, 58, 0, 0, 602, 604, 5, 59, 0, 0, 603, 592, 1, 0, 0, 0, 603, 593, 1, 0, 0, 0, 603, 594, 1, 0, 0, 0, 603, 595, 1, 0, 0, 0, 603, 596, 1, 0, 0, 0, 603, 597, 1, 0, 0, 0, 603, 598, 1, 0, 0, 0, 603, 599, 1, 0, 0, 0, 603, 600, 1, 0, 0, 0, 603, 601, 1, 0, 0, 0, 603, 602, 1, 0, 0, 0, 604, 85, 1, 0, 0, 0, 605, 606, 5, 22, 0, 0, 606, 607, 3, 112, 56, 0, 607, 608, 5, 89, 0, 0, 608, 609, 3, 88, 44, 0, 609, 625, 1, 0, 0, 0, 610, 611, 5, 23, 0, 0, 611, 612, 3, 112, 56, 0, 612, 613, 5, 89, 0, 0, 613, 614, 3, 112, 56, 0, 614, 615, 5, 89, 0, 0, 615, 616, 3, 90, 45, 0, 616, 625, 1, 0, 0, 0, 617, 618, 5, 8, 0, 0, 618, 619, 3, 112, 56, 0, 619, 620, 5, 89, 0, 0, 620, 622, 3, 112, 56, 0, 621, 623, 3, 92, 46, 0, 622, 621, 1, 0, 0, 0, 622, 623, 1, 0, 0, 0, 623, 625, 1, 0, 0, 0, 624, 605, 1, 0, 0, 0, 624, 610, 1, 0, 0, 0, 624, 617, 1, 0, 0, 0, 625, 87, 1, 0, 0, 0, 626, 627, 7, 2, 0, 0, 627, 89, 1, 0, 0, 0, 628, 629, 7, 3, 0, 0, 629, 91, 1, 0, 0, 0, 630, 631, 5, 25, 0, 0, 631, 635, 5, 90, 0, 0, 632, 634, 3, 94, 47, 0, 633, 632, 1, 0, 0, 0, 634, 637, 1, 0, 0, 0, 635, 633, 1, 0, 0, 0, 635, 636, 1, 0, 0, 0, 636, 638, 1, 0, 0, 0, 637, 635, 1, 0, 0, 0, 638, 639, 5, 91, 0, 0, 639, 93, 1, 0, 0, 0, 640, 641, 3, 112, 56, 0, 641, 642, 5, 19, 0, 0, 642, 643, 5, 22, 0, 0, 643, 650, 3, 112, 56, 0, 644, 645, 5, 27, 0, 0, 645, 646, 5, 23, 0, 0, 646, 647, 3, 112, 56, 0, 647, 648, 5, 89, 0, 0, 648, 649, 3, 112, 56, 0, 649, 651, 1, 0, 0, 0, 650, 644, 1, 0, 0, 0, 650, 651, 1, 0, 0, 0, 651, 652, 1, 0, 0, 0, 652, 653, 5, 87, 0, 0, 653, 691, 1, 0, 0, 0, 654, 655, 3, 112, 56, 0, 655, 656, 5, 19, 0, 0, 656, 657, 5, 23, 0, 0, 657, 658, 3, 112, 56, 0, 658, 659, 5, 89, 0, 0, 659, 666, 3, 112, 56, 0, 660, 661, 5, 27, 0, 0, 661, 662, 5, 23, 0, 0, 662, 663, 3, 112, 56, 0, 663, 664, 5, 89, 0, 0, 664, 665, 3, 112, 56, 0, 665, 667, 1, 0, 0, 0, 666, 660, 1, 0, 0, 0, 666, 667, 1, 0, 0, 0, 667, 668, 1, 0, 0, 0, 668, 669, 5, 87, 0, 0, 669, 691, 1, 0, 0, 0, 670, 671, 3, 112, 56, 0, 671, 672, 5, 19, 0, 0, 672, 673, 5, 6, 0, 0, 673, 680, 3, 112, 56, 0, 674, 675, 5, 27, 0, 0, 675, 676, 5, 23, 0, 0, 676, 677, 3, 112, 56, 0, 677, 678, 5, 89, 0, 0, 678, 679, 3, 112, 56, 0, 679, 681, 1, 0, 0, 0, 680, 674, 1, 0, 0, 0, 680, 681, 1, 0, 0, 0, 681, 682, 1, 0, 0, 0, 682, 683, 5, 87, 0, 0, 683, 691, 1, 0, 0, 0, 684, 685, 3, 112, 56, 0, 685, 686, 5, 19, 0, 0, 686, 687, 5, 13, 0, 0, 687, 688, 3, 112, 56, 0, 688, 689, 5, 87, 0, 0, 689, 691, 1, 0, 0, 0, 690, 640, 1, 0, 0, 0, 690, 654, 1, 0, 0, 0, 690, 670, 1, 0, 0, 0, 690, 684, 1, 0, 0, 0, 691, 95, 1, 0, 0, 0, 692, 693, 5, 13, 0, 0, 693, 694, 3, 112, 56, 0, 694, 695, 5, 19, 0, 0, 695, 696, 3, 112, 56, 0, 696, 697, 5, 89, 0, 0, 697, 699, 3, 112, 56, 0, 698, 700, 3, 92, 46, 0, 699, 698, 1, 0, 0, 0, 699, 700, 1, 0, 0, 0, 700, 701, 1, 0, 0, 0, 701, 702, 5, 87, 0, 0, 702, 97, 1, 0, 0, 0, 703, 729, 3, 100, 50, 0, 704, 729, 5, 67, 0, 0, 705, 729, 5, 68, 0, 0, 706, 707, 5, 69, 0, 0, 707, 729, 3, 114, 57, 0, 708, 709, 5, 70, 0, 0, 709, 710, 5, 96, 0, 0, 710, 711, 3, 112, 56, 0, 711, 712, 5, 97, 0, 0, 712, 729, 1, 0, 0, 0, 713, 714, 5, 71, 0, 0, 714, 715, 5, 96, 0, 0, 715, 716, 3, 112, 56, 0, 716, 717, 5, 97, 0, 0, 717, 729, 1, 0, 0, 0, 718, 719, 5, 72, 0, 0, 719, 720, 5, 96, 0, 0, 720, 721, 3, 98, 49, 0, 721, 722, 5, 97, 0, 0, 722, 729, 1, 0, 0, 0, 723, 724, 5, 73, 0, 0, 724, 725, 5, 96, 0, 0, 725, 726, 3, 98, 49, 0, 726, 727, 5, 97, 0, 0, 727, 729, 1, 0, 0, 0, 728, 703, 1, 0, 0, 0, 728, 704, 1, 0, 0, 0, 728, 705, 1, 0, 0, 0, 728, 706, 1, 0, 0, 0, 728, 708, 1, 0, 0, 0, 728, 713, 1, 0, 0, 0, 728, 718, 1, 0, 0, 0, 728, 723, 1, 0, 0, 0, 729, 99, 1, 0, 0, 0, 730, 731, 7, 4, 0, 0, 731, 101, 1, 0, 0, 0, 732, 733, 7, 5, 0, 0, 733, 103, 1, 0, 0, 0, 734, 743, 3, 114, 57, 0, 735, 743, 5, 98, 0, 0, 736, 743, 5, 99, 0, 0, 737, 743, 5, 82, 0, 0, 738, 743, 5, 83, 0, 0, 739, 743, 5, 84, 0, 0, 740, 743, 3, 106, 53, 0, 741, 743, 3, 110, 55, 0, 742, 734, 1, 0, 0, 0, 742, 735, 1, 0, 0, 0, 742, 736, 1, 0, 0, 0, 742, 737, 1, 0, 0, 0, 742, 738, 1, 0, 0, 0, 742, 739, 1, 0, 0, 0, 742, 740, 1, 0, 0, 0, 742, 741, 1, 0, 0, 0, 743, 105, 1, 0, 0, 0, 744, 753, 5, 90, 0, 0, 745, 750, 3, 108, 54, 0, 746, 747, 5, 88, 0, 0, 747, 749, 3, 108, 54, 0, 748, 746, 1, 0, 0, 0, 749, 752, 1, 0, 0, 0, 750, 748, 1, 0, 0, 0, 750, 751, 1, 0, 0, 0, 751, 754, 1, 0, 0, 0, 752, 750, 1, 0, 0, 0, 753, 745, 1, 0, 0, 0, 753, 754, 1, 0, 0, 0, 754, 755, 1, 0, 0, 0, 755, 756, 5, 91, 0, 0, 756, 107, 1, 0, 0, 0, 757, 758, 3, 114, 57, 0, 758, 759, 5, 86, 0, 0, 759, 760, 3, 104, 52, 0, 760, 109, 1, 0, 0, 0, 761, 770, 5, 92, 0, 0, 762, 767, 3, 104, 52, 0, 763, 764, 5, 88, 0, 0, 764, 766, 3, 104, 52, 0, 765, 763, 1, 0, 0, 0, 766, 769, 1, 0, 0, 0, 767, 765, 1, 0, 0, 0, 767, 768, 1, 0, 0, 0, 768, 771, 1, 0, 0, 0, 769, 767, 1, 0, 0, 0, 770, 762, 1, 0, 0, 0, 770, 771, 1, 0, 0, 0, 771, 772, 1, 0, 0, 0, 772, 773, 5, 93, 0, 0, 773, 111, 1, 0, 0, 0, 774, 775, 7, 6, 0, 0, 775, 113, 1, 0, 0, 0, 776, 777, 5, 101, 0, 0, 777, 115, 1, 0, 0, 0, 51, 128, 135, 156, 167, 179, 198, 206, 213, 226, 234, 261, 285, 295, 301, 330, 336, 341, 354, 362, 375, 380, 393, 406, 421, 424, 431, 439, 479, 483, 491, 503, 517, 527, 545, 557, 566, 603, 622, 624, 635, 650, 666, 680, 690, 699, 728, 742, 750, 753, 767, 770] \ No newline at end of file diff --git a/src/capability-language/generated/QuixosCapability.tokens b/src/capability-language/generated/QuixosCapability.tokens index a2f4274..d34ee3c 100644 --- a/src/capability-language/generated/QuixosCapability.tokens +++ b/src/capability-language/generated/QuixosCapability.tokens @@ -1,197 +1,201 @@ WORKSPACE=1 -IMPORT=2 -EXTERNAL=3 -ATOM=4 -INTERFACE=5 -INTERFACES=6 -PACKAGE=7 -VALUE=8 -RELATION=9 -OPERATION=10 -FUNCTION=11 -CONSTRUCTOR=12 -CONSTRUCTS=13 -CONFORM=14 -AS=15 -BIND=16 -TO=17 -PRIVATE=18 -SHARED=19 -STATE=20 -EDGE=21 -PROJECTION=22 -WITH=23 -USING=24 -VIA=25 -MATERIALIZE=26 -IF=27 -ABSENT=28 -ON=29 -POLICY=30 -DEFAULT=31 -SOURCE=32 -REPOSITORY=33 -COMMIT=34 -REVISION=35 -ID=36 -DOC=37 -MODE=38 -EMITS=39 -RECEIVER=40 -REQUIRES=41 -ANY=42 -GET=43 -SET=44 -WATCH=45 -START=46 -STOP=47 -READ=48 -WRITE=49 -RESOLVE=50 -CONNECT=51 -DISCONNECT=52 -CALL=53 -WATCH_START=54 -WATCH_STOP=55 -SUBSCRIBE=56 -UNSUBSCRIBE=57 -OPTIMISTIC_REGISTER=58 -CRDT=59 -OPTIONAL_ONE=60 -EXACTLY_ONE=61 -MANY_UNIQUE=62 -MANY=63 -ORDERED=64 -UNIT=65 -WATCH_HANDLE=66 -MESSAGE=67 -ATOM_REF=68 -INTERFACE_REF=69 -OPTIONAL=70 -LIST=71 -BOOL=72 -BYTES=73 -DOUBLE=74 -INT32=75 -INT64=76 -STRING=77 -UINT32=78 -UINT64=79 -TRUE=80 -FALSE=81 -NULL=82 -ARROW=83 -COLON=84 -SEMI=85 -COMMA=86 -DOT=87 -LBRACE=88 -RBRACE=89 -LBRACK=90 -RBRACK=91 -LPAREN=92 -RPAREN=93 -LT=94 -GT=95 -INTEGER=96 -JSON_NUMBER=97 -IDENTIFIER=98 -STRING_LITERAL=99 -LINE_COMMENT=100 -BLOCK_COMMENT=101 -WS=102 +FRAGMENT=2 +IMPORT=3 +EXTERNAL=4 +ATOM=5 +INTERFACE=6 +INTERFACES=7 +PACKAGE=8 +VALUE=9 +RELATION=10 +OPERATION=11 +FUNCTION=12 +CONSTRUCTOR=13 +CONSTRUCTS=14 +INPUT=15 +CONFORM=16 +AS=17 +BIND=18 +TO=19 +PRIVATE=20 +SHARED=21 +STATE=22 +EDGE=23 +PROJECTION=24 +WITH=25 +USING=26 +VIA=27 +MATERIALIZE=28 +IF=29 +ABSENT=30 +ON=31 +POLICY=32 +DEFAULT=33 +SOURCE=34 +REPOSITORY=35 +COMMIT=36 +REVISION=37 +ID=38 +DOC=39 +MODE=40 +EMITS=41 +RECEIVER=42 +REQUIRES=43 +ANY=44 +GET=45 +SET=46 +WATCH=47 +START=48 +STOP=49 +READ=50 +WRITE=51 +RESOLVE=52 +CONNECT=53 +DISCONNECT=54 +CALL=55 +WATCH_START=56 +WATCH_STOP=57 +SUBSCRIBE=58 +UNSUBSCRIBE=59 +OPTIMISTIC_REGISTER=60 +CRDT=61 +OPTIONAL_ONE=62 +EXACTLY_ONE=63 +MANY_UNIQUE=64 +MANY=65 +ORDERED=66 +UNIT=67 +WATCH_HANDLE=68 +MESSAGE=69 +ATOM_REF=70 +INTERFACE_REF=71 +OPTIONAL=72 +LIST=73 +BOOL=74 +BYTES=75 +DOUBLE=76 +INT32=77 +INT64=78 +STRING=79 +UINT32=80 +UINT64=81 +TRUE=82 +FALSE=83 +NULL=84 +ARROW=85 +COLON=86 +SEMI=87 +COMMA=88 +DOT=89 +LBRACE=90 +RBRACE=91 +LBRACK=92 +RBRACK=93 +LPAREN=94 +RPAREN=95 +LT=96 +GT=97 +INTEGER=98 +JSON_NUMBER=99 +IDENTIFIER=100 +STRING_LITERAL=101 +LINE_COMMENT=102 +BLOCK_COMMENT=103 +WS=104 'workspace'=1 -'import'=2 -'external'=3 -'atom'=4 -'interface'=5 -'interfaces'=6 -'package'=7 -'value'=8 -'relation'=9 -'operation'=10 -'function'=11 -'constructor'=12 -'constructs'=13 -'conform'=14 -'as'=15 -'bind'=16 -'to'=17 -'private'=18 -'shared'=19 -'state'=20 -'edge'=21 -'projection'=22 -'with'=23 -'using'=24 -'via'=25 -'materialize'=26 -'if'=27 -'absent'=28 -'on'=29 -'policy'=30 -'default'=31 -'source'=32 -'repository'=33 -'commit'=34 -'revision'=35 -'id'=36 -'doc'=37 -'mode'=38 -'emits'=39 -'receiver'=40 -'requires'=41 -'any'=42 -'get'=43 -'set'=44 -'watch'=45 -'start'=46 -'stop'=47 -'read'=48 -'write'=49 -'resolve'=50 -'connect'=51 -'disconnect'=52 -'call'=53 -'watch-start'=54 -'watch-stop'=55 -'subscribe'=56 -'unsubscribe'=57 -'optimistic-register'=58 -'crdt'=59 -'optional-one'=60 -'exactly-one'=61 -'many-unique'=62 -'many'=63 -'ordered'=64 -'unit'=65 -'watch-handle'=66 -'message'=67 -'atom-ref'=68 -'interface-ref'=69 -'optional'=70 -'list'=71 -'bool'=72 -'bytes'=73 -'double'=74 -'int32'=75 -'int64'=76 -'string'=77 -'uint32'=78 -'uint64'=79 -'true'=80 -'false'=81 -'null'=82 -'->'=83 -':'=84 -';'=85 -','=86 -'.'=87 -'{'=88 -'}'=89 -'['=90 -']'=91 -'('=92 -')'=93 -'<'=94 -'>'=95 +'fragment'=2 +'import'=3 +'external'=4 +'atom'=5 +'interface'=6 +'interfaces'=7 +'package'=8 +'value'=9 +'relation'=10 +'operation'=11 +'function'=12 +'constructor'=13 +'constructs'=14 +'input'=15 +'conform'=16 +'as'=17 +'bind'=18 +'to'=19 +'private'=20 +'shared'=21 +'state'=22 +'edge'=23 +'projection'=24 +'with'=25 +'using'=26 +'via'=27 +'materialize'=28 +'if'=29 +'absent'=30 +'on'=31 +'policy'=32 +'default'=33 +'source'=34 +'repository'=35 +'commit'=36 +'revision'=37 +'id'=38 +'doc'=39 +'mode'=40 +'emits'=41 +'receiver'=42 +'requires'=43 +'any'=44 +'get'=45 +'set'=46 +'watch'=47 +'start'=48 +'stop'=49 +'read'=50 +'write'=51 +'resolve'=52 +'connect'=53 +'disconnect'=54 +'call'=55 +'watch-start'=56 +'watch-stop'=57 +'subscribe'=58 +'unsubscribe'=59 +'optimistic-register'=60 +'crdt'=61 +'optional-one'=62 +'exactly-one'=63 +'many-unique'=64 +'many'=65 +'ordered'=66 +'unit'=67 +'watch-handle'=68 +'message'=69 +'atom-ref'=70 +'interface-ref'=71 +'optional'=72 +'list'=73 +'bool'=74 +'bytes'=75 +'double'=76 +'int32'=77 +'int64'=78 +'string'=79 +'uint32'=80 +'uint64'=81 +'true'=82 +'false'=83 +'null'=84 +'->'=85 +':'=86 +';'=87 +','=88 +'.'=89 +'{'=90 +'}'=91 +'['=92 +']'=93 +'('=94 +')'=95 +'<'=96 +'>'=97 diff --git a/src/capability-language/generated/QuixosCapabilityLexer.interp b/src/capability-language/generated/QuixosCapabilityLexer.interp index c4e5faf..5e41df9 100644 --- a/src/capability-language/generated/QuixosCapabilityLexer.interp +++ b/src/capability-language/generated/QuixosCapabilityLexer.interp @@ -1,6 +1,7 @@ token literal names: null 'workspace' +'fragment' 'import' 'external' 'atom' @@ -13,6 +14,7 @@ null 'function' 'constructor' 'constructs' +'input' 'conform' 'as' 'bind' @@ -106,6 +108,7 @@ null token symbolic names: null WORKSPACE +FRAGMENT IMPORT EXTERNAL ATOM @@ -118,6 +121,7 @@ OPERATION FUNCTION CONSTRUCTOR CONSTRUCTS +INPUT CONFORM AS BIND @@ -210,6 +214,7 @@ WS rule names: WORKSPACE +FRAGMENT IMPORT EXTERNAL ATOM @@ -222,6 +227,7 @@ OPERATION FUNCTION CONSTRUCTOR CONSTRUCTS +INPUT CONFORM AS BIND @@ -322,4 +328,4 @@ mode names: DEFAULT_MODE atn: -[4, 0, 102, 957, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 84, 1, 84, 1, 85, 1, 85, 1, 86, 1, 86, 1, 87, 1, 87, 1, 88, 1, 88, 1, 89, 1, 89, 1, 90, 1, 90, 1, 91, 1, 91, 1, 92, 1, 92, 1, 93, 1, 93, 1, 94, 1, 94, 1, 95, 3, 95, 858, 8, 95, 1, 95, 4, 95, 861, 8, 95, 11, 95, 12, 95, 862, 1, 96, 3, 96, 866, 8, 96, 1, 96, 1, 96, 1, 96, 5, 96, 871, 8, 96, 10, 96, 12, 96, 874, 9, 96, 3, 96, 876, 8, 96, 1, 96, 1, 96, 4, 96, 880, 8, 96, 11, 96, 12, 96, 881, 3, 96, 884, 8, 96, 1, 96, 1, 96, 3, 96, 888, 8, 96, 1, 96, 4, 96, 891, 8, 96, 11, 96, 12, 96, 892, 3, 96, 895, 8, 96, 1, 97, 1, 97, 5, 97, 899, 8, 97, 10, 97, 12, 97, 902, 9, 97, 1, 98, 1, 98, 1, 98, 5, 98, 907, 8, 98, 10, 98, 12, 98, 910, 9, 98, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 3, 99, 922, 8, 99, 1, 100, 1, 100, 1, 101, 1, 101, 1, 101, 1, 101, 5, 101, 930, 8, 101, 10, 101, 12, 101, 933, 9, 101, 1, 101, 1, 101, 1, 102, 1, 102, 1, 102, 1, 102, 5, 102, 941, 8, 102, 10, 102, 12, 102, 944, 9, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 103, 4, 103, 952, 8, 103, 11, 103, 12, 103, 953, 1, 103, 1, 103, 1, 942, 0, 104, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 29, 59, 30, 61, 31, 63, 32, 65, 33, 67, 34, 69, 35, 71, 36, 73, 37, 75, 38, 77, 39, 79, 40, 81, 41, 83, 42, 85, 43, 87, 44, 89, 45, 91, 46, 93, 47, 95, 48, 97, 49, 99, 50, 101, 51, 103, 52, 105, 53, 107, 54, 109, 55, 111, 56, 113, 57, 115, 58, 117, 59, 119, 60, 121, 61, 123, 62, 125, 63, 127, 64, 129, 65, 131, 66, 133, 67, 135, 68, 137, 69, 139, 70, 141, 71, 143, 72, 145, 73, 147, 74, 149, 75, 151, 76, 153, 77, 155, 78, 157, 79, 159, 80, 161, 81, 163, 82, 165, 83, 167, 84, 169, 85, 171, 86, 173, 87, 175, 88, 177, 89, 179, 90, 181, 91, 183, 92, 185, 93, 187, 94, 189, 95, 191, 96, 193, 97, 195, 98, 197, 99, 199, 0, 201, 0, 203, 100, 205, 101, 207, 102, 1, 0, 11, 1, 0, 48, 57, 1, 0, 49, 57, 2, 0, 69, 69, 101, 101, 2, 0, 43, 43, 45, 45, 3, 0, 65, 90, 95, 95, 97, 122, 4, 0, 48, 57, 65, 90, 95, 95, 97, 122, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 8, 0, 34, 34, 47, 47, 92, 92, 98, 98, 102, 102, 110, 110, 114, 114, 116, 116, 3, 0, 48, 57, 65, 70, 97, 102, 2, 0, 10, 10, 13, 13, 3, 0, 9, 10, 13, 13, 32, 32, 971, 0, 1, 1, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, 0, 0, 45, 1, 0, 0, 0, 0, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 53, 1, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 57, 1, 0, 0, 0, 0, 59, 1, 0, 0, 0, 0, 61, 1, 0, 0, 0, 0, 63, 1, 0, 0, 0, 0, 65, 1, 0, 0, 0, 0, 67, 1, 0, 0, 0, 0, 69, 1, 0, 0, 0, 0, 71, 1, 0, 0, 0, 0, 73, 1, 0, 0, 0, 0, 75, 1, 0, 0, 0, 0, 77, 1, 0, 0, 0, 0, 79, 1, 0, 0, 0, 0, 81, 1, 0, 0, 0, 0, 83, 1, 0, 0, 0, 0, 85, 1, 0, 0, 0, 0, 87, 1, 0, 0, 0, 0, 89, 1, 0, 0, 0, 0, 91, 1, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 95, 1, 0, 0, 0, 0, 97, 1, 0, 0, 0, 0, 99, 1, 0, 0, 0, 0, 101, 1, 0, 0, 0, 0, 103, 1, 0, 0, 0, 0, 105, 1, 0, 0, 0, 0, 107, 1, 0, 0, 0, 0, 109, 1, 0, 0, 0, 0, 111, 1, 0, 0, 0, 0, 113, 1, 0, 0, 0, 0, 115, 1, 0, 0, 0, 0, 117, 1, 0, 0, 0, 0, 119, 1, 0, 0, 0, 0, 121, 1, 0, 0, 0, 0, 123, 1, 0, 0, 0, 0, 125, 1, 0, 0, 0, 0, 127, 1, 0, 0, 0, 0, 129, 1, 0, 0, 0, 0, 131, 1, 0, 0, 0, 0, 133, 1, 0, 0, 0, 0, 135, 1, 0, 0, 0, 0, 137, 1, 0, 0, 0, 0, 139, 1, 0, 0, 0, 0, 141, 1, 0, 0, 0, 0, 143, 1, 0, 0, 0, 0, 145, 1, 0, 0, 0, 0, 147, 1, 0, 0, 0, 0, 149, 1, 0, 0, 0, 0, 151, 1, 0, 0, 0, 0, 153, 1, 0, 0, 0, 0, 155, 1, 0, 0, 0, 0, 157, 1, 0, 0, 0, 0, 159, 1, 0, 0, 0, 0, 161, 1, 0, 0, 0, 0, 163, 1, 0, 0, 0, 0, 165, 1, 0, 0, 0, 0, 167, 1, 0, 0, 0, 0, 169, 1, 0, 0, 0, 0, 171, 1, 0, 0, 0, 0, 173, 1, 0, 0, 0, 0, 175, 1, 0, 0, 0, 0, 177, 1, 0, 0, 0, 0, 179, 1, 0, 0, 0, 0, 181, 1, 0, 0, 0, 0, 183, 1, 0, 0, 0, 0, 185, 1, 0, 0, 0, 0, 187, 1, 0, 0, 0, 0, 189, 1, 0, 0, 0, 0, 191, 1, 0, 0, 0, 0, 193, 1, 0, 0, 0, 0, 195, 1, 0, 0, 0, 0, 197, 1, 0, 0, 0, 0, 203, 1, 0, 0, 0, 0, 205, 1, 0, 0, 0, 0, 207, 1, 0, 0, 0, 1, 209, 1, 0, 0, 0, 3, 219, 1, 0, 0, 0, 5, 226, 1, 0, 0, 0, 7, 235, 1, 0, 0, 0, 9, 240, 1, 0, 0, 0, 11, 250, 1, 0, 0, 0, 13, 261, 1, 0, 0, 0, 15, 269, 1, 0, 0, 0, 17, 275, 1, 0, 0, 0, 19, 284, 1, 0, 0, 0, 21, 294, 1, 0, 0, 0, 23, 303, 1, 0, 0, 0, 25, 315, 1, 0, 0, 0, 27, 326, 1, 0, 0, 0, 29, 334, 1, 0, 0, 0, 31, 337, 1, 0, 0, 0, 33, 342, 1, 0, 0, 0, 35, 345, 1, 0, 0, 0, 37, 353, 1, 0, 0, 0, 39, 360, 1, 0, 0, 0, 41, 366, 1, 0, 0, 0, 43, 371, 1, 0, 0, 0, 45, 382, 1, 0, 0, 0, 47, 387, 1, 0, 0, 0, 49, 393, 1, 0, 0, 0, 51, 397, 1, 0, 0, 0, 53, 409, 1, 0, 0, 0, 55, 412, 1, 0, 0, 0, 57, 419, 1, 0, 0, 0, 59, 422, 1, 0, 0, 0, 61, 429, 1, 0, 0, 0, 63, 437, 1, 0, 0, 0, 65, 444, 1, 0, 0, 0, 67, 455, 1, 0, 0, 0, 69, 462, 1, 0, 0, 0, 71, 471, 1, 0, 0, 0, 73, 474, 1, 0, 0, 0, 75, 478, 1, 0, 0, 0, 77, 483, 1, 0, 0, 0, 79, 489, 1, 0, 0, 0, 81, 498, 1, 0, 0, 0, 83, 507, 1, 0, 0, 0, 85, 511, 1, 0, 0, 0, 87, 515, 1, 0, 0, 0, 89, 519, 1, 0, 0, 0, 91, 525, 1, 0, 0, 0, 93, 531, 1, 0, 0, 0, 95, 536, 1, 0, 0, 0, 97, 541, 1, 0, 0, 0, 99, 547, 1, 0, 0, 0, 101, 555, 1, 0, 0, 0, 103, 563, 1, 0, 0, 0, 105, 574, 1, 0, 0, 0, 107, 579, 1, 0, 0, 0, 109, 591, 1, 0, 0, 0, 111, 602, 1, 0, 0, 0, 113, 612, 1, 0, 0, 0, 115, 624, 1, 0, 0, 0, 117, 644, 1, 0, 0, 0, 119, 649, 1, 0, 0, 0, 121, 662, 1, 0, 0, 0, 123, 674, 1, 0, 0, 0, 125, 686, 1, 0, 0, 0, 127, 691, 1, 0, 0, 0, 129, 699, 1, 0, 0, 0, 131, 704, 1, 0, 0, 0, 133, 717, 1, 0, 0, 0, 135, 725, 1, 0, 0, 0, 137, 734, 1, 0, 0, 0, 139, 748, 1, 0, 0, 0, 141, 757, 1, 0, 0, 0, 143, 762, 1, 0, 0, 0, 145, 767, 1, 0, 0, 0, 147, 773, 1, 0, 0, 0, 149, 780, 1, 0, 0, 0, 151, 786, 1, 0, 0, 0, 153, 792, 1, 0, 0, 0, 155, 799, 1, 0, 0, 0, 157, 806, 1, 0, 0, 0, 159, 813, 1, 0, 0, 0, 161, 818, 1, 0, 0, 0, 163, 824, 1, 0, 0, 0, 165, 829, 1, 0, 0, 0, 167, 832, 1, 0, 0, 0, 169, 834, 1, 0, 0, 0, 171, 836, 1, 0, 0, 0, 173, 838, 1, 0, 0, 0, 175, 840, 1, 0, 0, 0, 177, 842, 1, 0, 0, 0, 179, 844, 1, 0, 0, 0, 181, 846, 1, 0, 0, 0, 183, 848, 1, 0, 0, 0, 185, 850, 1, 0, 0, 0, 187, 852, 1, 0, 0, 0, 189, 854, 1, 0, 0, 0, 191, 857, 1, 0, 0, 0, 193, 865, 1, 0, 0, 0, 195, 896, 1, 0, 0, 0, 197, 903, 1, 0, 0, 0, 199, 913, 1, 0, 0, 0, 201, 923, 1, 0, 0, 0, 203, 925, 1, 0, 0, 0, 205, 936, 1, 0, 0, 0, 207, 951, 1, 0, 0, 0, 209, 210, 5, 119, 0, 0, 210, 211, 5, 111, 0, 0, 211, 212, 5, 114, 0, 0, 212, 213, 5, 107, 0, 0, 213, 214, 5, 115, 0, 0, 214, 215, 5, 112, 0, 0, 215, 216, 5, 97, 0, 0, 216, 217, 5, 99, 0, 0, 217, 218, 5, 101, 0, 0, 218, 2, 1, 0, 0, 0, 219, 220, 5, 105, 0, 0, 220, 221, 5, 109, 0, 0, 221, 222, 5, 112, 0, 0, 222, 223, 5, 111, 0, 0, 223, 224, 5, 114, 0, 0, 224, 225, 5, 116, 0, 0, 225, 4, 1, 0, 0, 0, 226, 227, 5, 101, 0, 0, 227, 228, 5, 120, 0, 0, 228, 229, 5, 116, 0, 0, 229, 230, 5, 101, 0, 0, 230, 231, 5, 114, 0, 0, 231, 232, 5, 110, 0, 0, 232, 233, 5, 97, 0, 0, 233, 234, 5, 108, 0, 0, 234, 6, 1, 0, 0, 0, 235, 236, 5, 97, 0, 0, 236, 237, 5, 116, 0, 0, 237, 238, 5, 111, 0, 0, 238, 239, 5, 109, 0, 0, 239, 8, 1, 0, 0, 0, 240, 241, 5, 105, 0, 0, 241, 242, 5, 110, 0, 0, 242, 243, 5, 116, 0, 0, 243, 244, 5, 101, 0, 0, 244, 245, 5, 114, 0, 0, 245, 246, 5, 102, 0, 0, 246, 247, 5, 97, 0, 0, 247, 248, 5, 99, 0, 0, 248, 249, 5, 101, 0, 0, 249, 10, 1, 0, 0, 0, 250, 251, 5, 105, 0, 0, 251, 252, 5, 110, 0, 0, 252, 253, 5, 116, 0, 0, 253, 254, 5, 101, 0, 0, 254, 255, 5, 114, 0, 0, 255, 256, 5, 102, 0, 0, 256, 257, 5, 97, 0, 0, 257, 258, 5, 99, 0, 0, 258, 259, 5, 101, 0, 0, 259, 260, 5, 115, 0, 0, 260, 12, 1, 0, 0, 0, 261, 262, 5, 112, 0, 0, 262, 263, 5, 97, 0, 0, 263, 264, 5, 99, 0, 0, 264, 265, 5, 107, 0, 0, 265, 266, 5, 97, 0, 0, 266, 267, 5, 103, 0, 0, 267, 268, 5, 101, 0, 0, 268, 14, 1, 0, 0, 0, 269, 270, 5, 118, 0, 0, 270, 271, 5, 97, 0, 0, 271, 272, 5, 108, 0, 0, 272, 273, 5, 117, 0, 0, 273, 274, 5, 101, 0, 0, 274, 16, 1, 0, 0, 0, 275, 276, 5, 114, 0, 0, 276, 277, 5, 101, 0, 0, 277, 278, 5, 108, 0, 0, 278, 279, 5, 97, 0, 0, 279, 280, 5, 116, 0, 0, 280, 281, 5, 105, 0, 0, 281, 282, 5, 111, 0, 0, 282, 283, 5, 110, 0, 0, 283, 18, 1, 0, 0, 0, 284, 285, 5, 111, 0, 0, 285, 286, 5, 112, 0, 0, 286, 287, 5, 101, 0, 0, 287, 288, 5, 114, 0, 0, 288, 289, 5, 97, 0, 0, 289, 290, 5, 116, 0, 0, 290, 291, 5, 105, 0, 0, 291, 292, 5, 111, 0, 0, 292, 293, 5, 110, 0, 0, 293, 20, 1, 0, 0, 0, 294, 295, 5, 102, 0, 0, 295, 296, 5, 117, 0, 0, 296, 297, 5, 110, 0, 0, 297, 298, 5, 99, 0, 0, 298, 299, 5, 116, 0, 0, 299, 300, 5, 105, 0, 0, 300, 301, 5, 111, 0, 0, 301, 302, 5, 110, 0, 0, 302, 22, 1, 0, 0, 0, 303, 304, 5, 99, 0, 0, 304, 305, 5, 111, 0, 0, 305, 306, 5, 110, 0, 0, 306, 307, 5, 115, 0, 0, 307, 308, 5, 116, 0, 0, 308, 309, 5, 114, 0, 0, 309, 310, 5, 117, 0, 0, 310, 311, 5, 99, 0, 0, 311, 312, 5, 116, 0, 0, 312, 313, 5, 111, 0, 0, 313, 314, 5, 114, 0, 0, 314, 24, 1, 0, 0, 0, 315, 316, 5, 99, 0, 0, 316, 317, 5, 111, 0, 0, 317, 318, 5, 110, 0, 0, 318, 319, 5, 115, 0, 0, 319, 320, 5, 116, 0, 0, 320, 321, 5, 114, 0, 0, 321, 322, 5, 117, 0, 0, 322, 323, 5, 99, 0, 0, 323, 324, 5, 116, 0, 0, 324, 325, 5, 115, 0, 0, 325, 26, 1, 0, 0, 0, 326, 327, 5, 99, 0, 0, 327, 328, 5, 111, 0, 0, 328, 329, 5, 110, 0, 0, 329, 330, 5, 102, 0, 0, 330, 331, 5, 111, 0, 0, 331, 332, 5, 114, 0, 0, 332, 333, 5, 109, 0, 0, 333, 28, 1, 0, 0, 0, 334, 335, 5, 97, 0, 0, 335, 336, 5, 115, 0, 0, 336, 30, 1, 0, 0, 0, 337, 338, 5, 98, 0, 0, 338, 339, 5, 105, 0, 0, 339, 340, 5, 110, 0, 0, 340, 341, 5, 100, 0, 0, 341, 32, 1, 0, 0, 0, 342, 343, 5, 116, 0, 0, 343, 344, 5, 111, 0, 0, 344, 34, 1, 0, 0, 0, 345, 346, 5, 112, 0, 0, 346, 347, 5, 114, 0, 0, 347, 348, 5, 105, 0, 0, 348, 349, 5, 118, 0, 0, 349, 350, 5, 97, 0, 0, 350, 351, 5, 116, 0, 0, 351, 352, 5, 101, 0, 0, 352, 36, 1, 0, 0, 0, 353, 354, 5, 115, 0, 0, 354, 355, 5, 104, 0, 0, 355, 356, 5, 97, 0, 0, 356, 357, 5, 114, 0, 0, 357, 358, 5, 101, 0, 0, 358, 359, 5, 100, 0, 0, 359, 38, 1, 0, 0, 0, 360, 361, 5, 115, 0, 0, 361, 362, 5, 116, 0, 0, 362, 363, 5, 97, 0, 0, 363, 364, 5, 116, 0, 0, 364, 365, 5, 101, 0, 0, 365, 40, 1, 0, 0, 0, 366, 367, 5, 101, 0, 0, 367, 368, 5, 100, 0, 0, 368, 369, 5, 103, 0, 0, 369, 370, 5, 101, 0, 0, 370, 42, 1, 0, 0, 0, 371, 372, 5, 112, 0, 0, 372, 373, 5, 114, 0, 0, 373, 374, 5, 111, 0, 0, 374, 375, 5, 106, 0, 0, 375, 376, 5, 101, 0, 0, 376, 377, 5, 99, 0, 0, 377, 378, 5, 116, 0, 0, 378, 379, 5, 105, 0, 0, 379, 380, 5, 111, 0, 0, 380, 381, 5, 110, 0, 0, 381, 44, 1, 0, 0, 0, 382, 383, 5, 119, 0, 0, 383, 384, 5, 105, 0, 0, 384, 385, 5, 116, 0, 0, 385, 386, 5, 104, 0, 0, 386, 46, 1, 0, 0, 0, 387, 388, 5, 117, 0, 0, 388, 389, 5, 115, 0, 0, 389, 390, 5, 105, 0, 0, 390, 391, 5, 110, 0, 0, 391, 392, 5, 103, 0, 0, 392, 48, 1, 0, 0, 0, 393, 394, 5, 118, 0, 0, 394, 395, 5, 105, 0, 0, 395, 396, 5, 97, 0, 0, 396, 50, 1, 0, 0, 0, 397, 398, 5, 109, 0, 0, 398, 399, 5, 97, 0, 0, 399, 400, 5, 116, 0, 0, 400, 401, 5, 101, 0, 0, 401, 402, 5, 114, 0, 0, 402, 403, 5, 105, 0, 0, 403, 404, 5, 97, 0, 0, 404, 405, 5, 108, 0, 0, 405, 406, 5, 105, 0, 0, 406, 407, 5, 122, 0, 0, 407, 408, 5, 101, 0, 0, 408, 52, 1, 0, 0, 0, 409, 410, 5, 105, 0, 0, 410, 411, 5, 102, 0, 0, 411, 54, 1, 0, 0, 0, 412, 413, 5, 97, 0, 0, 413, 414, 5, 98, 0, 0, 414, 415, 5, 115, 0, 0, 415, 416, 5, 101, 0, 0, 416, 417, 5, 110, 0, 0, 417, 418, 5, 116, 0, 0, 418, 56, 1, 0, 0, 0, 419, 420, 5, 111, 0, 0, 420, 421, 5, 110, 0, 0, 421, 58, 1, 0, 0, 0, 422, 423, 5, 112, 0, 0, 423, 424, 5, 111, 0, 0, 424, 425, 5, 108, 0, 0, 425, 426, 5, 105, 0, 0, 426, 427, 5, 99, 0, 0, 427, 428, 5, 121, 0, 0, 428, 60, 1, 0, 0, 0, 429, 430, 5, 100, 0, 0, 430, 431, 5, 101, 0, 0, 431, 432, 5, 102, 0, 0, 432, 433, 5, 97, 0, 0, 433, 434, 5, 117, 0, 0, 434, 435, 5, 108, 0, 0, 435, 436, 5, 116, 0, 0, 436, 62, 1, 0, 0, 0, 437, 438, 5, 115, 0, 0, 438, 439, 5, 111, 0, 0, 439, 440, 5, 117, 0, 0, 440, 441, 5, 114, 0, 0, 441, 442, 5, 99, 0, 0, 442, 443, 5, 101, 0, 0, 443, 64, 1, 0, 0, 0, 444, 445, 5, 114, 0, 0, 445, 446, 5, 101, 0, 0, 446, 447, 5, 112, 0, 0, 447, 448, 5, 111, 0, 0, 448, 449, 5, 115, 0, 0, 449, 450, 5, 105, 0, 0, 450, 451, 5, 116, 0, 0, 451, 452, 5, 111, 0, 0, 452, 453, 5, 114, 0, 0, 453, 454, 5, 121, 0, 0, 454, 66, 1, 0, 0, 0, 455, 456, 5, 99, 0, 0, 456, 457, 5, 111, 0, 0, 457, 458, 5, 109, 0, 0, 458, 459, 5, 109, 0, 0, 459, 460, 5, 105, 0, 0, 460, 461, 5, 116, 0, 0, 461, 68, 1, 0, 0, 0, 462, 463, 5, 114, 0, 0, 463, 464, 5, 101, 0, 0, 464, 465, 5, 118, 0, 0, 465, 466, 5, 105, 0, 0, 466, 467, 5, 115, 0, 0, 467, 468, 5, 105, 0, 0, 468, 469, 5, 111, 0, 0, 469, 470, 5, 110, 0, 0, 470, 70, 1, 0, 0, 0, 471, 472, 5, 105, 0, 0, 472, 473, 5, 100, 0, 0, 473, 72, 1, 0, 0, 0, 474, 475, 5, 100, 0, 0, 475, 476, 5, 111, 0, 0, 476, 477, 5, 99, 0, 0, 477, 74, 1, 0, 0, 0, 478, 479, 5, 109, 0, 0, 479, 480, 5, 111, 0, 0, 480, 481, 5, 100, 0, 0, 481, 482, 5, 101, 0, 0, 482, 76, 1, 0, 0, 0, 483, 484, 5, 101, 0, 0, 484, 485, 5, 109, 0, 0, 485, 486, 5, 105, 0, 0, 486, 487, 5, 116, 0, 0, 487, 488, 5, 115, 0, 0, 488, 78, 1, 0, 0, 0, 489, 490, 5, 114, 0, 0, 490, 491, 5, 101, 0, 0, 491, 492, 5, 99, 0, 0, 492, 493, 5, 101, 0, 0, 493, 494, 5, 105, 0, 0, 494, 495, 5, 118, 0, 0, 495, 496, 5, 101, 0, 0, 496, 497, 5, 114, 0, 0, 497, 80, 1, 0, 0, 0, 498, 499, 5, 114, 0, 0, 499, 500, 5, 101, 0, 0, 500, 501, 5, 113, 0, 0, 501, 502, 5, 117, 0, 0, 502, 503, 5, 105, 0, 0, 503, 504, 5, 114, 0, 0, 504, 505, 5, 101, 0, 0, 505, 506, 5, 115, 0, 0, 506, 82, 1, 0, 0, 0, 507, 508, 5, 97, 0, 0, 508, 509, 5, 110, 0, 0, 509, 510, 5, 121, 0, 0, 510, 84, 1, 0, 0, 0, 511, 512, 5, 103, 0, 0, 512, 513, 5, 101, 0, 0, 513, 514, 5, 116, 0, 0, 514, 86, 1, 0, 0, 0, 515, 516, 5, 115, 0, 0, 516, 517, 5, 101, 0, 0, 517, 518, 5, 116, 0, 0, 518, 88, 1, 0, 0, 0, 519, 520, 5, 119, 0, 0, 520, 521, 5, 97, 0, 0, 521, 522, 5, 116, 0, 0, 522, 523, 5, 99, 0, 0, 523, 524, 5, 104, 0, 0, 524, 90, 1, 0, 0, 0, 525, 526, 5, 115, 0, 0, 526, 527, 5, 116, 0, 0, 527, 528, 5, 97, 0, 0, 528, 529, 5, 114, 0, 0, 529, 530, 5, 116, 0, 0, 530, 92, 1, 0, 0, 0, 531, 532, 5, 115, 0, 0, 532, 533, 5, 116, 0, 0, 533, 534, 5, 111, 0, 0, 534, 535, 5, 112, 0, 0, 535, 94, 1, 0, 0, 0, 536, 537, 5, 114, 0, 0, 537, 538, 5, 101, 0, 0, 538, 539, 5, 97, 0, 0, 539, 540, 5, 100, 0, 0, 540, 96, 1, 0, 0, 0, 541, 542, 5, 119, 0, 0, 542, 543, 5, 114, 0, 0, 543, 544, 5, 105, 0, 0, 544, 545, 5, 116, 0, 0, 545, 546, 5, 101, 0, 0, 546, 98, 1, 0, 0, 0, 547, 548, 5, 114, 0, 0, 548, 549, 5, 101, 0, 0, 549, 550, 5, 115, 0, 0, 550, 551, 5, 111, 0, 0, 551, 552, 5, 108, 0, 0, 552, 553, 5, 118, 0, 0, 553, 554, 5, 101, 0, 0, 554, 100, 1, 0, 0, 0, 555, 556, 5, 99, 0, 0, 556, 557, 5, 111, 0, 0, 557, 558, 5, 110, 0, 0, 558, 559, 5, 110, 0, 0, 559, 560, 5, 101, 0, 0, 560, 561, 5, 99, 0, 0, 561, 562, 5, 116, 0, 0, 562, 102, 1, 0, 0, 0, 563, 564, 5, 100, 0, 0, 564, 565, 5, 105, 0, 0, 565, 566, 5, 115, 0, 0, 566, 567, 5, 99, 0, 0, 567, 568, 5, 111, 0, 0, 568, 569, 5, 110, 0, 0, 569, 570, 5, 110, 0, 0, 570, 571, 5, 101, 0, 0, 571, 572, 5, 99, 0, 0, 572, 573, 5, 116, 0, 0, 573, 104, 1, 0, 0, 0, 574, 575, 5, 99, 0, 0, 575, 576, 5, 97, 0, 0, 576, 577, 5, 108, 0, 0, 577, 578, 5, 108, 0, 0, 578, 106, 1, 0, 0, 0, 579, 580, 5, 119, 0, 0, 580, 581, 5, 97, 0, 0, 581, 582, 5, 116, 0, 0, 582, 583, 5, 99, 0, 0, 583, 584, 5, 104, 0, 0, 584, 585, 5, 45, 0, 0, 585, 586, 5, 115, 0, 0, 586, 587, 5, 116, 0, 0, 587, 588, 5, 97, 0, 0, 588, 589, 5, 114, 0, 0, 589, 590, 5, 116, 0, 0, 590, 108, 1, 0, 0, 0, 591, 592, 5, 119, 0, 0, 592, 593, 5, 97, 0, 0, 593, 594, 5, 116, 0, 0, 594, 595, 5, 99, 0, 0, 595, 596, 5, 104, 0, 0, 596, 597, 5, 45, 0, 0, 597, 598, 5, 115, 0, 0, 598, 599, 5, 116, 0, 0, 599, 600, 5, 111, 0, 0, 600, 601, 5, 112, 0, 0, 601, 110, 1, 0, 0, 0, 602, 603, 5, 115, 0, 0, 603, 604, 5, 117, 0, 0, 604, 605, 5, 98, 0, 0, 605, 606, 5, 115, 0, 0, 606, 607, 5, 99, 0, 0, 607, 608, 5, 114, 0, 0, 608, 609, 5, 105, 0, 0, 609, 610, 5, 98, 0, 0, 610, 611, 5, 101, 0, 0, 611, 112, 1, 0, 0, 0, 612, 613, 5, 117, 0, 0, 613, 614, 5, 110, 0, 0, 614, 615, 5, 115, 0, 0, 615, 616, 5, 117, 0, 0, 616, 617, 5, 98, 0, 0, 617, 618, 5, 115, 0, 0, 618, 619, 5, 99, 0, 0, 619, 620, 5, 114, 0, 0, 620, 621, 5, 105, 0, 0, 621, 622, 5, 98, 0, 0, 622, 623, 5, 101, 0, 0, 623, 114, 1, 0, 0, 0, 624, 625, 5, 111, 0, 0, 625, 626, 5, 112, 0, 0, 626, 627, 5, 116, 0, 0, 627, 628, 5, 105, 0, 0, 628, 629, 5, 109, 0, 0, 629, 630, 5, 105, 0, 0, 630, 631, 5, 115, 0, 0, 631, 632, 5, 116, 0, 0, 632, 633, 5, 105, 0, 0, 633, 634, 5, 99, 0, 0, 634, 635, 5, 45, 0, 0, 635, 636, 5, 114, 0, 0, 636, 637, 5, 101, 0, 0, 637, 638, 5, 103, 0, 0, 638, 639, 5, 105, 0, 0, 639, 640, 5, 115, 0, 0, 640, 641, 5, 116, 0, 0, 641, 642, 5, 101, 0, 0, 642, 643, 5, 114, 0, 0, 643, 116, 1, 0, 0, 0, 644, 645, 5, 99, 0, 0, 645, 646, 5, 114, 0, 0, 646, 647, 5, 100, 0, 0, 647, 648, 5, 116, 0, 0, 648, 118, 1, 0, 0, 0, 649, 650, 5, 111, 0, 0, 650, 651, 5, 112, 0, 0, 651, 652, 5, 116, 0, 0, 652, 653, 5, 105, 0, 0, 653, 654, 5, 111, 0, 0, 654, 655, 5, 110, 0, 0, 655, 656, 5, 97, 0, 0, 656, 657, 5, 108, 0, 0, 657, 658, 5, 45, 0, 0, 658, 659, 5, 111, 0, 0, 659, 660, 5, 110, 0, 0, 660, 661, 5, 101, 0, 0, 661, 120, 1, 0, 0, 0, 662, 663, 5, 101, 0, 0, 663, 664, 5, 120, 0, 0, 664, 665, 5, 97, 0, 0, 665, 666, 5, 99, 0, 0, 666, 667, 5, 116, 0, 0, 667, 668, 5, 108, 0, 0, 668, 669, 5, 121, 0, 0, 669, 670, 5, 45, 0, 0, 670, 671, 5, 111, 0, 0, 671, 672, 5, 110, 0, 0, 672, 673, 5, 101, 0, 0, 673, 122, 1, 0, 0, 0, 674, 675, 5, 109, 0, 0, 675, 676, 5, 97, 0, 0, 676, 677, 5, 110, 0, 0, 677, 678, 5, 121, 0, 0, 678, 679, 5, 45, 0, 0, 679, 680, 5, 117, 0, 0, 680, 681, 5, 110, 0, 0, 681, 682, 5, 105, 0, 0, 682, 683, 5, 113, 0, 0, 683, 684, 5, 117, 0, 0, 684, 685, 5, 101, 0, 0, 685, 124, 1, 0, 0, 0, 686, 687, 5, 109, 0, 0, 687, 688, 5, 97, 0, 0, 688, 689, 5, 110, 0, 0, 689, 690, 5, 121, 0, 0, 690, 126, 1, 0, 0, 0, 691, 692, 5, 111, 0, 0, 692, 693, 5, 114, 0, 0, 693, 694, 5, 100, 0, 0, 694, 695, 5, 101, 0, 0, 695, 696, 5, 114, 0, 0, 696, 697, 5, 101, 0, 0, 697, 698, 5, 100, 0, 0, 698, 128, 1, 0, 0, 0, 699, 700, 5, 117, 0, 0, 700, 701, 5, 110, 0, 0, 701, 702, 5, 105, 0, 0, 702, 703, 5, 116, 0, 0, 703, 130, 1, 0, 0, 0, 704, 705, 5, 119, 0, 0, 705, 706, 5, 97, 0, 0, 706, 707, 5, 116, 0, 0, 707, 708, 5, 99, 0, 0, 708, 709, 5, 104, 0, 0, 709, 710, 5, 45, 0, 0, 710, 711, 5, 104, 0, 0, 711, 712, 5, 97, 0, 0, 712, 713, 5, 110, 0, 0, 713, 714, 5, 100, 0, 0, 714, 715, 5, 108, 0, 0, 715, 716, 5, 101, 0, 0, 716, 132, 1, 0, 0, 0, 717, 718, 5, 109, 0, 0, 718, 719, 5, 101, 0, 0, 719, 720, 5, 115, 0, 0, 720, 721, 5, 115, 0, 0, 721, 722, 5, 97, 0, 0, 722, 723, 5, 103, 0, 0, 723, 724, 5, 101, 0, 0, 724, 134, 1, 0, 0, 0, 725, 726, 5, 97, 0, 0, 726, 727, 5, 116, 0, 0, 727, 728, 5, 111, 0, 0, 728, 729, 5, 109, 0, 0, 729, 730, 5, 45, 0, 0, 730, 731, 5, 114, 0, 0, 731, 732, 5, 101, 0, 0, 732, 733, 5, 102, 0, 0, 733, 136, 1, 0, 0, 0, 734, 735, 5, 105, 0, 0, 735, 736, 5, 110, 0, 0, 736, 737, 5, 116, 0, 0, 737, 738, 5, 101, 0, 0, 738, 739, 5, 114, 0, 0, 739, 740, 5, 102, 0, 0, 740, 741, 5, 97, 0, 0, 741, 742, 5, 99, 0, 0, 742, 743, 5, 101, 0, 0, 743, 744, 5, 45, 0, 0, 744, 745, 5, 114, 0, 0, 745, 746, 5, 101, 0, 0, 746, 747, 5, 102, 0, 0, 747, 138, 1, 0, 0, 0, 748, 749, 5, 111, 0, 0, 749, 750, 5, 112, 0, 0, 750, 751, 5, 116, 0, 0, 751, 752, 5, 105, 0, 0, 752, 753, 5, 111, 0, 0, 753, 754, 5, 110, 0, 0, 754, 755, 5, 97, 0, 0, 755, 756, 5, 108, 0, 0, 756, 140, 1, 0, 0, 0, 757, 758, 5, 108, 0, 0, 758, 759, 5, 105, 0, 0, 759, 760, 5, 115, 0, 0, 760, 761, 5, 116, 0, 0, 761, 142, 1, 0, 0, 0, 762, 763, 5, 98, 0, 0, 763, 764, 5, 111, 0, 0, 764, 765, 5, 111, 0, 0, 765, 766, 5, 108, 0, 0, 766, 144, 1, 0, 0, 0, 767, 768, 5, 98, 0, 0, 768, 769, 5, 121, 0, 0, 769, 770, 5, 116, 0, 0, 770, 771, 5, 101, 0, 0, 771, 772, 5, 115, 0, 0, 772, 146, 1, 0, 0, 0, 773, 774, 5, 100, 0, 0, 774, 775, 5, 111, 0, 0, 775, 776, 5, 117, 0, 0, 776, 777, 5, 98, 0, 0, 777, 778, 5, 108, 0, 0, 778, 779, 5, 101, 0, 0, 779, 148, 1, 0, 0, 0, 780, 781, 5, 105, 0, 0, 781, 782, 5, 110, 0, 0, 782, 783, 5, 116, 0, 0, 783, 784, 5, 51, 0, 0, 784, 785, 5, 50, 0, 0, 785, 150, 1, 0, 0, 0, 786, 787, 5, 105, 0, 0, 787, 788, 5, 110, 0, 0, 788, 789, 5, 116, 0, 0, 789, 790, 5, 54, 0, 0, 790, 791, 5, 52, 0, 0, 791, 152, 1, 0, 0, 0, 792, 793, 5, 115, 0, 0, 793, 794, 5, 116, 0, 0, 794, 795, 5, 114, 0, 0, 795, 796, 5, 105, 0, 0, 796, 797, 5, 110, 0, 0, 797, 798, 5, 103, 0, 0, 798, 154, 1, 0, 0, 0, 799, 800, 5, 117, 0, 0, 800, 801, 5, 105, 0, 0, 801, 802, 5, 110, 0, 0, 802, 803, 5, 116, 0, 0, 803, 804, 5, 51, 0, 0, 804, 805, 5, 50, 0, 0, 805, 156, 1, 0, 0, 0, 806, 807, 5, 117, 0, 0, 807, 808, 5, 105, 0, 0, 808, 809, 5, 110, 0, 0, 809, 810, 5, 116, 0, 0, 810, 811, 5, 54, 0, 0, 811, 812, 5, 52, 0, 0, 812, 158, 1, 0, 0, 0, 813, 814, 5, 116, 0, 0, 814, 815, 5, 114, 0, 0, 815, 816, 5, 117, 0, 0, 816, 817, 5, 101, 0, 0, 817, 160, 1, 0, 0, 0, 818, 819, 5, 102, 0, 0, 819, 820, 5, 97, 0, 0, 820, 821, 5, 108, 0, 0, 821, 822, 5, 115, 0, 0, 822, 823, 5, 101, 0, 0, 823, 162, 1, 0, 0, 0, 824, 825, 5, 110, 0, 0, 825, 826, 5, 117, 0, 0, 826, 827, 5, 108, 0, 0, 827, 828, 5, 108, 0, 0, 828, 164, 1, 0, 0, 0, 829, 830, 5, 45, 0, 0, 830, 831, 5, 62, 0, 0, 831, 166, 1, 0, 0, 0, 832, 833, 5, 58, 0, 0, 833, 168, 1, 0, 0, 0, 834, 835, 5, 59, 0, 0, 835, 170, 1, 0, 0, 0, 836, 837, 5, 44, 0, 0, 837, 172, 1, 0, 0, 0, 838, 839, 5, 46, 0, 0, 839, 174, 1, 0, 0, 0, 840, 841, 5, 123, 0, 0, 841, 176, 1, 0, 0, 0, 842, 843, 5, 125, 0, 0, 843, 178, 1, 0, 0, 0, 844, 845, 5, 91, 0, 0, 845, 180, 1, 0, 0, 0, 846, 847, 5, 93, 0, 0, 847, 182, 1, 0, 0, 0, 848, 849, 5, 40, 0, 0, 849, 184, 1, 0, 0, 0, 850, 851, 5, 41, 0, 0, 851, 186, 1, 0, 0, 0, 852, 853, 5, 60, 0, 0, 853, 188, 1, 0, 0, 0, 854, 855, 5, 62, 0, 0, 855, 190, 1, 0, 0, 0, 856, 858, 5, 45, 0, 0, 857, 856, 1, 0, 0, 0, 857, 858, 1, 0, 0, 0, 858, 860, 1, 0, 0, 0, 859, 861, 7, 0, 0, 0, 860, 859, 1, 0, 0, 0, 861, 862, 1, 0, 0, 0, 862, 860, 1, 0, 0, 0, 862, 863, 1, 0, 0, 0, 863, 192, 1, 0, 0, 0, 864, 866, 5, 45, 0, 0, 865, 864, 1, 0, 0, 0, 865, 866, 1, 0, 0, 0, 866, 875, 1, 0, 0, 0, 867, 876, 5, 48, 0, 0, 868, 872, 7, 1, 0, 0, 869, 871, 7, 0, 0, 0, 870, 869, 1, 0, 0, 0, 871, 874, 1, 0, 0, 0, 872, 870, 1, 0, 0, 0, 872, 873, 1, 0, 0, 0, 873, 876, 1, 0, 0, 0, 874, 872, 1, 0, 0, 0, 875, 867, 1, 0, 0, 0, 875, 868, 1, 0, 0, 0, 876, 883, 1, 0, 0, 0, 877, 879, 5, 46, 0, 0, 878, 880, 7, 0, 0, 0, 879, 878, 1, 0, 0, 0, 880, 881, 1, 0, 0, 0, 881, 879, 1, 0, 0, 0, 881, 882, 1, 0, 0, 0, 882, 884, 1, 0, 0, 0, 883, 877, 1, 0, 0, 0, 883, 884, 1, 0, 0, 0, 884, 894, 1, 0, 0, 0, 885, 887, 7, 2, 0, 0, 886, 888, 7, 3, 0, 0, 887, 886, 1, 0, 0, 0, 887, 888, 1, 0, 0, 0, 888, 890, 1, 0, 0, 0, 889, 891, 7, 0, 0, 0, 890, 889, 1, 0, 0, 0, 891, 892, 1, 0, 0, 0, 892, 890, 1, 0, 0, 0, 892, 893, 1, 0, 0, 0, 893, 895, 1, 0, 0, 0, 894, 885, 1, 0, 0, 0, 894, 895, 1, 0, 0, 0, 895, 194, 1, 0, 0, 0, 896, 900, 7, 4, 0, 0, 897, 899, 7, 5, 0, 0, 898, 897, 1, 0, 0, 0, 899, 902, 1, 0, 0, 0, 900, 898, 1, 0, 0, 0, 900, 901, 1, 0, 0, 0, 901, 196, 1, 0, 0, 0, 902, 900, 1, 0, 0, 0, 903, 908, 5, 34, 0, 0, 904, 907, 3, 199, 99, 0, 905, 907, 8, 6, 0, 0, 906, 904, 1, 0, 0, 0, 906, 905, 1, 0, 0, 0, 907, 910, 1, 0, 0, 0, 908, 906, 1, 0, 0, 0, 908, 909, 1, 0, 0, 0, 909, 911, 1, 0, 0, 0, 910, 908, 1, 0, 0, 0, 911, 912, 5, 34, 0, 0, 912, 198, 1, 0, 0, 0, 913, 921, 5, 92, 0, 0, 914, 922, 7, 7, 0, 0, 915, 916, 5, 117, 0, 0, 916, 917, 3, 201, 100, 0, 917, 918, 3, 201, 100, 0, 918, 919, 3, 201, 100, 0, 919, 920, 3, 201, 100, 0, 920, 922, 1, 0, 0, 0, 921, 914, 1, 0, 0, 0, 921, 915, 1, 0, 0, 0, 922, 200, 1, 0, 0, 0, 923, 924, 7, 8, 0, 0, 924, 202, 1, 0, 0, 0, 925, 926, 5, 47, 0, 0, 926, 927, 5, 47, 0, 0, 927, 931, 1, 0, 0, 0, 928, 930, 8, 9, 0, 0, 929, 928, 1, 0, 0, 0, 930, 933, 1, 0, 0, 0, 931, 929, 1, 0, 0, 0, 931, 932, 1, 0, 0, 0, 932, 934, 1, 0, 0, 0, 933, 931, 1, 0, 0, 0, 934, 935, 6, 101, 0, 0, 935, 204, 1, 0, 0, 0, 936, 937, 5, 47, 0, 0, 937, 938, 5, 42, 0, 0, 938, 942, 1, 0, 0, 0, 939, 941, 9, 0, 0, 0, 940, 939, 1, 0, 0, 0, 941, 944, 1, 0, 0, 0, 942, 943, 1, 0, 0, 0, 942, 940, 1, 0, 0, 0, 943, 945, 1, 0, 0, 0, 944, 942, 1, 0, 0, 0, 945, 946, 5, 42, 0, 0, 946, 947, 5, 47, 0, 0, 947, 948, 1, 0, 0, 0, 948, 949, 6, 102, 0, 0, 949, 206, 1, 0, 0, 0, 950, 952, 7, 10, 0, 0, 951, 950, 1, 0, 0, 0, 952, 953, 1, 0, 0, 0, 953, 951, 1, 0, 0, 0, 953, 954, 1, 0, 0, 0, 954, 955, 1, 0, 0, 0, 955, 956, 6, 103, 0, 0, 956, 208, 1, 0, 0, 0, 18, 0, 857, 862, 865, 872, 875, 881, 883, 887, 892, 894, 900, 906, 908, 921, 931, 942, 953, 1, 6, 0, 0] \ No newline at end of file +[4, 0, 104, 976, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 86, 1, 86, 1, 87, 1, 87, 1, 88, 1, 88, 1, 89, 1, 89, 1, 90, 1, 90, 1, 91, 1, 91, 1, 92, 1, 92, 1, 93, 1, 93, 1, 94, 1, 94, 1, 95, 1, 95, 1, 96, 1, 96, 1, 97, 3, 97, 877, 8, 97, 1, 97, 4, 97, 880, 8, 97, 11, 97, 12, 97, 881, 1, 98, 3, 98, 885, 8, 98, 1, 98, 1, 98, 1, 98, 5, 98, 890, 8, 98, 10, 98, 12, 98, 893, 9, 98, 3, 98, 895, 8, 98, 1, 98, 1, 98, 4, 98, 899, 8, 98, 11, 98, 12, 98, 900, 3, 98, 903, 8, 98, 1, 98, 1, 98, 3, 98, 907, 8, 98, 1, 98, 4, 98, 910, 8, 98, 11, 98, 12, 98, 911, 3, 98, 914, 8, 98, 1, 99, 1, 99, 5, 99, 918, 8, 99, 10, 99, 12, 99, 921, 9, 99, 1, 100, 1, 100, 1, 100, 5, 100, 926, 8, 100, 10, 100, 12, 100, 929, 9, 100, 1, 100, 1, 100, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 3, 101, 941, 8, 101, 1, 102, 1, 102, 1, 103, 1, 103, 1, 103, 1, 103, 5, 103, 949, 8, 103, 10, 103, 12, 103, 952, 9, 103, 1, 103, 1, 103, 1, 104, 1, 104, 1, 104, 1, 104, 5, 104, 960, 8, 104, 10, 104, 12, 104, 963, 9, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 105, 4, 105, 971, 8, 105, 11, 105, 12, 105, 972, 1, 105, 1, 105, 1, 961, 0, 106, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 29, 59, 30, 61, 31, 63, 32, 65, 33, 67, 34, 69, 35, 71, 36, 73, 37, 75, 38, 77, 39, 79, 40, 81, 41, 83, 42, 85, 43, 87, 44, 89, 45, 91, 46, 93, 47, 95, 48, 97, 49, 99, 50, 101, 51, 103, 52, 105, 53, 107, 54, 109, 55, 111, 56, 113, 57, 115, 58, 117, 59, 119, 60, 121, 61, 123, 62, 125, 63, 127, 64, 129, 65, 131, 66, 133, 67, 135, 68, 137, 69, 139, 70, 141, 71, 143, 72, 145, 73, 147, 74, 149, 75, 151, 76, 153, 77, 155, 78, 157, 79, 159, 80, 161, 81, 163, 82, 165, 83, 167, 84, 169, 85, 171, 86, 173, 87, 175, 88, 177, 89, 179, 90, 181, 91, 183, 92, 185, 93, 187, 94, 189, 95, 191, 96, 193, 97, 195, 98, 197, 99, 199, 100, 201, 101, 203, 0, 205, 0, 207, 102, 209, 103, 211, 104, 1, 0, 11, 1, 0, 48, 57, 1, 0, 49, 57, 2, 0, 69, 69, 101, 101, 2, 0, 43, 43, 45, 45, 3, 0, 65, 90, 95, 95, 97, 122, 4, 0, 48, 57, 65, 90, 95, 95, 97, 122, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 8, 0, 34, 34, 47, 47, 92, 92, 98, 98, 102, 102, 110, 110, 114, 114, 116, 116, 3, 0, 48, 57, 65, 70, 97, 102, 2, 0, 10, 10, 13, 13, 3, 0, 9, 10, 13, 13, 32, 32, 990, 0, 1, 1, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, 0, 0, 45, 1, 0, 0, 0, 0, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 53, 1, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 57, 1, 0, 0, 0, 0, 59, 1, 0, 0, 0, 0, 61, 1, 0, 0, 0, 0, 63, 1, 0, 0, 0, 0, 65, 1, 0, 0, 0, 0, 67, 1, 0, 0, 0, 0, 69, 1, 0, 0, 0, 0, 71, 1, 0, 0, 0, 0, 73, 1, 0, 0, 0, 0, 75, 1, 0, 0, 0, 0, 77, 1, 0, 0, 0, 0, 79, 1, 0, 0, 0, 0, 81, 1, 0, 0, 0, 0, 83, 1, 0, 0, 0, 0, 85, 1, 0, 0, 0, 0, 87, 1, 0, 0, 0, 0, 89, 1, 0, 0, 0, 0, 91, 1, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 95, 1, 0, 0, 0, 0, 97, 1, 0, 0, 0, 0, 99, 1, 0, 0, 0, 0, 101, 1, 0, 0, 0, 0, 103, 1, 0, 0, 0, 0, 105, 1, 0, 0, 0, 0, 107, 1, 0, 0, 0, 0, 109, 1, 0, 0, 0, 0, 111, 1, 0, 0, 0, 0, 113, 1, 0, 0, 0, 0, 115, 1, 0, 0, 0, 0, 117, 1, 0, 0, 0, 0, 119, 1, 0, 0, 0, 0, 121, 1, 0, 0, 0, 0, 123, 1, 0, 0, 0, 0, 125, 1, 0, 0, 0, 0, 127, 1, 0, 0, 0, 0, 129, 1, 0, 0, 0, 0, 131, 1, 0, 0, 0, 0, 133, 1, 0, 0, 0, 0, 135, 1, 0, 0, 0, 0, 137, 1, 0, 0, 0, 0, 139, 1, 0, 0, 0, 0, 141, 1, 0, 0, 0, 0, 143, 1, 0, 0, 0, 0, 145, 1, 0, 0, 0, 0, 147, 1, 0, 0, 0, 0, 149, 1, 0, 0, 0, 0, 151, 1, 0, 0, 0, 0, 153, 1, 0, 0, 0, 0, 155, 1, 0, 0, 0, 0, 157, 1, 0, 0, 0, 0, 159, 1, 0, 0, 0, 0, 161, 1, 0, 0, 0, 0, 163, 1, 0, 0, 0, 0, 165, 1, 0, 0, 0, 0, 167, 1, 0, 0, 0, 0, 169, 1, 0, 0, 0, 0, 171, 1, 0, 0, 0, 0, 173, 1, 0, 0, 0, 0, 175, 1, 0, 0, 0, 0, 177, 1, 0, 0, 0, 0, 179, 1, 0, 0, 0, 0, 181, 1, 0, 0, 0, 0, 183, 1, 0, 0, 0, 0, 185, 1, 0, 0, 0, 0, 187, 1, 0, 0, 0, 0, 189, 1, 0, 0, 0, 0, 191, 1, 0, 0, 0, 0, 193, 1, 0, 0, 0, 0, 195, 1, 0, 0, 0, 0, 197, 1, 0, 0, 0, 0, 199, 1, 0, 0, 0, 0, 201, 1, 0, 0, 0, 0, 207, 1, 0, 0, 0, 0, 209, 1, 0, 0, 0, 0, 211, 1, 0, 0, 0, 1, 213, 1, 0, 0, 0, 3, 223, 1, 0, 0, 0, 5, 232, 1, 0, 0, 0, 7, 239, 1, 0, 0, 0, 9, 248, 1, 0, 0, 0, 11, 253, 1, 0, 0, 0, 13, 263, 1, 0, 0, 0, 15, 274, 1, 0, 0, 0, 17, 282, 1, 0, 0, 0, 19, 288, 1, 0, 0, 0, 21, 297, 1, 0, 0, 0, 23, 307, 1, 0, 0, 0, 25, 316, 1, 0, 0, 0, 27, 328, 1, 0, 0, 0, 29, 339, 1, 0, 0, 0, 31, 345, 1, 0, 0, 0, 33, 353, 1, 0, 0, 0, 35, 356, 1, 0, 0, 0, 37, 361, 1, 0, 0, 0, 39, 364, 1, 0, 0, 0, 41, 372, 1, 0, 0, 0, 43, 379, 1, 0, 0, 0, 45, 385, 1, 0, 0, 0, 47, 390, 1, 0, 0, 0, 49, 401, 1, 0, 0, 0, 51, 406, 1, 0, 0, 0, 53, 412, 1, 0, 0, 0, 55, 416, 1, 0, 0, 0, 57, 428, 1, 0, 0, 0, 59, 431, 1, 0, 0, 0, 61, 438, 1, 0, 0, 0, 63, 441, 1, 0, 0, 0, 65, 448, 1, 0, 0, 0, 67, 456, 1, 0, 0, 0, 69, 463, 1, 0, 0, 0, 71, 474, 1, 0, 0, 0, 73, 481, 1, 0, 0, 0, 75, 490, 1, 0, 0, 0, 77, 493, 1, 0, 0, 0, 79, 497, 1, 0, 0, 0, 81, 502, 1, 0, 0, 0, 83, 508, 1, 0, 0, 0, 85, 517, 1, 0, 0, 0, 87, 526, 1, 0, 0, 0, 89, 530, 1, 0, 0, 0, 91, 534, 1, 0, 0, 0, 93, 538, 1, 0, 0, 0, 95, 544, 1, 0, 0, 0, 97, 550, 1, 0, 0, 0, 99, 555, 1, 0, 0, 0, 101, 560, 1, 0, 0, 0, 103, 566, 1, 0, 0, 0, 105, 574, 1, 0, 0, 0, 107, 582, 1, 0, 0, 0, 109, 593, 1, 0, 0, 0, 111, 598, 1, 0, 0, 0, 113, 610, 1, 0, 0, 0, 115, 621, 1, 0, 0, 0, 117, 631, 1, 0, 0, 0, 119, 643, 1, 0, 0, 0, 121, 663, 1, 0, 0, 0, 123, 668, 1, 0, 0, 0, 125, 681, 1, 0, 0, 0, 127, 693, 1, 0, 0, 0, 129, 705, 1, 0, 0, 0, 131, 710, 1, 0, 0, 0, 133, 718, 1, 0, 0, 0, 135, 723, 1, 0, 0, 0, 137, 736, 1, 0, 0, 0, 139, 744, 1, 0, 0, 0, 141, 753, 1, 0, 0, 0, 143, 767, 1, 0, 0, 0, 145, 776, 1, 0, 0, 0, 147, 781, 1, 0, 0, 0, 149, 786, 1, 0, 0, 0, 151, 792, 1, 0, 0, 0, 153, 799, 1, 0, 0, 0, 155, 805, 1, 0, 0, 0, 157, 811, 1, 0, 0, 0, 159, 818, 1, 0, 0, 0, 161, 825, 1, 0, 0, 0, 163, 832, 1, 0, 0, 0, 165, 837, 1, 0, 0, 0, 167, 843, 1, 0, 0, 0, 169, 848, 1, 0, 0, 0, 171, 851, 1, 0, 0, 0, 173, 853, 1, 0, 0, 0, 175, 855, 1, 0, 0, 0, 177, 857, 1, 0, 0, 0, 179, 859, 1, 0, 0, 0, 181, 861, 1, 0, 0, 0, 183, 863, 1, 0, 0, 0, 185, 865, 1, 0, 0, 0, 187, 867, 1, 0, 0, 0, 189, 869, 1, 0, 0, 0, 191, 871, 1, 0, 0, 0, 193, 873, 1, 0, 0, 0, 195, 876, 1, 0, 0, 0, 197, 884, 1, 0, 0, 0, 199, 915, 1, 0, 0, 0, 201, 922, 1, 0, 0, 0, 203, 932, 1, 0, 0, 0, 205, 942, 1, 0, 0, 0, 207, 944, 1, 0, 0, 0, 209, 955, 1, 0, 0, 0, 211, 970, 1, 0, 0, 0, 213, 214, 5, 119, 0, 0, 214, 215, 5, 111, 0, 0, 215, 216, 5, 114, 0, 0, 216, 217, 5, 107, 0, 0, 217, 218, 5, 115, 0, 0, 218, 219, 5, 112, 0, 0, 219, 220, 5, 97, 0, 0, 220, 221, 5, 99, 0, 0, 221, 222, 5, 101, 0, 0, 222, 2, 1, 0, 0, 0, 223, 224, 5, 102, 0, 0, 224, 225, 5, 114, 0, 0, 225, 226, 5, 97, 0, 0, 226, 227, 5, 103, 0, 0, 227, 228, 5, 109, 0, 0, 228, 229, 5, 101, 0, 0, 229, 230, 5, 110, 0, 0, 230, 231, 5, 116, 0, 0, 231, 4, 1, 0, 0, 0, 232, 233, 5, 105, 0, 0, 233, 234, 5, 109, 0, 0, 234, 235, 5, 112, 0, 0, 235, 236, 5, 111, 0, 0, 236, 237, 5, 114, 0, 0, 237, 238, 5, 116, 0, 0, 238, 6, 1, 0, 0, 0, 239, 240, 5, 101, 0, 0, 240, 241, 5, 120, 0, 0, 241, 242, 5, 116, 0, 0, 242, 243, 5, 101, 0, 0, 243, 244, 5, 114, 0, 0, 244, 245, 5, 110, 0, 0, 245, 246, 5, 97, 0, 0, 246, 247, 5, 108, 0, 0, 247, 8, 1, 0, 0, 0, 248, 249, 5, 97, 0, 0, 249, 250, 5, 116, 0, 0, 250, 251, 5, 111, 0, 0, 251, 252, 5, 109, 0, 0, 252, 10, 1, 0, 0, 0, 253, 254, 5, 105, 0, 0, 254, 255, 5, 110, 0, 0, 255, 256, 5, 116, 0, 0, 256, 257, 5, 101, 0, 0, 257, 258, 5, 114, 0, 0, 258, 259, 5, 102, 0, 0, 259, 260, 5, 97, 0, 0, 260, 261, 5, 99, 0, 0, 261, 262, 5, 101, 0, 0, 262, 12, 1, 0, 0, 0, 263, 264, 5, 105, 0, 0, 264, 265, 5, 110, 0, 0, 265, 266, 5, 116, 0, 0, 266, 267, 5, 101, 0, 0, 267, 268, 5, 114, 0, 0, 268, 269, 5, 102, 0, 0, 269, 270, 5, 97, 0, 0, 270, 271, 5, 99, 0, 0, 271, 272, 5, 101, 0, 0, 272, 273, 5, 115, 0, 0, 273, 14, 1, 0, 0, 0, 274, 275, 5, 112, 0, 0, 275, 276, 5, 97, 0, 0, 276, 277, 5, 99, 0, 0, 277, 278, 5, 107, 0, 0, 278, 279, 5, 97, 0, 0, 279, 280, 5, 103, 0, 0, 280, 281, 5, 101, 0, 0, 281, 16, 1, 0, 0, 0, 282, 283, 5, 118, 0, 0, 283, 284, 5, 97, 0, 0, 284, 285, 5, 108, 0, 0, 285, 286, 5, 117, 0, 0, 286, 287, 5, 101, 0, 0, 287, 18, 1, 0, 0, 0, 288, 289, 5, 114, 0, 0, 289, 290, 5, 101, 0, 0, 290, 291, 5, 108, 0, 0, 291, 292, 5, 97, 0, 0, 292, 293, 5, 116, 0, 0, 293, 294, 5, 105, 0, 0, 294, 295, 5, 111, 0, 0, 295, 296, 5, 110, 0, 0, 296, 20, 1, 0, 0, 0, 297, 298, 5, 111, 0, 0, 298, 299, 5, 112, 0, 0, 299, 300, 5, 101, 0, 0, 300, 301, 5, 114, 0, 0, 301, 302, 5, 97, 0, 0, 302, 303, 5, 116, 0, 0, 303, 304, 5, 105, 0, 0, 304, 305, 5, 111, 0, 0, 305, 306, 5, 110, 0, 0, 306, 22, 1, 0, 0, 0, 307, 308, 5, 102, 0, 0, 308, 309, 5, 117, 0, 0, 309, 310, 5, 110, 0, 0, 310, 311, 5, 99, 0, 0, 311, 312, 5, 116, 0, 0, 312, 313, 5, 105, 0, 0, 313, 314, 5, 111, 0, 0, 314, 315, 5, 110, 0, 0, 315, 24, 1, 0, 0, 0, 316, 317, 5, 99, 0, 0, 317, 318, 5, 111, 0, 0, 318, 319, 5, 110, 0, 0, 319, 320, 5, 115, 0, 0, 320, 321, 5, 116, 0, 0, 321, 322, 5, 114, 0, 0, 322, 323, 5, 117, 0, 0, 323, 324, 5, 99, 0, 0, 324, 325, 5, 116, 0, 0, 325, 326, 5, 111, 0, 0, 326, 327, 5, 114, 0, 0, 327, 26, 1, 0, 0, 0, 328, 329, 5, 99, 0, 0, 329, 330, 5, 111, 0, 0, 330, 331, 5, 110, 0, 0, 331, 332, 5, 115, 0, 0, 332, 333, 5, 116, 0, 0, 333, 334, 5, 114, 0, 0, 334, 335, 5, 117, 0, 0, 335, 336, 5, 99, 0, 0, 336, 337, 5, 116, 0, 0, 337, 338, 5, 115, 0, 0, 338, 28, 1, 0, 0, 0, 339, 340, 5, 105, 0, 0, 340, 341, 5, 110, 0, 0, 341, 342, 5, 112, 0, 0, 342, 343, 5, 117, 0, 0, 343, 344, 5, 116, 0, 0, 344, 30, 1, 0, 0, 0, 345, 346, 5, 99, 0, 0, 346, 347, 5, 111, 0, 0, 347, 348, 5, 110, 0, 0, 348, 349, 5, 102, 0, 0, 349, 350, 5, 111, 0, 0, 350, 351, 5, 114, 0, 0, 351, 352, 5, 109, 0, 0, 352, 32, 1, 0, 0, 0, 353, 354, 5, 97, 0, 0, 354, 355, 5, 115, 0, 0, 355, 34, 1, 0, 0, 0, 356, 357, 5, 98, 0, 0, 357, 358, 5, 105, 0, 0, 358, 359, 5, 110, 0, 0, 359, 360, 5, 100, 0, 0, 360, 36, 1, 0, 0, 0, 361, 362, 5, 116, 0, 0, 362, 363, 5, 111, 0, 0, 363, 38, 1, 0, 0, 0, 364, 365, 5, 112, 0, 0, 365, 366, 5, 114, 0, 0, 366, 367, 5, 105, 0, 0, 367, 368, 5, 118, 0, 0, 368, 369, 5, 97, 0, 0, 369, 370, 5, 116, 0, 0, 370, 371, 5, 101, 0, 0, 371, 40, 1, 0, 0, 0, 372, 373, 5, 115, 0, 0, 373, 374, 5, 104, 0, 0, 374, 375, 5, 97, 0, 0, 375, 376, 5, 114, 0, 0, 376, 377, 5, 101, 0, 0, 377, 378, 5, 100, 0, 0, 378, 42, 1, 0, 0, 0, 379, 380, 5, 115, 0, 0, 380, 381, 5, 116, 0, 0, 381, 382, 5, 97, 0, 0, 382, 383, 5, 116, 0, 0, 383, 384, 5, 101, 0, 0, 384, 44, 1, 0, 0, 0, 385, 386, 5, 101, 0, 0, 386, 387, 5, 100, 0, 0, 387, 388, 5, 103, 0, 0, 388, 389, 5, 101, 0, 0, 389, 46, 1, 0, 0, 0, 390, 391, 5, 112, 0, 0, 391, 392, 5, 114, 0, 0, 392, 393, 5, 111, 0, 0, 393, 394, 5, 106, 0, 0, 394, 395, 5, 101, 0, 0, 395, 396, 5, 99, 0, 0, 396, 397, 5, 116, 0, 0, 397, 398, 5, 105, 0, 0, 398, 399, 5, 111, 0, 0, 399, 400, 5, 110, 0, 0, 400, 48, 1, 0, 0, 0, 401, 402, 5, 119, 0, 0, 402, 403, 5, 105, 0, 0, 403, 404, 5, 116, 0, 0, 404, 405, 5, 104, 0, 0, 405, 50, 1, 0, 0, 0, 406, 407, 5, 117, 0, 0, 407, 408, 5, 115, 0, 0, 408, 409, 5, 105, 0, 0, 409, 410, 5, 110, 0, 0, 410, 411, 5, 103, 0, 0, 411, 52, 1, 0, 0, 0, 412, 413, 5, 118, 0, 0, 413, 414, 5, 105, 0, 0, 414, 415, 5, 97, 0, 0, 415, 54, 1, 0, 0, 0, 416, 417, 5, 109, 0, 0, 417, 418, 5, 97, 0, 0, 418, 419, 5, 116, 0, 0, 419, 420, 5, 101, 0, 0, 420, 421, 5, 114, 0, 0, 421, 422, 5, 105, 0, 0, 422, 423, 5, 97, 0, 0, 423, 424, 5, 108, 0, 0, 424, 425, 5, 105, 0, 0, 425, 426, 5, 122, 0, 0, 426, 427, 5, 101, 0, 0, 427, 56, 1, 0, 0, 0, 428, 429, 5, 105, 0, 0, 429, 430, 5, 102, 0, 0, 430, 58, 1, 0, 0, 0, 431, 432, 5, 97, 0, 0, 432, 433, 5, 98, 0, 0, 433, 434, 5, 115, 0, 0, 434, 435, 5, 101, 0, 0, 435, 436, 5, 110, 0, 0, 436, 437, 5, 116, 0, 0, 437, 60, 1, 0, 0, 0, 438, 439, 5, 111, 0, 0, 439, 440, 5, 110, 0, 0, 440, 62, 1, 0, 0, 0, 441, 442, 5, 112, 0, 0, 442, 443, 5, 111, 0, 0, 443, 444, 5, 108, 0, 0, 444, 445, 5, 105, 0, 0, 445, 446, 5, 99, 0, 0, 446, 447, 5, 121, 0, 0, 447, 64, 1, 0, 0, 0, 448, 449, 5, 100, 0, 0, 449, 450, 5, 101, 0, 0, 450, 451, 5, 102, 0, 0, 451, 452, 5, 97, 0, 0, 452, 453, 5, 117, 0, 0, 453, 454, 5, 108, 0, 0, 454, 455, 5, 116, 0, 0, 455, 66, 1, 0, 0, 0, 456, 457, 5, 115, 0, 0, 457, 458, 5, 111, 0, 0, 458, 459, 5, 117, 0, 0, 459, 460, 5, 114, 0, 0, 460, 461, 5, 99, 0, 0, 461, 462, 5, 101, 0, 0, 462, 68, 1, 0, 0, 0, 463, 464, 5, 114, 0, 0, 464, 465, 5, 101, 0, 0, 465, 466, 5, 112, 0, 0, 466, 467, 5, 111, 0, 0, 467, 468, 5, 115, 0, 0, 468, 469, 5, 105, 0, 0, 469, 470, 5, 116, 0, 0, 470, 471, 5, 111, 0, 0, 471, 472, 5, 114, 0, 0, 472, 473, 5, 121, 0, 0, 473, 70, 1, 0, 0, 0, 474, 475, 5, 99, 0, 0, 475, 476, 5, 111, 0, 0, 476, 477, 5, 109, 0, 0, 477, 478, 5, 109, 0, 0, 478, 479, 5, 105, 0, 0, 479, 480, 5, 116, 0, 0, 480, 72, 1, 0, 0, 0, 481, 482, 5, 114, 0, 0, 482, 483, 5, 101, 0, 0, 483, 484, 5, 118, 0, 0, 484, 485, 5, 105, 0, 0, 485, 486, 5, 115, 0, 0, 486, 487, 5, 105, 0, 0, 487, 488, 5, 111, 0, 0, 488, 489, 5, 110, 0, 0, 489, 74, 1, 0, 0, 0, 490, 491, 5, 105, 0, 0, 491, 492, 5, 100, 0, 0, 492, 76, 1, 0, 0, 0, 493, 494, 5, 100, 0, 0, 494, 495, 5, 111, 0, 0, 495, 496, 5, 99, 0, 0, 496, 78, 1, 0, 0, 0, 497, 498, 5, 109, 0, 0, 498, 499, 5, 111, 0, 0, 499, 500, 5, 100, 0, 0, 500, 501, 5, 101, 0, 0, 501, 80, 1, 0, 0, 0, 502, 503, 5, 101, 0, 0, 503, 504, 5, 109, 0, 0, 504, 505, 5, 105, 0, 0, 505, 506, 5, 116, 0, 0, 506, 507, 5, 115, 0, 0, 507, 82, 1, 0, 0, 0, 508, 509, 5, 114, 0, 0, 509, 510, 5, 101, 0, 0, 510, 511, 5, 99, 0, 0, 511, 512, 5, 101, 0, 0, 512, 513, 5, 105, 0, 0, 513, 514, 5, 118, 0, 0, 514, 515, 5, 101, 0, 0, 515, 516, 5, 114, 0, 0, 516, 84, 1, 0, 0, 0, 517, 518, 5, 114, 0, 0, 518, 519, 5, 101, 0, 0, 519, 520, 5, 113, 0, 0, 520, 521, 5, 117, 0, 0, 521, 522, 5, 105, 0, 0, 522, 523, 5, 114, 0, 0, 523, 524, 5, 101, 0, 0, 524, 525, 5, 115, 0, 0, 525, 86, 1, 0, 0, 0, 526, 527, 5, 97, 0, 0, 527, 528, 5, 110, 0, 0, 528, 529, 5, 121, 0, 0, 529, 88, 1, 0, 0, 0, 530, 531, 5, 103, 0, 0, 531, 532, 5, 101, 0, 0, 532, 533, 5, 116, 0, 0, 533, 90, 1, 0, 0, 0, 534, 535, 5, 115, 0, 0, 535, 536, 5, 101, 0, 0, 536, 537, 5, 116, 0, 0, 537, 92, 1, 0, 0, 0, 538, 539, 5, 119, 0, 0, 539, 540, 5, 97, 0, 0, 540, 541, 5, 116, 0, 0, 541, 542, 5, 99, 0, 0, 542, 543, 5, 104, 0, 0, 543, 94, 1, 0, 0, 0, 544, 545, 5, 115, 0, 0, 545, 546, 5, 116, 0, 0, 546, 547, 5, 97, 0, 0, 547, 548, 5, 114, 0, 0, 548, 549, 5, 116, 0, 0, 549, 96, 1, 0, 0, 0, 550, 551, 5, 115, 0, 0, 551, 552, 5, 116, 0, 0, 552, 553, 5, 111, 0, 0, 553, 554, 5, 112, 0, 0, 554, 98, 1, 0, 0, 0, 555, 556, 5, 114, 0, 0, 556, 557, 5, 101, 0, 0, 557, 558, 5, 97, 0, 0, 558, 559, 5, 100, 0, 0, 559, 100, 1, 0, 0, 0, 560, 561, 5, 119, 0, 0, 561, 562, 5, 114, 0, 0, 562, 563, 5, 105, 0, 0, 563, 564, 5, 116, 0, 0, 564, 565, 5, 101, 0, 0, 565, 102, 1, 0, 0, 0, 566, 567, 5, 114, 0, 0, 567, 568, 5, 101, 0, 0, 568, 569, 5, 115, 0, 0, 569, 570, 5, 111, 0, 0, 570, 571, 5, 108, 0, 0, 571, 572, 5, 118, 0, 0, 572, 573, 5, 101, 0, 0, 573, 104, 1, 0, 0, 0, 574, 575, 5, 99, 0, 0, 575, 576, 5, 111, 0, 0, 576, 577, 5, 110, 0, 0, 577, 578, 5, 110, 0, 0, 578, 579, 5, 101, 0, 0, 579, 580, 5, 99, 0, 0, 580, 581, 5, 116, 0, 0, 581, 106, 1, 0, 0, 0, 582, 583, 5, 100, 0, 0, 583, 584, 5, 105, 0, 0, 584, 585, 5, 115, 0, 0, 585, 586, 5, 99, 0, 0, 586, 587, 5, 111, 0, 0, 587, 588, 5, 110, 0, 0, 588, 589, 5, 110, 0, 0, 589, 590, 5, 101, 0, 0, 590, 591, 5, 99, 0, 0, 591, 592, 5, 116, 0, 0, 592, 108, 1, 0, 0, 0, 593, 594, 5, 99, 0, 0, 594, 595, 5, 97, 0, 0, 595, 596, 5, 108, 0, 0, 596, 597, 5, 108, 0, 0, 597, 110, 1, 0, 0, 0, 598, 599, 5, 119, 0, 0, 599, 600, 5, 97, 0, 0, 600, 601, 5, 116, 0, 0, 601, 602, 5, 99, 0, 0, 602, 603, 5, 104, 0, 0, 603, 604, 5, 45, 0, 0, 604, 605, 5, 115, 0, 0, 605, 606, 5, 116, 0, 0, 606, 607, 5, 97, 0, 0, 607, 608, 5, 114, 0, 0, 608, 609, 5, 116, 0, 0, 609, 112, 1, 0, 0, 0, 610, 611, 5, 119, 0, 0, 611, 612, 5, 97, 0, 0, 612, 613, 5, 116, 0, 0, 613, 614, 5, 99, 0, 0, 614, 615, 5, 104, 0, 0, 615, 616, 5, 45, 0, 0, 616, 617, 5, 115, 0, 0, 617, 618, 5, 116, 0, 0, 618, 619, 5, 111, 0, 0, 619, 620, 5, 112, 0, 0, 620, 114, 1, 0, 0, 0, 621, 622, 5, 115, 0, 0, 622, 623, 5, 117, 0, 0, 623, 624, 5, 98, 0, 0, 624, 625, 5, 115, 0, 0, 625, 626, 5, 99, 0, 0, 626, 627, 5, 114, 0, 0, 627, 628, 5, 105, 0, 0, 628, 629, 5, 98, 0, 0, 629, 630, 5, 101, 0, 0, 630, 116, 1, 0, 0, 0, 631, 632, 5, 117, 0, 0, 632, 633, 5, 110, 0, 0, 633, 634, 5, 115, 0, 0, 634, 635, 5, 117, 0, 0, 635, 636, 5, 98, 0, 0, 636, 637, 5, 115, 0, 0, 637, 638, 5, 99, 0, 0, 638, 639, 5, 114, 0, 0, 639, 640, 5, 105, 0, 0, 640, 641, 5, 98, 0, 0, 641, 642, 5, 101, 0, 0, 642, 118, 1, 0, 0, 0, 643, 644, 5, 111, 0, 0, 644, 645, 5, 112, 0, 0, 645, 646, 5, 116, 0, 0, 646, 647, 5, 105, 0, 0, 647, 648, 5, 109, 0, 0, 648, 649, 5, 105, 0, 0, 649, 650, 5, 115, 0, 0, 650, 651, 5, 116, 0, 0, 651, 652, 5, 105, 0, 0, 652, 653, 5, 99, 0, 0, 653, 654, 5, 45, 0, 0, 654, 655, 5, 114, 0, 0, 655, 656, 5, 101, 0, 0, 656, 657, 5, 103, 0, 0, 657, 658, 5, 105, 0, 0, 658, 659, 5, 115, 0, 0, 659, 660, 5, 116, 0, 0, 660, 661, 5, 101, 0, 0, 661, 662, 5, 114, 0, 0, 662, 120, 1, 0, 0, 0, 663, 664, 5, 99, 0, 0, 664, 665, 5, 114, 0, 0, 665, 666, 5, 100, 0, 0, 666, 667, 5, 116, 0, 0, 667, 122, 1, 0, 0, 0, 668, 669, 5, 111, 0, 0, 669, 670, 5, 112, 0, 0, 670, 671, 5, 116, 0, 0, 671, 672, 5, 105, 0, 0, 672, 673, 5, 111, 0, 0, 673, 674, 5, 110, 0, 0, 674, 675, 5, 97, 0, 0, 675, 676, 5, 108, 0, 0, 676, 677, 5, 45, 0, 0, 677, 678, 5, 111, 0, 0, 678, 679, 5, 110, 0, 0, 679, 680, 5, 101, 0, 0, 680, 124, 1, 0, 0, 0, 681, 682, 5, 101, 0, 0, 682, 683, 5, 120, 0, 0, 683, 684, 5, 97, 0, 0, 684, 685, 5, 99, 0, 0, 685, 686, 5, 116, 0, 0, 686, 687, 5, 108, 0, 0, 687, 688, 5, 121, 0, 0, 688, 689, 5, 45, 0, 0, 689, 690, 5, 111, 0, 0, 690, 691, 5, 110, 0, 0, 691, 692, 5, 101, 0, 0, 692, 126, 1, 0, 0, 0, 693, 694, 5, 109, 0, 0, 694, 695, 5, 97, 0, 0, 695, 696, 5, 110, 0, 0, 696, 697, 5, 121, 0, 0, 697, 698, 5, 45, 0, 0, 698, 699, 5, 117, 0, 0, 699, 700, 5, 110, 0, 0, 700, 701, 5, 105, 0, 0, 701, 702, 5, 113, 0, 0, 702, 703, 5, 117, 0, 0, 703, 704, 5, 101, 0, 0, 704, 128, 1, 0, 0, 0, 705, 706, 5, 109, 0, 0, 706, 707, 5, 97, 0, 0, 707, 708, 5, 110, 0, 0, 708, 709, 5, 121, 0, 0, 709, 130, 1, 0, 0, 0, 710, 711, 5, 111, 0, 0, 711, 712, 5, 114, 0, 0, 712, 713, 5, 100, 0, 0, 713, 714, 5, 101, 0, 0, 714, 715, 5, 114, 0, 0, 715, 716, 5, 101, 0, 0, 716, 717, 5, 100, 0, 0, 717, 132, 1, 0, 0, 0, 718, 719, 5, 117, 0, 0, 719, 720, 5, 110, 0, 0, 720, 721, 5, 105, 0, 0, 721, 722, 5, 116, 0, 0, 722, 134, 1, 0, 0, 0, 723, 724, 5, 119, 0, 0, 724, 725, 5, 97, 0, 0, 725, 726, 5, 116, 0, 0, 726, 727, 5, 99, 0, 0, 727, 728, 5, 104, 0, 0, 728, 729, 5, 45, 0, 0, 729, 730, 5, 104, 0, 0, 730, 731, 5, 97, 0, 0, 731, 732, 5, 110, 0, 0, 732, 733, 5, 100, 0, 0, 733, 734, 5, 108, 0, 0, 734, 735, 5, 101, 0, 0, 735, 136, 1, 0, 0, 0, 736, 737, 5, 109, 0, 0, 737, 738, 5, 101, 0, 0, 738, 739, 5, 115, 0, 0, 739, 740, 5, 115, 0, 0, 740, 741, 5, 97, 0, 0, 741, 742, 5, 103, 0, 0, 742, 743, 5, 101, 0, 0, 743, 138, 1, 0, 0, 0, 744, 745, 5, 97, 0, 0, 745, 746, 5, 116, 0, 0, 746, 747, 5, 111, 0, 0, 747, 748, 5, 109, 0, 0, 748, 749, 5, 45, 0, 0, 749, 750, 5, 114, 0, 0, 750, 751, 5, 101, 0, 0, 751, 752, 5, 102, 0, 0, 752, 140, 1, 0, 0, 0, 753, 754, 5, 105, 0, 0, 754, 755, 5, 110, 0, 0, 755, 756, 5, 116, 0, 0, 756, 757, 5, 101, 0, 0, 757, 758, 5, 114, 0, 0, 758, 759, 5, 102, 0, 0, 759, 760, 5, 97, 0, 0, 760, 761, 5, 99, 0, 0, 761, 762, 5, 101, 0, 0, 762, 763, 5, 45, 0, 0, 763, 764, 5, 114, 0, 0, 764, 765, 5, 101, 0, 0, 765, 766, 5, 102, 0, 0, 766, 142, 1, 0, 0, 0, 767, 768, 5, 111, 0, 0, 768, 769, 5, 112, 0, 0, 769, 770, 5, 116, 0, 0, 770, 771, 5, 105, 0, 0, 771, 772, 5, 111, 0, 0, 772, 773, 5, 110, 0, 0, 773, 774, 5, 97, 0, 0, 774, 775, 5, 108, 0, 0, 775, 144, 1, 0, 0, 0, 776, 777, 5, 108, 0, 0, 777, 778, 5, 105, 0, 0, 778, 779, 5, 115, 0, 0, 779, 780, 5, 116, 0, 0, 780, 146, 1, 0, 0, 0, 781, 782, 5, 98, 0, 0, 782, 783, 5, 111, 0, 0, 783, 784, 5, 111, 0, 0, 784, 785, 5, 108, 0, 0, 785, 148, 1, 0, 0, 0, 786, 787, 5, 98, 0, 0, 787, 788, 5, 121, 0, 0, 788, 789, 5, 116, 0, 0, 789, 790, 5, 101, 0, 0, 790, 791, 5, 115, 0, 0, 791, 150, 1, 0, 0, 0, 792, 793, 5, 100, 0, 0, 793, 794, 5, 111, 0, 0, 794, 795, 5, 117, 0, 0, 795, 796, 5, 98, 0, 0, 796, 797, 5, 108, 0, 0, 797, 798, 5, 101, 0, 0, 798, 152, 1, 0, 0, 0, 799, 800, 5, 105, 0, 0, 800, 801, 5, 110, 0, 0, 801, 802, 5, 116, 0, 0, 802, 803, 5, 51, 0, 0, 803, 804, 5, 50, 0, 0, 804, 154, 1, 0, 0, 0, 805, 806, 5, 105, 0, 0, 806, 807, 5, 110, 0, 0, 807, 808, 5, 116, 0, 0, 808, 809, 5, 54, 0, 0, 809, 810, 5, 52, 0, 0, 810, 156, 1, 0, 0, 0, 811, 812, 5, 115, 0, 0, 812, 813, 5, 116, 0, 0, 813, 814, 5, 114, 0, 0, 814, 815, 5, 105, 0, 0, 815, 816, 5, 110, 0, 0, 816, 817, 5, 103, 0, 0, 817, 158, 1, 0, 0, 0, 818, 819, 5, 117, 0, 0, 819, 820, 5, 105, 0, 0, 820, 821, 5, 110, 0, 0, 821, 822, 5, 116, 0, 0, 822, 823, 5, 51, 0, 0, 823, 824, 5, 50, 0, 0, 824, 160, 1, 0, 0, 0, 825, 826, 5, 117, 0, 0, 826, 827, 5, 105, 0, 0, 827, 828, 5, 110, 0, 0, 828, 829, 5, 116, 0, 0, 829, 830, 5, 54, 0, 0, 830, 831, 5, 52, 0, 0, 831, 162, 1, 0, 0, 0, 832, 833, 5, 116, 0, 0, 833, 834, 5, 114, 0, 0, 834, 835, 5, 117, 0, 0, 835, 836, 5, 101, 0, 0, 836, 164, 1, 0, 0, 0, 837, 838, 5, 102, 0, 0, 838, 839, 5, 97, 0, 0, 839, 840, 5, 108, 0, 0, 840, 841, 5, 115, 0, 0, 841, 842, 5, 101, 0, 0, 842, 166, 1, 0, 0, 0, 843, 844, 5, 110, 0, 0, 844, 845, 5, 117, 0, 0, 845, 846, 5, 108, 0, 0, 846, 847, 5, 108, 0, 0, 847, 168, 1, 0, 0, 0, 848, 849, 5, 45, 0, 0, 849, 850, 5, 62, 0, 0, 850, 170, 1, 0, 0, 0, 851, 852, 5, 58, 0, 0, 852, 172, 1, 0, 0, 0, 853, 854, 5, 59, 0, 0, 854, 174, 1, 0, 0, 0, 855, 856, 5, 44, 0, 0, 856, 176, 1, 0, 0, 0, 857, 858, 5, 46, 0, 0, 858, 178, 1, 0, 0, 0, 859, 860, 5, 123, 0, 0, 860, 180, 1, 0, 0, 0, 861, 862, 5, 125, 0, 0, 862, 182, 1, 0, 0, 0, 863, 864, 5, 91, 0, 0, 864, 184, 1, 0, 0, 0, 865, 866, 5, 93, 0, 0, 866, 186, 1, 0, 0, 0, 867, 868, 5, 40, 0, 0, 868, 188, 1, 0, 0, 0, 869, 870, 5, 41, 0, 0, 870, 190, 1, 0, 0, 0, 871, 872, 5, 60, 0, 0, 872, 192, 1, 0, 0, 0, 873, 874, 5, 62, 0, 0, 874, 194, 1, 0, 0, 0, 875, 877, 5, 45, 0, 0, 876, 875, 1, 0, 0, 0, 876, 877, 1, 0, 0, 0, 877, 879, 1, 0, 0, 0, 878, 880, 7, 0, 0, 0, 879, 878, 1, 0, 0, 0, 880, 881, 1, 0, 0, 0, 881, 879, 1, 0, 0, 0, 881, 882, 1, 0, 0, 0, 882, 196, 1, 0, 0, 0, 883, 885, 5, 45, 0, 0, 884, 883, 1, 0, 0, 0, 884, 885, 1, 0, 0, 0, 885, 894, 1, 0, 0, 0, 886, 895, 5, 48, 0, 0, 887, 891, 7, 1, 0, 0, 888, 890, 7, 0, 0, 0, 889, 888, 1, 0, 0, 0, 890, 893, 1, 0, 0, 0, 891, 889, 1, 0, 0, 0, 891, 892, 1, 0, 0, 0, 892, 895, 1, 0, 0, 0, 893, 891, 1, 0, 0, 0, 894, 886, 1, 0, 0, 0, 894, 887, 1, 0, 0, 0, 895, 902, 1, 0, 0, 0, 896, 898, 5, 46, 0, 0, 897, 899, 7, 0, 0, 0, 898, 897, 1, 0, 0, 0, 899, 900, 1, 0, 0, 0, 900, 898, 1, 0, 0, 0, 900, 901, 1, 0, 0, 0, 901, 903, 1, 0, 0, 0, 902, 896, 1, 0, 0, 0, 902, 903, 1, 0, 0, 0, 903, 913, 1, 0, 0, 0, 904, 906, 7, 2, 0, 0, 905, 907, 7, 3, 0, 0, 906, 905, 1, 0, 0, 0, 906, 907, 1, 0, 0, 0, 907, 909, 1, 0, 0, 0, 908, 910, 7, 0, 0, 0, 909, 908, 1, 0, 0, 0, 910, 911, 1, 0, 0, 0, 911, 909, 1, 0, 0, 0, 911, 912, 1, 0, 0, 0, 912, 914, 1, 0, 0, 0, 913, 904, 1, 0, 0, 0, 913, 914, 1, 0, 0, 0, 914, 198, 1, 0, 0, 0, 915, 919, 7, 4, 0, 0, 916, 918, 7, 5, 0, 0, 917, 916, 1, 0, 0, 0, 918, 921, 1, 0, 0, 0, 919, 917, 1, 0, 0, 0, 919, 920, 1, 0, 0, 0, 920, 200, 1, 0, 0, 0, 921, 919, 1, 0, 0, 0, 922, 927, 5, 34, 0, 0, 923, 926, 3, 203, 101, 0, 924, 926, 8, 6, 0, 0, 925, 923, 1, 0, 0, 0, 925, 924, 1, 0, 0, 0, 926, 929, 1, 0, 0, 0, 927, 925, 1, 0, 0, 0, 927, 928, 1, 0, 0, 0, 928, 930, 1, 0, 0, 0, 929, 927, 1, 0, 0, 0, 930, 931, 5, 34, 0, 0, 931, 202, 1, 0, 0, 0, 932, 940, 5, 92, 0, 0, 933, 941, 7, 7, 0, 0, 934, 935, 5, 117, 0, 0, 935, 936, 3, 205, 102, 0, 936, 937, 3, 205, 102, 0, 937, 938, 3, 205, 102, 0, 938, 939, 3, 205, 102, 0, 939, 941, 1, 0, 0, 0, 940, 933, 1, 0, 0, 0, 940, 934, 1, 0, 0, 0, 941, 204, 1, 0, 0, 0, 942, 943, 7, 8, 0, 0, 943, 206, 1, 0, 0, 0, 944, 945, 5, 47, 0, 0, 945, 946, 5, 47, 0, 0, 946, 950, 1, 0, 0, 0, 947, 949, 8, 9, 0, 0, 948, 947, 1, 0, 0, 0, 949, 952, 1, 0, 0, 0, 950, 948, 1, 0, 0, 0, 950, 951, 1, 0, 0, 0, 951, 953, 1, 0, 0, 0, 952, 950, 1, 0, 0, 0, 953, 954, 6, 103, 0, 0, 954, 208, 1, 0, 0, 0, 955, 956, 5, 47, 0, 0, 956, 957, 5, 42, 0, 0, 957, 961, 1, 0, 0, 0, 958, 960, 9, 0, 0, 0, 959, 958, 1, 0, 0, 0, 960, 963, 1, 0, 0, 0, 961, 962, 1, 0, 0, 0, 961, 959, 1, 0, 0, 0, 962, 964, 1, 0, 0, 0, 963, 961, 1, 0, 0, 0, 964, 965, 5, 42, 0, 0, 965, 966, 5, 47, 0, 0, 966, 967, 1, 0, 0, 0, 967, 968, 6, 104, 0, 0, 968, 210, 1, 0, 0, 0, 969, 971, 7, 10, 0, 0, 970, 969, 1, 0, 0, 0, 971, 972, 1, 0, 0, 0, 972, 970, 1, 0, 0, 0, 972, 973, 1, 0, 0, 0, 973, 974, 1, 0, 0, 0, 974, 975, 6, 105, 0, 0, 975, 212, 1, 0, 0, 0, 18, 0, 876, 881, 884, 891, 894, 900, 902, 906, 911, 913, 919, 925, 927, 940, 950, 961, 972, 1, 0, 1, 0] \ No newline at end of file diff --git a/src/capability-language/generated/QuixosCapabilityLexer.tokens b/src/capability-language/generated/QuixosCapabilityLexer.tokens index a2f4274..d34ee3c 100644 --- a/src/capability-language/generated/QuixosCapabilityLexer.tokens +++ b/src/capability-language/generated/QuixosCapabilityLexer.tokens @@ -1,197 +1,201 @@ WORKSPACE=1 -IMPORT=2 -EXTERNAL=3 -ATOM=4 -INTERFACE=5 -INTERFACES=6 -PACKAGE=7 -VALUE=8 -RELATION=9 -OPERATION=10 -FUNCTION=11 -CONSTRUCTOR=12 -CONSTRUCTS=13 -CONFORM=14 -AS=15 -BIND=16 -TO=17 -PRIVATE=18 -SHARED=19 -STATE=20 -EDGE=21 -PROJECTION=22 -WITH=23 -USING=24 -VIA=25 -MATERIALIZE=26 -IF=27 -ABSENT=28 -ON=29 -POLICY=30 -DEFAULT=31 -SOURCE=32 -REPOSITORY=33 -COMMIT=34 -REVISION=35 -ID=36 -DOC=37 -MODE=38 -EMITS=39 -RECEIVER=40 -REQUIRES=41 -ANY=42 -GET=43 -SET=44 -WATCH=45 -START=46 -STOP=47 -READ=48 -WRITE=49 -RESOLVE=50 -CONNECT=51 -DISCONNECT=52 -CALL=53 -WATCH_START=54 -WATCH_STOP=55 -SUBSCRIBE=56 -UNSUBSCRIBE=57 -OPTIMISTIC_REGISTER=58 -CRDT=59 -OPTIONAL_ONE=60 -EXACTLY_ONE=61 -MANY_UNIQUE=62 -MANY=63 -ORDERED=64 -UNIT=65 -WATCH_HANDLE=66 -MESSAGE=67 -ATOM_REF=68 -INTERFACE_REF=69 -OPTIONAL=70 -LIST=71 -BOOL=72 -BYTES=73 -DOUBLE=74 -INT32=75 -INT64=76 -STRING=77 -UINT32=78 -UINT64=79 -TRUE=80 -FALSE=81 -NULL=82 -ARROW=83 -COLON=84 -SEMI=85 -COMMA=86 -DOT=87 -LBRACE=88 -RBRACE=89 -LBRACK=90 -RBRACK=91 -LPAREN=92 -RPAREN=93 -LT=94 -GT=95 -INTEGER=96 -JSON_NUMBER=97 -IDENTIFIER=98 -STRING_LITERAL=99 -LINE_COMMENT=100 -BLOCK_COMMENT=101 -WS=102 +FRAGMENT=2 +IMPORT=3 +EXTERNAL=4 +ATOM=5 +INTERFACE=6 +INTERFACES=7 +PACKAGE=8 +VALUE=9 +RELATION=10 +OPERATION=11 +FUNCTION=12 +CONSTRUCTOR=13 +CONSTRUCTS=14 +INPUT=15 +CONFORM=16 +AS=17 +BIND=18 +TO=19 +PRIVATE=20 +SHARED=21 +STATE=22 +EDGE=23 +PROJECTION=24 +WITH=25 +USING=26 +VIA=27 +MATERIALIZE=28 +IF=29 +ABSENT=30 +ON=31 +POLICY=32 +DEFAULT=33 +SOURCE=34 +REPOSITORY=35 +COMMIT=36 +REVISION=37 +ID=38 +DOC=39 +MODE=40 +EMITS=41 +RECEIVER=42 +REQUIRES=43 +ANY=44 +GET=45 +SET=46 +WATCH=47 +START=48 +STOP=49 +READ=50 +WRITE=51 +RESOLVE=52 +CONNECT=53 +DISCONNECT=54 +CALL=55 +WATCH_START=56 +WATCH_STOP=57 +SUBSCRIBE=58 +UNSUBSCRIBE=59 +OPTIMISTIC_REGISTER=60 +CRDT=61 +OPTIONAL_ONE=62 +EXACTLY_ONE=63 +MANY_UNIQUE=64 +MANY=65 +ORDERED=66 +UNIT=67 +WATCH_HANDLE=68 +MESSAGE=69 +ATOM_REF=70 +INTERFACE_REF=71 +OPTIONAL=72 +LIST=73 +BOOL=74 +BYTES=75 +DOUBLE=76 +INT32=77 +INT64=78 +STRING=79 +UINT32=80 +UINT64=81 +TRUE=82 +FALSE=83 +NULL=84 +ARROW=85 +COLON=86 +SEMI=87 +COMMA=88 +DOT=89 +LBRACE=90 +RBRACE=91 +LBRACK=92 +RBRACK=93 +LPAREN=94 +RPAREN=95 +LT=96 +GT=97 +INTEGER=98 +JSON_NUMBER=99 +IDENTIFIER=100 +STRING_LITERAL=101 +LINE_COMMENT=102 +BLOCK_COMMENT=103 +WS=104 'workspace'=1 -'import'=2 -'external'=3 -'atom'=4 -'interface'=5 -'interfaces'=6 -'package'=7 -'value'=8 -'relation'=9 -'operation'=10 -'function'=11 -'constructor'=12 -'constructs'=13 -'conform'=14 -'as'=15 -'bind'=16 -'to'=17 -'private'=18 -'shared'=19 -'state'=20 -'edge'=21 -'projection'=22 -'with'=23 -'using'=24 -'via'=25 -'materialize'=26 -'if'=27 -'absent'=28 -'on'=29 -'policy'=30 -'default'=31 -'source'=32 -'repository'=33 -'commit'=34 -'revision'=35 -'id'=36 -'doc'=37 -'mode'=38 -'emits'=39 -'receiver'=40 -'requires'=41 -'any'=42 -'get'=43 -'set'=44 -'watch'=45 -'start'=46 -'stop'=47 -'read'=48 -'write'=49 -'resolve'=50 -'connect'=51 -'disconnect'=52 -'call'=53 -'watch-start'=54 -'watch-stop'=55 -'subscribe'=56 -'unsubscribe'=57 -'optimistic-register'=58 -'crdt'=59 -'optional-one'=60 -'exactly-one'=61 -'many-unique'=62 -'many'=63 -'ordered'=64 -'unit'=65 -'watch-handle'=66 -'message'=67 -'atom-ref'=68 -'interface-ref'=69 -'optional'=70 -'list'=71 -'bool'=72 -'bytes'=73 -'double'=74 -'int32'=75 -'int64'=76 -'string'=77 -'uint32'=78 -'uint64'=79 -'true'=80 -'false'=81 -'null'=82 -'->'=83 -':'=84 -';'=85 -','=86 -'.'=87 -'{'=88 -'}'=89 -'['=90 -']'=91 -'('=92 -')'=93 -'<'=94 -'>'=95 +'fragment'=2 +'import'=3 +'external'=4 +'atom'=5 +'interface'=6 +'interfaces'=7 +'package'=8 +'value'=9 +'relation'=10 +'operation'=11 +'function'=12 +'constructor'=13 +'constructs'=14 +'input'=15 +'conform'=16 +'as'=17 +'bind'=18 +'to'=19 +'private'=20 +'shared'=21 +'state'=22 +'edge'=23 +'projection'=24 +'with'=25 +'using'=26 +'via'=27 +'materialize'=28 +'if'=29 +'absent'=30 +'on'=31 +'policy'=32 +'default'=33 +'source'=34 +'repository'=35 +'commit'=36 +'revision'=37 +'id'=38 +'doc'=39 +'mode'=40 +'emits'=41 +'receiver'=42 +'requires'=43 +'any'=44 +'get'=45 +'set'=46 +'watch'=47 +'start'=48 +'stop'=49 +'read'=50 +'write'=51 +'resolve'=52 +'connect'=53 +'disconnect'=54 +'call'=55 +'watch-start'=56 +'watch-stop'=57 +'subscribe'=58 +'unsubscribe'=59 +'optimistic-register'=60 +'crdt'=61 +'optional-one'=62 +'exactly-one'=63 +'many-unique'=64 +'many'=65 +'ordered'=66 +'unit'=67 +'watch-handle'=68 +'message'=69 +'atom-ref'=70 +'interface-ref'=71 +'optional'=72 +'list'=73 +'bool'=74 +'bytes'=75 +'double'=76 +'int32'=77 +'int64'=78 +'string'=79 +'uint32'=80 +'uint64'=81 +'true'=82 +'false'=83 +'null'=84 +'->'=85 +':'=86 +';'=87 +','=88 +'.'=89 +'{'=90 +'}'=91 +'['=92 +']'=93 +'('=94 +')'=95 +'<'=96 +'>'=97 diff --git a/src/capability-language/generated/QuixosCapabilityLexer.ts b/src/capability-language/generated/QuixosCapabilityLexer.ts index c62675a..f30b433 100644 --- a/src/capability-language/generated/QuixosCapabilityLexer.ts +++ b/src/capability-language/generated/QuixosCapabilityLexer.ts @@ -5,126 +5,128 @@ import { Token } from "antlr4ng"; export class QuixosCapabilityLexer extends antlr.Lexer { public static readonly WORKSPACE = 1; - public static readonly IMPORT = 2; - public static readonly EXTERNAL = 3; - public static readonly ATOM = 4; - public static readonly INTERFACE = 5; - public static readonly INTERFACES = 6; - public static readonly PACKAGE = 7; - public static readonly VALUE = 8; - public static readonly RELATION = 9; - public static readonly OPERATION = 10; - public static readonly FUNCTION = 11; - public static readonly CONSTRUCTOR = 12; - public static readonly CONSTRUCTS = 13; - public static readonly CONFORM = 14; - public static readonly AS = 15; - public static readonly BIND = 16; - public static readonly TO = 17; - public static readonly PRIVATE = 18; - public static readonly SHARED = 19; - public static readonly STATE = 20; - public static readonly EDGE = 21; - public static readonly PROJECTION = 22; - public static readonly WITH = 23; - public static readonly USING = 24; - public static readonly VIA = 25; - public static readonly MATERIALIZE = 26; - public static readonly IF = 27; - public static readonly ABSENT = 28; - public static readonly ON = 29; - public static readonly POLICY = 30; - public static readonly DEFAULT = 31; - public static readonly SOURCE = 32; - public static readonly REPOSITORY = 33; - public static readonly COMMIT = 34; - public static readonly REVISION = 35; - public static readonly ID = 36; - public static readonly DOC = 37; - public static readonly MODE = 38; - public static readonly EMITS = 39; - public static readonly RECEIVER = 40; - public static readonly REQUIRES = 41; - public static readonly ANY = 42; - public static readonly GET = 43; - public static readonly SET = 44; - public static readonly WATCH = 45; - public static readonly START = 46; - public static readonly STOP = 47; - public static readonly READ = 48; - public static readonly WRITE = 49; - public static readonly RESOLVE = 50; - public static readonly CONNECT = 51; - public static readonly DISCONNECT = 52; - public static readonly CALL = 53; - public static readonly WATCH_START = 54; - public static readonly WATCH_STOP = 55; - public static readonly SUBSCRIBE = 56; - public static readonly UNSUBSCRIBE = 57; - public static readonly OPTIMISTIC_REGISTER = 58; - public static readonly CRDT = 59; - public static readonly OPTIONAL_ONE = 60; - public static readonly EXACTLY_ONE = 61; - public static readonly MANY_UNIQUE = 62; - public static readonly MANY = 63; - public static readonly ORDERED = 64; - public static readonly UNIT = 65; - public static readonly WATCH_HANDLE = 66; - public static readonly MESSAGE = 67; - public static readonly ATOM_REF = 68; - public static readonly INTERFACE_REF = 69; - public static readonly OPTIONAL = 70; - public static readonly LIST = 71; - public static readonly BOOL = 72; - public static readonly BYTES = 73; - public static readonly DOUBLE = 74; - public static readonly INT32 = 75; - public static readonly INT64 = 76; - public static readonly STRING = 77; - public static readonly UINT32 = 78; - public static readonly UINT64 = 79; - public static readonly TRUE = 80; - public static readonly FALSE = 81; - public static readonly NULL = 82; - public static readonly ARROW = 83; - public static readonly COLON = 84; - public static readonly SEMI = 85; - public static readonly COMMA = 86; - public static readonly DOT = 87; - public static readonly LBRACE = 88; - public static readonly RBRACE = 89; - public static readonly LBRACK = 90; - public static readonly RBRACK = 91; - public static readonly LPAREN = 92; - public static readonly RPAREN = 93; - public static readonly LT = 94; - public static readonly GT = 95; - public static readonly INTEGER = 96; - public static readonly JSON_NUMBER = 97; - public static readonly IDENTIFIER = 98; - public static readonly STRING_LITERAL = 99; - public static readonly LINE_COMMENT = 100; - public static readonly BLOCK_COMMENT = 101; - public static readonly WS = 102; + public static readonly FRAGMENT = 2; + public static readonly IMPORT = 3; + public static readonly EXTERNAL = 4; + public static readonly ATOM = 5; + public static readonly INTERFACE = 6; + public static readonly INTERFACES = 7; + public static readonly PACKAGE = 8; + public static readonly VALUE = 9; + public static readonly RELATION = 10; + public static readonly OPERATION = 11; + public static readonly FUNCTION = 12; + public static readonly CONSTRUCTOR = 13; + public static readonly CONSTRUCTS = 14; + public static readonly INPUT = 15; + public static readonly CONFORM = 16; + public static readonly AS = 17; + public static readonly BIND = 18; + public static readonly TO = 19; + public static readonly PRIVATE = 20; + public static readonly SHARED = 21; + public static readonly STATE = 22; + public static readonly EDGE = 23; + public static readonly PROJECTION = 24; + public static readonly WITH = 25; + public static readonly USING = 26; + public static readonly VIA = 27; + public static readonly MATERIALIZE = 28; + public static readonly IF = 29; + public static readonly ABSENT = 30; + public static readonly ON = 31; + public static readonly POLICY = 32; + public static readonly DEFAULT = 33; + public static readonly SOURCE = 34; + public static readonly REPOSITORY = 35; + public static readonly COMMIT = 36; + public static readonly REVISION = 37; + public static readonly ID = 38; + public static readonly DOC = 39; + public static readonly MODE = 40; + public static readonly EMITS = 41; + public static readonly RECEIVER = 42; + public static readonly REQUIRES = 43; + public static readonly ANY = 44; + public static readonly GET = 45; + public static readonly SET = 46; + public static readonly WATCH = 47; + public static readonly START = 48; + public static readonly STOP = 49; + public static readonly READ = 50; + public static readonly WRITE = 51; + public static readonly RESOLVE = 52; + public static readonly CONNECT = 53; + public static readonly DISCONNECT = 54; + public static readonly CALL = 55; + public static readonly WATCH_START = 56; + public static readonly WATCH_STOP = 57; + public static readonly SUBSCRIBE = 58; + public static readonly UNSUBSCRIBE = 59; + public static readonly OPTIMISTIC_REGISTER = 60; + public static readonly CRDT = 61; + public static readonly OPTIONAL_ONE = 62; + public static readonly EXACTLY_ONE = 63; + public static readonly MANY_UNIQUE = 64; + public static readonly MANY = 65; + public static readonly ORDERED = 66; + public static readonly UNIT = 67; + public static readonly WATCH_HANDLE = 68; + public static readonly MESSAGE = 69; + public static readonly ATOM_REF = 70; + public static readonly INTERFACE_REF = 71; + public static readonly OPTIONAL = 72; + public static readonly LIST = 73; + public static readonly BOOL = 74; + public static readonly BYTES = 75; + public static readonly DOUBLE = 76; + public static readonly INT32 = 77; + public static readonly INT64 = 78; + public static readonly STRING = 79; + public static readonly UINT32 = 80; + public static readonly UINT64 = 81; + public static readonly TRUE = 82; + public static readonly FALSE = 83; + public static readonly NULL = 84; + public static readonly ARROW = 85; + public static readonly COLON = 86; + public static readonly SEMI = 87; + public static readonly COMMA = 88; + public static readonly DOT = 89; + public static readonly LBRACE = 90; + public static readonly RBRACE = 91; + public static readonly LBRACK = 92; + public static readonly RBRACK = 93; + public static readonly LPAREN = 94; + public static readonly RPAREN = 95; + public static readonly LT = 96; + public static readonly GT = 97; + public static readonly INTEGER = 98; + public static readonly JSON_NUMBER = 99; + public static readonly IDENTIFIER = 100; + public static readonly STRING_LITERAL = 101; + public static readonly LINE_COMMENT = 102; + public static readonly BLOCK_COMMENT = 103; + public static readonly WS = 104; public static readonly channelNames = [ "DEFAULT_TOKEN_CHANNEL", "HIDDEN" ]; public static readonly literalNames = [ - null, "'workspace'", "'import'", "'external'", "'atom'", "'interface'", - "'interfaces'", "'package'", "'value'", "'relation'", "'operation'", - "'function'", "'constructor'", "'constructs'", "'conform'", "'as'", - "'bind'", "'to'", "'private'", "'shared'", "'state'", "'edge'", - "'projection'", "'with'", "'using'", "'via'", "'materialize'", "'if'", - "'absent'", "'on'", "'policy'", "'default'", "'source'", "'repository'", - "'commit'", "'revision'", "'id'", "'doc'", "'mode'", "'emits'", - "'receiver'", "'requires'", "'any'", "'get'", "'set'", "'watch'", - "'start'", "'stop'", "'read'", "'write'", "'resolve'", "'connect'", - "'disconnect'", "'call'", "'watch-start'", "'watch-stop'", "'subscribe'", - "'unsubscribe'", "'optimistic-register'", "'crdt'", "'optional-one'", - "'exactly-one'", "'many-unique'", "'many'", "'ordered'", "'unit'", - "'watch-handle'", "'message'", "'atom-ref'", "'interface-ref'", + null, "'workspace'", "'fragment'", "'import'", "'external'", "'atom'", + "'interface'", "'interfaces'", "'package'", "'value'", "'relation'", + "'operation'", "'function'", "'constructor'", "'constructs'", "'input'", + "'conform'", "'as'", "'bind'", "'to'", "'private'", "'shared'", + "'state'", "'edge'", "'projection'", "'with'", "'using'", "'via'", + "'materialize'", "'if'", "'absent'", "'on'", "'policy'", "'default'", + "'source'", "'repository'", "'commit'", "'revision'", "'id'", "'doc'", + "'mode'", "'emits'", "'receiver'", "'requires'", "'any'", "'get'", + "'set'", "'watch'", "'start'", "'stop'", "'read'", "'write'", "'resolve'", + "'connect'", "'disconnect'", "'call'", "'watch-start'", "'watch-stop'", + "'subscribe'", "'unsubscribe'", "'optimistic-register'", "'crdt'", + "'optional-one'", "'exactly-one'", "'many-unique'", "'many'", "'ordered'", + "'unit'", "'watch-handle'", "'message'", "'atom-ref'", "'interface-ref'", "'optional'", "'list'", "'bool'", "'bytes'", "'double'", "'int32'", "'int64'", "'string'", "'uint32'", "'uint64'", "'true'", "'false'", "'null'", "'->'", "':'", "';'", "','", "'.'", "'{'", "'}'", "'['", @@ -132,15 +134,15 @@ export class QuixosCapabilityLexer extends antlr.Lexer { ]; public static readonly symbolicNames = [ - null, "WORKSPACE", "IMPORT", "EXTERNAL", "ATOM", "INTERFACE", "INTERFACES", - "PACKAGE", "VALUE", "RELATION", "OPERATION", "FUNCTION", "CONSTRUCTOR", - "CONSTRUCTS", "CONFORM", "AS", "BIND", "TO", "PRIVATE", "SHARED", - "STATE", "EDGE", "PROJECTION", "WITH", "USING", "VIA", "MATERIALIZE", - "IF", "ABSENT", "ON", "POLICY", "DEFAULT", "SOURCE", "REPOSITORY", - "COMMIT", "REVISION", "ID", "DOC", "MODE", "EMITS", "RECEIVER", - "REQUIRES", "ANY", "GET", "SET", "WATCH", "START", "STOP", "READ", - "WRITE", "RESOLVE", "CONNECT", "DISCONNECT", "CALL", "WATCH_START", - "WATCH_STOP", "SUBSCRIBE", "UNSUBSCRIBE", "OPTIMISTIC_REGISTER", + null, "WORKSPACE", "FRAGMENT", "IMPORT", "EXTERNAL", "ATOM", "INTERFACE", + "INTERFACES", "PACKAGE", "VALUE", "RELATION", "OPERATION", "FUNCTION", + "CONSTRUCTOR", "CONSTRUCTS", "INPUT", "CONFORM", "AS", "BIND", "TO", + "PRIVATE", "SHARED", "STATE", "EDGE", "PROJECTION", "WITH", "USING", + "VIA", "MATERIALIZE", "IF", "ABSENT", "ON", "POLICY", "DEFAULT", + "SOURCE", "REPOSITORY", "COMMIT", "REVISION", "ID", "DOC", "MODE", + "EMITS", "RECEIVER", "REQUIRES", "ANY", "GET", "SET", "WATCH", "START", + "STOP", "READ", "WRITE", "RESOLVE", "CONNECT", "DISCONNECT", "CALL", + "WATCH_START", "WATCH_STOP", "SUBSCRIBE", "UNSUBSCRIBE", "OPTIMISTIC_REGISTER", "CRDT", "OPTIONAL_ONE", "EXACTLY_ONE", "MANY_UNIQUE", "MANY", "ORDERED", "UNIT", "WATCH_HANDLE", "MESSAGE", "ATOM_REF", "INTERFACE_REF", "OPTIONAL", "LIST", "BOOL", "BYTES", "DOUBLE", "INT32", "INT64", @@ -155,15 +157,15 @@ export class QuixosCapabilityLexer extends antlr.Lexer { ]; public static readonly ruleNames = [ - "WORKSPACE", "IMPORT", "EXTERNAL", "ATOM", "INTERFACE", "INTERFACES", - "PACKAGE", "VALUE", "RELATION", "OPERATION", "FUNCTION", "CONSTRUCTOR", - "CONSTRUCTS", "CONFORM", "AS", "BIND", "TO", "PRIVATE", "SHARED", - "STATE", "EDGE", "PROJECTION", "WITH", "USING", "VIA", "MATERIALIZE", - "IF", "ABSENT", "ON", "POLICY", "DEFAULT", "SOURCE", "REPOSITORY", - "COMMIT", "REVISION", "ID", "DOC", "MODE", "EMITS", "RECEIVER", - "REQUIRES", "ANY", "GET", "SET", "WATCH", "START", "STOP", "READ", - "WRITE", "RESOLVE", "CONNECT", "DISCONNECT", "CALL", "WATCH_START", - "WATCH_STOP", "SUBSCRIBE", "UNSUBSCRIBE", "OPTIMISTIC_REGISTER", + "WORKSPACE", "FRAGMENT", "IMPORT", "EXTERNAL", "ATOM", "INTERFACE", + "INTERFACES", "PACKAGE", "VALUE", "RELATION", "OPERATION", "FUNCTION", + "CONSTRUCTOR", "CONSTRUCTS", "INPUT", "CONFORM", "AS", "BIND", "TO", + "PRIVATE", "SHARED", "STATE", "EDGE", "PROJECTION", "WITH", "USING", + "VIA", "MATERIALIZE", "IF", "ABSENT", "ON", "POLICY", "DEFAULT", + "SOURCE", "REPOSITORY", "COMMIT", "REVISION", "ID", "DOC", "MODE", + "EMITS", "RECEIVER", "REQUIRES", "ANY", "GET", "SET", "WATCH", "START", + "STOP", "READ", "WRITE", "RESOLVE", "CONNECT", "DISCONNECT", "CALL", + "WATCH_START", "WATCH_STOP", "SUBSCRIBE", "UNSUBSCRIBE", "OPTIMISTIC_REGISTER", "CRDT", "OPTIONAL_ONE", "EXACTLY_ONE", "MANY_UNIQUE", "MANY", "ORDERED", "UNIT", "WATCH_HANDLE", "MESSAGE", "ATOM_REF", "INTERFACE_REF", "OPTIONAL", "LIST", "BOOL", "BYTES", "DOUBLE", "INT32", "INT64", @@ -193,7 +195,7 @@ export class QuixosCapabilityLexer extends antlr.Lexer { public get modeNames(): string[] { return QuixosCapabilityLexer.modeNames; } public static readonly _serializedATN: number[] = [ - 4,0,102,957,6,-1,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5, + 4,0,104,976,6,-1,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5, 2,6,7,6,2,7,7,7,2,8,7,8,2,9,7,9,2,10,7,10,2,11,7,11,2,12,7,12,2, 13,7,13,2,14,7,14,2,15,7,15,2,16,7,16,2,17,7,17,2,18,7,18,2,19,7, 19,2,20,7,20,2,21,7,21,2,22,7,22,2,23,7,23,2,24,7,24,2,25,7,25,2, @@ -209,331 +211,338 @@ export class QuixosCapabilityLexer extends antlr.Lexer { 84,2,85,7,85,2,86,7,86,2,87,7,87,2,88,7,88,2,89,7,89,2,90,7,90,2, 91,7,91,2,92,7,92,2,93,7,93,2,94,7,94,2,95,7,95,2,96,7,96,2,97,7, 97,2,98,7,98,2,99,7,99,2,100,7,100,2,101,7,101,2,102,7,102,2,103, - 7,103,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1, - 1,1,1,1,1,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,3,1,3,1,3,1,3,1, - 3,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,4,1,5,1,5,1,5,1,5,1,5,1, - 5,1,5,1,5,1,5,1,5,1,5,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,7,1,7,1, - 7,1,7,1,7,1,7,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,9,1,9,1,9,1, - 9,1,9,1,9,1,9,1,9,1,9,1,9,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10, - 1,10,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11, - 1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,13,1,13, - 1,13,1,13,1,13,1,13,1,13,1,13,1,14,1,14,1,14,1,15,1,15,1,15,1,15, - 1,15,1,16,1,16,1,16,1,17,1,17,1,17,1,17,1,17,1,17,1,17,1,17,1,18, - 1,18,1,18,1,18,1,18,1,18,1,18,1,19,1,19,1,19,1,19,1,19,1,19,1,20, - 1,20,1,20,1,20,1,20,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21, - 1,21,1,21,1,22,1,22,1,22,1,22,1,22,1,23,1,23,1,23,1,23,1,23,1,23, - 1,24,1,24,1,24,1,24,1,25,1,25,1,25,1,25,1,25,1,25,1,25,1,25,1,25, - 1,25,1,25,1,25,1,26,1,26,1,26,1,27,1,27,1,27,1,27,1,27,1,27,1,27, - 1,28,1,28,1,28,1,29,1,29,1,29,1,29,1,29,1,29,1,29,1,30,1,30,1,30, - 1,30,1,30,1,30,1,30,1,30,1,31,1,31,1,31,1,31,1,31,1,31,1,31,1,32, - 1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,33,1,33,1,33, - 1,33,1,33,1,33,1,33,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34, - 1,35,1,35,1,35,1,36,1,36,1,36,1,36,1,37,1,37,1,37,1,37,1,37,1,38, - 1,38,1,38,1,38,1,38,1,38,1,39,1,39,1,39,1,39,1,39,1,39,1,39,1,39, - 1,39,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,41,1,41,1,41, - 1,41,1,42,1,42,1,42,1,42,1,43,1,43,1,43,1,43,1,44,1,44,1,44,1,44, - 1,44,1,44,1,45,1,45,1,45,1,45,1,45,1,45,1,46,1,46,1,46,1,46,1,46, - 1,47,1,47,1,47,1,47,1,47,1,48,1,48,1,48,1,48,1,48,1,48,1,49,1,49, - 1,49,1,49,1,49,1,49,1,49,1,49,1,50,1,50,1,50,1,50,1,50,1,50,1,50, - 1,50,1,51,1,51,1,51,1,51,1,51,1,51,1,51,1,51,1,51,1,51,1,51,1,52, - 1,52,1,52,1,52,1,52,1,53,1,53,1,53,1,53,1,53,1,53,1,53,1,53,1,53, - 1,53,1,53,1,53,1,54,1,54,1,54,1,54,1,54,1,54,1,54,1,54,1,54,1,54, - 1,54,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,56,1,56, - 1,56,1,56,1,56,1,56,1,56,1,56,1,56,1,56,1,56,1,56,1,57,1,57,1,57, - 1,57,1,57,1,57,1,57,1,57,1,57,1,57,1,57,1,57,1,57,1,57,1,57,1,57, - 1,57,1,57,1,57,1,57,1,58,1,58,1,58,1,58,1,58,1,59,1,59,1,59,1,59, - 1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,60,1,60,1,60,1,60, - 1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,60,1,61,1,61,1,61,1,61,1,61, - 1,61,1,61,1,61,1,61,1,61,1,61,1,61,1,62,1,62,1,62,1,62,1,62,1,63, - 1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,64,1,64,1,64,1,64,1,64,1,65, - 1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,65,1,66, - 1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,67,1,67,1,67,1,67,1,67,1,67, - 1,67,1,67,1,67,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68, - 1,68,1,68,1,68,1,68,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69, - 1,70,1,70,1,70,1,70,1,70,1,71,1,71,1,71,1,71,1,71,1,72,1,72,1,72, - 1,72,1,72,1,72,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,74,1,74,1,74, - 1,74,1,74,1,74,1,75,1,75,1,75,1,75,1,75,1,75,1,76,1,76,1,76,1,76, - 1,76,1,76,1,76,1,77,1,77,1,77,1,77,1,77,1,77,1,77,1,78,1,78,1,78, - 1,78,1,78,1,78,1,78,1,79,1,79,1,79,1,79,1,79,1,80,1,80,1,80,1,80, - 1,80,1,80,1,81,1,81,1,81,1,81,1,81,1,82,1,82,1,82,1,83,1,83,1,84, - 1,84,1,85,1,85,1,86,1,86,1,87,1,87,1,88,1,88,1,89,1,89,1,90,1,90, - 1,91,1,91,1,92,1,92,1,93,1,93,1,94,1,94,1,95,3,95,858,8,95,1,95, - 4,95,861,8,95,11,95,12,95,862,1,96,3,96,866,8,96,1,96,1,96,1,96, - 5,96,871,8,96,10,96,12,96,874,9,96,3,96,876,8,96,1,96,1,96,4,96, - 880,8,96,11,96,12,96,881,3,96,884,8,96,1,96,1,96,3,96,888,8,96,1, - 96,4,96,891,8,96,11,96,12,96,892,3,96,895,8,96,1,97,1,97,5,97,899, - 8,97,10,97,12,97,902,9,97,1,98,1,98,1,98,5,98,907,8,98,10,98,12, - 98,910,9,98,1,98,1,98,1,99,1,99,1,99,1,99,1,99,1,99,1,99,1,99,3, - 99,922,8,99,1,100,1,100,1,101,1,101,1,101,1,101,5,101,930,8,101, - 10,101,12,101,933,9,101,1,101,1,101,1,102,1,102,1,102,1,102,5,102, - 941,8,102,10,102,12,102,944,9,102,1,102,1,102,1,102,1,102,1,102, - 1,103,4,103,952,8,103,11,103,12,103,953,1,103,1,103,1,942,0,104, - 1,1,3,2,5,3,7,4,9,5,11,6,13,7,15,8,17,9,19,10,21,11,23,12,25,13, - 27,14,29,15,31,16,33,17,35,18,37,19,39,20,41,21,43,22,45,23,47,24, - 49,25,51,26,53,27,55,28,57,29,59,30,61,31,63,32,65,33,67,34,69,35, - 71,36,73,37,75,38,77,39,79,40,81,41,83,42,85,43,87,44,89,45,91,46, - 93,47,95,48,97,49,99,50,101,51,103,52,105,53,107,54,109,55,111,56, - 113,57,115,58,117,59,119,60,121,61,123,62,125,63,127,64,129,65,131, - 66,133,67,135,68,137,69,139,70,141,71,143,72,145,73,147,74,149,75, - 151,76,153,77,155,78,157,79,159,80,161,81,163,82,165,83,167,84,169, - 85,171,86,173,87,175,88,177,89,179,90,181,91,183,92,185,93,187,94, - 189,95,191,96,193,97,195,98,197,99,199,0,201,0,203,100,205,101,207, - 102,1,0,11,1,0,48,57,1,0,49,57,2,0,69,69,101,101,2,0,43,43,45,45, - 3,0,65,90,95,95,97,122,4,0,48,57,65,90,95,95,97,122,4,0,10,10,13, - 13,34,34,92,92,8,0,34,34,47,47,92,92,98,98,102,102,110,110,114,114, - 116,116,3,0,48,57,65,70,97,102,2,0,10,10,13,13,3,0,9,10,13,13,32, - 32,971,0,1,1,0,0,0,0,3,1,0,0,0,0,5,1,0,0,0,0,7,1,0,0,0,0,9,1,0,0, - 0,0,11,1,0,0,0,0,13,1,0,0,0,0,15,1,0,0,0,0,17,1,0,0,0,0,19,1,0,0, - 0,0,21,1,0,0,0,0,23,1,0,0,0,0,25,1,0,0,0,0,27,1,0,0,0,0,29,1,0,0, - 0,0,31,1,0,0,0,0,33,1,0,0,0,0,35,1,0,0,0,0,37,1,0,0,0,0,39,1,0,0, - 0,0,41,1,0,0,0,0,43,1,0,0,0,0,45,1,0,0,0,0,47,1,0,0,0,0,49,1,0,0, - 0,0,51,1,0,0,0,0,53,1,0,0,0,0,55,1,0,0,0,0,57,1,0,0,0,0,59,1,0,0, - 0,0,61,1,0,0,0,0,63,1,0,0,0,0,65,1,0,0,0,0,67,1,0,0,0,0,69,1,0,0, - 0,0,71,1,0,0,0,0,73,1,0,0,0,0,75,1,0,0,0,0,77,1,0,0,0,0,79,1,0,0, - 0,0,81,1,0,0,0,0,83,1,0,0,0,0,85,1,0,0,0,0,87,1,0,0,0,0,89,1,0,0, - 0,0,91,1,0,0,0,0,93,1,0,0,0,0,95,1,0,0,0,0,97,1,0,0,0,0,99,1,0,0, - 0,0,101,1,0,0,0,0,103,1,0,0,0,0,105,1,0,0,0,0,107,1,0,0,0,0,109, - 1,0,0,0,0,111,1,0,0,0,0,113,1,0,0,0,0,115,1,0,0,0,0,117,1,0,0,0, - 0,119,1,0,0,0,0,121,1,0,0,0,0,123,1,0,0,0,0,125,1,0,0,0,0,127,1, - 0,0,0,0,129,1,0,0,0,0,131,1,0,0,0,0,133,1,0,0,0,0,135,1,0,0,0,0, - 137,1,0,0,0,0,139,1,0,0,0,0,141,1,0,0,0,0,143,1,0,0,0,0,145,1,0, - 0,0,0,147,1,0,0,0,0,149,1,0,0,0,0,151,1,0,0,0,0,153,1,0,0,0,0,155, - 1,0,0,0,0,157,1,0,0,0,0,159,1,0,0,0,0,161,1,0,0,0,0,163,1,0,0,0, - 0,165,1,0,0,0,0,167,1,0,0,0,0,169,1,0,0,0,0,171,1,0,0,0,0,173,1, - 0,0,0,0,175,1,0,0,0,0,177,1,0,0,0,0,179,1,0,0,0,0,181,1,0,0,0,0, - 183,1,0,0,0,0,185,1,0,0,0,0,187,1,0,0,0,0,189,1,0,0,0,0,191,1,0, - 0,0,0,193,1,0,0,0,0,195,1,0,0,0,0,197,1,0,0,0,0,203,1,0,0,0,0,205, - 1,0,0,0,0,207,1,0,0,0,1,209,1,0,0,0,3,219,1,0,0,0,5,226,1,0,0,0, - 7,235,1,0,0,0,9,240,1,0,0,0,11,250,1,0,0,0,13,261,1,0,0,0,15,269, - 1,0,0,0,17,275,1,0,0,0,19,284,1,0,0,0,21,294,1,0,0,0,23,303,1,0, - 0,0,25,315,1,0,0,0,27,326,1,0,0,0,29,334,1,0,0,0,31,337,1,0,0,0, - 33,342,1,0,0,0,35,345,1,0,0,0,37,353,1,0,0,0,39,360,1,0,0,0,41,366, - 1,0,0,0,43,371,1,0,0,0,45,382,1,0,0,0,47,387,1,0,0,0,49,393,1,0, - 0,0,51,397,1,0,0,0,53,409,1,0,0,0,55,412,1,0,0,0,57,419,1,0,0,0, - 59,422,1,0,0,0,61,429,1,0,0,0,63,437,1,0,0,0,65,444,1,0,0,0,67,455, - 1,0,0,0,69,462,1,0,0,0,71,471,1,0,0,0,73,474,1,0,0,0,75,478,1,0, - 0,0,77,483,1,0,0,0,79,489,1,0,0,0,81,498,1,0,0,0,83,507,1,0,0,0, - 85,511,1,0,0,0,87,515,1,0,0,0,89,519,1,0,0,0,91,525,1,0,0,0,93,531, - 1,0,0,0,95,536,1,0,0,0,97,541,1,0,0,0,99,547,1,0,0,0,101,555,1,0, - 0,0,103,563,1,0,0,0,105,574,1,0,0,0,107,579,1,0,0,0,109,591,1,0, - 0,0,111,602,1,0,0,0,113,612,1,0,0,0,115,624,1,0,0,0,117,644,1,0, - 0,0,119,649,1,0,0,0,121,662,1,0,0,0,123,674,1,0,0,0,125,686,1,0, - 0,0,127,691,1,0,0,0,129,699,1,0,0,0,131,704,1,0,0,0,133,717,1,0, - 0,0,135,725,1,0,0,0,137,734,1,0,0,0,139,748,1,0,0,0,141,757,1,0, - 0,0,143,762,1,0,0,0,145,767,1,0,0,0,147,773,1,0,0,0,149,780,1,0, - 0,0,151,786,1,0,0,0,153,792,1,0,0,0,155,799,1,0,0,0,157,806,1,0, - 0,0,159,813,1,0,0,0,161,818,1,0,0,0,163,824,1,0,0,0,165,829,1,0, - 0,0,167,832,1,0,0,0,169,834,1,0,0,0,171,836,1,0,0,0,173,838,1,0, - 0,0,175,840,1,0,0,0,177,842,1,0,0,0,179,844,1,0,0,0,181,846,1,0, - 0,0,183,848,1,0,0,0,185,850,1,0,0,0,187,852,1,0,0,0,189,854,1,0, - 0,0,191,857,1,0,0,0,193,865,1,0,0,0,195,896,1,0,0,0,197,903,1,0, - 0,0,199,913,1,0,0,0,201,923,1,0,0,0,203,925,1,0,0,0,205,936,1,0, - 0,0,207,951,1,0,0,0,209,210,5,119,0,0,210,211,5,111,0,0,211,212, - 5,114,0,0,212,213,5,107,0,0,213,214,5,115,0,0,214,215,5,112,0,0, - 215,216,5,97,0,0,216,217,5,99,0,0,217,218,5,101,0,0,218,2,1,0,0, - 0,219,220,5,105,0,0,220,221,5,109,0,0,221,222,5,112,0,0,222,223, - 5,111,0,0,223,224,5,114,0,0,224,225,5,116,0,0,225,4,1,0,0,0,226, - 227,5,101,0,0,227,228,5,120,0,0,228,229,5,116,0,0,229,230,5,101, - 0,0,230,231,5,114,0,0,231,232,5,110,0,0,232,233,5,97,0,0,233,234, - 5,108,0,0,234,6,1,0,0,0,235,236,5,97,0,0,236,237,5,116,0,0,237,238, - 5,111,0,0,238,239,5,109,0,0,239,8,1,0,0,0,240,241,5,105,0,0,241, - 242,5,110,0,0,242,243,5,116,0,0,243,244,5,101,0,0,244,245,5,114, - 0,0,245,246,5,102,0,0,246,247,5,97,0,0,247,248,5,99,0,0,248,249, - 5,101,0,0,249,10,1,0,0,0,250,251,5,105,0,0,251,252,5,110,0,0,252, - 253,5,116,0,0,253,254,5,101,0,0,254,255,5,114,0,0,255,256,5,102, - 0,0,256,257,5,97,0,0,257,258,5,99,0,0,258,259,5,101,0,0,259,260, - 5,115,0,0,260,12,1,0,0,0,261,262,5,112,0,0,262,263,5,97,0,0,263, - 264,5,99,0,0,264,265,5,107,0,0,265,266,5,97,0,0,266,267,5,103,0, - 0,267,268,5,101,0,0,268,14,1,0,0,0,269,270,5,118,0,0,270,271,5,97, - 0,0,271,272,5,108,0,0,272,273,5,117,0,0,273,274,5,101,0,0,274,16, - 1,0,0,0,275,276,5,114,0,0,276,277,5,101,0,0,277,278,5,108,0,0,278, - 279,5,97,0,0,279,280,5,116,0,0,280,281,5,105,0,0,281,282,5,111,0, - 0,282,283,5,110,0,0,283,18,1,0,0,0,284,285,5,111,0,0,285,286,5,112, - 0,0,286,287,5,101,0,0,287,288,5,114,0,0,288,289,5,97,0,0,289,290, - 5,116,0,0,290,291,5,105,0,0,291,292,5,111,0,0,292,293,5,110,0,0, - 293,20,1,0,0,0,294,295,5,102,0,0,295,296,5,117,0,0,296,297,5,110, - 0,0,297,298,5,99,0,0,298,299,5,116,0,0,299,300,5,105,0,0,300,301, - 5,111,0,0,301,302,5,110,0,0,302,22,1,0,0,0,303,304,5,99,0,0,304, - 305,5,111,0,0,305,306,5,110,0,0,306,307,5,115,0,0,307,308,5,116, - 0,0,308,309,5,114,0,0,309,310,5,117,0,0,310,311,5,99,0,0,311,312, - 5,116,0,0,312,313,5,111,0,0,313,314,5,114,0,0,314,24,1,0,0,0,315, - 316,5,99,0,0,316,317,5,111,0,0,317,318,5,110,0,0,318,319,5,115,0, - 0,319,320,5,116,0,0,320,321,5,114,0,0,321,322,5,117,0,0,322,323, - 5,99,0,0,323,324,5,116,0,0,324,325,5,115,0,0,325,26,1,0,0,0,326, - 327,5,99,0,0,327,328,5,111,0,0,328,329,5,110,0,0,329,330,5,102,0, - 0,330,331,5,111,0,0,331,332,5,114,0,0,332,333,5,109,0,0,333,28,1, - 0,0,0,334,335,5,97,0,0,335,336,5,115,0,0,336,30,1,0,0,0,337,338, - 5,98,0,0,338,339,5,105,0,0,339,340,5,110,0,0,340,341,5,100,0,0,341, - 32,1,0,0,0,342,343,5,116,0,0,343,344,5,111,0,0,344,34,1,0,0,0,345, - 346,5,112,0,0,346,347,5,114,0,0,347,348,5,105,0,0,348,349,5,118, - 0,0,349,350,5,97,0,0,350,351,5,116,0,0,351,352,5,101,0,0,352,36, - 1,0,0,0,353,354,5,115,0,0,354,355,5,104,0,0,355,356,5,97,0,0,356, - 357,5,114,0,0,357,358,5,101,0,0,358,359,5,100,0,0,359,38,1,0,0,0, - 360,361,5,115,0,0,361,362,5,116,0,0,362,363,5,97,0,0,363,364,5,116, - 0,0,364,365,5,101,0,0,365,40,1,0,0,0,366,367,5,101,0,0,367,368,5, - 100,0,0,368,369,5,103,0,0,369,370,5,101,0,0,370,42,1,0,0,0,371,372, - 5,112,0,0,372,373,5,114,0,0,373,374,5,111,0,0,374,375,5,106,0,0, - 375,376,5,101,0,0,376,377,5,99,0,0,377,378,5,116,0,0,378,379,5,105, - 0,0,379,380,5,111,0,0,380,381,5,110,0,0,381,44,1,0,0,0,382,383,5, - 119,0,0,383,384,5,105,0,0,384,385,5,116,0,0,385,386,5,104,0,0,386, - 46,1,0,0,0,387,388,5,117,0,0,388,389,5,115,0,0,389,390,5,105,0,0, - 390,391,5,110,0,0,391,392,5,103,0,0,392,48,1,0,0,0,393,394,5,118, - 0,0,394,395,5,105,0,0,395,396,5,97,0,0,396,50,1,0,0,0,397,398,5, - 109,0,0,398,399,5,97,0,0,399,400,5,116,0,0,400,401,5,101,0,0,401, - 402,5,114,0,0,402,403,5,105,0,0,403,404,5,97,0,0,404,405,5,108,0, - 0,405,406,5,105,0,0,406,407,5,122,0,0,407,408,5,101,0,0,408,52,1, - 0,0,0,409,410,5,105,0,0,410,411,5,102,0,0,411,54,1,0,0,0,412,413, - 5,97,0,0,413,414,5,98,0,0,414,415,5,115,0,0,415,416,5,101,0,0,416, - 417,5,110,0,0,417,418,5,116,0,0,418,56,1,0,0,0,419,420,5,111,0,0, - 420,421,5,110,0,0,421,58,1,0,0,0,422,423,5,112,0,0,423,424,5,111, - 0,0,424,425,5,108,0,0,425,426,5,105,0,0,426,427,5,99,0,0,427,428, - 5,121,0,0,428,60,1,0,0,0,429,430,5,100,0,0,430,431,5,101,0,0,431, - 432,5,102,0,0,432,433,5,97,0,0,433,434,5,117,0,0,434,435,5,108,0, - 0,435,436,5,116,0,0,436,62,1,0,0,0,437,438,5,115,0,0,438,439,5,111, - 0,0,439,440,5,117,0,0,440,441,5,114,0,0,441,442,5,99,0,0,442,443, - 5,101,0,0,443,64,1,0,0,0,444,445,5,114,0,0,445,446,5,101,0,0,446, - 447,5,112,0,0,447,448,5,111,0,0,448,449,5,115,0,0,449,450,5,105, - 0,0,450,451,5,116,0,0,451,452,5,111,0,0,452,453,5,114,0,0,453,454, - 5,121,0,0,454,66,1,0,0,0,455,456,5,99,0,0,456,457,5,111,0,0,457, - 458,5,109,0,0,458,459,5,109,0,0,459,460,5,105,0,0,460,461,5,116, - 0,0,461,68,1,0,0,0,462,463,5,114,0,0,463,464,5,101,0,0,464,465,5, - 118,0,0,465,466,5,105,0,0,466,467,5,115,0,0,467,468,5,105,0,0,468, - 469,5,111,0,0,469,470,5,110,0,0,470,70,1,0,0,0,471,472,5,105,0,0, - 472,473,5,100,0,0,473,72,1,0,0,0,474,475,5,100,0,0,475,476,5,111, - 0,0,476,477,5,99,0,0,477,74,1,0,0,0,478,479,5,109,0,0,479,480,5, - 111,0,0,480,481,5,100,0,0,481,482,5,101,0,0,482,76,1,0,0,0,483,484, - 5,101,0,0,484,485,5,109,0,0,485,486,5,105,0,0,486,487,5,116,0,0, - 487,488,5,115,0,0,488,78,1,0,0,0,489,490,5,114,0,0,490,491,5,101, - 0,0,491,492,5,99,0,0,492,493,5,101,0,0,493,494,5,105,0,0,494,495, - 5,118,0,0,495,496,5,101,0,0,496,497,5,114,0,0,497,80,1,0,0,0,498, - 499,5,114,0,0,499,500,5,101,0,0,500,501,5,113,0,0,501,502,5,117, - 0,0,502,503,5,105,0,0,503,504,5,114,0,0,504,505,5,101,0,0,505,506, - 5,115,0,0,506,82,1,0,0,0,507,508,5,97,0,0,508,509,5,110,0,0,509, - 510,5,121,0,0,510,84,1,0,0,0,511,512,5,103,0,0,512,513,5,101,0,0, - 513,514,5,116,0,0,514,86,1,0,0,0,515,516,5,115,0,0,516,517,5,101, - 0,0,517,518,5,116,0,0,518,88,1,0,0,0,519,520,5,119,0,0,520,521,5, - 97,0,0,521,522,5,116,0,0,522,523,5,99,0,0,523,524,5,104,0,0,524, - 90,1,0,0,0,525,526,5,115,0,0,526,527,5,116,0,0,527,528,5,97,0,0, - 528,529,5,114,0,0,529,530,5,116,0,0,530,92,1,0,0,0,531,532,5,115, - 0,0,532,533,5,116,0,0,533,534,5,111,0,0,534,535,5,112,0,0,535,94, - 1,0,0,0,536,537,5,114,0,0,537,538,5,101,0,0,538,539,5,97,0,0,539, - 540,5,100,0,0,540,96,1,0,0,0,541,542,5,119,0,0,542,543,5,114,0,0, - 543,544,5,105,0,0,544,545,5,116,0,0,545,546,5,101,0,0,546,98,1,0, - 0,0,547,548,5,114,0,0,548,549,5,101,0,0,549,550,5,115,0,0,550,551, - 5,111,0,0,551,552,5,108,0,0,552,553,5,118,0,0,553,554,5,101,0,0, - 554,100,1,0,0,0,555,556,5,99,0,0,556,557,5,111,0,0,557,558,5,110, - 0,0,558,559,5,110,0,0,559,560,5,101,0,0,560,561,5,99,0,0,561,562, - 5,116,0,0,562,102,1,0,0,0,563,564,5,100,0,0,564,565,5,105,0,0,565, - 566,5,115,0,0,566,567,5,99,0,0,567,568,5,111,0,0,568,569,5,110,0, - 0,569,570,5,110,0,0,570,571,5,101,0,0,571,572,5,99,0,0,572,573,5, - 116,0,0,573,104,1,0,0,0,574,575,5,99,0,0,575,576,5,97,0,0,576,577, - 5,108,0,0,577,578,5,108,0,0,578,106,1,0,0,0,579,580,5,119,0,0,580, - 581,5,97,0,0,581,582,5,116,0,0,582,583,5,99,0,0,583,584,5,104,0, - 0,584,585,5,45,0,0,585,586,5,115,0,0,586,587,5,116,0,0,587,588,5, - 97,0,0,588,589,5,114,0,0,589,590,5,116,0,0,590,108,1,0,0,0,591,592, - 5,119,0,0,592,593,5,97,0,0,593,594,5,116,0,0,594,595,5,99,0,0,595, - 596,5,104,0,0,596,597,5,45,0,0,597,598,5,115,0,0,598,599,5,116,0, - 0,599,600,5,111,0,0,600,601,5,112,0,0,601,110,1,0,0,0,602,603,5, - 115,0,0,603,604,5,117,0,0,604,605,5,98,0,0,605,606,5,115,0,0,606, - 607,5,99,0,0,607,608,5,114,0,0,608,609,5,105,0,0,609,610,5,98,0, - 0,610,611,5,101,0,0,611,112,1,0,0,0,612,613,5,117,0,0,613,614,5, - 110,0,0,614,615,5,115,0,0,615,616,5,117,0,0,616,617,5,98,0,0,617, - 618,5,115,0,0,618,619,5,99,0,0,619,620,5,114,0,0,620,621,5,105,0, - 0,621,622,5,98,0,0,622,623,5,101,0,0,623,114,1,0,0,0,624,625,5,111, - 0,0,625,626,5,112,0,0,626,627,5,116,0,0,627,628,5,105,0,0,628,629, - 5,109,0,0,629,630,5,105,0,0,630,631,5,115,0,0,631,632,5,116,0,0, - 632,633,5,105,0,0,633,634,5,99,0,0,634,635,5,45,0,0,635,636,5,114, - 0,0,636,637,5,101,0,0,637,638,5,103,0,0,638,639,5,105,0,0,639,640, - 5,115,0,0,640,641,5,116,0,0,641,642,5,101,0,0,642,643,5,114,0,0, - 643,116,1,0,0,0,644,645,5,99,0,0,645,646,5,114,0,0,646,647,5,100, - 0,0,647,648,5,116,0,0,648,118,1,0,0,0,649,650,5,111,0,0,650,651, - 5,112,0,0,651,652,5,116,0,0,652,653,5,105,0,0,653,654,5,111,0,0, - 654,655,5,110,0,0,655,656,5,97,0,0,656,657,5,108,0,0,657,658,5,45, - 0,0,658,659,5,111,0,0,659,660,5,110,0,0,660,661,5,101,0,0,661,120, - 1,0,0,0,662,663,5,101,0,0,663,664,5,120,0,0,664,665,5,97,0,0,665, - 666,5,99,0,0,666,667,5,116,0,0,667,668,5,108,0,0,668,669,5,121,0, - 0,669,670,5,45,0,0,670,671,5,111,0,0,671,672,5,110,0,0,672,673,5, - 101,0,0,673,122,1,0,0,0,674,675,5,109,0,0,675,676,5,97,0,0,676,677, - 5,110,0,0,677,678,5,121,0,0,678,679,5,45,0,0,679,680,5,117,0,0,680, - 681,5,110,0,0,681,682,5,105,0,0,682,683,5,113,0,0,683,684,5,117, - 0,0,684,685,5,101,0,0,685,124,1,0,0,0,686,687,5,109,0,0,687,688, - 5,97,0,0,688,689,5,110,0,0,689,690,5,121,0,0,690,126,1,0,0,0,691, - 692,5,111,0,0,692,693,5,114,0,0,693,694,5,100,0,0,694,695,5,101, - 0,0,695,696,5,114,0,0,696,697,5,101,0,0,697,698,5,100,0,0,698,128, - 1,0,0,0,699,700,5,117,0,0,700,701,5,110,0,0,701,702,5,105,0,0,702, - 703,5,116,0,0,703,130,1,0,0,0,704,705,5,119,0,0,705,706,5,97,0,0, - 706,707,5,116,0,0,707,708,5,99,0,0,708,709,5,104,0,0,709,710,5,45, - 0,0,710,711,5,104,0,0,711,712,5,97,0,0,712,713,5,110,0,0,713,714, - 5,100,0,0,714,715,5,108,0,0,715,716,5,101,0,0,716,132,1,0,0,0,717, - 718,5,109,0,0,718,719,5,101,0,0,719,720,5,115,0,0,720,721,5,115, - 0,0,721,722,5,97,0,0,722,723,5,103,0,0,723,724,5,101,0,0,724,134, - 1,0,0,0,725,726,5,97,0,0,726,727,5,116,0,0,727,728,5,111,0,0,728, - 729,5,109,0,0,729,730,5,45,0,0,730,731,5,114,0,0,731,732,5,101,0, - 0,732,733,5,102,0,0,733,136,1,0,0,0,734,735,5,105,0,0,735,736,5, - 110,0,0,736,737,5,116,0,0,737,738,5,101,0,0,738,739,5,114,0,0,739, - 740,5,102,0,0,740,741,5,97,0,0,741,742,5,99,0,0,742,743,5,101,0, - 0,743,744,5,45,0,0,744,745,5,114,0,0,745,746,5,101,0,0,746,747,5, - 102,0,0,747,138,1,0,0,0,748,749,5,111,0,0,749,750,5,112,0,0,750, - 751,5,116,0,0,751,752,5,105,0,0,752,753,5,111,0,0,753,754,5,110, - 0,0,754,755,5,97,0,0,755,756,5,108,0,0,756,140,1,0,0,0,757,758,5, - 108,0,0,758,759,5,105,0,0,759,760,5,115,0,0,760,761,5,116,0,0,761, - 142,1,0,0,0,762,763,5,98,0,0,763,764,5,111,0,0,764,765,5,111,0,0, - 765,766,5,108,0,0,766,144,1,0,0,0,767,768,5,98,0,0,768,769,5,121, - 0,0,769,770,5,116,0,0,770,771,5,101,0,0,771,772,5,115,0,0,772,146, - 1,0,0,0,773,774,5,100,0,0,774,775,5,111,0,0,775,776,5,117,0,0,776, - 777,5,98,0,0,777,778,5,108,0,0,778,779,5,101,0,0,779,148,1,0,0,0, - 780,781,5,105,0,0,781,782,5,110,0,0,782,783,5,116,0,0,783,784,5, - 51,0,0,784,785,5,50,0,0,785,150,1,0,0,0,786,787,5,105,0,0,787,788, - 5,110,0,0,788,789,5,116,0,0,789,790,5,54,0,0,790,791,5,52,0,0,791, - 152,1,0,0,0,792,793,5,115,0,0,793,794,5,116,0,0,794,795,5,114,0, - 0,795,796,5,105,0,0,796,797,5,110,0,0,797,798,5,103,0,0,798,154, - 1,0,0,0,799,800,5,117,0,0,800,801,5,105,0,0,801,802,5,110,0,0,802, - 803,5,116,0,0,803,804,5,51,0,0,804,805,5,50,0,0,805,156,1,0,0,0, - 806,807,5,117,0,0,807,808,5,105,0,0,808,809,5,110,0,0,809,810,5, - 116,0,0,810,811,5,54,0,0,811,812,5,52,0,0,812,158,1,0,0,0,813,814, - 5,116,0,0,814,815,5,114,0,0,815,816,5,117,0,0,816,817,5,101,0,0, - 817,160,1,0,0,0,818,819,5,102,0,0,819,820,5,97,0,0,820,821,5,108, - 0,0,821,822,5,115,0,0,822,823,5,101,0,0,823,162,1,0,0,0,824,825, - 5,110,0,0,825,826,5,117,0,0,826,827,5,108,0,0,827,828,5,108,0,0, - 828,164,1,0,0,0,829,830,5,45,0,0,830,831,5,62,0,0,831,166,1,0,0, - 0,832,833,5,58,0,0,833,168,1,0,0,0,834,835,5,59,0,0,835,170,1,0, - 0,0,836,837,5,44,0,0,837,172,1,0,0,0,838,839,5,46,0,0,839,174,1, - 0,0,0,840,841,5,123,0,0,841,176,1,0,0,0,842,843,5,125,0,0,843,178, - 1,0,0,0,844,845,5,91,0,0,845,180,1,0,0,0,846,847,5,93,0,0,847,182, - 1,0,0,0,848,849,5,40,0,0,849,184,1,0,0,0,850,851,5,41,0,0,851,186, - 1,0,0,0,852,853,5,60,0,0,853,188,1,0,0,0,854,855,5,62,0,0,855,190, - 1,0,0,0,856,858,5,45,0,0,857,856,1,0,0,0,857,858,1,0,0,0,858,860, - 1,0,0,0,859,861,7,0,0,0,860,859,1,0,0,0,861,862,1,0,0,0,862,860, - 1,0,0,0,862,863,1,0,0,0,863,192,1,0,0,0,864,866,5,45,0,0,865,864, - 1,0,0,0,865,866,1,0,0,0,866,875,1,0,0,0,867,876,5,48,0,0,868,872, - 7,1,0,0,869,871,7,0,0,0,870,869,1,0,0,0,871,874,1,0,0,0,872,870, - 1,0,0,0,872,873,1,0,0,0,873,876,1,0,0,0,874,872,1,0,0,0,875,867, - 1,0,0,0,875,868,1,0,0,0,876,883,1,0,0,0,877,879,5,46,0,0,878,880, - 7,0,0,0,879,878,1,0,0,0,880,881,1,0,0,0,881,879,1,0,0,0,881,882, - 1,0,0,0,882,884,1,0,0,0,883,877,1,0,0,0,883,884,1,0,0,0,884,894, - 1,0,0,0,885,887,7,2,0,0,886,888,7,3,0,0,887,886,1,0,0,0,887,888, - 1,0,0,0,888,890,1,0,0,0,889,891,7,0,0,0,890,889,1,0,0,0,891,892, - 1,0,0,0,892,890,1,0,0,0,892,893,1,0,0,0,893,895,1,0,0,0,894,885, - 1,0,0,0,894,895,1,0,0,0,895,194,1,0,0,0,896,900,7,4,0,0,897,899, - 7,5,0,0,898,897,1,0,0,0,899,902,1,0,0,0,900,898,1,0,0,0,900,901, - 1,0,0,0,901,196,1,0,0,0,902,900,1,0,0,0,903,908,5,34,0,0,904,907, - 3,199,99,0,905,907,8,6,0,0,906,904,1,0,0,0,906,905,1,0,0,0,907,910, - 1,0,0,0,908,906,1,0,0,0,908,909,1,0,0,0,909,911,1,0,0,0,910,908, - 1,0,0,0,911,912,5,34,0,0,912,198,1,0,0,0,913,921,5,92,0,0,914,922, - 7,7,0,0,915,916,5,117,0,0,916,917,3,201,100,0,917,918,3,201,100, - 0,918,919,3,201,100,0,919,920,3,201,100,0,920,922,1,0,0,0,921,914, - 1,0,0,0,921,915,1,0,0,0,922,200,1,0,0,0,923,924,7,8,0,0,924,202, - 1,0,0,0,925,926,5,47,0,0,926,927,5,47,0,0,927,931,1,0,0,0,928,930, - 8,9,0,0,929,928,1,0,0,0,930,933,1,0,0,0,931,929,1,0,0,0,931,932, - 1,0,0,0,932,934,1,0,0,0,933,931,1,0,0,0,934,935,6,101,0,0,935,204, - 1,0,0,0,936,937,5,47,0,0,937,938,5,42,0,0,938,942,1,0,0,0,939,941, - 9,0,0,0,940,939,1,0,0,0,941,944,1,0,0,0,942,943,1,0,0,0,942,940, - 1,0,0,0,943,945,1,0,0,0,944,942,1,0,0,0,945,946,5,42,0,0,946,947, - 5,47,0,0,947,948,1,0,0,0,948,949,6,102,0,0,949,206,1,0,0,0,950,952, - 7,10,0,0,951,950,1,0,0,0,952,953,1,0,0,0,953,951,1,0,0,0,953,954, - 1,0,0,0,954,955,1,0,0,0,955,956,6,103,0,0,956,208,1,0,0,0,18,0,857, - 862,865,872,875,881,883,887,892,894,900,906,908,921,931,942,953, - 1,6,0,0 + 7,103,2,104,7,104,2,105,7,105,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, + 0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,2,1,2,1,2,1,2,1, + 2,1,2,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,4,1,4,1,4,1,4,1,4,1, + 5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,6,1,6,1,6,1,6,1,6,1,6,1, + 6,1,6,1,6,1,6,1,6,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,8,1,8,1,8,1, + 8,1,8,1,8,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,10,1,10,1,10,1,10, + 1,10,1,10,1,10,1,10,1,10,1,10,1,11,1,11,1,11,1,11,1,11,1,11,1,11, + 1,11,1,11,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12, + 1,12,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,14, + 1,14,1,14,1,14,1,14,1,14,1,15,1,15,1,15,1,15,1,15,1,15,1,15,1,15, + 1,16,1,16,1,16,1,17,1,17,1,17,1,17,1,17,1,18,1,18,1,18,1,19,1,19, + 1,19,1,19,1,19,1,19,1,19,1,19,1,20,1,20,1,20,1,20,1,20,1,20,1,20, + 1,21,1,21,1,21,1,21,1,21,1,21,1,22,1,22,1,22,1,22,1,22,1,23,1,23, + 1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,24,1,24,1,24,1,24, + 1,24,1,25,1,25,1,25,1,25,1,25,1,25,1,26,1,26,1,26,1,26,1,27,1,27, + 1,27,1,27,1,27,1,27,1,27,1,27,1,27,1,27,1,27,1,27,1,28,1,28,1,28, + 1,29,1,29,1,29,1,29,1,29,1,29,1,29,1,30,1,30,1,30,1,31,1,31,1,31, + 1,31,1,31,1,31,1,31,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,33, + 1,33,1,33,1,33,1,33,1,33,1,33,1,34,1,34,1,34,1,34,1,34,1,34,1,34, + 1,34,1,34,1,34,1,34,1,35,1,35,1,35,1,35,1,35,1,35,1,35,1,36,1,36, + 1,36,1,36,1,36,1,36,1,36,1,36,1,36,1,37,1,37,1,37,1,38,1,38,1,38, + 1,38,1,39,1,39,1,39,1,39,1,39,1,40,1,40,1,40,1,40,1,40,1,40,1,41, + 1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,42,1,42,1,42,1,42,1,42, + 1,42,1,42,1,42,1,42,1,43,1,43,1,43,1,43,1,44,1,44,1,44,1,44,1,45, + 1,45,1,45,1,45,1,46,1,46,1,46,1,46,1,46,1,46,1,47,1,47,1,47,1,47, + 1,47,1,47,1,48,1,48,1,48,1,48,1,48,1,49,1,49,1,49,1,49,1,49,1,50, + 1,50,1,50,1,50,1,50,1,50,1,51,1,51,1,51,1,51,1,51,1,51,1,51,1,51, + 1,52,1,52,1,52,1,52,1,52,1,52,1,52,1,52,1,53,1,53,1,53,1,53,1,53, + 1,53,1,53,1,53,1,53,1,53,1,53,1,54,1,54,1,54,1,54,1,54,1,55,1,55, + 1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,56,1,56,1,56, + 1,56,1,56,1,56,1,56,1,56,1,56,1,56,1,56,1,57,1,57,1,57,1,57,1,57, + 1,57,1,57,1,57,1,57,1,57,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58, + 1,58,1,58,1,58,1,58,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59, + 1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,60,1,60, + 1,60,1,60,1,60,1,61,1,61,1,61,1,61,1,61,1,61,1,61,1,61,1,61,1,61, + 1,61,1,61,1,61,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62, + 1,62,1,62,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63, + 1,63,1,64,1,64,1,64,1,64,1,64,1,65,1,65,1,65,1,65,1,65,1,65,1,65, + 1,65,1,66,1,66,1,66,1,66,1,66,1,67,1,67,1,67,1,67,1,67,1,67,1,67, + 1,67,1,67,1,67,1,67,1,67,1,67,1,68,1,68,1,68,1,68,1,68,1,68,1,68, + 1,68,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,70,1,70,1,70, + 1,70,1,70,1,70,1,70,1,70,1,70,1,70,1,70,1,70,1,70,1,70,1,71,1,71, + 1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,72,1,72,1,72,1,72,1,72,1,73, + 1,73,1,73,1,73,1,73,1,74,1,74,1,74,1,74,1,74,1,74,1,75,1,75,1,75, + 1,75,1,75,1,75,1,75,1,76,1,76,1,76,1,76,1,76,1,76,1,77,1,77,1,77, + 1,77,1,77,1,77,1,78,1,78,1,78,1,78,1,78,1,78,1,78,1,79,1,79,1,79, + 1,79,1,79,1,79,1,79,1,80,1,80,1,80,1,80,1,80,1,80,1,80,1,81,1,81, + 1,81,1,81,1,81,1,82,1,82,1,82,1,82,1,82,1,82,1,83,1,83,1,83,1,83, + 1,83,1,84,1,84,1,84,1,85,1,85,1,86,1,86,1,87,1,87,1,88,1,88,1,89, + 1,89,1,90,1,90,1,91,1,91,1,92,1,92,1,93,1,93,1,94,1,94,1,95,1,95, + 1,96,1,96,1,97,3,97,877,8,97,1,97,4,97,880,8,97,11,97,12,97,881, + 1,98,3,98,885,8,98,1,98,1,98,1,98,5,98,890,8,98,10,98,12,98,893, + 9,98,3,98,895,8,98,1,98,1,98,4,98,899,8,98,11,98,12,98,900,3,98, + 903,8,98,1,98,1,98,3,98,907,8,98,1,98,4,98,910,8,98,11,98,12,98, + 911,3,98,914,8,98,1,99,1,99,5,99,918,8,99,10,99,12,99,921,9,99,1, + 100,1,100,1,100,5,100,926,8,100,10,100,12,100,929,9,100,1,100,1, + 100,1,101,1,101,1,101,1,101,1,101,1,101,1,101,1,101,3,101,941,8, + 101,1,102,1,102,1,103,1,103,1,103,1,103,5,103,949,8,103,10,103,12, + 103,952,9,103,1,103,1,103,1,104,1,104,1,104,1,104,5,104,960,8,104, + 10,104,12,104,963,9,104,1,104,1,104,1,104,1,104,1,104,1,105,4,105, + 971,8,105,11,105,12,105,972,1,105,1,105,1,961,0,106,1,1,3,2,5,3, + 7,4,9,5,11,6,13,7,15,8,17,9,19,10,21,11,23,12,25,13,27,14,29,15, + 31,16,33,17,35,18,37,19,39,20,41,21,43,22,45,23,47,24,49,25,51,26, + 53,27,55,28,57,29,59,30,61,31,63,32,65,33,67,34,69,35,71,36,73,37, + 75,38,77,39,79,40,81,41,83,42,85,43,87,44,89,45,91,46,93,47,95,48, + 97,49,99,50,101,51,103,52,105,53,107,54,109,55,111,56,113,57,115, + 58,117,59,119,60,121,61,123,62,125,63,127,64,129,65,131,66,133,67, + 135,68,137,69,139,70,141,71,143,72,145,73,147,74,149,75,151,76,153, + 77,155,78,157,79,159,80,161,81,163,82,165,83,167,84,169,85,171,86, + 173,87,175,88,177,89,179,90,181,91,183,92,185,93,187,94,189,95,191, + 96,193,97,195,98,197,99,199,100,201,101,203,0,205,0,207,102,209, + 103,211,104,1,0,11,1,0,48,57,1,0,49,57,2,0,69,69,101,101,2,0,43, + 43,45,45,3,0,65,90,95,95,97,122,4,0,48,57,65,90,95,95,97,122,4,0, + 10,10,13,13,34,34,92,92,8,0,34,34,47,47,92,92,98,98,102,102,110, + 110,114,114,116,116,3,0,48,57,65,70,97,102,2,0,10,10,13,13,3,0,9, + 10,13,13,32,32,990,0,1,1,0,0,0,0,3,1,0,0,0,0,5,1,0,0,0,0,7,1,0,0, + 0,0,9,1,0,0,0,0,11,1,0,0,0,0,13,1,0,0,0,0,15,1,0,0,0,0,17,1,0,0, + 0,0,19,1,0,0,0,0,21,1,0,0,0,0,23,1,0,0,0,0,25,1,0,0,0,0,27,1,0,0, + 0,0,29,1,0,0,0,0,31,1,0,0,0,0,33,1,0,0,0,0,35,1,0,0,0,0,37,1,0,0, + 0,0,39,1,0,0,0,0,41,1,0,0,0,0,43,1,0,0,0,0,45,1,0,0,0,0,47,1,0,0, + 0,0,49,1,0,0,0,0,51,1,0,0,0,0,53,1,0,0,0,0,55,1,0,0,0,0,57,1,0,0, + 0,0,59,1,0,0,0,0,61,1,0,0,0,0,63,1,0,0,0,0,65,1,0,0,0,0,67,1,0,0, + 0,0,69,1,0,0,0,0,71,1,0,0,0,0,73,1,0,0,0,0,75,1,0,0,0,0,77,1,0,0, + 0,0,79,1,0,0,0,0,81,1,0,0,0,0,83,1,0,0,0,0,85,1,0,0,0,0,87,1,0,0, + 0,0,89,1,0,0,0,0,91,1,0,0,0,0,93,1,0,0,0,0,95,1,0,0,0,0,97,1,0,0, + 0,0,99,1,0,0,0,0,101,1,0,0,0,0,103,1,0,0,0,0,105,1,0,0,0,0,107,1, + 0,0,0,0,109,1,0,0,0,0,111,1,0,0,0,0,113,1,0,0,0,0,115,1,0,0,0,0, + 117,1,0,0,0,0,119,1,0,0,0,0,121,1,0,0,0,0,123,1,0,0,0,0,125,1,0, + 0,0,0,127,1,0,0,0,0,129,1,0,0,0,0,131,1,0,0,0,0,133,1,0,0,0,0,135, + 1,0,0,0,0,137,1,0,0,0,0,139,1,0,0,0,0,141,1,0,0,0,0,143,1,0,0,0, + 0,145,1,0,0,0,0,147,1,0,0,0,0,149,1,0,0,0,0,151,1,0,0,0,0,153,1, + 0,0,0,0,155,1,0,0,0,0,157,1,0,0,0,0,159,1,0,0,0,0,161,1,0,0,0,0, + 163,1,0,0,0,0,165,1,0,0,0,0,167,1,0,0,0,0,169,1,0,0,0,0,171,1,0, + 0,0,0,173,1,0,0,0,0,175,1,0,0,0,0,177,1,0,0,0,0,179,1,0,0,0,0,181, + 1,0,0,0,0,183,1,0,0,0,0,185,1,0,0,0,0,187,1,0,0,0,0,189,1,0,0,0, + 0,191,1,0,0,0,0,193,1,0,0,0,0,195,1,0,0,0,0,197,1,0,0,0,0,199,1, + 0,0,0,0,201,1,0,0,0,0,207,1,0,0,0,0,209,1,0,0,0,0,211,1,0,0,0,1, + 213,1,0,0,0,3,223,1,0,0,0,5,232,1,0,0,0,7,239,1,0,0,0,9,248,1,0, + 0,0,11,253,1,0,0,0,13,263,1,0,0,0,15,274,1,0,0,0,17,282,1,0,0,0, + 19,288,1,0,0,0,21,297,1,0,0,0,23,307,1,0,0,0,25,316,1,0,0,0,27,328, + 1,0,0,0,29,339,1,0,0,0,31,345,1,0,0,0,33,353,1,0,0,0,35,356,1,0, + 0,0,37,361,1,0,0,0,39,364,1,0,0,0,41,372,1,0,0,0,43,379,1,0,0,0, + 45,385,1,0,0,0,47,390,1,0,0,0,49,401,1,0,0,0,51,406,1,0,0,0,53,412, + 1,0,0,0,55,416,1,0,0,0,57,428,1,0,0,0,59,431,1,0,0,0,61,438,1,0, + 0,0,63,441,1,0,0,0,65,448,1,0,0,0,67,456,1,0,0,0,69,463,1,0,0,0, + 71,474,1,0,0,0,73,481,1,0,0,0,75,490,1,0,0,0,77,493,1,0,0,0,79,497, + 1,0,0,0,81,502,1,0,0,0,83,508,1,0,0,0,85,517,1,0,0,0,87,526,1,0, + 0,0,89,530,1,0,0,0,91,534,1,0,0,0,93,538,1,0,0,0,95,544,1,0,0,0, + 97,550,1,0,0,0,99,555,1,0,0,0,101,560,1,0,0,0,103,566,1,0,0,0,105, + 574,1,0,0,0,107,582,1,0,0,0,109,593,1,0,0,0,111,598,1,0,0,0,113, + 610,1,0,0,0,115,621,1,0,0,0,117,631,1,0,0,0,119,643,1,0,0,0,121, + 663,1,0,0,0,123,668,1,0,0,0,125,681,1,0,0,0,127,693,1,0,0,0,129, + 705,1,0,0,0,131,710,1,0,0,0,133,718,1,0,0,0,135,723,1,0,0,0,137, + 736,1,0,0,0,139,744,1,0,0,0,141,753,1,0,0,0,143,767,1,0,0,0,145, + 776,1,0,0,0,147,781,1,0,0,0,149,786,1,0,0,0,151,792,1,0,0,0,153, + 799,1,0,0,0,155,805,1,0,0,0,157,811,1,0,0,0,159,818,1,0,0,0,161, + 825,1,0,0,0,163,832,1,0,0,0,165,837,1,0,0,0,167,843,1,0,0,0,169, + 848,1,0,0,0,171,851,1,0,0,0,173,853,1,0,0,0,175,855,1,0,0,0,177, + 857,1,0,0,0,179,859,1,0,0,0,181,861,1,0,0,0,183,863,1,0,0,0,185, + 865,1,0,0,0,187,867,1,0,0,0,189,869,1,0,0,0,191,871,1,0,0,0,193, + 873,1,0,0,0,195,876,1,0,0,0,197,884,1,0,0,0,199,915,1,0,0,0,201, + 922,1,0,0,0,203,932,1,0,0,0,205,942,1,0,0,0,207,944,1,0,0,0,209, + 955,1,0,0,0,211,970,1,0,0,0,213,214,5,119,0,0,214,215,5,111,0,0, + 215,216,5,114,0,0,216,217,5,107,0,0,217,218,5,115,0,0,218,219,5, + 112,0,0,219,220,5,97,0,0,220,221,5,99,0,0,221,222,5,101,0,0,222, + 2,1,0,0,0,223,224,5,102,0,0,224,225,5,114,0,0,225,226,5,97,0,0,226, + 227,5,103,0,0,227,228,5,109,0,0,228,229,5,101,0,0,229,230,5,110, + 0,0,230,231,5,116,0,0,231,4,1,0,0,0,232,233,5,105,0,0,233,234,5, + 109,0,0,234,235,5,112,0,0,235,236,5,111,0,0,236,237,5,114,0,0,237, + 238,5,116,0,0,238,6,1,0,0,0,239,240,5,101,0,0,240,241,5,120,0,0, + 241,242,5,116,0,0,242,243,5,101,0,0,243,244,5,114,0,0,244,245,5, + 110,0,0,245,246,5,97,0,0,246,247,5,108,0,0,247,8,1,0,0,0,248,249, + 5,97,0,0,249,250,5,116,0,0,250,251,5,111,0,0,251,252,5,109,0,0,252, + 10,1,0,0,0,253,254,5,105,0,0,254,255,5,110,0,0,255,256,5,116,0,0, + 256,257,5,101,0,0,257,258,5,114,0,0,258,259,5,102,0,0,259,260,5, + 97,0,0,260,261,5,99,0,0,261,262,5,101,0,0,262,12,1,0,0,0,263,264, + 5,105,0,0,264,265,5,110,0,0,265,266,5,116,0,0,266,267,5,101,0,0, + 267,268,5,114,0,0,268,269,5,102,0,0,269,270,5,97,0,0,270,271,5,99, + 0,0,271,272,5,101,0,0,272,273,5,115,0,0,273,14,1,0,0,0,274,275,5, + 112,0,0,275,276,5,97,0,0,276,277,5,99,0,0,277,278,5,107,0,0,278, + 279,5,97,0,0,279,280,5,103,0,0,280,281,5,101,0,0,281,16,1,0,0,0, + 282,283,5,118,0,0,283,284,5,97,0,0,284,285,5,108,0,0,285,286,5,117, + 0,0,286,287,5,101,0,0,287,18,1,0,0,0,288,289,5,114,0,0,289,290,5, + 101,0,0,290,291,5,108,0,0,291,292,5,97,0,0,292,293,5,116,0,0,293, + 294,5,105,0,0,294,295,5,111,0,0,295,296,5,110,0,0,296,20,1,0,0,0, + 297,298,5,111,0,0,298,299,5,112,0,0,299,300,5,101,0,0,300,301,5, + 114,0,0,301,302,5,97,0,0,302,303,5,116,0,0,303,304,5,105,0,0,304, + 305,5,111,0,0,305,306,5,110,0,0,306,22,1,0,0,0,307,308,5,102,0,0, + 308,309,5,117,0,0,309,310,5,110,0,0,310,311,5,99,0,0,311,312,5,116, + 0,0,312,313,5,105,0,0,313,314,5,111,0,0,314,315,5,110,0,0,315,24, + 1,0,0,0,316,317,5,99,0,0,317,318,5,111,0,0,318,319,5,110,0,0,319, + 320,5,115,0,0,320,321,5,116,0,0,321,322,5,114,0,0,322,323,5,117, + 0,0,323,324,5,99,0,0,324,325,5,116,0,0,325,326,5,111,0,0,326,327, + 5,114,0,0,327,26,1,0,0,0,328,329,5,99,0,0,329,330,5,111,0,0,330, + 331,5,110,0,0,331,332,5,115,0,0,332,333,5,116,0,0,333,334,5,114, + 0,0,334,335,5,117,0,0,335,336,5,99,0,0,336,337,5,116,0,0,337,338, + 5,115,0,0,338,28,1,0,0,0,339,340,5,105,0,0,340,341,5,110,0,0,341, + 342,5,112,0,0,342,343,5,117,0,0,343,344,5,116,0,0,344,30,1,0,0,0, + 345,346,5,99,0,0,346,347,5,111,0,0,347,348,5,110,0,0,348,349,5,102, + 0,0,349,350,5,111,0,0,350,351,5,114,0,0,351,352,5,109,0,0,352,32, + 1,0,0,0,353,354,5,97,0,0,354,355,5,115,0,0,355,34,1,0,0,0,356,357, + 5,98,0,0,357,358,5,105,0,0,358,359,5,110,0,0,359,360,5,100,0,0,360, + 36,1,0,0,0,361,362,5,116,0,0,362,363,5,111,0,0,363,38,1,0,0,0,364, + 365,5,112,0,0,365,366,5,114,0,0,366,367,5,105,0,0,367,368,5,118, + 0,0,368,369,5,97,0,0,369,370,5,116,0,0,370,371,5,101,0,0,371,40, + 1,0,0,0,372,373,5,115,0,0,373,374,5,104,0,0,374,375,5,97,0,0,375, + 376,5,114,0,0,376,377,5,101,0,0,377,378,5,100,0,0,378,42,1,0,0,0, + 379,380,5,115,0,0,380,381,5,116,0,0,381,382,5,97,0,0,382,383,5,116, + 0,0,383,384,5,101,0,0,384,44,1,0,0,0,385,386,5,101,0,0,386,387,5, + 100,0,0,387,388,5,103,0,0,388,389,5,101,0,0,389,46,1,0,0,0,390,391, + 5,112,0,0,391,392,5,114,0,0,392,393,5,111,0,0,393,394,5,106,0,0, + 394,395,5,101,0,0,395,396,5,99,0,0,396,397,5,116,0,0,397,398,5,105, + 0,0,398,399,5,111,0,0,399,400,5,110,0,0,400,48,1,0,0,0,401,402,5, + 119,0,0,402,403,5,105,0,0,403,404,5,116,0,0,404,405,5,104,0,0,405, + 50,1,0,0,0,406,407,5,117,0,0,407,408,5,115,0,0,408,409,5,105,0,0, + 409,410,5,110,0,0,410,411,5,103,0,0,411,52,1,0,0,0,412,413,5,118, + 0,0,413,414,5,105,0,0,414,415,5,97,0,0,415,54,1,0,0,0,416,417,5, + 109,0,0,417,418,5,97,0,0,418,419,5,116,0,0,419,420,5,101,0,0,420, + 421,5,114,0,0,421,422,5,105,0,0,422,423,5,97,0,0,423,424,5,108,0, + 0,424,425,5,105,0,0,425,426,5,122,0,0,426,427,5,101,0,0,427,56,1, + 0,0,0,428,429,5,105,0,0,429,430,5,102,0,0,430,58,1,0,0,0,431,432, + 5,97,0,0,432,433,5,98,0,0,433,434,5,115,0,0,434,435,5,101,0,0,435, + 436,5,110,0,0,436,437,5,116,0,0,437,60,1,0,0,0,438,439,5,111,0,0, + 439,440,5,110,0,0,440,62,1,0,0,0,441,442,5,112,0,0,442,443,5,111, + 0,0,443,444,5,108,0,0,444,445,5,105,0,0,445,446,5,99,0,0,446,447, + 5,121,0,0,447,64,1,0,0,0,448,449,5,100,0,0,449,450,5,101,0,0,450, + 451,5,102,0,0,451,452,5,97,0,0,452,453,5,117,0,0,453,454,5,108,0, + 0,454,455,5,116,0,0,455,66,1,0,0,0,456,457,5,115,0,0,457,458,5,111, + 0,0,458,459,5,117,0,0,459,460,5,114,0,0,460,461,5,99,0,0,461,462, + 5,101,0,0,462,68,1,0,0,0,463,464,5,114,0,0,464,465,5,101,0,0,465, + 466,5,112,0,0,466,467,5,111,0,0,467,468,5,115,0,0,468,469,5,105, + 0,0,469,470,5,116,0,0,470,471,5,111,0,0,471,472,5,114,0,0,472,473, + 5,121,0,0,473,70,1,0,0,0,474,475,5,99,0,0,475,476,5,111,0,0,476, + 477,5,109,0,0,477,478,5,109,0,0,478,479,5,105,0,0,479,480,5,116, + 0,0,480,72,1,0,0,0,481,482,5,114,0,0,482,483,5,101,0,0,483,484,5, + 118,0,0,484,485,5,105,0,0,485,486,5,115,0,0,486,487,5,105,0,0,487, + 488,5,111,0,0,488,489,5,110,0,0,489,74,1,0,0,0,490,491,5,105,0,0, + 491,492,5,100,0,0,492,76,1,0,0,0,493,494,5,100,0,0,494,495,5,111, + 0,0,495,496,5,99,0,0,496,78,1,0,0,0,497,498,5,109,0,0,498,499,5, + 111,0,0,499,500,5,100,0,0,500,501,5,101,0,0,501,80,1,0,0,0,502,503, + 5,101,0,0,503,504,5,109,0,0,504,505,5,105,0,0,505,506,5,116,0,0, + 506,507,5,115,0,0,507,82,1,0,0,0,508,509,5,114,0,0,509,510,5,101, + 0,0,510,511,5,99,0,0,511,512,5,101,0,0,512,513,5,105,0,0,513,514, + 5,118,0,0,514,515,5,101,0,0,515,516,5,114,0,0,516,84,1,0,0,0,517, + 518,5,114,0,0,518,519,5,101,0,0,519,520,5,113,0,0,520,521,5,117, + 0,0,521,522,5,105,0,0,522,523,5,114,0,0,523,524,5,101,0,0,524,525, + 5,115,0,0,525,86,1,0,0,0,526,527,5,97,0,0,527,528,5,110,0,0,528, + 529,5,121,0,0,529,88,1,0,0,0,530,531,5,103,0,0,531,532,5,101,0,0, + 532,533,5,116,0,0,533,90,1,0,0,0,534,535,5,115,0,0,535,536,5,101, + 0,0,536,537,5,116,0,0,537,92,1,0,0,0,538,539,5,119,0,0,539,540,5, + 97,0,0,540,541,5,116,0,0,541,542,5,99,0,0,542,543,5,104,0,0,543, + 94,1,0,0,0,544,545,5,115,0,0,545,546,5,116,0,0,546,547,5,97,0,0, + 547,548,5,114,0,0,548,549,5,116,0,0,549,96,1,0,0,0,550,551,5,115, + 0,0,551,552,5,116,0,0,552,553,5,111,0,0,553,554,5,112,0,0,554,98, + 1,0,0,0,555,556,5,114,0,0,556,557,5,101,0,0,557,558,5,97,0,0,558, + 559,5,100,0,0,559,100,1,0,0,0,560,561,5,119,0,0,561,562,5,114,0, + 0,562,563,5,105,0,0,563,564,5,116,0,0,564,565,5,101,0,0,565,102, + 1,0,0,0,566,567,5,114,0,0,567,568,5,101,0,0,568,569,5,115,0,0,569, + 570,5,111,0,0,570,571,5,108,0,0,571,572,5,118,0,0,572,573,5,101, + 0,0,573,104,1,0,0,0,574,575,5,99,0,0,575,576,5,111,0,0,576,577,5, + 110,0,0,577,578,5,110,0,0,578,579,5,101,0,0,579,580,5,99,0,0,580, + 581,5,116,0,0,581,106,1,0,0,0,582,583,5,100,0,0,583,584,5,105,0, + 0,584,585,5,115,0,0,585,586,5,99,0,0,586,587,5,111,0,0,587,588,5, + 110,0,0,588,589,5,110,0,0,589,590,5,101,0,0,590,591,5,99,0,0,591, + 592,5,116,0,0,592,108,1,0,0,0,593,594,5,99,0,0,594,595,5,97,0,0, + 595,596,5,108,0,0,596,597,5,108,0,0,597,110,1,0,0,0,598,599,5,119, + 0,0,599,600,5,97,0,0,600,601,5,116,0,0,601,602,5,99,0,0,602,603, + 5,104,0,0,603,604,5,45,0,0,604,605,5,115,0,0,605,606,5,116,0,0,606, + 607,5,97,0,0,607,608,5,114,0,0,608,609,5,116,0,0,609,112,1,0,0,0, + 610,611,5,119,0,0,611,612,5,97,0,0,612,613,5,116,0,0,613,614,5,99, + 0,0,614,615,5,104,0,0,615,616,5,45,0,0,616,617,5,115,0,0,617,618, + 5,116,0,0,618,619,5,111,0,0,619,620,5,112,0,0,620,114,1,0,0,0,621, + 622,5,115,0,0,622,623,5,117,0,0,623,624,5,98,0,0,624,625,5,115,0, + 0,625,626,5,99,0,0,626,627,5,114,0,0,627,628,5,105,0,0,628,629,5, + 98,0,0,629,630,5,101,0,0,630,116,1,0,0,0,631,632,5,117,0,0,632,633, + 5,110,0,0,633,634,5,115,0,0,634,635,5,117,0,0,635,636,5,98,0,0,636, + 637,5,115,0,0,637,638,5,99,0,0,638,639,5,114,0,0,639,640,5,105,0, + 0,640,641,5,98,0,0,641,642,5,101,0,0,642,118,1,0,0,0,643,644,5,111, + 0,0,644,645,5,112,0,0,645,646,5,116,0,0,646,647,5,105,0,0,647,648, + 5,109,0,0,648,649,5,105,0,0,649,650,5,115,0,0,650,651,5,116,0,0, + 651,652,5,105,0,0,652,653,5,99,0,0,653,654,5,45,0,0,654,655,5,114, + 0,0,655,656,5,101,0,0,656,657,5,103,0,0,657,658,5,105,0,0,658,659, + 5,115,0,0,659,660,5,116,0,0,660,661,5,101,0,0,661,662,5,114,0,0, + 662,120,1,0,0,0,663,664,5,99,0,0,664,665,5,114,0,0,665,666,5,100, + 0,0,666,667,5,116,0,0,667,122,1,0,0,0,668,669,5,111,0,0,669,670, + 5,112,0,0,670,671,5,116,0,0,671,672,5,105,0,0,672,673,5,111,0,0, + 673,674,5,110,0,0,674,675,5,97,0,0,675,676,5,108,0,0,676,677,5,45, + 0,0,677,678,5,111,0,0,678,679,5,110,0,0,679,680,5,101,0,0,680,124, + 1,0,0,0,681,682,5,101,0,0,682,683,5,120,0,0,683,684,5,97,0,0,684, + 685,5,99,0,0,685,686,5,116,0,0,686,687,5,108,0,0,687,688,5,121,0, + 0,688,689,5,45,0,0,689,690,5,111,0,0,690,691,5,110,0,0,691,692,5, + 101,0,0,692,126,1,0,0,0,693,694,5,109,0,0,694,695,5,97,0,0,695,696, + 5,110,0,0,696,697,5,121,0,0,697,698,5,45,0,0,698,699,5,117,0,0,699, + 700,5,110,0,0,700,701,5,105,0,0,701,702,5,113,0,0,702,703,5,117, + 0,0,703,704,5,101,0,0,704,128,1,0,0,0,705,706,5,109,0,0,706,707, + 5,97,0,0,707,708,5,110,0,0,708,709,5,121,0,0,709,130,1,0,0,0,710, + 711,5,111,0,0,711,712,5,114,0,0,712,713,5,100,0,0,713,714,5,101, + 0,0,714,715,5,114,0,0,715,716,5,101,0,0,716,717,5,100,0,0,717,132, + 1,0,0,0,718,719,5,117,0,0,719,720,5,110,0,0,720,721,5,105,0,0,721, + 722,5,116,0,0,722,134,1,0,0,0,723,724,5,119,0,0,724,725,5,97,0,0, + 725,726,5,116,0,0,726,727,5,99,0,0,727,728,5,104,0,0,728,729,5,45, + 0,0,729,730,5,104,0,0,730,731,5,97,0,0,731,732,5,110,0,0,732,733, + 5,100,0,0,733,734,5,108,0,0,734,735,5,101,0,0,735,136,1,0,0,0,736, + 737,5,109,0,0,737,738,5,101,0,0,738,739,5,115,0,0,739,740,5,115, + 0,0,740,741,5,97,0,0,741,742,5,103,0,0,742,743,5,101,0,0,743,138, + 1,0,0,0,744,745,5,97,0,0,745,746,5,116,0,0,746,747,5,111,0,0,747, + 748,5,109,0,0,748,749,5,45,0,0,749,750,5,114,0,0,750,751,5,101,0, + 0,751,752,5,102,0,0,752,140,1,0,0,0,753,754,5,105,0,0,754,755,5, + 110,0,0,755,756,5,116,0,0,756,757,5,101,0,0,757,758,5,114,0,0,758, + 759,5,102,0,0,759,760,5,97,0,0,760,761,5,99,0,0,761,762,5,101,0, + 0,762,763,5,45,0,0,763,764,5,114,0,0,764,765,5,101,0,0,765,766,5, + 102,0,0,766,142,1,0,0,0,767,768,5,111,0,0,768,769,5,112,0,0,769, + 770,5,116,0,0,770,771,5,105,0,0,771,772,5,111,0,0,772,773,5,110, + 0,0,773,774,5,97,0,0,774,775,5,108,0,0,775,144,1,0,0,0,776,777,5, + 108,0,0,777,778,5,105,0,0,778,779,5,115,0,0,779,780,5,116,0,0,780, + 146,1,0,0,0,781,782,5,98,0,0,782,783,5,111,0,0,783,784,5,111,0,0, + 784,785,5,108,0,0,785,148,1,0,0,0,786,787,5,98,0,0,787,788,5,121, + 0,0,788,789,5,116,0,0,789,790,5,101,0,0,790,791,5,115,0,0,791,150, + 1,0,0,0,792,793,5,100,0,0,793,794,5,111,0,0,794,795,5,117,0,0,795, + 796,5,98,0,0,796,797,5,108,0,0,797,798,5,101,0,0,798,152,1,0,0,0, + 799,800,5,105,0,0,800,801,5,110,0,0,801,802,5,116,0,0,802,803,5, + 51,0,0,803,804,5,50,0,0,804,154,1,0,0,0,805,806,5,105,0,0,806,807, + 5,110,0,0,807,808,5,116,0,0,808,809,5,54,0,0,809,810,5,52,0,0,810, + 156,1,0,0,0,811,812,5,115,0,0,812,813,5,116,0,0,813,814,5,114,0, + 0,814,815,5,105,0,0,815,816,5,110,0,0,816,817,5,103,0,0,817,158, + 1,0,0,0,818,819,5,117,0,0,819,820,5,105,0,0,820,821,5,110,0,0,821, + 822,5,116,0,0,822,823,5,51,0,0,823,824,5,50,0,0,824,160,1,0,0,0, + 825,826,5,117,0,0,826,827,5,105,0,0,827,828,5,110,0,0,828,829,5, + 116,0,0,829,830,5,54,0,0,830,831,5,52,0,0,831,162,1,0,0,0,832,833, + 5,116,0,0,833,834,5,114,0,0,834,835,5,117,0,0,835,836,5,101,0,0, + 836,164,1,0,0,0,837,838,5,102,0,0,838,839,5,97,0,0,839,840,5,108, + 0,0,840,841,5,115,0,0,841,842,5,101,0,0,842,166,1,0,0,0,843,844, + 5,110,0,0,844,845,5,117,0,0,845,846,5,108,0,0,846,847,5,108,0,0, + 847,168,1,0,0,0,848,849,5,45,0,0,849,850,5,62,0,0,850,170,1,0,0, + 0,851,852,5,58,0,0,852,172,1,0,0,0,853,854,5,59,0,0,854,174,1,0, + 0,0,855,856,5,44,0,0,856,176,1,0,0,0,857,858,5,46,0,0,858,178,1, + 0,0,0,859,860,5,123,0,0,860,180,1,0,0,0,861,862,5,125,0,0,862,182, + 1,0,0,0,863,864,5,91,0,0,864,184,1,0,0,0,865,866,5,93,0,0,866,186, + 1,0,0,0,867,868,5,40,0,0,868,188,1,0,0,0,869,870,5,41,0,0,870,190, + 1,0,0,0,871,872,5,60,0,0,872,192,1,0,0,0,873,874,5,62,0,0,874,194, + 1,0,0,0,875,877,5,45,0,0,876,875,1,0,0,0,876,877,1,0,0,0,877,879, + 1,0,0,0,878,880,7,0,0,0,879,878,1,0,0,0,880,881,1,0,0,0,881,879, + 1,0,0,0,881,882,1,0,0,0,882,196,1,0,0,0,883,885,5,45,0,0,884,883, + 1,0,0,0,884,885,1,0,0,0,885,894,1,0,0,0,886,895,5,48,0,0,887,891, + 7,1,0,0,888,890,7,0,0,0,889,888,1,0,0,0,890,893,1,0,0,0,891,889, + 1,0,0,0,891,892,1,0,0,0,892,895,1,0,0,0,893,891,1,0,0,0,894,886, + 1,0,0,0,894,887,1,0,0,0,895,902,1,0,0,0,896,898,5,46,0,0,897,899, + 7,0,0,0,898,897,1,0,0,0,899,900,1,0,0,0,900,898,1,0,0,0,900,901, + 1,0,0,0,901,903,1,0,0,0,902,896,1,0,0,0,902,903,1,0,0,0,903,913, + 1,0,0,0,904,906,7,2,0,0,905,907,7,3,0,0,906,905,1,0,0,0,906,907, + 1,0,0,0,907,909,1,0,0,0,908,910,7,0,0,0,909,908,1,0,0,0,910,911, + 1,0,0,0,911,909,1,0,0,0,911,912,1,0,0,0,912,914,1,0,0,0,913,904, + 1,0,0,0,913,914,1,0,0,0,914,198,1,0,0,0,915,919,7,4,0,0,916,918, + 7,5,0,0,917,916,1,0,0,0,918,921,1,0,0,0,919,917,1,0,0,0,919,920, + 1,0,0,0,920,200,1,0,0,0,921,919,1,0,0,0,922,927,5,34,0,0,923,926, + 3,203,101,0,924,926,8,6,0,0,925,923,1,0,0,0,925,924,1,0,0,0,926, + 929,1,0,0,0,927,925,1,0,0,0,927,928,1,0,0,0,928,930,1,0,0,0,929, + 927,1,0,0,0,930,931,5,34,0,0,931,202,1,0,0,0,932,940,5,92,0,0,933, + 941,7,7,0,0,934,935,5,117,0,0,935,936,3,205,102,0,936,937,3,205, + 102,0,937,938,3,205,102,0,938,939,3,205,102,0,939,941,1,0,0,0,940, + 933,1,0,0,0,940,934,1,0,0,0,941,204,1,0,0,0,942,943,7,8,0,0,943, + 206,1,0,0,0,944,945,5,47,0,0,945,946,5,47,0,0,946,950,1,0,0,0,947, + 949,8,9,0,0,948,947,1,0,0,0,949,952,1,0,0,0,950,948,1,0,0,0,950, + 951,1,0,0,0,951,953,1,0,0,0,952,950,1,0,0,0,953,954,6,103,0,0,954, + 208,1,0,0,0,955,956,5,47,0,0,956,957,5,42,0,0,957,961,1,0,0,0,958, + 960,9,0,0,0,959,958,1,0,0,0,960,963,1,0,0,0,961,962,1,0,0,0,961, + 959,1,0,0,0,962,964,1,0,0,0,963,961,1,0,0,0,964,965,5,42,0,0,965, + 966,5,47,0,0,966,967,1,0,0,0,967,968,6,104,0,0,968,210,1,0,0,0,969, + 971,7,10,0,0,970,969,1,0,0,0,971,972,1,0,0,0,972,970,1,0,0,0,972, + 973,1,0,0,0,973,974,1,0,0,0,974,975,6,105,0,0,975,212,1,0,0,0,18, + 0,876,881,884,891,894,900,902,906,911,913,919,925,927,940,950,961, + 972,1,0,1,0 ]; private static __ATN: antlr.ATN; diff --git a/src/capability-language/generated/QuixosCapabilityParser.ts b/src/capability-language/generated/QuixosCapabilityParser.ts index b6b4762..902bfcf 100644 --- a/src/capability-language/generated/QuixosCapabilityParser.ts +++ b/src/capability-language/generated/QuixosCapabilityParser.ts @@ -11,178 +11,182 @@ type int = number; export class QuixosCapabilityParser extends antlr.Parser { public static readonly WORKSPACE = 1; - public static readonly IMPORT = 2; - public static readonly EXTERNAL = 3; - public static readonly ATOM = 4; - public static readonly INTERFACE = 5; - public static readonly INTERFACES = 6; - public static readonly PACKAGE = 7; - public static readonly VALUE = 8; - public static readonly RELATION = 9; - public static readonly OPERATION = 10; - public static readonly FUNCTION = 11; - public static readonly CONSTRUCTOR = 12; - public static readonly CONSTRUCTS = 13; - public static readonly CONFORM = 14; - public static readonly AS = 15; - public static readonly BIND = 16; - public static readonly TO = 17; - public static readonly PRIVATE = 18; - public static readonly SHARED = 19; - public static readonly STATE = 20; - public static readonly EDGE = 21; - public static readonly PROJECTION = 22; - public static readonly WITH = 23; - public static readonly USING = 24; - public static readonly VIA = 25; - public static readonly MATERIALIZE = 26; - public static readonly IF = 27; - public static readonly ABSENT = 28; - public static readonly ON = 29; - public static readonly POLICY = 30; - public static readonly DEFAULT = 31; - public static readonly SOURCE = 32; - public static readonly REPOSITORY = 33; - public static readonly COMMIT = 34; - public static readonly REVISION = 35; - public static readonly ID = 36; - public static readonly DOC = 37; - public static readonly MODE = 38; - public static readonly EMITS = 39; - public static readonly RECEIVER = 40; - public static readonly REQUIRES = 41; - public static readonly ANY = 42; - public static readonly GET = 43; - public static readonly SET = 44; - public static readonly WATCH = 45; - public static readonly START = 46; - public static readonly STOP = 47; - public static readonly READ = 48; - public static readonly WRITE = 49; - public static readonly RESOLVE = 50; - public static readonly CONNECT = 51; - public static readonly DISCONNECT = 52; - public static readonly CALL = 53; - public static readonly WATCH_START = 54; - public static readonly WATCH_STOP = 55; - public static readonly SUBSCRIBE = 56; - public static readonly UNSUBSCRIBE = 57; - public static readonly OPTIMISTIC_REGISTER = 58; - public static readonly CRDT = 59; - public static readonly OPTIONAL_ONE = 60; - public static readonly EXACTLY_ONE = 61; - public static readonly MANY_UNIQUE = 62; - public static readonly MANY = 63; - public static readonly ORDERED = 64; - public static readonly UNIT = 65; - public static readonly WATCH_HANDLE = 66; - public static readonly MESSAGE = 67; - public static readonly ATOM_REF = 68; - public static readonly INTERFACE_REF = 69; - public static readonly OPTIONAL = 70; - public static readonly LIST = 71; - public static readonly BOOL = 72; - public static readonly BYTES = 73; - public static readonly DOUBLE = 74; - public static readonly INT32 = 75; - public static readonly INT64 = 76; - public static readonly STRING = 77; - public static readonly UINT32 = 78; - public static readonly UINT64 = 79; - public static readonly TRUE = 80; - public static readonly FALSE = 81; - public static readonly NULL = 82; - public static readonly ARROW = 83; - public static readonly COLON = 84; - public static readonly SEMI = 85; - public static readonly COMMA = 86; - public static readonly DOT = 87; - public static readonly LBRACE = 88; - public static readonly RBRACE = 89; - public static readonly LBRACK = 90; - public static readonly RBRACK = 91; - public static readonly LPAREN = 92; - public static readonly RPAREN = 93; - public static readonly LT = 94; - public static readonly GT = 95; - public static readonly INTEGER = 96; - public static readonly JSON_NUMBER = 97; - public static readonly IDENTIFIER = 98; - public static readonly STRING_LITERAL = 99; - public static readonly LINE_COMMENT = 100; - public static readonly BLOCK_COMMENT = 101; - public static readonly WS = 102; + public static readonly FRAGMENT = 2; + public static readonly IMPORT = 3; + public static readonly EXTERNAL = 4; + public static readonly ATOM = 5; + public static readonly INTERFACE = 6; + public static readonly INTERFACES = 7; + public static readonly PACKAGE = 8; + public static readonly VALUE = 9; + public static readonly RELATION = 10; + public static readonly OPERATION = 11; + public static readonly FUNCTION = 12; + public static readonly CONSTRUCTOR = 13; + public static readonly CONSTRUCTS = 14; + public static readonly INPUT = 15; + public static readonly CONFORM = 16; + public static readonly AS = 17; + public static readonly BIND = 18; + public static readonly TO = 19; + public static readonly PRIVATE = 20; + public static readonly SHARED = 21; + public static readonly STATE = 22; + public static readonly EDGE = 23; + public static readonly PROJECTION = 24; + public static readonly WITH = 25; + public static readonly USING = 26; + public static readonly VIA = 27; + public static readonly MATERIALIZE = 28; + public static readonly IF = 29; + public static readonly ABSENT = 30; + public static readonly ON = 31; + public static readonly POLICY = 32; + public static readonly DEFAULT = 33; + public static readonly SOURCE = 34; + public static readonly REPOSITORY = 35; + public static readonly COMMIT = 36; + public static readonly REVISION = 37; + public static readonly ID = 38; + public static readonly DOC = 39; + public static readonly MODE = 40; + public static readonly EMITS = 41; + public static readonly RECEIVER = 42; + public static readonly REQUIRES = 43; + public static readonly ANY = 44; + public static readonly GET = 45; + public static readonly SET = 46; + public static readonly WATCH = 47; + public static readonly START = 48; + public static readonly STOP = 49; + public static readonly READ = 50; + public static readonly WRITE = 51; + public static readonly RESOLVE = 52; + public static readonly CONNECT = 53; + public static readonly DISCONNECT = 54; + public static readonly CALL = 55; + public static readonly WATCH_START = 56; + public static readonly WATCH_STOP = 57; + public static readonly SUBSCRIBE = 58; + public static readonly UNSUBSCRIBE = 59; + public static readonly OPTIMISTIC_REGISTER = 60; + public static readonly CRDT = 61; + public static readonly OPTIONAL_ONE = 62; + public static readonly EXACTLY_ONE = 63; + public static readonly MANY_UNIQUE = 64; + public static readonly MANY = 65; + public static readonly ORDERED = 66; + public static readonly UNIT = 67; + public static readonly WATCH_HANDLE = 68; + public static readonly MESSAGE = 69; + public static readonly ATOM_REF = 70; + public static readonly INTERFACE_REF = 71; + public static readonly OPTIONAL = 72; + public static readonly LIST = 73; + public static readonly BOOL = 74; + public static readonly BYTES = 75; + public static readonly DOUBLE = 76; + public static readonly INT32 = 77; + public static readonly INT64 = 78; + public static readonly STRING = 79; + public static readonly UINT32 = 80; + public static readonly UINT64 = 81; + public static readonly TRUE = 82; + public static readonly FALSE = 83; + public static readonly NULL = 84; + public static readonly ARROW = 85; + public static readonly COLON = 86; + public static readonly SEMI = 87; + public static readonly COMMA = 88; + public static readonly DOT = 89; + public static readonly LBRACE = 90; + public static readonly RBRACE = 91; + public static readonly LBRACK = 92; + public static readonly RBRACK = 93; + public static readonly LPAREN = 94; + public static readonly RPAREN = 95; + public static readonly LT = 96; + public static readonly GT = 97; + public static readonly INTEGER = 98; + public static readonly JSON_NUMBER = 99; + public static readonly IDENTIFIER = 100; + public static readonly STRING_LITERAL = 101; + public static readonly LINE_COMMENT = 102; + public static readonly BLOCK_COMMENT = 103; + public static readonly WS = 104; public static readonly RULE_document = 0; - public static readonly RULE_workspaceDecl = 1; - public static readonly RULE_workspaceItem = 2; - public static readonly RULE_resourceImportDecl = 3; - public static readonly RULE_externalAtomDecl = 4; - public static readonly RULE_externalInterfaceDecl = 5; - public static readonly RULE_resourcePreamble = 6; - public static readonly RULE_atomDecl = 7; - public static readonly RULE_interfaceResourceDecl = 8; - public static readonly RULE_interfaceMember = 9; - public static readonly RULE_operationMember = 10; - public static readonly RULE_valueMember = 11; - public static readonly RULE_valueMemberOperation = 12; - public static readonly RULE_relationshipMember = 13; - public static readonly RULE_relationshipOperation = 14; - public static readonly RULE_targetConstraint = 15; - public static readonly RULE_packageResourceDecl = 16; - public static readonly RULE_packageExport = 17; - public static readonly RULE_packageOperationExport = 18; - public static readonly RULE_packageFunctionExport = 19; - public static readonly RULE_packageConstructorExport = 20; - public static readonly RULE_eventClause = 21; - public static readonly RULE_operationMode = 22; - public static readonly RULE_receiverRequirement = 23; - public static readonly RULE_identifierList = 24; - public static readonly RULE_dependencyBlock = 25; - public static readonly RULE_dependencyPort = 26; - public static readonly RULE_primitiveList = 27; - public static readonly RULE_primitive = 28; - public static readonly RULE_sharedAttachmentDecl = 29; - public static readonly RULE_attachmentDecl = 30; - public static readonly RULE_stateDecl = 31; - public static readonly RULE_storagePolicy = 32; - public static readonly RULE_edgeDecl = 33; - public static readonly RULE_edgeEndpoint = 34; - public static readonly RULE_conformanceDecl = 35; - public static readonly RULE_conformanceItem = 36; - public static readonly RULE_relationshipMaterializationDecl = 37; - public static readonly RULE_operationBindingDecl = 38; - public static readonly RULE_memberOperationRef = 39; - public static readonly RULE_operationName = 40; - public static readonly RULE_operationProvider = 41; - public static readonly RULE_statePrimitive = 42; - public static readonly RULE_edgePrimitive = 43; - public static readonly RULE_dependencyBindingBlock = 44; - public static readonly RULE_dependencyBinding = 45; - public static readonly RULE_constructorBindingDecl = 46; - public static readonly RULE_valueType = 47; - public static readonly RULE_scalarType = 48; - public static readonly RULE_cardinality = 49; - public static readonly RULE_jsonLiteral = 50; - public static readonly RULE_jsonObject = 51; - public static readonly RULE_jsonMember = 52; - public static readonly RULE_jsonArray = 53; - public static readonly RULE_identifier = 54; - public static readonly RULE_stringLiteral = 55; + public static readonly RULE_fragmentDecl = 1; + public static readonly RULE_sourceImportDecl = 2; + public static readonly RULE_workspaceDecl = 3; + public static readonly RULE_workspaceItem = 4; + public static readonly RULE_resourceImportDecl = 5; + public static readonly RULE_externalAtomDecl = 6; + public static readonly RULE_externalInterfaceDecl = 7; + public static readonly RULE_resourcePreamble = 8; + public static readonly RULE_atomDecl = 9; + public static readonly RULE_interfaceResourceDecl = 10; + public static readonly RULE_interfaceMember = 11; + public static readonly RULE_operationMember = 12; + public static readonly RULE_valueMember = 13; + public static readonly RULE_valueMemberOperation = 14; + public static readonly RULE_relationshipMember = 15; + public static readonly RULE_relationshipOperation = 16; + public static readonly RULE_targetConstraint = 17; + public static readonly RULE_packageResourceDecl = 18; + public static readonly RULE_packageExport = 19; + public static readonly RULE_packageOperationExport = 20; + public static readonly RULE_packageFunctionExport = 21; + public static readonly RULE_packageConstructorExport = 22; + public static readonly RULE_eventClause = 23; + public static readonly RULE_operationMode = 24; + public static readonly RULE_receiverRequirement = 25; + public static readonly RULE_identifierList = 26; + public static readonly RULE_dependencyBlock = 27; + public static readonly RULE_dependencyPort = 28; + public static readonly RULE_primitiveList = 29; + public static readonly RULE_primitive = 30; + public static readonly RULE_sharedAttachmentDecl = 31; + public static readonly RULE_attachmentDecl = 32; + public static readonly RULE_stateDecl = 33; + public static readonly RULE_storagePolicy = 34; + public static readonly RULE_edgeDecl = 35; + public static readonly RULE_edgeEndpoint = 36; + public static readonly RULE_conformanceDecl = 37; + public static readonly RULE_conformanceItem = 38; + public static readonly RULE_relationshipMaterializationDecl = 39; + public static readonly RULE_operationBindingDecl = 40; + public static readonly RULE_memberOperationRef = 41; + public static readonly RULE_operationName = 42; + public static readonly RULE_operationProvider = 43; + public static readonly RULE_statePrimitive = 44; + public static readonly RULE_edgePrimitive = 45; + public static readonly RULE_dependencyBindingBlock = 46; + public static readonly RULE_dependencyBinding = 47; + public static readonly RULE_constructorBindingDecl = 48; + public static readonly RULE_valueType = 49; + public static readonly RULE_scalarType = 50; + public static readonly RULE_cardinality = 51; + public static readonly RULE_jsonLiteral = 52; + public static readonly RULE_jsonObject = 53; + public static readonly RULE_jsonMember = 54; + public static readonly RULE_jsonArray = 55; + public static readonly RULE_identifier = 56; + public static readonly RULE_stringLiteral = 57; public static readonly literalNames = [ - null, "'workspace'", "'import'", "'external'", "'atom'", "'interface'", - "'interfaces'", "'package'", "'value'", "'relation'", "'operation'", - "'function'", "'constructor'", "'constructs'", "'conform'", "'as'", - "'bind'", "'to'", "'private'", "'shared'", "'state'", "'edge'", - "'projection'", "'with'", "'using'", "'via'", "'materialize'", "'if'", - "'absent'", "'on'", "'policy'", "'default'", "'source'", "'repository'", - "'commit'", "'revision'", "'id'", "'doc'", "'mode'", "'emits'", - "'receiver'", "'requires'", "'any'", "'get'", "'set'", "'watch'", - "'start'", "'stop'", "'read'", "'write'", "'resolve'", "'connect'", - "'disconnect'", "'call'", "'watch-start'", "'watch-stop'", "'subscribe'", - "'unsubscribe'", "'optimistic-register'", "'crdt'", "'optional-one'", - "'exactly-one'", "'many-unique'", "'many'", "'ordered'", "'unit'", - "'watch-handle'", "'message'", "'atom-ref'", "'interface-ref'", + null, "'workspace'", "'fragment'", "'import'", "'external'", "'atom'", + "'interface'", "'interfaces'", "'package'", "'value'", "'relation'", + "'operation'", "'function'", "'constructor'", "'constructs'", "'input'", + "'conform'", "'as'", "'bind'", "'to'", "'private'", "'shared'", + "'state'", "'edge'", "'projection'", "'with'", "'using'", "'via'", + "'materialize'", "'if'", "'absent'", "'on'", "'policy'", "'default'", + "'source'", "'repository'", "'commit'", "'revision'", "'id'", "'doc'", + "'mode'", "'emits'", "'receiver'", "'requires'", "'any'", "'get'", + "'set'", "'watch'", "'start'", "'stop'", "'read'", "'write'", "'resolve'", + "'connect'", "'disconnect'", "'call'", "'watch-start'", "'watch-stop'", + "'subscribe'", "'unsubscribe'", "'optimistic-register'", "'crdt'", + "'optional-one'", "'exactly-one'", "'many-unique'", "'many'", "'ordered'", + "'unit'", "'watch-handle'", "'message'", "'atom-ref'", "'interface-ref'", "'optional'", "'list'", "'bool'", "'bytes'", "'double'", "'int32'", "'int64'", "'string'", "'uint32'", "'uint64'", "'true'", "'false'", "'null'", "'->'", "':'", "';'", "','", "'.'", "'{'", "'}'", "'['", @@ -190,15 +194,15 @@ export class QuixosCapabilityParser extends antlr.Parser { ]; public static readonly symbolicNames = [ - null, "WORKSPACE", "IMPORT", "EXTERNAL", "ATOM", "INTERFACE", "INTERFACES", - "PACKAGE", "VALUE", "RELATION", "OPERATION", "FUNCTION", "CONSTRUCTOR", - "CONSTRUCTS", "CONFORM", "AS", "BIND", "TO", "PRIVATE", "SHARED", - "STATE", "EDGE", "PROJECTION", "WITH", "USING", "VIA", "MATERIALIZE", - "IF", "ABSENT", "ON", "POLICY", "DEFAULT", "SOURCE", "REPOSITORY", - "COMMIT", "REVISION", "ID", "DOC", "MODE", "EMITS", "RECEIVER", - "REQUIRES", "ANY", "GET", "SET", "WATCH", "START", "STOP", "READ", - "WRITE", "RESOLVE", "CONNECT", "DISCONNECT", "CALL", "WATCH_START", - "WATCH_STOP", "SUBSCRIBE", "UNSUBSCRIBE", "OPTIMISTIC_REGISTER", + null, "WORKSPACE", "FRAGMENT", "IMPORT", "EXTERNAL", "ATOM", "INTERFACE", + "INTERFACES", "PACKAGE", "VALUE", "RELATION", "OPERATION", "FUNCTION", + "CONSTRUCTOR", "CONSTRUCTS", "INPUT", "CONFORM", "AS", "BIND", "TO", + "PRIVATE", "SHARED", "STATE", "EDGE", "PROJECTION", "WITH", "USING", + "VIA", "MATERIALIZE", "IF", "ABSENT", "ON", "POLICY", "DEFAULT", + "SOURCE", "REPOSITORY", "COMMIT", "REVISION", "ID", "DOC", "MODE", + "EMITS", "RECEIVER", "REQUIRES", "ANY", "GET", "SET", "WATCH", "START", + "STOP", "READ", "WRITE", "RESOLVE", "CONNECT", "DISCONNECT", "CALL", + "WATCH_START", "WATCH_STOP", "SUBSCRIBE", "UNSUBSCRIBE", "OPTIMISTIC_REGISTER", "CRDT", "OPTIONAL_ONE", "EXACTLY_ONE", "MANY_UNIQUE", "MANY", "ORDERED", "UNIT", "WATCH_HANDLE", "MESSAGE", "ATOM_REF", "INTERFACE_REF", "OPTIONAL", "LIST", "BOOL", "BYTES", "DOUBLE", "INT32", "INT64", @@ -208,18 +212,19 @@ export class QuixosCapabilityParser extends antlr.Parser { "STRING_LITERAL", "LINE_COMMENT", "BLOCK_COMMENT", "WS" ]; public static readonly ruleNames = [ - "document", "workspaceDecl", "workspaceItem", "resourceImportDecl", - "externalAtomDecl", "externalInterfaceDecl", "resourcePreamble", - "atomDecl", "interfaceResourceDecl", "interfaceMember", "operationMember", - "valueMember", "valueMemberOperation", "relationshipMember", "relationshipOperation", - "targetConstraint", "packageResourceDecl", "packageExport", "packageOperationExport", - "packageFunctionExport", "packageConstructorExport", "eventClause", - "operationMode", "receiverRequirement", "identifierList", "dependencyBlock", - "dependencyPort", "primitiveList", "primitive", "sharedAttachmentDecl", - "attachmentDecl", "stateDecl", "storagePolicy", "edgeDecl", "edgeEndpoint", - "conformanceDecl", "conformanceItem", "relationshipMaterializationDecl", - "operationBindingDecl", "memberOperationRef", "operationName", "operationProvider", - "statePrimitive", "edgePrimitive", "dependencyBindingBlock", "dependencyBinding", + "document", "fragmentDecl", "sourceImportDecl", "workspaceDecl", + "workspaceItem", "resourceImportDecl", "externalAtomDecl", "externalInterfaceDecl", + "resourcePreamble", "atomDecl", "interfaceResourceDecl", "interfaceMember", + "operationMember", "valueMember", "valueMemberOperation", "relationshipMember", + "relationshipOperation", "targetConstraint", "packageResourceDecl", + "packageExport", "packageOperationExport", "packageFunctionExport", + "packageConstructorExport", "eventClause", "operationMode", "receiverRequirement", + "identifierList", "dependencyBlock", "dependencyPort", "primitiveList", + "primitive", "sharedAttachmentDecl", "attachmentDecl", "stateDecl", + "storagePolicy", "edgeDecl", "edgeEndpoint", "conformanceDecl", + "conformanceItem", "relationshipMaterializationDecl", "operationBindingDecl", + "memberOperationRef", "operationName", "operationProvider", "statePrimitive", + "edgePrimitive", "dependencyBindingBlock", "dependencyBinding", "constructorBindingDecl", "valueType", "scalarType", "cardinality", "jsonLiteral", "jsonObject", "jsonMember", "jsonArray", "identifier", "stringLiteral", @@ -243,33 +248,42 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new DocumentContext(this.context, this.state); this.enterRule(localContext, 0, QuixosCapabilityParser.RULE_document); try { - this.state = 121; + this.state = 128; this.errorHandler.sync(this); switch (this.interpreter.adaptivePredict(this.tokenStream, 0, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 112; + this.state = 116; this.workspaceDecl(); - this.state = 113; + this.state = 117; this.match(QuixosCapabilityParser.EOF); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 115; + this.state = 119; this.interfaceResourceDecl(); - this.state = 116; + this.state = 120; this.match(QuixosCapabilityParser.EOF); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 118; + this.state = 122; this.packageResourceDecl(); - this.state = 119; + this.state = 123; + this.match(QuixosCapabilityParser.EOF); + } + break; + case 4: + this.enterOuterAlt(localContext, 4); + { + this.state = 125; + this.fragmentDecl(); + this.state = 126; this.match(QuixosCapabilityParser.EOF); } break; @@ -288,35 +302,21 @@ export class QuixosCapabilityParser extends antlr.Parser { } return localContext; } - public workspaceDecl(): WorkspaceDeclContext { - let localContext = new WorkspaceDeclContext(this.context, this.state); - this.enterRule(localContext, 2, QuixosCapabilityParser.RULE_workspaceDecl); + public fragmentDecl(): FragmentDeclContext { + let localContext = new FragmentDeclContext(this.context, this.state); + this.enterRule(localContext, 2, QuixosCapabilityParser.RULE_fragmentDecl); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 123; - this.match(QuixosCapabilityParser.WORKSPACE); - this.state = 124; - this.identifier(); - this.state = 125; - this.match(QuixosCapabilityParser.ID); - this.state = 126; - this.stringLiteral(); - this.state = 127; - this.match(QuixosCapabilityParser.REVISION); - this.state = 128; - this.stringLiteral(); - this.state = 129; - this.match(QuixosCapabilityParser.COMMIT); this.state = 130; - this.stringLiteral(); + this.match(QuixosCapabilityParser.FRAGMENT); this.state = 131; this.match(QuixosCapabilityParser.LBRACE); this.state = 135; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 544788) !== 0)) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 2170920) !== 0)) { { { this.state = 132; @@ -344,50 +344,138 @@ export class QuixosCapabilityParser extends antlr.Parser { } return localContext; } + public sourceImportDecl(): SourceImportDeclContext { + let localContext = new SourceImportDeclContext(this.context, this.state); + this.enterRule(localContext, 4, QuixosCapabilityParser.RULE_sourceImportDecl); + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 140; + this.match(QuixosCapabilityParser.IMPORT); + this.state = 141; + this.stringLiteral(); + this.state = 142; + this.match(QuixosCapabilityParser.SEMI); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } + public workspaceDecl(): WorkspaceDeclContext { + let localContext = new WorkspaceDeclContext(this.context, this.state); + this.enterRule(localContext, 6, QuixosCapabilityParser.RULE_workspaceDecl); + let _la: number; + try { + this.enterOuterAlt(localContext, 1); + { + this.state = 144; + this.match(QuixosCapabilityParser.WORKSPACE); + this.state = 145; + this.identifier(); + this.state = 146; + this.match(QuixosCapabilityParser.ID); + this.state = 147; + this.stringLiteral(); + this.state = 148; + this.match(QuixosCapabilityParser.REVISION); + this.state = 149; + this.stringLiteral(); + this.state = 150; + this.match(QuixosCapabilityParser.COMMIT); + this.state = 151; + this.stringLiteral(); + this.state = 152; + this.match(QuixosCapabilityParser.LBRACE); + this.state = 156; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 2170920) !== 0)) { + { + { + this.state = 153; + this.workspaceItem(); + } + } + this.state = 158; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + } + this.state = 159; + this.match(QuixosCapabilityParser.RBRACE); + } + } + catch (re) { + if (re instanceof antlr.RecognitionException) { + this.errorHandler.reportError(this, re); + this.errorHandler.recover(this, re); + } else { + throw re; + } + } + finally { + this.exitRule(); + } + return localContext; + } public workspaceItem(): WorkspaceItemContext { let localContext = new WorkspaceItemContext(this.context, this.state); - this.enterRule(localContext, 4, QuixosCapabilityParser.RULE_workspaceItem); + this.enterRule(localContext, 8, QuixosCapabilityParser.RULE_workspaceItem); try { - this.state = 145; + this.state = 167; this.errorHandler.sync(this); - switch (this.tokenStream.LA(1)) { - case QuixosCapabilityParser.ATOM: + switch (this.interpreter.adaptivePredict(this.tokenStream, 3, this.context) ) { + case 1: this.enterOuterAlt(localContext, 1); { - this.state = 140; + this.state = 161; + this.sourceImportDecl(); + } + break; + case 2: + this.enterOuterAlt(localContext, 2); + { + this.state = 162; this.atomDecl(); } break; - case QuixosCapabilityParser.IMPORT: - this.enterOuterAlt(localContext, 2); + case 3: + this.enterOuterAlt(localContext, 3); { - this.state = 141; + this.state = 163; this.resourceImportDecl(); } break; - case QuixosCapabilityParser.SHARED: - this.enterOuterAlt(localContext, 3); + case 4: + this.enterOuterAlt(localContext, 4); { - this.state = 142; + this.state = 164; this.sharedAttachmentDecl(); } break; - case QuixosCapabilityParser.CONFORM: - this.enterOuterAlt(localContext, 4); + case 5: + this.enterOuterAlt(localContext, 5); { - this.state = 143; + this.state = 165; this.conformanceDecl(); } break; - case QuixosCapabilityParser.CONSTRUCTOR: - this.enterOuterAlt(localContext, 5); + case 6: + this.enterOuterAlt(localContext, 6); { - this.state = 144; + this.state = 166; this.constructorBindingDecl(); } break; - default: - throw new antlr.NoViableAltException(this); } } catch (re) { @@ -405,34 +493,34 @@ export class QuixosCapabilityParser extends antlr.Parser { } public resourceImportDecl(): ResourceImportDeclContext { let localContext = new ResourceImportDeclContext(this.context, this.state); - this.enterRule(localContext, 6, QuixosCapabilityParser.RULE_resourceImportDecl); + this.enterRule(localContext, 10, QuixosCapabilityParser.RULE_resourceImportDecl); try { - this.state = 157; + this.state = 179; this.errorHandler.sync(this); - switch (this.interpreter.adaptivePredict(this.tokenStream, 3, this.context) ) { + switch (this.interpreter.adaptivePredict(this.tokenStream, 4, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 147; + this.state = 169; this.match(QuixosCapabilityParser.IMPORT); - this.state = 148; + this.state = 170; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 149; + this.state = 171; this.identifier(); - this.state = 150; + this.state = 172; this.match(QuixosCapabilityParser.SEMI); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 152; + this.state = 174; this.match(QuixosCapabilityParser.IMPORT); - this.state = 153; + this.state = 175; this.match(QuixosCapabilityParser.PACKAGE); - this.state = 154; + this.state = 176; this.identifier(); - this.state = 155; + this.state = 177; this.match(QuixosCapabilityParser.SEMI); } break; @@ -453,21 +541,21 @@ export class QuixosCapabilityParser extends antlr.Parser { } public externalAtomDecl(): ExternalAtomDeclContext { let localContext = new ExternalAtomDeclContext(this.context, this.state); - this.enterRule(localContext, 8, QuixosCapabilityParser.RULE_externalAtomDecl); + this.enterRule(localContext, 12, QuixosCapabilityParser.RULE_externalAtomDecl); try { this.enterOuterAlt(localContext, 1); { - this.state = 159; + this.state = 181; this.match(QuixosCapabilityParser.EXTERNAL); - this.state = 160; + this.state = 182; this.match(QuixosCapabilityParser.ATOM); - this.state = 161; + this.state = 183; this.identifier(); - this.state = 162; + this.state = 184; this.match(QuixosCapabilityParser.ID); - this.state = 163; + this.state = 185; this.stringLiteral(); - this.state = 164; + this.state = 186; this.match(QuixosCapabilityParser.SEMI); } } @@ -486,21 +574,21 @@ export class QuixosCapabilityParser extends antlr.Parser { } public externalInterfaceDecl(): ExternalInterfaceDeclContext { let localContext = new ExternalInterfaceDeclContext(this.context, this.state); - this.enterRule(localContext, 10, QuixosCapabilityParser.RULE_externalInterfaceDecl); + this.enterRule(localContext, 14, QuixosCapabilityParser.RULE_externalInterfaceDecl); try { this.enterOuterAlt(localContext, 1); { - this.state = 166; + this.state = 188; this.match(QuixosCapabilityParser.EXTERNAL); - this.state = 167; + this.state = 189; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 168; + this.state = 190; this.identifier(); - this.state = 169; + this.state = 191; this.match(QuixosCapabilityParser.REVISION); - this.state = 170; + this.state = 192; this.stringLiteral(); - this.state = 171; + this.state = 193; this.match(QuixosCapabilityParser.SEMI); } } @@ -519,29 +607,29 @@ export class QuixosCapabilityParser extends antlr.Parser { } public resourcePreamble(): ResourcePreambleContext { let localContext = new ResourcePreambleContext(this.context, this.state); - this.enterRule(localContext, 12, QuixosCapabilityParser.RULE_resourcePreamble); + this.enterRule(localContext, 16, QuixosCapabilityParser.RULE_resourcePreamble); try { - this.state = 176; + this.state = 198; this.errorHandler.sync(this); - switch (this.interpreter.adaptivePredict(this.tokenStream, 4, this.context) ) { + switch (this.interpreter.adaptivePredict(this.tokenStream, 5, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 173; + this.state = 195; this.resourceImportDecl(); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 174; + this.state = 196; this.externalAtomDecl(); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 175; + this.state = 197; this.externalInterfaceDecl(); } break; @@ -562,32 +650,32 @@ export class QuixosCapabilityParser extends antlr.Parser { } public atomDecl(): AtomDeclContext { let localContext = new AtomDeclContext(this.context, this.state); - this.enterRule(localContext, 14, QuixosCapabilityParser.RULE_atomDecl); + this.enterRule(localContext, 18, QuixosCapabilityParser.RULE_atomDecl); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 178; + this.state = 200; this.match(QuixosCapabilityParser.ATOM); - this.state = 179; + this.state = 201; this.identifier(); - this.state = 180; + this.state = 202; this.match(QuixosCapabilityParser.ID); - this.state = 181; + this.state = 203; this.stringLiteral(); - this.state = 184; + this.state = 206; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 37) { + if (_la === 39) { { - this.state = 182; + this.state = 204; this.match(QuixosCapabilityParser.DOC); - this.state = 183; + this.state = 205; this.stringLiteral(); } } - this.state = 186; + this.state = 208; this.match(QuixosCapabilityParser.SEMI); } } @@ -606,54 +694,54 @@ export class QuixosCapabilityParser extends antlr.Parser { } public interfaceResourceDecl(): InterfaceResourceDeclContext { let localContext = new InterfaceResourceDeclContext(this.context, this.state); - this.enterRule(localContext, 16, QuixosCapabilityParser.RULE_interfaceResourceDecl); + this.enterRule(localContext, 20, QuixosCapabilityParser.RULE_interfaceResourceDecl); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 191; + this.state = 213; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 2 || _la === 3) { + while (_la === 3 || _la === 4) { { { - this.state = 188; + this.state = 210; this.resourcePreamble(); } } - this.state = 193; + this.state = 215; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 194; + this.state = 216; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 195; + this.state = 217; this.identifier(); - this.state = 196; + this.state = 218; this.match(QuixosCapabilityParser.ID); - this.state = 197; + this.state = 219; this.stringLiteral(); - this.state = 198; + this.state = 220; this.match(QuixosCapabilityParser.REVISION); - this.state = 199; + this.state = 221; this.stringLiteral(); - this.state = 200; + this.state = 222; this.match(QuixosCapabilityParser.LBRACE); - this.state = 204; + this.state = 226; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 1792) !== 0)) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 3584) !== 0)) { { { - this.state = 201; + this.state = 223; this.interfaceMember(); } } - this.state = 206; + this.state = 228; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 207; + this.state = 229; this.match(QuixosCapabilityParser.RBRACE); } } @@ -672,29 +760,29 @@ export class QuixosCapabilityParser extends antlr.Parser { } public interfaceMember(): InterfaceMemberContext { let localContext = new InterfaceMemberContext(this.context, this.state); - this.enterRule(localContext, 18, QuixosCapabilityParser.RULE_interfaceMember); + this.enterRule(localContext, 22, QuixosCapabilityParser.RULE_interfaceMember); try { - this.state = 212; + this.state = 234; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.VALUE: this.enterOuterAlt(localContext, 1); { - this.state = 209; + this.state = 231; this.valueMember(); } break; case QuixosCapabilityParser.RELATION: this.enterOuterAlt(localContext, 2); { - this.state = 210; + this.state = 232; this.relationshipMember(); } break; case QuixosCapabilityParser.OPERATION: this.enterOuterAlt(localContext, 3); { - this.state = 211; + this.state = 233; this.operationMember(); } break; @@ -717,37 +805,37 @@ export class QuixosCapabilityParser extends antlr.Parser { } public operationMember(): OperationMemberContext { let localContext = new OperationMemberContext(this.context, this.state); - this.enterRule(localContext, 20, QuixosCapabilityParser.RULE_operationMember); + this.enterRule(localContext, 24, QuixosCapabilityParser.RULE_operationMember); try { this.enterOuterAlt(localContext, 1); { - this.state = 214; + this.state = 236; this.match(QuixosCapabilityParser.OPERATION); - this.state = 215; + this.state = 237; this.identifier(); - this.state = 216; + this.state = 238; this.match(QuixosCapabilityParser.ID); - this.state = 217; + this.state = 239; this.stringLiteral(); - this.state = 218; + this.state = 240; this.match(QuixosCapabilityParser.COLON); - this.state = 219; + this.state = 241; this.valueType(); - this.state = 220; + this.state = 242; this.match(QuixosCapabilityParser.ARROW); - this.state = 221; + this.state = 243; this.valueType(); - this.state = 222; + this.state = 244; this.match(QuixosCapabilityParser.LBRACE); - this.state = 223; + this.state = 245; this.match(QuixosCapabilityParser.CALL); - this.state = 224; + this.state = 246; this.match(QuixosCapabilityParser.ID); - this.state = 225; + this.state = 247; this.stringLiteral(); - this.state = 226; + this.state = 248; this.match(QuixosCapabilityParser.SEMI); - this.state = 227; + this.state = 249; this.match(QuixosCapabilityParser.RBRACE); } } @@ -766,40 +854,40 @@ export class QuixosCapabilityParser extends antlr.Parser { } public valueMember(): ValueMemberContext { let localContext = new ValueMemberContext(this.context, this.state); - this.enterRule(localContext, 22, QuixosCapabilityParser.RULE_valueMember); + this.enterRule(localContext, 26, QuixosCapabilityParser.RULE_valueMember); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 229; + this.state = 251; this.match(QuixosCapabilityParser.VALUE); - this.state = 230; + this.state = 252; this.identifier(); - this.state = 231; + this.state = 253; this.match(QuixosCapabilityParser.ID); - this.state = 232; + this.state = 254; this.stringLiteral(); - this.state = 233; + this.state = 255; this.match(QuixosCapabilityParser.COLON); - this.state = 234; + this.state = 256; this.valueType(); - this.state = 235; + this.state = 257; this.match(QuixosCapabilityParser.LBRACE); - this.state = 239; + this.state = 261; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (((((_la - 43)) & ~0x1F) === 0 && ((1 << (_la - 43)) & 7) !== 0)) { + while (((((_la - 45)) & ~0x1F) === 0 && ((1 << (_la - 45)) & 7) !== 0)) { { { - this.state = 236; + this.state = 258; this.valueMemberOperation(); } } - this.state = 241; + this.state = 263; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 242; + this.state = 264; this.match(QuixosCapabilityParser.RBRACE); } } @@ -818,55 +906,55 @@ export class QuixosCapabilityParser extends antlr.Parser { } public valueMemberOperation(): ValueMemberOperationContext { let localContext = new ValueMemberOperationContext(this.context, this.state); - this.enterRule(localContext, 24, QuixosCapabilityParser.RULE_valueMemberOperation); + this.enterRule(localContext, 28, QuixosCapabilityParser.RULE_valueMemberOperation); try { - this.state = 263; + this.state = 285; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.GET: this.enterOuterAlt(localContext, 1); { - this.state = 244; + this.state = 266; this.match(QuixosCapabilityParser.GET); - this.state = 245; + this.state = 267; this.match(QuixosCapabilityParser.ID); - this.state = 246; + this.state = 268; this.stringLiteral(); - this.state = 247; + this.state = 269; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.SET: this.enterOuterAlt(localContext, 2); { - this.state = 249; + this.state = 271; this.match(QuixosCapabilityParser.SET); - this.state = 250; + this.state = 272; this.match(QuixosCapabilityParser.ID); - this.state = 251; + this.state = 273; this.stringLiteral(); - this.state = 252; + this.state = 274; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.WATCH: this.enterOuterAlt(localContext, 3); { - this.state = 254; + this.state = 276; this.match(QuixosCapabilityParser.WATCH); - this.state = 255; + this.state = 277; this.match(QuixosCapabilityParser.START); - this.state = 256; + this.state = 278; this.match(QuixosCapabilityParser.ID); - this.state = 257; + this.state = 279; this.stringLiteral(); - this.state = 258; + this.state = 280; this.match(QuixosCapabilityParser.STOP); - this.state = 259; + this.state = 281; this.match(QuixosCapabilityParser.ID); - this.state = 260; + this.state = 282; this.stringLiteral(); - this.state = 261; + this.state = 283; this.match(QuixosCapabilityParser.SEMI); } break; @@ -889,52 +977,52 @@ export class QuixosCapabilityParser extends antlr.Parser { } public relationshipMember(): RelationshipMemberContext { let localContext = new RelationshipMemberContext(this.context, this.state); - this.enterRule(localContext, 26, QuixosCapabilityParser.RULE_relationshipMember); + this.enterRule(localContext, 30, QuixosCapabilityParser.RULE_relationshipMember); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 265; + this.state = 287; this.match(QuixosCapabilityParser.RELATION); - this.state = 266; + this.state = 288; this.identifier(); - this.state = 267; + this.state = 289; this.match(QuixosCapabilityParser.ID); - this.state = 268; + this.state = 290; this.stringLiteral(); - this.state = 269; + this.state = 291; this.match(QuixosCapabilityParser.COLON); - this.state = 270; + this.state = 292; this.cardinality(); - this.state = 271; + this.state = 293; this.targetConstraint(); - this.state = 273; + this.state = 295; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 64) { + if (_la === 66) { { - this.state = 272; + this.state = 294; this.match(QuixosCapabilityParser.ORDERED); } } - this.state = 275; + this.state = 297; this.match(QuixosCapabilityParser.LBRACE); - this.state = 279; + this.state = 301; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (((((_la - 45)) & ~0x1F) === 0 && ((1 << (_la - 45)) & 225) !== 0)) { + while (((((_la - 47)) & ~0x1F) === 0 && ((1 << (_la - 47)) & 225) !== 0)) { { { - this.state = 276; + this.state = 298; this.relationshipOperation(); } } - this.state = 281; + this.state = 303; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 282; + this.state = 304; this.match(QuixosCapabilityParser.RBRACE); } } @@ -953,68 +1041,68 @@ export class QuixosCapabilityParser extends antlr.Parser { } public relationshipOperation(): RelationshipOperationContext { let localContext = new RelationshipOperationContext(this.context, this.state); - this.enterRule(localContext, 28, QuixosCapabilityParser.RULE_relationshipOperation); + this.enterRule(localContext, 32, QuixosCapabilityParser.RULE_relationshipOperation); try { - this.state = 308; + this.state = 330; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.RESOLVE: this.enterOuterAlt(localContext, 1); { - this.state = 284; + this.state = 306; this.match(QuixosCapabilityParser.RESOLVE); - this.state = 285; + this.state = 307; this.match(QuixosCapabilityParser.ID); - this.state = 286; + this.state = 308; this.stringLiteral(); - this.state = 287; + this.state = 309; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.CONNECT: this.enterOuterAlt(localContext, 2); { - this.state = 289; + this.state = 311; this.match(QuixosCapabilityParser.CONNECT); - this.state = 290; + this.state = 312; this.match(QuixosCapabilityParser.ID); - this.state = 291; + this.state = 313; this.stringLiteral(); - this.state = 292; + this.state = 314; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.DISCONNECT: this.enterOuterAlt(localContext, 3); { - this.state = 294; + this.state = 316; this.match(QuixosCapabilityParser.DISCONNECT); - this.state = 295; + this.state = 317; this.match(QuixosCapabilityParser.ID); - this.state = 296; + this.state = 318; this.stringLiteral(); - this.state = 297; + this.state = 319; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.WATCH: this.enterOuterAlt(localContext, 4); { - this.state = 299; + this.state = 321; this.match(QuixosCapabilityParser.WATCH); - this.state = 300; + this.state = 322; this.match(QuixosCapabilityParser.START); - this.state = 301; + this.state = 323; this.match(QuixosCapabilityParser.ID); - this.state = 302; + this.state = 324; this.stringLiteral(); - this.state = 303; + this.state = 325; this.match(QuixosCapabilityParser.STOP); - this.state = 304; + this.state = 326; this.match(QuixosCapabilityParser.ID); - this.state = 305; + this.state = 327; this.stringLiteral(); - this.state = 306; + this.state = 328; this.match(QuixosCapabilityParser.SEMI); } break; @@ -1037,26 +1125,26 @@ export class QuixosCapabilityParser extends antlr.Parser { } public targetConstraint(): TargetConstraintContext { let localContext = new TargetConstraintContext(this.context, this.state); - this.enterRule(localContext, 30, QuixosCapabilityParser.RULE_targetConstraint); + this.enterRule(localContext, 34, QuixosCapabilityParser.RULE_targetConstraint); try { - this.state = 314; + this.state = 336; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.ATOM: this.enterOuterAlt(localContext, 1); { - this.state = 310; + this.state = 332; this.match(QuixosCapabilityParser.ATOM); - this.state = 311; + this.state = 333; this.identifier(); } break; case QuixosCapabilityParser.INTERFACE: this.enterOuterAlt(localContext, 2); { - this.state = 312; + this.state = 334; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 313; + this.state = 335; this.identifier(); } break; @@ -1079,54 +1167,54 @@ export class QuixosCapabilityParser extends antlr.Parser { } public packageResourceDecl(): PackageResourceDeclContext { let localContext = new PackageResourceDeclContext(this.context, this.state); - this.enterRule(localContext, 32, QuixosCapabilityParser.RULE_packageResourceDecl); + this.enterRule(localContext, 36, QuixosCapabilityParser.RULE_packageResourceDecl); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 319; + this.state = 341; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 2 || _la === 3) { + while (_la === 3 || _la === 4) { { { - this.state = 316; + this.state = 338; this.resourcePreamble(); } } - this.state = 321; + this.state = 343; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 322; + this.state = 344; this.match(QuixosCapabilityParser.PACKAGE); - this.state = 323; + this.state = 345; this.identifier(); - this.state = 324; + this.state = 346; this.match(QuixosCapabilityParser.ID); - this.state = 325; + this.state = 347; this.stringLiteral(); - this.state = 326; + this.state = 348; this.match(QuixosCapabilityParser.REVISION); - this.state = 327; + this.state = 349; this.stringLiteral(); - this.state = 328; + this.state = 350; this.match(QuixosCapabilityParser.LBRACE); - this.state = 332; + this.state = 354; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 7168) !== 0)) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 14336) !== 0)) { { { - this.state = 329; + this.state = 351; this.packageExport(); } } - this.state = 334; + this.state = 356; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 335; + this.state = 357; this.match(QuixosCapabilityParser.RBRACE); } } @@ -1145,29 +1233,29 @@ export class QuixosCapabilityParser extends antlr.Parser { } public packageExport(): PackageExportContext { let localContext = new PackageExportContext(this.context, this.state); - this.enterRule(localContext, 34, QuixosCapabilityParser.RULE_packageExport); + this.enterRule(localContext, 38, QuixosCapabilityParser.RULE_packageExport); try { - this.state = 340; + this.state = 362; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.OPERATION: this.enterOuterAlt(localContext, 1); { - this.state = 337; + this.state = 359; this.packageOperationExport(); } break; case QuixosCapabilityParser.FUNCTION: this.enterOuterAlt(localContext, 2); { - this.state = 338; + this.state = 360; this.packageFunctionExport(); } break; case QuixosCapabilityParser.CONSTRUCTOR: this.enterOuterAlt(localContext, 3); { - this.state = 339; + this.state = 361; this.packageConstructorExport(); } break; @@ -1190,56 +1278,56 @@ export class QuixosCapabilityParser extends antlr.Parser { } public packageOperationExport(): PackageOperationExportContext { let localContext = new PackageOperationExportContext(this.context, this.state); - this.enterRule(localContext, 36, QuixosCapabilityParser.RULE_packageOperationExport); + this.enterRule(localContext, 40, QuixosCapabilityParser.RULE_packageOperationExport); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 342; + this.state = 364; this.match(QuixosCapabilityParser.OPERATION); - this.state = 343; + this.state = 365; this.identifier(); - this.state = 344; + this.state = 366; this.match(QuixosCapabilityParser.ID); - this.state = 345; + this.state = 367; this.stringLiteral(); - this.state = 346; + this.state = 368; this.match(QuixosCapabilityParser.COLON); - this.state = 347; + this.state = 369; this.valueType(); - this.state = 348; + this.state = 370; this.match(QuixosCapabilityParser.ARROW); - this.state = 349; + this.state = 371; this.valueType(); - this.state = 350; + this.state = 372; this.match(QuixosCapabilityParser.MODE); - this.state = 351; + this.state = 373; this.operationMode(); - this.state = 353; - this.errorHandler.sync(this); - _la = this.tokenStream.LA(1); - if (_la === 39) { - { - this.state = 352; - this.eventClause(); - } - } - - this.state = 355; - this.match(QuixosCapabilityParser.RECEIVER); - this.state = 356; - this.receiverRequirement(); - this.state = 358; + this.state = 375; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 41) { { - this.state = 357; + this.state = 374; + this.eventClause(); + } + } + + this.state = 377; + this.match(QuixosCapabilityParser.RECEIVER); + this.state = 378; + this.receiverRequirement(); + this.state = 380; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 43) { + { + this.state = 379; this.dependencyBlock(); } } - this.state = 360; + this.state = 382; this.match(QuixosCapabilityParser.SEMI); } } @@ -1258,38 +1346,38 @@ export class QuixosCapabilityParser extends antlr.Parser { } public packageFunctionExport(): PackageFunctionExportContext { let localContext = new PackageFunctionExportContext(this.context, this.state); - this.enterRule(localContext, 38, QuixosCapabilityParser.RULE_packageFunctionExport); + this.enterRule(localContext, 42, QuixosCapabilityParser.RULE_packageFunctionExport); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 362; + this.state = 384; this.match(QuixosCapabilityParser.FUNCTION); - this.state = 363; + this.state = 385; this.identifier(); - this.state = 364; + this.state = 386; this.match(QuixosCapabilityParser.ID); - this.state = 365; + this.state = 387; this.stringLiteral(); - this.state = 366; + this.state = 388; this.match(QuixosCapabilityParser.COLON); - this.state = 367; + this.state = 389; this.valueType(); - this.state = 368; + this.state = 390; this.match(QuixosCapabilityParser.ARROW); - this.state = 369; + this.state = 391; this.valueType(); - this.state = 371; + this.state = 393; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 41) { + if (_la === 43) { { - this.state = 370; + this.state = 392; this.dependencyBlock(); } } - this.state = 373; + this.state = 395; this.match(QuixosCapabilityParser.SEMI); } } @@ -1308,38 +1396,38 @@ export class QuixosCapabilityParser extends antlr.Parser { } public packageConstructorExport(): PackageConstructorExportContext { let localContext = new PackageConstructorExportContext(this.context, this.state); - this.enterRule(localContext, 40, QuixosCapabilityParser.RULE_packageConstructorExport); + this.enterRule(localContext, 44, QuixosCapabilityParser.RULE_packageConstructorExport); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 375; + this.state = 397; this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 376; + this.state = 398; this.identifier(); - this.state = 377; + this.state = 399; this.match(QuixosCapabilityParser.ID); - this.state = 378; + this.state = 400; this.stringLiteral(); - this.state = 379; + this.state = 401; this.match(QuixosCapabilityParser.CONSTRUCTS); - this.state = 380; + this.state = 402; this.identifier(); - this.state = 381; + this.state = 403; this.match(QuixosCapabilityParser.COLON); - this.state = 382; + this.state = 404; this.valueType(); - this.state = 384; + this.state = 406; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 41) { + if (_la === 43) { { - this.state = 383; + this.state = 405; this.dependencyBlock(); } } - this.state = 386; + this.state = 408; this.match(QuixosCapabilityParser.SEMI); } } @@ -1358,13 +1446,13 @@ export class QuixosCapabilityParser extends antlr.Parser { } public eventClause(): EventClauseContext { let localContext = new EventClauseContext(this.context, this.state); - this.enterRule(localContext, 42, QuixosCapabilityParser.RULE_eventClause); + this.enterRule(localContext, 46, QuixosCapabilityParser.RULE_eventClause); try { this.enterOuterAlt(localContext, 1); { - this.state = 388; + this.state = 410; this.match(QuixosCapabilityParser.EMITS); - this.state = 389; + this.state = 411; this.valueType(); } } @@ -1383,14 +1471,14 @@ export class QuixosCapabilityParser extends antlr.Parser { } public operationMode(): OperationModeContext { let localContext = new OperationModeContext(this.context, this.state); - this.enterRule(localContext, 44, QuixosCapabilityParser.RULE_operationMode); + this.enterRule(localContext, 48, QuixosCapabilityParser.RULE_operationMode); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 391; + this.state = 413; _la = this.tokenStream.LA(1); - if(!(((((_la - 53)) & ~0x1F) === 0 && ((1 << (_la - 53)) & 31) !== 0))) { + if(!(((((_la - 55)) & ~0x1F) === 0 && ((1 << (_la - 55)) & 31) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -1414,46 +1502,46 @@ export class QuixosCapabilityParser extends antlr.Parser { } public receiverRequirement(): ReceiverRequirementContext { let localContext = new ReceiverRequirementContext(this.context, this.state); - this.enterRule(localContext, 46, QuixosCapabilityParser.RULE_receiverRequirement); + this.enterRule(localContext, 50, QuixosCapabilityParser.RULE_receiverRequirement); let _la: number; try { - this.state = 402; + this.state = 424; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.ANY: this.enterOuterAlt(localContext, 1); { - this.state = 393; + this.state = 415; this.match(QuixosCapabilityParser.ANY); } break; case QuixosCapabilityParser.ATOM: this.enterOuterAlt(localContext, 2); { - this.state = 394; + this.state = 416; this.match(QuixosCapabilityParser.ATOM); - this.state = 395; + this.state = 417; this.identifier(); } break; case QuixosCapabilityParser.INTERFACES: this.enterOuterAlt(localContext, 3); { - this.state = 396; + this.state = 418; this.match(QuixosCapabilityParser.INTERFACES); - this.state = 397; + this.state = 419; this.match(QuixosCapabilityParser.LBRACK); - this.state = 399; + this.state = 421; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 32 || _la === 98) { + if (_la === 34 || _la === 100) { { - this.state = 398; + this.state = 420; this.identifierList(); } } - this.state = 401; + this.state = 423; this.match(QuixosCapabilityParser.RBRACK); } break; @@ -1476,26 +1564,26 @@ export class QuixosCapabilityParser extends antlr.Parser { } public identifierList(): IdentifierListContext { let localContext = new IdentifierListContext(this.context, this.state); - this.enterRule(localContext, 48, QuixosCapabilityParser.RULE_identifierList); + this.enterRule(localContext, 52, QuixosCapabilityParser.RULE_identifierList); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 404; + this.state = 426; this.identifier(); - this.state = 409; + this.state = 431; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 86) { + while (_la === 88) { { { - this.state = 405; + this.state = 427; this.match(QuixosCapabilityParser.COMMA); - this.state = 406; + this.state = 428; this.identifier(); } } - this.state = 411; + this.state = 433; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } @@ -1516,30 +1604,30 @@ export class QuixosCapabilityParser extends antlr.Parser { } public dependencyBlock(): DependencyBlockContext { let localContext = new DependencyBlockContext(this.context, this.state); - this.enterRule(localContext, 50, QuixosCapabilityParser.RULE_dependencyBlock); + this.enterRule(localContext, 54, QuixosCapabilityParser.RULE_dependencyBlock); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 412; + this.state = 434; this.match(QuixosCapabilityParser.REQUIRES); - this.state = 413; + this.state = 435; this.match(QuixosCapabilityParser.LBRACE); - this.state = 417; + this.state = 439; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 3149856) !== 0)) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 12591168) !== 0)) { { { - this.state = 414; + this.state = 436; this.dependencyPort(); } } - this.state = 419; + this.state = 441; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 420; + this.state = 442; this.match(QuixosCapabilityParser.RBRACE); } } @@ -1558,90 +1646,103 @@ export class QuixosCapabilityParser extends antlr.Parser { } public dependencyPort(): DependencyPortContext { let localContext = new DependencyPortContext(this.context, this.state); - this.enterRule(localContext, 52, QuixosCapabilityParser.RULE_dependencyPort); + this.enterRule(localContext, 56, QuixosCapabilityParser.RULE_dependencyPort); + let _la: number; try { - this.state = 457; + this.state = 483; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.STATE: this.enterOuterAlt(localContext, 1); { - this.state = 422; + this.state = 444; this.match(QuixosCapabilityParser.STATE); - this.state = 423; + this.state = 445; this.identifier(); - this.state = 424; + this.state = 446; this.match(QuixosCapabilityParser.ID); - this.state = 425; + this.state = 447; this.stringLiteral(); - this.state = 426; + this.state = 448; this.match(QuixosCapabilityParser.COLON); - this.state = 427; + this.state = 449; this.valueType(); - this.state = 428; + this.state = 450; this.primitiveList(); - this.state = 429; + this.state = 451; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.EDGE: this.enterOuterAlt(localContext, 2); { - this.state = 431; + this.state = 453; this.match(QuixosCapabilityParser.EDGE); - this.state = 432; + this.state = 454; this.identifier(); - this.state = 433; + this.state = 455; this.match(QuixosCapabilityParser.ID); - this.state = 434; + this.state = 456; this.stringLiteral(); - this.state = 435; + this.state = 457; this.match(QuixosCapabilityParser.COLON); - this.state = 436; + this.state = 458; this.cardinality(); - this.state = 437; + this.state = 459; this.targetConstraint(); - this.state = 438; + this.state = 460; this.primitiveList(); - this.state = 439; + this.state = 461; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.INTERFACE: this.enterOuterAlt(localContext, 3); { - this.state = 441; + this.state = 463; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 442; + this.state = 464; this.identifier(); - this.state = 443; + this.state = 465; this.match(QuixosCapabilityParser.ID); - this.state = 444; + this.state = 466; this.stringLiteral(); - this.state = 445; + this.state = 467; this.match(QuixosCapabilityParser.COLON); - this.state = 446; + this.state = 468; this.identifier(); - this.state = 447; + this.state = 469; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.CONSTRUCTOR: this.enterOuterAlt(localContext, 4); { - this.state = 449; + this.state = 471; this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 450; + this.state = 472; this.identifier(); - this.state = 451; + this.state = 473; this.match(QuixosCapabilityParser.ID); - this.state = 452; + this.state = 474; this.stringLiteral(); - this.state = 453; + this.state = 475; this.match(QuixosCapabilityParser.COLON); - this.state = 454; + this.state = 476; this.identifier(); - this.state = 455; + this.state = 479; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 15) { + { + this.state = 477; + this.match(QuixosCapabilityParser.INPUT); + this.state = 478; + this.valueType(); + } + } + + this.state = 481; this.match(QuixosCapabilityParser.SEMI); } break; @@ -1664,32 +1765,32 @@ export class QuixosCapabilityParser extends antlr.Parser { } public primitiveList(): PrimitiveListContext { let localContext = new PrimitiveListContext(this.context, this.state); - this.enterRule(localContext, 54, QuixosCapabilityParser.RULE_primitiveList); + this.enterRule(localContext, 58, QuixosCapabilityParser.RULE_primitiveList); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 459; + this.state = 485; this.match(QuixosCapabilityParser.LBRACK); - this.state = 460; + this.state = 486; this.primitive(); - this.state = 465; + this.state = 491; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 86) { + while (_la === 88) { { { - this.state = 461; + this.state = 487; this.match(QuixosCapabilityParser.COMMA); - this.state = 462; + this.state = 488; this.primitive(); } } - this.state = 467; + this.state = 493; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 468; + this.state = 494; this.match(QuixosCapabilityParser.RBRACK); } } @@ -1708,14 +1809,14 @@ export class QuixosCapabilityParser extends antlr.Parser { } public primitive(): PrimitiveContext { let localContext = new PrimitiveContext(this.context, this.state); - this.enterRule(localContext, 56, QuixosCapabilityParser.RULE_primitive); + this.enterRule(localContext, 60, QuixosCapabilityParser.RULE_primitive); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 470; + this.state = 496; _la = this.tokenStream.LA(1); - if(!(((((_la - 48)) & ~0x1F) === 0 && ((1 << (_la - 48)) & 223) !== 0))) { + if(!(((((_la - 50)) & ~0x1F) === 0 && ((1 << (_la - 50)) & 223) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -1739,13 +1840,13 @@ export class QuixosCapabilityParser extends antlr.Parser { } public sharedAttachmentDecl(): SharedAttachmentDeclContext { let localContext = new SharedAttachmentDeclContext(this.context, this.state); - this.enterRule(localContext, 58, QuixosCapabilityParser.RULE_sharedAttachmentDecl); + this.enterRule(localContext, 62, QuixosCapabilityParser.RULE_sharedAttachmentDecl); try { this.enterOuterAlt(localContext, 1); { - this.state = 472; + this.state = 498; this.match(QuixosCapabilityParser.SHARED); - this.state = 473; + this.state = 499; this.attachmentDecl(); } } @@ -1764,22 +1865,22 @@ export class QuixosCapabilityParser extends antlr.Parser { } public attachmentDecl(): AttachmentDeclContext { let localContext = new AttachmentDeclContext(this.context, this.state); - this.enterRule(localContext, 60, QuixosCapabilityParser.RULE_attachmentDecl); + this.enterRule(localContext, 64, QuixosCapabilityParser.RULE_attachmentDecl); try { - this.state = 477; + this.state = 503; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.STATE: this.enterOuterAlt(localContext, 1); { - this.state = 475; + this.state = 501; this.stateDecl(); } break; case QuixosCapabilityParser.EDGE: this.enterOuterAlt(localContext, 2); { - this.state = 476; + this.state = 502; this.edgeDecl(); } break; @@ -1802,44 +1903,44 @@ export class QuixosCapabilityParser extends antlr.Parser { } public stateDecl(): StateDeclContext { let localContext = new StateDeclContext(this.context, this.state); - this.enterRule(localContext, 62, QuixosCapabilityParser.RULE_stateDecl); + this.enterRule(localContext, 66, QuixosCapabilityParser.RULE_stateDecl); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 479; + this.state = 505; this.match(QuixosCapabilityParser.STATE); - this.state = 480; + this.state = 506; this.identifier(); - this.state = 481; + this.state = 507; this.match(QuixosCapabilityParser.ID); - this.state = 482; + this.state = 508; this.stringLiteral(); - this.state = 483; + this.state = 509; this.match(QuixosCapabilityParser.ON); - this.state = 484; + this.state = 510; this.identifier(); - this.state = 485; + this.state = 511; this.match(QuixosCapabilityParser.COLON); - this.state = 486; + this.state = 512; this.valueType(); - this.state = 487; + this.state = 513; this.match(QuixosCapabilityParser.POLICY); - this.state = 488; + this.state = 514; this.storagePolicy(); - this.state = 491; + this.state = 517; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 31) { + if (_la === 33) { { - this.state = 489; + this.state = 515; this.match(QuixosCapabilityParser.DEFAULT); - this.state = 490; + this.state = 516; this.jsonLiteral(); } } - this.state = 493; + this.state = 519; this.match(QuixosCapabilityParser.SEMI); } } @@ -1858,28 +1959,28 @@ export class QuixosCapabilityParser extends antlr.Parser { } public storagePolicy(): StoragePolicyContext { let localContext = new StoragePolicyContext(this.context, this.state); - this.enterRule(localContext, 64, QuixosCapabilityParser.RULE_storagePolicy); + this.enterRule(localContext, 68, QuixosCapabilityParser.RULE_storagePolicy); try { - this.state = 501; + this.state = 527; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.OPTIMISTIC_REGISTER: this.enterOuterAlt(localContext, 1); { - this.state = 495; + this.state = 521; this.match(QuixosCapabilityParser.OPTIMISTIC_REGISTER); } break; case QuixosCapabilityParser.CRDT: this.enterOuterAlt(localContext, 2); { - this.state = 496; + this.state = 522; this.match(QuixosCapabilityParser.CRDT); - this.state = 497; + this.state = 523; this.match(QuixosCapabilityParser.LPAREN); - this.state = 498; + this.state = 524; this.valueType(); - this.state = 499; + this.state = 525; this.match(QuixosCapabilityParser.RPAREN); } break; @@ -1902,25 +2003,25 @@ export class QuixosCapabilityParser extends antlr.Parser { } public edgeDecl(): EdgeDeclContext { let localContext = new EdgeDeclContext(this.context, this.state); - this.enterRule(localContext, 66, QuixosCapabilityParser.RULE_edgeDecl); + this.enterRule(localContext, 70, QuixosCapabilityParser.RULE_edgeDecl); try { this.enterOuterAlt(localContext, 1); { - this.state = 503; + this.state = 529; this.match(QuixosCapabilityParser.EDGE); - this.state = 504; + this.state = 530; this.identifier(); - this.state = 505; + this.state = 531; this.match(QuixosCapabilityParser.ID); - this.state = 506; + this.state = 532; this.stringLiteral(); - this.state = 507; + this.state = 533; this.match(QuixosCapabilityParser.LBRACE); - this.state = 508; + this.state = 534; this.edgeEndpoint(); - this.state = 509; + this.state = 535; this.edgeEndpoint(); - this.state = 510; + this.state = 536; this.match(QuixosCapabilityParser.RBRACE); } } @@ -1939,34 +2040,34 @@ export class QuixosCapabilityParser extends antlr.Parser { } public edgeEndpoint(): EdgeEndpointContext { let localContext = new EdgeEndpointContext(this.context, this.state); - this.enterRule(localContext, 68, QuixosCapabilityParser.RULE_edgeEndpoint); + this.enterRule(localContext, 72, QuixosCapabilityParser.RULE_edgeEndpoint); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 512; + this.state = 538; this.targetConstraint(); - this.state = 513; + this.state = 539; this.match(QuixosCapabilityParser.PROJECTION); - this.state = 514; + this.state = 540; this.identifier(); - this.state = 515; + this.state = 541; this.match(QuixosCapabilityParser.ID); - this.state = 516; + this.state = 542; this.stringLiteral(); - this.state = 517; + this.state = 543; this.cardinality(); - this.state = 519; + this.state = 545; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 64) { + if (_la === 66) { { - this.state = 518; + this.state = 544; this.match(QuixosCapabilityParser.ORDERED); } } - this.state = 521; + this.state = 547; this.match(QuixosCapabilityParser.SEMI); } } @@ -1985,36 +2086,36 @@ export class QuixosCapabilityParser extends antlr.Parser { } public conformanceDecl(): ConformanceDeclContext { let localContext = new ConformanceDeclContext(this.context, this.state); - this.enterRule(localContext, 70, QuixosCapabilityParser.RULE_conformanceDecl); + this.enterRule(localContext, 74, QuixosCapabilityParser.RULE_conformanceDecl); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 523; + this.state = 549; this.match(QuixosCapabilityParser.CONFORM); - this.state = 524; + this.state = 550; this.identifier(); - this.state = 525; + this.state = 551; this.match(QuixosCapabilityParser.AS); - this.state = 526; + this.state = 552; this.identifier(); - this.state = 527; + this.state = 553; this.match(QuixosCapabilityParser.LBRACE); - this.state = 531; + this.state = 557; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 67436544) !== 0)) { + while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 269746176) !== 0)) { { { - this.state = 528; + this.state = 554; this.conformanceItem(); } } - this.state = 533; + this.state = 559; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 534; + this.state = 560; this.match(QuixosCapabilityParser.RBRACE); } } @@ -2033,31 +2134,31 @@ export class QuixosCapabilityParser extends antlr.Parser { } public conformanceItem(): ConformanceItemContext { let localContext = new ConformanceItemContext(this.context, this.state); - this.enterRule(localContext, 72, QuixosCapabilityParser.RULE_conformanceItem); + this.enterRule(localContext, 76, QuixosCapabilityParser.RULE_conformanceItem); try { - this.state = 540; + this.state = 566; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.PRIVATE: this.enterOuterAlt(localContext, 1); { - this.state = 536; + this.state = 562; this.match(QuixosCapabilityParser.PRIVATE); - this.state = 537; + this.state = 563; this.attachmentDecl(); } break; case QuixosCapabilityParser.BIND: this.enterOuterAlt(localContext, 2); { - this.state = 538; + this.state = 564; this.operationBindingDecl(); } break; case QuixosCapabilityParser.MATERIALIZE: this.enterOuterAlt(localContext, 3); { - this.state = 539; + this.state = 565; this.relationshipMaterializationDecl(); } break; @@ -2080,35 +2181,35 @@ export class QuixosCapabilityParser extends antlr.Parser { } public relationshipMaterializationDecl(): RelationshipMaterializationDeclContext { let localContext = new RelationshipMaterializationDeclContext(this.context, this.state); - this.enterRule(localContext, 74, QuixosCapabilityParser.RULE_relationshipMaterializationDecl); + this.enterRule(localContext, 78, QuixosCapabilityParser.RULE_relationshipMaterializationDecl); try { this.enterOuterAlt(localContext, 1); { - this.state = 542; + this.state = 568; this.match(QuixosCapabilityParser.MATERIALIZE); - this.state = 543; + this.state = 569; this.identifier(); - this.state = 544; + this.state = 570; this.match(QuixosCapabilityParser.IF); - this.state = 545; + this.state = 571; this.match(QuixosCapabilityParser.ABSENT); - this.state = 546; + this.state = 572; this.match(QuixosCapabilityParser.USING); - this.state = 547; + this.state = 573; this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 548; + this.state = 574; this.identifier(); - this.state = 549; + this.state = 575; this.match(QuixosCapabilityParser.VIA); - this.state = 550; + this.state = 576; this.match(QuixosCapabilityParser.EDGE); - this.state = 551; + this.state = 577; this.identifier(); - this.state = 552; + this.state = 578; this.match(QuixosCapabilityParser.DOT); - this.state = 553; + this.state = 579; this.identifier(); - this.state = 554; + this.state = 580; this.match(QuixosCapabilityParser.SEMI); } } @@ -2127,19 +2228,19 @@ export class QuixosCapabilityParser extends antlr.Parser { } public operationBindingDecl(): OperationBindingDeclContext { let localContext = new OperationBindingDeclContext(this.context, this.state); - this.enterRule(localContext, 76, QuixosCapabilityParser.RULE_operationBindingDecl); + this.enterRule(localContext, 80, QuixosCapabilityParser.RULE_operationBindingDecl); try { this.enterOuterAlt(localContext, 1); { - this.state = 556; + this.state = 582; this.match(QuixosCapabilityParser.BIND); - this.state = 557; + this.state = 583; this.memberOperationRef(); - this.state = 558; + this.state = 584; this.match(QuixosCapabilityParser.TO); - this.state = 559; + this.state = 585; this.operationProvider(); - this.state = 560; + this.state = 586; this.match(QuixosCapabilityParser.SEMI); } } @@ -2158,15 +2259,15 @@ export class QuixosCapabilityParser extends antlr.Parser { } public memberOperationRef(): MemberOperationRefContext { let localContext = new MemberOperationRefContext(this.context, this.state); - this.enterRule(localContext, 78, QuixosCapabilityParser.RULE_memberOperationRef); + this.enterRule(localContext, 82, QuixosCapabilityParser.RULE_memberOperationRef); try { this.enterOuterAlt(localContext, 1); { - this.state = 562; + this.state = 588; this.identifier(); - this.state = 563; + this.state = 589; this.match(QuixosCapabilityParser.DOT); - this.state = 564; + this.state = 590; this.operationName(); } } @@ -2185,86 +2286,86 @@ export class QuixosCapabilityParser extends antlr.Parser { } public operationName(): OperationNameContext { let localContext = new OperationNameContext(this.context, this.state); - this.enterRule(localContext, 80, QuixosCapabilityParser.RULE_operationName); + this.enterRule(localContext, 84, QuixosCapabilityParser.RULE_operationName); try { - this.state = 577; + this.state = 603; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.SOURCE: case QuixosCapabilityParser.IDENTIFIER: this.enterOuterAlt(localContext, 1); { - this.state = 566; + this.state = 592; this.identifier(); } break; case QuixosCapabilityParser.CALL: this.enterOuterAlt(localContext, 2); { - this.state = 567; + this.state = 593; this.match(QuixosCapabilityParser.CALL); } break; case QuixosCapabilityParser.GET: this.enterOuterAlt(localContext, 3); { - this.state = 568; + this.state = 594; this.match(QuixosCapabilityParser.GET); } break; case QuixosCapabilityParser.SET: this.enterOuterAlt(localContext, 4); { - this.state = 569; + this.state = 595; this.match(QuixosCapabilityParser.SET); } break; case QuixosCapabilityParser.RESOLVE: this.enterOuterAlt(localContext, 5); { - this.state = 570; + this.state = 596; this.match(QuixosCapabilityParser.RESOLVE); } break; case QuixosCapabilityParser.CONNECT: this.enterOuterAlt(localContext, 6); { - this.state = 571; + this.state = 597; this.match(QuixosCapabilityParser.CONNECT); } break; case QuixosCapabilityParser.DISCONNECT: this.enterOuterAlt(localContext, 7); { - this.state = 572; + this.state = 598; this.match(QuixosCapabilityParser.DISCONNECT); } break; case QuixosCapabilityParser.WATCH_START: this.enterOuterAlt(localContext, 8); { - this.state = 573; + this.state = 599; this.match(QuixosCapabilityParser.WATCH_START); } break; case QuixosCapabilityParser.WATCH_STOP: this.enterOuterAlt(localContext, 9); { - this.state = 574; + this.state = 600; this.match(QuixosCapabilityParser.WATCH_STOP); } break; case QuixosCapabilityParser.SUBSCRIBE: this.enterOuterAlt(localContext, 10); { - this.state = 575; + this.state = 601; this.match(QuixosCapabilityParser.SUBSCRIBE); } break; case QuixosCapabilityParser.UNSUBSCRIBE: this.enterOuterAlt(localContext, 11); { - this.state = 576; + this.state = 602; this.match(QuixosCapabilityParser.UNSUBSCRIBE); } break; @@ -2287,59 +2388,59 @@ export class QuixosCapabilityParser extends antlr.Parser { } public operationProvider(): OperationProviderContext { let localContext = new OperationProviderContext(this.context, this.state); - this.enterRule(localContext, 82, QuixosCapabilityParser.RULE_operationProvider); + this.enterRule(localContext, 86, QuixosCapabilityParser.RULE_operationProvider); let _la: number; try { - this.state = 598; + this.state = 624; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.STATE: this.enterOuterAlt(localContext, 1); { - this.state = 579; + this.state = 605; this.match(QuixosCapabilityParser.STATE); - this.state = 580; + this.state = 606; this.identifier(); - this.state = 581; + this.state = 607; this.match(QuixosCapabilityParser.DOT); - this.state = 582; + this.state = 608; this.statePrimitive(); } break; case QuixosCapabilityParser.EDGE: this.enterOuterAlt(localContext, 2); { - this.state = 584; + this.state = 610; this.match(QuixosCapabilityParser.EDGE); - this.state = 585; + this.state = 611; this.identifier(); - this.state = 586; + this.state = 612; this.match(QuixosCapabilityParser.DOT); - this.state = 587; + this.state = 613; this.identifier(); - this.state = 588; + this.state = 614; this.match(QuixosCapabilityParser.DOT); - this.state = 589; + this.state = 615; this.edgePrimitive(); } break; case QuixosCapabilityParser.PACKAGE: this.enterOuterAlt(localContext, 3); { - this.state = 591; + this.state = 617; this.match(QuixosCapabilityParser.PACKAGE); - this.state = 592; + this.state = 618; this.identifier(); - this.state = 593; + this.state = 619; this.match(QuixosCapabilityParser.DOT); - this.state = 594; + this.state = 620; this.identifier(); - this.state = 596; + this.state = 622; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 23) { + if (_la === 25) { { - this.state = 595; + this.state = 621; this.dependencyBindingBlock(); } } @@ -2365,14 +2466,14 @@ export class QuixosCapabilityParser extends antlr.Parser { } public statePrimitive(): StatePrimitiveContext { let localContext = new StatePrimitiveContext(this.context, this.state); - this.enterRule(localContext, 84, QuixosCapabilityParser.RULE_statePrimitive); + this.enterRule(localContext, 88, QuixosCapabilityParser.RULE_statePrimitive); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 600; + this.state = 626; _la = this.tokenStream.LA(1); - if(!(((((_la - 48)) & ~0x1F) === 0 && ((1 << (_la - 48)) & 195) !== 0))) { + if(!(((((_la - 50)) & ~0x1F) === 0 && ((1 << (_la - 50)) & 195) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -2396,14 +2497,14 @@ export class QuixosCapabilityParser extends antlr.Parser { } public edgePrimitive(): EdgePrimitiveContext { let localContext = new EdgePrimitiveContext(this.context, this.state); - this.enterRule(localContext, 86, QuixosCapabilityParser.RULE_edgePrimitive); + this.enterRule(localContext, 90, QuixosCapabilityParser.RULE_edgePrimitive); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 602; + this.state = 628; _la = this.tokenStream.LA(1); - if(!(((((_la - 50)) & ~0x1F) === 0 && ((1 << (_la - 50)) & 55) !== 0))) { + if(!(((((_la - 52)) & ~0x1F) === 0 && ((1 << (_la - 52)) & 55) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -2427,30 +2528,30 @@ export class QuixosCapabilityParser extends antlr.Parser { } public dependencyBindingBlock(): DependencyBindingBlockContext { let localContext = new DependencyBindingBlockContext(this.context, this.state); - this.enterRule(localContext, 88, QuixosCapabilityParser.RULE_dependencyBindingBlock); + this.enterRule(localContext, 92, QuixosCapabilityParser.RULE_dependencyBindingBlock); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 604; + this.state = 630; this.match(QuixosCapabilityParser.WITH); - this.state = 605; + this.state = 631; this.match(QuixosCapabilityParser.LBRACE); - this.state = 609; + this.state = 635; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 32 || _la === 98) { + while (_la === 34 || _la === 100) { { { - this.state = 606; + this.state = 632; this.dependencyBinding(); } } - this.state = 611; + this.state = 637; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 612; + this.state = 638; this.match(QuixosCapabilityParser.RBRACE); } } @@ -2469,127 +2570,127 @@ export class QuixosCapabilityParser extends antlr.Parser { } public dependencyBinding(): DependencyBindingContext { let localContext = new DependencyBindingContext(this.context, this.state); - this.enterRule(localContext, 90, QuixosCapabilityParser.RULE_dependencyBinding); + this.enterRule(localContext, 94, QuixosCapabilityParser.RULE_dependencyBinding); let _la: number; try { - this.state = 664; + this.state = 690; this.errorHandler.sync(this); - switch (this.interpreter.adaptivePredict(this.tokenStream, 41, this.context) ) { + switch (this.interpreter.adaptivePredict(this.tokenStream, 43, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 614; + this.state = 640; this.identifier(); - this.state = 615; + this.state = 641; this.match(QuixosCapabilityParser.TO); - this.state = 616; + this.state = 642; this.match(QuixosCapabilityParser.STATE); - this.state = 617; + this.state = 643; this.identifier(); - this.state = 624; + this.state = 650; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 25) { + if (_la === 27) { { - this.state = 618; + this.state = 644; this.match(QuixosCapabilityParser.VIA); - this.state = 619; + this.state = 645; this.match(QuixosCapabilityParser.EDGE); - this.state = 620; + this.state = 646; this.identifier(); - this.state = 621; + this.state = 647; this.match(QuixosCapabilityParser.DOT); - this.state = 622; + this.state = 648; this.identifier(); } } - this.state = 626; + this.state = 652; this.match(QuixosCapabilityParser.SEMI); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 628; + this.state = 654; this.identifier(); - this.state = 629; + this.state = 655; this.match(QuixosCapabilityParser.TO); - this.state = 630; + this.state = 656; this.match(QuixosCapabilityParser.EDGE); - this.state = 631; + this.state = 657; this.identifier(); - this.state = 632; + this.state = 658; this.match(QuixosCapabilityParser.DOT); - this.state = 633; + this.state = 659; this.identifier(); - this.state = 640; + this.state = 666; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 25) { + if (_la === 27) { { - this.state = 634; + this.state = 660; this.match(QuixosCapabilityParser.VIA); - this.state = 635; + this.state = 661; this.match(QuixosCapabilityParser.EDGE); - this.state = 636; + this.state = 662; this.identifier(); - this.state = 637; + this.state = 663; this.match(QuixosCapabilityParser.DOT); - this.state = 638; + this.state = 664; this.identifier(); } } - this.state = 642; + this.state = 668; this.match(QuixosCapabilityParser.SEMI); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 644; + this.state = 670; this.identifier(); - this.state = 645; + this.state = 671; this.match(QuixosCapabilityParser.TO); - this.state = 646; + this.state = 672; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 647; + this.state = 673; this.identifier(); - this.state = 654; + this.state = 680; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 25) { + if (_la === 27) { { - this.state = 648; + this.state = 674; this.match(QuixosCapabilityParser.VIA); - this.state = 649; + this.state = 675; this.match(QuixosCapabilityParser.EDGE); - this.state = 650; + this.state = 676; this.identifier(); - this.state = 651; + this.state = 677; this.match(QuixosCapabilityParser.DOT); - this.state = 652; + this.state = 678; this.identifier(); } } - this.state = 656; + this.state = 682; this.match(QuixosCapabilityParser.SEMI); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 658; + this.state = 684; this.identifier(); - this.state = 659; + this.state = 685; this.match(QuixosCapabilityParser.TO); - this.state = 660; + this.state = 686; this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 661; + this.state = 687; this.identifier(); - this.state = 662; + this.state = 688; this.match(QuixosCapabilityParser.SEMI); } break; @@ -2610,34 +2711,34 @@ export class QuixosCapabilityParser extends antlr.Parser { } public constructorBindingDecl(): ConstructorBindingDeclContext { let localContext = new ConstructorBindingDeclContext(this.context, this.state); - this.enterRule(localContext, 92, QuixosCapabilityParser.RULE_constructorBindingDecl); + this.enterRule(localContext, 96, QuixosCapabilityParser.RULE_constructorBindingDecl); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 666; + this.state = 692; this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 667; + this.state = 693; this.identifier(); - this.state = 668; + this.state = 694; this.match(QuixosCapabilityParser.TO); - this.state = 669; + this.state = 695; this.identifier(); - this.state = 670; + this.state = 696; this.match(QuixosCapabilityParser.DOT); - this.state = 671; + this.state = 697; this.identifier(); - this.state = 673; + this.state = 699; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 23) { + if (_la === 25) { { - this.state = 672; + this.state = 698; this.dependencyBindingBlock(); } } - this.state = 675; + this.state = 701; this.match(QuixosCapabilityParser.SEMI); } } @@ -2656,9 +2757,9 @@ export class QuixosCapabilityParser extends antlr.Parser { } public valueType(): ValueTypeContext { let localContext = new ValueTypeContext(this.context, this.state); - this.enterRule(localContext, 94, QuixosCapabilityParser.RULE_valueType); + this.enterRule(localContext, 98, QuixosCapabilityParser.RULE_valueType); try { - this.state = 702; + this.state = 728; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.BOOL: @@ -2671,82 +2772,82 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.UINT64: this.enterOuterAlt(localContext, 1); { - this.state = 677; + this.state = 703; this.scalarType(); } break; case QuixosCapabilityParser.UNIT: this.enterOuterAlt(localContext, 2); { - this.state = 678; + this.state = 704; this.match(QuixosCapabilityParser.UNIT); } break; case QuixosCapabilityParser.WATCH_HANDLE: this.enterOuterAlt(localContext, 3); { - this.state = 679; + this.state = 705; this.match(QuixosCapabilityParser.WATCH_HANDLE); } break; case QuixosCapabilityParser.MESSAGE: this.enterOuterAlt(localContext, 4); { - this.state = 680; + this.state = 706; this.match(QuixosCapabilityParser.MESSAGE); - this.state = 681; + this.state = 707; this.stringLiteral(); } break; case QuixosCapabilityParser.ATOM_REF: this.enterOuterAlt(localContext, 5); { - this.state = 682; + this.state = 708; this.match(QuixosCapabilityParser.ATOM_REF); - this.state = 683; + this.state = 709; this.match(QuixosCapabilityParser.LT); - this.state = 684; + this.state = 710; this.identifier(); - this.state = 685; + this.state = 711; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.INTERFACE_REF: this.enterOuterAlt(localContext, 6); { - this.state = 687; + this.state = 713; this.match(QuixosCapabilityParser.INTERFACE_REF); - this.state = 688; + this.state = 714; this.match(QuixosCapabilityParser.LT); - this.state = 689; + this.state = 715; this.identifier(); - this.state = 690; + this.state = 716; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.OPTIONAL: this.enterOuterAlt(localContext, 7); { - this.state = 692; + this.state = 718; this.match(QuixosCapabilityParser.OPTIONAL); - this.state = 693; + this.state = 719; this.match(QuixosCapabilityParser.LT); - this.state = 694; + this.state = 720; this.valueType(); - this.state = 695; + this.state = 721; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.LIST: this.enterOuterAlt(localContext, 8); { - this.state = 697; + this.state = 723; this.match(QuixosCapabilityParser.LIST); - this.state = 698; + this.state = 724; this.match(QuixosCapabilityParser.LT); - this.state = 699; + this.state = 725; this.valueType(); - this.state = 700; + this.state = 726; this.match(QuixosCapabilityParser.GT); } break; @@ -2769,14 +2870,14 @@ export class QuixosCapabilityParser extends antlr.Parser { } public scalarType(): ScalarTypeContext { let localContext = new ScalarTypeContext(this.context, this.state); - this.enterRule(localContext, 96, QuixosCapabilityParser.RULE_scalarType); + this.enterRule(localContext, 100, QuixosCapabilityParser.RULE_scalarType); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 704; + this.state = 730; _la = this.tokenStream.LA(1); - if(!(((((_la - 72)) & ~0x1F) === 0 && ((1 << (_la - 72)) & 255) !== 0))) { + if(!(((((_la - 74)) & ~0x1F) === 0 && ((1 << (_la - 74)) & 255) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -2800,14 +2901,14 @@ export class QuixosCapabilityParser extends antlr.Parser { } public cardinality(): CardinalityContext { let localContext = new CardinalityContext(this.context, this.state); - this.enterRule(localContext, 98, QuixosCapabilityParser.RULE_cardinality); + this.enterRule(localContext, 102, QuixosCapabilityParser.RULE_cardinality); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 706; + this.state = 732; _la = this.tokenStream.LA(1); - if(!(((((_la - 60)) & ~0x1F) === 0 && ((1 << (_la - 60)) & 15) !== 0))) { + if(!(((((_la - 62)) & ~0x1F) === 0 && ((1 << (_la - 62)) & 15) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -2831,64 +2932,64 @@ export class QuixosCapabilityParser extends antlr.Parser { } public jsonLiteral(): JsonLiteralContext { let localContext = new JsonLiteralContext(this.context, this.state); - this.enterRule(localContext, 100, QuixosCapabilityParser.RULE_jsonLiteral); + this.enterRule(localContext, 104, QuixosCapabilityParser.RULE_jsonLiteral); try { - this.state = 716; + this.state = 742; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.STRING_LITERAL: this.enterOuterAlt(localContext, 1); { - this.state = 708; + this.state = 734; this.stringLiteral(); } break; case QuixosCapabilityParser.INTEGER: this.enterOuterAlt(localContext, 2); { - this.state = 709; + this.state = 735; this.match(QuixosCapabilityParser.INTEGER); } break; case QuixosCapabilityParser.JSON_NUMBER: this.enterOuterAlt(localContext, 3); { - this.state = 710; + this.state = 736; this.match(QuixosCapabilityParser.JSON_NUMBER); } break; case QuixosCapabilityParser.TRUE: this.enterOuterAlt(localContext, 4); { - this.state = 711; + this.state = 737; this.match(QuixosCapabilityParser.TRUE); } break; case QuixosCapabilityParser.FALSE: this.enterOuterAlt(localContext, 5); { - this.state = 712; + this.state = 738; this.match(QuixosCapabilityParser.FALSE); } break; case QuixosCapabilityParser.NULL: this.enterOuterAlt(localContext, 6); { - this.state = 713; + this.state = 739; this.match(QuixosCapabilityParser.NULL); } break; case QuixosCapabilityParser.LBRACE: this.enterOuterAlt(localContext, 7); { - this.state = 714; + this.state = 740; this.jsonObject(); } break; case QuixosCapabilityParser.LBRACK: this.enterOuterAlt(localContext, 8); { - this.state = 715; + this.state = 741; this.jsonArray(); } break; @@ -2911,40 +3012,40 @@ export class QuixosCapabilityParser extends antlr.Parser { } public jsonObject(): JsonObjectContext { let localContext = new JsonObjectContext(this.context, this.state); - this.enterRule(localContext, 102, QuixosCapabilityParser.RULE_jsonObject); + this.enterRule(localContext, 106, QuixosCapabilityParser.RULE_jsonObject); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 718; + this.state = 744; this.match(QuixosCapabilityParser.LBRACE); - this.state = 727; + this.state = 753; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 99) { + if (_la === 101) { { - this.state = 719; + this.state = 745; this.jsonMember(); - this.state = 724; + this.state = 750; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 86) { + while (_la === 88) { { { - this.state = 720; + this.state = 746; this.match(QuixosCapabilityParser.COMMA); - this.state = 721; + this.state = 747; this.jsonMember(); } } - this.state = 726; + this.state = 752; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } } } - this.state = 729; + this.state = 755; this.match(QuixosCapabilityParser.RBRACE); } } @@ -2963,15 +3064,15 @@ export class QuixosCapabilityParser extends antlr.Parser { } public jsonMember(): JsonMemberContext { let localContext = new JsonMemberContext(this.context, this.state); - this.enterRule(localContext, 104, QuixosCapabilityParser.RULE_jsonMember); + this.enterRule(localContext, 108, QuixosCapabilityParser.RULE_jsonMember); try { this.enterOuterAlt(localContext, 1); { - this.state = 731; + this.state = 757; this.stringLiteral(); - this.state = 732; + this.state = 758; this.match(QuixosCapabilityParser.COLON); - this.state = 733; + this.state = 759; this.jsonLiteral(); } } @@ -2990,40 +3091,40 @@ export class QuixosCapabilityParser extends antlr.Parser { } public jsonArray(): JsonArrayContext { let localContext = new JsonArrayContext(this.context, this.state); - this.enterRule(localContext, 106, QuixosCapabilityParser.RULE_jsonArray); + this.enterRule(localContext, 110, QuixosCapabilityParser.RULE_jsonArray); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 735; + this.state = 761; this.match(QuixosCapabilityParser.LBRACK); - this.state = 744; + this.state = 770; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (((((_la - 80)) & ~0x1F) === 0 && ((1 << (_la - 80)) & 722183) !== 0)) { + if (((((_la - 82)) & ~0x1F) === 0 && ((1 << (_la - 82)) & 722183) !== 0)) { { - this.state = 736; + this.state = 762; this.jsonLiteral(); - this.state = 741; + this.state = 767; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 86) { + while (_la === 88) { { { - this.state = 737; + this.state = 763; this.match(QuixosCapabilityParser.COMMA); - this.state = 738; + this.state = 764; this.jsonLiteral(); } } - this.state = 743; + this.state = 769; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } } } - this.state = 746; + this.state = 772; this.match(QuixosCapabilityParser.RBRACK); } } @@ -3042,14 +3143,14 @@ export class QuixosCapabilityParser extends antlr.Parser { } public identifier(): IdentifierContext { let localContext = new IdentifierContext(this.context, this.state); - this.enterRule(localContext, 108, QuixosCapabilityParser.RULE_identifier); + this.enterRule(localContext, 112, QuixosCapabilityParser.RULE_identifier); let _la: number; try { this.enterOuterAlt(localContext, 1); { - this.state = 748; + this.state = 774; _la = this.tokenStream.LA(1); - if(!(_la === 32 || _la === 98)) { + if(!(_la === 34 || _la === 100)) { this.errorHandler.recoverInline(this); } else { @@ -3073,11 +3174,11 @@ export class QuixosCapabilityParser extends antlr.Parser { } public stringLiteral(): StringLiteralContext { let localContext = new StringLiteralContext(this.context, this.state); - this.enterRule(localContext, 110, QuixosCapabilityParser.RULE_stringLiteral); + this.enterRule(localContext, 114, QuixosCapabilityParser.RULE_stringLiteral); try { this.enterOuterAlt(localContext, 1); { - this.state = 750; + this.state = 776; this.match(QuixosCapabilityParser.STRING_LITERAL); } } @@ -3096,7 +3197,7 @@ export class QuixosCapabilityParser extends antlr.Parser { } public static readonly _serializedATN: number[] = [ - 4,1,102,753,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6, + 4,1,104,779,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6, 7,6,2,7,7,7,2,8,7,8,2,9,7,9,2,10,7,10,2,11,7,11,2,12,7,12,2,13,7, 13,2,14,7,14,2,15,7,15,2,16,7,16,2,17,7,17,2,18,7,18,2,19,7,19,2, 20,7,20,2,21,7,21,2,22,7,22,2,23,7,23,2,24,7,24,2,25,7,25,2,26,7, @@ -3104,268 +3205,278 @@ export class QuixosCapabilityParser extends antlr.Parser { 33,7,33,2,34,7,34,2,35,7,35,2,36,7,36,2,37,7,37,2,38,7,38,2,39,7, 39,2,40,7,40,2,41,7,41,2,42,7,42,2,43,7,43,2,44,7,44,2,45,7,45,2, 46,7,46,2,47,7,47,2,48,7,48,2,49,7,49,2,50,7,50,2,51,7,51,2,52,7, - 52,2,53,7,53,2,54,7,54,2,55,7,55,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0, - 1,0,3,0,122,8,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,5,1,134, - 8,1,10,1,12,1,137,9,1,1,1,1,1,1,2,1,2,1,2,1,2,1,2,3,2,146,8,2,1, - 3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,3,3,158,8,3,1,4,1,4,1,4,1, - 4,1,4,1,4,1,4,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,6,1,6,1,6,3,6,177,8, - 6,1,7,1,7,1,7,1,7,1,7,1,7,3,7,185,8,7,1,7,1,7,1,8,5,8,190,8,8,10, - 8,12,8,193,9,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,5,8,203,8,8,10,8, - 12,8,206,9,8,1,8,1,8,1,9,1,9,1,9,3,9,213,8,9,1,10,1,10,1,10,1,10, - 1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,10,1,11,1,11, - 1,11,1,11,1,11,1,11,1,11,1,11,5,11,238,8,11,10,11,12,11,241,9,11, - 1,11,1,11,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12, - 1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,3,12,264,8,12,1,13,1,13, - 1,13,1,13,1,13,1,13,1,13,1,13,3,13,274,8,13,1,13,1,13,5,13,278,8, - 13,10,13,12,13,281,9,13,1,13,1,13,1,14,1,14,1,14,1,14,1,14,1,14, - 1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,14, - 1,14,1,14,1,14,1,14,1,14,3,14,309,8,14,1,15,1,15,1,15,1,15,3,15, - 315,8,15,1,16,5,16,318,8,16,10,16,12,16,321,9,16,1,16,1,16,1,16, - 1,16,1,16,1,16,1,16,1,16,5,16,331,8,16,10,16,12,16,334,9,16,1,16, - 1,16,1,17,1,17,1,17,3,17,341,8,17,1,18,1,18,1,18,1,18,1,18,1,18, - 1,18,1,18,1,18,1,18,1,18,3,18,354,8,18,1,18,1,18,1,18,3,18,359,8, - 18,1,18,1,18,1,19,1,19,1,19,1,19,1,19,1,19,1,19,1,19,1,19,3,19,372, - 8,19,1,19,1,19,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,3,20, - 385,8,20,1,20,1,20,1,21,1,21,1,21,1,22,1,22,1,23,1,23,1,23,1,23, - 1,23,1,23,3,23,400,8,23,1,23,3,23,403,8,23,1,24,1,24,1,24,5,24,408, - 8,24,10,24,12,24,411,9,24,1,25,1,25,1,25,5,25,416,8,25,10,25,12, - 25,419,9,25,1,25,1,25,1,26,1,26,1,26,1,26,1,26,1,26,1,26,1,26,1, - 26,1,26,1,26,1,26,1,26,1,26,1,26,1,26,1,26,1,26,1,26,1,26,1,26,1, - 26,1,26,1,26,1,26,1,26,1,26,1,26,1,26,1,26,1,26,1,26,1,26,1,26,1, - 26,3,26,458,8,26,1,27,1,27,1,27,1,27,5,27,464,8,27,10,27,12,27,467, - 9,27,1,27,1,27,1,28,1,28,1,29,1,29,1,29,1,30,1,30,3,30,478,8,30, - 1,31,1,31,1,31,1,31,1,31,1,31,1,31,1,31,1,31,1,31,1,31,1,31,3,31, - 492,8,31,1,31,1,31,1,32,1,32,1,32,1,32,1,32,1,32,3,32,502,8,32,1, - 33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,34,1,34,1,34,1,34,1, - 34,1,34,1,34,3,34,520,8,34,1,34,1,34,1,35,1,35,1,35,1,35,1,35,1, - 35,5,35,530,8,35,10,35,12,35,533,9,35,1,35,1,35,1,36,1,36,1,36,1, - 36,3,36,541,8,36,1,37,1,37,1,37,1,37,1,37,1,37,1,37,1,37,1,37,1, - 37,1,37,1,37,1,37,1,37,1,38,1,38,1,38,1,38,1,38,1,38,1,39,1,39,1, - 39,1,39,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,3, - 40,578,8,40,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1, - 41,1,41,1,41,1,41,1,41,1,41,1,41,3,41,597,8,41,3,41,599,8,41,1,42, - 1,42,1,43,1,43,1,44,1,44,1,44,5,44,608,8,44,10,44,12,44,611,9,44, - 1,44,1,44,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,3,45, - 625,8,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45, - 1,45,1,45,1,45,3,45,641,8,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45, - 1,45,1,45,1,45,1,45,1,45,3,45,655,8,45,1,45,1,45,1,45,1,45,1,45, - 1,45,1,45,1,45,3,45,665,8,45,1,46,1,46,1,46,1,46,1,46,1,46,1,46, - 3,46,674,8,46,1,46,1,46,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47, - 1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47, - 1,47,1,47,1,47,1,47,3,47,703,8,47,1,48,1,48,1,49,1,49,1,50,1,50, - 1,50,1,50,1,50,1,50,1,50,1,50,3,50,717,8,50,1,51,1,51,1,51,1,51, - 5,51,723,8,51,10,51,12,51,726,9,51,3,51,728,8,51,1,51,1,51,1,52, - 1,52,1,52,1,52,1,53,1,53,1,53,1,53,5,53,740,8,53,10,53,12,53,743, - 9,53,3,53,745,8,53,1,53,1,53,1,54,1,54,1,55,1,55,1,55,0,0,56,0,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,0,7,1,0,53,57,2,0,48,52,54,55,2, - 0,48,49,54,55,2,0,50,52,54,55,1,0,72,79,1,0,60,63,2,0,32,32,98,98, - 783,0,121,1,0,0,0,2,123,1,0,0,0,4,145,1,0,0,0,6,157,1,0,0,0,8,159, - 1,0,0,0,10,166,1,0,0,0,12,176,1,0,0,0,14,178,1,0,0,0,16,191,1,0, - 0,0,18,212,1,0,0,0,20,214,1,0,0,0,22,229,1,0,0,0,24,263,1,0,0,0, - 26,265,1,0,0,0,28,308,1,0,0,0,30,314,1,0,0,0,32,319,1,0,0,0,34,340, - 1,0,0,0,36,342,1,0,0,0,38,362,1,0,0,0,40,375,1,0,0,0,42,388,1,0, - 0,0,44,391,1,0,0,0,46,402,1,0,0,0,48,404,1,0,0,0,50,412,1,0,0,0, - 52,457,1,0,0,0,54,459,1,0,0,0,56,470,1,0,0,0,58,472,1,0,0,0,60,477, - 1,0,0,0,62,479,1,0,0,0,64,501,1,0,0,0,66,503,1,0,0,0,68,512,1,0, - 0,0,70,523,1,0,0,0,72,540,1,0,0,0,74,542,1,0,0,0,76,556,1,0,0,0, - 78,562,1,0,0,0,80,577,1,0,0,0,82,598,1,0,0,0,84,600,1,0,0,0,86,602, - 1,0,0,0,88,604,1,0,0,0,90,664,1,0,0,0,92,666,1,0,0,0,94,702,1,0, - 0,0,96,704,1,0,0,0,98,706,1,0,0,0,100,716,1,0,0,0,102,718,1,0,0, - 0,104,731,1,0,0,0,106,735,1,0,0,0,108,748,1,0,0,0,110,750,1,0,0, - 0,112,113,3,2,1,0,113,114,5,0,0,1,114,122,1,0,0,0,115,116,3,16,8, - 0,116,117,5,0,0,1,117,122,1,0,0,0,118,119,3,32,16,0,119,120,5,0, - 0,1,120,122,1,0,0,0,121,112,1,0,0,0,121,115,1,0,0,0,121,118,1,0, - 0,0,122,1,1,0,0,0,123,124,5,1,0,0,124,125,3,108,54,0,125,126,5,36, - 0,0,126,127,3,110,55,0,127,128,5,35,0,0,128,129,3,110,55,0,129,130, - 5,34,0,0,130,131,3,110,55,0,131,135,5,88,0,0,132,134,3,4,2,0,133, - 132,1,0,0,0,134,137,1,0,0,0,135,133,1,0,0,0,135,136,1,0,0,0,136, - 138,1,0,0,0,137,135,1,0,0,0,138,139,5,89,0,0,139,3,1,0,0,0,140,146, - 3,14,7,0,141,146,3,6,3,0,142,146,3,58,29,0,143,146,3,70,35,0,144, - 146,3,92,46,0,145,140,1,0,0,0,145,141,1,0,0,0,145,142,1,0,0,0,145, - 143,1,0,0,0,145,144,1,0,0,0,146,5,1,0,0,0,147,148,5,2,0,0,148,149, - 5,5,0,0,149,150,3,108,54,0,150,151,5,85,0,0,151,158,1,0,0,0,152, - 153,5,2,0,0,153,154,5,7,0,0,154,155,3,108,54,0,155,156,5,85,0,0, - 156,158,1,0,0,0,157,147,1,0,0,0,157,152,1,0,0,0,158,7,1,0,0,0,159, - 160,5,3,0,0,160,161,5,4,0,0,161,162,3,108,54,0,162,163,5,36,0,0, - 163,164,3,110,55,0,164,165,5,85,0,0,165,9,1,0,0,0,166,167,5,3,0, - 0,167,168,5,5,0,0,168,169,3,108,54,0,169,170,5,35,0,0,170,171,3, - 110,55,0,171,172,5,85,0,0,172,11,1,0,0,0,173,177,3,6,3,0,174,177, - 3,8,4,0,175,177,3,10,5,0,176,173,1,0,0,0,176,174,1,0,0,0,176,175, - 1,0,0,0,177,13,1,0,0,0,178,179,5,4,0,0,179,180,3,108,54,0,180,181, - 5,36,0,0,181,184,3,110,55,0,182,183,5,37,0,0,183,185,3,110,55,0, - 184,182,1,0,0,0,184,185,1,0,0,0,185,186,1,0,0,0,186,187,5,85,0,0, - 187,15,1,0,0,0,188,190,3,12,6,0,189,188,1,0,0,0,190,193,1,0,0,0, - 191,189,1,0,0,0,191,192,1,0,0,0,192,194,1,0,0,0,193,191,1,0,0,0, - 194,195,5,5,0,0,195,196,3,108,54,0,196,197,5,36,0,0,197,198,3,110, - 55,0,198,199,5,35,0,0,199,200,3,110,55,0,200,204,5,88,0,0,201,203, - 3,18,9,0,202,201,1,0,0,0,203,206,1,0,0,0,204,202,1,0,0,0,204,205, - 1,0,0,0,205,207,1,0,0,0,206,204,1,0,0,0,207,208,5,89,0,0,208,17, - 1,0,0,0,209,213,3,22,11,0,210,213,3,26,13,0,211,213,3,20,10,0,212, - 209,1,0,0,0,212,210,1,0,0,0,212,211,1,0,0,0,213,19,1,0,0,0,214,215, - 5,10,0,0,215,216,3,108,54,0,216,217,5,36,0,0,217,218,3,110,55,0, - 218,219,5,84,0,0,219,220,3,94,47,0,220,221,5,83,0,0,221,222,3,94, - 47,0,222,223,5,88,0,0,223,224,5,53,0,0,224,225,5,36,0,0,225,226, - 3,110,55,0,226,227,5,85,0,0,227,228,5,89,0,0,228,21,1,0,0,0,229, - 230,5,8,0,0,230,231,3,108,54,0,231,232,5,36,0,0,232,233,3,110,55, - 0,233,234,5,84,0,0,234,235,3,94,47,0,235,239,5,88,0,0,236,238,3, - 24,12,0,237,236,1,0,0,0,238,241,1,0,0,0,239,237,1,0,0,0,239,240, - 1,0,0,0,240,242,1,0,0,0,241,239,1,0,0,0,242,243,5,89,0,0,243,23, - 1,0,0,0,244,245,5,43,0,0,245,246,5,36,0,0,246,247,3,110,55,0,247, - 248,5,85,0,0,248,264,1,0,0,0,249,250,5,44,0,0,250,251,5,36,0,0,251, - 252,3,110,55,0,252,253,5,85,0,0,253,264,1,0,0,0,254,255,5,45,0,0, - 255,256,5,46,0,0,256,257,5,36,0,0,257,258,3,110,55,0,258,259,5,47, - 0,0,259,260,5,36,0,0,260,261,3,110,55,0,261,262,5,85,0,0,262,264, - 1,0,0,0,263,244,1,0,0,0,263,249,1,0,0,0,263,254,1,0,0,0,264,25,1, - 0,0,0,265,266,5,9,0,0,266,267,3,108,54,0,267,268,5,36,0,0,268,269, - 3,110,55,0,269,270,5,84,0,0,270,271,3,98,49,0,271,273,3,30,15,0, - 272,274,5,64,0,0,273,272,1,0,0,0,273,274,1,0,0,0,274,275,1,0,0,0, - 275,279,5,88,0,0,276,278,3,28,14,0,277,276,1,0,0,0,278,281,1,0,0, - 0,279,277,1,0,0,0,279,280,1,0,0,0,280,282,1,0,0,0,281,279,1,0,0, - 0,282,283,5,89,0,0,283,27,1,0,0,0,284,285,5,50,0,0,285,286,5,36, - 0,0,286,287,3,110,55,0,287,288,5,85,0,0,288,309,1,0,0,0,289,290, - 5,51,0,0,290,291,5,36,0,0,291,292,3,110,55,0,292,293,5,85,0,0,293, - 309,1,0,0,0,294,295,5,52,0,0,295,296,5,36,0,0,296,297,3,110,55,0, - 297,298,5,85,0,0,298,309,1,0,0,0,299,300,5,45,0,0,300,301,5,46,0, - 0,301,302,5,36,0,0,302,303,3,110,55,0,303,304,5,47,0,0,304,305,5, - 36,0,0,305,306,3,110,55,0,306,307,5,85,0,0,307,309,1,0,0,0,308,284, - 1,0,0,0,308,289,1,0,0,0,308,294,1,0,0,0,308,299,1,0,0,0,309,29,1, - 0,0,0,310,311,5,4,0,0,311,315,3,108,54,0,312,313,5,5,0,0,313,315, - 3,108,54,0,314,310,1,0,0,0,314,312,1,0,0,0,315,31,1,0,0,0,316,318, - 3,12,6,0,317,316,1,0,0,0,318,321,1,0,0,0,319,317,1,0,0,0,319,320, - 1,0,0,0,320,322,1,0,0,0,321,319,1,0,0,0,322,323,5,7,0,0,323,324, - 3,108,54,0,324,325,5,36,0,0,325,326,3,110,55,0,326,327,5,35,0,0, - 327,328,3,110,55,0,328,332,5,88,0,0,329,331,3,34,17,0,330,329,1, - 0,0,0,331,334,1,0,0,0,332,330,1,0,0,0,332,333,1,0,0,0,333,335,1, - 0,0,0,334,332,1,0,0,0,335,336,5,89,0,0,336,33,1,0,0,0,337,341,3, - 36,18,0,338,341,3,38,19,0,339,341,3,40,20,0,340,337,1,0,0,0,340, - 338,1,0,0,0,340,339,1,0,0,0,341,35,1,0,0,0,342,343,5,10,0,0,343, - 344,3,108,54,0,344,345,5,36,0,0,345,346,3,110,55,0,346,347,5,84, - 0,0,347,348,3,94,47,0,348,349,5,83,0,0,349,350,3,94,47,0,350,351, - 5,38,0,0,351,353,3,44,22,0,352,354,3,42,21,0,353,352,1,0,0,0,353, - 354,1,0,0,0,354,355,1,0,0,0,355,356,5,40,0,0,356,358,3,46,23,0,357, - 359,3,50,25,0,358,357,1,0,0,0,358,359,1,0,0,0,359,360,1,0,0,0,360, - 361,5,85,0,0,361,37,1,0,0,0,362,363,5,11,0,0,363,364,3,108,54,0, - 364,365,5,36,0,0,365,366,3,110,55,0,366,367,5,84,0,0,367,368,3,94, - 47,0,368,369,5,83,0,0,369,371,3,94,47,0,370,372,3,50,25,0,371,370, - 1,0,0,0,371,372,1,0,0,0,372,373,1,0,0,0,373,374,5,85,0,0,374,39, - 1,0,0,0,375,376,5,12,0,0,376,377,3,108,54,0,377,378,5,36,0,0,378, - 379,3,110,55,0,379,380,5,13,0,0,380,381,3,108,54,0,381,382,5,84, - 0,0,382,384,3,94,47,0,383,385,3,50,25,0,384,383,1,0,0,0,384,385, - 1,0,0,0,385,386,1,0,0,0,386,387,5,85,0,0,387,41,1,0,0,0,388,389, - 5,39,0,0,389,390,3,94,47,0,390,43,1,0,0,0,391,392,7,0,0,0,392,45, - 1,0,0,0,393,403,5,42,0,0,394,395,5,4,0,0,395,403,3,108,54,0,396, - 397,5,6,0,0,397,399,5,90,0,0,398,400,3,48,24,0,399,398,1,0,0,0,399, - 400,1,0,0,0,400,401,1,0,0,0,401,403,5,91,0,0,402,393,1,0,0,0,402, - 394,1,0,0,0,402,396,1,0,0,0,403,47,1,0,0,0,404,409,3,108,54,0,405, - 406,5,86,0,0,406,408,3,108,54,0,407,405,1,0,0,0,408,411,1,0,0,0, - 409,407,1,0,0,0,409,410,1,0,0,0,410,49,1,0,0,0,411,409,1,0,0,0,412, - 413,5,41,0,0,413,417,5,88,0,0,414,416,3,52,26,0,415,414,1,0,0,0, - 416,419,1,0,0,0,417,415,1,0,0,0,417,418,1,0,0,0,418,420,1,0,0,0, - 419,417,1,0,0,0,420,421,5,89,0,0,421,51,1,0,0,0,422,423,5,20,0,0, - 423,424,3,108,54,0,424,425,5,36,0,0,425,426,3,110,55,0,426,427,5, - 84,0,0,427,428,3,94,47,0,428,429,3,54,27,0,429,430,5,85,0,0,430, - 458,1,0,0,0,431,432,5,21,0,0,432,433,3,108,54,0,433,434,5,36,0,0, - 434,435,3,110,55,0,435,436,5,84,0,0,436,437,3,98,49,0,437,438,3, - 30,15,0,438,439,3,54,27,0,439,440,5,85,0,0,440,458,1,0,0,0,441,442, - 5,5,0,0,442,443,3,108,54,0,443,444,5,36,0,0,444,445,3,110,55,0,445, - 446,5,84,0,0,446,447,3,108,54,0,447,448,5,85,0,0,448,458,1,0,0,0, - 449,450,5,12,0,0,450,451,3,108,54,0,451,452,5,36,0,0,452,453,3,110, - 55,0,453,454,5,84,0,0,454,455,3,108,54,0,455,456,5,85,0,0,456,458, - 1,0,0,0,457,422,1,0,0,0,457,431,1,0,0,0,457,441,1,0,0,0,457,449, - 1,0,0,0,458,53,1,0,0,0,459,460,5,90,0,0,460,465,3,56,28,0,461,462, - 5,86,0,0,462,464,3,56,28,0,463,461,1,0,0,0,464,467,1,0,0,0,465,463, - 1,0,0,0,465,466,1,0,0,0,466,468,1,0,0,0,467,465,1,0,0,0,468,469, - 5,91,0,0,469,55,1,0,0,0,470,471,7,1,0,0,471,57,1,0,0,0,472,473,5, - 19,0,0,473,474,3,60,30,0,474,59,1,0,0,0,475,478,3,62,31,0,476,478, - 3,66,33,0,477,475,1,0,0,0,477,476,1,0,0,0,478,61,1,0,0,0,479,480, - 5,20,0,0,480,481,3,108,54,0,481,482,5,36,0,0,482,483,3,110,55,0, - 483,484,5,29,0,0,484,485,3,108,54,0,485,486,5,84,0,0,486,487,3,94, - 47,0,487,488,5,30,0,0,488,491,3,64,32,0,489,490,5,31,0,0,490,492, - 3,100,50,0,491,489,1,0,0,0,491,492,1,0,0,0,492,493,1,0,0,0,493,494, - 5,85,0,0,494,63,1,0,0,0,495,502,5,58,0,0,496,497,5,59,0,0,497,498, - 5,92,0,0,498,499,3,94,47,0,499,500,5,93,0,0,500,502,1,0,0,0,501, - 495,1,0,0,0,501,496,1,0,0,0,502,65,1,0,0,0,503,504,5,21,0,0,504, - 505,3,108,54,0,505,506,5,36,0,0,506,507,3,110,55,0,507,508,5,88, - 0,0,508,509,3,68,34,0,509,510,3,68,34,0,510,511,5,89,0,0,511,67, - 1,0,0,0,512,513,3,30,15,0,513,514,5,22,0,0,514,515,3,108,54,0,515, - 516,5,36,0,0,516,517,3,110,55,0,517,519,3,98,49,0,518,520,5,64,0, - 0,519,518,1,0,0,0,519,520,1,0,0,0,520,521,1,0,0,0,521,522,5,85,0, - 0,522,69,1,0,0,0,523,524,5,14,0,0,524,525,3,108,54,0,525,526,5,15, - 0,0,526,527,3,108,54,0,527,531,5,88,0,0,528,530,3,72,36,0,529,528, - 1,0,0,0,530,533,1,0,0,0,531,529,1,0,0,0,531,532,1,0,0,0,532,534, - 1,0,0,0,533,531,1,0,0,0,534,535,5,89,0,0,535,71,1,0,0,0,536,537, - 5,18,0,0,537,541,3,60,30,0,538,541,3,76,38,0,539,541,3,74,37,0,540, - 536,1,0,0,0,540,538,1,0,0,0,540,539,1,0,0,0,541,73,1,0,0,0,542,543, - 5,26,0,0,543,544,3,108,54,0,544,545,5,27,0,0,545,546,5,28,0,0,546, - 547,5,24,0,0,547,548,5,12,0,0,548,549,3,108,54,0,549,550,5,25,0, - 0,550,551,5,21,0,0,551,552,3,108,54,0,552,553,5,87,0,0,553,554,3, - 108,54,0,554,555,5,85,0,0,555,75,1,0,0,0,556,557,5,16,0,0,557,558, - 3,78,39,0,558,559,5,17,0,0,559,560,3,82,41,0,560,561,5,85,0,0,561, - 77,1,0,0,0,562,563,3,108,54,0,563,564,5,87,0,0,564,565,3,80,40,0, - 565,79,1,0,0,0,566,578,3,108,54,0,567,578,5,53,0,0,568,578,5,43, - 0,0,569,578,5,44,0,0,570,578,5,50,0,0,571,578,5,51,0,0,572,578,5, - 52,0,0,573,578,5,54,0,0,574,578,5,55,0,0,575,578,5,56,0,0,576,578, - 5,57,0,0,577,566,1,0,0,0,577,567,1,0,0,0,577,568,1,0,0,0,577,569, - 1,0,0,0,577,570,1,0,0,0,577,571,1,0,0,0,577,572,1,0,0,0,577,573, - 1,0,0,0,577,574,1,0,0,0,577,575,1,0,0,0,577,576,1,0,0,0,578,81,1, - 0,0,0,579,580,5,20,0,0,580,581,3,108,54,0,581,582,5,87,0,0,582,583, - 3,84,42,0,583,599,1,0,0,0,584,585,5,21,0,0,585,586,3,108,54,0,586, - 587,5,87,0,0,587,588,3,108,54,0,588,589,5,87,0,0,589,590,3,86,43, - 0,590,599,1,0,0,0,591,592,5,7,0,0,592,593,3,108,54,0,593,594,5,87, - 0,0,594,596,3,108,54,0,595,597,3,88,44,0,596,595,1,0,0,0,596,597, - 1,0,0,0,597,599,1,0,0,0,598,579,1,0,0,0,598,584,1,0,0,0,598,591, - 1,0,0,0,599,83,1,0,0,0,600,601,7,2,0,0,601,85,1,0,0,0,602,603,7, - 3,0,0,603,87,1,0,0,0,604,605,5,23,0,0,605,609,5,88,0,0,606,608,3, - 90,45,0,607,606,1,0,0,0,608,611,1,0,0,0,609,607,1,0,0,0,609,610, - 1,0,0,0,610,612,1,0,0,0,611,609,1,0,0,0,612,613,5,89,0,0,613,89, - 1,0,0,0,614,615,3,108,54,0,615,616,5,17,0,0,616,617,5,20,0,0,617, - 624,3,108,54,0,618,619,5,25,0,0,619,620,5,21,0,0,620,621,3,108,54, - 0,621,622,5,87,0,0,622,623,3,108,54,0,623,625,1,0,0,0,624,618,1, - 0,0,0,624,625,1,0,0,0,625,626,1,0,0,0,626,627,5,85,0,0,627,665,1, - 0,0,0,628,629,3,108,54,0,629,630,5,17,0,0,630,631,5,21,0,0,631,632, - 3,108,54,0,632,633,5,87,0,0,633,640,3,108,54,0,634,635,5,25,0,0, - 635,636,5,21,0,0,636,637,3,108,54,0,637,638,5,87,0,0,638,639,3,108, - 54,0,639,641,1,0,0,0,640,634,1,0,0,0,640,641,1,0,0,0,641,642,1,0, - 0,0,642,643,5,85,0,0,643,665,1,0,0,0,644,645,3,108,54,0,645,646, - 5,17,0,0,646,647,5,5,0,0,647,654,3,108,54,0,648,649,5,25,0,0,649, - 650,5,21,0,0,650,651,3,108,54,0,651,652,5,87,0,0,652,653,3,108,54, - 0,653,655,1,0,0,0,654,648,1,0,0,0,654,655,1,0,0,0,655,656,1,0,0, - 0,656,657,5,85,0,0,657,665,1,0,0,0,658,659,3,108,54,0,659,660,5, - 17,0,0,660,661,5,12,0,0,661,662,3,108,54,0,662,663,5,85,0,0,663, - 665,1,0,0,0,664,614,1,0,0,0,664,628,1,0,0,0,664,644,1,0,0,0,664, - 658,1,0,0,0,665,91,1,0,0,0,666,667,5,12,0,0,667,668,3,108,54,0,668, - 669,5,17,0,0,669,670,3,108,54,0,670,671,5,87,0,0,671,673,3,108,54, - 0,672,674,3,88,44,0,673,672,1,0,0,0,673,674,1,0,0,0,674,675,1,0, - 0,0,675,676,5,85,0,0,676,93,1,0,0,0,677,703,3,96,48,0,678,703,5, - 65,0,0,679,703,5,66,0,0,680,681,5,67,0,0,681,703,3,110,55,0,682, - 683,5,68,0,0,683,684,5,94,0,0,684,685,3,108,54,0,685,686,5,95,0, - 0,686,703,1,0,0,0,687,688,5,69,0,0,688,689,5,94,0,0,689,690,3,108, - 54,0,690,691,5,95,0,0,691,703,1,0,0,0,692,693,5,70,0,0,693,694,5, - 94,0,0,694,695,3,94,47,0,695,696,5,95,0,0,696,703,1,0,0,0,697,698, - 5,71,0,0,698,699,5,94,0,0,699,700,3,94,47,0,700,701,5,95,0,0,701, - 703,1,0,0,0,702,677,1,0,0,0,702,678,1,0,0,0,702,679,1,0,0,0,702, - 680,1,0,0,0,702,682,1,0,0,0,702,687,1,0,0,0,702,692,1,0,0,0,702, - 697,1,0,0,0,703,95,1,0,0,0,704,705,7,4,0,0,705,97,1,0,0,0,706,707, - 7,5,0,0,707,99,1,0,0,0,708,717,3,110,55,0,709,717,5,96,0,0,710,717, - 5,97,0,0,711,717,5,80,0,0,712,717,5,81,0,0,713,717,5,82,0,0,714, - 717,3,102,51,0,715,717,3,106,53,0,716,708,1,0,0,0,716,709,1,0,0, - 0,716,710,1,0,0,0,716,711,1,0,0,0,716,712,1,0,0,0,716,713,1,0,0, - 0,716,714,1,0,0,0,716,715,1,0,0,0,717,101,1,0,0,0,718,727,5,88,0, - 0,719,724,3,104,52,0,720,721,5,86,0,0,721,723,3,104,52,0,722,720, - 1,0,0,0,723,726,1,0,0,0,724,722,1,0,0,0,724,725,1,0,0,0,725,728, - 1,0,0,0,726,724,1,0,0,0,727,719,1,0,0,0,727,728,1,0,0,0,728,729, - 1,0,0,0,729,730,5,89,0,0,730,103,1,0,0,0,731,732,3,110,55,0,732, - 733,5,84,0,0,733,734,3,100,50,0,734,105,1,0,0,0,735,744,5,90,0,0, - 736,741,3,100,50,0,737,738,5,86,0,0,738,740,3,100,50,0,739,737,1, - 0,0,0,740,743,1,0,0,0,741,739,1,0,0,0,741,742,1,0,0,0,742,745,1, - 0,0,0,743,741,1,0,0,0,744,736,1,0,0,0,744,745,1,0,0,0,745,746,1, - 0,0,0,746,747,5,91,0,0,747,107,1,0,0,0,748,749,7,6,0,0,749,109,1, - 0,0,0,750,751,5,99,0,0,751,111,1,0,0,0,49,121,135,145,157,176,184, - 191,204,212,239,263,273,279,308,314,319,332,340,353,358,371,384, - 399,402,409,417,457,465,477,491,501,519,531,540,577,596,598,609, - 624,640,654,664,673,702,716,724,727,741,744 + 52,2,53,7,53,2,54,7,54,2,55,7,55,2,56,7,56,2,57,7,57,1,0,1,0,1,0, + 1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,3,0,129,8,0,1,1,1,1,1,1,5,1, + 134,8,1,10,1,12,1,137,9,1,1,1,1,1,1,2,1,2,1,2,1,2,1,3,1,3,1,3,1, + 3,1,3,1,3,1,3,1,3,1,3,1,3,5,3,155,8,3,10,3,12,3,158,9,3,1,3,1,3, + 1,4,1,4,1,4,1,4,1,4,1,4,3,4,168,8,4,1,5,1,5,1,5,1,5,1,5,1,5,1,5, + 1,5,1,5,1,5,3,5,180,8,5,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,7,1,7,1,7, + 1,7,1,7,1,7,1,7,1,8,1,8,1,8,3,8,199,8,8,1,9,1,9,1,9,1,9,1,9,1,9, + 3,9,207,8,9,1,9,1,9,1,10,5,10,212,8,10,10,10,12,10,215,9,10,1,10, + 1,10,1,10,1,10,1,10,1,10,1,10,1,10,5,10,225,8,10,10,10,12,10,228, + 9,10,1,10,1,10,1,11,1,11,1,11,3,11,235,8,11,1,12,1,12,1,12,1,12, + 1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,13,1,13, + 1,13,1,13,1,13,1,13,1,13,1,13,5,13,260,8,13,10,13,12,13,263,9,13, + 1,13,1,13,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,14, + 1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,14,3,14,286,8,14,1,15,1,15, + 1,15,1,15,1,15,1,15,1,15,1,15,3,15,296,8,15,1,15,1,15,5,15,300,8, + 15,10,15,12,15,303,9,15,1,15,1,15,1,16,1,16,1,16,1,16,1,16,1,16, + 1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,16, + 1,16,1,16,1,16,1,16,1,16,3,16,331,8,16,1,17,1,17,1,17,1,17,3,17, + 337,8,17,1,18,5,18,340,8,18,10,18,12,18,343,9,18,1,18,1,18,1,18, + 1,18,1,18,1,18,1,18,1,18,5,18,353,8,18,10,18,12,18,356,9,18,1,18, + 1,18,1,19,1,19,1,19,3,19,363,8,19,1,20,1,20,1,20,1,20,1,20,1,20, + 1,20,1,20,1,20,1,20,1,20,3,20,376,8,20,1,20,1,20,1,20,3,20,381,8, + 20,1,20,1,20,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,3,21,394, + 8,21,1,21,1,21,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,3,22, + 407,8,22,1,22,1,22,1,23,1,23,1,23,1,24,1,24,1,25,1,25,1,25,1,25, + 1,25,1,25,3,25,422,8,25,1,25,3,25,425,8,25,1,26,1,26,1,26,5,26,430, + 8,26,10,26,12,26,433,9,26,1,27,1,27,1,27,5,27,438,8,27,10,27,12, + 27,441,9,27,1,27,1,27,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1, + 28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1, + 28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1, + 28,3,28,480,8,28,1,28,1,28,3,28,484,8,28,1,29,1,29,1,29,1,29,5,29, + 490,8,29,10,29,12,29,493,9,29,1,29,1,29,1,30,1,30,1,31,1,31,1,31, + 1,32,1,32,3,32,504,8,32,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,33, + 1,33,1,33,1,33,1,33,3,33,518,8,33,1,33,1,33,1,34,1,34,1,34,1,34, + 1,34,1,34,3,34,528,8,34,1,35,1,35,1,35,1,35,1,35,1,35,1,35,1,35, + 1,35,1,36,1,36,1,36,1,36,1,36,1,36,1,36,3,36,546,8,36,1,36,1,36, + 1,37,1,37,1,37,1,37,1,37,1,37,5,37,556,8,37,10,37,12,37,559,9,37, + 1,37,1,37,1,38,1,38,1,38,1,38,3,38,567,8,38,1,39,1,39,1,39,1,39, + 1,39,1,39,1,39,1,39,1,39,1,39,1,39,1,39,1,39,1,39,1,40,1,40,1,40, + 1,40,1,40,1,40,1,41,1,41,1,41,1,41,1,42,1,42,1,42,1,42,1,42,1,42, + 1,42,1,42,1,42,1,42,1,42,3,42,604,8,42,1,43,1,43,1,43,1,43,1,43, + 1,43,1,43,1,43,1,43,1,43,1,43,1,43,1,43,1,43,1,43,1,43,1,43,3,43, + 623,8,43,3,43,625,8,43,1,44,1,44,1,45,1,45,1,46,1,46,1,46,5,46,634, + 8,46,10,46,12,46,637,9,46,1,46,1,46,1,47,1,47,1,47,1,47,1,47,1,47, + 1,47,1,47,1,47,1,47,3,47,651,8,47,1,47,1,47,1,47,1,47,1,47,1,47, + 1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,3,47,667,8,47,1,47,1,47, + 1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,3,47,681,8,47, + 1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,3,47,691,8,47,1,48,1,48, + 1,48,1,48,1,48,1,48,1,48,3,48,700,8,48,1,48,1,48,1,49,1,49,1,49, + 1,49,1,49,1,49,1,49,1,49,1,49,1,49,1,49,1,49,1,49,1,49,1,49,1,49, + 1,49,1,49,1,49,1,49,1,49,1,49,1,49,1,49,1,49,3,49,729,8,49,1,50, + 1,50,1,51,1,51,1,52,1,52,1,52,1,52,1,52,1,52,1,52,1,52,3,52,743, + 8,52,1,53,1,53,1,53,1,53,5,53,749,8,53,10,53,12,53,752,9,53,3,53, + 754,8,53,1,53,1,53,1,54,1,54,1,54,1,54,1,55,1,55,1,55,1,55,5,55, + 766,8,55,10,55,12,55,769,9,55,3,55,771,8,55,1,55,1,55,1,56,1,56, + 1,57,1,57,1,57,0,0,58,0,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,0,7,1,0,55,59,2,0,50,54,56,57,2,0,50,51,56,57,2,0,52,54,56,57, + 1,0,74,81,1,0,62,65,2,0,34,34,100,100,811,0,128,1,0,0,0,2,130,1, + 0,0,0,4,140,1,0,0,0,6,144,1,0,0,0,8,167,1,0,0,0,10,179,1,0,0,0,12, + 181,1,0,0,0,14,188,1,0,0,0,16,198,1,0,0,0,18,200,1,0,0,0,20,213, + 1,0,0,0,22,234,1,0,0,0,24,236,1,0,0,0,26,251,1,0,0,0,28,285,1,0, + 0,0,30,287,1,0,0,0,32,330,1,0,0,0,34,336,1,0,0,0,36,341,1,0,0,0, + 38,362,1,0,0,0,40,364,1,0,0,0,42,384,1,0,0,0,44,397,1,0,0,0,46,410, + 1,0,0,0,48,413,1,0,0,0,50,424,1,0,0,0,52,426,1,0,0,0,54,434,1,0, + 0,0,56,483,1,0,0,0,58,485,1,0,0,0,60,496,1,0,0,0,62,498,1,0,0,0, + 64,503,1,0,0,0,66,505,1,0,0,0,68,527,1,0,0,0,70,529,1,0,0,0,72,538, + 1,0,0,0,74,549,1,0,0,0,76,566,1,0,0,0,78,568,1,0,0,0,80,582,1,0, + 0,0,82,588,1,0,0,0,84,603,1,0,0,0,86,624,1,0,0,0,88,626,1,0,0,0, + 90,628,1,0,0,0,92,630,1,0,0,0,94,690,1,0,0,0,96,692,1,0,0,0,98,728, + 1,0,0,0,100,730,1,0,0,0,102,732,1,0,0,0,104,742,1,0,0,0,106,744, + 1,0,0,0,108,757,1,0,0,0,110,761,1,0,0,0,112,774,1,0,0,0,114,776, + 1,0,0,0,116,117,3,6,3,0,117,118,5,0,0,1,118,129,1,0,0,0,119,120, + 3,20,10,0,120,121,5,0,0,1,121,129,1,0,0,0,122,123,3,36,18,0,123, + 124,5,0,0,1,124,129,1,0,0,0,125,126,3,2,1,0,126,127,5,0,0,1,127, + 129,1,0,0,0,128,116,1,0,0,0,128,119,1,0,0,0,128,122,1,0,0,0,128, + 125,1,0,0,0,129,1,1,0,0,0,130,131,5,2,0,0,131,135,5,90,0,0,132,134, + 3,8,4,0,133,132,1,0,0,0,134,137,1,0,0,0,135,133,1,0,0,0,135,136, + 1,0,0,0,136,138,1,0,0,0,137,135,1,0,0,0,138,139,5,91,0,0,139,3,1, + 0,0,0,140,141,5,3,0,0,141,142,3,114,57,0,142,143,5,87,0,0,143,5, + 1,0,0,0,144,145,5,1,0,0,145,146,3,112,56,0,146,147,5,38,0,0,147, + 148,3,114,57,0,148,149,5,37,0,0,149,150,3,114,57,0,150,151,5,36, + 0,0,151,152,3,114,57,0,152,156,5,90,0,0,153,155,3,8,4,0,154,153, + 1,0,0,0,155,158,1,0,0,0,156,154,1,0,0,0,156,157,1,0,0,0,157,159, + 1,0,0,0,158,156,1,0,0,0,159,160,5,91,0,0,160,7,1,0,0,0,161,168,3, + 4,2,0,162,168,3,18,9,0,163,168,3,10,5,0,164,168,3,62,31,0,165,168, + 3,74,37,0,166,168,3,96,48,0,167,161,1,0,0,0,167,162,1,0,0,0,167, + 163,1,0,0,0,167,164,1,0,0,0,167,165,1,0,0,0,167,166,1,0,0,0,168, + 9,1,0,0,0,169,170,5,3,0,0,170,171,5,6,0,0,171,172,3,112,56,0,172, + 173,5,87,0,0,173,180,1,0,0,0,174,175,5,3,0,0,175,176,5,8,0,0,176, + 177,3,112,56,0,177,178,5,87,0,0,178,180,1,0,0,0,179,169,1,0,0,0, + 179,174,1,0,0,0,180,11,1,0,0,0,181,182,5,4,0,0,182,183,5,5,0,0,183, + 184,3,112,56,0,184,185,5,38,0,0,185,186,3,114,57,0,186,187,5,87, + 0,0,187,13,1,0,0,0,188,189,5,4,0,0,189,190,5,6,0,0,190,191,3,112, + 56,0,191,192,5,37,0,0,192,193,3,114,57,0,193,194,5,87,0,0,194,15, + 1,0,0,0,195,199,3,10,5,0,196,199,3,12,6,0,197,199,3,14,7,0,198,195, + 1,0,0,0,198,196,1,0,0,0,198,197,1,0,0,0,199,17,1,0,0,0,200,201,5, + 5,0,0,201,202,3,112,56,0,202,203,5,38,0,0,203,206,3,114,57,0,204, + 205,5,39,0,0,205,207,3,114,57,0,206,204,1,0,0,0,206,207,1,0,0,0, + 207,208,1,0,0,0,208,209,5,87,0,0,209,19,1,0,0,0,210,212,3,16,8,0, + 211,210,1,0,0,0,212,215,1,0,0,0,213,211,1,0,0,0,213,214,1,0,0,0, + 214,216,1,0,0,0,215,213,1,0,0,0,216,217,5,6,0,0,217,218,3,112,56, + 0,218,219,5,38,0,0,219,220,3,114,57,0,220,221,5,37,0,0,221,222,3, + 114,57,0,222,226,5,90,0,0,223,225,3,22,11,0,224,223,1,0,0,0,225, + 228,1,0,0,0,226,224,1,0,0,0,226,227,1,0,0,0,227,229,1,0,0,0,228, + 226,1,0,0,0,229,230,5,91,0,0,230,21,1,0,0,0,231,235,3,26,13,0,232, + 235,3,30,15,0,233,235,3,24,12,0,234,231,1,0,0,0,234,232,1,0,0,0, + 234,233,1,0,0,0,235,23,1,0,0,0,236,237,5,11,0,0,237,238,3,112,56, + 0,238,239,5,38,0,0,239,240,3,114,57,0,240,241,5,86,0,0,241,242,3, + 98,49,0,242,243,5,85,0,0,243,244,3,98,49,0,244,245,5,90,0,0,245, + 246,5,55,0,0,246,247,5,38,0,0,247,248,3,114,57,0,248,249,5,87,0, + 0,249,250,5,91,0,0,250,25,1,0,0,0,251,252,5,9,0,0,252,253,3,112, + 56,0,253,254,5,38,0,0,254,255,3,114,57,0,255,256,5,86,0,0,256,257, + 3,98,49,0,257,261,5,90,0,0,258,260,3,28,14,0,259,258,1,0,0,0,260, + 263,1,0,0,0,261,259,1,0,0,0,261,262,1,0,0,0,262,264,1,0,0,0,263, + 261,1,0,0,0,264,265,5,91,0,0,265,27,1,0,0,0,266,267,5,45,0,0,267, + 268,5,38,0,0,268,269,3,114,57,0,269,270,5,87,0,0,270,286,1,0,0,0, + 271,272,5,46,0,0,272,273,5,38,0,0,273,274,3,114,57,0,274,275,5,87, + 0,0,275,286,1,0,0,0,276,277,5,47,0,0,277,278,5,48,0,0,278,279,5, + 38,0,0,279,280,3,114,57,0,280,281,5,49,0,0,281,282,5,38,0,0,282, + 283,3,114,57,0,283,284,5,87,0,0,284,286,1,0,0,0,285,266,1,0,0,0, + 285,271,1,0,0,0,285,276,1,0,0,0,286,29,1,0,0,0,287,288,5,10,0,0, + 288,289,3,112,56,0,289,290,5,38,0,0,290,291,3,114,57,0,291,292,5, + 86,0,0,292,293,3,102,51,0,293,295,3,34,17,0,294,296,5,66,0,0,295, + 294,1,0,0,0,295,296,1,0,0,0,296,297,1,0,0,0,297,301,5,90,0,0,298, + 300,3,32,16,0,299,298,1,0,0,0,300,303,1,0,0,0,301,299,1,0,0,0,301, + 302,1,0,0,0,302,304,1,0,0,0,303,301,1,0,0,0,304,305,5,91,0,0,305, + 31,1,0,0,0,306,307,5,52,0,0,307,308,5,38,0,0,308,309,3,114,57,0, + 309,310,5,87,0,0,310,331,1,0,0,0,311,312,5,53,0,0,312,313,5,38,0, + 0,313,314,3,114,57,0,314,315,5,87,0,0,315,331,1,0,0,0,316,317,5, + 54,0,0,317,318,5,38,0,0,318,319,3,114,57,0,319,320,5,87,0,0,320, + 331,1,0,0,0,321,322,5,47,0,0,322,323,5,48,0,0,323,324,5,38,0,0,324, + 325,3,114,57,0,325,326,5,49,0,0,326,327,5,38,0,0,327,328,3,114,57, + 0,328,329,5,87,0,0,329,331,1,0,0,0,330,306,1,0,0,0,330,311,1,0,0, + 0,330,316,1,0,0,0,330,321,1,0,0,0,331,33,1,0,0,0,332,333,5,5,0,0, + 333,337,3,112,56,0,334,335,5,6,0,0,335,337,3,112,56,0,336,332,1, + 0,0,0,336,334,1,0,0,0,337,35,1,0,0,0,338,340,3,16,8,0,339,338,1, + 0,0,0,340,343,1,0,0,0,341,339,1,0,0,0,341,342,1,0,0,0,342,344,1, + 0,0,0,343,341,1,0,0,0,344,345,5,8,0,0,345,346,3,112,56,0,346,347, + 5,38,0,0,347,348,3,114,57,0,348,349,5,37,0,0,349,350,3,114,57,0, + 350,354,5,90,0,0,351,353,3,38,19,0,352,351,1,0,0,0,353,356,1,0,0, + 0,354,352,1,0,0,0,354,355,1,0,0,0,355,357,1,0,0,0,356,354,1,0,0, + 0,357,358,5,91,0,0,358,37,1,0,0,0,359,363,3,40,20,0,360,363,3,42, + 21,0,361,363,3,44,22,0,362,359,1,0,0,0,362,360,1,0,0,0,362,361,1, + 0,0,0,363,39,1,0,0,0,364,365,5,11,0,0,365,366,3,112,56,0,366,367, + 5,38,0,0,367,368,3,114,57,0,368,369,5,86,0,0,369,370,3,98,49,0,370, + 371,5,85,0,0,371,372,3,98,49,0,372,373,5,40,0,0,373,375,3,48,24, + 0,374,376,3,46,23,0,375,374,1,0,0,0,375,376,1,0,0,0,376,377,1,0, + 0,0,377,378,5,42,0,0,378,380,3,50,25,0,379,381,3,54,27,0,380,379, + 1,0,0,0,380,381,1,0,0,0,381,382,1,0,0,0,382,383,5,87,0,0,383,41, + 1,0,0,0,384,385,5,12,0,0,385,386,3,112,56,0,386,387,5,38,0,0,387, + 388,3,114,57,0,388,389,5,86,0,0,389,390,3,98,49,0,390,391,5,85,0, + 0,391,393,3,98,49,0,392,394,3,54,27,0,393,392,1,0,0,0,393,394,1, + 0,0,0,394,395,1,0,0,0,395,396,5,87,0,0,396,43,1,0,0,0,397,398,5, + 13,0,0,398,399,3,112,56,0,399,400,5,38,0,0,400,401,3,114,57,0,401, + 402,5,14,0,0,402,403,3,112,56,0,403,404,5,86,0,0,404,406,3,98,49, + 0,405,407,3,54,27,0,406,405,1,0,0,0,406,407,1,0,0,0,407,408,1,0, + 0,0,408,409,5,87,0,0,409,45,1,0,0,0,410,411,5,41,0,0,411,412,3,98, + 49,0,412,47,1,0,0,0,413,414,7,0,0,0,414,49,1,0,0,0,415,425,5,44, + 0,0,416,417,5,5,0,0,417,425,3,112,56,0,418,419,5,7,0,0,419,421,5, + 92,0,0,420,422,3,52,26,0,421,420,1,0,0,0,421,422,1,0,0,0,422,423, + 1,0,0,0,423,425,5,93,0,0,424,415,1,0,0,0,424,416,1,0,0,0,424,418, + 1,0,0,0,425,51,1,0,0,0,426,431,3,112,56,0,427,428,5,88,0,0,428,430, + 3,112,56,0,429,427,1,0,0,0,430,433,1,0,0,0,431,429,1,0,0,0,431,432, + 1,0,0,0,432,53,1,0,0,0,433,431,1,0,0,0,434,435,5,43,0,0,435,439, + 5,90,0,0,436,438,3,56,28,0,437,436,1,0,0,0,438,441,1,0,0,0,439,437, + 1,0,0,0,439,440,1,0,0,0,440,442,1,0,0,0,441,439,1,0,0,0,442,443, + 5,91,0,0,443,55,1,0,0,0,444,445,5,22,0,0,445,446,3,112,56,0,446, + 447,5,38,0,0,447,448,3,114,57,0,448,449,5,86,0,0,449,450,3,98,49, + 0,450,451,3,58,29,0,451,452,5,87,0,0,452,484,1,0,0,0,453,454,5,23, + 0,0,454,455,3,112,56,0,455,456,5,38,0,0,456,457,3,114,57,0,457,458, + 5,86,0,0,458,459,3,102,51,0,459,460,3,34,17,0,460,461,3,58,29,0, + 461,462,5,87,0,0,462,484,1,0,0,0,463,464,5,6,0,0,464,465,3,112,56, + 0,465,466,5,38,0,0,466,467,3,114,57,0,467,468,5,86,0,0,468,469,3, + 112,56,0,469,470,5,87,0,0,470,484,1,0,0,0,471,472,5,13,0,0,472,473, + 3,112,56,0,473,474,5,38,0,0,474,475,3,114,57,0,475,476,5,86,0,0, + 476,479,3,112,56,0,477,478,5,15,0,0,478,480,3,98,49,0,479,477,1, + 0,0,0,479,480,1,0,0,0,480,481,1,0,0,0,481,482,5,87,0,0,482,484,1, + 0,0,0,483,444,1,0,0,0,483,453,1,0,0,0,483,463,1,0,0,0,483,471,1, + 0,0,0,484,57,1,0,0,0,485,486,5,92,0,0,486,491,3,60,30,0,487,488, + 5,88,0,0,488,490,3,60,30,0,489,487,1,0,0,0,490,493,1,0,0,0,491,489, + 1,0,0,0,491,492,1,0,0,0,492,494,1,0,0,0,493,491,1,0,0,0,494,495, + 5,93,0,0,495,59,1,0,0,0,496,497,7,1,0,0,497,61,1,0,0,0,498,499,5, + 21,0,0,499,500,3,64,32,0,500,63,1,0,0,0,501,504,3,66,33,0,502,504, + 3,70,35,0,503,501,1,0,0,0,503,502,1,0,0,0,504,65,1,0,0,0,505,506, + 5,22,0,0,506,507,3,112,56,0,507,508,5,38,0,0,508,509,3,114,57,0, + 509,510,5,31,0,0,510,511,3,112,56,0,511,512,5,86,0,0,512,513,3,98, + 49,0,513,514,5,32,0,0,514,517,3,68,34,0,515,516,5,33,0,0,516,518, + 3,104,52,0,517,515,1,0,0,0,517,518,1,0,0,0,518,519,1,0,0,0,519,520, + 5,87,0,0,520,67,1,0,0,0,521,528,5,60,0,0,522,523,5,61,0,0,523,524, + 5,94,0,0,524,525,3,98,49,0,525,526,5,95,0,0,526,528,1,0,0,0,527, + 521,1,0,0,0,527,522,1,0,0,0,528,69,1,0,0,0,529,530,5,23,0,0,530, + 531,3,112,56,0,531,532,5,38,0,0,532,533,3,114,57,0,533,534,5,90, + 0,0,534,535,3,72,36,0,535,536,3,72,36,0,536,537,5,91,0,0,537,71, + 1,0,0,0,538,539,3,34,17,0,539,540,5,24,0,0,540,541,3,112,56,0,541, + 542,5,38,0,0,542,543,3,114,57,0,543,545,3,102,51,0,544,546,5,66, + 0,0,545,544,1,0,0,0,545,546,1,0,0,0,546,547,1,0,0,0,547,548,5,87, + 0,0,548,73,1,0,0,0,549,550,5,16,0,0,550,551,3,112,56,0,551,552,5, + 17,0,0,552,553,3,112,56,0,553,557,5,90,0,0,554,556,3,76,38,0,555, + 554,1,0,0,0,556,559,1,0,0,0,557,555,1,0,0,0,557,558,1,0,0,0,558, + 560,1,0,0,0,559,557,1,0,0,0,560,561,5,91,0,0,561,75,1,0,0,0,562, + 563,5,20,0,0,563,567,3,64,32,0,564,567,3,80,40,0,565,567,3,78,39, + 0,566,562,1,0,0,0,566,564,1,0,0,0,566,565,1,0,0,0,567,77,1,0,0,0, + 568,569,5,28,0,0,569,570,3,112,56,0,570,571,5,29,0,0,571,572,5,30, + 0,0,572,573,5,26,0,0,573,574,5,13,0,0,574,575,3,112,56,0,575,576, + 5,27,0,0,576,577,5,23,0,0,577,578,3,112,56,0,578,579,5,89,0,0,579, + 580,3,112,56,0,580,581,5,87,0,0,581,79,1,0,0,0,582,583,5,18,0,0, + 583,584,3,82,41,0,584,585,5,19,0,0,585,586,3,86,43,0,586,587,5,87, + 0,0,587,81,1,0,0,0,588,589,3,112,56,0,589,590,5,89,0,0,590,591,3, + 84,42,0,591,83,1,0,0,0,592,604,3,112,56,0,593,604,5,55,0,0,594,604, + 5,45,0,0,595,604,5,46,0,0,596,604,5,52,0,0,597,604,5,53,0,0,598, + 604,5,54,0,0,599,604,5,56,0,0,600,604,5,57,0,0,601,604,5,58,0,0, + 602,604,5,59,0,0,603,592,1,0,0,0,603,593,1,0,0,0,603,594,1,0,0,0, + 603,595,1,0,0,0,603,596,1,0,0,0,603,597,1,0,0,0,603,598,1,0,0,0, + 603,599,1,0,0,0,603,600,1,0,0,0,603,601,1,0,0,0,603,602,1,0,0,0, + 604,85,1,0,0,0,605,606,5,22,0,0,606,607,3,112,56,0,607,608,5,89, + 0,0,608,609,3,88,44,0,609,625,1,0,0,0,610,611,5,23,0,0,611,612,3, + 112,56,0,612,613,5,89,0,0,613,614,3,112,56,0,614,615,5,89,0,0,615, + 616,3,90,45,0,616,625,1,0,0,0,617,618,5,8,0,0,618,619,3,112,56,0, + 619,620,5,89,0,0,620,622,3,112,56,0,621,623,3,92,46,0,622,621,1, + 0,0,0,622,623,1,0,0,0,623,625,1,0,0,0,624,605,1,0,0,0,624,610,1, + 0,0,0,624,617,1,0,0,0,625,87,1,0,0,0,626,627,7,2,0,0,627,89,1,0, + 0,0,628,629,7,3,0,0,629,91,1,0,0,0,630,631,5,25,0,0,631,635,5,90, + 0,0,632,634,3,94,47,0,633,632,1,0,0,0,634,637,1,0,0,0,635,633,1, + 0,0,0,635,636,1,0,0,0,636,638,1,0,0,0,637,635,1,0,0,0,638,639,5, + 91,0,0,639,93,1,0,0,0,640,641,3,112,56,0,641,642,5,19,0,0,642,643, + 5,22,0,0,643,650,3,112,56,0,644,645,5,27,0,0,645,646,5,23,0,0,646, + 647,3,112,56,0,647,648,5,89,0,0,648,649,3,112,56,0,649,651,1,0,0, + 0,650,644,1,0,0,0,650,651,1,0,0,0,651,652,1,0,0,0,652,653,5,87,0, + 0,653,691,1,0,0,0,654,655,3,112,56,0,655,656,5,19,0,0,656,657,5, + 23,0,0,657,658,3,112,56,0,658,659,5,89,0,0,659,666,3,112,56,0,660, + 661,5,27,0,0,661,662,5,23,0,0,662,663,3,112,56,0,663,664,5,89,0, + 0,664,665,3,112,56,0,665,667,1,0,0,0,666,660,1,0,0,0,666,667,1,0, + 0,0,667,668,1,0,0,0,668,669,5,87,0,0,669,691,1,0,0,0,670,671,3,112, + 56,0,671,672,5,19,0,0,672,673,5,6,0,0,673,680,3,112,56,0,674,675, + 5,27,0,0,675,676,5,23,0,0,676,677,3,112,56,0,677,678,5,89,0,0,678, + 679,3,112,56,0,679,681,1,0,0,0,680,674,1,0,0,0,680,681,1,0,0,0,681, + 682,1,0,0,0,682,683,5,87,0,0,683,691,1,0,0,0,684,685,3,112,56,0, + 685,686,5,19,0,0,686,687,5,13,0,0,687,688,3,112,56,0,688,689,5,87, + 0,0,689,691,1,0,0,0,690,640,1,0,0,0,690,654,1,0,0,0,690,670,1,0, + 0,0,690,684,1,0,0,0,691,95,1,0,0,0,692,693,5,13,0,0,693,694,3,112, + 56,0,694,695,5,19,0,0,695,696,3,112,56,0,696,697,5,89,0,0,697,699, + 3,112,56,0,698,700,3,92,46,0,699,698,1,0,0,0,699,700,1,0,0,0,700, + 701,1,0,0,0,701,702,5,87,0,0,702,97,1,0,0,0,703,729,3,100,50,0,704, + 729,5,67,0,0,705,729,5,68,0,0,706,707,5,69,0,0,707,729,3,114,57, + 0,708,709,5,70,0,0,709,710,5,96,0,0,710,711,3,112,56,0,711,712,5, + 97,0,0,712,729,1,0,0,0,713,714,5,71,0,0,714,715,5,96,0,0,715,716, + 3,112,56,0,716,717,5,97,0,0,717,729,1,0,0,0,718,719,5,72,0,0,719, + 720,5,96,0,0,720,721,3,98,49,0,721,722,5,97,0,0,722,729,1,0,0,0, + 723,724,5,73,0,0,724,725,5,96,0,0,725,726,3,98,49,0,726,727,5,97, + 0,0,727,729,1,0,0,0,728,703,1,0,0,0,728,704,1,0,0,0,728,705,1,0, + 0,0,728,706,1,0,0,0,728,708,1,0,0,0,728,713,1,0,0,0,728,718,1,0, + 0,0,728,723,1,0,0,0,729,99,1,0,0,0,730,731,7,4,0,0,731,101,1,0,0, + 0,732,733,7,5,0,0,733,103,1,0,0,0,734,743,3,114,57,0,735,743,5,98, + 0,0,736,743,5,99,0,0,737,743,5,82,0,0,738,743,5,83,0,0,739,743,5, + 84,0,0,740,743,3,106,53,0,741,743,3,110,55,0,742,734,1,0,0,0,742, + 735,1,0,0,0,742,736,1,0,0,0,742,737,1,0,0,0,742,738,1,0,0,0,742, + 739,1,0,0,0,742,740,1,0,0,0,742,741,1,0,0,0,743,105,1,0,0,0,744, + 753,5,90,0,0,745,750,3,108,54,0,746,747,5,88,0,0,747,749,3,108,54, + 0,748,746,1,0,0,0,749,752,1,0,0,0,750,748,1,0,0,0,750,751,1,0,0, + 0,751,754,1,0,0,0,752,750,1,0,0,0,753,745,1,0,0,0,753,754,1,0,0, + 0,754,755,1,0,0,0,755,756,5,91,0,0,756,107,1,0,0,0,757,758,3,114, + 57,0,758,759,5,86,0,0,759,760,3,104,52,0,760,109,1,0,0,0,761,770, + 5,92,0,0,762,767,3,104,52,0,763,764,5,88,0,0,764,766,3,104,52,0, + 765,763,1,0,0,0,766,769,1,0,0,0,767,765,1,0,0,0,767,768,1,0,0,0, + 768,771,1,0,0,0,769,767,1,0,0,0,770,762,1,0,0,0,770,771,1,0,0,0, + 771,772,1,0,0,0,772,773,5,93,0,0,773,111,1,0,0,0,774,775,7,6,0,0, + 775,113,1,0,0,0,776,777,5,101,0,0,777,115,1,0,0,0,51,128,135,156, + 167,179,198,206,213,226,234,261,285,295,301,330,336,341,354,362, + 375,380,393,406,421,424,431,439,479,483,491,503,517,527,545,557, + 566,603,622,624,635,650,666,680,690,699,728,742,750,753,767,770 ]; private static __ATN: antlr.ATN; @@ -3403,6 +3514,9 @@ export class DocumentContext extends antlr.ParserRuleContext { public packageResourceDecl(): PackageResourceDeclContext | null { return this.getRuleContext(0, PackageResourceDeclContext); } + public fragmentDecl(): FragmentDeclContext | null { + return this.getRuleContext(0, FragmentDeclContext); + } public override get ruleIndex(): number { return QuixosCapabilityParser.RULE_document; } @@ -3416,6 +3530,67 @@ export class DocumentContext extends antlr.ParserRuleContext { } +export class FragmentDeclContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public FRAGMENT(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.FRAGMENT, 0)!; + } + public LBRACE(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.LBRACE, 0)!; + } + public RBRACE(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.RBRACE, 0)!; + } + public workspaceItem(): WorkspaceItemContext[]; + public workspaceItem(i: number): WorkspaceItemContext | null; + public workspaceItem(i?: number): WorkspaceItemContext[] | WorkspaceItemContext | null { + if (i === undefined) { + return this.getRuleContexts(WorkspaceItemContext); + } + + return this.getRuleContext(i, WorkspaceItemContext); + } + public override get ruleIndex(): number { + return QuixosCapabilityParser.RULE_fragmentDecl; + } + public override accept(visitor: QuixosCapabilityVisitor): Result | null { + if (visitor.visitFragmentDecl) { + return visitor.visitFragmentDecl(this); + } else { + return visitor.visitChildren(this); + } + } +} + + +export class SourceImportDeclContext extends antlr.ParserRuleContext { + public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { + super(parent, invokingState); + } + public IMPORT(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.IMPORT, 0)!; + } + public stringLiteral(): StringLiteralContext { + return this.getRuleContext(0, StringLiteralContext)!; + } + public SEMI(): antlr.TerminalNode { + return this.getToken(QuixosCapabilityParser.SEMI, 0)!; + } + public override get ruleIndex(): number { + return QuixosCapabilityParser.RULE_sourceImportDecl; + } + public override accept(visitor: QuixosCapabilityVisitor): Result | null { + if (visitor.visitSourceImportDecl) { + return visitor.visitSourceImportDecl(this); + } else { + return visitor.visitChildren(this); + } + } +} + + export class WorkspaceDeclContext extends antlr.ParserRuleContext { public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { super(parent, invokingState); @@ -3476,6 +3651,9 @@ export class WorkspaceItemContext extends antlr.ParserRuleContext { public constructor(parent: antlr.ParserRuleContext | null, invokingState: number) { super(parent, invokingState); } + public sourceImportDecl(): SourceImportDeclContext | null { + return this.getRuleContext(0, SourceImportDeclContext); + } public atomDecl(): AtomDeclContext | null { return this.getRuleContext(0, AtomDeclContext); } @@ -4535,6 +4713,9 @@ export class DependencyPortContext extends antlr.ParserRuleContext { public CONSTRUCTOR(): antlr.TerminalNode | null { return this.getToken(QuixosCapabilityParser.CONSTRUCTOR, 0); } + public INPUT(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.INPUT, 0); + } public override get ruleIndex(): number { return QuixosCapabilityParser.RULE_dependencyPort; } diff --git a/src/capability-language/generated/QuixosCapabilityVisitor.ts b/src/capability-language/generated/QuixosCapabilityVisitor.ts index d21bfb9..15fa1ec 100644 --- a/src/capability-language/generated/QuixosCapabilityVisitor.ts +++ b/src/capability-language/generated/QuixosCapabilityVisitor.ts @@ -3,6 +3,8 @@ import { AbstractParseTreeVisitor } from "antlr4ng"; import { DocumentContext } from "./QuixosCapabilityParser.js"; +import { FragmentDeclContext } from "./QuixosCapabilityParser.js"; +import { SourceImportDeclContext } from "./QuixosCapabilityParser.js"; import { WorkspaceDeclContext } from "./QuixosCapabilityParser.js"; import { WorkspaceItemContext } from "./QuixosCapabilityParser.js"; import { ResourceImportDeclContext } from "./QuixosCapabilityParser.js"; @@ -74,6 +76,18 @@ export class QuixosCapabilityVisitor extends AbstractParseTreeVisitor Result; + /** + * Visit a parse tree produced by `QuixosCapabilityParser.fragmentDecl`. + * @param ctx the parse tree + * @return the visitor result + */ + visitFragmentDecl?: (ctx: FragmentDeclContext) => Result; + /** + * Visit a parse tree produced by `QuixosCapabilityParser.sourceImportDecl`. + * @param ctx the parse tree + * @return the visitor result + */ + visitSourceImportDecl?: (ctx: SourceImportDeclContext) => Result; /** * Visit a parse tree produced by `QuixosCapabilityParser.workspaceDecl`. * @param ctx the parse tree diff --git a/src/capability-language/git-resolver.ts b/src/capability-language/git-resolver.ts index 2902b57..b324d74 100644 --- a/src/capability-language/git-resolver.ts +++ b/src/capability-language/git-resolver.ts @@ -22,6 +22,7 @@ const checkoutName = (kind: string, repository: string, commit: string) => { export const createGitCapabilityResolver = async (options: { checkoutRoot: string; snapshotMap?: string; + snapshotOnly?: boolean; }): Promise => { await mkdir(options.checkoutRoot, { recursive: true }); const checkoutRoot = await realpath(options.checkoutRoot); @@ -52,6 +53,7 @@ export const createGitCapabilityResolver = async (options: { const key = sourceKey(kind, source.repository, source.commit); const snapshot = snapshots.get(key); if (snapshot) return { directory: snapshot }; + if (options.snapshotOnly) throw new Error(`No offline snapshot for ${kind} ${source.repository}@${source.commit}`); const existing = checkouts.get(key); if (existing) return await existing; const pending = (async () => { diff --git a/src/capability-language/index.ts b/src/capability-language/index.ts index 472be63..e2992ed 100644 --- a/src/capability-language/index.ts +++ b/src/capability-language/index.ts @@ -1,2 +1,5 @@ export * from "./parser.js"; export * from "./assembly.js"; +export * from "./source.js"; +export * from "./source-loader.js"; +export * from "./scaffold.js"; diff --git a/src/capability-language/parser.ts b/src/capability-language/parser.ts index d47110c..08e7b2a 100644 --- a/src/capability-language/parser.ts +++ b/src/capability-language/parser.ts @@ -724,7 +724,8 @@ const lowerDependencyPort = ( ? { id, displayName: name, - requirement: { kind: "constructor", atomId }, + requirement: { kind: "constructor", atomId, + ...(context.valueType() ? { inputType: lowerValueType(state, context.valueType()) } : {}) }, } : undefined; }; @@ -1678,22 +1679,22 @@ const lowerWorkspace = ( }; }; -const parseDocument = ( +export const parseDocument = ( source: string, fileName: string, -): { tree: DocumentContext; diagnostics: CapabilitySourceDiagnostic[] } => { +): { tree: DocumentContext; tokens: CommonTokenStream; diagnostics: CapabilitySourceDiagnostic[] } => { const diagnostics: CapabilitySourceDiagnostic[] = []; const listener = new SyntaxErrorListener(fileName, diagnostics); const lexer = new QuixosCapabilityLexer(CharStream.fromString(source)); lexer.removeErrorListeners(); lexer.addErrorListener(listener); - const parser = new QuixosCapabilityParser( - new CommonTokenStream(lexer), - ); + const tokens = new CommonTokenStream(lexer); + const parser = new QuixosCapabilityParser(tokens); parser.removeErrorListeners(); parser.addErrorListener(listener); const tree = parser.document(); - return { tree, diagnostics }; + tokens.fill(); + return { tree, tokens, diagnostics }; }; const newLoweringState = ( @@ -1945,6 +1946,11 @@ export const compileCapabilitySource = ( } const state = newLoweringState(fileName, diagnostics); + for (const item of workspaceContext.workspaceItem()) { + if (item.sourceImportDecl()) loweringIssue(state, item, "unresolved-source-import", + "Local imports require the workspace repository compiler"); + } + if (diagnostics.length) return { ok: false, diagnostics }; const lowered = lowerWorkspace(state, workspaceContext, environment); if (diagnostics.length > 0) { return { ok: false, diagnostics }; diff --git a/src/capability-language/resource-cli.ts b/src/capability-language/resource-cli.ts index 55ec4e4..7ae8179 100644 --- a/src/capability-language/resource-cli.ts +++ b/src/capability-language/resource-cli.ts @@ -2,6 +2,7 @@ import { writeFile } from "node:fs/promises"; import process from "node:process"; +import { bindingSchema } from "../bindings/index.js"; import { compileCapabilityResourceRepository, type ResolvedCapabilityResource, @@ -10,7 +11,7 @@ import { createGitCapabilityResolver } from "./git-resolver.js"; const usage = `usage: quixos-resource-compile --root DIRECTORY --kind interface|package --repository URL --commit GIT_REV --checkout-root DIRECTORY - [--snapshot-map PATH] [--graph-out PATH] + [--snapshot-map PATH] [--snapshot-only true] [--graph-out PATH] [--schema-out PATH] Resolves a standalone resource's recursive dependency-lock graph, validates its interface.qx or package.qx manifest, and emits the checked resource as JSON.`; @@ -21,6 +22,7 @@ const parseArgs = (args: string[]) => { const key = args[index]; const value = args[index + 1]; if (!key?.startsWith("--") || !value) throw new Error(usage); + if (!["--root", "--kind", "--repository", "--commit", "--checkout-root", "--snapshot-map", "--snapshot-only", "--graph-out", "--schema-out"].includes(key) || values.has(key)) throw new Error(usage); values.set(key, value); } const rootDirectory = values.get("--root"); @@ -35,6 +37,7 @@ const parseArgs = (args: string[]) => { if (!/^([0-9a-f]{40}|[0-9a-f]{64})$/.test(commit)) { throw new Error("--commit must be a full Git object ID"); } + if (values.has("--snapshot-only") && values.get("--snapshot-only") !== "true") throw new Error("--snapshot-only accepts true"); return { rootDirectory, kind, @@ -42,7 +45,9 @@ const parseArgs = (args: string[]) => { commit, checkoutRoot, snapshotMap: values.get("--snapshot-map"), + snapshotOnly: values.get("--snapshot-only") === "true", graphOut: values.get("--graph-out"), + schemaOut: values.get("--schema-out"), } as const; }; @@ -70,6 +75,7 @@ const main = async () => { const resolveResource = await createGitCapabilityResolver({ checkoutRoot: options.checkoutRoot, snapshotMap: options.snapshotMap, + snapshotOnly: options.snapshotOnly, }); const compiled = await compileCapabilityResourceRepository({ rootDirectory: options.rootDirectory, @@ -92,6 +98,7 @@ const main = async () => { resources: compiled.resources.map(graphEntry), }, null, 2)}\n`); } + if (options.schemaOut) await writeFile(options.schemaOut, `${JSON.stringify(bindingSchema(compiled), null, 2)}\n`); process.stdout.write(`${JSON.stringify(compiled.resource, null, 2)}\n`); }; diff --git a/src/capability-language/scaffold.ts b/src/capability-language/scaffold.ts new file mode 100644 index 0000000..c9b4563 --- /dev/null +++ b/src/capability-language/scaffold.ts @@ -0,0 +1,66 @@ +import { lstat, open, rename, unlink } from "node:fs/promises"; +import path from "node:path"; +import { randomUUID } from "node:crypto"; +import { addWorkspaceImport } from "./source.js"; +import { readQxSource } from "./source-loader.js"; +import { compileWorkspaceRepository, type CapabilityRepositoryResolver } from "./assembly.js"; + +export const planAtomScaffold = (workspace: string, name: string, id: string) => { + if (!/^[A-Z][A-Za-z0-9]*$/.test(name)) throw new Error("Atom name must be PascalCase"); + if (!id.trim()) throw new Error("Atom ID must not be empty"); + const fileName = `${name}.qx`; + return { + before: workspace, + workspace: addWorkspaceImport(workspace, fileName), + fileName, + fragment: `fragment {\n atom ${name} id ${JSON.stringify(id)};\n}\n`, + }; +}; + +/** Validate an in-memory proposal before creating files. Never replace a fragment. */ +export const scaffoldAtom = async (options: { + root: string; name: string; id: string; write: boolean; resolveResource: CapabilityRepositoryResolver; +}) => { + const before = await readQxSource(options.root, "workspace.qx"); + const plan = planAtomScaffold(before, options.name, options.id); + const fragmentPath = path.join(options.root, plan.fileName); + try { + await lstat(fragmentPath); + throw new Error(`Scaffold target already exists: ${plan.fileName}`); + } catch (error) { + if ((error as NodeJS.ErrnoException).code !== "ENOENT") throw error; + } + const observed = new Map(); + await compileWorkspaceRepository({ rootDirectory: options.root, resolveResource: options.resolveResource, + readSource: async (name) => { + if (name === "workspace.qx") return plan.workspace; + if (name === plan.fileName) return plan.fragment; + const text = await readQxSource(options.root, name); + observed.set(name, text); + return text; + } }); + if (!options.write) return plan; + const workspacePath = path.join(options.root, "workspace.qx"); + const temporary = path.join(options.root, `.qx-scaffold-${randomUUID()}.tmp`); + let createdFragment = false; + let createdTemporary = false; + try { + const fragment = await open(fragmentPath, "wx"); + createdFragment = true; + try { await fragment.writeFile(plan.fragment); } finally { await fragment.close(); } + const file = await open(temporary, "wx", (await lstat(workspacePath)).mode); + createdTemporary = true; + try { await file.writeFile(plan.workspace); } finally { await file.close(); } + observed.set("workspace.qx", before); + for (const [name, text] of observed) { + if (await readQxSource(options.root, name) !== text) throw new Error(`QX source changed during scaffolding: ${name}`); + } + await rename(temporary, workspacePath); + createdTemporary = false; + createdFragment = false; + } finally { + if (createdTemporary) await unlink(temporary); + if (createdFragment) await unlink(fragmentPath); + } + return plan; +}; diff --git a/src/capability-language/source-loader.ts b/src/capability-language/source-loader.ts new file mode 100644 index 0000000..f8e981c --- /dev/null +++ b/src/capability-language/source-loader.ts @@ -0,0 +1,77 @@ +import { lstat, readFile } from "node:fs/promises"; +import path from "node:path"; +import { parseQx, validateQxImportPath, walkSyntax } from "./source.js"; + +export const readQxSource = async (root: string, name: string) => { + validateQxImportPath(name); + let current = path.resolve(root); + const segments = name.split("/"); + for (const [index, segment] of segments.entries()) { + current = path.join(current, segment); + const stat = await lstat(current); + if (stat.isSymbolicLink() || (index === segments.length - 1 ? !stat.isFile() : !stat.isDirectory())) + throw new Error(`QX imports must be ordinary files beneath ordinary directories: ${name}`); + } + return readFile(current, "utf8"); +}; + +/** Local imports share one workspace scope; paths are always repository-relative. */ +export const resolveQxSources = async ( + read: (name: string) => Promise, entry = "workspace.qx", +) => { + const files = new Map(); + const active: string[] = []; + const visited = new Set(); + const segments: { start: number; end: number; fileName: string; sourceStart: number }[] = []; + let source = ""; + const append = (fileName: string, text: string, sourceStart: number) => { + segments.push({ start: source.length, end: source.length + text.length, fileName, sourceStart }); + source += text; + }; + const visit = async (name: string, root: boolean) => { + validateQxImportPath(name); + if (active.includes(name)) throw new Error(`QX import cycle: ${[...active, name].join(" -> ")}`); + if (visited.has(name)) return; + const text = await read(name); + const syntax = parseQx(text, name); + if (syntax.diagnostics.length) throw new Error(syntax.diagnostics.map((d) => + `${name}:${d.line}:${d.column + 1}: ${d.message}`).join("\n")); + const declaration = syntax.root.children[0]!; + if (declaration.kind !== (root ? "workspaceDecl" : "fragmentDecl")) + throw new Error(`${name}: expected ${root ? "workspace" : "fragment"} document`); + files.set(name, text); + active.push(name); + visited.add(name); + const braces = syntax.tokens.filter((token) => !token.trivia); + let cursor = root ? 0 : braces.find((token) => token.kind === "LBRACE")!.end; + const end = root ? text.length : braces.filter((token) => token.kind === "RBRACE").at(-1)!.start; + for (const node of walkSyntax(declaration)) { + if (node.kind !== "sourceImportDecl") continue; + append(name, text.slice(cursor, node.start), cursor); + const literal = node.children.find((child) => child.kind === "stringLiteral")!; + // Separators prevent adjacent tokens/comments joining across files. + append(name, "\n", node.start); + await visit(JSON.parse(text.slice(literal.start, literal.end)), false); + append(name, "\n", node.end); + cursor = node.end; + } + append(name, text.slice(cursor, end), cursor); + active.pop(); + }; + await visit(entry, true); + return { + source, sourceFiles: [...files.keys()], files, + originalPosition(line: number, column: number) { + const lines = source.split("\n"); + const offset = lines.slice(0, line - 1).reduce((sum, value) => sum + value.length + 1, 0) + + [...(lines[line - 1] ?? "")].slice(0, column).join("").length; + const segment = segments.find((entry) => entry.start <= offset && entry.end > offset); + if (!segment) return { fileName: entry, line, column }; + const prefix = files.get(segment.fileName)!.slice(0, segment.sourceStart + offset - segment.start); + return { fileName: segment.fileName, line: prefix.split("\n").length, + column: prefix.length - prefix.lastIndexOf("\n") - 1 }; + }, + }; +}; + +export const loadQxSources = (root: string) => resolveQxSources((name) => readQxSource(root, name)); diff --git a/src/capability-language/source.ts b/src/capability-language/source.ts new file mode 100644 index 0000000..3f6a2a7 --- /dev/null +++ b/src/capability-language/source.ts @@ -0,0 +1,128 @@ +import { ParserRuleContext } from "antlr4ng"; +import { parseDocument } from "./parser.js"; +import { QuixosCapabilityParser } from "./generated/QuixosCapabilityParser.js"; + +/** Offsets and columns use UTF-16, as do JavaScript and LSP. End is exclusive. */ +export type SourceRange = { start: number; end: number }; +export type SourceEdit = SourceRange & { text: string }; +export type SyntaxNode = SourceRange & { kind: string; children: SyntaxNode[] }; + +export const parseQx = (source: string, fileName = "") => { + const parsed = parseDocument(source, fileName); + // ANTLR indexes Unicode code points; editors index UTF-16 code units. + const offsets = [0]; + for (const character of source) offsets.push(offsets[offsets.length - 1]! + character.length); + const offset = (index: number) => offsets[Math.max(0, index)] ?? source.length; + const node = (context: ParserRuleContext): SyntaxNode => ({ + kind: QuixosCapabilityParser.ruleNames[context.ruleIndex]!, + start: offset(context.start?.start ?? 0), + end: offset((context.stop?.stop ?? -1) + 1), + children: context.children.flatMap((child) => child instanceof ParserRuleContext ? [node(child)] : []), + }); + return { + source, fileName, + root: node(parsed.tree), + diagnostics: parsed.diagnostics.map((diagnostic) => { + const line = source.split("\n")[diagnostic.line - 1] ?? ""; + return { ...diagnostic, column: [...line].slice(0, diagnostic.column).join("").length }; + }), + tokens: parsed.tokens.getTokens().filter((token) => token.type !== -1).map((token) => ({ + kind: QuixosCapabilityParser.symbolicNames[token.type] ?? "token", + start: offset(token.start), end: offset(token.stop + 1), + text: token.text ?? "", trivia: token.channel !== 0, + })), + }; +}; + +/** Edits refer to one immutable source snapshot; overlapping edits are errors. */ +export const applySourceEdits = (source: string, edits: readonly SourceEdit[]) => { + const sorted = [...edits].sort((a, b) => a.start - b.start || a.end - b.end); + let end = 0; + let previousStart = -1; + let result = ""; + for (const edit of sorted) { + if (!Number.isInteger(edit.start) || !Number.isInteger(edit.end) || + edit.start < end || edit.start === previousStart || edit.end < edit.start || edit.end > source.length) { + throw new Error("Invalid or overlapping source edits"); + } + result += source.slice(end, edit.start) + edit.text; + end = edit.end; + previousStart = edit.start; + } + return result + source.slice(end); +}; + +export const walkSyntax = function* (node: SyntaxNode): Generator { + yield node; + for (const child of node.children) yield* walkSyntax(child); +}; + +export const lintQx = (source: string, fileName = "") => { + const syntax = parseQx(source, fileName); + const diagnostics = syntax.diagnostics.map((entry) => ({ ...entry, severity: "error" as "error" | "warning" })); + if (diagnostics.length) return diagnostics; + const seen = new Set(); + for (const node of walkSyntax(syntax.root)) { + if (node.kind !== "sourceImportDecl") continue; + const literal = node.children.find((child) => child.kind === "stringLiteral")!; + const importPath: string = JSON.parse(source.slice(literal.start, literal.end)); + let message: string | undefined; + let code = "invalid-source-import"; + try { validateQxImportPath(importPath); } catch (error) { message = (error as Error).message; } + if (!message && seen.has(importPath)) { code = "duplicate-source-import"; message = `Repeated local import ${importPath}`; } + seen.add(importPath); + if (message) { + const prefix = source.slice(0, node.start); + diagnostics.push({ phase: "syntax", code, message, fileName, + line: prefix.split("\n").length, column: prefix.length - prefix.lastIndexOf("\n") - 1, + severity: code === "duplicate-source-import" ? "warning" : "error" }); + } + } + return diagnostics; +}; + +/** Conservative formatter: indentation only, preserving strings and comments verbatim. */ +export const formatQx = (source: string) => { + const syntax = parseQx(source); + if (syntax.diagnostics.length) throw new Error("Cannot format QX with syntax errors"); + const edits: SourceEdit[] = []; + let depth = 0; + let lineStart = 0; + for (const token of syntax.tokens) { + if (token.kind === "WS") continue; + lineStart = source.lastIndexOf("\n", token.start - 1) + 1; + if (/^[ \t]*$/.test(source.slice(lineStart, token.start))) { + const indentation = " ".repeat(Math.max(0, depth - (token.kind === "RBRACE" ? 1 : 0))); + if (source.slice(lineStart, token.start) !== indentation) + edits.push({ start: lineStart, end: token.start, text: indentation }); + } + if (!token.trivia) { + if (token.kind === "LBRACE") depth++; + if (token.kind === "RBRACE") depth--; + } + } + return applySourceEdits(source, edits); +}; + +export const addWorkspaceImport = (source: string, importPath: string) => { + validateQxImportPath(importPath); + const syntax = parseQx(source); + if (syntax.diagnostics.length || syntax.root.children[0]?.kind !== "workspaceDecl") + throw new Error("Expected a syntactically valid workspace"); + for (const node of walkSyntax(syntax.root)) { + if (node.kind === "sourceImportDecl") { + const literal = node.children.find((child) => child.kind === "stringLiteral")!; + if (JSON.parse(source.slice(literal.start, literal.end)) === importPath) return source; + } + } + const brace = syntax.tokens.find((token) => token.kind === "LBRACE")!; + const newline = source.includes("\r\n") ? "\r\n" : "\n"; + return applySourceEdits(source, [{ start: brace.end, end: brace.end, + text: `${newline} import ${JSON.stringify(importPath)};` }]); +}; + +export const validateQxImportPath = (value: string) => { + if (!/^(?:[A-Za-z0-9_-][A-Za-z0-9_.-]*\/)*[A-Za-z0-9_-][A-Za-z0-9_.-]*\.qx$/.test(value) || + value.split("/").some((part) => part === "." || part === "..")) + throw new Error(`Invalid repository-relative QX import path: ${value}`); +}; diff --git a/src/capability-language/tool-cli.ts b/src/capability-language/tool-cli.ts new file mode 100644 index 0000000..45c64a4 --- /dev/null +++ b/src/capability-language/tool-cli.ts @@ -0,0 +1,30 @@ +#!/usr/bin/env node +import { readFile, writeFile } from "node:fs/promises"; +import { parseQx, formatQx, lintQx } from "./source.js"; +import { scaffoldAtom } from "./scaffold.js"; +import { createGitCapabilityResolver } from "./git-resolver.js"; + +const main = async () => { + const [command, ...args] = process.argv.slice(2); + if (command === "scaffold-atom") { + const [root, name, id, ...flags] = args; + if (!root || !name || !id || flags.some((flag) => flag !== "--write")) throw new Error("usage: quixos-qx scaffold-atom ROOT NAME ID [--write]"); + const resolveResource = await createGitCapabilityResolver({ checkoutRoot: `${root}/.quixos/resource-checkouts` }); + const plan = await scaffoldAtom({ root, name, id, write: flags.includes("--write"), resolveResource }); + process.stdout.write(`${JSON.stringify(plan, null, 2)}\n`); + return; + } + const [file, flag, ...rest] = args; + if (!file || rest.length || (flag && flag !== "--write") || !["parse", "lint", "format"].includes(command ?? "") || + (flag && command !== "format")) throw new Error("usage: quixos-qx parse|lint|format FILE [--write (format only)]"); + const source = await readFile(file, "utf8"); + if (command === "format") { + const formatted = formatQx(source); + if (flag) await writeFile(file, formatted); else process.stdout.write(formatted); + } else { + const result = command === "parse" ? parseQx(source, file) : lintQx(source, file); + process.stdout.write(`${JSON.stringify(result, null, 2)}\n`); + if (Array.isArray(result) ? result.some((entry) => entry.severity === "error") : result.diagnostics.length) process.exitCode = 1; + } +}; +main().catch((error: unknown) => { console.error(error instanceof Error ? error.message : error); process.exitCode = 1; }); diff --git a/src/capability-model/types.ts b/src/capability-model/types.ts index 2cc0918..203b4c5 100644 --- a/src/capability-model/types.ts +++ b/src/capability-model/types.ts @@ -245,7 +245,7 @@ export type DependencyPortRequirement = kind: "interface"; interfaceRevisionId: InterfaceRevisionId; } - | { kind: "constructor"; atomId: AtomId }; + | { kind: "constructor"; atomId: AtomId; inputType?: ValueType }; export interface DependencyPort { id: DependencyPortId; diff --git a/src/capability-model/validation.ts b/src/capability-model/validation.ts index 0d87978..4d88f21 100644 --- a/src/capability-model/validation.ts +++ b/src/capability-model/validation.ts @@ -928,6 +928,7 @@ const validatePackages = ( } break; case "constructor": + if (port.requirement.inputType) validateValueType(issues, port.requirement.inputType, `${portPath}.requirement.inputType`, indexes); if (!indexes.atoms.has(port.requirement.atomId)) { issue( issues, @@ -1260,6 +1261,14 @@ const validateBoundDependencies = ( `Atom ${requirement.atomId} has no constructor binding`, ); } + if (requirement.inputType) { + const selected = params.indexes.constructors.get(requirement.atomId); + const implementation = selected ? params.indexes.packages.get(selected.packageRevisionId)?.exports.get(selected.exportId) : undefined; + if (implementation && !valueTypesEqual(requirement.inputType, implementation.inputType)) { + issue(issues, "invalid-dependency-binding", `${path}.binding.atomId`, + `Constructor port requires input ${typeLabel(requirement.inputType)}, but selected constructor accepts ${typeLabel(implementation.inputType)}`); + } + } break; } } diff --git a/test/bindings.test.ts b/test/bindings.test.ts new file mode 100644 index 0000000..60b7339 --- /dev/null +++ b/test/bindings.test.ts @@ -0,0 +1,30 @@ +import assert from "node:assert/strict"; +import test from "node:test"; +import { compileCapabilityResourceSource } from "../src/capability-language/parser.js"; +import { generateTypeScriptBindings, type BindingSchema } from "../src/bindings/index.js"; +const source = { repository: "https://example.test/p.git", commit: "1".repeat(40) }; +const schemaFor = (body: string): BindingSchema => { + const compiled = compileCapabilityResourceSource(`external atom Thing id "thing"; package Demo id "demo" revision "demo@1" { ${body} }`, { source }); + assert.equal(compiled.ok, true, JSON.stringify(compiled.diagnostics)); + if (!compiled.ok || compiled.resource.kind !== "package") throw new Error("expected package"); + return { format: "quixos-bindings", version: 1, interfaces: [], packages: [compiled.resource.revision] }; +}; +test("generator uses exact IDs, restricted ports, nominal references, and lossless scalar types", () => { + const schema = schemaFor('operation run id "run-id" : list -> optional> mode call receiver atom Thing requires { state payload id "payload-id" : bytes [read]; };'); + const generated = generateTypeScriptBindings(schema, "demo@1"); + assert.match(generated, /Array/); + assert.match(generated, /Promise/); + assert.match(generated, /QxObjectRef<"atom:thing">/); + assert.doesNotMatch(generated, /"set":/); + assert.match(generated, /"run-id": bindQxHandler/); + assert.equal(generateTypeScriptBindings(schema, "demo@1"), generated); +}); +test("missing external types and constructor signatures fail generation", () => { + const schema = schemaFor('function run id "run" : unit -> message "example.Payload";'); + assert.throws(() => generateTypeScriptBindings(schema, "demo@1"), /Missing TypeScript message binding/); + assert.match(generateTypeScriptBindings(schema, "demo@1", { messages: { "example.Payload": { module: "./payload.js", export: "payload" } } }), /BindingValue/); + const constructor = schemaFor('function run id "run" : unit -> unit requires { constructor thing id "ctor" : Thing; };'); + assert.throws(() => generateTypeScriptBindings(constructor, "demo@1"), /explicit input contract/); + const typed = schemaFor('function run id "run" : unit -> unit requires { constructor thing id "ctor" : Thing input string; };'); + assert.match(generateTypeScriptBindings(typed, "demo@1"), /construct.*input: string/); +}); diff --git a/test/capability-model.test.ts b/test/capability-model.test.ts index cf6d17e..52e58eb 100644 --- a/test/capability-model.test.ts +++ b/test/capability-model.test.ts @@ -28,6 +28,18 @@ const expectIssue = ( assert.equal(compileWorkspaceRevision(workspace).ok, false); }; +test("constructor dependency input contracts match the selected constructor", () => { + const workspace = makeValidCapabilityWorkspace(); + const port = workspace.packageImports.flatMap((pkg) => pkg.exports).flatMap((entry) => entry.dependencyPorts) + .find((port) => port.requirement.kind === "constructor")!; + assert.equal(port.requirement.kind, "constructor"); + if (port.requirement.kind !== "constructor") return; + port.requirement.inputType = valueType.unit; + assert.deepEqual(validateWorkspaceRevision(workspace), []); + port.requirement.inputType = valueType.string; + expectIssue(workspace, "invalid-dependency-binding"); +}); + const conformance = ( workspace: WorkspaceRevision, identity: Pick<(typeof workspace.conformances)[number], "atomId" | "interfaceRevisionId">, diff --git a/test/fixtures/typed-package/package.qx b/test/fixtures/typed-package/package.qx new file mode 100644 index 0000000..810f2ec --- /dev/null +++ b/test/fixtures/typed-package/package.qx @@ -0,0 +1,8 @@ +external atom Thing id "atom:example:thing"; + +package TypedExample id "package:typed-example" revision "package:typed-example@1" { + constructor createThing id "export:typed-example:create" constructs Thing : unit; + operation payloadGet id "export:typed-example:payload" : unit -> bytes mode call receiver atom Thing requires { + state payload id "port:typed-example:payload" : bytes [read]; + }; +} diff --git a/test/fixtures/typed-package/quixos.lock b/test/fixtures/typed-package/quixos.lock new file mode 100644 index 0000000..1e71956 --- /dev/null +++ b/test/fixtures/typed-package/quixos.lock @@ -0,0 +1,6 @@ +quixos-lock version 1 { + quixos source { + repository "https://example.test/quixos.git"; + commit "1111111111111111111111111111111111111111"; + } +} diff --git a/test/qx-source.test.ts b/test/qx-source.test.ts new file mode 100644 index 0000000..1a974ef --- /dev/null +++ b/test/qx-source.test.ts @@ -0,0 +1,84 @@ +import assert from "node:assert/strict"; +import test from "node:test"; +import { mkdtemp, writeFile, readFile, rm, symlink } from "node:fs/promises"; +import os from "node:os"; +import path from "node:path"; +import { parseQx, formatQx, lintQx, applySourceEdits, addWorkspaceImport, walkSyntax, + resolveQxSources, readQxSource, compileCapabilitySource, scaffoldAtom, compileWorkspaceRepository } from "../src/capability-language/index.js"; + +const workspace = `workspace Test id "w" revision "w@1" commit "${"1".repeat(40)}" {\n// keep 🐈 comment\n}\n`; +test("lint reports invalid and redundant imports without resolving repositories", () => { + const source = workspace.replace("}\n", 'import "a.qx"; import "a.qx"; import "../bad.qx";\n}\n'); + assert.deepEqual(lintQx(source).map((entry) => [entry.code, entry.severity]), [ + ["duplicate-source-import", "warning"], ["invalid-source-import", "error"], + ]); +}); +test("lossless tokens, UTF-16 ranges, and safe source edits", () => { + const text = workspace.replace("}\n", 'atom Cat id "🐈";\n}\n'); + const parsed = parseQx(text); + assert.deepEqual(parsed.diagnostics, []); + assert.equal(parsed.tokens.map((token) => token.text).join(""), text); + const atom = [...walkSyntax(parsed.root)].find((node) => node.kind === "atomDecl")!; + assert.equal(text.slice(atom.start, atom.end), 'atom Cat id "🐈";'); + assert.equal(applySourceEdits(text, [{ ...atom, text: 'atom Dog id "dog";' }]), text.replace('atom Cat id "🐈";', 'atom Dog id "dog";')); + assert.throws(() => applySourceEdits(text, [{ start: 0, end: 4, text: "" }, { start: 3, end: 7, text: "" }]), /overlapping/); + assert.throws(() => applySourceEdits(text, [{ start: -1, end: 0, text: "" }]), /Invalid/); +}); +test("formatting preserves comments and strings, is idempotent, and rejects invalid source", () => { + const text = workspace.replace("}\n", 'atom Cat id "{ cat }"; /* multiline\n unchanged */\n}\n'); + const formatted = formatQx(text); + assert.match(formatted, / atom Cat id "\{ cat \}"; \/\* multiline\n unchanged \*\//); + assert.equal(formatQx(formatted), formatted); + assert.deepEqual(parseQx(formatted).diagnostics, []); + assert.throws(() => formatQx("workspace {"), /syntax errors/); +}); +test("imports preserve root text, deduplicate diamonds, reject cycles, and compile together", async () => { + const root = addWorkspaceImport(addWorkspaceImport(workspace, "a.qx"), "b.qx"); + assert.equal(addWorkspaceImport(root, "a.qx"), root); + assert.match(root, /keep 🐈 comment/); + const files: Record = { "workspace.qx": root, + "a.qx": 'fragment { import "shared.qx"; atom A id "a"; }', + "b.qx": 'fragment { import "shared.qx"; atom B id "b"; }', + "shared.qx": 'fragment { atom Shared id "shared"; }' }; + const result = await resolveQxSources(async (name) => files[name]!); + assert.equal(result.sourceFiles.length, 4); + const compiled = compileCapabilitySource(result.source); + assert.equal(compiled.ok, true, JSON.stringify(compiled.diagnostics)); + if (compiled.ok) assert.equal(compiled.workspace.atoms.length, 3); + const unresolved = compileCapabilitySource(root); + assert.equal(unresolved.ok, false); + assert.match(JSON.stringify(unresolved.diagnostics), /unresolved-source-import/); + files["shared.qx"] = 'fragment { import "a.qx"; }'; + await assert.rejects(resolveQxSources(async (name) => files[name]!), /cycle/); + assert.throws(() => addWorkspaceImport(workspace, "../x.qx"), /Invalid/); +}); +test("repository scaffolding validates before writing and refuses duplicates and symlinks", async (t) => { + const root = await mkdtemp(path.join(os.tmpdir(), "qx-scaffold-")); + t.after(() => rm(root, { recursive: true, force: true })); + await writeFile(path.join(root, "workspace.qx"), workspace); + await writeFile(path.join(root, "quixos.lock"), `quixos-lock version 1 { quixos source { repository "https://example.test/q.git"; commit "${"1".repeat(40)}"; } }`); + const resolveResource = async (): Promise => { throw new Error("unexpected resource"); }; + const options = { root, name: "Cat", id: "cat", write: false, resolveResource }; + await scaffoldAtom(options); + assert.equal(await readFile(path.join(root, "workspace.qx"), "utf8"), workspace); + await assert.rejects(readFile(path.join(root, "Cat.qx")), /ENOENT/); + await scaffoldAtom({ ...options, write: true }); + const compiled = await compileWorkspaceRepository({ rootDirectory: root, resolveResource }); + assert.equal(compiled.workspace.atoms[0]!.id, "cat"); + await assert.rejects(scaffoldAtom({ ...options, write: true }), /already exists/); + await assert.rejects(scaffoldAtom({ ...options, name: "Other", write: true }), /Duplicate|duplicate/); + await assert.rejects(readFile(path.join(root, "Other.qx")), /ENOENT/); + await symlink(path.join(root, "Cat.qx"), path.join(root, "link.qx")); + await assert.rejects(readQxSource(root, "link.qx"), /ordinary files/); +}); +test("lowering diagnostics map to the imported file", async () => { + const files: Record = { "workspace.qx": addWorkspaceImport(workspace, "bad.qx"), + "bad.qx": 'fragment {\n conform Missing as Nope {}\n}' }; + const sources = await resolveQxSources(async (name) => files[name]!); + const compiled = compileCapabilitySource(sources.source); + assert.equal(compiled.ok, false); + const diagnostic = compiled.diagnostics[0]!; + const position = sources.originalPosition(diagnostic.line, diagnostic.column); + assert.equal(position.fileName, "bad.qx"); + assert.equal(position.line, 2); +}); diff --git a/yarn.lock b/yarn.lock index cafe60e..2c3508a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -52,8 +52,10 @@ __metadata: typescript: "npm:^7.0.2" bin: quixos-capability-compile: dist/src/capability-language/cli.js + quixos-codegen-ts: dist/src/bindings/cli.js quixos-descriptor-check: dist/src/descriptor-check.js quixos-lock-check: dist/src/resource-lock/cli.js + quixos-qx: dist/src/capability-language/tool-cli.js quixos-resource-compile: dist/src/capability-language/resource-cli.js quixos-workspace-compile: dist/src/capability-language/workspace-cli.js languageName: unknown From 1e25f391e7a75dce54591f6110667db1979b25f9 Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Thu, 10 Sep 2026 00:07:05 -0700 Subject: [PATCH 3/4] Browse immutable workspace source and jj history in Central --- flake.nix | 19 +++++++++++++++++++ src/capability-language/inspect-cli.ts | 21 +++++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 src/capability-language/inspect-cli.ts diff --git a/flake.nix b/flake.nix index d6695f8..c53d12c 100644 --- a/flake.nix +++ b/flake.nix @@ -108,6 +108,25 @@ EOF }; in { packages.default = quixos-protocol; + packages.inspector = (pkgs.callPackage ./yarn-project.nix { inherit nodejs; }) { + src = pkgs.lib.fileset.toSource { + root = ./.; + fileset = pkgs.lib.fileset.unions [ ./package.json ./yarn.lock ./.yarnrc.yml ./.yarn/plugins ./src ]; + }; + overrideAttrs = old: { + nativeBuildInputs = (old.nativeBuildInputs or []) ++ [ pkgs.esbuild ]; + doCheck = false; + buildPhase = '' + esbuild src/capability-language/inspect-cli.ts --bundle --platform=node --target=node24 --format=esm --outfile=inspect.mjs + ''; + installPhase = '' + mkdir -p "$out/bin" "$out/lib" + cp inspect.mjs "$out/lib/inspect.mjs" + printf '#!${pkgs.runtimeShell}\nexec ${nodejs}/bin/node --max-old-space-size=128 %s/lib/inspect.mjs\n' "$out" > "$out/bin/quixos-qx-inspect" + chmod +x "$out/bin/quixos-qx-inspect" + ''; + }; + }; checks.default = quixos-protocol; devShells.default = pkgs.mkShell { packages = [ diff --git a/src/capability-language/inspect-cli.ts b/src/capability-language/inspect-cli.ts new file mode 100644 index 0000000..ffe9ded --- /dev/null +++ b/src/capability-language/inspect-cli.ts @@ -0,0 +1,21 @@ +#!/usr/bin/env node +// Data only: never load files, resolve repositories, or evaluate code. +import { parseQx } from "./source.js"; +import { parseQuixosLockDocument } from "../resource-lock/parser.js"; +let input = ""; +for await (const chunk of process.stdin) { + input += chunk; + if (Buffer.byteLength(input) > 6 * 1024 * 1024) throw new Error("Inspection input exceeds limit"); +} +const files: { path: string; source: string }[] = JSON.parse(input); +if (!Array.isArray(files) || files.length > 128) throw new Error("Too many source files"); +const result = files.map(({ path, source }) => { + if (typeof path !== "string" || typeof source !== "string" || source.length > 262144) + throw new Error("Invalid source input"); + if (path.endsWith(".qx")) { + const parsed = parseQx(source, path); + return { path, root: parsed.root, diagnostics: parsed.diagnostics }; + } + return { path, lock: parseQuixosLockDocument(source, path) }; +}); +process.stdout.write(JSON.stringify(result)); From 483bc68a94bb4695639d401e91e5a2410731e9dc Mon Sep 17 00:00:00 2001 From: "Timothy J. Aveni" Date: Thu, 10 Sep 2026 18:27:41 -0700 Subject: [PATCH 4/4] Implement workspace evolution, migrations, and runtime continuity Enable evolution by default for source-backed workspaces. Add stable conformance ownership, semantic-major review, candidate typechecking, and durable fenced cutover with explicit migrations and forward recovery. Independently supervise package runtimes so unchanged resource owners keep their processes and connections across cutover. Add scoped invocation authority, resource sessions, and typed callback rebinding. Wire opaque object references through generated bindings and RPCs. Add canonical relationship sets, keyed maps, and ordered lists with scoped transactional mutations, revision checks, and inverse consistency. Support planned cascade deletion, protection, tombstones, and lifecycle foundations. Add journaled structural edits, package/function/migration scaffolding, managed repository creation, and resumable bottom-up dependency pin publication. Document lifetime boundaries, revision pinning, prototype compatibility policy, commands, and deferred work. Validate with 210 tests, user-systemd process/connection continuity, generated-package TypeScript checks, and Nix host/protocol checks. TTL handoff, physical reclamation, general multi-step migrations, and root-systemd migration isolation acceptance remain deferred. --- flake.nix | 1 + grammar/QuixosCapability.g4 | 12 +- proto/camino/api.proto | 24 + proto/camino/schema.proto | 10 + proto/quixos/runtime.proto | 28 +- src/bindings/index.ts | 11 +- src/capability-language/assembly.ts | 19 +- src/capability-language/candidate-check.ts | 179 ++ .../generated/QuixosCapability.interp | 12 +- .../generated/QuixosCapability.tokens | 264 +-- .../generated/QuixosCapabilityLexer.interp | 17 +- .../generated/QuixosCapabilityLexer.tokens | 264 +-- .../generated/QuixosCapabilityLexer.ts | 930 +++++----- .../generated/QuixosCapabilityParser.ts | 1590 +++++++++-------- src/capability-language/parser.ts | 9 +- src/capability-language/pin-upgrades.ts | 249 +++ src/capability-language/scaffold-recipes.ts | 138 ++ src/capability-language/structural-edits.ts | 135 ++ src/capability-language/structural-plan.ts | 189 ++ src/capability-language/tool-cli.ts | 98 +- src/capability-language/workspace-cli.ts | 18 +- src/capability-model/evolution.ts | 206 +++ src/capability-model/index.ts | 2 + src/capability-model/migrations.ts | 96 + src/capability-model/types.ts | 12 + src/capability-model/validation.ts | 27 +- src/gen/camino/api_pb.ts | 137 +- src/gen/camino/schema_pb.ts | 43 +- src/gen/quixos/runtime_pb.ts | 143 +- test/candidate-check.test.ts | 50 + test/capability-language.test.ts | 8 +- test/capability-model.test.ts | 13 + test/evolution.test.ts | 98 + test/migrations.test.ts | 36 + test/pin-upgrades.test.ts | 59 + test/scaffold-recipes.test.ts | 47 + test/structural-edits.test.ts | 42 + test/structural-plan.test.ts | 37 + 38 files changed, 3790 insertions(+), 1463 deletions(-) create mode 100644 src/capability-language/candidate-check.ts create mode 100644 src/capability-language/pin-upgrades.ts create mode 100644 src/capability-language/scaffold-recipes.ts create mode 100644 src/capability-language/structural-edits.ts create mode 100644 src/capability-language/structural-plan.ts create mode 100644 src/capability-model/evolution.ts create mode 100644 src/capability-model/migrations.ts create mode 100644 test/candidate-check.test.ts create mode 100644 test/evolution.test.ts create mode 100644 test/migrations.test.ts create mode 100644 test/pin-upgrades.test.ts create mode 100644 test/scaffold-recipes.test.ts create mode 100644 test/structural-edits.test.ts create mode 100644 test/structural-plan.test.ts diff --git a/flake.nix b/flake.nix index c53d12c..4a7f32f 100644 --- a/flake.nix +++ b/flake.nix @@ -18,6 +18,7 @@ pkgs.diffutils pkgs.esbuild pkgs.protobuf + pkgs.git ]; buildPhase = '' runHook preBuild diff --git a/grammar/QuixosCapability.g4 b/grammar/QuixosCapability.g4 index 1845baf..5c9d526 100644 --- a/grammar/QuixosCapability.g4 +++ b/grammar/QuixosCapability.g4 @@ -98,6 +98,7 @@ targetConstraint packageResourceDecl : resourcePreamble* PACKAGE identifier ID stringLiteral REVISION stringLiteral + (SEMANTIC_MAJOR INTEGER)? LBRACE packageExport* RBRACE ; @@ -193,11 +194,13 @@ edgeDecl ; edgeEndpoint - : targetConstraint PROJECTION identifier ID stringLiteral cardinality ORDERED? SEMI + : targetConstraint PROJECTION identifier ID stringLiteral cardinality ORDERED? + (ON_DELETE stringLiteral)? RETAIN_OTHER? (KEYED stringLiteral)? PUBLIC_TRAVERSAL? SEMI ; conformanceDecl - : CONFORM identifier AS identifier LBRACE conformanceItem* RBRACE + : CONFORM identifier AS identifier (ID stringLiteral)? (SEMANTIC_MAJOR INTEGER)? + LBRACE conformanceItem* RBRACE ; conformanceItem @@ -366,6 +369,11 @@ SOURCE: 'source'; REPOSITORY: 'repository'; COMMIT: 'commit'; REVISION: 'revision'; +SEMANTIC_MAJOR: 'semantic-major'; +ON_DELETE: 'on-delete'; +RETAIN_OTHER: 'retain-other'; +KEYED: 'keyed'; +PUBLIC_TRAVERSAL: 'public-traversal'; ID: 'id'; DOC: 'doc'; MODE: 'mode'; diff --git a/proto/camino/api.proto b/proto/camino/api.proto index 089dbaa..9f82e11 100644 --- a/proto/camino/api.proto +++ b/proto/camino/api.proto @@ -15,6 +15,8 @@ service CaminoService { rpc ConnectEdge(ConnectEdgeRequest) returns (ConnectEdgeResponse); rpc ResolveEdge(ResolveEdgeRequest) returns (ResolveEdgeResponse); rpc DisconnectEdge(DisconnectEdgeRequest) returns (DisconnectEdgeResponse); + rpc ReadCollection(ResolveEdgeRequest) returns (ReadCollectionResponse); + rpc ReplaceCollection(ReplaceCollectionRequest) returns (ReadCollectionResponse); rpc ListOps(ListOpsRequest) returns (ListOpsResponse); rpc WatchObject(WatchObjectRequest) returns (stream WatchObjectEvent); } @@ -108,12 +110,32 @@ message ResolveEdgeResponse { repeated CaminoEdge edges = 1; } message DisconnectEdgeRequest { string edge_id = 1; } message DisconnectEdgeResponse { string edge_id = 1; } +message CollectionEntry { + // Existing entry identity to preserve; empty allocates a new canonical edge. + string edge_id = 1; + string target_object_id = 2; + Value key = 3; +} +message ReadCollectionResponse { + uint64 revision = 1; + repeated CollectionEntry entries = 2; +} +message ReplaceCollectionRequest { + string object_id = 1; + string edge_type_id = 2; + string projection_id = 3; + uint64 expected_revision = 4; + repeated CollectionEntry entries = 5; +} + message ListOpsRequest { string object_id = 1; } message ListOpsResponse { repeated CaminoOp ops = 1; } message WatchObjectRequest { string object_id = 1; string after_op_id = 2; bool include_snapshot = 3; + // Managed runtimes must watch only their injected attachments. + repeated string attachment_ids = 4; } message WatchObjectEvent { string object_id = 1; @@ -141,6 +163,8 @@ message CaminoEdge { optional int32 first_ordinal = 7; optional int32 second_ordinal = 8; string created_at = 9; + string first_key_json = 10; + string second_key_json = 11; } message CaminoOp { diff --git a/proto/camino/schema.proto b/proto/camino/schema.proto index 14c3295..7d25678 100644 --- a/proto/camino/schema.proto +++ b/proto/camino/schema.proto @@ -18,6 +18,7 @@ message AtomDefinition { message AtomConformance { string atom_id = 1; string interface_revision_id = 2; + string conformance_id = 3; } message StateAttachment { @@ -27,6 +28,7 @@ message StateAttachment { string value_type_json = 4; string storage_policy_json = 5; string default_value_json = 6; + string owner_conformance_id = 7; } message EndpointConstraint { @@ -42,6 +44,13 @@ message EdgeEndpoint { EndpointConstraint constraint = 3; Cardinality cardinality = 4; bool ordered = 5; + // Empty means restrict. Direction is the endpoint being deleted. + string on_delete = 6; + bool retain_other = 7; + // Empty for sets/lists, otherwise string, boolean, or int64 map keys. + string key_type = 8; + // Explicit read-only dependency injection traversal, not mutation authority. + bool public_traversal = 9; } message EdgeAttachment { @@ -49,6 +58,7 @@ message EdgeAttachment { string display_name = 2; EdgeEndpoint first = 3; EdgeEndpoint second = 4; + string owner_conformance_id = 5; } // Camino consumes this persistence-only projection of a checked workspace. diff --git a/proto/quixos/runtime.proto b/proto/quixos/runtime.proto index 30bf17f..3672cb0 100644 --- a/proto/quixos/runtime.proto +++ b/proto/quixos/runtime.proto @@ -9,13 +9,37 @@ service PackageRuntime { rpc Handshake(HandshakeRequest) returns (HandshakeResponse); rpc Invoke(InvokeRequest) returns (InvokeResponse); rpc Watch(WatchRequest) returns (stream WatchEvent); + rpc GetInvocationStatus(InvocationControlRequest) returns (InvocationStatus); + rpc CancelInvocation(InvocationControlRequest) returns (InvocationStatus); } -message HandshakeRequest { string orch_protocol_version = 1; } +message HandshakeRequest { + string orch_protocol_version = 1; + string nonce = 2; +} message HandshakeResponse { string package_revision_id = 1; string runtime_protocol_version = 2; repeated string export_ids = 3; + string instance_id = 4; + string authentication_proof = 5; + repeated string capabilities = 6; +} + +message InvocationContext { + string workspace_epoch = 1; + string instance_id = 2; + string binding_digest = 3; + string grant = 4; + string session_id = 5; + // Host-selected owner; packages must not invent workspace-local ownership. + string owner_conformance_id = 6; +} +message InvocationControlRequest { string invocation_id = 1; } +message InvocationStatus { + string invocation_id = 1; + // unknown, running, cancellation-requested, completed, failed + string state = 2; } message InvokeRequest { @@ -24,6 +48,7 @@ message InvokeRequest { string object_id = 3; map input = 4; repeated quixos.InjectedDependency dependencies = 5; + InvocationContext context = 6; } message InvokeResponse { bool ok = 1; @@ -38,6 +63,7 @@ message WatchRequest { string object_id = 3; map input = 4; repeated quixos.InjectedDependency dependencies = 5; + InvocationContext context = 6; } message DerivedDependency { diff --git a/src/bindings/index.ts b/src/bindings/index.ts index 9617349..7c6512c 100644 --- a/src/bindings/index.ts +++ b/src/bindings/index.ts @@ -64,6 +64,8 @@ export const generateTypeScriptBindings = ( if (primitive === "connect" || primitive === "disconnect") return [primitive, `(target: ${ref(requirement.target)}) => Promise`]; throw new Error(`Edge primitive ${primitive} is not supported by the TypeScript runtime binding yet`); }); + if (requirement.primitives.includes("resolve")) methods.push(["collection", `() => Promise>`]); + if (["resolve", "connect", "disconnect"].every((primitive) => requirement.primitives.includes(primitive as "resolve"))) methods.push(["replace", `(entries: RelationshipEntry<${ref(requirement.target)}>[], expectedRevision: bigint) => Promise>`]); return { type: object(methods), spec: { kind: "edge", id: entry.id, primitives: requirement.primitives } }; } case "interface": { @@ -97,9 +99,10 @@ export const generateTypeScriptBindings = ( entry.kind === "operation" && entry.receiverRequirement.kind === "exact-atom" ? ref({ kind: "atom", atomId: entry.receiverRequirement.atomId }) : entry.kind === "operation" && entry.receiverRequirement.kind === "all-interfaces" ? - `QxObjectRef<${entry.receiverRequirement.interfaceRevisionIds.map((id) => q(`interface:${id}`)).join(" | ") || "never"}>` : "string"; - contexts.push([entry.displayName, object([["objectId", receiver], ["input", type(entry.inputType)], - ["ports", object(ports.map((port) => [port.name, port.type]))]])]); + `QxObjectRef<${entry.receiverRequirement.interfaceRevisionIds.map((id) => q(`interface:${id}`)).join(" | ") || "never"}>` : "QxObjectRef"; + const contextShape = object([["objectId", receiver], ["input", type(entry.inputType)], + ["ports", object(ports.map((port) => [port.name, port.type]))]]); + contexts.push([entry.displayName, `${contextShape} & QxContextLifecycle<${contextShape} & {signal?: AbortSignal}>`]); const event = entry.kind === "operation" ? entry.eventType : undefined; const contextType = `Contexts[${q(entry.displayName)}]`; const outputType = type(event ?? entry.outputType); @@ -115,7 +118,7 @@ export const generateTypeScriptBindings = ( return `import { ${binding.export} as ${alias} } from ${q(binding.module)};`; }); const signatures = `${object(contexts)} ${object(handlers)}`; - const typeImports = ["BindingValue", "QxObjectRef", "QxWatchHandle", "QxHandler", "QxDerived"].filter((name) => new RegExp(`\\b${name}\\b`).test(signatures)); + const typeImports = ["BindingValue", "QxObjectRef", "QxWatchHandle", "QxHandler", "QxDerived", "QxContextLifecycle", "RelationshipCollection", "RelationshipEntry"].filter((name) => new RegExp(`\\b${name}\\b`).test(signatures)); return `// Generated by quixos-codegen-ts. Do not edit. Binding ABI version 1.\n` + `import { ${exports.length ? "bindQxHandler, " : ""}${[...typeImports, "QxHandlerSpec", "QxMessages"].map((name) => `type ${name}`).join(", ")} } from ${q(options.runtimeModule ?? "@quixos/camino-package-runtime")};\n` + imports.join("\n") + `\nexport const packageRevisionId = ${q(pkg.revisionId)};\n` + diff --git a/src/capability-language/assembly.ts b/src/capability-language/assembly.ts index 0b814e9..efb4c03 100644 --- a/src/capability-language/assembly.ts +++ b/src/capability-language/assembly.ts @@ -1,9 +1,11 @@ -import { readFile } from "node:fs/promises"; +import { readFile, realpath } from "node:fs/promises"; import path from "node:path"; import { loadQxSources, resolveQxSources } from "./source-loader.js"; import { capabilityId, compileWorkspaceRevision, + validateMigrationCatalog, + contentDigest, type AtomDefinition, type CompiledWorkspaceRevision, type InterfaceRevision, @@ -228,6 +230,21 @@ const createResourceGraphResolver = ( ); } assertImportsMatchLock(manifestPath, compiled.resource.imports, lockResult.lock.resources); + if (compiled.resource.kind === "package") { + let catalogText: string | undefined; + try { catalogText = await readFile(path.join(snapshot.directory, "quixos.migrations.json"), "utf8"); } + catch (error) { if ((error as NodeJS.ErrnoException).code !== "ENOENT") throw error; } + if (catalogText !== undefined) { + const catalog = validateMigrationCatalog(JSON.parse(catalogText), new Set(compiled.resource.revision.exports.map((entry) => entry.id))); + const root = await realpath(snapshot.directory); + for (const migration of catalog.migrations) { + const implementation = await realpath(path.join(root, migration.implementation.file)); + if (!implementation.startsWith(`${root}${path.sep}`)) throw new Error("Migration implementation escapes its package"); + if (contentDigest(await readFile(implementation, "utf8")) !== migration.implementation.digest) throw new Error(`Migration implementation digest mismatch: ${migration.id}`); + } + compiled.resource.revision.migrationCatalog = catalog; + } + } return { key, kind: locked.kind, diff --git a/src/capability-language/candidate-check.ts b/src/capability-language/candidate-check.ts new file mode 100644 index 0000000..2ed1ed3 --- /dev/null +++ b/src/capability-language/candidate-check.ts @@ -0,0 +1,179 @@ +import fs from "node:fs/promises"; +import path from "node:path"; +import os from "node:os"; +import { execFile as execFileCallback } from "node:child_process"; +import { promisify } from "node:util"; +import { createHash } from "node:crypto"; +import { compileWorkspaceRepository, compileCapabilityResourceRepository } from "./assembly.js"; +import { createGitCapabilityResolver } from "./git-resolver.js"; +import { contentDigest, planEvolution, type EvolutionReview, type WorkspaceRevision } from "../capability-model/index.js"; +import { bindingSchema, generateTypeScriptBindings, type BindingSchema, type TypeScriptBindingOptions } from "../bindings/index.js"; +const execFile = promisify(execFileCallback); +const bytesDigest = (value: Uint8Array) => `sha256:${createHash("sha256").update(value).digest("hex")}`; + +export const localResourceSnapshots = async (root: string, filename?: string): Promise<{resources: {kind: string; repository: string; commit: string; directory: string}[]}> => { + if (filename) { + const document = JSON.parse(await fs.readFile(filename, "utf8")); + return {resources: document.resources.map((entry: {directory: string}) => ({...entry, directory: path.resolve(path.dirname(filename), entry.directory)}))}; + } + let directory = await fs.realpath(root); + for (;;) { + let graphText: string | undefined; + try {graphText = await fs.readFile(path.join(directory, ".quixos/resource-graph.json"), "utf8");} + catch (error) {if ((error as NodeJS.ErrnoException).code !== "ENOENT") throw error;} + if (graphText !== undefined) { + const graph = JSON.parse(graphText); + const resources = []; + for (const entry of graph.resources) { + const location = await fs.realpath(path.resolve(directory, entry.directory)); + if (!location.startsWith(`${directory}/resources/`)) throw new Error("Workbench resource escapes managed directory"); + resources.push({kind: entry.kind, ...entry.source, directory: location}); + } + return {resources}; + } + const parent = path.dirname(directory); + if (parent === directory) return {resources: []}; + directory = parent; + } +}; + +/** Copy actual authoring files without snapshotting jj or creating a Git commit. */ +export const snapshotRepository = async (source: string, destination: string) => { + const root = await fs.realpath(source); + const files = async () => (await execFile("git", ["-C", root, "ls-files", "--cached", "--others", "--exclude-standard", "-z"], { maxBuffer: 16 * 1024 * 1024 })).stdout.split("\0").filter(Boolean).sort(); + const names = [...new Set(await files())]; + if (names.length > 50_000) throw new Error("Candidate source exceeds 50000 files"); + const contents: {name: string; digest: string; mode: number}[] = []; + let bytes = 0; + await fs.mkdir(destination, { recursive: true, mode: 0o700 }); + for (const name of names) { + if (path.isAbsolute(name) || name.split(/[\\/]/).some((part) => part === ".." || part === ".git" || part === ".jj")) throw new Error("Invalid candidate source path"); + const file = path.join(root, name); + let metadata; + try { metadata = await fs.lstat(file); } catch (error) { if ((error as NodeJS.ErrnoException).code === "ENOENT") continue; throw error; } + if (!metadata.isFile() || metadata.isSymbolicLink() || !(await fs.realpath(file)).startsWith(`${root}${path.sep}`)) throw new Error(`Candidate source must be a regular file: ${name}`); + const data = await fs.readFile(file); + bytes += data.length; + if (bytes > 128 * 1024 * 1024) throw new Error("Candidate source exceeds 128 MiB"); + contents.push({ name, digest: bytesDigest(data), mode: metadata.mode & 0o777 }); + await fs.mkdir(path.dirname(path.join(destination, name)), { recursive: true }); + await fs.writeFile(path.join(destination, name), data, { flag: "wx", mode: metadata.mode & 0o777 }); + } + if (JSON.stringify([...new Set(await files())]) !== JSON.stringify(names)) throw new Error("Source files changed during candidate snapshot"); + for (const entry of contents) if (bytesDigest(await fs.readFile(path.join(root, entry.name))) !== entry.digest) throw new Error(`Source changed during candidate snapshot: ${entry.name}`); + return { source: root, directory: destination, treeDigest: contentDigest(contents), files: contents }; +}; + +export const checkResourceCandidate = async (options: {root: string; output: string; kind: "package" | "interface"; source: {repository: string; commit: string}; snapshotMap?: string; publishedOnly?: boolean}) => { + await fs.mkdir(options.output, {mode: 0o700}); + const temporary = await fs.mkdtemp(path.join(os.tmpdir(), "qx-resource-check-")); + const blockers: string[] = []; + let diagnostics = ""; + let treeDigest: string | undefined; + try { + const root = await snapshotRepository(options.root, path.join(temporary, "root")); + treeDigest = root.treeDigest; + const map = options.publishedOnly ? {resources: []} : await localResourceSnapshots(options.root, options.snapshotMap); + const resources = []; + for (const [index, entry] of map.resources.entries()) { + const snapshot = await snapshotRepository(entry.directory, path.join(temporary, `dependency-${index}`)); + resources.push({...entry, directory: snapshot.directory}); + } + const snapshotMap = path.join(temporary, "snapshots.json"); + await fs.writeFile(snapshotMap, JSON.stringify({resources})); + const resolveResource = await createGitCapabilityResolver({checkoutRoot: path.join(temporary, "resolved"), snapshotMap}); + const compiled = await compileCapabilityResourceRepository({rootDirectory: root.directory, kind: options.kind, source: {resolver: "git", ...options.source}, resolveResource}); + if (compiled.resource.kind === "package") { + const configuration = JSON.parse(await fs.readFile(path.join(root.directory, "quixos.check.json"), "utf8")); + const output = configuration.bindingOutput as string; + if (configuration.backend !== "typescript" || !/^(?:[A-Za-z0-9_-][A-Za-z0-9_.-]*\/)*[A-Za-z0-9_-][A-Za-z0-9_.-]*\.ts$/.test(output)) throw new Error("Unsupported candidate checker configuration"); + const modules = path.join(root.source, "node_modules"); + await fs.access(path.join(modules, ".bin/tsc")); + await fs.symlink(modules, path.join(root.directory, "node_modules"), "dir"); + const destination = path.join(root.directory, output); + await fs.mkdir(path.dirname(destination), {recursive: true}); + await fs.writeFile(destination, generateTypeScriptBindings(bindingSchema(compiled), compiled.resource.revision.revisionId, configuration.options)); + diagnostics = (await execFile(path.join(modules, ".bin/tsc"), ["--noEmit", "--pretty", "false"], {cwd: root.directory, maxBuffer: 16 * 1024 * 1024})).stdout; + } + await fs.writeFile(path.join(options.output, "candidate.json"), JSON.stringify(compiled.resource, null, 2)); + } catch (error) { + blockers.push(error instanceof Error ? error.message : String(error)); + diagnostics += (error as {stdout?: string; stderr?: string}).stdout ?? ""; + diagnostics += (error as {stderr?: string}).stderr ?? ""; + } finally {await fs.rm(temporary, {recursive: true, force: true});} + const result = {candidateOnly: true, activationEvidence: false, treeDigest, blockers, diagnostics}; + await fs.writeFile(path.join(options.output, "report.json"), JSON.stringify(result, null, 2)); + return result; +}; + +export const checkWorkspaceCandidate = async (options: { root: string; output: string; snapshotMap?: string; baseline?: string; reviews?: string }) => { + // A new output directory is the whole artifact boundary; never overwrite a prior check. + await fs.mkdir(options.output, { mode: 0o700 }); + const temporary = await fs.mkdtemp(path.join(os.tmpdir(), "quixos-candidate-")); + const blockers: string[] = []; + const checks: unknown[] = []; + const snapshots = []; + try { + const root = await snapshotRepository(options.root, path.join(temporary, "root")); + snapshots.push(root); + const map = await localResourceSnapshots(options.root, options.snapshotMap); + const resources = []; + for (const [index, entry] of map.resources.entries()) { + const source = entry.directory; + const snapshot = await snapshotRepository(source, path.join(temporary, `resource-${index}`)); + snapshots.push(snapshot); + resources.push({ ...entry, directory: snapshot.directory }); + } + const mapFile = path.join(temporary, "snapshots.json"); + await fs.writeFile(mapFile, JSON.stringify({ resources })); + const resolveResource = await createGitCapabilityResolver({ checkoutRoot: path.join(temporary, "resolved"), snapshotMap: mapFile }); + const compiled = await compileWorkspaceRepository({ rootDirectory: root.directory, resolveResource }); + const baseline = options.baseline ? JSON.parse(await fs.readFile(options.baseline, "utf8")) as WorkspaceRevision : null; + const reviews = options.reviews ? JSON.parse(await fs.readFile(options.reviews, "utf8")) as EvolutionReview[] : []; + const evolution = planEvolution(baseline, compiled.workspace, { reviews }); + blockers.push(...evolution.blockers); + const schema: BindingSchema = { format: "quixos-bindings", version: 1, interfaces: compiled.workspace.interfaceImports, packages: compiled.workspace.packageImports }; + for (const resource of compiled.resources.filter((entry) => entry.kind === "package")) { + if (resource.resource.kind !== "package") continue; + const revision = resource.resource.revision; + let config: { backend: string; bindingOutput: string; options?: TypeScriptBindingOptions }; + try { config = JSON.parse(await fs.readFile(path.join(resource.directory, "quixos.check.json"), "utf8")); } + catch { blockers.push(`No candidate checker configured for ${revision.revisionId} (quixos.check.json)`); continue; } + if (config.backend !== "typescript" || !/^(?:[A-Za-z0-9_-][A-Za-z0-9_.-]*\/)*[A-Za-z0-9_-][A-Za-z0-9_.-]*\.ts$/.test(config.bindingOutput) + || config.bindingOutput.split("/").includes("..")) { blockers.push(`Unsupported checker or binding path for ${revision.revisionId}`); continue; } + const sourceSnapshot = snapshots.find((entry) => entry.directory === resource.directory); + const dependencyRoot = sourceSnapshot?.source ?? resource.directory; + const modules = path.join(dependencyRoot, "node_modules"); + try { await fs.access(path.join(modules, ".bin", "tsc")); } + catch { blockers.push(`Missing installed TypeScript checker/dependencies for ${revision.revisionId}; install its locked development dependencies first`); continue; } + if (sourceSnapshot) await fs.symlink(modules, path.join(resource.directory, "node_modules"), "dir"); + const generated = generateTypeScriptBindings(schema, revision.revisionId, config.options); + const destination = path.join(resource.directory, config.bindingOutput); + await fs.mkdir(path.dirname(destination), { recursive: true }); + await fs.writeFile(destination, generated); + let success = false, diagnostics = ""; + try { diagnostics = (await execFile(path.join(modules, ".bin", "tsc"), ["--noEmit", "--pretty", "false", "--listFiles"], { cwd: resource.directory, maxBuffer: 16 * 1024 * 1024 })).stdout; success = true; } + catch (error) { const result = error as Error & {stdout?: string; stderr?: string}; diagnostics = `${result.stdout ?? ""}\n${result.stderr ?? result.message}`; } + const typeInputs = []; + for (const line of diagnostics.split(/\r?\n/)) if (path.isAbsolute(line) && /\.[cm]?tsx?$/.test(line)) { + try { typeInputs.push({file: line, digest: bytesDigest(await fs.readFile(line))}); } catch { success = false; } + } + const checker = await fs.realpath(path.join(modules, ".bin", "tsc")); + const check = { packageRevisionId: revision.revisionId, success, bindingSchemaDigest: contentDigest(schema), generatedDigest: contentDigest(generated), + checkerDigest: contentDigest({ executable: bytesDigest(await fs.readFile(checker)), typeInputs }), diagnostics }; + checks.push(check); + if (!success) blockers.push(`Typecheck failed for ${revision.revisionId}`); + } + const result = { schemaVersion: 1, candidateOnly: true, activationEvidence: false, + sourceDigest: contentDigest(snapshots.map(({source, treeDigest}) => ({source, treeDigest}))), + snapshots: snapshots.map(({source, treeDigest}) => ({source, treeDigest})), evolution, checks, blockers, + note: "Local source-tree checks do not certify old Git revisions. Publication must repin the DAG and recheck final immutable artifacts." }; + await fs.writeFile(path.join(options.output, "candidate.json"), JSON.stringify(compiled.workspace, null, 2)); + await fs.writeFile(path.join(options.output, "report.json"), JSON.stringify(result, null, 2)); + return result; + } catch (error) { + const result = { schemaVersion: 1, candidateOnly: true, activationEvidence: false, checks, blockers: [...blockers, error instanceof Error ? error.message : String(error)] }; + await fs.writeFile(path.join(options.output, "report.json"), JSON.stringify(result, null, 2)); + return result; + } finally { await fs.rm(temporary, { recursive: true, force: true }); } +}; diff --git a/src/capability-language/generated/QuixosCapability.interp b/src/capability-language/generated/QuixosCapability.interp index f9a81a4..a1ea532 100644 --- a/src/capability-language/generated/QuixosCapability.interp +++ b/src/capability-language/generated/QuixosCapability.interp @@ -37,6 +37,11 @@ null 'repository' 'commit' 'revision' +'semantic-major' +'on-delete' +'retain-other' +'keyed' +'public-traversal' 'id' 'doc' 'mode' @@ -144,6 +149,11 @@ SOURCE REPOSITORY COMMIT REVISION +SEMANTIC_MAJOR +ON_DELETE +RETAIN_OTHER +KEYED +PUBLIC_TRAVERSAL ID DOC MODE @@ -274,4 +284,4 @@ stringLiteral atn: -[4, 1, 104, 779, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 129, 8, 0, 1, 1, 1, 1, 1, 1, 5, 1, 134, 8, 1, 10, 1, 12, 1, 137, 9, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 5, 3, 155, 8, 3, 10, 3, 12, 3, 158, 9, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 3, 4, 168, 8, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 180, 8, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 3, 8, 199, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 207, 8, 9, 1, 9, 1, 9, 1, 10, 5, 10, 212, 8, 10, 10, 10, 12, 10, 215, 9, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 5, 10, 225, 8, 10, 10, 10, 12, 10, 228, 9, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 3, 11, 235, 8, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 5, 13, 260, 8, 13, 10, 13, 12, 13, 263, 9, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 3, 14, 286, 8, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 296, 8, 15, 1, 15, 1, 15, 5, 15, 300, 8, 15, 10, 15, 12, 15, 303, 9, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 3, 16, 331, 8, 16, 1, 17, 1, 17, 1, 17, 1, 17, 3, 17, 337, 8, 17, 1, 18, 5, 18, 340, 8, 18, 10, 18, 12, 18, 343, 9, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 5, 18, 353, 8, 18, 10, 18, 12, 18, 356, 9, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 3, 19, 363, 8, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 376, 8, 20, 1, 20, 1, 20, 1, 20, 3, 20, 381, 8, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 394, 8, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 3, 22, 407, 8, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 3, 25, 422, 8, 25, 1, 25, 3, 25, 425, 8, 25, 1, 26, 1, 26, 1, 26, 5, 26, 430, 8, 26, 10, 26, 12, 26, 433, 9, 26, 1, 27, 1, 27, 1, 27, 5, 27, 438, 8, 27, 10, 27, 12, 27, 441, 9, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 3, 28, 480, 8, 28, 1, 28, 1, 28, 3, 28, 484, 8, 28, 1, 29, 1, 29, 1, 29, 1, 29, 5, 29, 490, 8, 29, 10, 29, 12, 29, 493, 9, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 3, 32, 504, 8, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 3, 33, 518, 8, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 3, 34, 528, 8, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 3, 36, 546, 8, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 5, 37, 556, 8, 37, 10, 37, 12, 37, 559, 9, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 3, 38, 567, 8, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 3, 42, 604, 8, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 3, 43, 623, 8, 43, 3, 43, 625, 8, 43, 1, 44, 1, 44, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 5, 46, 634, 8, 46, 10, 46, 12, 46, 637, 9, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 3, 47, 651, 8, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 3, 47, 667, 8, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 3, 47, 681, 8, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 3, 47, 691, 8, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 3, 48, 700, 8, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 3, 49, 729, 8, 49, 1, 50, 1, 50, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 3, 52, 743, 8, 52, 1, 53, 1, 53, 1, 53, 1, 53, 5, 53, 749, 8, 53, 10, 53, 12, 53, 752, 9, 53, 3, 53, 754, 8, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 5, 55, 766, 8, 55, 10, 55, 12, 55, 769, 9, 55, 3, 55, 771, 8, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 0, 0, 58, 0, 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, 0, 7, 1, 0, 55, 59, 2, 0, 50, 54, 56, 57, 2, 0, 50, 51, 56, 57, 2, 0, 52, 54, 56, 57, 1, 0, 74, 81, 1, 0, 62, 65, 2, 0, 34, 34, 100, 100, 811, 0, 128, 1, 0, 0, 0, 2, 130, 1, 0, 0, 0, 4, 140, 1, 0, 0, 0, 6, 144, 1, 0, 0, 0, 8, 167, 1, 0, 0, 0, 10, 179, 1, 0, 0, 0, 12, 181, 1, 0, 0, 0, 14, 188, 1, 0, 0, 0, 16, 198, 1, 0, 0, 0, 18, 200, 1, 0, 0, 0, 20, 213, 1, 0, 0, 0, 22, 234, 1, 0, 0, 0, 24, 236, 1, 0, 0, 0, 26, 251, 1, 0, 0, 0, 28, 285, 1, 0, 0, 0, 30, 287, 1, 0, 0, 0, 32, 330, 1, 0, 0, 0, 34, 336, 1, 0, 0, 0, 36, 341, 1, 0, 0, 0, 38, 362, 1, 0, 0, 0, 40, 364, 1, 0, 0, 0, 42, 384, 1, 0, 0, 0, 44, 397, 1, 0, 0, 0, 46, 410, 1, 0, 0, 0, 48, 413, 1, 0, 0, 0, 50, 424, 1, 0, 0, 0, 52, 426, 1, 0, 0, 0, 54, 434, 1, 0, 0, 0, 56, 483, 1, 0, 0, 0, 58, 485, 1, 0, 0, 0, 60, 496, 1, 0, 0, 0, 62, 498, 1, 0, 0, 0, 64, 503, 1, 0, 0, 0, 66, 505, 1, 0, 0, 0, 68, 527, 1, 0, 0, 0, 70, 529, 1, 0, 0, 0, 72, 538, 1, 0, 0, 0, 74, 549, 1, 0, 0, 0, 76, 566, 1, 0, 0, 0, 78, 568, 1, 0, 0, 0, 80, 582, 1, 0, 0, 0, 82, 588, 1, 0, 0, 0, 84, 603, 1, 0, 0, 0, 86, 624, 1, 0, 0, 0, 88, 626, 1, 0, 0, 0, 90, 628, 1, 0, 0, 0, 92, 630, 1, 0, 0, 0, 94, 690, 1, 0, 0, 0, 96, 692, 1, 0, 0, 0, 98, 728, 1, 0, 0, 0, 100, 730, 1, 0, 0, 0, 102, 732, 1, 0, 0, 0, 104, 742, 1, 0, 0, 0, 106, 744, 1, 0, 0, 0, 108, 757, 1, 0, 0, 0, 110, 761, 1, 0, 0, 0, 112, 774, 1, 0, 0, 0, 114, 776, 1, 0, 0, 0, 116, 117, 3, 6, 3, 0, 117, 118, 5, 0, 0, 1, 118, 129, 1, 0, 0, 0, 119, 120, 3, 20, 10, 0, 120, 121, 5, 0, 0, 1, 121, 129, 1, 0, 0, 0, 122, 123, 3, 36, 18, 0, 123, 124, 5, 0, 0, 1, 124, 129, 1, 0, 0, 0, 125, 126, 3, 2, 1, 0, 126, 127, 5, 0, 0, 1, 127, 129, 1, 0, 0, 0, 128, 116, 1, 0, 0, 0, 128, 119, 1, 0, 0, 0, 128, 122, 1, 0, 0, 0, 128, 125, 1, 0, 0, 0, 129, 1, 1, 0, 0, 0, 130, 131, 5, 2, 0, 0, 131, 135, 5, 90, 0, 0, 132, 134, 3, 8, 4, 0, 133, 132, 1, 0, 0, 0, 134, 137, 1, 0, 0, 0, 135, 133, 1, 0, 0, 0, 135, 136, 1, 0, 0, 0, 136, 138, 1, 0, 0, 0, 137, 135, 1, 0, 0, 0, 138, 139, 5, 91, 0, 0, 139, 3, 1, 0, 0, 0, 140, 141, 5, 3, 0, 0, 141, 142, 3, 114, 57, 0, 142, 143, 5, 87, 0, 0, 143, 5, 1, 0, 0, 0, 144, 145, 5, 1, 0, 0, 145, 146, 3, 112, 56, 0, 146, 147, 5, 38, 0, 0, 147, 148, 3, 114, 57, 0, 148, 149, 5, 37, 0, 0, 149, 150, 3, 114, 57, 0, 150, 151, 5, 36, 0, 0, 151, 152, 3, 114, 57, 0, 152, 156, 5, 90, 0, 0, 153, 155, 3, 8, 4, 0, 154, 153, 1, 0, 0, 0, 155, 158, 1, 0, 0, 0, 156, 154, 1, 0, 0, 0, 156, 157, 1, 0, 0, 0, 157, 159, 1, 0, 0, 0, 158, 156, 1, 0, 0, 0, 159, 160, 5, 91, 0, 0, 160, 7, 1, 0, 0, 0, 161, 168, 3, 4, 2, 0, 162, 168, 3, 18, 9, 0, 163, 168, 3, 10, 5, 0, 164, 168, 3, 62, 31, 0, 165, 168, 3, 74, 37, 0, 166, 168, 3, 96, 48, 0, 167, 161, 1, 0, 0, 0, 167, 162, 1, 0, 0, 0, 167, 163, 1, 0, 0, 0, 167, 164, 1, 0, 0, 0, 167, 165, 1, 0, 0, 0, 167, 166, 1, 0, 0, 0, 168, 9, 1, 0, 0, 0, 169, 170, 5, 3, 0, 0, 170, 171, 5, 6, 0, 0, 171, 172, 3, 112, 56, 0, 172, 173, 5, 87, 0, 0, 173, 180, 1, 0, 0, 0, 174, 175, 5, 3, 0, 0, 175, 176, 5, 8, 0, 0, 176, 177, 3, 112, 56, 0, 177, 178, 5, 87, 0, 0, 178, 180, 1, 0, 0, 0, 179, 169, 1, 0, 0, 0, 179, 174, 1, 0, 0, 0, 180, 11, 1, 0, 0, 0, 181, 182, 5, 4, 0, 0, 182, 183, 5, 5, 0, 0, 183, 184, 3, 112, 56, 0, 184, 185, 5, 38, 0, 0, 185, 186, 3, 114, 57, 0, 186, 187, 5, 87, 0, 0, 187, 13, 1, 0, 0, 0, 188, 189, 5, 4, 0, 0, 189, 190, 5, 6, 0, 0, 190, 191, 3, 112, 56, 0, 191, 192, 5, 37, 0, 0, 192, 193, 3, 114, 57, 0, 193, 194, 5, 87, 0, 0, 194, 15, 1, 0, 0, 0, 195, 199, 3, 10, 5, 0, 196, 199, 3, 12, 6, 0, 197, 199, 3, 14, 7, 0, 198, 195, 1, 0, 0, 0, 198, 196, 1, 0, 0, 0, 198, 197, 1, 0, 0, 0, 199, 17, 1, 0, 0, 0, 200, 201, 5, 5, 0, 0, 201, 202, 3, 112, 56, 0, 202, 203, 5, 38, 0, 0, 203, 206, 3, 114, 57, 0, 204, 205, 5, 39, 0, 0, 205, 207, 3, 114, 57, 0, 206, 204, 1, 0, 0, 0, 206, 207, 1, 0, 0, 0, 207, 208, 1, 0, 0, 0, 208, 209, 5, 87, 0, 0, 209, 19, 1, 0, 0, 0, 210, 212, 3, 16, 8, 0, 211, 210, 1, 0, 0, 0, 212, 215, 1, 0, 0, 0, 213, 211, 1, 0, 0, 0, 213, 214, 1, 0, 0, 0, 214, 216, 1, 0, 0, 0, 215, 213, 1, 0, 0, 0, 216, 217, 5, 6, 0, 0, 217, 218, 3, 112, 56, 0, 218, 219, 5, 38, 0, 0, 219, 220, 3, 114, 57, 0, 220, 221, 5, 37, 0, 0, 221, 222, 3, 114, 57, 0, 222, 226, 5, 90, 0, 0, 223, 225, 3, 22, 11, 0, 224, 223, 1, 0, 0, 0, 225, 228, 1, 0, 0, 0, 226, 224, 1, 0, 0, 0, 226, 227, 1, 0, 0, 0, 227, 229, 1, 0, 0, 0, 228, 226, 1, 0, 0, 0, 229, 230, 5, 91, 0, 0, 230, 21, 1, 0, 0, 0, 231, 235, 3, 26, 13, 0, 232, 235, 3, 30, 15, 0, 233, 235, 3, 24, 12, 0, 234, 231, 1, 0, 0, 0, 234, 232, 1, 0, 0, 0, 234, 233, 1, 0, 0, 0, 235, 23, 1, 0, 0, 0, 236, 237, 5, 11, 0, 0, 237, 238, 3, 112, 56, 0, 238, 239, 5, 38, 0, 0, 239, 240, 3, 114, 57, 0, 240, 241, 5, 86, 0, 0, 241, 242, 3, 98, 49, 0, 242, 243, 5, 85, 0, 0, 243, 244, 3, 98, 49, 0, 244, 245, 5, 90, 0, 0, 245, 246, 5, 55, 0, 0, 246, 247, 5, 38, 0, 0, 247, 248, 3, 114, 57, 0, 248, 249, 5, 87, 0, 0, 249, 250, 5, 91, 0, 0, 250, 25, 1, 0, 0, 0, 251, 252, 5, 9, 0, 0, 252, 253, 3, 112, 56, 0, 253, 254, 5, 38, 0, 0, 254, 255, 3, 114, 57, 0, 255, 256, 5, 86, 0, 0, 256, 257, 3, 98, 49, 0, 257, 261, 5, 90, 0, 0, 258, 260, 3, 28, 14, 0, 259, 258, 1, 0, 0, 0, 260, 263, 1, 0, 0, 0, 261, 259, 1, 0, 0, 0, 261, 262, 1, 0, 0, 0, 262, 264, 1, 0, 0, 0, 263, 261, 1, 0, 0, 0, 264, 265, 5, 91, 0, 0, 265, 27, 1, 0, 0, 0, 266, 267, 5, 45, 0, 0, 267, 268, 5, 38, 0, 0, 268, 269, 3, 114, 57, 0, 269, 270, 5, 87, 0, 0, 270, 286, 1, 0, 0, 0, 271, 272, 5, 46, 0, 0, 272, 273, 5, 38, 0, 0, 273, 274, 3, 114, 57, 0, 274, 275, 5, 87, 0, 0, 275, 286, 1, 0, 0, 0, 276, 277, 5, 47, 0, 0, 277, 278, 5, 48, 0, 0, 278, 279, 5, 38, 0, 0, 279, 280, 3, 114, 57, 0, 280, 281, 5, 49, 0, 0, 281, 282, 5, 38, 0, 0, 282, 283, 3, 114, 57, 0, 283, 284, 5, 87, 0, 0, 284, 286, 1, 0, 0, 0, 285, 266, 1, 0, 0, 0, 285, 271, 1, 0, 0, 0, 285, 276, 1, 0, 0, 0, 286, 29, 1, 0, 0, 0, 287, 288, 5, 10, 0, 0, 288, 289, 3, 112, 56, 0, 289, 290, 5, 38, 0, 0, 290, 291, 3, 114, 57, 0, 291, 292, 5, 86, 0, 0, 292, 293, 3, 102, 51, 0, 293, 295, 3, 34, 17, 0, 294, 296, 5, 66, 0, 0, 295, 294, 1, 0, 0, 0, 295, 296, 1, 0, 0, 0, 296, 297, 1, 0, 0, 0, 297, 301, 5, 90, 0, 0, 298, 300, 3, 32, 16, 0, 299, 298, 1, 0, 0, 0, 300, 303, 1, 0, 0, 0, 301, 299, 1, 0, 0, 0, 301, 302, 1, 0, 0, 0, 302, 304, 1, 0, 0, 0, 303, 301, 1, 0, 0, 0, 304, 305, 5, 91, 0, 0, 305, 31, 1, 0, 0, 0, 306, 307, 5, 52, 0, 0, 307, 308, 5, 38, 0, 0, 308, 309, 3, 114, 57, 0, 309, 310, 5, 87, 0, 0, 310, 331, 1, 0, 0, 0, 311, 312, 5, 53, 0, 0, 312, 313, 5, 38, 0, 0, 313, 314, 3, 114, 57, 0, 314, 315, 5, 87, 0, 0, 315, 331, 1, 0, 0, 0, 316, 317, 5, 54, 0, 0, 317, 318, 5, 38, 0, 0, 318, 319, 3, 114, 57, 0, 319, 320, 5, 87, 0, 0, 320, 331, 1, 0, 0, 0, 321, 322, 5, 47, 0, 0, 322, 323, 5, 48, 0, 0, 323, 324, 5, 38, 0, 0, 324, 325, 3, 114, 57, 0, 325, 326, 5, 49, 0, 0, 326, 327, 5, 38, 0, 0, 327, 328, 3, 114, 57, 0, 328, 329, 5, 87, 0, 0, 329, 331, 1, 0, 0, 0, 330, 306, 1, 0, 0, 0, 330, 311, 1, 0, 0, 0, 330, 316, 1, 0, 0, 0, 330, 321, 1, 0, 0, 0, 331, 33, 1, 0, 0, 0, 332, 333, 5, 5, 0, 0, 333, 337, 3, 112, 56, 0, 334, 335, 5, 6, 0, 0, 335, 337, 3, 112, 56, 0, 336, 332, 1, 0, 0, 0, 336, 334, 1, 0, 0, 0, 337, 35, 1, 0, 0, 0, 338, 340, 3, 16, 8, 0, 339, 338, 1, 0, 0, 0, 340, 343, 1, 0, 0, 0, 341, 339, 1, 0, 0, 0, 341, 342, 1, 0, 0, 0, 342, 344, 1, 0, 0, 0, 343, 341, 1, 0, 0, 0, 344, 345, 5, 8, 0, 0, 345, 346, 3, 112, 56, 0, 346, 347, 5, 38, 0, 0, 347, 348, 3, 114, 57, 0, 348, 349, 5, 37, 0, 0, 349, 350, 3, 114, 57, 0, 350, 354, 5, 90, 0, 0, 351, 353, 3, 38, 19, 0, 352, 351, 1, 0, 0, 0, 353, 356, 1, 0, 0, 0, 354, 352, 1, 0, 0, 0, 354, 355, 1, 0, 0, 0, 355, 357, 1, 0, 0, 0, 356, 354, 1, 0, 0, 0, 357, 358, 5, 91, 0, 0, 358, 37, 1, 0, 0, 0, 359, 363, 3, 40, 20, 0, 360, 363, 3, 42, 21, 0, 361, 363, 3, 44, 22, 0, 362, 359, 1, 0, 0, 0, 362, 360, 1, 0, 0, 0, 362, 361, 1, 0, 0, 0, 363, 39, 1, 0, 0, 0, 364, 365, 5, 11, 0, 0, 365, 366, 3, 112, 56, 0, 366, 367, 5, 38, 0, 0, 367, 368, 3, 114, 57, 0, 368, 369, 5, 86, 0, 0, 369, 370, 3, 98, 49, 0, 370, 371, 5, 85, 0, 0, 371, 372, 3, 98, 49, 0, 372, 373, 5, 40, 0, 0, 373, 375, 3, 48, 24, 0, 374, 376, 3, 46, 23, 0, 375, 374, 1, 0, 0, 0, 375, 376, 1, 0, 0, 0, 376, 377, 1, 0, 0, 0, 377, 378, 5, 42, 0, 0, 378, 380, 3, 50, 25, 0, 379, 381, 3, 54, 27, 0, 380, 379, 1, 0, 0, 0, 380, 381, 1, 0, 0, 0, 381, 382, 1, 0, 0, 0, 382, 383, 5, 87, 0, 0, 383, 41, 1, 0, 0, 0, 384, 385, 5, 12, 0, 0, 385, 386, 3, 112, 56, 0, 386, 387, 5, 38, 0, 0, 387, 388, 3, 114, 57, 0, 388, 389, 5, 86, 0, 0, 389, 390, 3, 98, 49, 0, 390, 391, 5, 85, 0, 0, 391, 393, 3, 98, 49, 0, 392, 394, 3, 54, 27, 0, 393, 392, 1, 0, 0, 0, 393, 394, 1, 0, 0, 0, 394, 395, 1, 0, 0, 0, 395, 396, 5, 87, 0, 0, 396, 43, 1, 0, 0, 0, 397, 398, 5, 13, 0, 0, 398, 399, 3, 112, 56, 0, 399, 400, 5, 38, 0, 0, 400, 401, 3, 114, 57, 0, 401, 402, 5, 14, 0, 0, 402, 403, 3, 112, 56, 0, 403, 404, 5, 86, 0, 0, 404, 406, 3, 98, 49, 0, 405, 407, 3, 54, 27, 0, 406, 405, 1, 0, 0, 0, 406, 407, 1, 0, 0, 0, 407, 408, 1, 0, 0, 0, 408, 409, 5, 87, 0, 0, 409, 45, 1, 0, 0, 0, 410, 411, 5, 41, 0, 0, 411, 412, 3, 98, 49, 0, 412, 47, 1, 0, 0, 0, 413, 414, 7, 0, 0, 0, 414, 49, 1, 0, 0, 0, 415, 425, 5, 44, 0, 0, 416, 417, 5, 5, 0, 0, 417, 425, 3, 112, 56, 0, 418, 419, 5, 7, 0, 0, 419, 421, 5, 92, 0, 0, 420, 422, 3, 52, 26, 0, 421, 420, 1, 0, 0, 0, 421, 422, 1, 0, 0, 0, 422, 423, 1, 0, 0, 0, 423, 425, 5, 93, 0, 0, 424, 415, 1, 0, 0, 0, 424, 416, 1, 0, 0, 0, 424, 418, 1, 0, 0, 0, 425, 51, 1, 0, 0, 0, 426, 431, 3, 112, 56, 0, 427, 428, 5, 88, 0, 0, 428, 430, 3, 112, 56, 0, 429, 427, 1, 0, 0, 0, 430, 433, 1, 0, 0, 0, 431, 429, 1, 0, 0, 0, 431, 432, 1, 0, 0, 0, 432, 53, 1, 0, 0, 0, 433, 431, 1, 0, 0, 0, 434, 435, 5, 43, 0, 0, 435, 439, 5, 90, 0, 0, 436, 438, 3, 56, 28, 0, 437, 436, 1, 0, 0, 0, 438, 441, 1, 0, 0, 0, 439, 437, 1, 0, 0, 0, 439, 440, 1, 0, 0, 0, 440, 442, 1, 0, 0, 0, 441, 439, 1, 0, 0, 0, 442, 443, 5, 91, 0, 0, 443, 55, 1, 0, 0, 0, 444, 445, 5, 22, 0, 0, 445, 446, 3, 112, 56, 0, 446, 447, 5, 38, 0, 0, 447, 448, 3, 114, 57, 0, 448, 449, 5, 86, 0, 0, 449, 450, 3, 98, 49, 0, 450, 451, 3, 58, 29, 0, 451, 452, 5, 87, 0, 0, 452, 484, 1, 0, 0, 0, 453, 454, 5, 23, 0, 0, 454, 455, 3, 112, 56, 0, 455, 456, 5, 38, 0, 0, 456, 457, 3, 114, 57, 0, 457, 458, 5, 86, 0, 0, 458, 459, 3, 102, 51, 0, 459, 460, 3, 34, 17, 0, 460, 461, 3, 58, 29, 0, 461, 462, 5, 87, 0, 0, 462, 484, 1, 0, 0, 0, 463, 464, 5, 6, 0, 0, 464, 465, 3, 112, 56, 0, 465, 466, 5, 38, 0, 0, 466, 467, 3, 114, 57, 0, 467, 468, 5, 86, 0, 0, 468, 469, 3, 112, 56, 0, 469, 470, 5, 87, 0, 0, 470, 484, 1, 0, 0, 0, 471, 472, 5, 13, 0, 0, 472, 473, 3, 112, 56, 0, 473, 474, 5, 38, 0, 0, 474, 475, 3, 114, 57, 0, 475, 476, 5, 86, 0, 0, 476, 479, 3, 112, 56, 0, 477, 478, 5, 15, 0, 0, 478, 480, 3, 98, 49, 0, 479, 477, 1, 0, 0, 0, 479, 480, 1, 0, 0, 0, 480, 481, 1, 0, 0, 0, 481, 482, 5, 87, 0, 0, 482, 484, 1, 0, 0, 0, 483, 444, 1, 0, 0, 0, 483, 453, 1, 0, 0, 0, 483, 463, 1, 0, 0, 0, 483, 471, 1, 0, 0, 0, 484, 57, 1, 0, 0, 0, 485, 486, 5, 92, 0, 0, 486, 491, 3, 60, 30, 0, 487, 488, 5, 88, 0, 0, 488, 490, 3, 60, 30, 0, 489, 487, 1, 0, 0, 0, 490, 493, 1, 0, 0, 0, 491, 489, 1, 0, 0, 0, 491, 492, 1, 0, 0, 0, 492, 494, 1, 0, 0, 0, 493, 491, 1, 0, 0, 0, 494, 495, 5, 93, 0, 0, 495, 59, 1, 0, 0, 0, 496, 497, 7, 1, 0, 0, 497, 61, 1, 0, 0, 0, 498, 499, 5, 21, 0, 0, 499, 500, 3, 64, 32, 0, 500, 63, 1, 0, 0, 0, 501, 504, 3, 66, 33, 0, 502, 504, 3, 70, 35, 0, 503, 501, 1, 0, 0, 0, 503, 502, 1, 0, 0, 0, 504, 65, 1, 0, 0, 0, 505, 506, 5, 22, 0, 0, 506, 507, 3, 112, 56, 0, 507, 508, 5, 38, 0, 0, 508, 509, 3, 114, 57, 0, 509, 510, 5, 31, 0, 0, 510, 511, 3, 112, 56, 0, 511, 512, 5, 86, 0, 0, 512, 513, 3, 98, 49, 0, 513, 514, 5, 32, 0, 0, 514, 517, 3, 68, 34, 0, 515, 516, 5, 33, 0, 0, 516, 518, 3, 104, 52, 0, 517, 515, 1, 0, 0, 0, 517, 518, 1, 0, 0, 0, 518, 519, 1, 0, 0, 0, 519, 520, 5, 87, 0, 0, 520, 67, 1, 0, 0, 0, 521, 528, 5, 60, 0, 0, 522, 523, 5, 61, 0, 0, 523, 524, 5, 94, 0, 0, 524, 525, 3, 98, 49, 0, 525, 526, 5, 95, 0, 0, 526, 528, 1, 0, 0, 0, 527, 521, 1, 0, 0, 0, 527, 522, 1, 0, 0, 0, 528, 69, 1, 0, 0, 0, 529, 530, 5, 23, 0, 0, 530, 531, 3, 112, 56, 0, 531, 532, 5, 38, 0, 0, 532, 533, 3, 114, 57, 0, 533, 534, 5, 90, 0, 0, 534, 535, 3, 72, 36, 0, 535, 536, 3, 72, 36, 0, 536, 537, 5, 91, 0, 0, 537, 71, 1, 0, 0, 0, 538, 539, 3, 34, 17, 0, 539, 540, 5, 24, 0, 0, 540, 541, 3, 112, 56, 0, 541, 542, 5, 38, 0, 0, 542, 543, 3, 114, 57, 0, 543, 545, 3, 102, 51, 0, 544, 546, 5, 66, 0, 0, 545, 544, 1, 0, 0, 0, 545, 546, 1, 0, 0, 0, 546, 547, 1, 0, 0, 0, 547, 548, 5, 87, 0, 0, 548, 73, 1, 0, 0, 0, 549, 550, 5, 16, 0, 0, 550, 551, 3, 112, 56, 0, 551, 552, 5, 17, 0, 0, 552, 553, 3, 112, 56, 0, 553, 557, 5, 90, 0, 0, 554, 556, 3, 76, 38, 0, 555, 554, 1, 0, 0, 0, 556, 559, 1, 0, 0, 0, 557, 555, 1, 0, 0, 0, 557, 558, 1, 0, 0, 0, 558, 560, 1, 0, 0, 0, 559, 557, 1, 0, 0, 0, 560, 561, 5, 91, 0, 0, 561, 75, 1, 0, 0, 0, 562, 563, 5, 20, 0, 0, 563, 567, 3, 64, 32, 0, 564, 567, 3, 80, 40, 0, 565, 567, 3, 78, 39, 0, 566, 562, 1, 0, 0, 0, 566, 564, 1, 0, 0, 0, 566, 565, 1, 0, 0, 0, 567, 77, 1, 0, 0, 0, 568, 569, 5, 28, 0, 0, 569, 570, 3, 112, 56, 0, 570, 571, 5, 29, 0, 0, 571, 572, 5, 30, 0, 0, 572, 573, 5, 26, 0, 0, 573, 574, 5, 13, 0, 0, 574, 575, 3, 112, 56, 0, 575, 576, 5, 27, 0, 0, 576, 577, 5, 23, 0, 0, 577, 578, 3, 112, 56, 0, 578, 579, 5, 89, 0, 0, 579, 580, 3, 112, 56, 0, 580, 581, 5, 87, 0, 0, 581, 79, 1, 0, 0, 0, 582, 583, 5, 18, 0, 0, 583, 584, 3, 82, 41, 0, 584, 585, 5, 19, 0, 0, 585, 586, 3, 86, 43, 0, 586, 587, 5, 87, 0, 0, 587, 81, 1, 0, 0, 0, 588, 589, 3, 112, 56, 0, 589, 590, 5, 89, 0, 0, 590, 591, 3, 84, 42, 0, 591, 83, 1, 0, 0, 0, 592, 604, 3, 112, 56, 0, 593, 604, 5, 55, 0, 0, 594, 604, 5, 45, 0, 0, 595, 604, 5, 46, 0, 0, 596, 604, 5, 52, 0, 0, 597, 604, 5, 53, 0, 0, 598, 604, 5, 54, 0, 0, 599, 604, 5, 56, 0, 0, 600, 604, 5, 57, 0, 0, 601, 604, 5, 58, 0, 0, 602, 604, 5, 59, 0, 0, 603, 592, 1, 0, 0, 0, 603, 593, 1, 0, 0, 0, 603, 594, 1, 0, 0, 0, 603, 595, 1, 0, 0, 0, 603, 596, 1, 0, 0, 0, 603, 597, 1, 0, 0, 0, 603, 598, 1, 0, 0, 0, 603, 599, 1, 0, 0, 0, 603, 600, 1, 0, 0, 0, 603, 601, 1, 0, 0, 0, 603, 602, 1, 0, 0, 0, 604, 85, 1, 0, 0, 0, 605, 606, 5, 22, 0, 0, 606, 607, 3, 112, 56, 0, 607, 608, 5, 89, 0, 0, 608, 609, 3, 88, 44, 0, 609, 625, 1, 0, 0, 0, 610, 611, 5, 23, 0, 0, 611, 612, 3, 112, 56, 0, 612, 613, 5, 89, 0, 0, 613, 614, 3, 112, 56, 0, 614, 615, 5, 89, 0, 0, 615, 616, 3, 90, 45, 0, 616, 625, 1, 0, 0, 0, 617, 618, 5, 8, 0, 0, 618, 619, 3, 112, 56, 0, 619, 620, 5, 89, 0, 0, 620, 622, 3, 112, 56, 0, 621, 623, 3, 92, 46, 0, 622, 621, 1, 0, 0, 0, 622, 623, 1, 0, 0, 0, 623, 625, 1, 0, 0, 0, 624, 605, 1, 0, 0, 0, 624, 610, 1, 0, 0, 0, 624, 617, 1, 0, 0, 0, 625, 87, 1, 0, 0, 0, 626, 627, 7, 2, 0, 0, 627, 89, 1, 0, 0, 0, 628, 629, 7, 3, 0, 0, 629, 91, 1, 0, 0, 0, 630, 631, 5, 25, 0, 0, 631, 635, 5, 90, 0, 0, 632, 634, 3, 94, 47, 0, 633, 632, 1, 0, 0, 0, 634, 637, 1, 0, 0, 0, 635, 633, 1, 0, 0, 0, 635, 636, 1, 0, 0, 0, 636, 638, 1, 0, 0, 0, 637, 635, 1, 0, 0, 0, 638, 639, 5, 91, 0, 0, 639, 93, 1, 0, 0, 0, 640, 641, 3, 112, 56, 0, 641, 642, 5, 19, 0, 0, 642, 643, 5, 22, 0, 0, 643, 650, 3, 112, 56, 0, 644, 645, 5, 27, 0, 0, 645, 646, 5, 23, 0, 0, 646, 647, 3, 112, 56, 0, 647, 648, 5, 89, 0, 0, 648, 649, 3, 112, 56, 0, 649, 651, 1, 0, 0, 0, 650, 644, 1, 0, 0, 0, 650, 651, 1, 0, 0, 0, 651, 652, 1, 0, 0, 0, 652, 653, 5, 87, 0, 0, 653, 691, 1, 0, 0, 0, 654, 655, 3, 112, 56, 0, 655, 656, 5, 19, 0, 0, 656, 657, 5, 23, 0, 0, 657, 658, 3, 112, 56, 0, 658, 659, 5, 89, 0, 0, 659, 666, 3, 112, 56, 0, 660, 661, 5, 27, 0, 0, 661, 662, 5, 23, 0, 0, 662, 663, 3, 112, 56, 0, 663, 664, 5, 89, 0, 0, 664, 665, 3, 112, 56, 0, 665, 667, 1, 0, 0, 0, 666, 660, 1, 0, 0, 0, 666, 667, 1, 0, 0, 0, 667, 668, 1, 0, 0, 0, 668, 669, 5, 87, 0, 0, 669, 691, 1, 0, 0, 0, 670, 671, 3, 112, 56, 0, 671, 672, 5, 19, 0, 0, 672, 673, 5, 6, 0, 0, 673, 680, 3, 112, 56, 0, 674, 675, 5, 27, 0, 0, 675, 676, 5, 23, 0, 0, 676, 677, 3, 112, 56, 0, 677, 678, 5, 89, 0, 0, 678, 679, 3, 112, 56, 0, 679, 681, 1, 0, 0, 0, 680, 674, 1, 0, 0, 0, 680, 681, 1, 0, 0, 0, 681, 682, 1, 0, 0, 0, 682, 683, 5, 87, 0, 0, 683, 691, 1, 0, 0, 0, 684, 685, 3, 112, 56, 0, 685, 686, 5, 19, 0, 0, 686, 687, 5, 13, 0, 0, 687, 688, 3, 112, 56, 0, 688, 689, 5, 87, 0, 0, 689, 691, 1, 0, 0, 0, 690, 640, 1, 0, 0, 0, 690, 654, 1, 0, 0, 0, 690, 670, 1, 0, 0, 0, 690, 684, 1, 0, 0, 0, 691, 95, 1, 0, 0, 0, 692, 693, 5, 13, 0, 0, 693, 694, 3, 112, 56, 0, 694, 695, 5, 19, 0, 0, 695, 696, 3, 112, 56, 0, 696, 697, 5, 89, 0, 0, 697, 699, 3, 112, 56, 0, 698, 700, 3, 92, 46, 0, 699, 698, 1, 0, 0, 0, 699, 700, 1, 0, 0, 0, 700, 701, 1, 0, 0, 0, 701, 702, 5, 87, 0, 0, 702, 97, 1, 0, 0, 0, 703, 729, 3, 100, 50, 0, 704, 729, 5, 67, 0, 0, 705, 729, 5, 68, 0, 0, 706, 707, 5, 69, 0, 0, 707, 729, 3, 114, 57, 0, 708, 709, 5, 70, 0, 0, 709, 710, 5, 96, 0, 0, 710, 711, 3, 112, 56, 0, 711, 712, 5, 97, 0, 0, 712, 729, 1, 0, 0, 0, 713, 714, 5, 71, 0, 0, 714, 715, 5, 96, 0, 0, 715, 716, 3, 112, 56, 0, 716, 717, 5, 97, 0, 0, 717, 729, 1, 0, 0, 0, 718, 719, 5, 72, 0, 0, 719, 720, 5, 96, 0, 0, 720, 721, 3, 98, 49, 0, 721, 722, 5, 97, 0, 0, 722, 729, 1, 0, 0, 0, 723, 724, 5, 73, 0, 0, 724, 725, 5, 96, 0, 0, 725, 726, 3, 98, 49, 0, 726, 727, 5, 97, 0, 0, 727, 729, 1, 0, 0, 0, 728, 703, 1, 0, 0, 0, 728, 704, 1, 0, 0, 0, 728, 705, 1, 0, 0, 0, 728, 706, 1, 0, 0, 0, 728, 708, 1, 0, 0, 0, 728, 713, 1, 0, 0, 0, 728, 718, 1, 0, 0, 0, 728, 723, 1, 0, 0, 0, 729, 99, 1, 0, 0, 0, 730, 731, 7, 4, 0, 0, 731, 101, 1, 0, 0, 0, 732, 733, 7, 5, 0, 0, 733, 103, 1, 0, 0, 0, 734, 743, 3, 114, 57, 0, 735, 743, 5, 98, 0, 0, 736, 743, 5, 99, 0, 0, 737, 743, 5, 82, 0, 0, 738, 743, 5, 83, 0, 0, 739, 743, 5, 84, 0, 0, 740, 743, 3, 106, 53, 0, 741, 743, 3, 110, 55, 0, 742, 734, 1, 0, 0, 0, 742, 735, 1, 0, 0, 0, 742, 736, 1, 0, 0, 0, 742, 737, 1, 0, 0, 0, 742, 738, 1, 0, 0, 0, 742, 739, 1, 0, 0, 0, 742, 740, 1, 0, 0, 0, 742, 741, 1, 0, 0, 0, 743, 105, 1, 0, 0, 0, 744, 753, 5, 90, 0, 0, 745, 750, 3, 108, 54, 0, 746, 747, 5, 88, 0, 0, 747, 749, 3, 108, 54, 0, 748, 746, 1, 0, 0, 0, 749, 752, 1, 0, 0, 0, 750, 748, 1, 0, 0, 0, 750, 751, 1, 0, 0, 0, 751, 754, 1, 0, 0, 0, 752, 750, 1, 0, 0, 0, 753, 745, 1, 0, 0, 0, 753, 754, 1, 0, 0, 0, 754, 755, 1, 0, 0, 0, 755, 756, 5, 91, 0, 0, 756, 107, 1, 0, 0, 0, 757, 758, 3, 114, 57, 0, 758, 759, 5, 86, 0, 0, 759, 760, 3, 104, 52, 0, 760, 109, 1, 0, 0, 0, 761, 770, 5, 92, 0, 0, 762, 767, 3, 104, 52, 0, 763, 764, 5, 88, 0, 0, 764, 766, 3, 104, 52, 0, 765, 763, 1, 0, 0, 0, 766, 769, 1, 0, 0, 0, 767, 765, 1, 0, 0, 0, 767, 768, 1, 0, 0, 0, 768, 771, 1, 0, 0, 0, 769, 767, 1, 0, 0, 0, 770, 762, 1, 0, 0, 0, 770, 771, 1, 0, 0, 0, 771, 772, 1, 0, 0, 0, 772, 773, 5, 93, 0, 0, 773, 111, 1, 0, 0, 0, 774, 775, 7, 6, 0, 0, 775, 113, 1, 0, 0, 0, 776, 777, 5, 101, 0, 0, 777, 115, 1, 0, 0, 0, 51, 128, 135, 156, 167, 179, 198, 206, 213, 226, 234, 261, 285, 295, 301, 330, 336, 341, 354, 362, 375, 380, 393, 406, 421, 424, 431, 439, 479, 483, 491, 503, 517, 527, 545, 557, 566, 603, 622, 624, 635, 650, 666, 680, 690, 699, 728, 742, 750, 753, 767, 770] \ No newline at end of file +[4, 1, 109, 805, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 129, 8, 0, 1, 1, 1, 1, 1, 1, 5, 1, 134, 8, 1, 10, 1, 12, 1, 137, 9, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 5, 3, 155, 8, 3, 10, 3, 12, 3, 158, 9, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 3, 4, 168, 8, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 180, 8, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 3, 8, 199, 8, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 207, 8, 9, 1, 9, 1, 9, 1, 10, 5, 10, 212, 8, 10, 10, 10, 12, 10, 215, 9, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 5, 10, 225, 8, 10, 10, 10, 12, 10, 228, 9, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 3, 11, 235, 8, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 5, 13, 260, 8, 13, 10, 13, 12, 13, 263, 9, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 3, 14, 286, 8, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 296, 8, 15, 1, 15, 1, 15, 5, 15, 300, 8, 15, 10, 15, 12, 15, 303, 9, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 3, 16, 331, 8, 16, 1, 17, 1, 17, 1, 17, 1, 17, 3, 17, 337, 8, 17, 1, 18, 5, 18, 340, 8, 18, 10, 18, 12, 18, 343, 9, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 3, 18, 353, 8, 18, 1, 18, 1, 18, 5, 18, 357, 8, 18, 10, 18, 12, 18, 360, 9, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 3, 19, 367, 8, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 3, 20, 380, 8, 20, 1, 20, 1, 20, 1, 20, 3, 20, 385, 8, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 3, 21, 398, 8, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 3, 22, 411, 8, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 3, 25, 426, 8, 25, 1, 25, 3, 25, 429, 8, 25, 1, 26, 1, 26, 1, 26, 5, 26, 434, 8, 26, 10, 26, 12, 26, 437, 9, 26, 1, 27, 1, 27, 1, 27, 5, 27, 442, 8, 27, 10, 27, 12, 27, 445, 9, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 3, 28, 484, 8, 28, 1, 28, 1, 28, 3, 28, 488, 8, 28, 1, 29, 1, 29, 1, 29, 1, 29, 5, 29, 494, 8, 29, 10, 29, 12, 29, 497, 9, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 3, 32, 508, 8, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 3, 33, 522, 8, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 3, 34, 532, 8, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 3, 36, 550, 8, 36, 1, 36, 1, 36, 3, 36, 554, 8, 36, 1, 36, 3, 36, 557, 8, 36, 1, 36, 1, 36, 3, 36, 561, 8, 36, 1, 36, 3, 36, 564, 8, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 3, 37, 574, 8, 37, 1, 37, 1, 37, 3, 37, 578, 8, 37, 1, 37, 1, 37, 5, 37, 582, 8, 37, 10, 37, 12, 37, 585, 9, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 3, 38, 593, 8, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 3, 42, 630, 8, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 3, 43, 649, 8, 43, 3, 43, 651, 8, 43, 1, 44, 1, 44, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 5, 46, 660, 8, 46, 10, 46, 12, 46, 663, 9, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 3, 47, 677, 8, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 3, 47, 693, 8, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 3, 47, 707, 8, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 3, 47, 717, 8, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 3, 48, 726, 8, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 3, 49, 755, 8, 49, 1, 50, 1, 50, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 3, 52, 769, 8, 52, 1, 53, 1, 53, 1, 53, 1, 53, 5, 53, 775, 8, 53, 10, 53, 12, 53, 778, 9, 53, 3, 53, 780, 8, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 5, 55, 792, 8, 55, 10, 55, 12, 55, 795, 9, 55, 3, 55, 797, 8, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 0, 0, 58, 0, 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, 0, 7, 1, 0, 60, 64, 2, 0, 55, 59, 61, 62, 2, 0, 55, 56, 61, 62, 2, 0, 57, 59, 61, 62, 1, 0, 79, 86, 1, 0, 67, 70, 2, 0, 34, 34, 105, 105, 844, 0, 128, 1, 0, 0, 0, 2, 130, 1, 0, 0, 0, 4, 140, 1, 0, 0, 0, 6, 144, 1, 0, 0, 0, 8, 167, 1, 0, 0, 0, 10, 179, 1, 0, 0, 0, 12, 181, 1, 0, 0, 0, 14, 188, 1, 0, 0, 0, 16, 198, 1, 0, 0, 0, 18, 200, 1, 0, 0, 0, 20, 213, 1, 0, 0, 0, 22, 234, 1, 0, 0, 0, 24, 236, 1, 0, 0, 0, 26, 251, 1, 0, 0, 0, 28, 285, 1, 0, 0, 0, 30, 287, 1, 0, 0, 0, 32, 330, 1, 0, 0, 0, 34, 336, 1, 0, 0, 0, 36, 341, 1, 0, 0, 0, 38, 366, 1, 0, 0, 0, 40, 368, 1, 0, 0, 0, 42, 388, 1, 0, 0, 0, 44, 401, 1, 0, 0, 0, 46, 414, 1, 0, 0, 0, 48, 417, 1, 0, 0, 0, 50, 428, 1, 0, 0, 0, 52, 430, 1, 0, 0, 0, 54, 438, 1, 0, 0, 0, 56, 487, 1, 0, 0, 0, 58, 489, 1, 0, 0, 0, 60, 500, 1, 0, 0, 0, 62, 502, 1, 0, 0, 0, 64, 507, 1, 0, 0, 0, 66, 509, 1, 0, 0, 0, 68, 531, 1, 0, 0, 0, 70, 533, 1, 0, 0, 0, 72, 542, 1, 0, 0, 0, 74, 567, 1, 0, 0, 0, 76, 592, 1, 0, 0, 0, 78, 594, 1, 0, 0, 0, 80, 608, 1, 0, 0, 0, 82, 614, 1, 0, 0, 0, 84, 629, 1, 0, 0, 0, 86, 650, 1, 0, 0, 0, 88, 652, 1, 0, 0, 0, 90, 654, 1, 0, 0, 0, 92, 656, 1, 0, 0, 0, 94, 716, 1, 0, 0, 0, 96, 718, 1, 0, 0, 0, 98, 754, 1, 0, 0, 0, 100, 756, 1, 0, 0, 0, 102, 758, 1, 0, 0, 0, 104, 768, 1, 0, 0, 0, 106, 770, 1, 0, 0, 0, 108, 783, 1, 0, 0, 0, 110, 787, 1, 0, 0, 0, 112, 800, 1, 0, 0, 0, 114, 802, 1, 0, 0, 0, 116, 117, 3, 6, 3, 0, 117, 118, 5, 0, 0, 1, 118, 129, 1, 0, 0, 0, 119, 120, 3, 20, 10, 0, 120, 121, 5, 0, 0, 1, 121, 129, 1, 0, 0, 0, 122, 123, 3, 36, 18, 0, 123, 124, 5, 0, 0, 1, 124, 129, 1, 0, 0, 0, 125, 126, 3, 2, 1, 0, 126, 127, 5, 0, 0, 1, 127, 129, 1, 0, 0, 0, 128, 116, 1, 0, 0, 0, 128, 119, 1, 0, 0, 0, 128, 122, 1, 0, 0, 0, 128, 125, 1, 0, 0, 0, 129, 1, 1, 0, 0, 0, 130, 131, 5, 2, 0, 0, 131, 135, 5, 95, 0, 0, 132, 134, 3, 8, 4, 0, 133, 132, 1, 0, 0, 0, 134, 137, 1, 0, 0, 0, 135, 133, 1, 0, 0, 0, 135, 136, 1, 0, 0, 0, 136, 138, 1, 0, 0, 0, 137, 135, 1, 0, 0, 0, 138, 139, 5, 96, 0, 0, 139, 3, 1, 0, 0, 0, 140, 141, 5, 3, 0, 0, 141, 142, 3, 114, 57, 0, 142, 143, 5, 92, 0, 0, 143, 5, 1, 0, 0, 0, 144, 145, 5, 1, 0, 0, 145, 146, 3, 112, 56, 0, 146, 147, 5, 43, 0, 0, 147, 148, 3, 114, 57, 0, 148, 149, 5, 37, 0, 0, 149, 150, 3, 114, 57, 0, 150, 151, 5, 36, 0, 0, 151, 152, 3, 114, 57, 0, 152, 156, 5, 95, 0, 0, 153, 155, 3, 8, 4, 0, 154, 153, 1, 0, 0, 0, 155, 158, 1, 0, 0, 0, 156, 154, 1, 0, 0, 0, 156, 157, 1, 0, 0, 0, 157, 159, 1, 0, 0, 0, 158, 156, 1, 0, 0, 0, 159, 160, 5, 96, 0, 0, 160, 7, 1, 0, 0, 0, 161, 168, 3, 4, 2, 0, 162, 168, 3, 18, 9, 0, 163, 168, 3, 10, 5, 0, 164, 168, 3, 62, 31, 0, 165, 168, 3, 74, 37, 0, 166, 168, 3, 96, 48, 0, 167, 161, 1, 0, 0, 0, 167, 162, 1, 0, 0, 0, 167, 163, 1, 0, 0, 0, 167, 164, 1, 0, 0, 0, 167, 165, 1, 0, 0, 0, 167, 166, 1, 0, 0, 0, 168, 9, 1, 0, 0, 0, 169, 170, 5, 3, 0, 0, 170, 171, 5, 6, 0, 0, 171, 172, 3, 112, 56, 0, 172, 173, 5, 92, 0, 0, 173, 180, 1, 0, 0, 0, 174, 175, 5, 3, 0, 0, 175, 176, 5, 8, 0, 0, 176, 177, 3, 112, 56, 0, 177, 178, 5, 92, 0, 0, 178, 180, 1, 0, 0, 0, 179, 169, 1, 0, 0, 0, 179, 174, 1, 0, 0, 0, 180, 11, 1, 0, 0, 0, 181, 182, 5, 4, 0, 0, 182, 183, 5, 5, 0, 0, 183, 184, 3, 112, 56, 0, 184, 185, 5, 43, 0, 0, 185, 186, 3, 114, 57, 0, 186, 187, 5, 92, 0, 0, 187, 13, 1, 0, 0, 0, 188, 189, 5, 4, 0, 0, 189, 190, 5, 6, 0, 0, 190, 191, 3, 112, 56, 0, 191, 192, 5, 37, 0, 0, 192, 193, 3, 114, 57, 0, 193, 194, 5, 92, 0, 0, 194, 15, 1, 0, 0, 0, 195, 199, 3, 10, 5, 0, 196, 199, 3, 12, 6, 0, 197, 199, 3, 14, 7, 0, 198, 195, 1, 0, 0, 0, 198, 196, 1, 0, 0, 0, 198, 197, 1, 0, 0, 0, 199, 17, 1, 0, 0, 0, 200, 201, 5, 5, 0, 0, 201, 202, 3, 112, 56, 0, 202, 203, 5, 43, 0, 0, 203, 206, 3, 114, 57, 0, 204, 205, 5, 44, 0, 0, 205, 207, 3, 114, 57, 0, 206, 204, 1, 0, 0, 0, 206, 207, 1, 0, 0, 0, 207, 208, 1, 0, 0, 0, 208, 209, 5, 92, 0, 0, 209, 19, 1, 0, 0, 0, 210, 212, 3, 16, 8, 0, 211, 210, 1, 0, 0, 0, 212, 215, 1, 0, 0, 0, 213, 211, 1, 0, 0, 0, 213, 214, 1, 0, 0, 0, 214, 216, 1, 0, 0, 0, 215, 213, 1, 0, 0, 0, 216, 217, 5, 6, 0, 0, 217, 218, 3, 112, 56, 0, 218, 219, 5, 43, 0, 0, 219, 220, 3, 114, 57, 0, 220, 221, 5, 37, 0, 0, 221, 222, 3, 114, 57, 0, 222, 226, 5, 95, 0, 0, 223, 225, 3, 22, 11, 0, 224, 223, 1, 0, 0, 0, 225, 228, 1, 0, 0, 0, 226, 224, 1, 0, 0, 0, 226, 227, 1, 0, 0, 0, 227, 229, 1, 0, 0, 0, 228, 226, 1, 0, 0, 0, 229, 230, 5, 96, 0, 0, 230, 21, 1, 0, 0, 0, 231, 235, 3, 26, 13, 0, 232, 235, 3, 30, 15, 0, 233, 235, 3, 24, 12, 0, 234, 231, 1, 0, 0, 0, 234, 232, 1, 0, 0, 0, 234, 233, 1, 0, 0, 0, 235, 23, 1, 0, 0, 0, 236, 237, 5, 11, 0, 0, 237, 238, 3, 112, 56, 0, 238, 239, 5, 43, 0, 0, 239, 240, 3, 114, 57, 0, 240, 241, 5, 91, 0, 0, 241, 242, 3, 98, 49, 0, 242, 243, 5, 90, 0, 0, 243, 244, 3, 98, 49, 0, 244, 245, 5, 95, 0, 0, 245, 246, 5, 60, 0, 0, 246, 247, 5, 43, 0, 0, 247, 248, 3, 114, 57, 0, 248, 249, 5, 92, 0, 0, 249, 250, 5, 96, 0, 0, 250, 25, 1, 0, 0, 0, 251, 252, 5, 9, 0, 0, 252, 253, 3, 112, 56, 0, 253, 254, 5, 43, 0, 0, 254, 255, 3, 114, 57, 0, 255, 256, 5, 91, 0, 0, 256, 257, 3, 98, 49, 0, 257, 261, 5, 95, 0, 0, 258, 260, 3, 28, 14, 0, 259, 258, 1, 0, 0, 0, 260, 263, 1, 0, 0, 0, 261, 259, 1, 0, 0, 0, 261, 262, 1, 0, 0, 0, 262, 264, 1, 0, 0, 0, 263, 261, 1, 0, 0, 0, 264, 265, 5, 96, 0, 0, 265, 27, 1, 0, 0, 0, 266, 267, 5, 50, 0, 0, 267, 268, 5, 43, 0, 0, 268, 269, 3, 114, 57, 0, 269, 270, 5, 92, 0, 0, 270, 286, 1, 0, 0, 0, 271, 272, 5, 51, 0, 0, 272, 273, 5, 43, 0, 0, 273, 274, 3, 114, 57, 0, 274, 275, 5, 92, 0, 0, 275, 286, 1, 0, 0, 0, 276, 277, 5, 52, 0, 0, 277, 278, 5, 53, 0, 0, 278, 279, 5, 43, 0, 0, 279, 280, 3, 114, 57, 0, 280, 281, 5, 54, 0, 0, 281, 282, 5, 43, 0, 0, 282, 283, 3, 114, 57, 0, 283, 284, 5, 92, 0, 0, 284, 286, 1, 0, 0, 0, 285, 266, 1, 0, 0, 0, 285, 271, 1, 0, 0, 0, 285, 276, 1, 0, 0, 0, 286, 29, 1, 0, 0, 0, 287, 288, 5, 10, 0, 0, 288, 289, 3, 112, 56, 0, 289, 290, 5, 43, 0, 0, 290, 291, 3, 114, 57, 0, 291, 292, 5, 91, 0, 0, 292, 293, 3, 102, 51, 0, 293, 295, 3, 34, 17, 0, 294, 296, 5, 71, 0, 0, 295, 294, 1, 0, 0, 0, 295, 296, 1, 0, 0, 0, 296, 297, 1, 0, 0, 0, 297, 301, 5, 95, 0, 0, 298, 300, 3, 32, 16, 0, 299, 298, 1, 0, 0, 0, 300, 303, 1, 0, 0, 0, 301, 299, 1, 0, 0, 0, 301, 302, 1, 0, 0, 0, 302, 304, 1, 0, 0, 0, 303, 301, 1, 0, 0, 0, 304, 305, 5, 96, 0, 0, 305, 31, 1, 0, 0, 0, 306, 307, 5, 57, 0, 0, 307, 308, 5, 43, 0, 0, 308, 309, 3, 114, 57, 0, 309, 310, 5, 92, 0, 0, 310, 331, 1, 0, 0, 0, 311, 312, 5, 58, 0, 0, 312, 313, 5, 43, 0, 0, 313, 314, 3, 114, 57, 0, 314, 315, 5, 92, 0, 0, 315, 331, 1, 0, 0, 0, 316, 317, 5, 59, 0, 0, 317, 318, 5, 43, 0, 0, 318, 319, 3, 114, 57, 0, 319, 320, 5, 92, 0, 0, 320, 331, 1, 0, 0, 0, 321, 322, 5, 52, 0, 0, 322, 323, 5, 53, 0, 0, 323, 324, 5, 43, 0, 0, 324, 325, 3, 114, 57, 0, 325, 326, 5, 54, 0, 0, 326, 327, 5, 43, 0, 0, 327, 328, 3, 114, 57, 0, 328, 329, 5, 92, 0, 0, 329, 331, 1, 0, 0, 0, 330, 306, 1, 0, 0, 0, 330, 311, 1, 0, 0, 0, 330, 316, 1, 0, 0, 0, 330, 321, 1, 0, 0, 0, 331, 33, 1, 0, 0, 0, 332, 333, 5, 5, 0, 0, 333, 337, 3, 112, 56, 0, 334, 335, 5, 6, 0, 0, 335, 337, 3, 112, 56, 0, 336, 332, 1, 0, 0, 0, 336, 334, 1, 0, 0, 0, 337, 35, 1, 0, 0, 0, 338, 340, 3, 16, 8, 0, 339, 338, 1, 0, 0, 0, 340, 343, 1, 0, 0, 0, 341, 339, 1, 0, 0, 0, 341, 342, 1, 0, 0, 0, 342, 344, 1, 0, 0, 0, 343, 341, 1, 0, 0, 0, 344, 345, 5, 8, 0, 0, 345, 346, 3, 112, 56, 0, 346, 347, 5, 43, 0, 0, 347, 348, 3, 114, 57, 0, 348, 349, 5, 37, 0, 0, 349, 352, 3, 114, 57, 0, 350, 351, 5, 38, 0, 0, 351, 353, 5, 103, 0, 0, 352, 350, 1, 0, 0, 0, 352, 353, 1, 0, 0, 0, 353, 354, 1, 0, 0, 0, 354, 358, 5, 95, 0, 0, 355, 357, 3, 38, 19, 0, 356, 355, 1, 0, 0, 0, 357, 360, 1, 0, 0, 0, 358, 356, 1, 0, 0, 0, 358, 359, 1, 0, 0, 0, 359, 361, 1, 0, 0, 0, 360, 358, 1, 0, 0, 0, 361, 362, 5, 96, 0, 0, 362, 37, 1, 0, 0, 0, 363, 367, 3, 40, 20, 0, 364, 367, 3, 42, 21, 0, 365, 367, 3, 44, 22, 0, 366, 363, 1, 0, 0, 0, 366, 364, 1, 0, 0, 0, 366, 365, 1, 0, 0, 0, 367, 39, 1, 0, 0, 0, 368, 369, 5, 11, 0, 0, 369, 370, 3, 112, 56, 0, 370, 371, 5, 43, 0, 0, 371, 372, 3, 114, 57, 0, 372, 373, 5, 91, 0, 0, 373, 374, 3, 98, 49, 0, 374, 375, 5, 90, 0, 0, 375, 376, 3, 98, 49, 0, 376, 377, 5, 45, 0, 0, 377, 379, 3, 48, 24, 0, 378, 380, 3, 46, 23, 0, 379, 378, 1, 0, 0, 0, 379, 380, 1, 0, 0, 0, 380, 381, 1, 0, 0, 0, 381, 382, 5, 47, 0, 0, 382, 384, 3, 50, 25, 0, 383, 385, 3, 54, 27, 0, 384, 383, 1, 0, 0, 0, 384, 385, 1, 0, 0, 0, 385, 386, 1, 0, 0, 0, 386, 387, 5, 92, 0, 0, 387, 41, 1, 0, 0, 0, 388, 389, 5, 12, 0, 0, 389, 390, 3, 112, 56, 0, 390, 391, 5, 43, 0, 0, 391, 392, 3, 114, 57, 0, 392, 393, 5, 91, 0, 0, 393, 394, 3, 98, 49, 0, 394, 395, 5, 90, 0, 0, 395, 397, 3, 98, 49, 0, 396, 398, 3, 54, 27, 0, 397, 396, 1, 0, 0, 0, 397, 398, 1, 0, 0, 0, 398, 399, 1, 0, 0, 0, 399, 400, 5, 92, 0, 0, 400, 43, 1, 0, 0, 0, 401, 402, 5, 13, 0, 0, 402, 403, 3, 112, 56, 0, 403, 404, 5, 43, 0, 0, 404, 405, 3, 114, 57, 0, 405, 406, 5, 14, 0, 0, 406, 407, 3, 112, 56, 0, 407, 408, 5, 91, 0, 0, 408, 410, 3, 98, 49, 0, 409, 411, 3, 54, 27, 0, 410, 409, 1, 0, 0, 0, 410, 411, 1, 0, 0, 0, 411, 412, 1, 0, 0, 0, 412, 413, 5, 92, 0, 0, 413, 45, 1, 0, 0, 0, 414, 415, 5, 46, 0, 0, 415, 416, 3, 98, 49, 0, 416, 47, 1, 0, 0, 0, 417, 418, 7, 0, 0, 0, 418, 49, 1, 0, 0, 0, 419, 429, 5, 49, 0, 0, 420, 421, 5, 5, 0, 0, 421, 429, 3, 112, 56, 0, 422, 423, 5, 7, 0, 0, 423, 425, 5, 97, 0, 0, 424, 426, 3, 52, 26, 0, 425, 424, 1, 0, 0, 0, 425, 426, 1, 0, 0, 0, 426, 427, 1, 0, 0, 0, 427, 429, 5, 98, 0, 0, 428, 419, 1, 0, 0, 0, 428, 420, 1, 0, 0, 0, 428, 422, 1, 0, 0, 0, 429, 51, 1, 0, 0, 0, 430, 435, 3, 112, 56, 0, 431, 432, 5, 93, 0, 0, 432, 434, 3, 112, 56, 0, 433, 431, 1, 0, 0, 0, 434, 437, 1, 0, 0, 0, 435, 433, 1, 0, 0, 0, 435, 436, 1, 0, 0, 0, 436, 53, 1, 0, 0, 0, 437, 435, 1, 0, 0, 0, 438, 439, 5, 48, 0, 0, 439, 443, 5, 95, 0, 0, 440, 442, 3, 56, 28, 0, 441, 440, 1, 0, 0, 0, 442, 445, 1, 0, 0, 0, 443, 441, 1, 0, 0, 0, 443, 444, 1, 0, 0, 0, 444, 446, 1, 0, 0, 0, 445, 443, 1, 0, 0, 0, 446, 447, 5, 96, 0, 0, 447, 55, 1, 0, 0, 0, 448, 449, 5, 22, 0, 0, 449, 450, 3, 112, 56, 0, 450, 451, 5, 43, 0, 0, 451, 452, 3, 114, 57, 0, 452, 453, 5, 91, 0, 0, 453, 454, 3, 98, 49, 0, 454, 455, 3, 58, 29, 0, 455, 456, 5, 92, 0, 0, 456, 488, 1, 0, 0, 0, 457, 458, 5, 23, 0, 0, 458, 459, 3, 112, 56, 0, 459, 460, 5, 43, 0, 0, 460, 461, 3, 114, 57, 0, 461, 462, 5, 91, 0, 0, 462, 463, 3, 102, 51, 0, 463, 464, 3, 34, 17, 0, 464, 465, 3, 58, 29, 0, 465, 466, 5, 92, 0, 0, 466, 488, 1, 0, 0, 0, 467, 468, 5, 6, 0, 0, 468, 469, 3, 112, 56, 0, 469, 470, 5, 43, 0, 0, 470, 471, 3, 114, 57, 0, 471, 472, 5, 91, 0, 0, 472, 473, 3, 112, 56, 0, 473, 474, 5, 92, 0, 0, 474, 488, 1, 0, 0, 0, 475, 476, 5, 13, 0, 0, 476, 477, 3, 112, 56, 0, 477, 478, 5, 43, 0, 0, 478, 479, 3, 114, 57, 0, 479, 480, 5, 91, 0, 0, 480, 483, 3, 112, 56, 0, 481, 482, 5, 15, 0, 0, 482, 484, 3, 98, 49, 0, 483, 481, 1, 0, 0, 0, 483, 484, 1, 0, 0, 0, 484, 485, 1, 0, 0, 0, 485, 486, 5, 92, 0, 0, 486, 488, 1, 0, 0, 0, 487, 448, 1, 0, 0, 0, 487, 457, 1, 0, 0, 0, 487, 467, 1, 0, 0, 0, 487, 475, 1, 0, 0, 0, 488, 57, 1, 0, 0, 0, 489, 490, 5, 97, 0, 0, 490, 495, 3, 60, 30, 0, 491, 492, 5, 93, 0, 0, 492, 494, 3, 60, 30, 0, 493, 491, 1, 0, 0, 0, 494, 497, 1, 0, 0, 0, 495, 493, 1, 0, 0, 0, 495, 496, 1, 0, 0, 0, 496, 498, 1, 0, 0, 0, 497, 495, 1, 0, 0, 0, 498, 499, 5, 98, 0, 0, 499, 59, 1, 0, 0, 0, 500, 501, 7, 1, 0, 0, 501, 61, 1, 0, 0, 0, 502, 503, 5, 21, 0, 0, 503, 504, 3, 64, 32, 0, 504, 63, 1, 0, 0, 0, 505, 508, 3, 66, 33, 0, 506, 508, 3, 70, 35, 0, 507, 505, 1, 0, 0, 0, 507, 506, 1, 0, 0, 0, 508, 65, 1, 0, 0, 0, 509, 510, 5, 22, 0, 0, 510, 511, 3, 112, 56, 0, 511, 512, 5, 43, 0, 0, 512, 513, 3, 114, 57, 0, 513, 514, 5, 31, 0, 0, 514, 515, 3, 112, 56, 0, 515, 516, 5, 91, 0, 0, 516, 517, 3, 98, 49, 0, 517, 518, 5, 32, 0, 0, 518, 521, 3, 68, 34, 0, 519, 520, 5, 33, 0, 0, 520, 522, 3, 104, 52, 0, 521, 519, 1, 0, 0, 0, 521, 522, 1, 0, 0, 0, 522, 523, 1, 0, 0, 0, 523, 524, 5, 92, 0, 0, 524, 67, 1, 0, 0, 0, 525, 532, 5, 65, 0, 0, 526, 527, 5, 66, 0, 0, 527, 528, 5, 99, 0, 0, 528, 529, 3, 98, 49, 0, 529, 530, 5, 100, 0, 0, 530, 532, 1, 0, 0, 0, 531, 525, 1, 0, 0, 0, 531, 526, 1, 0, 0, 0, 532, 69, 1, 0, 0, 0, 533, 534, 5, 23, 0, 0, 534, 535, 3, 112, 56, 0, 535, 536, 5, 43, 0, 0, 536, 537, 3, 114, 57, 0, 537, 538, 5, 95, 0, 0, 538, 539, 3, 72, 36, 0, 539, 540, 3, 72, 36, 0, 540, 541, 5, 96, 0, 0, 541, 71, 1, 0, 0, 0, 542, 543, 3, 34, 17, 0, 543, 544, 5, 24, 0, 0, 544, 545, 3, 112, 56, 0, 545, 546, 5, 43, 0, 0, 546, 547, 3, 114, 57, 0, 547, 549, 3, 102, 51, 0, 548, 550, 5, 71, 0, 0, 549, 548, 1, 0, 0, 0, 549, 550, 1, 0, 0, 0, 550, 553, 1, 0, 0, 0, 551, 552, 5, 39, 0, 0, 552, 554, 3, 114, 57, 0, 553, 551, 1, 0, 0, 0, 553, 554, 1, 0, 0, 0, 554, 556, 1, 0, 0, 0, 555, 557, 5, 40, 0, 0, 556, 555, 1, 0, 0, 0, 556, 557, 1, 0, 0, 0, 557, 560, 1, 0, 0, 0, 558, 559, 5, 41, 0, 0, 559, 561, 3, 114, 57, 0, 560, 558, 1, 0, 0, 0, 560, 561, 1, 0, 0, 0, 561, 563, 1, 0, 0, 0, 562, 564, 5, 42, 0, 0, 563, 562, 1, 0, 0, 0, 563, 564, 1, 0, 0, 0, 564, 565, 1, 0, 0, 0, 565, 566, 5, 92, 0, 0, 566, 73, 1, 0, 0, 0, 567, 568, 5, 16, 0, 0, 568, 569, 3, 112, 56, 0, 569, 570, 5, 17, 0, 0, 570, 573, 3, 112, 56, 0, 571, 572, 5, 43, 0, 0, 572, 574, 3, 114, 57, 0, 573, 571, 1, 0, 0, 0, 573, 574, 1, 0, 0, 0, 574, 577, 1, 0, 0, 0, 575, 576, 5, 38, 0, 0, 576, 578, 5, 103, 0, 0, 577, 575, 1, 0, 0, 0, 577, 578, 1, 0, 0, 0, 578, 579, 1, 0, 0, 0, 579, 583, 5, 95, 0, 0, 580, 582, 3, 76, 38, 0, 581, 580, 1, 0, 0, 0, 582, 585, 1, 0, 0, 0, 583, 581, 1, 0, 0, 0, 583, 584, 1, 0, 0, 0, 584, 586, 1, 0, 0, 0, 585, 583, 1, 0, 0, 0, 586, 587, 5, 96, 0, 0, 587, 75, 1, 0, 0, 0, 588, 589, 5, 20, 0, 0, 589, 593, 3, 64, 32, 0, 590, 593, 3, 80, 40, 0, 591, 593, 3, 78, 39, 0, 592, 588, 1, 0, 0, 0, 592, 590, 1, 0, 0, 0, 592, 591, 1, 0, 0, 0, 593, 77, 1, 0, 0, 0, 594, 595, 5, 28, 0, 0, 595, 596, 3, 112, 56, 0, 596, 597, 5, 29, 0, 0, 597, 598, 5, 30, 0, 0, 598, 599, 5, 26, 0, 0, 599, 600, 5, 13, 0, 0, 600, 601, 3, 112, 56, 0, 601, 602, 5, 27, 0, 0, 602, 603, 5, 23, 0, 0, 603, 604, 3, 112, 56, 0, 604, 605, 5, 94, 0, 0, 605, 606, 3, 112, 56, 0, 606, 607, 5, 92, 0, 0, 607, 79, 1, 0, 0, 0, 608, 609, 5, 18, 0, 0, 609, 610, 3, 82, 41, 0, 610, 611, 5, 19, 0, 0, 611, 612, 3, 86, 43, 0, 612, 613, 5, 92, 0, 0, 613, 81, 1, 0, 0, 0, 614, 615, 3, 112, 56, 0, 615, 616, 5, 94, 0, 0, 616, 617, 3, 84, 42, 0, 617, 83, 1, 0, 0, 0, 618, 630, 3, 112, 56, 0, 619, 630, 5, 60, 0, 0, 620, 630, 5, 50, 0, 0, 621, 630, 5, 51, 0, 0, 622, 630, 5, 57, 0, 0, 623, 630, 5, 58, 0, 0, 624, 630, 5, 59, 0, 0, 625, 630, 5, 61, 0, 0, 626, 630, 5, 62, 0, 0, 627, 630, 5, 63, 0, 0, 628, 630, 5, 64, 0, 0, 629, 618, 1, 0, 0, 0, 629, 619, 1, 0, 0, 0, 629, 620, 1, 0, 0, 0, 629, 621, 1, 0, 0, 0, 629, 622, 1, 0, 0, 0, 629, 623, 1, 0, 0, 0, 629, 624, 1, 0, 0, 0, 629, 625, 1, 0, 0, 0, 629, 626, 1, 0, 0, 0, 629, 627, 1, 0, 0, 0, 629, 628, 1, 0, 0, 0, 630, 85, 1, 0, 0, 0, 631, 632, 5, 22, 0, 0, 632, 633, 3, 112, 56, 0, 633, 634, 5, 94, 0, 0, 634, 635, 3, 88, 44, 0, 635, 651, 1, 0, 0, 0, 636, 637, 5, 23, 0, 0, 637, 638, 3, 112, 56, 0, 638, 639, 5, 94, 0, 0, 639, 640, 3, 112, 56, 0, 640, 641, 5, 94, 0, 0, 641, 642, 3, 90, 45, 0, 642, 651, 1, 0, 0, 0, 643, 644, 5, 8, 0, 0, 644, 645, 3, 112, 56, 0, 645, 646, 5, 94, 0, 0, 646, 648, 3, 112, 56, 0, 647, 649, 3, 92, 46, 0, 648, 647, 1, 0, 0, 0, 648, 649, 1, 0, 0, 0, 649, 651, 1, 0, 0, 0, 650, 631, 1, 0, 0, 0, 650, 636, 1, 0, 0, 0, 650, 643, 1, 0, 0, 0, 651, 87, 1, 0, 0, 0, 652, 653, 7, 2, 0, 0, 653, 89, 1, 0, 0, 0, 654, 655, 7, 3, 0, 0, 655, 91, 1, 0, 0, 0, 656, 657, 5, 25, 0, 0, 657, 661, 5, 95, 0, 0, 658, 660, 3, 94, 47, 0, 659, 658, 1, 0, 0, 0, 660, 663, 1, 0, 0, 0, 661, 659, 1, 0, 0, 0, 661, 662, 1, 0, 0, 0, 662, 664, 1, 0, 0, 0, 663, 661, 1, 0, 0, 0, 664, 665, 5, 96, 0, 0, 665, 93, 1, 0, 0, 0, 666, 667, 3, 112, 56, 0, 667, 668, 5, 19, 0, 0, 668, 669, 5, 22, 0, 0, 669, 676, 3, 112, 56, 0, 670, 671, 5, 27, 0, 0, 671, 672, 5, 23, 0, 0, 672, 673, 3, 112, 56, 0, 673, 674, 5, 94, 0, 0, 674, 675, 3, 112, 56, 0, 675, 677, 1, 0, 0, 0, 676, 670, 1, 0, 0, 0, 676, 677, 1, 0, 0, 0, 677, 678, 1, 0, 0, 0, 678, 679, 5, 92, 0, 0, 679, 717, 1, 0, 0, 0, 680, 681, 3, 112, 56, 0, 681, 682, 5, 19, 0, 0, 682, 683, 5, 23, 0, 0, 683, 684, 3, 112, 56, 0, 684, 685, 5, 94, 0, 0, 685, 692, 3, 112, 56, 0, 686, 687, 5, 27, 0, 0, 687, 688, 5, 23, 0, 0, 688, 689, 3, 112, 56, 0, 689, 690, 5, 94, 0, 0, 690, 691, 3, 112, 56, 0, 691, 693, 1, 0, 0, 0, 692, 686, 1, 0, 0, 0, 692, 693, 1, 0, 0, 0, 693, 694, 1, 0, 0, 0, 694, 695, 5, 92, 0, 0, 695, 717, 1, 0, 0, 0, 696, 697, 3, 112, 56, 0, 697, 698, 5, 19, 0, 0, 698, 699, 5, 6, 0, 0, 699, 706, 3, 112, 56, 0, 700, 701, 5, 27, 0, 0, 701, 702, 5, 23, 0, 0, 702, 703, 3, 112, 56, 0, 703, 704, 5, 94, 0, 0, 704, 705, 3, 112, 56, 0, 705, 707, 1, 0, 0, 0, 706, 700, 1, 0, 0, 0, 706, 707, 1, 0, 0, 0, 707, 708, 1, 0, 0, 0, 708, 709, 5, 92, 0, 0, 709, 717, 1, 0, 0, 0, 710, 711, 3, 112, 56, 0, 711, 712, 5, 19, 0, 0, 712, 713, 5, 13, 0, 0, 713, 714, 3, 112, 56, 0, 714, 715, 5, 92, 0, 0, 715, 717, 1, 0, 0, 0, 716, 666, 1, 0, 0, 0, 716, 680, 1, 0, 0, 0, 716, 696, 1, 0, 0, 0, 716, 710, 1, 0, 0, 0, 717, 95, 1, 0, 0, 0, 718, 719, 5, 13, 0, 0, 719, 720, 3, 112, 56, 0, 720, 721, 5, 19, 0, 0, 721, 722, 3, 112, 56, 0, 722, 723, 5, 94, 0, 0, 723, 725, 3, 112, 56, 0, 724, 726, 3, 92, 46, 0, 725, 724, 1, 0, 0, 0, 725, 726, 1, 0, 0, 0, 726, 727, 1, 0, 0, 0, 727, 728, 5, 92, 0, 0, 728, 97, 1, 0, 0, 0, 729, 755, 3, 100, 50, 0, 730, 755, 5, 72, 0, 0, 731, 755, 5, 73, 0, 0, 732, 733, 5, 74, 0, 0, 733, 755, 3, 114, 57, 0, 734, 735, 5, 75, 0, 0, 735, 736, 5, 101, 0, 0, 736, 737, 3, 112, 56, 0, 737, 738, 5, 102, 0, 0, 738, 755, 1, 0, 0, 0, 739, 740, 5, 76, 0, 0, 740, 741, 5, 101, 0, 0, 741, 742, 3, 112, 56, 0, 742, 743, 5, 102, 0, 0, 743, 755, 1, 0, 0, 0, 744, 745, 5, 77, 0, 0, 745, 746, 5, 101, 0, 0, 746, 747, 3, 98, 49, 0, 747, 748, 5, 102, 0, 0, 748, 755, 1, 0, 0, 0, 749, 750, 5, 78, 0, 0, 750, 751, 5, 101, 0, 0, 751, 752, 3, 98, 49, 0, 752, 753, 5, 102, 0, 0, 753, 755, 1, 0, 0, 0, 754, 729, 1, 0, 0, 0, 754, 730, 1, 0, 0, 0, 754, 731, 1, 0, 0, 0, 754, 732, 1, 0, 0, 0, 754, 734, 1, 0, 0, 0, 754, 739, 1, 0, 0, 0, 754, 744, 1, 0, 0, 0, 754, 749, 1, 0, 0, 0, 755, 99, 1, 0, 0, 0, 756, 757, 7, 4, 0, 0, 757, 101, 1, 0, 0, 0, 758, 759, 7, 5, 0, 0, 759, 103, 1, 0, 0, 0, 760, 769, 3, 114, 57, 0, 761, 769, 5, 103, 0, 0, 762, 769, 5, 104, 0, 0, 763, 769, 5, 87, 0, 0, 764, 769, 5, 88, 0, 0, 765, 769, 5, 89, 0, 0, 766, 769, 3, 106, 53, 0, 767, 769, 3, 110, 55, 0, 768, 760, 1, 0, 0, 0, 768, 761, 1, 0, 0, 0, 768, 762, 1, 0, 0, 0, 768, 763, 1, 0, 0, 0, 768, 764, 1, 0, 0, 0, 768, 765, 1, 0, 0, 0, 768, 766, 1, 0, 0, 0, 768, 767, 1, 0, 0, 0, 769, 105, 1, 0, 0, 0, 770, 779, 5, 95, 0, 0, 771, 776, 3, 108, 54, 0, 772, 773, 5, 93, 0, 0, 773, 775, 3, 108, 54, 0, 774, 772, 1, 0, 0, 0, 775, 778, 1, 0, 0, 0, 776, 774, 1, 0, 0, 0, 776, 777, 1, 0, 0, 0, 777, 780, 1, 0, 0, 0, 778, 776, 1, 0, 0, 0, 779, 771, 1, 0, 0, 0, 779, 780, 1, 0, 0, 0, 780, 781, 1, 0, 0, 0, 781, 782, 5, 96, 0, 0, 782, 107, 1, 0, 0, 0, 783, 784, 3, 114, 57, 0, 784, 785, 5, 91, 0, 0, 785, 786, 3, 104, 52, 0, 786, 109, 1, 0, 0, 0, 787, 796, 5, 97, 0, 0, 788, 793, 3, 104, 52, 0, 789, 790, 5, 93, 0, 0, 790, 792, 3, 104, 52, 0, 791, 789, 1, 0, 0, 0, 792, 795, 1, 0, 0, 0, 793, 791, 1, 0, 0, 0, 793, 794, 1, 0, 0, 0, 794, 797, 1, 0, 0, 0, 795, 793, 1, 0, 0, 0, 796, 788, 1, 0, 0, 0, 796, 797, 1, 0, 0, 0, 797, 798, 1, 0, 0, 0, 798, 799, 5, 98, 0, 0, 799, 111, 1, 0, 0, 0, 800, 801, 7, 6, 0, 0, 801, 113, 1, 0, 0, 0, 802, 803, 5, 106, 0, 0, 803, 115, 1, 0, 0, 0, 58, 128, 135, 156, 167, 179, 198, 206, 213, 226, 234, 261, 285, 295, 301, 330, 336, 341, 352, 358, 366, 379, 384, 397, 410, 425, 428, 435, 443, 483, 487, 495, 507, 521, 531, 549, 553, 556, 560, 563, 573, 577, 583, 592, 629, 648, 650, 661, 676, 692, 706, 716, 725, 754, 768, 776, 779, 793, 796] \ No newline at end of file diff --git a/src/capability-language/generated/QuixosCapability.tokens b/src/capability-language/generated/QuixosCapability.tokens index d34ee3c..9616524 100644 --- a/src/capability-language/generated/QuixosCapability.tokens +++ b/src/capability-language/generated/QuixosCapability.tokens @@ -35,73 +35,78 @@ SOURCE=34 REPOSITORY=35 COMMIT=36 REVISION=37 -ID=38 -DOC=39 -MODE=40 -EMITS=41 -RECEIVER=42 -REQUIRES=43 -ANY=44 -GET=45 -SET=46 -WATCH=47 -START=48 -STOP=49 -READ=50 -WRITE=51 -RESOLVE=52 -CONNECT=53 -DISCONNECT=54 -CALL=55 -WATCH_START=56 -WATCH_STOP=57 -SUBSCRIBE=58 -UNSUBSCRIBE=59 -OPTIMISTIC_REGISTER=60 -CRDT=61 -OPTIONAL_ONE=62 -EXACTLY_ONE=63 -MANY_UNIQUE=64 -MANY=65 -ORDERED=66 -UNIT=67 -WATCH_HANDLE=68 -MESSAGE=69 -ATOM_REF=70 -INTERFACE_REF=71 -OPTIONAL=72 -LIST=73 -BOOL=74 -BYTES=75 -DOUBLE=76 -INT32=77 -INT64=78 -STRING=79 -UINT32=80 -UINT64=81 -TRUE=82 -FALSE=83 -NULL=84 -ARROW=85 -COLON=86 -SEMI=87 -COMMA=88 -DOT=89 -LBRACE=90 -RBRACE=91 -LBRACK=92 -RBRACK=93 -LPAREN=94 -RPAREN=95 -LT=96 -GT=97 -INTEGER=98 -JSON_NUMBER=99 -IDENTIFIER=100 -STRING_LITERAL=101 -LINE_COMMENT=102 -BLOCK_COMMENT=103 -WS=104 +SEMANTIC_MAJOR=38 +ON_DELETE=39 +RETAIN_OTHER=40 +KEYED=41 +PUBLIC_TRAVERSAL=42 +ID=43 +DOC=44 +MODE=45 +EMITS=46 +RECEIVER=47 +REQUIRES=48 +ANY=49 +GET=50 +SET=51 +WATCH=52 +START=53 +STOP=54 +READ=55 +WRITE=56 +RESOLVE=57 +CONNECT=58 +DISCONNECT=59 +CALL=60 +WATCH_START=61 +WATCH_STOP=62 +SUBSCRIBE=63 +UNSUBSCRIBE=64 +OPTIMISTIC_REGISTER=65 +CRDT=66 +OPTIONAL_ONE=67 +EXACTLY_ONE=68 +MANY_UNIQUE=69 +MANY=70 +ORDERED=71 +UNIT=72 +WATCH_HANDLE=73 +MESSAGE=74 +ATOM_REF=75 +INTERFACE_REF=76 +OPTIONAL=77 +LIST=78 +BOOL=79 +BYTES=80 +DOUBLE=81 +INT32=82 +INT64=83 +STRING=84 +UINT32=85 +UINT64=86 +TRUE=87 +FALSE=88 +NULL=89 +ARROW=90 +COLON=91 +SEMI=92 +COMMA=93 +DOT=94 +LBRACE=95 +RBRACE=96 +LBRACK=97 +RBRACK=98 +LPAREN=99 +RPAREN=100 +LT=101 +GT=102 +INTEGER=103 +JSON_NUMBER=104 +IDENTIFIER=105 +STRING_LITERAL=106 +LINE_COMMENT=107 +BLOCK_COMMENT=108 +WS=109 'workspace'=1 'fragment'=2 'import'=3 @@ -139,63 +144,68 @@ WS=104 'repository'=35 'commit'=36 'revision'=37 -'id'=38 -'doc'=39 -'mode'=40 -'emits'=41 -'receiver'=42 -'requires'=43 -'any'=44 -'get'=45 -'set'=46 -'watch'=47 -'start'=48 -'stop'=49 -'read'=50 -'write'=51 -'resolve'=52 -'connect'=53 -'disconnect'=54 -'call'=55 -'watch-start'=56 -'watch-stop'=57 -'subscribe'=58 -'unsubscribe'=59 -'optimistic-register'=60 -'crdt'=61 -'optional-one'=62 -'exactly-one'=63 -'many-unique'=64 -'many'=65 -'ordered'=66 -'unit'=67 -'watch-handle'=68 -'message'=69 -'atom-ref'=70 -'interface-ref'=71 -'optional'=72 -'list'=73 -'bool'=74 -'bytes'=75 -'double'=76 -'int32'=77 -'int64'=78 -'string'=79 -'uint32'=80 -'uint64'=81 -'true'=82 -'false'=83 -'null'=84 -'->'=85 -':'=86 -';'=87 -','=88 -'.'=89 -'{'=90 -'}'=91 -'['=92 -']'=93 -'('=94 -')'=95 -'<'=96 -'>'=97 +'semantic-major'=38 +'on-delete'=39 +'retain-other'=40 +'keyed'=41 +'public-traversal'=42 +'id'=43 +'doc'=44 +'mode'=45 +'emits'=46 +'receiver'=47 +'requires'=48 +'any'=49 +'get'=50 +'set'=51 +'watch'=52 +'start'=53 +'stop'=54 +'read'=55 +'write'=56 +'resolve'=57 +'connect'=58 +'disconnect'=59 +'call'=60 +'watch-start'=61 +'watch-stop'=62 +'subscribe'=63 +'unsubscribe'=64 +'optimistic-register'=65 +'crdt'=66 +'optional-one'=67 +'exactly-one'=68 +'many-unique'=69 +'many'=70 +'ordered'=71 +'unit'=72 +'watch-handle'=73 +'message'=74 +'atom-ref'=75 +'interface-ref'=76 +'optional'=77 +'list'=78 +'bool'=79 +'bytes'=80 +'double'=81 +'int32'=82 +'int64'=83 +'string'=84 +'uint32'=85 +'uint64'=86 +'true'=87 +'false'=88 +'null'=89 +'->'=90 +':'=91 +';'=92 +','=93 +'.'=94 +'{'=95 +'}'=96 +'['=97 +']'=98 +'('=99 +')'=100 +'<'=101 +'>'=102 diff --git a/src/capability-language/generated/QuixosCapabilityLexer.interp b/src/capability-language/generated/QuixosCapabilityLexer.interp index 5e41df9..955014b 100644 --- a/src/capability-language/generated/QuixosCapabilityLexer.interp +++ b/src/capability-language/generated/QuixosCapabilityLexer.interp @@ -37,6 +37,11 @@ null 'repository' 'commit' 'revision' +'semantic-major' +'on-delete' +'retain-other' +'keyed' +'public-traversal' 'id' 'doc' 'mode' @@ -144,6 +149,11 @@ SOURCE REPOSITORY COMMIT REVISION +SEMANTIC_MAJOR +ON_DELETE +RETAIN_OTHER +KEYED +PUBLIC_TRAVERSAL ID DOC MODE @@ -250,6 +260,11 @@ SOURCE REPOSITORY COMMIT REVISION +SEMANTIC_MAJOR +ON_DELETE +RETAIN_OTHER +KEYED +PUBLIC_TRAVERSAL ID DOC MODE @@ -328,4 +343,4 @@ mode names: DEFAULT_MODE atn: -[4, 0, 104, 976, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 86, 1, 86, 1, 87, 1, 87, 1, 88, 1, 88, 1, 89, 1, 89, 1, 90, 1, 90, 1, 91, 1, 91, 1, 92, 1, 92, 1, 93, 1, 93, 1, 94, 1, 94, 1, 95, 1, 95, 1, 96, 1, 96, 1, 97, 3, 97, 877, 8, 97, 1, 97, 4, 97, 880, 8, 97, 11, 97, 12, 97, 881, 1, 98, 3, 98, 885, 8, 98, 1, 98, 1, 98, 1, 98, 5, 98, 890, 8, 98, 10, 98, 12, 98, 893, 9, 98, 3, 98, 895, 8, 98, 1, 98, 1, 98, 4, 98, 899, 8, 98, 11, 98, 12, 98, 900, 3, 98, 903, 8, 98, 1, 98, 1, 98, 3, 98, 907, 8, 98, 1, 98, 4, 98, 910, 8, 98, 11, 98, 12, 98, 911, 3, 98, 914, 8, 98, 1, 99, 1, 99, 5, 99, 918, 8, 99, 10, 99, 12, 99, 921, 9, 99, 1, 100, 1, 100, 1, 100, 5, 100, 926, 8, 100, 10, 100, 12, 100, 929, 9, 100, 1, 100, 1, 100, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 3, 101, 941, 8, 101, 1, 102, 1, 102, 1, 103, 1, 103, 1, 103, 1, 103, 5, 103, 949, 8, 103, 10, 103, 12, 103, 952, 9, 103, 1, 103, 1, 103, 1, 104, 1, 104, 1, 104, 1, 104, 5, 104, 960, 8, 104, 10, 104, 12, 104, 963, 9, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 105, 4, 105, 971, 8, 105, 11, 105, 12, 105, 972, 1, 105, 1, 105, 1, 961, 0, 106, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 29, 59, 30, 61, 31, 63, 32, 65, 33, 67, 34, 69, 35, 71, 36, 73, 37, 75, 38, 77, 39, 79, 40, 81, 41, 83, 42, 85, 43, 87, 44, 89, 45, 91, 46, 93, 47, 95, 48, 97, 49, 99, 50, 101, 51, 103, 52, 105, 53, 107, 54, 109, 55, 111, 56, 113, 57, 115, 58, 117, 59, 119, 60, 121, 61, 123, 62, 125, 63, 127, 64, 129, 65, 131, 66, 133, 67, 135, 68, 137, 69, 139, 70, 141, 71, 143, 72, 145, 73, 147, 74, 149, 75, 151, 76, 153, 77, 155, 78, 157, 79, 159, 80, 161, 81, 163, 82, 165, 83, 167, 84, 169, 85, 171, 86, 173, 87, 175, 88, 177, 89, 179, 90, 181, 91, 183, 92, 185, 93, 187, 94, 189, 95, 191, 96, 193, 97, 195, 98, 197, 99, 199, 100, 201, 101, 203, 0, 205, 0, 207, 102, 209, 103, 211, 104, 1, 0, 11, 1, 0, 48, 57, 1, 0, 49, 57, 2, 0, 69, 69, 101, 101, 2, 0, 43, 43, 45, 45, 3, 0, 65, 90, 95, 95, 97, 122, 4, 0, 48, 57, 65, 90, 95, 95, 97, 122, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 8, 0, 34, 34, 47, 47, 92, 92, 98, 98, 102, 102, 110, 110, 114, 114, 116, 116, 3, 0, 48, 57, 65, 70, 97, 102, 2, 0, 10, 10, 13, 13, 3, 0, 9, 10, 13, 13, 32, 32, 990, 0, 1, 1, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, 0, 0, 45, 1, 0, 0, 0, 0, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 53, 1, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 57, 1, 0, 0, 0, 0, 59, 1, 0, 0, 0, 0, 61, 1, 0, 0, 0, 0, 63, 1, 0, 0, 0, 0, 65, 1, 0, 0, 0, 0, 67, 1, 0, 0, 0, 0, 69, 1, 0, 0, 0, 0, 71, 1, 0, 0, 0, 0, 73, 1, 0, 0, 0, 0, 75, 1, 0, 0, 0, 0, 77, 1, 0, 0, 0, 0, 79, 1, 0, 0, 0, 0, 81, 1, 0, 0, 0, 0, 83, 1, 0, 0, 0, 0, 85, 1, 0, 0, 0, 0, 87, 1, 0, 0, 0, 0, 89, 1, 0, 0, 0, 0, 91, 1, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 95, 1, 0, 0, 0, 0, 97, 1, 0, 0, 0, 0, 99, 1, 0, 0, 0, 0, 101, 1, 0, 0, 0, 0, 103, 1, 0, 0, 0, 0, 105, 1, 0, 0, 0, 0, 107, 1, 0, 0, 0, 0, 109, 1, 0, 0, 0, 0, 111, 1, 0, 0, 0, 0, 113, 1, 0, 0, 0, 0, 115, 1, 0, 0, 0, 0, 117, 1, 0, 0, 0, 0, 119, 1, 0, 0, 0, 0, 121, 1, 0, 0, 0, 0, 123, 1, 0, 0, 0, 0, 125, 1, 0, 0, 0, 0, 127, 1, 0, 0, 0, 0, 129, 1, 0, 0, 0, 0, 131, 1, 0, 0, 0, 0, 133, 1, 0, 0, 0, 0, 135, 1, 0, 0, 0, 0, 137, 1, 0, 0, 0, 0, 139, 1, 0, 0, 0, 0, 141, 1, 0, 0, 0, 0, 143, 1, 0, 0, 0, 0, 145, 1, 0, 0, 0, 0, 147, 1, 0, 0, 0, 0, 149, 1, 0, 0, 0, 0, 151, 1, 0, 0, 0, 0, 153, 1, 0, 0, 0, 0, 155, 1, 0, 0, 0, 0, 157, 1, 0, 0, 0, 0, 159, 1, 0, 0, 0, 0, 161, 1, 0, 0, 0, 0, 163, 1, 0, 0, 0, 0, 165, 1, 0, 0, 0, 0, 167, 1, 0, 0, 0, 0, 169, 1, 0, 0, 0, 0, 171, 1, 0, 0, 0, 0, 173, 1, 0, 0, 0, 0, 175, 1, 0, 0, 0, 0, 177, 1, 0, 0, 0, 0, 179, 1, 0, 0, 0, 0, 181, 1, 0, 0, 0, 0, 183, 1, 0, 0, 0, 0, 185, 1, 0, 0, 0, 0, 187, 1, 0, 0, 0, 0, 189, 1, 0, 0, 0, 0, 191, 1, 0, 0, 0, 0, 193, 1, 0, 0, 0, 0, 195, 1, 0, 0, 0, 0, 197, 1, 0, 0, 0, 0, 199, 1, 0, 0, 0, 0, 201, 1, 0, 0, 0, 0, 207, 1, 0, 0, 0, 0, 209, 1, 0, 0, 0, 0, 211, 1, 0, 0, 0, 1, 213, 1, 0, 0, 0, 3, 223, 1, 0, 0, 0, 5, 232, 1, 0, 0, 0, 7, 239, 1, 0, 0, 0, 9, 248, 1, 0, 0, 0, 11, 253, 1, 0, 0, 0, 13, 263, 1, 0, 0, 0, 15, 274, 1, 0, 0, 0, 17, 282, 1, 0, 0, 0, 19, 288, 1, 0, 0, 0, 21, 297, 1, 0, 0, 0, 23, 307, 1, 0, 0, 0, 25, 316, 1, 0, 0, 0, 27, 328, 1, 0, 0, 0, 29, 339, 1, 0, 0, 0, 31, 345, 1, 0, 0, 0, 33, 353, 1, 0, 0, 0, 35, 356, 1, 0, 0, 0, 37, 361, 1, 0, 0, 0, 39, 364, 1, 0, 0, 0, 41, 372, 1, 0, 0, 0, 43, 379, 1, 0, 0, 0, 45, 385, 1, 0, 0, 0, 47, 390, 1, 0, 0, 0, 49, 401, 1, 0, 0, 0, 51, 406, 1, 0, 0, 0, 53, 412, 1, 0, 0, 0, 55, 416, 1, 0, 0, 0, 57, 428, 1, 0, 0, 0, 59, 431, 1, 0, 0, 0, 61, 438, 1, 0, 0, 0, 63, 441, 1, 0, 0, 0, 65, 448, 1, 0, 0, 0, 67, 456, 1, 0, 0, 0, 69, 463, 1, 0, 0, 0, 71, 474, 1, 0, 0, 0, 73, 481, 1, 0, 0, 0, 75, 490, 1, 0, 0, 0, 77, 493, 1, 0, 0, 0, 79, 497, 1, 0, 0, 0, 81, 502, 1, 0, 0, 0, 83, 508, 1, 0, 0, 0, 85, 517, 1, 0, 0, 0, 87, 526, 1, 0, 0, 0, 89, 530, 1, 0, 0, 0, 91, 534, 1, 0, 0, 0, 93, 538, 1, 0, 0, 0, 95, 544, 1, 0, 0, 0, 97, 550, 1, 0, 0, 0, 99, 555, 1, 0, 0, 0, 101, 560, 1, 0, 0, 0, 103, 566, 1, 0, 0, 0, 105, 574, 1, 0, 0, 0, 107, 582, 1, 0, 0, 0, 109, 593, 1, 0, 0, 0, 111, 598, 1, 0, 0, 0, 113, 610, 1, 0, 0, 0, 115, 621, 1, 0, 0, 0, 117, 631, 1, 0, 0, 0, 119, 643, 1, 0, 0, 0, 121, 663, 1, 0, 0, 0, 123, 668, 1, 0, 0, 0, 125, 681, 1, 0, 0, 0, 127, 693, 1, 0, 0, 0, 129, 705, 1, 0, 0, 0, 131, 710, 1, 0, 0, 0, 133, 718, 1, 0, 0, 0, 135, 723, 1, 0, 0, 0, 137, 736, 1, 0, 0, 0, 139, 744, 1, 0, 0, 0, 141, 753, 1, 0, 0, 0, 143, 767, 1, 0, 0, 0, 145, 776, 1, 0, 0, 0, 147, 781, 1, 0, 0, 0, 149, 786, 1, 0, 0, 0, 151, 792, 1, 0, 0, 0, 153, 799, 1, 0, 0, 0, 155, 805, 1, 0, 0, 0, 157, 811, 1, 0, 0, 0, 159, 818, 1, 0, 0, 0, 161, 825, 1, 0, 0, 0, 163, 832, 1, 0, 0, 0, 165, 837, 1, 0, 0, 0, 167, 843, 1, 0, 0, 0, 169, 848, 1, 0, 0, 0, 171, 851, 1, 0, 0, 0, 173, 853, 1, 0, 0, 0, 175, 855, 1, 0, 0, 0, 177, 857, 1, 0, 0, 0, 179, 859, 1, 0, 0, 0, 181, 861, 1, 0, 0, 0, 183, 863, 1, 0, 0, 0, 185, 865, 1, 0, 0, 0, 187, 867, 1, 0, 0, 0, 189, 869, 1, 0, 0, 0, 191, 871, 1, 0, 0, 0, 193, 873, 1, 0, 0, 0, 195, 876, 1, 0, 0, 0, 197, 884, 1, 0, 0, 0, 199, 915, 1, 0, 0, 0, 201, 922, 1, 0, 0, 0, 203, 932, 1, 0, 0, 0, 205, 942, 1, 0, 0, 0, 207, 944, 1, 0, 0, 0, 209, 955, 1, 0, 0, 0, 211, 970, 1, 0, 0, 0, 213, 214, 5, 119, 0, 0, 214, 215, 5, 111, 0, 0, 215, 216, 5, 114, 0, 0, 216, 217, 5, 107, 0, 0, 217, 218, 5, 115, 0, 0, 218, 219, 5, 112, 0, 0, 219, 220, 5, 97, 0, 0, 220, 221, 5, 99, 0, 0, 221, 222, 5, 101, 0, 0, 222, 2, 1, 0, 0, 0, 223, 224, 5, 102, 0, 0, 224, 225, 5, 114, 0, 0, 225, 226, 5, 97, 0, 0, 226, 227, 5, 103, 0, 0, 227, 228, 5, 109, 0, 0, 228, 229, 5, 101, 0, 0, 229, 230, 5, 110, 0, 0, 230, 231, 5, 116, 0, 0, 231, 4, 1, 0, 0, 0, 232, 233, 5, 105, 0, 0, 233, 234, 5, 109, 0, 0, 234, 235, 5, 112, 0, 0, 235, 236, 5, 111, 0, 0, 236, 237, 5, 114, 0, 0, 237, 238, 5, 116, 0, 0, 238, 6, 1, 0, 0, 0, 239, 240, 5, 101, 0, 0, 240, 241, 5, 120, 0, 0, 241, 242, 5, 116, 0, 0, 242, 243, 5, 101, 0, 0, 243, 244, 5, 114, 0, 0, 244, 245, 5, 110, 0, 0, 245, 246, 5, 97, 0, 0, 246, 247, 5, 108, 0, 0, 247, 8, 1, 0, 0, 0, 248, 249, 5, 97, 0, 0, 249, 250, 5, 116, 0, 0, 250, 251, 5, 111, 0, 0, 251, 252, 5, 109, 0, 0, 252, 10, 1, 0, 0, 0, 253, 254, 5, 105, 0, 0, 254, 255, 5, 110, 0, 0, 255, 256, 5, 116, 0, 0, 256, 257, 5, 101, 0, 0, 257, 258, 5, 114, 0, 0, 258, 259, 5, 102, 0, 0, 259, 260, 5, 97, 0, 0, 260, 261, 5, 99, 0, 0, 261, 262, 5, 101, 0, 0, 262, 12, 1, 0, 0, 0, 263, 264, 5, 105, 0, 0, 264, 265, 5, 110, 0, 0, 265, 266, 5, 116, 0, 0, 266, 267, 5, 101, 0, 0, 267, 268, 5, 114, 0, 0, 268, 269, 5, 102, 0, 0, 269, 270, 5, 97, 0, 0, 270, 271, 5, 99, 0, 0, 271, 272, 5, 101, 0, 0, 272, 273, 5, 115, 0, 0, 273, 14, 1, 0, 0, 0, 274, 275, 5, 112, 0, 0, 275, 276, 5, 97, 0, 0, 276, 277, 5, 99, 0, 0, 277, 278, 5, 107, 0, 0, 278, 279, 5, 97, 0, 0, 279, 280, 5, 103, 0, 0, 280, 281, 5, 101, 0, 0, 281, 16, 1, 0, 0, 0, 282, 283, 5, 118, 0, 0, 283, 284, 5, 97, 0, 0, 284, 285, 5, 108, 0, 0, 285, 286, 5, 117, 0, 0, 286, 287, 5, 101, 0, 0, 287, 18, 1, 0, 0, 0, 288, 289, 5, 114, 0, 0, 289, 290, 5, 101, 0, 0, 290, 291, 5, 108, 0, 0, 291, 292, 5, 97, 0, 0, 292, 293, 5, 116, 0, 0, 293, 294, 5, 105, 0, 0, 294, 295, 5, 111, 0, 0, 295, 296, 5, 110, 0, 0, 296, 20, 1, 0, 0, 0, 297, 298, 5, 111, 0, 0, 298, 299, 5, 112, 0, 0, 299, 300, 5, 101, 0, 0, 300, 301, 5, 114, 0, 0, 301, 302, 5, 97, 0, 0, 302, 303, 5, 116, 0, 0, 303, 304, 5, 105, 0, 0, 304, 305, 5, 111, 0, 0, 305, 306, 5, 110, 0, 0, 306, 22, 1, 0, 0, 0, 307, 308, 5, 102, 0, 0, 308, 309, 5, 117, 0, 0, 309, 310, 5, 110, 0, 0, 310, 311, 5, 99, 0, 0, 311, 312, 5, 116, 0, 0, 312, 313, 5, 105, 0, 0, 313, 314, 5, 111, 0, 0, 314, 315, 5, 110, 0, 0, 315, 24, 1, 0, 0, 0, 316, 317, 5, 99, 0, 0, 317, 318, 5, 111, 0, 0, 318, 319, 5, 110, 0, 0, 319, 320, 5, 115, 0, 0, 320, 321, 5, 116, 0, 0, 321, 322, 5, 114, 0, 0, 322, 323, 5, 117, 0, 0, 323, 324, 5, 99, 0, 0, 324, 325, 5, 116, 0, 0, 325, 326, 5, 111, 0, 0, 326, 327, 5, 114, 0, 0, 327, 26, 1, 0, 0, 0, 328, 329, 5, 99, 0, 0, 329, 330, 5, 111, 0, 0, 330, 331, 5, 110, 0, 0, 331, 332, 5, 115, 0, 0, 332, 333, 5, 116, 0, 0, 333, 334, 5, 114, 0, 0, 334, 335, 5, 117, 0, 0, 335, 336, 5, 99, 0, 0, 336, 337, 5, 116, 0, 0, 337, 338, 5, 115, 0, 0, 338, 28, 1, 0, 0, 0, 339, 340, 5, 105, 0, 0, 340, 341, 5, 110, 0, 0, 341, 342, 5, 112, 0, 0, 342, 343, 5, 117, 0, 0, 343, 344, 5, 116, 0, 0, 344, 30, 1, 0, 0, 0, 345, 346, 5, 99, 0, 0, 346, 347, 5, 111, 0, 0, 347, 348, 5, 110, 0, 0, 348, 349, 5, 102, 0, 0, 349, 350, 5, 111, 0, 0, 350, 351, 5, 114, 0, 0, 351, 352, 5, 109, 0, 0, 352, 32, 1, 0, 0, 0, 353, 354, 5, 97, 0, 0, 354, 355, 5, 115, 0, 0, 355, 34, 1, 0, 0, 0, 356, 357, 5, 98, 0, 0, 357, 358, 5, 105, 0, 0, 358, 359, 5, 110, 0, 0, 359, 360, 5, 100, 0, 0, 360, 36, 1, 0, 0, 0, 361, 362, 5, 116, 0, 0, 362, 363, 5, 111, 0, 0, 363, 38, 1, 0, 0, 0, 364, 365, 5, 112, 0, 0, 365, 366, 5, 114, 0, 0, 366, 367, 5, 105, 0, 0, 367, 368, 5, 118, 0, 0, 368, 369, 5, 97, 0, 0, 369, 370, 5, 116, 0, 0, 370, 371, 5, 101, 0, 0, 371, 40, 1, 0, 0, 0, 372, 373, 5, 115, 0, 0, 373, 374, 5, 104, 0, 0, 374, 375, 5, 97, 0, 0, 375, 376, 5, 114, 0, 0, 376, 377, 5, 101, 0, 0, 377, 378, 5, 100, 0, 0, 378, 42, 1, 0, 0, 0, 379, 380, 5, 115, 0, 0, 380, 381, 5, 116, 0, 0, 381, 382, 5, 97, 0, 0, 382, 383, 5, 116, 0, 0, 383, 384, 5, 101, 0, 0, 384, 44, 1, 0, 0, 0, 385, 386, 5, 101, 0, 0, 386, 387, 5, 100, 0, 0, 387, 388, 5, 103, 0, 0, 388, 389, 5, 101, 0, 0, 389, 46, 1, 0, 0, 0, 390, 391, 5, 112, 0, 0, 391, 392, 5, 114, 0, 0, 392, 393, 5, 111, 0, 0, 393, 394, 5, 106, 0, 0, 394, 395, 5, 101, 0, 0, 395, 396, 5, 99, 0, 0, 396, 397, 5, 116, 0, 0, 397, 398, 5, 105, 0, 0, 398, 399, 5, 111, 0, 0, 399, 400, 5, 110, 0, 0, 400, 48, 1, 0, 0, 0, 401, 402, 5, 119, 0, 0, 402, 403, 5, 105, 0, 0, 403, 404, 5, 116, 0, 0, 404, 405, 5, 104, 0, 0, 405, 50, 1, 0, 0, 0, 406, 407, 5, 117, 0, 0, 407, 408, 5, 115, 0, 0, 408, 409, 5, 105, 0, 0, 409, 410, 5, 110, 0, 0, 410, 411, 5, 103, 0, 0, 411, 52, 1, 0, 0, 0, 412, 413, 5, 118, 0, 0, 413, 414, 5, 105, 0, 0, 414, 415, 5, 97, 0, 0, 415, 54, 1, 0, 0, 0, 416, 417, 5, 109, 0, 0, 417, 418, 5, 97, 0, 0, 418, 419, 5, 116, 0, 0, 419, 420, 5, 101, 0, 0, 420, 421, 5, 114, 0, 0, 421, 422, 5, 105, 0, 0, 422, 423, 5, 97, 0, 0, 423, 424, 5, 108, 0, 0, 424, 425, 5, 105, 0, 0, 425, 426, 5, 122, 0, 0, 426, 427, 5, 101, 0, 0, 427, 56, 1, 0, 0, 0, 428, 429, 5, 105, 0, 0, 429, 430, 5, 102, 0, 0, 430, 58, 1, 0, 0, 0, 431, 432, 5, 97, 0, 0, 432, 433, 5, 98, 0, 0, 433, 434, 5, 115, 0, 0, 434, 435, 5, 101, 0, 0, 435, 436, 5, 110, 0, 0, 436, 437, 5, 116, 0, 0, 437, 60, 1, 0, 0, 0, 438, 439, 5, 111, 0, 0, 439, 440, 5, 110, 0, 0, 440, 62, 1, 0, 0, 0, 441, 442, 5, 112, 0, 0, 442, 443, 5, 111, 0, 0, 443, 444, 5, 108, 0, 0, 444, 445, 5, 105, 0, 0, 445, 446, 5, 99, 0, 0, 446, 447, 5, 121, 0, 0, 447, 64, 1, 0, 0, 0, 448, 449, 5, 100, 0, 0, 449, 450, 5, 101, 0, 0, 450, 451, 5, 102, 0, 0, 451, 452, 5, 97, 0, 0, 452, 453, 5, 117, 0, 0, 453, 454, 5, 108, 0, 0, 454, 455, 5, 116, 0, 0, 455, 66, 1, 0, 0, 0, 456, 457, 5, 115, 0, 0, 457, 458, 5, 111, 0, 0, 458, 459, 5, 117, 0, 0, 459, 460, 5, 114, 0, 0, 460, 461, 5, 99, 0, 0, 461, 462, 5, 101, 0, 0, 462, 68, 1, 0, 0, 0, 463, 464, 5, 114, 0, 0, 464, 465, 5, 101, 0, 0, 465, 466, 5, 112, 0, 0, 466, 467, 5, 111, 0, 0, 467, 468, 5, 115, 0, 0, 468, 469, 5, 105, 0, 0, 469, 470, 5, 116, 0, 0, 470, 471, 5, 111, 0, 0, 471, 472, 5, 114, 0, 0, 472, 473, 5, 121, 0, 0, 473, 70, 1, 0, 0, 0, 474, 475, 5, 99, 0, 0, 475, 476, 5, 111, 0, 0, 476, 477, 5, 109, 0, 0, 477, 478, 5, 109, 0, 0, 478, 479, 5, 105, 0, 0, 479, 480, 5, 116, 0, 0, 480, 72, 1, 0, 0, 0, 481, 482, 5, 114, 0, 0, 482, 483, 5, 101, 0, 0, 483, 484, 5, 118, 0, 0, 484, 485, 5, 105, 0, 0, 485, 486, 5, 115, 0, 0, 486, 487, 5, 105, 0, 0, 487, 488, 5, 111, 0, 0, 488, 489, 5, 110, 0, 0, 489, 74, 1, 0, 0, 0, 490, 491, 5, 105, 0, 0, 491, 492, 5, 100, 0, 0, 492, 76, 1, 0, 0, 0, 493, 494, 5, 100, 0, 0, 494, 495, 5, 111, 0, 0, 495, 496, 5, 99, 0, 0, 496, 78, 1, 0, 0, 0, 497, 498, 5, 109, 0, 0, 498, 499, 5, 111, 0, 0, 499, 500, 5, 100, 0, 0, 500, 501, 5, 101, 0, 0, 501, 80, 1, 0, 0, 0, 502, 503, 5, 101, 0, 0, 503, 504, 5, 109, 0, 0, 504, 505, 5, 105, 0, 0, 505, 506, 5, 116, 0, 0, 506, 507, 5, 115, 0, 0, 507, 82, 1, 0, 0, 0, 508, 509, 5, 114, 0, 0, 509, 510, 5, 101, 0, 0, 510, 511, 5, 99, 0, 0, 511, 512, 5, 101, 0, 0, 512, 513, 5, 105, 0, 0, 513, 514, 5, 118, 0, 0, 514, 515, 5, 101, 0, 0, 515, 516, 5, 114, 0, 0, 516, 84, 1, 0, 0, 0, 517, 518, 5, 114, 0, 0, 518, 519, 5, 101, 0, 0, 519, 520, 5, 113, 0, 0, 520, 521, 5, 117, 0, 0, 521, 522, 5, 105, 0, 0, 522, 523, 5, 114, 0, 0, 523, 524, 5, 101, 0, 0, 524, 525, 5, 115, 0, 0, 525, 86, 1, 0, 0, 0, 526, 527, 5, 97, 0, 0, 527, 528, 5, 110, 0, 0, 528, 529, 5, 121, 0, 0, 529, 88, 1, 0, 0, 0, 530, 531, 5, 103, 0, 0, 531, 532, 5, 101, 0, 0, 532, 533, 5, 116, 0, 0, 533, 90, 1, 0, 0, 0, 534, 535, 5, 115, 0, 0, 535, 536, 5, 101, 0, 0, 536, 537, 5, 116, 0, 0, 537, 92, 1, 0, 0, 0, 538, 539, 5, 119, 0, 0, 539, 540, 5, 97, 0, 0, 540, 541, 5, 116, 0, 0, 541, 542, 5, 99, 0, 0, 542, 543, 5, 104, 0, 0, 543, 94, 1, 0, 0, 0, 544, 545, 5, 115, 0, 0, 545, 546, 5, 116, 0, 0, 546, 547, 5, 97, 0, 0, 547, 548, 5, 114, 0, 0, 548, 549, 5, 116, 0, 0, 549, 96, 1, 0, 0, 0, 550, 551, 5, 115, 0, 0, 551, 552, 5, 116, 0, 0, 552, 553, 5, 111, 0, 0, 553, 554, 5, 112, 0, 0, 554, 98, 1, 0, 0, 0, 555, 556, 5, 114, 0, 0, 556, 557, 5, 101, 0, 0, 557, 558, 5, 97, 0, 0, 558, 559, 5, 100, 0, 0, 559, 100, 1, 0, 0, 0, 560, 561, 5, 119, 0, 0, 561, 562, 5, 114, 0, 0, 562, 563, 5, 105, 0, 0, 563, 564, 5, 116, 0, 0, 564, 565, 5, 101, 0, 0, 565, 102, 1, 0, 0, 0, 566, 567, 5, 114, 0, 0, 567, 568, 5, 101, 0, 0, 568, 569, 5, 115, 0, 0, 569, 570, 5, 111, 0, 0, 570, 571, 5, 108, 0, 0, 571, 572, 5, 118, 0, 0, 572, 573, 5, 101, 0, 0, 573, 104, 1, 0, 0, 0, 574, 575, 5, 99, 0, 0, 575, 576, 5, 111, 0, 0, 576, 577, 5, 110, 0, 0, 577, 578, 5, 110, 0, 0, 578, 579, 5, 101, 0, 0, 579, 580, 5, 99, 0, 0, 580, 581, 5, 116, 0, 0, 581, 106, 1, 0, 0, 0, 582, 583, 5, 100, 0, 0, 583, 584, 5, 105, 0, 0, 584, 585, 5, 115, 0, 0, 585, 586, 5, 99, 0, 0, 586, 587, 5, 111, 0, 0, 587, 588, 5, 110, 0, 0, 588, 589, 5, 110, 0, 0, 589, 590, 5, 101, 0, 0, 590, 591, 5, 99, 0, 0, 591, 592, 5, 116, 0, 0, 592, 108, 1, 0, 0, 0, 593, 594, 5, 99, 0, 0, 594, 595, 5, 97, 0, 0, 595, 596, 5, 108, 0, 0, 596, 597, 5, 108, 0, 0, 597, 110, 1, 0, 0, 0, 598, 599, 5, 119, 0, 0, 599, 600, 5, 97, 0, 0, 600, 601, 5, 116, 0, 0, 601, 602, 5, 99, 0, 0, 602, 603, 5, 104, 0, 0, 603, 604, 5, 45, 0, 0, 604, 605, 5, 115, 0, 0, 605, 606, 5, 116, 0, 0, 606, 607, 5, 97, 0, 0, 607, 608, 5, 114, 0, 0, 608, 609, 5, 116, 0, 0, 609, 112, 1, 0, 0, 0, 610, 611, 5, 119, 0, 0, 611, 612, 5, 97, 0, 0, 612, 613, 5, 116, 0, 0, 613, 614, 5, 99, 0, 0, 614, 615, 5, 104, 0, 0, 615, 616, 5, 45, 0, 0, 616, 617, 5, 115, 0, 0, 617, 618, 5, 116, 0, 0, 618, 619, 5, 111, 0, 0, 619, 620, 5, 112, 0, 0, 620, 114, 1, 0, 0, 0, 621, 622, 5, 115, 0, 0, 622, 623, 5, 117, 0, 0, 623, 624, 5, 98, 0, 0, 624, 625, 5, 115, 0, 0, 625, 626, 5, 99, 0, 0, 626, 627, 5, 114, 0, 0, 627, 628, 5, 105, 0, 0, 628, 629, 5, 98, 0, 0, 629, 630, 5, 101, 0, 0, 630, 116, 1, 0, 0, 0, 631, 632, 5, 117, 0, 0, 632, 633, 5, 110, 0, 0, 633, 634, 5, 115, 0, 0, 634, 635, 5, 117, 0, 0, 635, 636, 5, 98, 0, 0, 636, 637, 5, 115, 0, 0, 637, 638, 5, 99, 0, 0, 638, 639, 5, 114, 0, 0, 639, 640, 5, 105, 0, 0, 640, 641, 5, 98, 0, 0, 641, 642, 5, 101, 0, 0, 642, 118, 1, 0, 0, 0, 643, 644, 5, 111, 0, 0, 644, 645, 5, 112, 0, 0, 645, 646, 5, 116, 0, 0, 646, 647, 5, 105, 0, 0, 647, 648, 5, 109, 0, 0, 648, 649, 5, 105, 0, 0, 649, 650, 5, 115, 0, 0, 650, 651, 5, 116, 0, 0, 651, 652, 5, 105, 0, 0, 652, 653, 5, 99, 0, 0, 653, 654, 5, 45, 0, 0, 654, 655, 5, 114, 0, 0, 655, 656, 5, 101, 0, 0, 656, 657, 5, 103, 0, 0, 657, 658, 5, 105, 0, 0, 658, 659, 5, 115, 0, 0, 659, 660, 5, 116, 0, 0, 660, 661, 5, 101, 0, 0, 661, 662, 5, 114, 0, 0, 662, 120, 1, 0, 0, 0, 663, 664, 5, 99, 0, 0, 664, 665, 5, 114, 0, 0, 665, 666, 5, 100, 0, 0, 666, 667, 5, 116, 0, 0, 667, 122, 1, 0, 0, 0, 668, 669, 5, 111, 0, 0, 669, 670, 5, 112, 0, 0, 670, 671, 5, 116, 0, 0, 671, 672, 5, 105, 0, 0, 672, 673, 5, 111, 0, 0, 673, 674, 5, 110, 0, 0, 674, 675, 5, 97, 0, 0, 675, 676, 5, 108, 0, 0, 676, 677, 5, 45, 0, 0, 677, 678, 5, 111, 0, 0, 678, 679, 5, 110, 0, 0, 679, 680, 5, 101, 0, 0, 680, 124, 1, 0, 0, 0, 681, 682, 5, 101, 0, 0, 682, 683, 5, 120, 0, 0, 683, 684, 5, 97, 0, 0, 684, 685, 5, 99, 0, 0, 685, 686, 5, 116, 0, 0, 686, 687, 5, 108, 0, 0, 687, 688, 5, 121, 0, 0, 688, 689, 5, 45, 0, 0, 689, 690, 5, 111, 0, 0, 690, 691, 5, 110, 0, 0, 691, 692, 5, 101, 0, 0, 692, 126, 1, 0, 0, 0, 693, 694, 5, 109, 0, 0, 694, 695, 5, 97, 0, 0, 695, 696, 5, 110, 0, 0, 696, 697, 5, 121, 0, 0, 697, 698, 5, 45, 0, 0, 698, 699, 5, 117, 0, 0, 699, 700, 5, 110, 0, 0, 700, 701, 5, 105, 0, 0, 701, 702, 5, 113, 0, 0, 702, 703, 5, 117, 0, 0, 703, 704, 5, 101, 0, 0, 704, 128, 1, 0, 0, 0, 705, 706, 5, 109, 0, 0, 706, 707, 5, 97, 0, 0, 707, 708, 5, 110, 0, 0, 708, 709, 5, 121, 0, 0, 709, 130, 1, 0, 0, 0, 710, 711, 5, 111, 0, 0, 711, 712, 5, 114, 0, 0, 712, 713, 5, 100, 0, 0, 713, 714, 5, 101, 0, 0, 714, 715, 5, 114, 0, 0, 715, 716, 5, 101, 0, 0, 716, 717, 5, 100, 0, 0, 717, 132, 1, 0, 0, 0, 718, 719, 5, 117, 0, 0, 719, 720, 5, 110, 0, 0, 720, 721, 5, 105, 0, 0, 721, 722, 5, 116, 0, 0, 722, 134, 1, 0, 0, 0, 723, 724, 5, 119, 0, 0, 724, 725, 5, 97, 0, 0, 725, 726, 5, 116, 0, 0, 726, 727, 5, 99, 0, 0, 727, 728, 5, 104, 0, 0, 728, 729, 5, 45, 0, 0, 729, 730, 5, 104, 0, 0, 730, 731, 5, 97, 0, 0, 731, 732, 5, 110, 0, 0, 732, 733, 5, 100, 0, 0, 733, 734, 5, 108, 0, 0, 734, 735, 5, 101, 0, 0, 735, 136, 1, 0, 0, 0, 736, 737, 5, 109, 0, 0, 737, 738, 5, 101, 0, 0, 738, 739, 5, 115, 0, 0, 739, 740, 5, 115, 0, 0, 740, 741, 5, 97, 0, 0, 741, 742, 5, 103, 0, 0, 742, 743, 5, 101, 0, 0, 743, 138, 1, 0, 0, 0, 744, 745, 5, 97, 0, 0, 745, 746, 5, 116, 0, 0, 746, 747, 5, 111, 0, 0, 747, 748, 5, 109, 0, 0, 748, 749, 5, 45, 0, 0, 749, 750, 5, 114, 0, 0, 750, 751, 5, 101, 0, 0, 751, 752, 5, 102, 0, 0, 752, 140, 1, 0, 0, 0, 753, 754, 5, 105, 0, 0, 754, 755, 5, 110, 0, 0, 755, 756, 5, 116, 0, 0, 756, 757, 5, 101, 0, 0, 757, 758, 5, 114, 0, 0, 758, 759, 5, 102, 0, 0, 759, 760, 5, 97, 0, 0, 760, 761, 5, 99, 0, 0, 761, 762, 5, 101, 0, 0, 762, 763, 5, 45, 0, 0, 763, 764, 5, 114, 0, 0, 764, 765, 5, 101, 0, 0, 765, 766, 5, 102, 0, 0, 766, 142, 1, 0, 0, 0, 767, 768, 5, 111, 0, 0, 768, 769, 5, 112, 0, 0, 769, 770, 5, 116, 0, 0, 770, 771, 5, 105, 0, 0, 771, 772, 5, 111, 0, 0, 772, 773, 5, 110, 0, 0, 773, 774, 5, 97, 0, 0, 774, 775, 5, 108, 0, 0, 775, 144, 1, 0, 0, 0, 776, 777, 5, 108, 0, 0, 777, 778, 5, 105, 0, 0, 778, 779, 5, 115, 0, 0, 779, 780, 5, 116, 0, 0, 780, 146, 1, 0, 0, 0, 781, 782, 5, 98, 0, 0, 782, 783, 5, 111, 0, 0, 783, 784, 5, 111, 0, 0, 784, 785, 5, 108, 0, 0, 785, 148, 1, 0, 0, 0, 786, 787, 5, 98, 0, 0, 787, 788, 5, 121, 0, 0, 788, 789, 5, 116, 0, 0, 789, 790, 5, 101, 0, 0, 790, 791, 5, 115, 0, 0, 791, 150, 1, 0, 0, 0, 792, 793, 5, 100, 0, 0, 793, 794, 5, 111, 0, 0, 794, 795, 5, 117, 0, 0, 795, 796, 5, 98, 0, 0, 796, 797, 5, 108, 0, 0, 797, 798, 5, 101, 0, 0, 798, 152, 1, 0, 0, 0, 799, 800, 5, 105, 0, 0, 800, 801, 5, 110, 0, 0, 801, 802, 5, 116, 0, 0, 802, 803, 5, 51, 0, 0, 803, 804, 5, 50, 0, 0, 804, 154, 1, 0, 0, 0, 805, 806, 5, 105, 0, 0, 806, 807, 5, 110, 0, 0, 807, 808, 5, 116, 0, 0, 808, 809, 5, 54, 0, 0, 809, 810, 5, 52, 0, 0, 810, 156, 1, 0, 0, 0, 811, 812, 5, 115, 0, 0, 812, 813, 5, 116, 0, 0, 813, 814, 5, 114, 0, 0, 814, 815, 5, 105, 0, 0, 815, 816, 5, 110, 0, 0, 816, 817, 5, 103, 0, 0, 817, 158, 1, 0, 0, 0, 818, 819, 5, 117, 0, 0, 819, 820, 5, 105, 0, 0, 820, 821, 5, 110, 0, 0, 821, 822, 5, 116, 0, 0, 822, 823, 5, 51, 0, 0, 823, 824, 5, 50, 0, 0, 824, 160, 1, 0, 0, 0, 825, 826, 5, 117, 0, 0, 826, 827, 5, 105, 0, 0, 827, 828, 5, 110, 0, 0, 828, 829, 5, 116, 0, 0, 829, 830, 5, 54, 0, 0, 830, 831, 5, 52, 0, 0, 831, 162, 1, 0, 0, 0, 832, 833, 5, 116, 0, 0, 833, 834, 5, 114, 0, 0, 834, 835, 5, 117, 0, 0, 835, 836, 5, 101, 0, 0, 836, 164, 1, 0, 0, 0, 837, 838, 5, 102, 0, 0, 838, 839, 5, 97, 0, 0, 839, 840, 5, 108, 0, 0, 840, 841, 5, 115, 0, 0, 841, 842, 5, 101, 0, 0, 842, 166, 1, 0, 0, 0, 843, 844, 5, 110, 0, 0, 844, 845, 5, 117, 0, 0, 845, 846, 5, 108, 0, 0, 846, 847, 5, 108, 0, 0, 847, 168, 1, 0, 0, 0, 848, 849, 5, 45, 0, 0, 849, 850, 5, 62, 0, 0, 850, 170, 1, 0, 0, 0, 851, 852, 5, 58, 0, 0, 852, 172, 1, 0, 0, 0, 853, 854, 5, 59, 0, 0, 854, 174, 1, 0, 0, 0, 855, 856, 5, 44, 0, 0, 856, 176, 1, 0, 0, 0, 857, 858, 5, 46, 0, 0, 858, 178, 1, 0, 0, 0, 859, 860, 5, 123, 0, 0, 860, 180, 1, 0, 0, 0, 861, 862, 5, 125, 0, 0, 862, 182, 1, 0, 0, 0, 863, 864, 5, 91, 0, 0, 864, 184, 1, 0, 0, 0, 865, 866, 5, 93, 0, 0, 866, 186, 1, 0, 0, 0, 867, 868, 5, 40, 0, 0, 868, 188, 1, 0, 0, 0, 869, 870, 5, 41, 0, 0, 870, 190, 1, 0, 0, 0, 871, 872, 5, 60, 0, 0, 872, 192, 1, 0, 0, 0, 873, 874, 5, 62, 0, 0, 874, 194, 1, 0, 0, 0, 875, 877, 5, 45, 0, 0, 876, 875, 1, 0, 0, 0, 876, 877, 1, 0, 0, 0, 877, 879, 1, 0, 0, 0, 878, 880, 7, 0, 0, 0, 879, 878, 1, 0, 0, 0, 880, 881, 1, 0, 0, 0, 881, 879, 1, 0, 0, 0, 881, 882, 1, 0, 0, 0, 882, 196, 1, 0, 0, 0, 883, 885, 5, 45, 0, 0, 884, 883, 1, 0, 0, 0, 884, 885, 1, 0, 0, 0, 885, 894, 1, 0, 0, 0, 886, 895, 5, 48, 0, 0, 887, 891, 7, 1, 0, 0, 888, 890, 7, 0, 0, 0, 889, 888, 1, 0, 0, 0, 890, 893, 1, 0, 0, 0, 891, 889, 1, 0, 0, 0, 891, 892, 1, 0, 0, 0, 892, 895, 1, 0, 0, 0, 893, 891, 1, 0, 0, 0, 894, 886, 1, 0, 0, 0, 894, 887, 1, 0, 0, 0, 895, 902, 1, 0, 0, 0, 896, 898, 5, 46, 0, 0, 897, 899, 7, 0, 0, 0, 898, 897, 1, 0, 0, 0, 899, 900, 1, 0, 0, 0, 900, 898, 1, 0, 0, 0, 900, 901, 1, 0, 0, 0, 901, 903, 1, 0, 0, 0, 902, 896, 1, 0, 0, 0, 902, 903, 1, 0, 0, 0, 903, 913, 1, 0, 0, 0, 904, 906, 7, 2, 0, 0, 905, 907, 7, 3, 0, 0, 906, 905, 1, 0, 0, 0, 906, 907, 1, 0, 0, 0, 907, 909, 1, 0, 0, 0, 908, 910, 7, 0, 0, 0, 909, 908, 1, 0, 0, 0, 910, 911, 1, 0, 0, 0, 911, 909, 1, 0, 0, 0, 911, 912, 1, 0, 0, 0, 912, 914, 1, 0, 0, 0, 913, 904, 1, 0, 0, 0, 913, 914, 1, 0, 0, 0, 914, 198, 1, 0, 0, 0, 915, 919, 7, 4, 0, 0, 916, 918, 7, 5, 0, 0, 917, 916, 1, 0, 0, 0, 918, 921, 1, 0, 0, 0, 919, 917, 1, 0, 0, 0, 919, 920, 1, 0, 0, 0, 920, 200, 1, 0, 0, 0, 921, 919, 1, 0, 0, 0, 922, 927, 5, 34, 0, 0, 923, 926, 3, 203, 101, 0, 924, 926, 8, 6, 0, 0, 925, 923, 1, 0, 0, 0, 925, 924, 1, 0, 0, 0, 926, 929, 1, 0, 0, 0, 927, 925, 1, 0, 0, 0, 927, 928, 1, 0, 0, 0, 928, 930, 1, 0, 0, 0, 929, 927, 1, 0, 0, 0, 930, 931, 5, 34, 0, 0, 931, 202, 1, 0, 0, 0, 932, 940, 5, 92, 0, 0, 933, 941, 7, 7, 0, 0, 934, 935, 5, 117, 0, 0, 935, 936, 3, 205, 102, 0, 936, 937, 3, 205, 102, 0, 937, 938, 3, 205, 102, 0, 938, 939, 3, 205, 102, 0, 939, 941, 1, 0, 0, 0, 940, 933, 1, 0, 0, 0, 940, 934, 1, 0, 0, 0, 941, 204, 1, 0, 0, 0, 942, 943, 7, 8, 0, 0, 943, 206, 1, 0, 0, 0, 944, 945, 5, 47, 0, 0, 945, 946, 5, 47, 0, 0, 946, 950, 1, 0, 0, 0, 947, 949, 8, 9, 0, 0, 948, 947, 1, 0, 0, 0, 949, 952, 1, 0, 0, 0, 950, 948, 1, 0, 0, 0, 950, 951, 1, 0, 0, 0, 951, 953, 1, 0, 0, 0, 952, 950, 1, 0, 0, 0, 953, 954, 6, 103, 0, 0, 954, 208, 1, 0, 0, 0, 955, 956, 5, 47, 0, 0, 956, 957, 5, 42, 0, 0, 957, 961, 1, 0, 0, 0, 958, 960, 9, 0, 0, 0, 959, 958, 1, 0, 0, 0, 960, 963, 1, 0, 0, 0, 961, 962, 1, 0, 0, 0, 961, 959, 1, 0, 0, 0, 962, 964, 1, 0, 0, 0, 963, 961, 1, 0, 0, 0, 964, 965, 5, 42, 0, 0, 965, 966, 5, 47, 0, 0, 966, 967, 1, 0, 0, 0, 967, 968, 6, 104, 0, 0, 968, 210, 1, 0, 0, 0, 969, 971, 7, 10, 0, 0, 970, 969, 1, 0, 0, 0, 971, 972, 1, 0, 0, 0, 972, 970, 1, 0, 0, 0, 972, 973, 1, 0, 0, 0, 973, 974, 1, 0, 0, 0, 974, 975, 6, 105, 0, 0, 975, 212, 1, 0, 0, 0, 18, 0, 876, 881, 884, 891, 894, 900, 902, 906, 911, 913, 919, 925, 927, 940, 950, 961, 972, 1, 0, 1, 0] \ No newline at end of file +[4, 0, 109, 1047, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 2, 108, 7, 108, 2, 109, 7, 109, 2, 110, 7, 110, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 91, 1, 91, 1, 92, 1, 92, 1, 93, 1, 93, 1, 94, 1, 94, 1, 95, 1, 95, 1, 96, 1, 96, 1, 97, 1, 97, 1, 98, 1, 98, 1, 99, 1, 99, 1, 100, 1, 100, 1, 101, 1, 101, 1, 102, 3, 102, 948, 8, 102, 1, 102, 4, 102, 951, 8, 102, 11, 102, 12, 102, 952, 1, 103, 3, 103, 956, 8, 103, 1, 103, 1, 103, 1, 103, 5, 103, 961, 8, 103, 10, 103, 12, 103, 964, 9, 103, 3, 103, 966, 8, 103, 1, 103, 1, 103, 4, 103, 970, 8, 103, 11, 103, 12, 103, 971, 3, 103, 974, 8, 103, 1, 103, 1, 103, 3, 103, 978, 8, 103, 1, 103, 4, 103, 981, 8, 103, 11, 103, 12, 103, 982, 3, 103, 985, 8, 103, 1, 104, 1, 104, 5, 104, 989, 8, 104, 10, 104, 12, 104, 992, 9, 104, 1, 105, 1, 105, 1, 105, 5, 105, 997, 8, 105, 10, 105, 12, 105, 1000, 9, 105, 1, 105, 1, 105, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 3, 106, 1012, 8, 106, 1, 107, 1, 107, 1, 108, 1, 108, 1, 108, 1, 108, 5, 108, 1020, 8, 108, 10, 108, 12, 108, 1023, 9, 108, 1, 108, 1, 108, 1, 109, 1, 109, 1, 109, 1, 109, 5, 109, 1031, 8, 109, 10, 109, 12, 109, 1034, 9, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 109, 1, 110, 4, 110, 1042, 8, 110, 11, 110, 12, 110, 1043, 1, 110, 1, 110, 1, 1032, 0, 111, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 29, 59, 30, 61, 31, 63, 32, 65, 33, 67, 34, 69, 35, 71, 36, 73, 37, 75, 38, 77, 39, 79, 40, 81, 41, 83, 42, 85, 43, 87, 44, 89, 45, 91, 46, 93, 47, 95, 48, 97, 49, 99, 50, 101, 51, 103, 52, 105, 53, 107, 54, 109, 55, 111, 56, 113, 57, 115, 58, 117, 59, 119, 60, 121, 61, 123, 62, 125, 63, 127, 64, 129, 65, 131, 66, 133, 67, 135, 68, 137, 69, 139, 70, 141, 71, 143, 72, 145, 73, 147, 74, 149, 75, 151, 76, 153, 77, 155, 78, 157, 79, 159, 80, 161, 81, 163, 82, 165, 83, 167, 84, 169, 85, 171, 86, 173, 87, 175, 88, 177, 89, 179, 90, 181, 91, 183, 92, 185, 93, 187, 94, 189, 95, 191, 96, 193, 97, 195, 98, 197, 99, 199, 100, 201, 101, 203, 102, 205, 103, 207, 104, 209, 105, 211, 106, 213, 0, 215, 0, 217, 107, 219, 108, 221, 109, 1, 0, 11, 1, 0, 48, 57, 1, 0, 49, 57, 2, 0, 69, 69, 101, 101, 2, 0, 43, 43, 45, 45, 3, 0, 65, 90, 95, 95, 97, 122, 4, 0, 48, 57, 65, 90, 95, 95, 97, 122, 4, 0, 10, 10, 13, 13, 34, 34, 92, 92, 8, 0, 34, 34, 47, 47, 92, 92, 98, 98, 102, 102, 110, 110, 114, 114, 116, 116, 3, 0, 48, 57, 65, 70, 97, 102, 2, 0, 10, 10, 13, 13, 3, 0, 9, 10, 13, 13, 32, 32, 1061, 0, 1, 1, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, 0, 0, 45, 1, 0, 0, 0, 0, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 53, 1, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 57, 1, 0, 0, 0, 0, 59, 1, 0, 0, 0, 0, 61, 1, 0, 0, 0, 0, 63, 1, 0, 0, 0, 0, 65, 1, 0, 0, 0, 0, 67, 1, 0, 0, 0, 0, 69, 1, 0, 0, 0, 0, 71, 1, 0, 0, 0, 0, 73, 1, 0, 0, 0, 0, 75, 1, 0, 0, 0, 0, 77, 1, 0, 0, 0, 0, 79, 1, 0, 0, 0, 0, 81, 1, 0, 0, 0, 0, 83, 1, 0, 0, 0, 0, 85, 1, 0, 0, 0, 0, 87, 1, 0, 0, 0, 0, 89, 1, 0, 0, 0, 0, 91, 1, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 95, 1, 0, 0, 0, 0, 97, 1, 0, 0, 0, 0, 99, 1, 0, 0, 0, 0, 101, 1, 0, 0, 0, 0, 103, 1, 0, 0, 0, 0, 105, 1, 0, 0, 0, 0, 107, 1, 0, 0, 0, 0, 109, 1, 0, 0, 0, 0, 111, 1, 0, 0, 0, 0, 113, 1, 0, 0, 0, 0, 115, 1, 0, 0, 0, 0, 117, 1, 0, 0, 0, 0, 119, 1, 0, 0, 0, 0, 121, 1, 0, 0, 0, 0, 123, 1, 0, 0, 0, 0, 125, 1, 0, 0, 0, 0, 127, 1, 0, 0, 0, 0, 129, 1, 0, 0, 0, 0, 131, 1, 0, 0, 0, 0, 133, 1, 0, 0, 0, 0, 135, 1, 0, 0, 0, 0, 137, 1, 0, 0, 0, 0, 139, 1, 0, 0, 0, 0, 141, 1, 0, 0, 0, 0, 143, 1, 0, 0, 0, 0, 145, 1, 0, 0, 0, 0, 147, 1, 0, 0, 0, 0, 149, 1, 0, 0, 0, 0, 151, 1, 0, 0, 0, 0, 153, 1, 0, 0, 0, 0, 155, 1, 0, 0, 0, 0, 157, 1, 0, 0, 0, 0, 159, 1, 0, 0, 0, 0, 161, 1, 0, 0, 0, 0, 163, 1, 0, 0, 0, 0, 165, 1, 0, 0, 0, 0, 167, 1, 0, 0, 0, 0, 169, 1, 0, 0, 0, 0, 171, 1, 0, 0, 0, 0, 173, 1, 0, 0, 0, 0, 175, 1, 0, 0, 0, 0, 177, 1, 0, 0, 0, 0, 179, 1, 0, 0, 0, 0, 181, 1, 0, 0, 0, 0, 183, 1, 0, 0, 0, 0, 185, 1, 0, 0, 0, 0, 187, 1, 0, 0, 0, 0, 189, 1, 0, 0, 0, 0, 191, 1, 0, 0, 0, 0, 193, 1, 0, 0, 0, 0, 195, 1, 0, 0, 0, 0, 197, 1, 0, 0, 0, 0, 199, 1, 0, 0, 0, 0, 201, 1, 0, 0, 0, 0, 203, 1, 0, 0, 0, 0, 205, 1, 0, 0, 0, 0, 207, 1, 0, 0, 0, 0, 209, 1, 0, 0, 0, 0, 211, 1, 0, 0, 0, 0, 217, 1, 0, 0, 0, 0, 219, 1, 0, 0, 0, 0, 221, 1, 0, 0, 0, 1, 223, 1, 0, 0, 0, 3, 233, 1, 0, 0, 0, 5, 242, 1, 0, 0, 0, 7, 249, 1, 0, 0, 0, 9, 258, 1, 0, 0, 0, 11, 263, 1, 0, 0, 0, 13, 273, 1, 0, 0, 0, 15, 284, 1, 0, 0, 0, 17, 292, 1, 0, 0, 0, 19, 298, 1, 0, 0, 0, 21, 307, 1, 0, 0, 0, 23, 317, 1, 0, 0, 0, 25, 326, 1, 0, 0, 0, 27, 338, 1, 0, 0, 0, 29, 349, 1, 0, 0, 0, 31, 355, 1, 0, 0, 0, 33, 363, 1, 0, 0, 0, 35, 366, 1, 0, 0, 0, 37, 371, 1, 0, 0, 0, 39, 374, 1, 0, 0, 0, 41, 382, 1, 0, 0, 0, 43, 389, 1, 0, 0, 0, 45, 395, 1, 0, 0, 0, 47, 400, 1, 0, 0, 0, 49, 411, 1, 0, 0, 0, 51, 416, 1, 0, 0, 0, 53, 422, 1, 0, 0, 0, 55, 426, 1, 0, 0, 0, 57, 438, 1, 0, 0, 0, 59, 441, 1, 0, 0, 0, 61, 448, 1, 0, 0, 0, 63, 451, 1, 0, 0, 0, 65, 458, 1, 0, 0, 0, 67, 466, 1, 0, 0, 0, 69, 473, 1, 0, 0, 0, 71, 484, 1, 0, 0, 0, 73, 491, 1, 0, 0, 0, 75, 500, 1, 0, 0, 0, 77, 515, 1, 0, 0, 0, 79, 525, 1, 0, 0, 0, 81, 538, 1, 0, 0, 0, 83, 544, 1, 0, 0, 0, 85, 561, 1, 0, 0, 0, 87, 564, 1, 0, 0, 0, 89, 568, 1, 0, 0, 0, 91, 573, 1, 0, 0, 0, 93, 579, 1, 0, 0, 0, 95, 588, 1, 0, 0, 0, 97, 597, 1, 0, 0, 0, 99, 601, 1, 0, 0, 0, 101, 605, 1, 0, 0, 0, 103, 609, 1, 0, 0, 0, 105, 615, 1, 0, 0, 0, 107, 621, 1, 0, 0, 0, 109, 626, 1, 0, 0, 0, 111, 631, 1, 0, 0, 0, 113, 637, 1, 0, 0, 0, 115, 645, 1, 0, 0, 0, 117, 653, 1, 0, 0, 0, 119, 664, 1, 0, 0, 0, 121, 669, 1, 0, 0, 0, 123, 681, 1, 0, 0, 0, 125, 692, 1, 0, 0, 0, 127, 702, 1, 0, 0, 0, 129, 714, 1, 0, 0, 0, 131, 734, 1, 0, 0, 0, 133, 739, 1, 0, 0, 0, 135, 752, 1, 0, 0, 0, 137, 764, 1, 0, 0, 0, 139, 776, 1, 0, 0, 0, 141, 781, 1, 0, 0, 0, 143, 789, 1, 0, 0, 0, 145, 794, 1, 0, 0, 0, 147, 807, 1, 0, 0, 0, 149, 815, 1, 0, 0, 0, 151, 824, 1, 0, 0, 0, 153, 838, 1, 0, 0, 0, 155, 847, 1, 0, 0, 0, 157, 852, 1, 0, 0, 0, 159, 857, 1, 0, 0, 0, 161, 863, 1, 0, 0, 0, 163, 870, 1, 0, 0, 0, 165, 876, 1, 0, 0, 0, 167, 882, 1, 0, 0, 0, 169, 889, 1, 0, 0, 0, 171, 896, 1, 0, 0, 0, 173, 903, 1, 0, 0, 0, 175, 908, 1, 0, 0, 0, 177, 914, 1, 0, 0, 0, 179, 919, 1, 0, 0, 0, 181, 922, 1, 0, 0, 0, 183, 924, 1, 0, 0, 0, 185, 926, 1, 0, 0, 0, 187, 928, 1, 0, 0, 0, 189, 930, 1, 0, 0, 0, 191, 932, 1, 0, 0, 0, 193, 934, 1, 0, 0, 0, 195, 936, 1, 0, 0, 0, 197, 938, 1, 0, 0, 0, 199, 940, 1, 0, 0, 0, 201, 942, 1, 0, 0, 0, 203, 944, 1, 0, 0, 0, 205, 947, 1, 0, 0, 0, 207, 955, 1, 0, 0, 0, 209, 986, 1, 0, 0, 0, 211, 993, 1, 0, 0, 0, 213, 1003, 1, 0, 0, 0, 215, 1013, 1, 0, 0, 0, 217, 1015, 1, 0, 0, 0, 219, 1026, 1, 0, 0, 0, 221, 1041, 1, 0, 0, 0, 223, 224, 5, 119, 0, 0, 224, 225, 5, 111, 0, 0, 225, 226, 5, 114, 0, 0, 226, 227, 5, 107, 0, 0, 227, 228, 5, 115, 0, 0, 228, 229, 5, 112, 0, 0, 229, 230, 5, 97, 0, 0, 230, 231, 5, 99, 0, 0, 231, 232, 5, 101, 0, 0, 232, 2, 1, 0, 0, 0, 233, 234, 5, 102, 0, 0, 234, 235, 5, 114, 0, 0, 235, 236, 5, 97, 0, 0, 236, 237, 5, 103, 0, 0, 237, 238, 5, 109, 0, 0, 238, 239, 5, 101, 0, 0, 239, 240, 5, 110, 0, 0, 240, 241, 5, 116, 0, 0, 241, 4, 1, 0, 0, 0, 242, 243, 5, 105, 0, 0, 243, 244, 5, 109, 0, 0, 244, 245, 5, 112, 0, 0, 245, 246, 5, 111, 0, 0, 246, 247, 5, 114, 0, 0, 247, 248, 5, 116, 0, 0, 248, 6, 1, 0, 0, 0, 249, 250, 5, 101, 0, 0, 250, 251, 5, 120, 0, 0, 251, 252, 5, 116, 0, 0, 252, 253, 5, 101, 0, 0, 253, 254, 5, 114, 0, 0, 254, 255, 5, 110, 0, 0, 255, 256, 5, 97, 0, 0, 256, 257, 5, 108, 0, 0, 257, 8, 1, 0, 0, 0, 258, 259, 5, 97, 0, 0, 259, 260, 5, 116, 0, 0, 260, 261, 5, 111, 0, 0, 261, 262, 5, 109, 0, 0, 262, 10, 1, 0, 0, 0, 263, 264, 5, 105, 0, 0, 264, 265, 5, 110, 0, 0, 265, 266, 5, 116, 0, 0, 266, 267, 5, 101, 0, 0, 267, 268, 5, 114, 0, 0, 268, 269, 5, 102, 0, 0, 269, 270, 5, 97, 0, 0, 270, 271, 5, 99, 0, 0, 271, 272, 5, 101, 0, 0, 272, 12, 1, 0, 0, 0, 273, 274, 5, 105, 0, 0, 274, 275, 5, 110, 0, 0, 275, 276, 5, 116, 0, 0, 276, 277, 5, 101, 0, 0, 277, 278, 5, 114, 0, 0, 278, 279, 5, 102, 0, 0, 279, 280, 5, 97, 0, 0, 280, 281, 5, 99, 0, 0, 281, 282, 5, 101, 0, 0, 282, 283, 5, 115, 0, 0, 283, 14, 1, 0, 0, 0, 284, 285, 5, 112, 0, 0, 285, 286, 5, 97, 0, 0, 286, 287, 5, 99, 0, 0, 287, 288, 5, 107, 0, 0, 288, 289, 5, 97, 0, 0, 289, 290, 5, 103, 0, 0, 290, 291, 5, 101, 0, 0, 291, 16, 1, 0, 0, 0, 292, 293, 5, 118, 0, 0, 293, 294, 5, 97, 0, 0, 294, 295, 5, 108, 0, 0, 295, 296, 5, 117, 0, 0, 296, 297, 5, 101, 0, 0, 297, 18, 1, 0, 0, 0, 298, 299, 5, 114, 0, 0, 299, 300, 5, 101, 0, 0, 300, 301, 5, 108, 0, 0, 301, 302, 5, 97, 0, 0, 302, 303, 5, 116, 0, 0, 303, 304, 5, 105, 0, 0, 304, 305, 5, 111, 0, 0, 305, 306, 5, 110, 0, 0, 306, 20, 1, 0, 0, 0, 307, 308, 5, 111, 0, 0, 308, 309, 5, 112, 0, 0, 309, 310, 5, 101, 0, 0, 310, 311, 5, 114, 0, 0, 311, 312, 5, 97, 0, 0, 312, 313, 5, 116, 0, 0, 313, 314, 5, 105, 0, 0, 314, 315, 5, 111, 0, 0, 315, 316, 5, 110, 0, 0, 316, 22, 1, 0, 0, 0, 317, 318, 5, 102, 0, 0, 318, 319, 5, 117, 0, 0, 319, 320, 5, 110, 0, 0, 320, 321, 5, 99, 0, 0, 321, 322, 5, 116, 0, 0, 322, 323, 5, 105, 0, 0, 323, 324, 5, 111, 0, 0, 324, 325, 5, 110, 0, 0, 325, 24, 1, 0, 0, 0, 326, 327, 5, 99, 0, 0, 327, 328, 5, 111, 0, 0, 328, 329, 5, 110, 0, 0, 329, 330, 5, 115, 0, 0, 330, 331, 5, 116, 0, 0, 331, 332, 5, 114, 0, 0, 332, 333, 5, 117, 0, 0, 333, 334, 5, 99, 0, 0, 334, 335, 5, 116, 0, 0, 335, 336, 5, 111, 0, 0, 336, 337, 5, 114, 0, 0, 337, 26, 1, 0, 0, 0, 338, 339, 5, 99, 0, 0, 339, 340, 5, 111, 0, 0, 340, 341, 5, 110, 0, 0, 341, 342, 5, 115, 0, 0, 342, 343, 5, 116, 0, 0, 343, 344, 5, 114, 0, 0, 344, 345, 5, 117, 0, 0, 345, 346, 5, 99, 0, 0, 346, 347, 5, 116, 0, 0, 347, 348, 5, 115, 0, 0, 348, 28, 1, 0, 0, 0, 349, 350, 5, 105, 0, 0, 350, 351, 5, 110, 0, 0, 351, 352, 5, 112, 0, 0, 352, 353, 5, 117, 0, 0, 353, 354, 5, 116, 0, 0, 354, 30, 1, 0, 0, 0, 355, 356, 5, 99, 0, 0, 356, 357, 5, 111, 0, 0, 357, 358, 5, 110, 0, 0, 358, 359, 5, 102, 0, 0, 359, 360, 5, 111, 0, 0, 360, 361, 5, 114, 0, 0, 361, 362, 5, 109, 0, 0, 362, 32, 1, 0, 0, 0, 363, 364, 5, 97, 0, 0, 364, 365, 5, 115, 0, 0, 365, 34, 1, 0, 0, 0, 366, 367, 5, 98, 0, 0, 367, 368, 5, 105, 0, 0, 368, 369, 5, 110, 0, 0, 369, 370, 5, 100, 0, 0, 370, 36, 1, 0, 0, 0, 371, 372, 5, 116, 0, 0, 372, 373, 5, 111, 0, 0, 373, 38, 1, 0, 0, 0, 374, 375, 5, 112, 0, 0, 375, 376, 5, 114, 0, 0, 376, 377, 5, 105, 0, 0, 377, 378, 5, 118, 0, 0, 378, 379, 5, 97, 0, 0, 379, 380, 5, 116, 0, 0, 380, 381, 5, 101, 0, 0, 381, 40, 1, 0, 0, 0, 382, 383, 5, 115, 0, 0, 383, 384, 5, 104, 0, 0, 384, 385, 5, 97, 0, 0, 385, 386, 5, 114, 0, 0, 386, 387, 5, 101, 0, 0, 387, 388, 5, 100, 0, 0, 388, 42, 1, 0, 0, 0, 389, 390, 5, 115, 0, 0, 390, 391, 5, 116, 0, 0, 391, 392, 5, 97, 0, 0, 392, 393, 5, 116, 0, 0, 393, 394, 5, 101, 0, 0, 394, 44, 1, 0, 0, 0, 395, 396, 5, 101, 0, 0, 396, 397, 5, 100, 0, 0, 397, 398, 5, 103, 0, 0, 398, 399, 5, 101, 0, 0, 399, 46, 1, 0, 0, 0, 400, 401, 5, 112, 0, 0, 401, 402, 5, 114, 0, 0, 402, 403, 5, 111, 0, 0, 403, 404, 5, 106, 0, 0, 404, 405, 5, 101, 0, 0, 405, 406, 5, 99, 0, 0, 406, 407, 5, 116, 0, 0, 407, 408, 5, 105, 0, 0, 408, 409, 5, 111, 0, 0, 409, 410, 5, 110, 0, 0, 410, 48, 1, 0, 0, 0, 411, 412, 5, 119, 0, 0, 412, 413, 5, 105, 0, 0, 413, 414, 5, 116, 0, 0, 414, 415, 5, 104, 0, 0, 415, 50, 1, 0, 0, 0, 416, 417, 5, 117, 0, 0, 417, 418, 5, 115, 0, 0, 418, 419, 5, 105, 0, 0, 419, 420, 5, 110, 0, 0, 420, 421, 5, 103, 0, 0, 421, 52, 1, 0, 0, 0, 422, 423, 5, 118, 0, 0, 423, 424, 5, 105, 0, 0, 424, 425, 5, 97, 0, 0, 425, 54, 1, 0, 0, 0, 426, 427, 5, 109, 0, 0, 427, 428, 5, 97, 0, 0, 428, 429, 5, 116, 0, 0, 429, 430, 5, 101, 0, 0, 430, 431, 5, 114, 0, 0, 431, 432, 5, 105, 0, 0, 432, 433, 5, 97, 0, 0, 433, 434, 5, 108, 0, 0, 434, 435, 5, 105, 0, 0, 435, 436, 5, 122, 0, 0, 436, 437, 5, 101, 0, 0, 437, 56, 1, 0, 0, 0, 438, 439, 5, 105, 0, 0, 439, 440, 5, 102, 0, 0, 440, 58, 1, 0, 0, 0, 441, 442, 5, 97, 0, 0, 442, 443, 5, 98, 0, 0, 443, 444, 5, 115, 0, 0, 444, 445, 5, 101, 0, 0, 445, 446, 5, 110, 0, 0, 446, 447, 5, 116, 0, 0, 447, 60, 1, 0, 0, 0, 448, 449, 5, 111, 0, 0, 449, 450, 5, 110, 0, 0, 450, 62, 1, 0, 0, 0, 451, 452, 5, 112, 0, 0, 452, 453, 5, 111, 0, 0, 453, 454, 5, 108, 0, 0, 454, 455, 5, 105, 0, 0, 455, 456, 5, 99, 0, 0, 456, 457, 5, 121, 0, 0, 457, 64, 1, 0, 0, 0, 458, 459, 5, 100, 0, 0, 459, 460, 5, 101, 0, 0, 460, 461, 5, 102, 0, 0, 461, 462, 5, 97, 0, 0, 462, 463, 5, 117, 0, 0, 463, 464, 5, 108, 0, 0, 464, 465, 5, 116, 0, 0, 465, 66, 1, 0, 0, 0, 466, 467, 5, 115, 0, 0, 467, 468, 5, 111, 0, 0, 468, 469, 5, 117, 0, 0, 469, 470, 5, 114, 0, 0, 470, 471, 5, 99, 0, 0, 471, 472, 5, 101, 0, 0, 472, 68, 1, 0, 0, 0, 473, 474, 5, 114, 0, 0, 474, 475, 5, 101, 0, 0, 475, 476, 5, 112, 0, 0, 476, 477, 5, 111, 0, 0, 477, 478, 5, 115, 0, 0, 478, 479, 5, 105, 0, 0, 479, 480, 5, 116, 0, 0, 480, 481, 5, 111, 0, 0, 481, 482, 5, 114, 0, 0, 482, 483, 5, 121, 0, 0, 483, 70, 1, 0, 0, 0, 484, 485, 5, 99, 0, 0, 485, 486, 5, 111, 0, 0, 486, 487, 5, 109, 0, 0, 487, 488, 5, 109, 0, 0, 488, 489, 5, 105, 0, 0, 489, 490, 5, 116, 0, 0, 490, 72, 1, 0, 0, 0, 491, 492, 5, 114, 0, 0, 492, 493, 5, 101, 0, 0, 493, 494, 5, 118, 0, 0, 494, 495, 5, 105, 0, 0, 495, 496, 5, 115, 0, 0, 496, 497, 5, 105, 0, 0, 497, 498, 5, 111, 0, 0, 498, 499, 5, 110, 0, 0, 499, 74, 1, 0, 0, 0, 500, 501, 5, 115, 0, 0, 501, 502, 5, 101, 0, 0, 502, 503, 5, 109, 0, 0, 503, 504, 5, 97, 0, 0, 504, 505, 5, 110, 0, 0, 505, 506, 5, 116, 0, 0, 506, 507, 5, 105, 0, 0, 507, 508, 5, 99, 0, 0, 508, 509, 5, 45, 0, 0, 509, 510, 5, 109, 0, 0, 510, 511, 5, 97, 0, 0, 511, 512, 5, 106, 0, 0, 512, 513, 5, 111, 0, 0, 513, 514, 5, 114, 0, 0, 514, 76, 1, 0, 0, 0, 515, 516, 5, 111, 0, 0, 516, 517, 5, 110, 0, 0, 517, 518, 5, 45, 0, 0, 518, 519, 5, 100, 0, 0, 519, 520, 5, 101, 0, 0, 520, 521, 5, 108, 0, 0, 521, 522, 5, 101, 0, 0, 522, 523, 5, 116, 0, 0, 523, 524, 5, 101, 0, 0, 524, 78, 1, 0, 0, 0, 525, 526, 5, 114, 0, 0, 526, 527, 5, 101, 0, 0, 527, 528, 5, 116, 0, 0, 528, 529, 5, 97, 0, 0, 529, 530, 5, 105, 0, 0, 530, 531, 5, 110, 0, 0, 531, 532, 5, 45, 0, 0, 532, 533, 5, 111, 0, 0, 533, 534, 5, 116, 0, 0, 534, 535, 5, 104, 0, 0, 535, 536, 5, 101, 0, 0, 536, 537, 5, 114, 0, 0, 537, 80, 1, 0, 0, 0, 538, 539, 5, 107, 0, 0, 539, 540, 5, 101, 0, 0, 540, 541, 5, 121, 0, 0, 541, 542, 5, 101, 0, 0, 542, 543, 5, 100, 0, 0, 543, 82, 1, 0, 0, 0, 544, 545, 5, 112, 0, 0, 545, 546, 5, 117, 0, 0, 546, 547, 5, 98, 0, 0, 547, 548, 5, 108, 0, 0, 548, 549, 5, 105, 0, 0, 549, 550, 5, 99, 0, 0, 550, 551, 5, 45, 0, 0, 551, 552, 5, 116, 0, 0, 552, 553, 5, 114, 0, 0, 553, 554, 5, 97, 0, 0, 554, 555, 5, 118, 0, 0, 555, 556, 5, 101, 0, 0, 556, 557, 5, 114, 0, 0, 557, 558, 5, 115, 0, 0, 558, 559, 5, 97, 0, 0, 559, 560, 5, 108, 0, 0, 560, 84, 1, 0, 0, 0, 561, 562, 5, 105, 0, 0, 562, 563, 5, 100, 0, 0, 563, 86, 1, 0, 0, 0, 564, 565, 5, 100, 0, 0, 565, 566, 5, 111, 0, 0, 566, 567, 5, 99, 0, 0, 567, 88, 1, 0, 0, 0, 568, 569, 5, 109, 0, 0, 569, 570, 5, 111, 0, 0, 570, 571, 5, 100, 0, 0, 571, 572, 5, 101, 0, 0, 572, 90, 1, 0, 0, 0, 573, 574, 5, 101, 0, 0, 574, 575, 5, 109, 0, 0, 575, 576, 5, 105, 0, 0, 576, 577, 5, 116, 0, 0, 577, 578, 5, 115, 0, 0, 578, 92, 1, 0, 0, 0, 579, 580, 5, 114, 0, 0, 580, 581, 5, 101, 0, 0, 581, 582, 5, 99, 0, 0, 582, 583, 5, 101, 0, 0, 583, 584, 5, 105, 0, 0, 584, 585, 5, 118, 0, 0, 585, 586, 5, 101, 0, 0, 586, 587, 5, 114, 0, 0, 587, 94, 1, 0, 0, 0, 588, 589, 5, 114, 0, 0, 589, 590, 5, 101, 0, 0, 590, 591, 5, 113, 0, 0, 591, 592, 5, 117, 0, 0, 592, 593, 5, 105, 0, 0, 593, 594, 5, 114, 0, 0, 594, 595, 5, 101, 0, 0, 595, 596, 5, 115, 0, 0, 596, 96, 1, 0, 0, 0, 597, 598, 5, 97, 0, 0, 598, 599, 5, 110, 0, 0, 599, 600, 5, 121, 0, 0, 600, 98, 1, 0, 0, 0, 601, 602, 5, 103, 0, 0, 602, 603, 5, 101, 0, 0, 603, 604, 5, 116, 0, 0, 604, 100, 1, 0, 0, 0, 605, 606, 5, 115, 0, 0, 606, 607, 5, 101, 0, 0, 607, 608, 5, 116, 0, 0, 608, 102, 1, 0, 0, 0, 609, 610, 5, 119, 0, 0, 610, 611, 5, 97, 0, 0, 611, 612, 5, 116, 0, 0, 612, 613, 5, 99, 0, 0, 613, 614, 5, 104, 0, 0, 614, 104, 1, 0, 0, 0, 615, 616, 5, 115, 0, 0, 616, 617, 5, 116, 0, 0, 617, 618, 5, 97, 0, 0, 618, 619, 5, 114, 0, 0, 619, 620, 5, 116, 0, 0, 620, 106, 1, 0, 0, 0, 621, 622, 5, 115, 0, 0, 622, 623, 5, 116, 0, 0, 623, 624, 5, 111, 0, 0, 624, 625, 5, 112, 0, 0, 625, 108, 1, 0, 0, 0, 626, 627, 5, 114, 0, 0, 627, 628, 5, 101, 0, 0, 628, 629, 5, 97, 0, 0, 629, 630, 5, 100, 0, 0, 630, 110, 1, 0, 0, 0, 631, 632, 5, 119, 0, 0, 632, 633, 5, 114, 0, 0, 633, 634, 5, 105, 0, 0, 634, 635, 5, 116, 0, 0, 635, 636, 5, 101, 0, 0, 636, 112, 1, 0, 0, 0, 637, 638, 5, 114, 0, 0, 638, 639, 5, 101, 0, 0, 639, 640, 5, 115, 0, 0, 640, 641, 5, 111, 0, 0, 641, 642, 5, 108, 0, 0, 642, 643, 5, 118, 0, 0, 643, 644, 5, 101, 0, 0, 644, 114, 1, 0, 0, 0, 645, 646, 5, 99, 0, 0, 646, 647, 5, 111, 0, 0, 647, 648, 5, 110, 0, 0, 648, 649, 5, 110, 0, 0, 649, 650, 5, 101, 0, 0, 650, 651, 5, 99, 0, 0, 651, 652, 5, 116, 0, 0, 652, 116, 1, 0, 0, 0, 653, 654, 5, 100, 0, 0, 654, 655, 5, 105, 0, 0, 655, 656, 5, 115, 0, 0, 656, 657, 5, 99, 0, 0, 657, 658, 5, 111, 0, 0, 658, 659, 5, 110, 0, 0, 659, 660, 5, 110, 0, 0, 660, 661, 5, 101, 0, 0, 661, 662, 5, 99, 0, 0, 662, 663, 5, 116, 0, 0, 663, 118, 1, 0, 0, 0, 664, 665, 5, 99, 0, 0, 665, 666, 5, 97, 0, 0, 666, 667, 5, 108, 0, 0, 667, 668, 5, 108, 0, 0, 668, 120, 1, 0, 0, 0, 669, 670, 5, 119, 0, 0, 670, 671, 5, 97, 0, 0, 671, 672, 5, 116, 0, 0, 672, 673, 5, 99, 0, 0, 673, 674, 5, 104, 0, 0, 674, 675, 5, 45, 0, 0, 675, 676, 5, 115, 0, 0, 676, 677, 5, 116, 0, 0, 677, 678, 5, 97, 0, 0, 678, 679, 5, 114, 0, 0, 679, 680, 5, 116, 0, 0, 680, 122, 1, 0, 0, 0, 681, 682, 5, 119, 0, 0, 682, 683, 5, 97, 0, 0, 683, 684, 5, 116, 0, 0, 684, 685, 5, 99, 0, 0, 685, 686, 5, 104, 0, 0, 686, 687, 5, 45, 0, 0, 687, 688, 5, 115, 0, 0, 688, 689, 5, 116, 0, 0, 689, 690, 5, 111, 0, 0, 690, 691, 5, 112, 0, 0, 691, 124, 1, 0, 0, 0, 692, 693, 5, 115, 0, 0, 693, 694, 5, 117, 0, 0, 694, 695, 5, 98, 0, 0, 695, 696, 5, 115, 0, 0, 696, 697, 5, 99, 0, 0, 697, 698, 5, 114, 0, 0, 698, 699, 5, 105, 0, 0, 699, 700, 5, 98, 0, 0, 700, 701, 5, 101, 0, 0, 701, 126, 1, 0, 0, 0, 702, 703, 5, 117, 0, 0, 703, 704, 5, 110, 0, 0, 704, 705, 5, 115, 0, 0, 705, 706, 5, 117, 0, 0, 706, 707, 5, 98, 0, 0, 707, 708, 5, 115, 0, 0, 708, 709, 5, 99, 0, 0, 709, 710, 5, 114, 0, 0, 710, 711, 5, 105, 0, 0, 711, 712, 5, 98, 0, 0, 712, 713, 5, 101, 0, 0, 713, 128, 1, 0, 0, 0, 714, 715, 5, 111, 0, 0, 715, 716, 5, 112, 0, 0, 716, 717, 5, 116, 0, 0, 717, 718, 5, 105, 0, 0, 718, 719, 5, 109, 0, 0, 719, 720, 5, 105, 0, 0, 720, 721, 5, 115, 0, 0, 721, 722, 5, 116, 0, 0, 722, 723, 5, 105, 0, 0, 723, 724, 5, 99, 0, 0, 724, 725, 5, 45, 0, 0, 725, 726, 5, 114, 0, 0, 726, 727, 5, 101, 0, 0, 727, 728, 5, 103, 0, 0, 728, 729, 5, 105, 0, 0, 729, 730, 5, 115, 0, 0, 730, 731, 5, 116, 0, 0, 731, 732, 5, 101, 0, 0, 732, 733, 5, 114, 0, 0, 733, 130, 1, 0, 0, 0, 734, 735, 5, 99, 0, 0, 735, 736, 5, 114, 0, 0, 736, 737, 5, 100, 0, 0, 737, 738, 5, 116, 0, 0, 738, 132, 1, 0, 0, 0, 739, 740, 5, 111, 0, 0, 740, 741, 5, 112, 0, 0, 741, 742, 5, 116, 0, 0, 742, 743, 5, 105, 0, 0, 743, 744, 5, 111, 0, 0, 744, 745, 5, 110, 0, 0, 745, 746, 5, 97, 0, 0, 746, 747, 5, 108, 0, 0, 747, 748, 5, 45, 0, 0, 748, 749, 5, 111, 0, 0, 749, 750, 5, 110, 0, 0, 750, 751, 5, 101, 0, 0, 751, 134, 1, 0, 0, 0, 752, 753, 5, 101, 0, 0, 753, 754, 5, 120, 0, 0, 754, 755, 5, 97, 0, 0, 755, 756, 5, 99, 0, 0, 756, 757, 5, 116, 0, 0, 757, 758, 5, 108, 0, 0, 758, 759, 5, 121, 0, 0, 759, 760, 5, 45, 0, 0, 760, 761, 5, 111, 0, 0, 761, 762, 5, 110, 0, 0, 762, 763, 5, 101, 0, 0, 763, 136, 1, 0, 0, 0, 764, 765, 5, 109, 0, 0, 765, 766, 5, 97, 0, 0, 766, 767, 5, 110, 0, 0, 767, 768, 5, 121, 0, 0, 768, 769, 5, 45, 0, 0, 769, 770, 5, 117, 0, 0, 770, 771, 5, 110, 0, 0, 771, 772, 5, 105, 0, 0, 772, 773, 5, 113, 0, 0, 773, 774, 5, 117, 0, 0, 774, 775, 5, 101, 0, 0, 775, 138, 1, 0, 0, 0, 776, 777, 5, 109, 0, 0, 777, 778, 5, 97, 0, 0, 778, 779, 5, 110, 0, 0, 779, 780, 5, 121, 0, 0, 780, 140, 1, 0, 0, 0, 781, 782, 5, 111, 0, 0, 782, 783, 5, 114, 0, 0, 783, 784, 5, 100, 0, 0, 784, 785, 5, 101, 0, 0, 785, 786, 5, 114, 0, 0, 786, 787, 5, 101, 0, 0, 787, 788, 5, 100, 0, 0, 788, 142, 1, 0, 0, 0, 789, 790, 5, 117, 0, 0, 790, 791, 5, 110, 0, 0, 791, 792, 5, 105, 0, 0, 792, 793, 5, 116, 0, 0, 793, 144, 1, 0, 0, 0, 794, 795, 5, 119, 0, 0, 795, 796, 5, 97, 0, 0, 796, 797, 5, 116, 0, 0, 797, 798, 5, 99, 0, 0, 798, 799, 5, 104, 0, 0, 799, 800, 5, 45, 0, 0, 800, 801, 5, 104, 0, 0, 801, 802, 5, 97, 0, 0, 802, 803, 5, 110, 0, 0, 803, 804, 5, 100, 0, 0, 804, 805, 5, 108, 0, 0, 805, 806, 5, 101, 0, 0, 806, 146, 1, 0, 0, 0, 807, 808, 5, 109, 0, 0, 808, 809, 5, 101, 0, 0, 809, 810, 5, 115, 0, 0, 810, 811, 5, 115, 0, 0, 811, 812, 5, 97, 0, 0, 812, 813, 5, 103, 0, 0, 813, 814, 5, 101, 0, 0, 814, 148, 1, 0, 0, 0, 815, 816, 5, 97, 0, 0, 816, 817, 5, 116, 0, 0, 817, 818, 5, 111, 0, 0, 818, 819, 5, 109, 0, 0, 819, 820, 5, 45, 0, 0, 820, 821, 5, 114, 0, 0, 821, 822, 5, 101, 0, 0, 822, 823, 5, 102, 0, 0, 823, 150, 1, 0, 0, 0, 824, 825, 5, 105, 0, 0, 825, 826, 5, 110, 0, 0, 826, 827, 5, 116, 0, 0, 827, 828, 5, 101, 0, 0, 828, 829, 5, 114, 0, 0, 829, 830, 5, 102, 0, 0, 830, 831, 5, 97, 0, 0, 831, 832, 5, 99, 0, 0, 832, 833, 5, 101, 0, 0, 833, 834, 5, 45, 0, 0, 834, 835, 5, 114, 0, 0, 835, 836, 5, 101, 0, 0, 836, 837, 5, 102, 0, 0, 837, 152, 1, 0, 0, 0, 838, 839, 5, 111, 0, 0, 839, 840, 5, 112, 0, 0, 840, 841, 5, 116, 0, 0, 841, 842, 5, 105, 0, 0, 842, 843, 5, 111, 0, 0, 843, 844, 5, 110, 0, 0, 844, 845, 5, 97, 0, 0, 845, 846, 5, 108, 0, 0, 846, 154, 1, 0, 0, 0, 847, 848, 5, 108, 0, 0, 848, 849, 5, 105, 0, 0, 849, 850, 5, 115, 0, 0, 850, 851, 5, 116, 0, 0, 851, 156, 1, 0, 0, 0, 852, 853, 5, 98, 0, 0, 853, 854, 5, 111, 0, 0, 854, 855, 5, 111, 0, 0, 855, 856, 5, 108, 0, 0, 856, 158, 1, 0, 0, 0, 857, 858, 5, 98, 0, 0, 858, 859, 5, 121, 0, 0, 859, 860, 5, 116, 0, 0, 860, 861, 5, 101, 0, 0, 861, 862, 5, 115, 0, 0, 862, 160, 1, 0, 0, 0, 863, 864, 5, 100, 0, 0, 864, 865, 5, 111, 0, 0, 865, 866, 5, 117, 0, 0, 866, 867, 5, 98, 0, 0, 867, 868, 5, 108, 0, 0, 868, 869, 5, 101, 0, 0, 869, 162, 1, 0, 0, 0, 870, 871, 5, 105, 0, 0, 871, 872, 5, 110, 0, 0, 872, 873, 5, 116, 0, 0, 873, 874, 5, 51, 0, 0, 874, 875, 5, 50, 0, 0, 875, 164, 1, 0, 0, 0, 876, 877, 5, 105, 0, 0, 877, 878, 5, 110, 0, 0, 878, 879, 5, 116, 0, 0, 879, 880, 5, 54, 0, 0, 880, 881, 5, 52, 0, 0, 881, 166, 1, 0, 0, 0, 882, 883, 5, 115, 0, 0, 883, 884, 5, 116, 0, 0, 884, 885, 5, 114, 0, 0, 885, 886, 5, 105, 0, 0, 886, 887, 5, 110, 0, 0, 887, 888, 5, 103, 0, 0, 888, 168, 1, 0, 0, 0, 889, 890, 5, 117, 0, 0, 890, 891, 5, 105, 0, 0, 891, 892, 5, 110, 0, 0, 892, 893, 5, 116, 0, 0, 893, 894, 5, 51, 0, 0, 894, 895, 5, 50, 0, 0, 895, 170, 1, 0, 0, 0, 896, 897, 5, 117, 0, 0, 897, 898, 5, 105, 0, 0, 898, 899, 5, 110, 0, 0, 899, 900, 5, 116, 0, 0, 900, 901, 5, 54, 0, 0, 901, 902, 5, 52, 0, 0, 902, 172, 1, 0, 0, 0, 903, 904, 5, 116, 0, 0, 904, 905, 5, 114, 0, 0, 905, 906, 5, 117, 0, 0, 906, 907, 5, 101, 0, 0, 907, 174, 1, 0, 0, 0, 908, 909, 5, 102, 0, 0, 909, 910, 5, 97, 0, 0, 910, 911, 5, 108, 0, 0, 911, 912, 5, 115, 0, 0, 912, 913, 5, 101, 0, 0, 913, 176, 1, 0, 0, 0, 914, 915, 5, 110, 0, 0, 915, 916, 5, 117, 0, 0, 916, 917, 5, 108, 0, 0, 917, 918, 5, 108, 0, 0, 918, 178, 1, 0, 0, 0, 919, 920, 5, 45, 0, 0, 920, 921, 5, 62, 0, 0, 921, 180, 1, 0, 0, 0, 922, 923, 5, 58, 0, 0, 923, 182, 1, 0, 0, 0, 924, 925, 5, 59, 0, 0, 925, 184, 1, 0, 0, 0, 926, 927, 5, 44, 0, 0, 927, 186, 1, 0, 0, 0, 928, 929, 5, 46, 0, 0, 929, 188, 1, 0, 0, 0, 930, 931, 5, 123, 0, 0, 931, 190, 1, 0, 0, 0, 932, 933, 5, 125, 0, 0, 933, 192, 1, 0, 0, 0, 934, 935, 5, 91, 0, 0, 935, 194, 1, 0, 0, 0, 936, 937, 5, 93, 0, 0, 937, 196, 1, 0, 0, 0, 938, 939, 5, 40, 0, 0, 939, 198, 1, 0, 0, 0, 940, 941, 5, 41, 0, 0, 941, 200, 1, 0, 0, 0, 942, 943, 5, 60, 0, 0, 943, 202, 1, 0, 0, 0, 944, 945, 5, 62, 0, 0, 945, 204, 1, 0, 0, 0, 946, 948, 5, 45, 0, 0, 947, 946, 1, 0, 0, 0, 947, 948, 1, 0, 0, 0, 948, 950, 1, 0, 0, 0, 949, 951, 7, 0, 0, 0, 950, 949, 1, 0, 0, 0, 951, 952, 1, 0, 0, 0, 952, 950, 1, 0, 0, 0, 952, 953, 1, 0, 0, 0, 953, 206, 1, 0, 0, 0, 954, 956, 5, 45, 0, 0, 955, 954, 1, 0, 0, 0, 955, 956, 1, 0, 0, 0, 956, 965, 1, 0, 0, 0, 957, 966, 5, 48, 0, 0, 958, 962, 7, 1, 0, 0, 959, 961, 7, 0, 0, 0, 960, 959, 1, 0, 0, 0, 961, 964, 1, 0, 0, 0, 962, 960, 1, 0, 0, 0, 962, 963, 1, 0, 0, 0, 963, 966, 1, 0, 0, 0, 964, 962, 1, 0, 0, 0, 965, 957, 1, 0, 0, 0, 965, 958, 1, 0, 0, 0, 966, 973, 1, 0, 0, 0, 967, 969, 5, 46, 0, 0, 968, 970, 7, 0, 0, 0, 969, 968, 1, 0, 0, 0, 970, 971, 1, 0, 0, 0, 971, 969, 1, 0, 0, 0, 971, 972, 1, 0, 0, 0, 972, 974, 1, 0, 0, 0, 973, 967, 1, 0, 0, 0, 973, 974, 1, 0, 0, 0, 974, 984, 1, 0, 0, 0, 975, 977, 7, 2, 0, 0, 976, 978, 7, 3, 0, 0, 977, 976, 1, 0, 0, 0, 977, 978, 1, 0, 0, 0, 978, 980, 1, 0, 0, 0, 979, 981, 7, 0, 0, 0, 980, 979, 1, 0, 0, 0, 981, 982, 1, 0, 0, 0, 982, 980, 1, 0, 0, 0, 982, 983, 1, 0, 0, 0, 983, 985, 1, 0, 0, 0, 984, 975, 1, 0, 0, 0, 984, 985, 1, 0, 0, 0, 985, 208, 1, 0, 0, 0, 986, 990, 7, 4, 0, 0, 987, 989, 7, 5, 0, 0, 988, 987, 1, 0, 0, 0, 989, 992, 1, 0, 0, 0, 990, 988, 1, 0, 0, 0, 990, 991, 1, 0, 0, 0, 991, 210, 1, 0, 0, 0, 992, 990, 1, 0, 0, 0, 993, 998, 5, 34, 0, 0, 994, 997, 3, 213, 106, 0, 995, 997, 8, 6, 0, 0, 996, 994, 1, 0, 0, 0, 996, 995, 1, 0, 0, 0, 997, 1000, 1, 0, 0, 0, 998, 996, 1, 0, 0, 0, 998, 999, 1, 0, 0, 0, 999, 1001, 1, 0, 0, 0, 1000, 998, 1, 0, 0, 0, 1001, 1002, 5, 34, 0, 0, 1002, 212, 1, 0, 0, 0, 1003, 1011, 5, 92, 0, 0, 1004, 1012, 7, 7, 0, 0, 1005, 1006, 5, 117, 0, 0, 1006, 1007, 3, 215, 107, 0, 1007, 1008, 3, 215, 107, 0, 1008, 1009, 3, 215, 107, 0, 1009, 1010, 3, 215, 107, 0, 1010, 1012, 1, 0, 0, 0, 1011, 1004, 1, 0, 0, 0, 1011, 1005, 1, 0, 0, 0, 1012, 214, 1, 0, 0, 0, 1013, 1014, 7, 8, 0, 0, 1014, 216, 1, 0, 0, 0, 1015, 1016, 5, 47, 0, 0, 1016, 1017, 5, 47, 0, 0, 1017, 1021, 1, 0, 0, 0, 1018, 1020, 8, 9, 0, 0, 1019, 1018, 1, 0, 0, 0, 1020, 1023, 1, 0, 0, 0, 1021, 1019, 1, 0, 0, 0, 1021, 1022, 1, 0, 0, 0, 1022, 1024, 1, 0, 0, 0, 1023, 1021, 1, 0, 0, 0, 1024, 1025, 6, 108, 0, 0, 1025, 218, 1, 0, 0, 0, 1026, 1027, 5, 47, 0, 0, 1027, 1028, 5, 42, 0, 0, 1028, 1032, 1, 0, 0, 0, 1029, 1031, 9, 0, 0, 0, 1030, 1029, 1, 0, 0, 0, 1031, 1034, 1, 0, 0, 0, 1032, 1033, 1, 0, 0, 0, 1032, 1030, 1, 0, 0, 0, 1033, 1035, 1, 0, 0, 0, 1034, 1032, 1, 0, 0, 0, 1035, 1036, 5, 42, 0, 0, 1036, 1037, 5, 47, 0, 0, 1037, 1038, 1, 0, 0, 0, 1038, 1039, 6, 109, 0, 0, 1039, 220, 1, 0, 0, 0, 1040, 1042, 7, 10, 0, 0, 1041, 1040, 1, 0, 0, 0, 1042, 1043, 1, 0, 0, 0, 1043, 1041, 1, 0, 0, 0, 1043, 1044, 1, 0, 0, 0, 1044, 1045, 1, 0, 0, 0, 1045, 1046, 6, 110, 0, 0, 1046, 222, 1, 0, 0, 0, 18, 0, 947, 952, 955, 962, 965, 971, 973, 977, 982, 984, 990, 996, 998, 1011, 1021, 1032, 1043, 1, 0, 1, 0] \ No newline at end of file diff --git a/src/capability-language/generated/QuixosCapabilityLexer.tokens b/src/capability-language/generated/QuixosCapabilityLexer.tokens index d34ee3c..9616524 100644 --- a/src/capability-language/generated/QuixosCapabilityLexer.tokens +++ b/src/capability-language/generated/QuixosCapabilityLexer.tokens @@ -35,73 +35,78 @@ SOURCE=34 REPOSITORY=35 COMMIT=36 REVISION=37 -ID=38 -DOC=39 -MODE=40 -EMITS=41 -RECEIVER=42 -REQUIRES=43 -ANY=44 -GET=45 -SET=46 -WATCH=47 -START=48 -STOP=49 -READ=50 -WRITE=51 -RESOLVE=52 -CONNECT=53 -DISCONNECT=54 -CALL=55 -WATCH_START=56 -WATCH_STOP=57 -SUBSCRIBE=58 -UNSUBSCRIBE=59 -OPTIMISTIC_REGISTER=60 -CRDT=61 -OPTIONAL_ONE=62 -EXACTLY_ONE=63 -MANY_UNIQUE=64 -MANY=65 -ORDERED=66 -UNIT=67 -WATCH_HANDLE=68 -MESSAGE=69 -ATOM_REF=70 -INTERFACE_REF=71 -OPTIONAL=72 -LIST=73 -BOOL=74 -BYTES=75 -DOUBLE=76 -INT32=77 -INT64=78 -STRING=79 -UINT32=80 -UINT64=81 -TRUE=82 -FALSE=83 -NULL=84 -ARROW=85 -COLON=86 -SEMI=87 -COMMA=88 -DOT=89 -LBRACE=90 -RBRACE=91 -LBRACK=92 -RBRACK=93 -LPAREN=94 -RPAREN=95 -LT=96 -GT=97 -INTEGER=98 -JSON_NUMBER=99 -IDENTIFIER=100 -STRING_LITERAL=101 -LINE_COMMENT=102 -BLOCK_COMMENT=103 -WS=104 +SEMANTIC_MAJOR=38 +ON_DELETE=39 +RETAIN_OTHER=40 +KEYED=41 +PUBLIC_TRAVERSAL=42 +ID=43 +DOC=44 +MODE=45 +EMITS=46 +RECEIVER=47 +REQUIRES=48 +ANY=49 +GET=50 +SET=51 +WATCH=52 +START=53 +STOP=54 +READ=55 +WRITE=56 +RESOLVE=57 +CONNECT=58 +DISCONNECT=59 +CALL=60 +WATCH_START=61 +WATCH_STOP=62 +SUBSCRIBE=63 +UNSUBSCRIBE=64 +OPTIMISTIC_REGISTER=65 +CRDT=66 +OPTIONAL_ONE=67 +EXACTLY_ONE=68 +MANY_UNIQUE=69 +MANY=70 +ORDERED=71 +UNIT=72 +WATCH_HANDLE=73 +MESSAGE=74 +ATOM_REF=75 +INTERFACE_REF=76 +OPTIONAL=77 +LIST=78 +BOOL=79 +BYTES=80 +DOUBLE=81 +INT32=82 +INT64=83 +STRING=84 +UINT32=85 +UINT64=86 +TRUE=87 +FALSE=88 +NULL=89 +ARROW=90 +COLON=91 +SEMI=92 +COMMA=93 +DOT=94 +LBRACE=95 +RBRACE=96 +LBRACK=97 +RBRACK=98 +LPAREN=99 +RPAREN=100 +LT=101 +GT=102 +INTEGER=103 +JSON_NUMBER=104 +IDENTIFIER=105 +STRING_LITERAL=106 +LINE_COMMENT=107 +BLOCK_COMMENT=108 +WS=109 'workspace'=1 'fragment'=2 'import'=3 @@ -139,63 +144,68 @@ WS=104 'repository'=35 'commit'=36 'revision'=37 -'id'=38 -'doc'=39 -'mode'=40 -'emits'=41 -'receiver'=42 -'requires'=43 -'any'=44 -'get'=45 -'set'=46 -'watch'=47 -'start'=48 -'stop'=49 -'read'=50 -'write'=51 -'resolve'=52 -'connect'=53 -'disconnect'=54 -'call'=55 -'watch-start'=56 -'watch-stop'=57 -'subscribe'=58 -'unsubscribe'=59 -'optimistic-register'=60 -'crdt'=61 -'optional-one'=62 -'exactly-one'=63 -'many-unique'=64 -'many'=65 -'ordered'=66 -'unit'=67 -'watch-handle'=68 -'message'=69 -'atom-ref'=70 -'interface-ref'=71 -'optional'=72 -'list'=73 -'bool'=74 -'bytes'=75 -'double'=76 -'int32'=77 -'int64'=78 -'string'=79 -'uint32'=80 -'uint64'=81 -'true'=82 -'false'=83 -'null'=84 -'->'=85 -':'=86 -';'=87 -','=88 -'.'=89 -'{'=90 -'}'=91 -'['=92 -']'=93 -'('=94 -')'=95 -'<'=96 -'>'=97 +'semantic-major'=38 +'on-delete'=39 +'retain-other'=40 +'keyed'=41 +'public-traversal'=42 +'id'=43 +'doc'=44 +'mode'=45 +'emits'=46 +'receiver'=47 +'requires'=48 +'any'=49 +'get'=50 +'set'=51 +'watch'=52 +'start'=53 +'stop'=54 +'read'=55 +'write'=56 +'resolve'=57 +'connect'=58 +'disconnect'=59 +'call'=60 +'watch-start'=61 +'watch-stop'=62 +'subscribe'=63 +'unsubscribe'=64 +'optimistic-register'=65 +'crdt'=66 +'optional-one'=67 +'exactly-one'=68 +'many-unique'=69 +'many'=70 +'ordered'=71 +'unit'=72 +'watch-handle'=73 +'message'=74 +'atom-ref'=75 +'interface-ref'=76 +'optional'=77 +'list'=78 +'bool'=79 +'bytes'=80 +'double'=81 +'int32'=82 +'int64'=83 +'string'=84 +'uint32'=85 +'uint64'=86 +'true'=87 +'false'=88 +'null'=89 +'->'=90 +':'=91 +';'=92 +','=93 +'.'=94 +'{'=95 +'}'=96 +'['=97 +']'=98 +'('=99 +')'=100 +'<'=101 +'>'=102 diff --git a/src/capability-language/generated/QuixosCapabilityLexer.ts b/src/capability-language/generated/QuixosCapabilityLexer.ts index f30b433..97b2045 100644 --- a/src/capability-language/generated/QuixosCapabilityLexer.ts +++ b/src/capability-language/generated/QuixosCapabilityLexer.ts @@ -41,73 +41,78 @@ export class QuixosCapabilityLexer extends antlr.Lexer { public static readonly REPOSITORY = 35; public static readonly COMMIT = 36; public static readonly REVISION = 37; - public static readonly ID = 38; - public static readonly DOC = 39; - public static readonly MODE = 40; - public static readonly EMITS = 41; - public static readonly RECEIVER = 42; - public static readonly REQUIRES = 43; - public static readonly ANY = 44; - public static readonly GET = 45; - public static readonly SET = 46; - public static readonly WATCH = 47; - public static readonly START = 48; - public static readonly STOP = 49; - public static readonly READ = 50; - public static readonly WRITE = 51; - public static readonly RESOLVE = 52; - public static readonly CONNECT = 53; - public static readonly DISCONNECT = 54; - public static readonly CALL = 55; - public static readonly WATCH_START = 56; - public static readonly WATCH_STOP = 57; - public static readonly SUBSCRIBE = 58; - public static readonly UNSUBSCRIBE = 59; - public static readonly OPTIMISTIC_REGISTER = 60; - public static readonly CRDT = 61; - public static readonly OPTIONAL_ONE = 62; - public static readonly EXACTLY_ONE = 63; - public static readonly MANY_UNIQUE = 64; - public static readonly MANY = 65; - public static readonly ORDERED = 66; - public static readonly UNIT = 67; - public static readonly WATCH_HANDLE = 68; - public static readonly MESSAGE = 69; - public static readonly ATOM_REF = 70; - public static readonly INTERFACE_REF = 71; - public static readonly OPTIONAL = 72; - public static readonly LIST = 73; - public static readonly BOOL = 74; - public static readonly BYTES = 75; - public static readonly DOUBLE = 76; - public static readonly INT32 = 77; - public static readonly INT64 = 78; - public static readonly STRING = 79; - public static readonly UINT32 = 80; - public static readonly UINT64 = 81; - public static readonly TRUE = 82; - public static readonly FALSE = 83; - public static readonly NULL = 84; - public static readonly ARROW = 85; - public static readonly COLON = 86; - public static readonly SEMI = 87; - public static readonly COMMA = 88; - public static readonly DOT = 89; - public static readonly LBRACE = 90; - public static readonly RBRACE = 91; - public static readonly LBRACK = 92; - public static readonly RBRACK = 93; - public static readonly LPAREN = 94; - public static readonly RPAREN = 95; - public static readonly LT = 96; - public static readonly GT = 97; - public static readonly INTEGER = 98; - public static readonly JSON_NUMBER = 99; - public static readonly IDENTIFIER = 100; - public static readonly STRING_LITERAL = 101; - public static readonly LINE_COMMENT = 102; - public static readonly BLOCK_COMMENT = 103; - public static readonly WS = 104; + public static readonly SEMANTIC_MAJOR = 38; + public static readonly ON_DELETE = 39; + public static readonly RETAIN_OTHER = 40; + public static readonly KEYED = 41; + public static readonly PUBLIC_TRAVERSAL = 42; + public static readonly ID = 43; + public static readonly DOC = 44; + public static readonly MODE = 45; + public static readonly EMITS = 46; + public static readonly RECEIVER = 47; + public static readonly REQUIRES = 48; + public static readonly ANY = 49; + public static readonly GET = 50; + public static readonly SET = 51; + public static readonly WATCH = 52; + public static readonly START = 53; + public static readonly STOP = 54; + public static readonly READ = 55; + public static readonly WRITE = 56; + public static readonly RESOLVE = 57; + public static readonly CONNECT = 58; + public static readonly DISCONNECT = 59; + public static readonly CALL = 60; + public static readonly WATCH_START = 61; + public static readonly WATCH_STOP = 62; + public static readonly SUBSCRIBE = 63; + public static readonly UNSUBSCRIBE = 64; + public static readonly OPTIMISTIC_REGISTER = 65; + public static readonly CRDT = 66; + public static readonly OPTIONAL_ONE = 67; + public static readonly EXACTLY_ONE = 68; + public static readonly MANY_UNIQUE = 69; + public static readonly MANY = 70; + public static readonly ORDERED = 71; + public static readonly UNIT = 72; + public static readonly WATCH_HANDLE = 73; + public static readonly MESSAGE = 74; + public static readonly ATOM_REF = 75; + public static readonly INTERFACE_REF = 76; + public static readonly OPTIONAL = 77; + public static readonly LIST = 78; + public static readonly BOOL = 79; + public static readonly BYTES = 80; + public static readonly DOUBLE = 81; + public static readonly INT32 = 82; + public static readonly INT64 = 83; + public static readonly STRING = 84; + public static readonly UINT32 = 85; + public static readonly UINT64 = 86; + public static readonly TRUE = 87; + public static readonly FALSE = 88; + public static readonly NULL = 89; + public static readonly ARROW = 90; + public static readonly COLON = 91; + public static readonly SEMI = 92; + public static readonly COMMA = 93; + public static readonly DOT = 94; + public static readonly LBRACE = 95; + public static readonly RBRACE = 96; + public static readonly LBRACK = 97; + public static readonly RBRACK = 98; + public static readonly LPAREN = 99; + public static readonly RPAREN = 100; + public static readonly LT = 101; + public static readonly GT = 102; + public static readonly INTEGER = 103; + public static readonly JSON_NUMBER = 104; + public static readonly IDENTIFIER = 105; + public static readonly STRING_LITERAL = 106; + public static readonly LINE_COMMENT = 107; + public static readonly BLOCK_COMMENT = 108; + public static readonly WS = 109; public static readonly channelNames = [ "DEFAULT_TOKEN_CHANNEL", "HIDDEN" @@ -120,17 +125,18 @@ export class QuixosCapabilityLexer extends antlr.Lexer { "'conform'", "'as'", "'bind'", "'to'", "'private'", "'shared'", "'state'", "'edge'", "'projection'", "'with'", "'using'", "'via'", "'materialize'", "'if'", "'absent'", "'on'", "'policy'", "'default'", - "'source'", "'repository'", "'commit'", "'revision'", "'id'", "'doc'", - "'mode'", "'emits'", "'receiver'", "'requires'", "'any'", "'get'", - "'set'", "'watch'", "'start'", "'stop'", "'read'", "'write'", "'resolve'", - "'connect'", "'disconnect'", "'call'", "'watch-start'", "'watch-stop'", - "'subscribe'", "'unsubscribe'", "'optimistic-register'", "'crdt'", - "'optional-one'", "'exactly-one'", "'many-unique'", "'many'", "'ordered'", - "'unit'", "'watch-handle'", "'message'", "'atom-ref'", "'interface-ref'", - "'optional'", "'list'", "'bool'", "'bytes'", "'double'", "'int32'", - "'int64'", "'string'", "'uint32'", "'uint64'", "'true'", "'false'", - "'null'", "'->'", "':'", "';'", "','", "'.'", "'{'", "'}'", "'['", - "']'", "'('", "')'", "'<'", "'>'" + "'source'", "'repository'", "'commit'", "'revision'", "'semantic-major'", + "'on-delete'", "'retain-other'", "'keyed'", "'public-traversal'", + "'id'", "'doc'", "'mode'", "'emits'", "'receiver'", "'requires'", + "'any'", "'get'", "'set'", "'watch'", "'start'", "'stop'", "'read'", + "'write'", "'resolve'", "'connect'", "'disconnect'", "'call'", "'watch-start'", + "'watch-stop'", "'subscribe'", "'unsubscribe'", "'optimistic-register'", + "'crdt'", "'optional-one'", "'exactly-one'", "'many-unique'", "'many'", + "'ordered'", "'unit'", "'watch-handle'", "'message'", "'atom-ref'", + "'interface-ref'", "'optional'", "'list'", "'bool'", "'bytes'", + "'double'", "'int32'", "'int64'", "'string'", "'uint32'", "'uint64'", + "'true'", "'false'", "'null'", "'->'", "':'", "';'", "','", "'.'", + "'{'", "'}'", "'['", "']'", "'('", "')'", "'<'", "'>'" ]; public static readonly symbolicNames = [ @@ -139,17 +145,19 @@ export class QuixosCapabilityLexer extends antlr.Lexer { "CONSTRUCTOR", "CONSTRUCTS", "INPUT", "CONFORM", "AS", "BIND", "TO", "PRIVATE", "SHARED", "STATE", "EDGE", "PROJECTION", "WITH", "USING", "VIA", "MATERIALIZE", "IF", "ABSENT", "ON", "POLICY", "DEFAULT", - "SOURCE", "REPOSITORY", "COMMIT", "REVISION", "ID", "DOC", "MODE", - "EMITS", "RECEIVER", "REQUIRES", "ANY", "GET", "SET", "WATCH", "START", - "STOP", "READ", "WRITE", "RESOLVE", "CONNECT", "DISCONNECT", "CALL", - "WATCH_START", "WATCH_STOP", "SUBSCRIBE", "UNSUBSCRIBE", "OPTIMISTIC_REGISTER", - "CRDT", "OPTIONAL_ONE", "EXACTLY_ONE", "MANY_UNIQUE", "MANY", "ORDERED", - "UNIT", "WATCH_HANDLE", "MESSAGE", "ATOM_REF", "INTERFACE_REF", - "OPTIONAL", "LIST", "BOOL", "BYTES", "DOUBLE", "INT32", "INT64", - "STRING", "UINT32", "UINT64", "TRUE", "FALSE", "NULL", "ARROW", - "COLON", "SEMI", "COMMA", "DOT", "LBRACE", "RBRACE", "LBRACK", "RBRACK", - "LPAREN", "RPAREN", "LT", "GT", "INTEGER", "JSON_NUMBER", "IDENTIFIER", - "STRING_LITERAL", "LINE_COMMENT", "BLOCK_COMMENT", "WS" + "SOURCE", "REPOSITORY", "COMMIT", "REVISION", "SEMANTIC_MAJOR", + "ON_DELETE", "RETAIN_OTHER", "KEYED", "PUBLIC_TRAVERSAL", "ID", + "DOC", "MODE", "EMITS", "RECEIVER", "REQUIRES", "ANY", "GET", "SET", + "WATCH", "START", "STOP", "READ", "WRITE", "RESOLVE", "CONNECT", + "DISCONNECT", "CALL", "WATCH_START", "WATCH_STOP", "SUBSCRIBE", + "UNSUBSCRIBE", "OPTIMISTIC_REGISTER", "CRDT", "OPTIONAL_ONE", "EXACTLY_ONE", + "MANY_UNIQUE", "MANY", "ORDERED", "UNIT", "WATCH_HANDLE", "MESSAGE", + "ATOM_REF", "INTERFACE_REF", "OPTIONAL", "LIST", "BOOL", "BYTES", + "DOUBLE", "INT32", "INT64", "STRING", "UINT32", "UINT64", "TRUE", + "FALSE", "NULL", "ARROW", "COLON", "SEMI", "COMMA", "DOT", "LBRACE", + "RBRACE", "LBRACK", "RBRACK", "LPAREN", "RPAREN", "LT", "GT", "INTEGER", + "JSON_NUMBER", "IDENTIFIER", "STRING_LITERAL", "LINE_COMMENT", "BLOCK_COMMENT", + "WS" ]; public static readonly modeNames = [ @@ -162,18 +170,19 @@ export class QuixosCapabilityLexer extends antlr.Lexer { "CONSTRUCTOR", "CONSTRUCTS", "INPUT", "CONFORM", "AS", "BIND", "TO", "PRIVATE", "SHARED", "STATE", "EDGE", "PROJECTION", "WITH", "USING", "VIA", "MATERIALIZE", "IF", "ABSENT", "ON", "POLICY", "DEFAULT", - "SOURCE", "REPOSITORY", "COMMIT", "REVISION", "ID", "DOC", "MODE", - "EMITS", "RECEIVER", "REQUIRES", "ANY", "GET", "SET", "WATCH", "START", - "STOP", "READ", "WRITE", "RESOLVE", "CONNECT", "DISCONNECT", "CALL", - "WATCH_START", "WATCH_STOP", "SUBSCRIBE", "UNSUBSCRIBE", "OPTIMISTIC_REGISTER", - "CRDT", "OPTIONAL_ONE", "EXACTLY_ONE", "MANY_UNIQUE", "MANY", "ORDERED", - "UNIT", "WATCH_HANDLE", "MESSAGE", "ATOM_REF", "INTERFACE_REF", - "OPTIONAL", "LIST", "BOOL", "BYTES", "DOUBLE", "INT32", "INT64", - "STRING", "UINT32", "UINT64", "TRUE", "FALSE", "NULL", "ARROW", - "COLON", "SEMI", "COMMA", "DOT", "LBRACE", "RBRACE", "LBRACK", "RBRACK", - "LPAREN", "RPAREN", "LT", "GT", "INTEGER", "JSON_NUMBER", "IDENTIFIER", - "STRING_LITERAL", "ESC", "HEX", "LINE_COMMENT", "BLOCK_COMMENT", - "WS", + "SOURCE", "REPOSITORY", "COMMIT", "REVISION", "SEMANTIC_MAJOR", + "ON_DELETE", "RETAIN_OTHER", "KEYED", "PUBLIC_TRAVERSAL", "ID", + "DOC", "MODE", "EMITS", "RECEIVER", "REQUIRES", "ANY", "GET", "SET", + "WATCH", "START", "STOP", "READ", "WRITE", "RESOLVE", "CONNECT", + "DISCONNECT", "CALL", "WATCH_START", "WATCH_STOP", "SUBSCRIBE", + "UNSUBSCRIBE", "OPTIMISTIC_REGISTER", "CRDT", "OPTIONAL_ONE", "EXACTLY_ONE", + "MANY_UNIQUE", "MANY", "ORDERED", "UNIT", "WATCH_HANDLE", "MESSAGE", + "ATOM_REF", "INTERFACE_REF", "OPTIONAL", "LIST", "BOOL", "BYTES", + "DOUBLE", "INT32", "INT64", "STRING", "UINT32", "UINT64", "TRUE", + "FALSE", "NULL", "ARROW", "COLON", "SEMI", "COMMA", "DOT", "LBRACE", + "RBRACE", "LBRACK", "RBRACK", "LPAREN", "RPAREN", "LT", "GT", "INTEGER", + "JSON_NUMBER", "IDENTIFIER", "STRING_LITERAL", "ESC", "HEX", "LINE_COMMENT", + "BLOCK_COMMENT", "WS", ]; @@ -195,354 +204,381 @@ export class QuixosCapabilityLexer extends antlr.Lexer { public get modeNames(): string[] { return QuixosCapabilityLexer.modeNames; } public static readonly _serializedATN: number[] = [ - 4,0,104,976,6,-1,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5, - 2,6,7,6,2,7,7,7,2,8,7,8,2,9,7,9,2,10,7,10,2,11,7,11,2,12,7,12,2, - 13,7,13,2,14,7,14,2,15,7,15,2,16,7,16,2,17,7,17,2,18,7,18,2,19,7, - 19,2,20,7,20,2,21,7,21,2,22,7,22,2,23,7,23,2,24,7,24,2,25,7,25,2, - 26,7,26,2,27,7,27,2,28,7,28,2,29,7,29,2,30,7,30,2,31,7,31,2,32,7, - 32,2,33,7,33,2,34,7,34,2,35,7,35,2,36,7,36,2,37,7,37,2,38,7,38,2, - 39,7,39,2,40,7,40,2,41,7,41,2,42,7,42,2,43,7,43,2,44,7,44,2,45,7, - 45,2,46,7,46,2,47,7,47,2,48,7,48,2,49,7,49,2,50,7,50,2,51,7,51,2, - 52,7,52,2,53,7,53,2,54,7,54,2,55,7,55,2,56,7,56,2,57,7,57,2,58,7, - 58,2,59,7,59,2,60,7,60,2,61,7,61,2,62,7,62,2,63,7,63,2,64,7,64,2, - 65,7,65,2,66,7,66,2,67,7,67,2,68,7,68,2,69,7,69,2,70,7,70,2,71,7, - 71,2,72,7,72,2,73,7,73,2,74,7,74,2,75,7,75,2,76,7,76,2,77,7,77,2, - 78,7,78,2,79,7,79,2,80,7,80,2,81,7,81,2,82,7,82,2,83,7,83,2,84,7, - 84,2,85,7,85,2,86,7,86,2,87,7,87,2,88,7,88,2,89,7,89,2,90,7,90,2, - 91,7,91,2,92,7,92,2,93,7,93,2,94,7,94,2,95,7,95,2,96,7,96,2,97,7, - 97,2,98,7,98,2,99,7,99,2,100,7,100,2,101,7,101,2,102,7,102,2,103, - 7,103,2,104,7,104,2,105,7,105,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1, - 0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,2,1,2,1,2,1,2,1, - 2,1,2,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,4,1,4,1,4,1,4,1,4,1, - 5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,6,1,6,1,6,1,6,1,6,1,6,1, - 6,1,6,1,6,1,6,1,6,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,8,1,8,1,8,1, - 8,1,8,1,8,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,10,1,10,1,10,1,10, - 1,10,1,10,1,10,1,10,1,10,1,10,1,11,1,11,1,11,1,11,1,11,1,11,1,11, - 1,11,1,11,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12, - 1,12,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,14, - 1,14,1,14,1,14,1,14,1,14,1,15,1,15,1,15,1,15,1,15,1,15,1,15,1,15, - 1,16,1,16,1,16,1,17,1,17,1,17,1,17,1,17,1,18,1,18,1,18,1,19,1,19, - 1,19,1,19,1,19,1,19,1,19,1,19,1,20,1,20,1,20,1,20,1,20,1,20,1,20, - 1,21,1,21,1,21,1,21,1,21,1,21,1,22,1,22,1,22,1,22,1,22,1,23,1,23, - 1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,24,1,24,1,24,1,24, - 1,24,1,25,1,25,1,25,1,25,1,25,1,25,1,26,1,26,1,26,1,26,1,27,1,27, - 1,27,1,27,1,27,1,27,1,27,1,27,1,27,1,27,1,27,1,27,1,28,1,28,1,28, - 1,29,1,29,1,29,1,29,1,29,1,29,1,29,1,30,1,30,1,30,1,31,1,31,1,31, - 1,31,1,31,1,31,1,31,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,33, - 1,33,1,33,1,33,1,33,1,33,1,33,1,34,1,34,1,34,1,34,1,34,1,34,1,34, - 1,34,1,34,1,34,1,34,1,35,1,35,1,35,1,35,1,35,1,35,1,35,1,36,1,36, - 1,36,1,36,1,36,1,36,1,36,1,36,1,36,1,37,1,37,1,37,1,38,1,38,1,38, - 1,38,1,39,1,39,1,39,1,39,1,39,1,40,1,40,1,40,1,40,1,40,1,40,1,41, - 1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,42,1,42,1,42,1,42,1,42, - 1,42,1,42,1,42,1,42,1,43,1,43,1,43,1,43,1,44,1,44,1,44,1,44,1,45, - 1,45,1,45,1,45,1,46,1,46,1,46,1,46,1,46,1,46,1,47,1,47,1,47,1,47, - 1,47,1,47,1,48,1,48,1,48,1,48,1,48,1,49,1,49,1,49,1,49,1,49,1,50, - 1,50,1,50,1,50,1,50,1,50,1,51,1,51,1,51,1,51,1,51,1,51,1,51,1,51, - 1,52,1,52,1,52,1,52,1,52,1,52,1,52,1,52,1,53,1,53,1,53,1,53,1,53, - 1,53,1,53,1,53,1,53,1,53,1,53,1,54,1,54,1,54,1,54,1,54,1,55,1,55, - 1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,56,1,56,1,56, + 4,0,109,1047,6,-1,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7, + 5,2,6,7,6,2,7,7,7,2,8,7,8,2,9,7,9,2,10,7,10,2,11,7,11,2,12,7,12, + 2,13,7,13,2,14,7,14,2,15,7,15,2,16,7,16,2,17,7,17,2,18,7,18,2,19, + 7,19,2,20,7,20,2,21,7,21,2,22,7,22,2,23,7,23,2,24,7,24,2,25,7,25, + 2,26,7,26,2,27,7,27,2,28,7,28,2,29,7,29,2,30,7,30,2,31,7,31,2,32, + 7,32,2,33,7,33,2,34,7,34,2,35,7,35,2,36,7,36,2,37,7,37,2,38,7,38, + 2,39,7,39,2,40,7,40,2,41,7,41,2,42,7,42,2,43,7,43,2,44,7,44,2,45, + 7,45,2,46,7,46,2,47,7,47,2,48,7,48,2,49,7,49,2,50,7,50,2,51,7,51, + 2,52,7,52,2,53,7,53,2,54,7,54,2,55,7,55,2,56,7,56,2,57,7,57,2,58, + 7,58,2,59,7,59,2,60,7,60,2,61,7,61,2,62,7,62,2,63,7,63,2,64,7,64, + 2,65,7,65,2,66,7,66,2,67,7,67,2,68,7,68,2,69,7,69,2,70,7,70,2,71, + 7,71,2,72,7,72,2,73,7,73,2,74,7,74,2,75,7,75,2,76,7,76,2,77,7,77, + 2,78,7,78,2,79,7,79,2,80,7,80,2,81,7,81,2,82,7,82,2,83,7,83,2,84, + 7,84,2,85,7,85,2,86,7,86,2,87,7,87,2,88,7,88,2,89,7,89,2,90,7,90, + 2,91,7,91,2,92,7,92,2,93,7,93,2,94,7,94,2,95,7,95,2,96,7,96,2,97, + 7,97,2,98,7,98,2,99,7,99,2,100,7,100,2,101,7,101,2,102,7,102,2,103, + 7,103,2,104,7,104,2,105,7,105,2,106,7,106,2,107,7,107,2,108,7,108, + 2,109,7,109,2,110,7,110,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,2,1,2,1,2,1,2,1,2,1,2, + 1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,3,1,4,1,4,1,4,1,4,1,4,1,5,1,5, + 1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6, + 1,6,1,6,1,6,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,7,1,8,1,8,1,8,1,8,1,8, + 1,8,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,10,1,10,1,10,1,10,1,10, + 1,10,1,10,1,10,1,10,1,10,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11, + 1,11,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12,1,12, + 1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,13,1,14,1,14, + 1,14,1,14,1,14,1,14,1,15,1,15,1,15,1,15,1,15,1,15,1,15,1,15,1,16, + 1,16,1,16,1,17,1,17,1,17,1,17,1,17,1,18,1,18,1,18,1,19,1,19,1,19, + 1,19,1,19,1,19,1,19,1,19,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,21, + 1,21,1,21,1,21,1,21,1,21,1,22,1,22,1,22,1,22,1,22,1,23,1,23,1,23, + 1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,24,1,24,1,24,1,24,1,24, + 1,25,1,25,1,25,1,25,1,25,1,25,1,26,1,26,1,26,1,26,1,27,1,27,1,27, + 1,27,1,27,1,27,1,27,1,27,1,27,1,27,1,27,1,27,1,28,1,28,1,28,1,29, + 1,29,1,29,1,29,1,29,1,29,1,29,1,30,1,30,1,30,1,31,1,31,1,31,1,31, + 1,31,1,31,1,31,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,33,1,33, + 1,33,1,33,1,33,1,33,1,33,1,34,1,34,1,34,1,34,1,34,1,34,1,34,1,34, + 1,34,1,34,1,34,1,35,1,35,1,35,1,35,1,35,1,35,1,35,1,36,1,36,1,36, + 1,36,1,36,1,36,1,36,1,36,1,36,1,37,1,37,1,37,1,37,1,37,1,37,1,37, + 1,37,1,37,1,37,1,37,1,37,1,37,1,37,1,37,1,38,1,38,1,38,1,38,1,38, + 1,38,1,38,1,38,1,38,1,38,1,39,1,39,1,39,1,39,1,39,1,39,1,39,1,39, + 1,39,1,39,1,39,1,39,1,39,1,40,1,40,1,40,1,40,1,40,1,40,1,41,1,41, + 1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41,1,41, + 1,41,1,41,1,42,1,42,1,42,1,43,1,43,1,43,1,43,1,44,1,44,1,44,1,44, + 1,44,1,45,1,45,1,45,1,45,1,45,1,45,1,46,1,46,1,46,1,46,1,46,1,46, + 1,46,1,46,1,46,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,48, + 1,48,1,48,1,48,1,49,1,49,1,49,1,49,1,50,1,50,1,50,1,50,1,51,1,51, + 1,51,1,51,1,51,1,51,1,52,1,52,1,52,1,52,1,52,1,52,1,53,1,53,1,53, + 1,53,1,53,1,54,1,54,1,54,1,54,1,54,1,55,1,55,1,55,1,55,1,55,1,55, 1,56,1,56,1,56,1,56,1,56,1,56,1,56,1,56,1,57,1,57,1,57,1,57,1,57, - 1,57,1,57,1,57,1,57,1,57,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58, - 1,58,1,58,1,58,1,58,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59, - 1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,60,1,60, - 1,60,1,60,1,60,1,61,1,61,1,61,1,61,1,61,1,61,1,61,1,61,1,61,1,61, + 1,57,1,57,1,57,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58, + 1,58,1,59,1,59,1,59,1,59,1,59,1,60,1,60,1,60,1,60,1,60,1,60,1,60, + 1,60,1,60,1,60,1,60,1,60,1,61,1,61,1,61,1,61,1,61,1,61,1,61,1,61, 1,61,1,61,1,61,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62, - 1,62,1,62,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63, - 1,63,1,64,1,64,1,64,1,64,1,64,1,65,1,65,1,65,1,65,1,65,1,65,1,65, - 1,65,1,66,1,66,1,66,1,66,1,66,1,67,1,67,1,67,1,67,1,67,1,67,1,67, - 1,67,1,67,1,67,1,67,1,67,1,67,1,68,1,68,1,68,1,68,1,68,1,68,1,68, - 1,68,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,70,1,70,1,70, - 1,70,1,70,1,70,1,70,1,70,1,70,1,70,1,70,1,70,1,70,1,70,1,71,1,71, - 1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,72,1,72,1,72,1,72,1,72,1,73, - 1,73,1,73,1,73,1,73,1,74,1,74,1,74,1,74,1,74,1,74,1,75,1,75,1,75, - 1,75,1,75,1,75,1,75,1,76,1,76,1,76,1,76,1,76,1,76,1,77,1,77,1,77, - 1,77,1,77,1,77,1,78,1,78,1,78,1,78,1,78,1,78,1,78,1,79,1,79,1,79, - 1,79,1,79,1,79,1,79,1,80,1,80,1,80,1,80,1,80,1,80,1,80,1,81,1,81, - 1,81,1,81,1,81,1,82,1,82,1,82,1,82,1,82,1,82,1,83,1,83,1,83,1,83, - 1,83,1,84,1,84,1,84,1,85,1,85,1,86,1,86,1,87,1,87,1,88,1,88,1,89, - 1,89,1,90,1,90,1,91,1,91,1,92,1,92,1,93,1,93,1,94,1,94,1,95,1,95, - 1,96,1,96,1,97,3,97,877,8,97,1,97,4,97,880,8,97,11,97,12,97,881, - 1,98,3,98,885,8,98,1,98,1,98,1,98,5,98,890,8,98,10,98,12,98,893, - 9,98,3,98,895,8,98,1,98,1,98,4,98,899,8,98,11,98,12,98,900,3,98, - 903,8,98,1,98,1,98,3,98,907,8,98,1,98,4,98,910,8,98,11,98,12,98, - 911,3,98,914,8,98,1,99,1,99,5,99,918,8,99,10,99,12,99,921,9,99,1, - 100,1,100,1,100,5,100,926,8,100,10,100,12,100,929,9,100,1,100,1, - 100,1,101,1,101,1,101,1,101,1,101,1,101,1,101,1,101,3,101,941,8, - 101,1,102,1,102,1,103,1,103,1,103,1,103,5,103,949,8,103,10,103,12, - 103,952,9,103,1,103,1,103,1,104,1,104,1,104,1,104,5,104,960,8,104, - 10,104,12,104,963,9,104,1,104,1,104,1,104,1,104,1,104,1,105,4,105, - 971,8,105,11,105,12,105,972,1,105,1,105,1,961,0,106,1,1,3,2,5,3, - 7,4,9,5,11,6,13,7,15,8,17,9,19,10,21,11,23,12,25,13,27,14,29,15, - 31,16,33,17,35,18,37,19,39,20,41,21,43,22,45,23,47,24,49,25,51,26, - 53,27,55,28,57,29,59,30,61,31,63,32,65,33,67,34,69,35,71,36,73,37, - 75,38,77,39,79,40,81,41,83,42,85,43,87,44,89,45,91,46,93,47,95,48, - 97,49,99,50,101,51,103,52,105,53,107,54,109,55,111,56,113,57,115, - 58,117,59,119,60,121,61,123,62,125,63,127,64,129,65,131,66,133,67, - 135,68,137,69,139,70,141,71,143,72,145,73,147,74,149,75,151,76,153, - 77,155,78,157,79,159,80,161,81,163,82,165,83,167,84,169,85,171,86, - 173,87,175,88,177,89,179,90,181,91,183,92,185,93,187,94,189,95,191, - 96,193,97,195,98,197,99,199,100,201,101,203,0,205,0,207,102,209, - 103,211,104,1,0,11,1,0,48,57,1,0,49,57,2,0,69,69,101,101,2,0,43, - 43,45,45,3,0,65,90,95,95,97,122,4,0,48,57,65,90,95,95,97,122,4,0, - 10,10,13,13,34,34,92,92,8,0,34,34,47,47,92,92,98,98,102,102,110, - 110,114,114,116,116,3,0,48,57,65,70,97,102,2,0,10,10,13,13,3,0,9, - 10,13,13,32,32,990,0,1,1,0,0,0,0,3,1,0,0,0,0,5,1,0,0,0,0,7,1,0,0, - 0,0,9,1,0,0,0,0,11,1,0,0,0,0,13,1,0,0,0,0,15,1,0,0,0,0,17,1,0,0, - 0,0,19,1,0,0,0,0,21,1,0,0,0,0,23,1,0,0,0,0,25,1,0,0,0,0,27,1,0,0, - 0,0,29,1,0,0,0,0,31,1,0,0,0,0,33,1,0,0,0,0,35,1,0,0,0,0,37,1,0,0, - 0,0,39,1,0,0,0,0,41,1,0,0,0,0,43,1,0,0,0,0,45,1,0,0,0,0,47,1,0,0, - 0,0,49,1,0,0,0,0,51,1,0,0,0,0,53,1,0,0,0,0,55,1,0,0,0,0,57,1,0,0, - 0,0,59,1,0,0,0,0,61,1,0,0,0,0,63,1,0,0,0,0,65,1,0,0,0,0,67,1,0,0, - 0,0,69,1,0,0,0,0,71,1,0,0,0,0,73,1,0,0,0,0,75,1,0,0,0,0,77,1,0,0, - 0,0,79,1,0,0,0,0,81,1,0,0,0,0,83,1,0,0,0,0,85,1,0,0,0,0,87,1,0,0, - 0,0,89,1,0,0,0,0,91,1,0,0,0,0,93,1,0,0,0,0,95,1,0,0,0,0,97,1,0,0, - 0,0,99,1,0,0,0,0,101,1,0,0,0,0,103,1,0,0,0,0,105,1,0,0,0,0,107,1, - 0,0,0,0,109,1,0,0,0,0,111,1,0,0,0,0,113,1,0,0,0,0,115,1,0,0,0,0, - 117,1,0,0,0,0,119,1,0,0,0,0,121,1,0,0,0,0,123,1,0,0,0,0,125,1,0, - 0,0,0,127,1,0,0,0,0,129,1,0,0,0,0,131,1,0,0,0,0,133,1,0,0,0,0,135, - 1,0,0,0,0,137,1,0,0,0,0,139,1,0,0,0,0,141,1,0,0,0,0,143,1,0,0,0, - 0,145,1,0,0,0,0,147,1,0,0,0,0,149,1,0,0,0,0,151,1,0,0,0,0,153,1, - 0,0,0,0,155,1,0,0,0,0,157,1,0,0,0,0,159,1,0,0,0,0,161,1,0,0,0,0, - 163,1,0,0,0,0,165,1,0,0,0,0,167,1,0,0,0,0,169,1,0,0,0,0,171,1,0, - 0,0,0,173,1,0,0,0,0,175,1,0,0,0,0,177,1,0,0,0,0,179,1,0,0,0,0,181, - 1,0,0,0,0,183,1,0,0,0,0,185,1,0,0,0,0,187,1,0,0,0,0,189,1,0,0,0, - 0,191,1,0,0,0,0,193,1,0,0,0,0,195,1,0,0,0,0,197,1,0,0,0,0,199,1, - 0,0,0,0,201,1,0,0,0,0,207,1,0,0,0,0,209,1,0,0,0,0,211,1,0,0,0,1, - 213,1,0,0,0,3,223,1,0,0,0,5,232,1,0,0,0,7,239,1,0,0,0,9,248,1,0, - 0,0,11,253,1,0,0,0,13,263,1,0,0,0,15,274,1,0,0,0,17,282,1,0,0,0, - 19,288,1,0,0,0,21,297,1,0,0,0,23,307,1,0,0,0,25,316,1,0,0,0,27,328, - 1,0,0,0,29,339,1,0,0,0,31,345,1,0,0,0,33,353,1,0,0,0,35,356,1,0, - 0,0,37,361,1,0,0,0,39,364,1,0,0,0,41,372,1,0,0,0,43,379,1,0,0,0, - 45,385,1,0,0,0,47,390,1,0,0,0,49,401,1,0,0,0,51,406,1,0,0,0,53,412, - 1,0,0,0,55,416,1,0,0,0,57,428,1,0,0,0,59,431,1,0,0,0,61,438,1,0, - 0,0,63,441,1,0,0,0,65,448,1,0,0,0,67,456,1,0,0,0,69,463,1,0,0,0, - 71,474,1,0,0,0,73,481,1,0,0,0,75,490,1,0,0,0,77,493,1,0,0,0,79,497, - 1,0,0,0,81,502,1,0,0,0,83,508,1,0,0,0,85,517,1,0,0,0,87,526,1,0, - 0,0,89,530,1,0,0,0,91,534,1,0,0,0,93,538,1,0,0,0,95,544,1,0,0,0, - 97,550,1,0,0,0,99,555,1,0,0,0,101,560,1,0,0,0,103,566,1,0,0,0,105, - 574,1,0,0,0,107,582,1,0,0,0,109,593,1,0,0,0,111,598,1,0,0,0,113, - 610,1,0,0,0,115,621,1,0,0,0,117,631,1,0,0,0,119,643,1,0,0,0,121, - 663,1,0,0,0,123,668,1,0,0,0,125,681,1,0,0,0,127,693,1,0,0,0,129, - 705,1,0,0,0,131,710,1,0,0,0,133,718,1,0,0,0,135,723,1,0,0,0,137, - 736,1,0,0,0,139,744,1,0,0,0,141,753,1,0,0,0,143,767,1,0,0,0,145, - 776,1,0,0,0,147,781,1,0,0,0,149,786,1,0,0,0,151,792,1,0,0,0,153, - 799,1,0,0,0,155,805,1,0,0,0,157,811,1,0,0,0,159,818,1,0,0,0,161, - 825,1,0,0,0,163,832,1,0,0,0,165,837,1,0,0,0,167,843,1,0,0,0,169, - 848,1,0,0,0,171,851,1,0,0,0,173,853,1,0,0,0,175,855,1,0,0,0,177, - 857,1,0,0,0,179,859,1,0,0,0,181,861,1,0,0,0,183,863,1,0,0,0,185, - 865,1,0,0,0,187,867,1,0,0,0,189,869,1,0,0,0,191,871,1,0,0,0,193, - 873,1,0,0,0,195,876,1,0,0,0,197,884,1,0,0,0,199,915,1,0,0,0,201, - 922,1,0,0,0,203,932,1,0,0,0,205,942,1,0,0,0,207,944,1,0,0,0,209, - 955,1,0,0,0,211,970,1,0,0,0,213,214,5,119,0,0,214,215,5,111,0,0, - 215,216,5,114,0,0,216,217,5,107,0,0,217,218,5,115,0,0,218,219,5, - 112,0,0,219,220,5,97,0,0,220,221,5,99,0,0,221,222,5,101,0,0,222, - 2,1,0,0,0,223,224,5,102,0,0,224,225,5,114,0,0,225,226,5,97,0,0,226, - 227,5,103,0,0,227,228,5,109,0,0,228,229,5,101,0,0,229,230,5,110, - 0,0,230,231,5,116,0,0,231,4,1,0,0,0,232,233,5,105,0,0,233,234,5, - 109,0,0,234,235,5,112,0,0,235,236,5,111,0,0,236,237,5,114,0,0,237, - 238,5,116,0,0,238,6,1,0,0,0,239,240,5,101,0,0,240,241,5,120,0,0, - 241,242,5,116,0,0,242,243,5,101,0,0,243,244,5,114,0,0,244,245,5, - 110,0,0,245,246,5,97,0,0,246,247,5,108,0,0,247,8,1,0,0,0,248,249, - 5,97,0,0,249,250,5,116,0,0,250,251,5,111,0,0,251,252,5,109,0,0,252, - 10,1,0,0,0,253,254,5,105,0,0,254,255,5,110,0,0,255,256,5,116,0,0, - 256,257,5,101,0,0,257,258,5,114,0,0,258,259,5,102,0,0,259,260,5, - 97,0,0,260,261,5,99,0,0,261,262,5,101,0,0,262,12,1,0,0,0,263,264, - 5,105,0,0,264,265,5,110,0,0,265,266,5,116,0,0,266,267,5,101,0,0, - 267,268,5,114,0,0,268,269,5,102,0,0,269,270,5,97,0,0,270,271,5,99, - 0,0,271,272,5,101,0,0,272,273,5,115,0,0,273,14,1,0,0,0,274,275,5, - 112,0,0,275,276,5,97,0,0,276,277,5,99,0,0,277,278,5,107,0,0,278, - 279,5,97,0,0,279,280,5,103,0,0,280,281,5,101,0,0,281,16,1,0,0,0, - 282,283,5,118,0,0,283,284,5,97,0,0,284,285,5,108,0,0,285,286,5,117, - 0,0,286,287,5,101,0,0,287,18,1,0,0,0,288,289,5,114,0,0,289,290,5, - 101,0,0,290,291,5,108,0,0,291,292,5,97,0,0,292,293,5,116,0,0,293, - 294,5,105,0,0,294,295,5,111,0,0,295,296,5,110,0,0,296,20,1,0,0,0, - 297,298,5,111,0,0,298,299,5,112,0,0,299,300,5,101,0,0,300,301,5, - 114,0,0,301,302,5,97,0,0,302,303,5,116,0,0,303,304,5,105,0,0,304, - 305,5,111,0,0,305,306,5,110,0,0,306,22,1,0,0,0,307,308,5,102,0,0, - 308,309,5,117,0,0,309,310,5,110,0,0,310,311,5,99,0,0,311,312,5,116, - 0,0,312,313,5,105,0,0,313,314,5,111,0,0,314,315,5,110,0,0,315,24, - 1,0,0,0,316,317,5,99,0,0,317,318,5,111,0,0,318,319,5,110,0,0,319, - 320,5,115,0,0,320,321,5,116,0,0,321,322,5,114,0,0,322,323,5,117, - 0,0,323,324,5,99,0,0,324,325,5,116,0,0,325,326,5,111,0,0,326,327, - 5,114,0,0,327,26,1,0,0,0,328,329,5,99,0,0,329,330,5,111,0,0,330, - 331,5,110,0,0,331,332,5,115,0,0,332,333,5,116,0,0,333,334,5,114, - 0,0,334,335,5,117,0,0,335,336,5,99,0,0,336,337,5,116,0,0,337,338, - 5,115,0,0,338,28,1,0,0,0,339,340,5,105,0,0,340,341,5,110,0,0,341, - 342,5,112,0,0,342,343,5,117,0,0,343,344,5,116,0,0,344,30,1,0,0,0, - 345,346,5,99,0,0,346,347,5,111,0,0,347,348,5,110,0,0,348,349,5,102, - 0,0,349,350,5,111,0,0,350,351,5,114,0,0,351,352,5,109,0,0,352,32, - 1,0,0,0,353,354,5,97,0,0,354,355,5,115,0,0,355,34,1,0,0,0,356,357, - 5,98,0,0,357,358,5,105,0,0,358,359,5,110,0,0,359,360,5,100,0,0,360, - 36,1,0,0,0,361,362,5,116,0,0,362,363,5,111,0,0,363,38,1,0,0,0,364, - 365,5,112,0,0,365,366,5,114,0,0,366,367,5,105,0,0,367,368,5,118, - 0,0,368,369,5,97,0,0,369,370,5,116,0,0,370,371,5,101,0,0,371,40, - 1,0,0,0,372,373,5,115,0,0,373,374,5,104,0,0,374,375,5,97,0,0,375, - 376,5,114,0,0,376,377,5,101,0,0,377,378,5,100,0,0,378,42,1,0,0,0, - 379,380,5,115,0,0,380,381,5,116,0,0,381,382,5,97,0,0,382,383,5,116, - 0,0,383,384,5,101,0,0,384,44,1,0,0,0,385,386,5,101,0,0,386,387,5, - 100,0,0,387,388,5,103,0,0,388,389,5,101,0,0,389,46,1,0,0,0,390,391, - 5,112,0,0,391,392,5,114,0,0,392,393,5,111,0,0,393,394,5,106,0,0, - 394,395,5,101,0,0,395,396,5,99,0,0,396,397,5,116,0,0,397,398,5,105, - 0,0,398,399,5,111,0,0,399,400,5,110,0,0,400,48,1,0,0,0,401,402,5, - 119,0,0,402,403,5,105,0,0,403,404,5,116,0,0,404,405,5,104,0,0,405, - 50,1,0,0,0,406,407,5,117,0,0,407,408,5,115,0,0,408,409,5,105,0,0, - 409,410,5,110,0,0,410,411,5,103,0,0,411,52,1,0,0,0,412,413,5,118, - 0,0,413,414,5,105,0,0,414,415,5,97,0,0,415,54,1,0,0,0,416,417,5, - 109,0,0,417,418,5,97,0,0,418,419,5,116,0,0,419,420,5,101,0,0,420, - 421,5,114,0,0,421,422,5,105,0,0,422,423,5,97,0,0,423,424,5,108,0, - 0,424,425,5,105,0,0,425,426,5,122,0,0,426,427,5,101,0,0,427,56,1, - 0,0,0,428,429,5,105,0,0,429,430,5,102,0,0,430,58,1,0,0,0,431,432, - 5,97,0,0,432,433,5,98,0,0,433,434,5,115,0,0,434,435,5,101,0,0,435, - 436,5,110,0,0,436,437,5,116,0,0,437,60,1,0,0,0,438,439,5,111,0,0, - 439,440,5,110,0,0,440,62,1,0,0,0,441,442,5,112,0,0,442,443,5,111, - 0,0,443,444,5,108,0,0,444,445,5,105,0,0,445,446,5,99,0,0,446,447, - 5,121,0,0,447,64,1,0,0,0,448,449,5,100,0,0,449,450,5,101,0,0,450, - 451,5,102,0,0,451,452,5,97,0,0,452,453,5,117,0,0,453,454,5,108,0, - 0,454,455,5,116,0,0,455,66,1,0,0,0,456,457,5,115,0,0,457,458,5,111, - 0,0,458,459,5,117,0,0,459,460,5,114,0,0,460,461,5,99,0,0,461,462, - 5,101,0,0,462,68,1,0,0,0,463,464,5,114,0,0,464,465,5,101,0,0,465, - 466,5,112,0,0,466,467,5,111,0,0,467,468,5,115,0,0,468,469,5,105, - 0,0,469,470,5,116,0,0,470,471,5,111,0,0,471,472,5,114,0,0,472,473, - 5,121,0,0,473,70,1,0,0,0,474,475,5,99,0,0,475,476,5,111,0,0,476, - 477,5,109,0,0,477,478,5,109,0,0,478,479,5,105,0,0,479,480,5,116, - 0,0,480,72,1,0,0,0,481,482,5,114,0,0,482,483,5,101,0,0,483,484,5, - 118,0,0,484,485,5,105,0,0,485,486,5,115,0,0,486,487,5,105,0,0,487, - 488,5,111,0,0,488,489,5,110,0,0,489,74,1,0,0,0,490,491,5,105,0,0, - 491,492,5,100,0,0,492,76,1,0,0,0,493,494,5,100,0,0,494,495,5,111, - 0,0,495,496,5,99,0,0,496,78,1,0,0,0,497,498,5,109,0,0,498,499,5, - 111,0,0,499,500,5,100,0,0,500,501,5,101,0,0,501,80,1,0,0,0,502,503, - 5,101,0,0,503,504,5,109,0,0,504,505,5,105,0,0,505,506,5,116,0,0, - 506,507,5,115,0,0,507,82,1,0,0,0,508,509,5,114,0,0,509,510,5,101, - 0,0,510,511,5,99,0,0,511,512,5,101,0,0,512,513,5,105,0,0,513,514, - 5,118,0,0,514,515,5,101,0,0,515,516,5,114,0,0,516,84,1,0,0,0,517, - 518,5,114,0,0,518,519,5,101,0,0,519,520,5,113,0,0,520,521,5,117, - 0,0,521,522,5,105,0,0,522,523,5,114,0,0,523,524,5,101,0,0,524,525, - 5,115,0,0,525,86,1,0,0,0,526,527,5,97,0,0,527,528,5,110,0,0,528, - 529,5,121,0,0,529,88,1,0,0,0,530,531,5,103,0,0,531,532,5,101,0,0, - 532,533,5,116,0,0,533,90,1,0,0,0,534,535,5,115,0,0,535,536,5,101, - 0,0,536,537,5,116,0,0,537,92,1,0,0,0,538,539,5,119,0,0,539,540,5, - 97,0,0,540,541,5,116,0,0,541,542,5,99,0,0,542,543,5,104,0,0,543, - 94,1,0,0,0,544,545,5,115,0,0,545,546,5,116,0,0,546,547,5,97,0,0, - 547,548,5,114,0,0,548,549,5,116,0,0,549,96,1,0,0,0,550,551,5,115, - 0,0,551,552,5,116,0,0,552,553,5,111,0,0,553,554,5,112,0,0,554,98, - 1,0,0,0,555,556,5,114,0,0,556,557,5,101,0,0,557,558,5,97,0,0,558, - 559,5,100,0,0,559,100,1,0,0,0,560,561,5,119,0,0,561,562,5,114,0, - 0,562,563,5,105,0,0,563,564,5,116,0,0,564,565,5,101,0,0,565,102, - 1,0,0,0,566,567,5,114,0,0,567,568,5,101,0,0,568,569,5,115,0,0,569, - 570,5,111,0,0,570,571,5,108,0,0,571,572,5,118,0,0,572,573,5,101, - 0,0,573,104,1,0,0,0,574,575,5,99,0,0,575,576,5,111,0,0,576,577,5, - 110,0,0,577,578,5,110,0,0,578,579,5,101,0,0,579,580,5,99,0,0,580, - 581,5,116,0,0,581,106,1,0,0,0,582,583,5,100,0,0,583,584,5,105,0, - 0,584,585,5,115,0,0,585,586,5,99,0,0,586,587,5,111,0,0,587,588,5, - 110,0,0,588,589,5,110,0,0,589,590,5,101,0,0,590,591,5,99,0,0,591, - 592,5,116,0,0,592,108,1,0,0,0,593,594,5,99,0,0,594,595,5,97,0,0, - 595,596,5,108,0,0,596,597,5,108,0,0,597,110,1,0,0,0,598,599,5,119, - 0,0,599,600,5,97,0,0,600,601,5,116,0,0,601,602,5,99,0,0,602,603, - 5,104,0,0,603,604,5,45,0,0,604,605,5,115,0,0,605,606,5,116,0,0,606, - 607,5,97,0,0,607,608,5,114,0,0,608,609,5,116,0,0,609,112,1,0,0,0, - 610,611,5,119,0,0,611,612,5,97,0,0,612,613,5,116,0,0,613,614,5,99, - 0,0,614,615,5,104,0,0,615,616,5,45,0,0,616,617,5,115,0,0,617,618, - 5,116,0,0,618,619,5,111,0,0,619,620,5,112,0,0,620,114,1,0,0,0,621, - 622,5,115,0,0,622,623,5,117,0,0,623,624,5,98,0,0,624,625,5,115,0, - 0,625,626,5,99,0,0,626,627,5,114,0,0,627,628,5,105,0,0,628,629,5, - 98,0,0,629,630,5,101,0,0,630,116,1,0,0,0,631,632,5,117,0,0,632,633, - 5,110,0,0,633,634,5,115,0,0,634,635,5,117,0,0,635,636,5,98,0,0,636, - 637,5,115,0,0,637,638,5,99,0,0,638,639,5,114,0,0,639,640,5,105,0, - 0,640,641,5,98,0,0,641,642,5,101,0,0,642,118,1,0,0,0,643,644,5,111, - 0,0,644,645,5,112,0,0,645,646,5,116,0,0,646,647,5,105,0,0,647,648, - 5,109,0,0,648,649,5,105,0,0,649,650,5,115,0,0,650,651,5,116,0,0, - 651,652,5,105,0,0,652,653,5,99,0,0,653,654,5,45,0,0,654,655,5,114, - 0,0,655,656,5,101,0,0,656,657,5,103,0,0,657,658,5,105,0,0,658,659, - 5,115,0,0,659,660,5,116,0,0,660,661,5,101,0,0,661,662,5,114,0,0, - 662,120,1,0,0,0,663,664,5,99,0,0,664,665,5,114,0,0,665,666,5,100, - 0,0,666,667,5,116,0,0,667,122,1,0,0,0,668,669,5,111,0,0,669,670, - 5,112,0,0,670,671,5,116,0,0,671,672,5,105,0,0,672,673,5,111,0,0, - 673,674,5,110,0,0,674,675,5,97,0,0,675,676,5,108,0,0,676,677,5,45, - 0,0,677,678,5,111,0,0,678,679,5,110,0,0,679,680,5,101,0,0,680,124, - 1,0,0,0,681,682,5,101,0,0,682,683,5,120,0,0,683,684,5,97,0,0,684, - 685,5,99,0,0,685,686,5,116,0,0,686,687,5,108,0,0,687,688,5,121,0, - 0,688,689,5,45,0,0,689,690,5,111,0,0,690,691,5,110,0,0,691,692,5, - 101,0,0,692,126,1,0,0,0,693,694,5,109,0,0,694,695,5,97,0,0,695,696, - 5,110,0,0,696,697,5,121,0,0,697,698,5,45,0,0,698,699,5,117,0,0,699, - 700,5,110,0,0,700,701,5,105,0,0,701,702,5,113,0,0,702,703,5,117, - 0,0,703,704,5,101,0,0,704,128,1,0,0,0,705,706,5,109,0,0,706,707, - 5,97,0,0,707,708,5,110,0,0,708,709,5,121,0,0,709,130,1,0,0,0,710, - 711,5,111,0,0,711,712,5,114,0,0,712,713,5,100,0,0,713,714,5,101, - 0,0,714,715,5,114,0,0,715,716,5,101,0,0,716,717,5,100,0,0,717,132, - 1,0,0,0,718,719,5,117,0,0,719,720,5,110,0,0,720,721,5,105,0,0,721, - 722,5,116,0,0,722,134,1,0,0,0,723,724,5,119,0,0,724,725,5,97,0,0, - 725,726,5,116,0,0,726,727,5,99,0,0,727,728,5,104,0,0,728,729,5,45, - 0,0,729,730,5,104,0,0,730,731,5,97,0,0,731,732,5,110,0,0,732,733, - 5,100,0,0,733,734,5,108,0,0,734,735,5,101,0,0,735,136,1,0,0,0,736, - 737,5,109,0,0,737,738,5,101,0,0,738,739,5,115,0,0,739,740,5,115, - 0,0,740,741,5,97,0,0,741,742,5,103,0,0,742,743,5,101,0,0,743,138, - 1,0,0,0,744,745,5,97,0,0,745,746,5,116,0,0,746,747,5,111,0,0,747, - 748,5,109,0,0,748,749,5,45,0,0,749,750,5,114,0,0,750,751,5,101,0, - 0,751,752,5,102,0,0,752,140,1,0,0,0,753,754,5,105,0,0,754,755,5, - 110,0,0,755,756,5,116,0,0,756,757,5,101,0,0,757,758,5,114,0,0,758, - 759,5,102,0,0,759,760,5,97,0,0,760,761,5,99,0,0,761,762,5,101,0, - 0,762,763,5,45,0,0,763,764,5,114,0,0,764,765,5,101,0,0,765,766,5, - 102,0,0,766,142,1,0,0,0,767,768,5,111,0,0,768,769,5,112,0,0,769, - 770,5,116,0,0,770,771,5,105,0,0,771,772,5,111,0,0,772,773,5,110, - 0,0,773,774,5,97,0,0,774,775,5,108,0,0,775,144,1,0,0,0,776,777,5, - 108,0,0,777,778,5,105,0,0,778,779,5,115,0,0,779,780,5,116,0,0,780, - 146,1,0,0,0,781,782,5,98,0,0,782,783,5,111,0,0,783,784,5,111,0,0, - 784,785,5,108,0,0,785,148,1,0,0,0,786,787,5,98,0,0,787,788,5,121, - 0,0,788,789,5,116,0,0,789,790,5,101,0,0,790,791,5,115,0,0,791,150, - 1,0,0,0,792,793,5,100,0,0,793,794,5,111,0,0,794,795,5,117,0,0,795, - 796,5,98,0,0,796,797,5,108,0,0,797,798,5,101,0,0,798,152,1,0,0,0, - 799,800,5,105,0,0,800,801,5,110,0,0,801,802,5,116,0,0,802,803,5, - 51,0,0,803,804,5,50,0,0,804,154,1,0,0,0,805,806,5,105,0,0,806,807, - 5,110,0,0,807,808,5,116,0,0,808,809,5,54,0,0,809,810,5,52,0,0,810, - 156,1,0,0,0,811,812,5,115,0,0,812,813,5,116,0,0,813,814,5,114,0, - 0,814,815,5,105,0,0,815,816,5,110,0,0,816,817,5,103,0,0,817,158, - 1,0,0,0,818,819,5,117,0,0,819,820,5,105,0,0,820,821,5,110,0,0,821, - 822,5,116,0,0,822,823,5,51,0,0,823,824,5,50,0,0,824,160,1,0,0,0, - 825,826,5,117,0,0,826,827,5,105,0,0,827,828,5,110,0,0,828,829,5, - 116,0,0,829,830,5,54,0,0,830,831,5,52,0,0,831,162,1,0,0,0,832,833, - 5,116,0,0,833,834,5,114,0,0,834,835,5,117,0,0,835,836,5,101,0,0, - 836,164,1,0,0,0,837,838,5,102,0,0,838,839,5,97,0,0,839,840,5,108, - 0,0,840,841,5,115,0,0,841,842,5,101,0,0,842,166,1,0,0,0,843,844, - 5,110,0,0,844,845,5,117,0,0,845,846,5,108,0,0,846,847,5,108,0,0, - 847,168,1,0,0,0,848,849,5,45,0,0,849,850,5,62,0,0,850,170,1,0,0, - 0,851,852,5,58,0,0,852,172,1,0,0,0,853,854,5,59,0,0,854,174,1,0, - 0,0,855,856,5,44,0,0,856,176,1,0,0,0,857,858,5,46,0,0,858,178,1, - 0,0,0,859,860,5,123,0,0,860,180,1,0,0,0,861,862,5,125,0,0,862,182, - 1,0,0,0,863,864,5,91,0,0,864,184,1,0,0,0,865,866,5,93,0,0,866,186, - 1,0,0,0,867,868,5,40,0,0,868,188,1,0,0,0,869,870,5,41,0,0,870,190, - 1,0,0,0,871,872,5,60,0,0,872,192,1,0,0,0,873,874,5,62,0,0,874,194, - 1,0,0,0,875,877,5,45,0,0,876,875,1,0,0,0,876,877,1,0,0,0,877,879, - 1,0,0,0,878,880,7,0,0,0,879,878,1,0,0,0,880,881,1,0,0,0,881,879, - 1,0,0,0,881,882,1,0,0,0,882,196,1,0,0,0,883,885,5,45,0,0,884,883, - 1,0,0,0,884,885,1,0,0,0,885,894,1,0,0,0,886,895,5,48,0,0,887,891, - 7,1,0,0,888,890,7,0,0,0,889,888,1,0,0,0,890,893,1,0,0,0,891,889, - 1,0,0,0,891,892,1,0,0,0,892,895,1,0,0,0,893,891,1,0,0,0,894,886, - 1,0,0,0,894,887,1,0,0,0,895,902,1,0,0,0,896,898,5,46,0,0,897,899, - 7,0,0,0,898,897,1,0,0,0,899,900,1,0,0,0,900,898,1,0,0,0,900,901, - 1,0,0,0,901,903,1,0,0,0,902,896,1,0,0,0,902,903,1,0,0,0,903,913, - 1,0,0,0,904,906,7,2,0,0,905,907,7,3,0,0,906,905,1,0,0,0,906,907, - 1,0,0,0,907,909,1,0,0,0,908,910,7,0,0,0,909,908,1,0,0,0,910,911, - 1,0,0,0,911,909,1,0,0,0,911,912,1,0,0,0,912,914,1,0,0,0,913,904, - 1,0,0,0,913,914,1,0,0,0,914,198,1,0,0,0,915,919,7,4,0,0,916,918, - 7,5,0,0,917,916,1,0,0,0,918,921,1,0,0,0,919,917,1,0,0,0,919,920, - 1,0,0,0,920,200,1,0,0,0,921,919,1,0,0,0,922,927,5,34,0,0,923,926, - 3,203,101,0,924,926,8,6,0,0,925,923,1,0,0,0,925,924,1,0,0,0,926, - 929,1,0,0,0,927,925,1,0,0,0,927,928,1,0,0,0,928,930,1,0,0,0,929, - 927,1,0,0,0,930,931,5,34,0,0,931,202,1,0,0,0,932,940,5,92,0,0,933, - 941,7,7,0,0,934,935,5,117,0,0,935,936,3,205,102,0,936,937,3,205, - 102,0,937,938,3,205,102,0,938,939,3,205,102,0,939,941,1,0,0,0,940, - 933,1,0,0,0,940,934,1,0,0,0,941,204,1,0,0,0,942,943,7,8,0,0,943, - 206,1,0,0,0,944,945,5,47,0,0,945,946,5,47,0,0,946,950,1,0,0,0,947, - 949,8,9,0,0,948,947,1,0,0,0,949,952,1,0,0,0,950,948,1,0,0,0,950, - 951,1,0,0,0,951,953,1,0,0,0,952,950,1,0,0,0,953,954,6,103,0,0,954, - 208,1,0,0,0,955,956,5,47,0,0,956,957,5,42,0,0,957,961,1,0,0,0,958, - 960,9,0,0,0,959,958,1,0,0,0,960,963,1,0,0,0,961,962,1,0,0,0,961, - 959,1,0,0,0,962,964,1,0,0,0,963,961,1,0,0,0,964,965,5,42,0,0,965, - 966,5,47,0,0,966,967,1,0,0,0,967,968,6,104,0,0,968,210,1,0,0,0,969, - 971,7,10,0,0,970,969,1,0,0,0,971,972,1,0,0,0,972,970,1,0,0,0,972, - 973,1,0,0,0,973,974,1,0,0,0,974,975,6,105,0,0,975,212,1,0,0,0,18, - 0,876,881,884,891,894,900,902,906,911,913,919,925,927,940,950,961, - 972,1,0,1,0 + 1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,64, + 1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,64, + 1,64,1,64,1,64,1,64,1,64,1,64,1,65,1,65,1,65,1,65,1,65,1,66,1,66, + 1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,67,1,67, + 1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,68,1,68,1,68, + 1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,69,1,69,1,69,1,69, + 1,69,1,70,1,70,1,70,1,70,1,70,1,70,1,70,1,70,1,71,1,71,1,71,1,71, + 1,71,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72, + 1,72,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,73,1,74,1,74,1,74,1,74, + 1,74,1,74,1,74,1,74,1,74,1,75,1,75,1,75,1,75,1,75,1,75,1,75,1,75, + 1,75,1,75,1,75,1,75,1,75,1,75,1,76,1,76,1,76,1,76,1,76,1,76,1,76, + 1,76,1,76,1,77,1,77,1,77,1,77,1,77,1,78,1,78,1,78,1,78,1,78,1,79, + 1,79,1,79,1,79,1,79,1,79,1,80,1,80,1,80,1,80,1,80,1,80,1,80,1,81, + 1,81,1,81,1,81,1,81,1,81,1,82,1,82,1,82,1,82,1,82,1,82,1,83,1,83, + 1,83,1,83,1,83,1,83,1,83,1,84,1,84,1,84,1,84,1,84,1,84,1,84,1,85, + 1,85,1,85,1,85,1,85,1,85,1,85,1,86,1,86,1,86,1,86,1,86,1,87,1,87, + 1,87,1,87,1,87,1,87,1,88,1,88,1,88,1,88,1,88,1,89,1,89,1,89,1,90, + 1,90,1,91,1,91,1,92,1,92,1,93,1,93,1,94,1,94,1,95,1,95,1,96,1,96, + 1,97,1,97,1,98,1,98,1,99,1,99,1,100,1,100,1,101,1,101,1,102,3,102, + 948,8,102,1,102,4,102,951,8,102,11,102,12,102,952,1,103,3,103,956, + 8,103,1,103,1,103,1,103,5,103,961,8,103,10,103,12,103,964,9,103, + 3,103,966,8,103,1,103,1,103,4,103,970,8,103,11,103,12,103,971,3, + 103,974,8,103,1,103,1,103,3,103,978,8,103,1,103,4,103,981,8,103, + 11,103,12,103,982,3,103,985,8,103,1,104,1,104,5,104,989,8,104,10, + 104,12,104,992,9,104,1,105,1,105,1,105,5,105,997,8,105,10,105,12, + 105,1000,9,105,1,105,1,105,1,106,1,106,1,106,1,106,1,106,1,106,1, + 106,1,106,3,106,1012,8,106,1,107,1,107,1,108,1,108,1,108,1,108,5, + 108,1020,8,108,10,108,12,108,1023,9,108,1,108,1,108,1,109,1,109, + 1,109,1,109,5,109,1031,8,109,10,109,12,109,1034,9,109,1,109,1,109, + 1,109,1,109,1,109,1,110,4,110,1042,8,110,11,110,12,110,1043,1,110, + 1,110,1,1032,0,111,1,1,3,2,5,3,7,4,9,5,11,6,13,7,15,8,17,9,19,10, + 21,11,23,12,25,13,27,14,29,15,31,16,33,17,35,18,37,19,39,20,41,21, + 43,22,45,23,47,24,49,25,51,26,53,27,55,28,57,29,59,30,61,31,63,32, + 65,33,67,34,69,35,71,36,73,37,75,38,77,39,79,40,81,41,83,42,85,43, + 87,44,89,45,91,46,93,47,95,48,97,49,99,50,101,51,103,52,105,53,107, + 54,109,55,111,56,113,57,115,58,117,59,119,60,121,61,123,62,125,63, + 127,64,129,65,131,66,133,67,135,68,137,69,139,70,141,71,143,72,145, + 73,147,74,149,75,151,76,153,77,155,78,157,79,159,80,161,81,163,82, + 165,83,167,84,169,85,171,86,173,87,175,88,177,89,179,90,181,91,183, + 92,185,93,187,94,189,95,191,96,193,97,195,98,197,99,199,100,201, + 101,203,102,205,103,207,104,209,105,211,106,213,0,215,0,217,107, + 219,108,221,109,1,0,11,1,0,48,57,1,0,49,57,2,0,69,69,101,101,2,0, + 43,43,45,45,3,0,65,90,95,95,97,122,4,0,48,57,65,90,95,95,97,122, + 4,0,10,10,13,13,34,34,92,92,8,0,34,34,47,47,92,92,98,98,102,102, + 110,110,114,114,116,116,3,0,48,57,65,70,97,102,2,0,10,10,13,13,3, + 0,9,10,13,13,32,32,1061,0,1,1,0,0,0,0,3,1,0,0,0,0,5,1,0,0,0,0,7, + 1,0,0,0,0,9,1,0,0,0,0,11,1,0,0,0,0,13,1,0,0,0,0,15,1,0,0,0,0,17, + 1,0,0,0,0,19,1,0,0,0,0,21,1,0,0,0,0,23,1,0,0,0,0,25,1,0,0,0,0,27, + 1,0,0,0,0,29,1,0,0,0,0,31,1,0,0,0,0,33,1,0,0,0,0,35,1,0,0,0,0,37, + 1,0,0,0,0,39,1,0,0,0,0,41,1,0,0,0,0,43,1,0,0,0,0,45,1,0,0,0,0,47, + 1,0,0,0,0,49,1,0,0,0,0,51,1,0,0,0,0,53,1,0,0,0,0,55,1,0,0,0,0,57, + 1,0,0,0,0,59,1,0,0,0,0,61,1,0,0,0,0,63,1,0,0,0,0,65,1,0,0,0,0,67, + 1,0,0,0,0,69,1,0,0,0,0,71,1,0,0,0,0,73,1,0,0,0,0,75,1,0,0,0,0,77, + 1,0,0,0,0,79,1,0,0,0,0,81,1,0,0,0,0,83,1,0,0,0,0,85,1,0,0,0,0,87, + 1,0,0,0,0,89,1,0,0,0,0,91,1,0,0,0,0,93,1,0,0,0,0,95,1,0,0,0,0,97, + 1,0,0,0,0,99,1,0,0,0,0,101,1,0,0,0,0,103,1,0,0,0,0,105,1,0,0,0,0, + 107,1,0,0,0,0,109,1,0,0,0,0,111,1,0,0,0,0,113,1,0,0,0,0,115,1,0, + 0,0,0,117,1,0,0,0,0,119,1,0,0,0,0,121,1,0,0,0,0,123,1,0,0,0,0,125, + 1,0,0,0,0,127,1,0,0,0,0,129,1,0,0,0,0,131,1,0,0,0,0,133,1,0,0,0, + 0,135,1,0,0,0,0,137,1,0,0,0,0,139,1,0,0,0,0,141,1,0,0,0,0,143,1, + 0,0,0,0,145,1,0,0,0,0,147,1,0,0,0,0,149,1,0,0,0,0,151,1,0,0,0,0, + 153,1,0,0,0,0,155,1,0,0,0,0,157,1,0,0,0,0,159,1,0,0,0,0,161,1,0, + 0,0,0,163,1,0,0,0,0,165,1,0,0,0,0,167,1,0,0,0,0,169,1,0,0,0,0,171, + 1,0,0,0,0,173,1,0,0,0,0,175,1,0,0,0,0,177,1,0,0,0,0,179,1,0,0,0, + 0,181,1,0,0,0,0,183,1,0,0,0,0,185,1,0,0,0,0,187,1,0,0,0,0,189,1, + 0,0,0,0,191,1,0,0,0,0,193,1,0,0,0,0,195,1,0,0,0,0,197,1,0,0,0,0, + 199,1,0,0,0,0,201,1,0,0,0,0,203,1,0,0,0,0,205,1,0,0,0,0,207,1,0, + 0,0,0,209,1,0,0,0,0,211,1,0,0,0,0,217,1,0,0,0,0,219,1,0,0,0,0,221, + 1,0,0,0,1,223,1,0,0,0,3,233,1,0,0,0,5,242,1,0,0,0,7,249,1,0,0,0, + 9,258,1,0,0,0,11,263,1,0,0,0,13,273,1,0,0,0,15,284,1,0,0,0,17,292, + 1,0,0,0,19,298,1,0,0,0,21,307,1,0,0,0,23,317,1,0,0,0,25,326,1,0, + 0,0,27,338,1,0,0,0,29,349,1,0,0,0,31,355,1,0,0,0,33,363,1,0,0,0, + 35,366,1,0,0,0,37,371,1,0,0,0,39,374,1,0,0,0,41,382,1,0,0,0,43,389, + 1,0,0,0,45,395,1,0,0,0,47,400,1,0,0,0,49,411,1,0,0,0,51,416,1,0, + 0,0,53,422,1,0,0,0,55,426,1,0,0,0,57,438,1,0,0,0,59,441,1,0,0,0, + 61,448,1,0,0,0,63,451,1,0,0,0,65,458,1,0,0,0,67,466,1,0,0,0,69,473, + 1,0,0,0,71,484,1,0,0,0,73,491,1,0,0,0,75,500,1,0,0,0,77,515,1,0, + 0,0,79,525,1,0,0,0,81,538,1,0,0,0,83,544,1,0,0,0,85,561,1,0,0,0, + 87,564,1,0,0,0,89,568,1,0,0,0,91,573,1,0,0,0,93,579,1,0,0,0,95,588, + 1,0,0,0,97,597,1,0,0,0,99,601,1,0,0,0,101,605,1,0,0,0,103,609,1, + 0,0,0,105,615,1,0,0,0,107,621,1,0,0,0,109,626,1,0,0,0,111,631,1, + 0,0,0,113,637,1,0,0,0,115,645,1,0,0,0,117,653,1,0,0,0,119,664,1, + 0,0,0,121,669,1,0,0,0,123,681,1,0,0,0,125,692,1,0,0,0,127,702,1, + 0,0,0,129,714,1,0,0,0,131,734,1,0,0,0,133,739,1,0,0,0,135,752,1, + 0,0,0,137,764,1,0,0,0,139,776,1,0,0,0,141,781,1,0,0,0,143,789,1, + 0,0,0,145,794,1,0,0,0,147,807,1,0,0,0,149,815,1,0,0,0,151,824,1, + 0,0,0,153,838,1,0,0,0,155,847,1,0,0,0,157,852,1,0,0,0,159,857,1, + 0,0,0,161,863,1,0,0,0,163,870,1,0,0,0,165,876,1,0,0,0,167,882,1, + 0,0,0,169,889,1,0,0,0,171,896,1,0,0,0,173,903,1,0,0,0,175,908,1, + 0,0,0,177,914,1,0,0,0,179,919,1,0,0,0,181,922,1,0,0,0,183,924,1, + 0,0,0,185,926,1,0,0,0,187,928,1,0,0,0,189,930,1,0,0,0,191,932,1, + 0,0,0,193,934,1,0,0,0,195,936,1,0,0,0,197,938,1,0,0,0,199,940,1, + 0,0,0,201,942,1,0,0,0,203,944,1,0,0,0,205,947,1,0,0,0,207,955,1, + 0,0,0,209,986,1,0,0,0,211,993,1,0,0,0,213,1003,1,0,0,0,215,1013, + 1,0,0,0,217,1015,1,0,0,0,219,1026,1,0,0,0,221,1041,1,0,0,0,223,224, + 5,119,0,0,224,225,5,111,0,0,225,226,5,114,0,0,226,227,5,107,0,0, + 227,228,5,115,0,0,228,229,5,112,0,0,229,230,5,97,0,0,230,231,5,99, + 0,0,231,232,5,101,0,0,232,2,1,0,0,0,233,234,5,102,0,0,234,235,5, + 114,0,0,235,236,5,97,0,0,236,237,5,103,0,0,237,238,5,109,0,0,238, + 239,5,101,0,0,239,240,5,110,0,0,240,241,5,116,0,0,241,4,1,0,0,0, + 242,243,5,105,0,0,243,244,5,109,0,0,244,245,5,112,0,0,245,246,5, + 111,0,0,246,247,5,114,0,0,247,248,5,116,0,0,248,6,1,0,0,0,249,250, + 5,101,0,0,250,251,5,120,0,0,251,252,5,116,0,0,252,253,5,101,0,0, + 253,254,5,114,0,0,254,255,5,110,0,0,255,256,5,97,0,0,256,257,5,108, + 0,0,257,8,1,0,0,0,258,259,5,97,0,0,259,260,5,116,0,0,260,261,5,111, + 0,0,261,262,5,109,0,0,262,10,1,0,0,0,263,264,5,105,0,0,264,265,5, + 110,0,0,265,266,5,116,0,0,266,267,5,101,0,0,267,268,5,114,0,0,268, + 269,5,102,0,0,269,270,5,97,0,0,270,271,5,99,0,0,271,272,5,101,0, + 0,272,12,1,0,0,0,273,274,5,105,0,0,274,275,5,110,0,0,275,276,5,116, + 0,0,276,277,5,101,0,0,277,278,5,114,0,0,278,279,5,102,0,0,279,280, + 5,97,0,0,280,281,5,99,0,0,281,282,5,101,0,0,282,283,5,115,0,0,283, + 14,1,0,0,0,284,285,5,112,0,0,285,286,5,97,0,0,286,287,5,99,0,0,287, + 288,5,107,0,0,288,289,5,97,0,0,289,290,5,103,0,0,290,291,5,101,0, + 0,291,16,1,0,0,0,292,293,5,118,0,0,293,294,5,97,0,0,294,295,5,108, + 0,0,295,296,5,117,0,0,296,297,5,101,0,0,297,18,1,0,0,0,298,299,5, + 114,0,0,299,300,5,101,0,0,300,301,5,108,0,0,301,302,5,97,0,0,302, + 303,5,116,0,0,303,304,5,105,0,0,304,305,5,111,0,0,305,306,5,110, + 0,0,306,20,1,0,0,0,307,308,5,111,0,0,308,309,5,112,0,0,309,310,5, + 101,0,0,310,311,5,114,0,0,311,312,5,97,0,0,312,313,5,116,0,0,313, + 314,5,105,0,0,314,315,5,111,0,0,315,316,5,110,0,0,316,22,1,0,0,0, + 317,318,5,102,0,0,318,319,5,117,0,0,319,320,5,110,0,0,320,321,5, + 99,0,0,321,322,5,116,0,0,322,323,5,105,0,0,323,324,5,111,0,0,324, + 325,5,110,0,0,325,24,1,0,0,0,326,327,5,99,0,0,327,328,5,111,0,0, + 328,329,5,110,0,0,329,330,5,115,0,0,330,331,5,116,0,0,331,332,5, + 114,0,0,332,333,5,117,0,0,333,334,5,99,0,0,334,335,5,116,0,0,335, + 336,5,111,0,0,336,337,5,114,0,0,337,26,1,0,0,0,338,339,5,99,0,0, + 339,340,5,111,0,0,340,341,5,110,0,0,341,342,5,115,0,0,342,343,5, + 116,0,0,343,344,5,114,0,0,344,345,5,117,0,0,345,346,5,99,0,0,346, + 347,5,116,0,0,347,348,5,115,0,0,348,28,1,0,0,0,349,350,5,105,0,0, + 350,351,5,110,0,0,351,352,5,112,0,0,352,353,5,117,0,0,353,354,5, + 116,0,0,354,30,1,0,0,0,355,356,5,99,0,0,356,357,5,111,0,0,357,358, + 5,110,0,0,358,359,5,102,0,0,359,360,5,111,0,0,360,361,5,114,0,0, + 361,362,5,109,0,0,362,32,1,0,0,0,363,364,5,97,0,0,364,365,5,115, + 0,0,365,34,1,0,0,0,366,367,5,98,0,0,367,368,5,105,0,0,368,369,5, + 110,0,0,369,370,5,100,0,0,370,36,1,0,0,0,371,372,5,116,0,0,372,373, + 5,111,0,0,373,38,1,0,0,0,374,375,5,112,0,0,375,376,5,114,0,0,376, + 377,5,105,0,0,377,378,5,118,0,0,378,379,5,97,0,0,379,380,5,116,0, + 0,380,381,5,101,0,0,381,40,1,0,0,0,382,383,5,115,0,0,383,384,5,104, + 0,0,384,385,5,97,0,0,385,386,5,114,0,0,386,387,5,101,0,0,387,388, + 5,100,0,0,388,42,1,0,0,0,389,390,5,115,0,0,390,391,5,116,0,0,391, + 392,5,97,0,0,392,393,5,116,0,0,393,394,5,101,0,0,394,44,1,0,0,0, + 395,396,5,101,0,0,396,397,5,100,0,0,397,398,5,103,0,0,398,399,5, + 101,0,0,399,46,1,0,0,0,400,401,5,112,0,0,401,402,5,114,0,0,402,403, + 5,111,0,0,403,404,5,106,0,0,404,405,5,101,0,0,405,406,5,99,0,0,406, + 407,5,116,0,0,407,408,5,105,0,0,408,409,5,111,0,0,409,410,5,110, + 0,0,410,48,1,0,0,0,411,412,5,119,0,0,412,413,5,105,0,0,413,414,5, + 116,0,0,414,415,5,104,0,0,415,50,1,0,0,0,416,417,5,117,0,0,417,418, + 5,115,0,0,418,419,5,105,0,0,419,420,5,110,0,0,420,421,5,103,0,0, + 421,52,1,0,0,0,422,423,5,118,0,0,423,424,5,105,0,0,424,425,5,97, + 0,0,425,54,1,0,0,0,426,427,5,109,0,0,427,428,5,97,0,0,428,429,5, + 116,0,0,429,430,5,101,0,0,430,431,5,114,0,0,431,432,5,105,0,0,432, + 433,5,97,0,0,433,434,5,108,0,0,434,435,5,105,0,0,435,436,5,122,0, + 0,436,437,5,101,0,0,437,56,1,0,0,0,438,439,5,105,0,0,439,440,5,102, + 0,0,440,58,1,0,0,0,441,442,5,97,0,0,442,443,5,98,0,0,443,444,5,115, + 0,0,444,445,5,101,0,0,445,446,5,110,0,0,446,447,5,116,0,0,447,60, + 1,0,0,0,448,449,5,111,0,0,449,450,5,110,0,0,450,62,1,0,0,0,451,452, + 5,112,0,0,452,453,5,111,0,0,453,454,5,108,0,0,454,455,5,105,0,0, + 455,456,5,99,0,0,456,457,5,121,0,0,457,64,1,0,0,0,458,459,5,100, + 0,0,459,460,5,101,0,0,460,461,5,102,0,0,461,462,5,97,0,0,462,463, + 5,117,0,0,463,464,5,108,0,0,464,465,5,116,0,0,465,66,1,0,0,0,466, + 467,5,115,0,0,467,468,5,111,0,0,468,469,5,117,0,0,469,470,5,114, + 0,0,470,471,5,99,0,0,471,472,5,101,0,0,472,68,1,0,0,0,473,474,5, + 114,0,0,474,475,5,101,0,0,475,476,5,112,0,0,476,477,5,111,0,0,477, + 478,5,115,0,0,478,479,5,105,0,0,479,480,5,116,0,0,480,481,5,111, + 0,0,481,482,5,114,0,0,482,483,5,121,0,0,483,70,1,0,0,0,484,485,5, + 99,0,0,485,486,5,111,0,0,486,487,5,109,0,0,487,488,5,109,0,0,488, + 489,5,105,0,0,489,490,5,116,0,0,490,72,1,0,0,0,491,492,5,114,0,0, + 492,493,5,101,0,0,493,494,5,118,0,0,494,495,5,105,0,0,495,496,5, + 115,0,0,496,497,5,105,0,0,497,498,5,111,0,0,498,499,5,110,0,0,499, + 74,1,0,0,0,500,501,5,115,0,0,501,502,5,101,0,0,502,503,5,109,0,0, + 503,504,5,97,0,0,504,505,5,110,0,0,505,506,5,116,0,0,506,507,5,105, + 0,0,507,508,5,99,0,0,508,509,5,45,0,0,509,510,5,109,0,0,510,511, + 5,97,0,0,511,512,5,106,0,0,512,513,5,111,0,0,513,514,5,114,0,0,514, + 76,1,0,0,0,515,516,5,111,0,0,516,517,5,110,0,0,517,518,5,45,0,0, + 518,519,5,100,0,0,519,520,5,101,0,0,520,521,5,108,0,0,521,522,5, + 101,0,0,522,523,5,116,0,0,523,524,5,101,0,0,524,78,1,0,0,0,525,526, + 5,114,0,0,526,527,5,101,0,0,527,528,5,116,0,0,528,529,5,97,0,0,529, + 530,5,105,0,0,530,531,5,110,0,0,531,532,5,45,0,0,532,533,5,111,0, + 0,533,534,5,116,0,0,534,535,5,104,0,0,535,536,5,101,0,0,536,537, + 5,114,0,0,537,80,1,0,0,0,538,539,5,107,0,0,539,540,5,101,0,0,540, + 541,5,121,0,0,541,542,5,101,0,0,542,543,5,100,0,0,543,82,1,0,0,0, + 544,545,5,112,0,0,545,546,5,117,0,0,546,547,5,98,0,0,547,548,5,108, + 0,0,548,549,5,105,0,0,549,550,5,99,0,0,550,551,5,45,0,0,551,552, + 5,116,0,0,552,553,5,114,0,0,553,554,5,97,0,0,554,555,5,118,0,0,555, + 556,5,101,0,0,556,557,5,114,0,0,557,558,5,115,0,0,558,559,5,97,0, + 0,559,560,5,108,0,0,560,84,1,0,0,0,561,562,5,105,0,0,562,563,5,100, + 0,0,563,86,1,0,0,0,564,565,5,100,0,0,565,566,5,111,0,0,566,567,5, + 99,0,0,567,88,1,0,0,0,568,569,5,109,0,0,569,570,5,111,0,0,570,571, + 5,100,0,0,571,572,5,101,0,0,572,90,1,0,0,0,573,574,5,101,0,0,574, + 575,5,109,0,0,575,576,5,105,0,0,576,577,5,116,0,0,577,578,5,115, + 0,0,578,92,1,0,0,0,579,580,5,114,0,0,580,581,5,101,0,0,581,582,5, + 99,0,0,582,583,5,101,0,0,583,584,5,105,0,0,584,585,5,118,0,0,585, + 586,5,101,0,0,586,587,5,114,0,0,587,94,1,0,0,0,588,589,5,114,0,0, + 589,590,5,101,0,0,590,591,5,113,0,0,591,592,5,117,0,0,592,593,5, + 105,0,0,593,594,5,114,0,0,594,595,5,101,0,0,595,596,5,115,0,0,596, + 96,1,0,0,0,597,598,5,97,0,0,598,599,5,110,0,0,599,600,5,121,0,0, + 600,98,1,0,0,0,601,602,5,103,0,0,602,603,5,101,0,0,603,604,5,116, + 0,0,604,100,1,0,0,0,605,606,5,115,0,0,606,607,5,101,0,0,607,608, + 5,116,0,0,608,102,1,0,0,0,609,610,5,119,0,0,610,611,5,97,0,0,611, + 612,5,116,0,0,612,613,5,99,0,0,613,614,5,104,0,0,614,104,1,0,0,0, + 615,616,5,115,0,0,616,617,5,116,0,0,617,618,5,97,0,0,618,619,5,114, + 0,0,619,620,5,116,0,0,620,106,1,0,0,0,621,622,5,115,0,0,622,623, + 5,116,0,0,623,624,5,111,0,0,624,625,5,112,0,0,625,108,1,0,0,0,626, + 627,5,114,0,0,627,628,5,101,0,0,628,629,5,97,0,0,629,630,5,100,0, + 0,630,110,1,0,0,0,631,632,5,119,0,0,632,633,5,114,0,0,633,634,5, + 105,0,0,634,635,5,116,0,0,635,636,5,101,0,0,636,112,1,0,0,0,637, + 638,5,114,0,0,638,639,5,101,0,0,639,640,5,115,0,0,640,641,5,111, + 0,0,641,642,5,108,0,0,642,643,5,118,0,0,643,644,5,101,0,0,644,114, + 1,0,0,0,645,646,5,99,0,0,646,647,5,111,0,0,647,648,5,110,0,0,648, + 649,5,110,0,0,649,650,5,101,0,0,650,651,5,99,0,0,651,652,5,116,0, + 0,652,116,1,0,0,0,653,654,5,100,0,0,654,655,5,105,0,0,655,656,5, + 115,0,0,656,657,5,99,0,0,657,658,5,111,0,0,658,659,5,110,0,0,659, + 660,5,110,0,0,660,661,5,101,0,0,661,662,5,99,0,0,662,663,5,116,0, + 0,663,118,1,0,0,0,664,665,5,99,0,0,665,666,5,97,0,0,666,667,5,108, + 0,0,667,668,5,108,0,0,668,120,1,0,0,0,669,670,5,119,0,0,670,671, + 5,97,0,0,671,672,5,116,0,0,672,673,5,99,0,0,673,674,5,104,0,0,674, + 675,5,45,0,0,675,676,5,115,0,0,676,677,5,116,0,0,677,678,5,97,0, + 0,678,679,5,114,0,0,679,680,5,116,0,0,680,122,1,0,0,0,681,682,5, + 119,0,0,682,683,5,97,0,0,683,684,5,116,0,0,684,685,5,99,0,0,685, + 686,5,104,0,0,686,687,5,45,0,0,687,688,5,115,0,0,688,689,5,116,0, + 0,689,690,5,111,0,0,690,691,5,112,0,0,691,124,1,0,0,0,692,693,5, + 115,0,0,693,694,5,117,0,0,694,695,5,98,0,0,695,696,5,115,0,0,696, + 697,5,99,0,0,697,698,5,114,0,0,698,699,5,105,0,0,699,700,5,98,0, + 0,700,701,5,101,0,0,701,126,1,0,0,0,702,703,5,117,0,0,703,704,5, + 110,0,0,704,705,5,115,0,0,705,706,5,117,0,0,706,707,5,98,0,0,707, + 708,5,115,0,0,708,709,5,99,0,0,709,710,5,114,0,0,710,711,5,105,0, + 0,711,712,5,98,0,0,712,713,5,101,0,0,713,128,1,0,0,0,714,715,5,111, + 0,0,715,716,5,112,0,0,716,717,5,116,0,0,717,718,5,105,0,0,718,719, + 5,109,0,0,719,720,5,105,0,0,720,721,5,115,0,0,721,722,5,116,0,0, + 722,723,5,105,0,0,723,724,5,99,0,0,724,725,5,45,0,0,725,726,5,114, + 0,0,726,727,5,101,0,0,727,728,5,103,0,0,728,729,5,105,0,0,729,730, + 5,115,0,0,730,731,5,116,0,0,731,732,5,101,0,0,732,733,5,114,0,0, + 733,130,1,0,0,0,734,735,5,99,0,0,735,736,5,114,0,0,736,737,5,100, + 0,0,737,738,5,116,0,0,738,132,1,0,0,0,739,740,5,111,0,0,740,741, + 5,112,0,0,741,742,5,116,0,0,742,743,5,105,0,0,743,744,5,111,0,0, + 744,745,5,110,0,0,745,746,5,97,0,0,746,747,5,108,0,0,747,748,5,45, + 0,0,748,749,5,111,0,0,749,750,5,110,0,0,750,751,5,101,0,0,751,134, + 1,0,0,0,752,753,5,101,0,0,753,754,5,120,0,0,754,755,5,97,0,0,755, + 756,5,99,0,0,756,757,5,116,0,0,757,758,5,108,0,0,758,759,5,121,0, + 0,759,760,5,45,0,0,760,761,5,111,0,0,761,762,5,110,0,0,762,763,5, + 101,0,0,763,136,1,0,0,0,764,765,5,109,0,0,765,766,5,97,0,0,766,767, + 5,110,0,0,767,768,5,121,0,0,768,769,5,45,0,0,769,770,5,117,0,0,770, + 771,5,110,0,0,771,772,5,105,0,0,772,773,5,113,0,0,773,774,5,117, + 0,0,774,775,5,101,0,0,775,138,1,0,0,0,776,777,5,109,0,0,777,778, + 5,97,0,0,778,779,5,110,0,0,779,780,5,121,0,0,780,140,1,0,0,0,781, + 782,5,111,0,0,782,783,5,114,0,0,783,784,5,100,0,0,784,785,5,101, + 0,0,785,786,5,114,0,0,786,787,5,101,0,0,787,788,5,100,0,0,788,142, + 1,0,0,0,789,790,5,117,0,0,790,791,5,110,0,0,791,792,5,105,0,0,792, + 793,5,116,0,0,793,144,1,0,0,0,794,795,5,119,0,0,795,796,5,97,0,0, + 796,797,5,116,0,0,797,798,5,99,0,0,798,799,5,104,0,0,799,800,5,45, + 0,0,800,801,5,104,0,0,801,802,5,97,0,0,802,803,5,110,0,0,803,804, + 5,100,0,0,804,805,5,108,0,0,805,806,5,101,0,0,806,146,1,0,0,0,807, + 808,5,109,0,0,808,809,5,101,0,0,809,810,5,115,0,0,810,811,5,115, + 0,0,811,812,5,97,0,0,812,813,5,103,0,0,813,814,5,101,0,0,814,148, + 1,0,0,0,815,816,5,97,0,0,816,817,5,116,0,0,817,818,5,111,0,0,818, + 819,5,109,0,0,819,820,5,45,0,0,820,821,5,114,0,0,821,822,5,101,0, + 0,822,823,5,102,0,0,823,150,1,0,0,0,824,825,5,105,0,0,825,826,5, + 110,0,0,826,827,5,116,0,0,827,828,5,101,0,0,828,829,5,114,0,0,829, + 830,5,102,0,0,830,831,5,97,0,0,831,832,5,99,0,0,832,833,5,101,0, + 0,833,834,5,45,0,0,834,835,5,114,0,0,835,836,5,101,0,0,836,837,5, + 102,0,0,837,152,1,0,0,0,838,839,5,111,0,0,839,840,5,112,0,0,840, + 841,5,116,0,0,841,842,5,105,0,0,842,843,5,111,0,0,843,844,5,110, + 0,0,844,845,5,97,0,0,845,846,5,108,0,0,846,154,1,0,0,0,847,848,5, + 108,0,0,848,849,5,105,0,0,849,850,5,115,0,0,850,851,5,116,0,0,851, + 156,1,0,0,0,852,853,5,98,0,0,853,854,5,111,0,0,854,855,5,111,0,0, + 855,856,5,108,0,0,856,158,1,0,0,0,857,858,5,98,0,0,858,859,5,121, + 0,0,859,860,5,116,0,0,860,861,5,101,0,0,861,862,5,115,0,0,862,160, + 1,0,0,0,863,864,5,100,0,0,864,865,5,111,0,0,865,866,5,117,0,0,866, + 867,5,98,0,0,867,868,5,108,0,0,868,869,5,101,0,0,869,162,1,0,0,0, + 870,871,5,105,0,0,871,872,5,110,0,0,872,873,5,116,0,0,873,874,5, + 51,0,0,874,875,5,50,0,0,875,164,1,0,0,0,876,877,5,105,0,0,877,878, + 5,110,0,0,878,879,5,116,0,0,879,880,5,54,0,0,880,881,5,52,0,0,881, + 166,1,0,0,0,882,883,5,115,0,0,883,884,5,116,0,0,884,885,5,114,0, + 0,885,886,5,105,0,0,886,887,5,110,0,0,887,888,5,103,0,0,888,168, + 1,0,0,0,889,890,5,117,0,0,890,891,5,105,0,0,891,892,5,110,0,0,892, + 893,5,116,0,0,893,894,5,51,0,0,894,895,5,50,0,0,895,170,1,0,0,0, + 896,897,5,117,0,0,897,898,5,105,0,0,898,899,5,110,0,0,899,900,5, + 116,0,0,900,901,5,54,0,0,901,902,5,52,0,0,902,172,1,0,0,0,903,904, + 5,116,0,0,904,905,5,114,0,0,905,906,5,117,0,0,906,907,5,101,0,0, + 907,174,1,0,0,0,908,909,5,102,0,0,909,910,5,97,0,0,910,911,5,108, + 0,0,911,912,5,115,0,0,912,913,5,101,0,0,913,176,1,0,0,0,914,915, + 5,110,0,0,915,916,5,117,0,0,916,917,5,108,0,0,917,918,5,108,0,0, + 918,178,1,0,0,0,919,920,5,45,0,0,920,921,5,62,0,0,921,180,1,0,0, + 0,922,923,5,58,0,0,923,182,1,0,0,0,924,925,5,59,0,0,925,184,1,0, + 0,0,926,927,5,44,0,0,927,186,1,0,0,0,928,929,5,46,0,0,929,188,1, + 0,0,0,930,931,5,123,0,0,931,190,1,0,0,0,932,933,5,125,0,0,933,192, + 1,0,0,0,934,935,5,91,0,0,935,194,1,0,0,0,936,937,5,93,0,0,937,196, + 1,0,0,0,938,939,5,40,0,0,939,198,1,0,0,0,940,941,5,41,0,0,941,200, + 1,0,0,0,942,943,5,60,0,0,943,202,1,0,0,0,944,945,5,62,0,0,945,204, + 1,0,0,0,946,948,5,45,0,0,947,946,1,0,0,0,947,948,1,0,0,0,948,950, + 1,0,0,0,949,951,7,0,0,0,950,949,1,0,0,0,951,952,1,0,0,0,952,950, + 1,0,0,0,952,953,1,0,0,0,953,206,1,0,0,0,954,956,5,45,0,0,955,954, + 1,0,0,0,955,956,1,0,0,0,956,965,1,0,0,0,957,966,5,48,0,0,958,962, + 7,1,0,0,959,961,7,0,0,0,960,959,1,0,0,0,961,964,1,0,0,0,962,960, + 1,0,0,0,962,963,1,0,0,0,963,966,1,0,0,0,964,962,1,0,0,0,965,957, + 1,0,0,0,965,958,1,0,0,0,966,973,1,0,0,0,967,969,5,46,0,0,968,970, + 7,0,0,0,969,968,1,0,0,0,970,971,1,0,0,0,971,969,1,0,0,0,971,972, + 1,0,0,0,972,974,1,0,0,0,973,967,1,0,0,0,973,974,1,0,0,0,974,984, + 1,0,0,0,975,977,7,2,0,0,976,978,7,3,0,0,977,976,1,0,0,0,977,978, + 1,0,0,0,978,980,1,0,0,0,979,981,7,0,0,0,980,979,1,0,0,0,981,982, + 1,0,0,0,982,980,1,0,0,0,982,983,1,0,0,0,983,985,1,0,0,0,984,975, + 1,0,0,0,984,985,1,0,0,0,985,208,1,0,0,0,986,990,7,4,0,0,987,989, + 7,5,0,0,988,987,1,0,0,0,989,992,1,0,0,0,990,988,1,0,0,0,990,991, + 1,0,0,0,991,210,1,0,0,0,992,990,1,0,0,0,993,998,5,34,0,0,994,997, + 3,213,106,0,995,997,8,6,0,0,996,994,1,0,0,0,996,995,1,0,0,0,997, + 1000,1,0,0,0,998,996,1,0,0,0,998,999,1,0,0,0,999,1001,1,0,0,0,1000, + 998,1,0,0,0,1001,1002,5,34,0,0,1002,212,1,0,0,0,1003,1011,5,92,0, + 0,1004,1012,7,7,0,0,1005,1006,5,117,0,0,1006,1007,3,215,107,0,1007, + 1008,3,215,107,0,1008,1009,3,215,107,0,1009,1010,3,215,107,0,1010, + 1012,1,0,0,0,1011,1004,1,0,0,0,1011,1005,1,0,0,0,1012,214,1,0,0, + 0,1013,1014,7,8,0,0,1014,216,1,0,0,0,1015,1016,5,47,0,0,1016,1017, + 5,47,0,0,1017,1021,1,0,0,0,1018,1020,8,9,0,0,1019,1018,1,0,0,0,1020, + 1023,1,0,0,0,1021,1019,1,0,0,0,1021,1022,1,0,0,0,1022,1024,1,0,0, + 0,1023,1021,1,0,0,0,1024,1025,6,108,0,0,1025,218,1,0,0,0,1026,1027, + 5,47,0,0,1027,1028,5,42,0,0,1028,1032,1,0,0,0,1029,1031,9,0,0,0, + 1030,1029,1,0,0,0,1031,1034,1,0,0,0,1032,1033,1,0,0,0,1032,1030, + 1,0,0,0,1033,1035,1,0,0,0,1034,1032,1,0,0,0,1035,1036,5,42,0,0,1036, + 1037,5,47,0,0,1037,1038,1,0,0,0,1038,1039,6,109,0,0,1039,220,1,0, + 0,0,1040,1042,7,10,0,0,1041,1040,1,0,0,0,1042,1043,1,0,0,0,1043, + 1041,1,0,0,0,1043,1044,1,0,0,0,1044,1045,1,0,0,0,1045,1046,6,110, + 0,0,1046,222,1,0,0,0,18,0,947,952,955,962,965,971,973,977,982,984, + 990,996,998,1011,1021,1032,1043,1,0,1,0 ]; private static __ATN: antlr.ATN; diff --git a/src/capability-language/generated/QuixosCapabilityParser.ts b/src/capability-language/generated/QuixosCapabilityParser.ts index 902bfcf..4954303 100644 --- a/src/capability-language/generated/QuixosCapabilityParser.ts +++ b/src/capability-language/generated/QuixosCapabilityParser.ts @@ -47,73 +47,78 @@ export class QuixosCapabilityParser extends antlr.Parser { public static readonly REPOSITORY = 35; public static readonly COMMIT = 36; public static readonly REVISION = 37; - public static readonly ID = 38; - public static readonly DOC = 39; - public static readonly MODE = 40; - public static readonly EMITS = 41; - public static readonly RECEIVER = 42; - public static readonly REQUIRES = 43; - public static readonly ANY = 44; - public static readonly GET = 45; - public static readonly SET = 46; - public static readonly WATCH = 47; - public static readonly START = 48; - public static readonly STOP = 49; - public static readonly READ = 50; - public static readonly WRITE = 51; - public static readonly RESOLVE = 52; - public static readonly CONNECT = 53; - public static readonly DISCONNECT = 54; - public static readonly CALL = 55; - public static readonly WATCH_START = 56; - public static readonly WATCH_STOP = 57; - public static readonly SUBSCRIBE = 58; - public static readonly UNSUBSCRIBE = 59; - public static readonly OPTIMISTIC_REGISTER = 60; - public static readonly CRDT = 61; - public static readonly OPTIONAL_ONE = 62; - public static readonly EXACTLY_ONE = 63; - public static readonly MANY_UNIQUE = 64; - public static readonly MANY = 65; - public static readonly ORDERED = 66; - public static readonly UNIT = 67; - public static readonly WATCH_HANDLE = 68; - public static readonly MESSAGE = 69; - public static readonly ATOM_REF = 70; - public static readonly INTERFACE_REF = 71; - public static readonly OPTIONAL = 72; - public static readonly LIST = 73; - public static readonly BOOL = 74; - public static readonly BYTES = 75; - public static readonly DOUBLE = 76; - public static readonly INT32 = 77; - public static readonly INT64 = 78; - public static readonly STRING = 79; - public static readonly UINT32 = 80; - public static readonly UINT64 = 81; - public static readonly TRUE = 82; - public static readonly FALSE = 83; - public static readonly NULL = 84; - public static readonly ARROW = 85; - public static readonly COLON = 86; - public static readonly SEMI = 87; - public static readonly COMMA = 88; - public static readonly DOT = 89; - public static readonly LBRACE = 90; - public static readonly RBRACE = 91; - public static readonly LBRACK = 92; - public static readonly RBRACK = 93; - public static readonly LPAREN = 94; - public static readonly RPAREN = 95; - public static readonly LT = 96; - public static readonly GT = 97; - public static readonly INTEGER = 98; - public static readonly JSON_NUMBER = 99; - public static readonly IDENTIFIER = 100; - public static readonly STRING_LITERAL = 101; - public static readonly LINE_COMMENT = 102; - public static readonly BLOCK_COMMENT = 103; - public static readonly WS = 104; + public static readonly SEMANTIC_MAJOR = 38; + public static readonly ON_DELETE = 39; + public static readonly RETAIN_OTHER = 40; + public static readonly KEYED = 41; + public static readonly PUBLIC_TRAVERSAL = 42; + public static readonly ID = 43; + public static readonly DOC = 44; + public static readonly MODE = 45; + public static readonly EMITS = 46; + public static readonly RECEIVER = 47; + public static readonly REQUIRES = 48; + public static readonly ANY = 49; + public static readonly GET = 50; + public static readonly SET = 51; + public static readonly WATCH = 52; + public static readonly START = 53; + public static readonly STOP = 54; + public static readonly READ = 55; + public static readonly WRITE = 56; + public static readonly RESOLVE = 57; + public static readonly CONNECT = 58; + public static readonly DISCONNECT = 59; + public static readonly CALL = 60; + public static readonly WATCH_START = 61; + public static readonly WATCH_STOP = 62; + public static readonly SUBSCRIBE = 63; + public static readonly UNSUBSCRIBE = 64; + public static readonly OPTIMISTIC_REGISTER = 65; + public static readonly CRDT = 66; + public static readonly OPTIONAL_ONE = 67; + public static readonly EXACTLY_ONE = 68; + public static readonly MANY_UNIQUE = 69; + public static readonly MANY = 70; + public static readonly ORDERED = 71; + public static readonly UNIT = 72; + public static readonly WATCH_HANDLE = 73; + public static readonly MESSAGE = 74; + public static readonly ATOM_REF = 75; + public static readonly INTERFACE_REF = 76; + public static readonly OPTIONAL = 77; + public static readonly LIST = 78; + public static readonly BOOL = 79; + public static readonly BYTES = 80; + public static readonly DOUBLE = 81; + public static readonly INT32 = 82; + public static readonly INT64 = 83; + public static readonly STRING = 84; + public static readonly UINT32 = 85; + public static readonly UINT64 = 86; + public static readonly TRUE = 87; + public static readonly FALSE = 88; + public static readonly NULL = 89; + public static readonly ARROW = 90; + public static readonly COLON = 91; + public static readonly SEMI = 92; + public static readonly COMMA = 93; + public static readonly DOT = 94; + public static readonly LBRACE = 95; + public static readonly RBRACE = 96; + public static readonly LBRACK = 97; + public static readonly RBRACK = 98; + public static readonly LPAREN = 99; + public static readonly RPAREN = 100; + public static readonly LT = 101; + public static readonly GT = 102; + public static readonly INTEGER = 103; + public static readonly JSON_NUMBER = 104; + public static readonly IDENTIFIER = 105; + public static readonly STRING_LITERAL = 106; + public static readonly LINE_COMMENT = 107; + public static readonly BLOCK_COMMENT = 108; + public static readonly WS = 109; public static readonly RULE_document = 0; public static readonly RULE_fragmentDecl = 1; public static readonly RULE_sourceImportDecl = 2; @@ -180,17 +185,18 @@ export class QuixosCapabilityParser extends antlr.Parser { "'conform'", "'as'", "'bind'", "'to'", "'private'", "'shared'", "'state'", "'edge'", "'projection'", "'with'", "'using'", "'via'", "'materialize'", "'if'", "'absent'", "'on'", "'policy'", "'default'", - "'source'", "'repository'", "'commit'", "'revision'", "'id'", "'doc'", - "'mode'", "'emits'", "'receiver'", "'requires'", "'any'", "'get'", - "'set'", "'watch'", "'start'", "'stop'", "'read'", "'write'", "'resolve'", - "'connect'", "'disconnect'", "'call'", "'watch-start'", "'watch-stop'", - "'subscribe'", "'unsubscribe'", "'optimistic-register'", "'crdt'", - "'optional-one'", "'exactly-one'", "'many-unique'", "'many'", "'ordered'", - "'unit'", "'watch-handle'", "'message'", "'atom-ref'", "'interface-ref'", - "'optional'", "'list'", "'bool'", "'bytes'", "'double'", "'int32'", - "'int64'", "'string'", "'uint32'", "'uint64'", "'true'", "'false'", - "'null'", "'->'", "':'", "';'", "','", "'.'", "'{'", "'}'", "'['", - "']'", "'('", "')'", "'<'", "'>'" + "'source'", "'repository'", "'commit'", "'revision'", "'semantic-major'", + "'on-delete'", "'retain-other'", "'keyed'", "'public-traversal'", + "'id'", "'doc'", "'mode'", "'emits'", "'receiver'", "'requires'", + "'any'", "'get'", "'set'", "'watch'", "'start'", "'stop'", "'read'", + "'write'", "'resolve'", "'connect'", "'disconnect'", "'call'", "'watch-start'", + "'watch-stop'", "'subscribe'", "'unsubscribe'", "'optimistic-register'", + "'crdt'", "'optional-one'", "'exactly-one'", "'many-unique'", "'many'", + "'ordered'", "'unit'", "'watch-handle'", "'message'", "'atom-ref'", + "'interface-ref'", "'optional'", "'list'", "'bool'", "'bytes'", + "'double'", "'int32'", "'int64'", "'string'", "'uint32'", "'uint64'", + "'true'", "'false'", "'null'", "'->'", "':'", "';'", "','", "'.'", + "'{'", "'}'", "'['", "']'", "'('", "')'", "'<'", "'>'" ]; public static readonly symbolicNames = [ @@ -199,17 +205,19 @@ export class QuixosCapabilityParser extends antlr.Parser { "CONSTRUCTOR", "CONSTRUCTS", "INPUT", "CONFORM", "AS", "BIND", "TO", "PRIVATE", "SHARED", "STATE", "EDGE", "PROJECTION", "WITH", "USING", "VIA", "MATERIALIZE", "IF", "ABSENT", "ON", "POLICY", "DEFAULT", - "SOURCE", "REPOSITORY", "COMMIT", "REVISION", "ID", "DOC", "MODE", - "EMITS", "RECEIVER", "REQUIRES", "ANY", "GET", "SET", "WATCH", "START", - "STOP", "READ", "WRITE", "RESOLVE", "CONNECT", "DISCONNECT", "CALL", - "WATCH_START", "WATCH_STOP", "SUBSCRIBE", "UNSUBSCRIBE", "OPTIMISTIC_REGISTER", - "CRDT", "OPTIONAL_ONE", "EXACTLY_ONE", "MANY_UNIQUE", "MANY", "ORDERED", - "UNIT", "WATCH_HANDLE", "MESSAGE", "ATOM_REF", "INTERFACE_REF", - "OPTIONAL", "LIST", "BOOL", "BYTES", "DOUBLE", "INT32", "INT64", - "STRING", "UINT32", "UINT64", "TRUE", "FALSE", "NULL", "ARROW", - "COLON", "SEMI", "COMMA", "DOT", "LBRACE", "RBRACE", "LBRACK", "RBRACK", - "LPAREN", "RPAREN", "LT", "GT", "INTEGER", "JSON_NUMBER", "IDENTIFIER", - "STRING_LITERAL", "LINE_COMMENT", "BLOCK_COMMENT", "WS" + "SOURCE", "REPOSITORY", "COMMIT", "REVISION", "SEMANTIC_MAJOR", + "ON_DELETE", "RETAIN_OTHER", "KEYED", "PUBLIC_TRAVERSAL", "ID", + "DOC", "MODE", "EMITS", "RECEIVER", "REQUIRES", "ANY", "GET", "SET", + "WATCH", "START", "STOP", "READ", "WRITE", "RESOLVE", "CONNECT", + "DISCONNECT", "CALL", "WATCH_START", "WATCH_STOP", "SUBSCRIBE", + "UNSUBSCRIBE", "OPTIMISTIC_REGISTER", "CRDT", "OPTIONAL_ONE", "EXACTLY_ONE", + "MANY_UNIQUE", "MANY", "ORDERED", "UNIT", "WATCH_HANDLE", "MESSAGE", + "ATOM_REF", "INTERFACE_REF", "OPTIONAL", "LIST", "BOOL", "BYTES", + "DOUBLE", "INT32", "INT64", "STRING", "UINT32", "UINT64", "TRUE", + "FALSE", "NULL", "ARROW", "COLON", "SEMI", "COMMA", "DOT", "LBRACE", + "RBRACE", "LBRACK", "RBRACK", "LPAREN", "RPAREN", "LT", "GT", "INTEGER", + "JSON_NUMBER", "IDENTIFIER", "STRING_LITERAL", "LINE_COMMENT", "BLOCK_COMMENT", + "WS" ]; public static readonly ruleNames = [ "document", "fragmentDecl", "sourceImportDecl", "workspaceDecl", @@ -666,7 +674,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 206; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 39) { + if (_la === 44) { { this.state = 204; this.match(QuixosCapabilityParser.DOC); @@ -876,7 +884,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 261; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (((((_la - 45)) & ~0x1F) === 0 && ((1 << (_la - 45)) & 7) !== 0)) { + while (((((_la - 50)) & ~0x1F) === 0 && ((1 << (_la - 50)) & 7) !== 0)) { { { this.state = 258; @@ -999,7 +1007,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 295; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 66) { + if (_la === 71) { { this.state = 294; this.match(QuixosCapabilityParser.ORDERED); @@ -1011,7 +1019,7 @@ export class QuixosCapabilityParser extends antlr.Parser { this.state = 301; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (((((_la - 47)) & ~0x1F) === 0 && ((1 << (_la - 47)) & 225) !== 0)) { + while (((((_la - 52)) & ~0x1F) === 0 && ((1 << (_la - 52)) & 225) !== 0)) { { { this.state = 298; @@ -1198,23 +1206,35 @@ export class QuixosCapabilityParser extends antlr.Parser { this.match(QuixosCapabilityParser.REVISION); this.state = 349; this.stringLiteral(); - this.state = 350; - this.match(QuixosCapabilityParser.LBRACE); + this.state = 352; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 38) { + { + this.state = 350; + this.match(QuixosCapabilityParser.SEMANTIC_MAJOR); + this.state = 351; + this.match(QuixosCapabilityParser.INTEGER); + } + } + this.state = 354; + this.match(QuixosCapabilityParser.LBRACE); + this.state = 358; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 14336) !== 0)) { { { - this.state = 351; + this.state = 355; this.packageExport(); } } - this.state = 356; + this.state = 360; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 357; + this.state = 361; this.match(QuixosCapabilityParser.RBRACE); } } @@ -1235,27 +1255,27 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new PackageExportContext(this.context, this.state); this.enterRule(localContext, 38, QuixosCapabilityParser.RULE_packageExport); try { - this.state = 362; + this.state = 366; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.OPERATION: this.enterOuterAlt(localContext, 1); { - this.state = 359; + this.state = 363; this.packageOperationExport(); } break; case QuixosCapabilityParser.FUNCTION: this.enterOuterAlt(localContext, 2); { - this.state = 360; + this.state = 364; this.packageFunctionExport(); } break; case QuixosCapabilityParser.CONSTRUCTOR: this.enterOuterAlt(localContext, 3); { - this.state = 361; + this.state = 365; this.packageConstructorExport(); } break; @@ -1283,51 +1303,51 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 364; - this.match(QuixosCapabilityParser.OPERATION); - this.state = 365; - this.identifier(); - this.state = 366; - this.match(QuixosCapabilityParser.ID); - this.state = 367; - this.stringLiteral(); this.state = 368; - this.match(QuixosCapabilityParser.COLON); + this.match(QuixosCapabilityParser.OPERATION); this.state = 369; - this.valueType(); + this.identifier(); this.state = 370; - this.match(QuixosCapabilityParser.ARROW); + this.match(QuixosCapabilityParser.ID); this.state = 371; - this.valueType(); + this.stringLiteral(); this.state = 372; - this.match(QuixosCapabilityParser.MODE); + this.match(QuixosCapabilityParser.COLON); this.state = 373; - this.operationMode(); + this.valueType(); + this.state = 374; + this.match(QuixosCapabilityParser.ARROW); this.state = 375; + this.valueType(); + this.state = 376; + this.match(QuixosCapabilityParser.MODE); + this.state = 377; + this.operationMode(); + this.state = 379; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 41) { + if (_la === 46) { { - this.state = 374; + this.state = 378; this.eventClause(); } } - this.state = 377; + this.state = 381; this.match(QuixosCapabilityParser.RECEIVER); - this.state = 378; + this.state = 382; this.receiverRequirement(); - this.state = 380; + this.state = 384; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 43) { + if (_la === 48) { { - this.state = 379; + this.state = 383; this.dependencyBlock(); } } - this.state = 382; + this.state = 386; this.match(QuixosCapabilityParser.SEMI); } } @@ -1351,33 +1371,33 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 384; - this.match(QuixosCapabilityParser.FUNCTION); - this.state = 385; - this.identifier(); - this.state = 386; - this.match(QuixosCapabilityParser.ID); - this.state = 387; - this.stringLiteral(); this.state = 388; - this.match(QuixosCapabilityParser.COLON); + this.match(QuixosCapabilityParser.FUNCTION); this.state = 389; - this.valueType(); + this.identifier(); this.state = 390; - this.match(QuixosCapabilityParser.ARROW); + this.match(QuixosCapabilityParser.ID); this.state = 391; - this.valueType(); + this.stringLiteral(); + this.state = 392; + this.match(QuixosCapabilityParser.COLON); this.state = 393; + this.valueType(); + this.state = 394; + this.match(QuixosCapabilityParser.ARROW); + this.state = 395; + this.valueType(); + this.state = 397; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 43) { + if (_la === 48) { { - this.state = 392; + this.state = 396; this.dependencyBlock(); } } - this.state = 395; + this.state = 399; this.match(QuixosCapabilityParser.SEMI); } } @@ -1401,33 +1421,33 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 397; - this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 398; - this.identifier(); - this.state = 399; - this.match(QuixosCapabilityParser.ID); - this.state = 400; - this.stringLiteral(); this.state = 401; - this.match(QuixosCapabilityParser.CONSTRUCTS); + this.match(QuixosCapabilityParser.CONSTRUCTOR); this.state = 402; this.identifier(); this.state = 403; - this.match(QuixosCapabilityParser.COLON); + this.match(QuixosCapabilityParser.ID); this.state = 404; - this.valueType(); + this.stringLiteral(); + this.state = 405; + this.match(QuixosCapabilityParser.CONSTRUCTS); this.state = 406; + this.identifier(); + this.state = 407; + this.match(QuixosCapabilityParser.COLON); + this.state = 408; + this.valueType(); + this.state = 410; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 43) { + if (_la === 48) { { - this.state = 405; + this.state = 409; this.dependencyBlock(); } } - this.state = 408; + this.state = 412; this.match(QuixosCapabilityParser.SEMI); } } @@ -1450,9 +1470,9 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 410; + this.state = 414; this.match(QuixosCapabilityParser.EMITS); - this.state = 411; + this.state = 415; this.valueType(); } } @@ -1476,9 +1496,9 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 413; + this.state = 417; _la = this.tokenStream.LA(1); - if(!(((((_la - 55)) & ~0x1F) === 0 && ((1 << (_la - 55)) & 31) !== 0))) { + if(!(((((_la - 60)) & ~0x1F) === 0 && ((1 << (_la - 60)) & 31) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -1505,43 +1525,43 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 50, QuixosCapabilityParser.RULE_receiverRequirement); let _la: number; try { - this.state = 424; + this.state = 428; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.ANY: this.enterOuterAlt(localContext, 1); { - this.state = 415; + this.state = 419; this.match(QuixosCapabilityParser.ANY); } break; case QuixosCapabilityParser.ATOM: this.enterOuterAlt(localContext, 2); { - this.state = 416; + this.state = 420; this.match(QuixosCapabilityParser.ATOM); - this.state = 417; + this.state = 421; this.identifier(); } break; case QuixosCapabilityParser.INTERFACES: this.enterOuterAlt(localContext, 3); { - this.state = 418; + this.state = 422; this.match(QuixosCapabilityParser.INTERFACES); - this.state = 419; + this.state = 423; this.match(QuixosCapabilityParser.LBRACK); - this.state = 421; + this.state = 425; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 34 || _la === 100) { + if (_la === 34 || _la === 105) { { - this.state = 420; + this.state = 424; this.identifierList(); } } - this.state = 423; + this.state = 427; this.match(QuixosCapabilityParser.RBRACK); } break; @@ -1569,21 +1589,21 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 426; + this.state = 430; this.identifier(); - this.state = 431; + this.state = 435; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 88) { + while (_la === 93) { { { - this.state = 427; + this.state = 431; this.match(QuixosCapabilityParser.COMMA); - this.state = 428; + this.state = 432; this.identifier(); } } - this.state = 433; + this.state = 437; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } @@ -1609,25 +1629,25 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 434; + this.state = 438; this.match(QuixosCapabilityParser.REQUIRES); - this.state = 435; - this.match(QuixosCapabilityParser.LBRACE); this.state = 439; + this.match(QuixosCapabilityParser.LBRACE); + this.state = 443; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 12591168) !== 0)) { { { - this.state = 436; + this.state = 440; this.dependencyPort(); } } - this.state = 441; + this.state = 445; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 442; + this.state = 446; this.match(QuixosCapabilityParser.RBRACE); } } @@ -1649,100 +1669,100 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 56, QuixosCapabilityParser.RULE_dependencyPort); let _la: number; try { - this.state = 483; + this.state = 487; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.STATE: this.enterOuterAlt(localContext, 1); { - this.state = 444; - this.match(QuixosCapabilityParser.STATE); - this.state = 445; - this.identifier(); - this.state = 446; - this.match(QuixosCapabilityParser.ID); - this.state = 447; - this.stringLiteral(); this.state = 448; - this.match(QuixosCapabilityParser.COLON); + this.match(QuixosCapabilityParser.STATE); this.state = 449; - this.valueType(); + this.identifier(); this.state = 450; - this.primitiveList(); + this.match(QuixosCapabilityParser.ID); this.state = 451; + this.stringLiteral(); + this.state = 452; + this.match(QuixosCapabilityParser.COLON); + this.state = 453; + this.valueType(); + this.state = 454; + this.primitiveList(); + this.state = 455; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.EDGE: this.enterOuterAlt(localContext, 2); { - this.state = 453; - this.match(QuixosCapabilityParser.EDGE); - this.state = 454; - this.identifier(); - this.state = 455; - this.match(QuixosCapabilityParser.ID); - this.state = 456; - this.stringLiteral(); this.state = 457; - this.match(QuixosCapabilityParser.COLON); + this.match(QuixosCapabilityParser.EDGE); this.state = 458; - this.cardinality(); + this.identifier(); this.state = 459; - this.targetConstraint(); + this.match(QuixosCapabilityParser.ID); this.state = 460; - this.primitiveList(); + this.stringLiteral(); this.state = 461; + this.match(QuixosCapabilityParser.COLON); + this.state = 462; + this.cardinality(); + this.state = 463; + this.targetConstraint(); + this.state = 464; + this.primitiveList(); + this.state = 465; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.INTERFACE: this.enterOuterAlt(localContext, 3); { - this.state = 463; - this.match(QuixosCapabilityParser.INTERFACE); - this.state = 464; - this.identifier(); - this.state = 465; - this.match(QuixosCapabilityParser.ID); - this.state = 466; - this.stringLiteral(); this.state = 467; - this.match(QuixosCapabilityParser.COLON); + this.match(QuixosCapabilityParser.INTERFACE); this.state = 468; this.identifier(); this.state = 469; + this.match(QuixosCapabilityParser.ID); + this.state = 470; + this.stringLiteral(); + this.state = 471; + this.match(QuixosCapabilityParser.COLON); + this.state = 472; + this.identifier(); + this.state = 473; this.match(QuixosCapabilityParser.SEMI); } break; case QuixosCapabilityParser.CONSTRUCTOR: this.enterOuterAlt(localContext, 4); { - this.state = 471; - this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 472; - this.identifier(); - this.state = 473; - this.match(QuixosCapabilityParser.ID); - this.state = 474; - this.stringLiteral(); this.state = 475; - this.match(QuixosCapabilityParser.COLON); + this.match(QuixosCapabilityParser.CONSTRUCTOR); this.state = 476; this.identifier(); + this.state = 477; + this.match(QuixosCapabilityParser.ID); + this.state = 478; + this.stringLiteral(); this.state = 479; + this.match(QuixosCapabilityParser.COLON); + this.state = 480; + this.identifier(); + this.state = 483; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 15) { { - this.state = 477; + this.state = 481; this.match(QuixosCapabilityParser.INPUT); - this.state = 478; + this.state = 482; this.valueType(); } } - this.state = 481; + this.state = 485; this.match(QuixosCapabilityParser.SEMI); } break; @@ -1770,27 +1790,27 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 485; + this.state = 489; this.match(QuixosCapabilityParser.LBRACK); - this.state = 486; + this.state = 490; this.primitive(); - this.state = 491; + this.state = 495; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 88) { + while (_la === 93) { { { - this.state = 487; + this.state = 491; this.match(QuixosCapabilityParser.COMMA); - this.state = 488; + this.state = 492; this.primitive(); } } - this.state = 493; + this.state = 497; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 494; + this.state = 498; this.match(QuixosCapabilityParser.RBRACK); } } @@ -1814,9 +1834,9 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 496; + this.state = 500; _la = this.tokenStream.LA(1); - if(!(((((_la - 50)) & ~0x1F) === 0 && ((1 << (_la - 50)) & 223) !== 0))) { + if(!(((((_la - 55)) & ~0x1F) === 0 && ((1 << (_la - 55)) & 223) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -1844,9 +1864,9 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 498; + this.state = 502; this.match(QuixosCapabilityParser.SHARED); - this.state = 499; + this.state = 503; this.attachmentDecl(); } } @@ -1867,20 +1887,20 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new AttachmentDeclContext(this.context, this.state); this.enterRule(localContext, 64, QuixosCapabilityParser.RULE_attachmentDecl); try { - this.state = 503; + this.state = 507; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.STATE: this.enterOuterAlt(localContext, 1); { - this.state = 501; + this.state = 505; this.stateDecl(); } break; case QuixosCapabilityParser.EDGE: this.enterOuterAlt(localContext, 2); { - this.state = 502; + this.state = 506; this.edgeDecl(); } break; @@ -1908,39 +1928,39 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 505; - this.match(QuixosCapabilityParser.STATE); - this.state = 506; - this.identifier(); - this.state = 507; - this.match(QuixosCapabilityParser.ID); - this.state = 508; - this.stringLiteral(); this.state = 509; - this.match(QuixosCapabilityParser.ON); + this.match(QuixosCapabilityParser.STATE); this.state = 510; this.identifier(); this.state = 511; - this.match(QuixosCapabilityParser.COLON); + this.match(QuixosCapabilityParser.ID); this.state = 512; - this.valueType(); + this.stringLiteral(); this.state = 513; - this.match(QuixosCapabilityParser.POLICY); + this.match(QuixosCapabilityParser.ON); this.state = 514; - this.storagePolicy(); + this.identifier(); + this.state = 515; + this.match(QuixosCapabilityParser.COLON); + this.state = 516; + this.valueType(); this.state = 517; + this.match(QuixosCapabilityParser.POLICY); + this.state = 518; + this.storagePolicy(); + this.state = 521; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 33) { { - this.state = 515; + this.state = 519; this.match(QuixosCapabilityParser.DEFAULT); - this.state = 516; + this.state = 520; this.jsonLiteral(); } } - this.state = 519; + this.state = 523; this.match(QuixosCapabilityParser.SEMI); } } @@ -1961,26 +1981,26 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new StoragePolicyContext(this.context, this.state); this.enterRule(localContext, 68, QuixosCapabilityParser.RULE_storagePolicy); try { - this.state = 527; + this.state = 531; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.OPTIMISTIC_REGISTER: this.enterOuterAlt(localContext, 1); { - this.state = 521; + this.state = 525; this.match(QuixosCapabilityParser.OPTIMISTIC_REGISTER); } break; case QuixosCapabilityParser.CRDT: this.enterOuterAlt(localContext, 2); { - this.state = 522; + this.state = 526; this.match(QuixosCapabilityParser.CRDT); - this.state = 523; + this.state = 527; this.match(QuixosCapabilityParser.LPAREN); - this.state = 524; + this.state = 528; this.valueType(); - this.state = 525; + this.state = 529; this.match(QuixosCapabilityParser.RPAREN); } break; @@ -2007,21 +2027,21 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 529; - this.match(QuixosCapabilityParser.EDGE); - this.state = 530; - this.identifier(); - this.state = 531; - this.match(QuixosCapabilityParser.ID); - this.state = 532; - this.stringLiteral(); this.state = 533; - this.match(QuixosCapabilityParser.LBRACE); + this.match(QuixosCapabilityParser.EDGE); this.state = 534; - this.edgeEndpoint(); + this.identifier(); this.state = 535; - this.edgeEndpoint(); + this.match(QuixosCapabilityParser.ID); this.state = 536; + this.stringLiteral(); + this.state = 537; + this.match(QuixosCapabilityParser.LBRACE); + this.state = 538; + this.edgeEndpoint(); + this.state = 539; + this.edgeEndpoint(); + this.state = 540; this.match(QuixosCapabilityParser.RBRACE); } } @@ -2045,29 +2065,73 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 538; - this.targetConstraint(); - this.state = 539; - this.match(QuixosCapabilityParser.PROJECTION); - this.state = 540; - this.identifier(); - this.state = 541; - this.match(QuixosCapabilityParser.ID); this.state = 542; - this.stringLiteral(); + this.targetConstraint(); this.state = 543; - this.cardinality(); + this.match(QuixosCapabilityParser.PROJECTION); + this.state = 544; + this.identifier(); this.state = 545; + this.match(QuixosCapabilityParser.ID); + this.state = 546; + this.stringLiteral(); + this.state = 547; + this.cardinality(); + this.state = 549; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 66) { + if (_la === 71) { { - this.state = 544; + this.state = 548; this.match(QuixosCapabilityParser.ORDERED); } } - this.state = 547; + this.state = 553; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 39) { + { + this.state = 551; + this.match(QuixosCapabilityParser.ON_DELETE); + this.state = 552; + this.stringLiteral(); + } + } + + this.state = 556; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 40) { + { + this.state = 555; + this.match(QuixosCapabilityParser.RETAIN_OTHER); + } + } + + this.state = 560; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 41) { + { + this.state = 558; + this.match(QuixosCapabilityParser.KEYED); + this.state = 559; + this.stringLiteral(); + } + } + + this.state = 563; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 42) { + { + this.state = 562; + this.match(QuixosCapabilityParser.PUBLIC_TRAVERSAL); + } + } + + this.state = 565; this.match(QuixosCapabilityParser.SEMI); } } @@ -2091,31 +2155,55 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 549; + this.state = 567; this.match(QuixosCapabilityParser.CONFORM); - this.state = 550; + this.state = 568; this.identifier(); - this.state = 551; + this.state = 569; this.match(QuixosCapabilityParser.AS); - this.state = 552; + this.state = 570; this.identifier(); - this.state = 553; + this.state = 573; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 43) { + { + this.state = 571; + this.match(QuixosCapabilityParser.ID); + this.state = 572; + this.stringLiteral(); + } + } + + this.state = 577; + this.errorHandler.sync(this); + _la = this.tokenStream.LA(1); + if (_la === 38) { + { + this.state = 575; + this.match(QuixosCapabilityParser.SEMANTIC_MAJOR); + this.state = 576; + this.match(QuixosCapabilityParser.INTEGER); + } + } + + this.state = 579; this.match(QuixosCapabilityParser.LBRACE); - this.state = 557; + this.state = 583; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); while ((((_la) & ~0x1F) === 0 && ((1 << _la) & 269746176) !== 0)) { { { - this.state = 554; + this.state = 580; this.conformanceItem(); } } - this.state = 559; + this.state = 585; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 560; + this.state = 586; this.match(QuixosCapabilityParser.RBRACE); } } @@ -2136,29 +2224,29 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new ConformanceItemContext(this.context, this.state); this.enterRule(localContext, 76, QuixosCapabilityParser.RULE_conformanceItem); try { - this.state = 566; + this.state = 592; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.PRIVATE: this.enterOuterAlt(localContext, 1); { - this.state = 562; + this.state = 588; this.match(QuixosCapabilityParser.PRIVATE); - this.state = 563; + this.state = 589; this.attachmentDecl(); } break; case QuixosCapabilityParser.BIND: this.enterOuterAlt(localContext, 2); { - this.state = 564; + this.state = 590; this.operationBindingDecl(); } break; case QuixosCapabilityParser.MATERIALIZE: this.enterOuterAlt(localContext, 3); { - this.state = 565; + this.state = 591; this.relationshipMaterializationDecl(); } break; @@ -2185,31 +2273,31 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 568; + this.state = 594; this.match(QuixosCapabilityParser.MATERIALIZE); - this.state = 569; + this.state = 595; this.identifier(); - this.state = 570; + this.state = 596; this.match(QuixosCapabilityParser.IF); - this.state = 571; + this.state = 597; this.match(QuixosCapabilityParser.ABSENT); - this.state = 572; + this.state = 598; this.match(QuixosCapabilityParser.USING); - this.state = 573; + this.state = 599; this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 574; + this.state = 600; this.identifier(); - this.state = 575; + this.state = 601; this.match(QuixosCapabilityParser.VIA); - this.state = 576; + this.state = 602; this.match(QuixosCapabilityParser.EDGE); - this.state = 577; + this.state = 603; this.identifier(); - this.state = 578; + this.state = 604; this.match(QuixosCapabilityParser.DOT); - this.state = 579; + this.state = 605; this.identifier(); - this.state = 580; + this.state = 606; this.match(QuixosCapabilityParser.SEMI); } } @@ -2232,15 +2320,15 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 582; + this.state = 608; this.match(QuixosCapabilityParser.BIND); - this.state = 583; + this.state = 609; this.memberOperationRef(); - this.state = 584; + this.state = 610; this.match(QuixosCapabilityParser.TO); - this.state = 585; + this.state = 611; this.operationProvider(); - this.state = 586; + this.state = 612; this.match(QuixosCapabilityParser.SEMI); } } @@ -2263,11 +2351,11 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 588; + this.state = 614; this.identifier(); - this.state = 589; + this.state = 615; this.match(QuixosCapabilityParser.DOT); - this.state = 590; + this.state = 616; this.operationName(); } } @@ -2288,84 +2376,84 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new OperationNameContext(this.context, this.state); this.enterRule(localContext, 84, QuixosCapabilityParser.RULE_operationName); try { - this.state = 603; + this.state = 629; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.SOURCE: case QuixosCapabilityParser.IDENTIFIER: this.enterOuterAlt(localContext, 1); { - this.state = 592; + this.state = 618; this.identifier(); } break; case QuixosCapabilityParser.CALL: this.enterOuterAlt(localContext, 2); { - this.state = 593; + this.state = 619; this.match(QuixosCapabilityParser.CALL); } break; case QuixosCapabilityParser.GET: this.enterOuterAlt(localContext, 3); { - this.state = 594; + this.state = 620; this.match(QuixosCapabilityParser.GET); } break; case QuixosCapabilityParser.SET: this.enterOuterAlt(localContext, 4); { - this.state = 595; + this.state = 621; this.match(QuixosCapabilityParser.SET); } break; case QuixosCapabilityParser.RESOLVE: this.enterOuterAlt(localContext, 5); { - this.state = 596; + this.state = 622; this.match(QuixosCapabilityParser.RESOLVE); } break; case QuixosCapabilityParser.CONNECT: this.enterOuterAlt(localContext, 6); { - this.state = 597; + this.state = 623; this.match(QuixosCapabilityParser.CONNECT); } break; case QuixosCapabilityParser.DISCONNECT: this.enterOuterAlt(localContext, 7); { - this.state = 598; + this.state = 624; this.match(QuixosCapabilityParser.DISCONNECT); } break; case QuixosCapabilityParser.WATCH_START: this.enterOuterAlt(localContext, 8); { - this.state = 599; + this.state = 625; this.match(QuixosCapabilityParser.WATCH_START); } break; case QuixosCapabilityParser.WATCH_STOP: this.enterOuterAlt(localContext, 9); { - this.state = 600; + this.state = 626; this.match(QuixosCapabilityParser.WATCH_STOP); } break; case QuixosCapabilityParser.SUBSCRIBE: this.enterOuterAlt(localContext, 10); { - this.state = 601; + this.state = 627; this.match(QuixosCapabilityParser.SUBSCRIBE); } break; case QuixosCapabilityParser.UNSUBSCRIBE: this.enterOuterAlt(localContext, 11); { - this.state = 602; + this.state = 628; this.match(QuixosCapabilityParser.UNSUBSCRIBE); } break; @@ -2391,56 +2479,56 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 86, QuixosCapabilityParser.RULE_operationProvider); let _la: number; try { - this.state = 624; + this.state = 650; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.STATE: this.enterOuterAlt(localContext, 1); { - this.state = 605; + this.state = 631; this.match(QuixosCapabilityParser.STATE); - this.state = 606; + this.state = 632; this.identifier(); - this.state = 607; + this.state = 633; this.match(QuixosCapabilityParser.DOT); - this.state = 608; + this.state = 634; this.statePrimitive(); } break; case QuixosCapabilityParser.EDGE: this.enterOuterAlt(localContext, 2); { - this.state = 610; + this.state = 636; this.match(QuixosCapabilityParser.EDGE); - this.state = 611; + this.state = 637; this.identifier(); - this.state = 612; + this.state = 638; this.match(QuixosCapabilityParser.DOT); - this.state = 613; + this.state = 639; this.identifier(); - this.state = 614; + this.state = 640; this.match(QuixosCapabilityParser.DOT); - this.state = 615; + this.state = 641; this.edgePrimitive(); } break; case QuixosCapabilityParser.PACKAGE: this.enterOuterAlt(localContext, 3); { - this.state = 617; + this.state = 643; this.match(QuixosCapabilityParser.PACKAGE); - this.state = 618; + this.state = 644; this.identifier(); - this.state = 619; + this.state = 645; this.match(QuixosCapabilityParser.DOT); - this.state = 620; + this.state = 646; this.identifier(); - this.state = 622; + this.state = 648; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 25) { { - this.state = 621; + this.state = 647; this.dependencyBindingBlock(); } } @@ -2471,9 +2559,9 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 626; + this.state = 652; _la = this.tokenStream.LA(1); - if(!(((((_la - 50)) & ~0x1F) === 0 && ((1 << (_la - 50)) & 195) !== 0))) { + if(!(((((_la - 55)) & ~0x1F) === 0 && ((1 << (_la - 55)) & 195) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -2502,9 +2590,9 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 628; + this.state = 654; _la = this.tokenStream.LA(1); - if(!(((((_la - 52)) & ~0x1F) === 0 && ((1 << (_la - 52)) & 55) !== 0))) { + if(!(((((_la - 57)) & ~0x1F) === 0 && ((1 << (_la - 57)) & 55) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -2533,25 +2621,25 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 630; + this.state = 656; this.match(QuixosCapabilityParser.WITH); - this.state = 631; + this.state = 657; this.match(QuixosCapabilityParser.LBRACE); - this.state = 635; + this.state = 661; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 34 || _la === 100) { + while (_la === 34 || _la === 105) { { { - this.state = 632; + this.state = 658; this.dependencyBinding(); } } - this.state = 637; + this.state = 663; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } - this.state = 638; + this.state = 664; this.match(QuixosCapabilityParser.RBRACE); } } @@ -2573,124 +2661,124 @@ export class QuixosCapabilityParser extends antlr.Parser { this.enterRule(localContext, 94, QuixosCapabilityParser.RULE_dependencyBinding); let _la: number; try { - this.state = 690; + this.state = 716; this.errorHandler.sync(this); - switch (this.interpreter.adaptivePredict(this.tokenStream, 43, this.context) ) { + switch (this.interpreter.adaptivePredict(this.tokenStream, 50, this.context) ) { case 1: this.enterOuterAlt(localContext, 1); { - this.state = 640; + this.state = 666; this.identifier(); - this.state = 641; + this.state = 667; this.match(QuixosCapabilityParser.TO); - this.state = 642; + this.state = 668; this.match(QuixosCapabilityParser.STATE); - this.state = 643; + this.state = 669; this.identifier(); - this.state = 650; + this.state = 676; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 27) { { - this.state = 644; + this.state = 670; this.match(QuixosCapabilityParser.VIA); - this.state = 645; + this.state = 671; this.match(QuixosCapabilityParser.EDGE); - this.state = 646; + this.state = 672; this.identifier(); - this.state = 647; + this.state = 673; this.match(QuixosCapabilityParser.DOT); - this.state = 648; + this.state = 674; this.identifier(); } } - this.state = 652; + this.state = 678; this.match(QuixosCapabilityParser.SEMI); } break; case 2: this.enterOuterAlt(localContext, 2); { - this.state = 654; + this.state = 680; this.identifier(); - this.state = 655; + this.state = 681; this.match(QuixosCapabilityParser.TO); - this.state = 656; + this.state = 682; this.match(QuixosCapabilityParser.EDGE); - this.state = 657; + this.state = 683; this.identifier(); - this.state = 658; + this.state = 684; this.match(QuixosCapabilityParser.DOT); - this.state = 659; + this.state = 685; this.identifier(); - this.state = 666; + this.state = 692; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 27) { { - this.state = 660; + this.state = 686; this.match(QuixosCapabilityParser.VIA); - this.state = 661; + this.state = 687; this.match(QuixosCapabilityParser.EDGE); - this.state = 662; + this.state = 688; this.identifier(); - this.state = 663; + this.state = 689; this.match(QuixosCapabilityParser.DOT); - this.state = 664; + this.state = 690; this.identifier(); } } - this.state = 668; + this.state = 694; this.match(QuixosCapabilityParser.SEMI); } break; case 3: this.enterOuterAlt(localContext, 3); { - this.state = 670; + this.state = 696; this.identifier(); - this.state = 671; + this.state = 697; this.match(QuixosCapabilityParser.TO); - this.state = 672; + this.state = 698; this.match(QuixosCapabilityParser.INTERFACE); - this.state = 673; + this.state = 699; this.identifier(); - this.state = 680; + this.state = 706; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 27) { { - this.state = 674; + this.state = 700; this.match(QuixosCapabilityParser.VIA); - this.state = 675; + this.state = 701; this.match(QuixosCapabilityParser.EDGE); - this.state = 676; + this.state = 702; this.identifier(); - this.state = 677; + this.state = 703; this.match(QuixosCapabilityParser.DOT); - this.state = 678; + this.state = 704; this.identifier(); } } - this.state = 682; + this.state = 708; this.match(QuixosCapabilityParser.SEMI); } break; case 4: this.enterOuterAlt(localContext, 4); { - this.state = 684; + this.state = 710; this.identifier(); - this.state = 685; + this.state = 711; this.match(QuixosCapabilityParser.TO); - this.state = 686; + this.state = 712; this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 687; + this.state = 713; this.identifier(); - this.state = 688; + this.state = 714; this.match(QuixosCapabilityParser.SEMI); } break; @@ -2716,29 +2804,29 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 692; + this.state = 718; this.match(QuixosCapabilityParser.CONSTRUCTOR); - this.state = 693; + this.state = 719; this.identifier(); - this.state = 694; + this.state = 720; this.match(QuixosCapabilityParser.TO); - this.state = 695; + this.state = 721; this.identifier(); - this.state = 696; + this.state = 722; this.match(QuixosCapabilityParser.DOT); - this.state = 697; + this.state = 723; this.identifier(); - this.state = 699; + this.state = 725; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); if (_la === 25) { { - this.state = 698; + this.state = 724; this.dependencyBindingBlock(); } } - this.state = 701; + this.state = 727; this.match(QuixosCapabilityParser.SEMI); } } @@ -2759,7 +2847,7 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new ValueTypeContext(this.context, this.state); this.enterRule(localContext, 98, QuixosCapabilityParser.RULE_valueType); try { - this.state = 728; + this.state = 754; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.BOOL: @@ -2772,82 +2860,82 @@ export class QuixosCapabilityParser extends antlr.Parser { case QuixosCapabilityParser.UINT64: this.enterOuterAlt(localContext, 1); { - this.state = 703; + this.state = 729; this.scalarType(); } break; case QuixosCapabilityParser.UNIT: this.enterOuterAlt(localContext, 2); { - this.state = 704; + this.state = 730; this.match(QuixosCapabilityParser.UNIT); } break; case QuixosCapabilityParser.WATCH_HANDLE: this.enterOuterAlt(localContext, 3); { - this.state = 705; + this.state = 731; this.match(QuixosCapabilityParser.WATCH_HANDLE); } break; case QuixosCapabilityParser.MESSAGE: this.enterOuterAlt(localContext, 4); { - this.state = 706; + this.state = 732; this.match(QuixosCapabilityParser.MESSAGE); - this.state = 707; + this.state = 733; this.stringLiteral(); } break; case QuixosCapabilityParser.ATOM_REF: this.enterOuterAlt(localContext, 5); { - this.state = 708; + this.state = 734; this.match(QuixosCapabilityParser.ATOM_REF); - this.state = 709; + this.state = 735; this.match(QuixosCapabilityParser.LT); - this.state = 710; + this.state = 736; this.identifier(); - this.state = 711; + this.state = 737; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.INTERFACE_REF: this.enterOuterAlt(localContext, 6); { - this.state = 713; + this.state = 739; this.match(QuixosCapabilityParser.INTERFACE_REF); - this.state = 714; + this.state = 740; this.match(QuixosCapabilityParser.LT); - this.state = 715; + this.state = 741; this.identifier(); - this.state = 716; + this.state = 742; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.OPTIONAL: this.enterOuterAlt(localContext, 7); { - this.state = 718; + this.state = 744; this.match(QuixosCapabilityParser.OPTIONAL); - this.state = 719; + this.state = 745; this.match(QuixosCapabilityParser.LT); - this.state = 720; + this.state = 746; this.valueType(); - this.state = 721; + this.state = 747; this.match(QuixosCapabilityParser.GT); } break; case QuixosCapabilityParser.LIST: this.enterOuterAlt(localContext, 8); { - this.state = 723; + this.state = 749; this.match(QuixosCapabilityParser.LIST); - this.state = 724; + this.state = 750; this.match(QuixosCapabilityParser.LT); - this.state = 725; + this.state = 751; this.valueType(); - this.state = 726; + this.state = 752; this.match(QuixosCapabilityParser.GT); } break; @@ -2875,9 +2963,9 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 730; + this.state = 756; _la = this.tokenStream.LA(1); - if(!(((((_la - 74)) & ~0x1F) === 0 && ((1 << (_la - 74)) & 255) !== 0))) { + if(!(((((_la - 79)) & ~0x1F) === 0 && ((1 << (_la - 79)) & 255) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -2906,9 +2994,9 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 732; + this.state = 758; _la = this.tokenStream.LA(1); - if(!(((((_la - 62)) & ~0x1F) === 0 && ((1 << (_la - 62)) & 15) !== 0))) { + if(!(((((_la - 67)) & ~0x1F) === 0 && ((1 << (_la - 67)) & 15) !== 0))) { this.errorHandler.recoverInline(this); } else { @@ -2934,62 +3022,62 @@ export class QuixosCapabilityParser extends antlr.Parser { let localContext = new JsonLiteralContext(this.context, this.state); this.enterRule(localContext, 104, QuixosCapabilityParser.RULE_jsonLiteral); try { - this.state = 742; + this.state = 768; this.errorHandler.sync(this); switch (this.tokenStream.LA(1)) { case QuixosCapabilityParser.STRING_LITERAL: this.enterOuterAlt(localContext, 1); { - this.state = 734; + this.state = 760; this.stringLiteral(); } break; case QuixosCapabilityParser.INTEGER: this.enterOuterAlt(localContext, 2); { - this.state = 735; + this.state = 761; this.match(QuixosCapabilityParser.INTEGER); } break; case QuixosCapabilityParser.JSON_NUMBER: this.enterOuterAlt(localContext, 3); { - this.state = 736; + this.state = 762; this.match(QuixosCapabilityParser.JSON_NUMBER); } break; case QuixosCapabilityParser.TRUE: this.enterOuterAlt(localContext, 4); { - this.state = 737; + this.state = 763; this.match(QuixosCapabilityParser.TRUE); } break; case QuixosCapabilityParser.FALSE: this.enterOuterAlt(localContext, 5); { - this.state = 738; + this.state = 764; this.match(QuixosCapabilityParser.FALSE); } break; case QuixosCapabilityParser.NULL: this.enterOuterAlt(localContext, 6); { - this.state = 739; + this.state = 765; this.match(QuixosCapabilityParser.NULL); } break; case QuixosCapabilityParser.LBRACE: this.enterOuterAlt(localContext, 7); { - this.state = 740; + this.state = 766; this.jsonObject(); } break; case QuixosCapabilityParser.LBRACK: this.enterOuterAlt(localContext, 8); { - this.state = 741; + this.state = 767; this.jsonArray(); } break; @@ -3017,35 +3105,35 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 744; + this.state = 770; this.match(QuixosCapabilityParser.LBRACE); - this.state = 753; + this.state = 779; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (_la === 101) { + if (_la === 106) { { - this.state = 745; + this.state = 771; this.jsonMember(); - this.state = 750; + this.state = 776; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 88) { + while (_la === 93) { { { - this.state = 746; + this.state = 772; this.match(QuixosCapabilityParser.COMMA); - this.state = 747; + this.state = 773; this.jsonMember(); } } - this.state = 752; + this.state = 778; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } } } - this.state = 755; + this.state = 781; this.match(QuixosCapabilityParser.RBRACE); } } @@ -3068,11 +3156,11 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 757; + this.state = 783; this.stringLiteral(); - this.state = 758; + this.state = 784; this.match(QuixosCapabilityParser.COLON); - this.state = 759; + this.state = 785; this.jsonLiteral(); } } @@ -3096,35 +3184,35 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 761; + this.state = 787; this.match(QuixosCapabilityParser.LBRACK); - this.state = 770; + this.state = 796; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - if (((((_la - 82)) & ~0x1F) === 0 && ((1 << (_la - 82)) & 722183) !== 0)) { + if (((((_la - 87)) & ~0x1F) === 0 && ((1 << (_la - 87)) & 722183) !== 0)) { { - this.state = 762; + this.state = 788; this.jsonLiteral(); - this.state = 767; + this.state = 793; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); - while (_la === 88) { + while (_la === 93) { { { - this.state = 763; + this.state = 789; this.match(QuixosCapabilityParser.COMMA); - this.state = 764; + this.state = 790; this.jsonLiteral(); } } - this.state = 769; + this.state = 795; this.errorHandler.sync(this); _la = this.tokenStream.LA(1); } } } - this.state = 772; + this.state = 798; this.match(QuixosCapabilityParser.RBRACK); } } @@ -3148,9 +3236,9 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 774; + this.state = 800; _la = this.tokenStream.LA(1); - if(!(_la === 34 || _la === 100)) { + if(!(_la === 34 || _la === 105)) { this.errorHandler.recoverInline(this); } else { @@ -3178,7 +3266,7 @@ export class QuixosCapabilityParser extends antlr.Parser { try { this.enterOuterAlt(localContext, 1); { - this.state = 776; + this.state = 802; this.match(QuixosCapabilityParser.STRING_LITERAL); } } @@ -3197,7 +3285,7 @@ export class QuixosCapabilityParser extends antlr.Parser { } public static readonly _serializedATN: number[] = [ - 4,1,104,779,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6, + 4,1,109,805,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6, 7,6,2,7,7,7,2,8,7,8,2,9,7,9,2,10,7,10,2,11,7,11,2,12,7,12,2,13,7, 13,2,14,7,14,2,15,7,15,2,16,7,16,2,17,7,17,2,18,7,18,2,19,7,19,2, 20,7,20,2,21,7,21,2,22,7,22,2,23,7,23,2,24,7,24,2,25,7,25,2,26,7, @@ -3224,259 +3312,271 @@ export class QuixosCapabilityParser extends antlr.Parser { 1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,16,1,16, 1,16,1,16,1,16,1,16,1,16,3,16,331,8,16,1,17,1,17,1,17,1,17,3,17, 337,8,17,1,18,5,18,340,8,18,10,18,12,18,343,9,18,1,18,1,18,1,18, - 1,18,1,18,1,18,1,18,1,18,5,18,353,8,18,10,18,12,18,356,9,18,1,18, - 1,18,1,19,1,19,1,19,3,19,363,8,19,1,20,1,20,1,20,1,20,1,20,1,20, - 1,20,1,20,1,20,1,20,1,20,3,20,376,8,20,1,20,1,20,1,20,3,20,381,8, - 20,1,20,1,20,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,1,21,3,21,394, - 8,21,1,21,1,21,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,3,22, - 407,8,22,1,22,1,22,1,23,1,23,1,23,1,24,1,24,1,25,1,25,1,25,1,25, - 1,25,1,25,3,25,422,8,25,1,25,3,25,425,8,25,1,26,1,26,1,26,5,26,430, - 8,26,10,26,12,26,433,9,26,1,27,1,27,1,27,5,27,438,8,27,10,27,12, - 27,441,9,27,1,27,1,27,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1, - 28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1, - 28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1, - 28,3,28,480,8,28,1,28,1,28,3,28,484,8,28,1,29,1,29,1,29,1,29,5,29, - 490,8,29,10,29,12,29,493,9,29,1,29,1,29,1,30,1,30,1,31,1,31,1,31, - 1,32,1,32,3,32,504,8,32,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,33, - 1,33,1,33,1,33,1,33,3,33,518,8,33,1,33,1,33,1,34,1,34,1,34,1,34, - 1,34,1,34,3,34,528,8,34,1,35,1,35,1,35,1,35,1,35,1,35,1,35,1,35, - 1,35,1,36,1,36,1,36,1,36,1,36,1,36,1,36,3,36,546,8,36,1,36,1,36, - 1,37,1,37,1,37,1,37,1,37,1,37,5,37,556,8,37,10,37,12,37,559,9,37, - 1,37,1,37,1,38,1,38,1,38,1,38,3,38,567,8,38,1,39,1,39,1,39,1,39, - 1,39,1,39,1,39,1,39,1,39,1,39,1,39,1,39,1,39,1,39,1,40,1,40,1,40, - 1,40,1,40,1,40,1,41,1,41,1,41,1,41,1,42,1,42,1,42,1,42,1,42,1,42, - 1,42,1,42,1,42,1,42,1,42,3,42,604,8,42,1,43,1,43,1,43,1,43,1,43, - 1,43,1,43,1,43,1,43,1,43,1,43,1,43,1,43,1,43,1,43,1,43,1,43,3,43, - 623,8,43,3,43,625,8,43,1,44,1,44,1,45,1,45,1,46,1,46,1,46,5,46,634, - 8,46,10,46,12,46,637,9,46,1,46,1,46,1,47,1,47,1,47,1,47,1,47,1,47, - 1,47,1,47,1,47,1,47,3,47,651,8,47,1,47,1,47,1,47,1,47,1,47,1,47, - 1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,3,47,667,8,47,1,47,1,47, - 1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,3,47,681,8,47, - 1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,3,47,691,8,47,1,48,1,48, - 1,48,1,48,1,48,1,48,1,48,3,48,700,8,48,1,48,1,48,1,49,1,49,1,49, + 1,18,1,18,1,18,1,18,1,18,3,18,353,8,18,1,18,1,18,5,18,357,8,18,10, + 18,12,18,360,9,18,1,18,1,18,1,19,1,19,1,19,3,19,367,8,19,1,20,1, + 20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,1,20,3,20,380,8,20,1, + 20,1,20,1,20,3,20,385,8,20,1,20,1,20,1,21,1,21,1,21,1,21,1,21,1, + 21,1,21,1,21,1,21,3,21,398,8,21,1,21,1,21,1,22,1,22,1,22,1,22,1, + 22,1,22,1,22,1,22,1,22,3,22,411,8,22,1,22,1,22,1,23,1,23,1,23,1, + 24,1,24,1,25,1,25,1,25,1,25,1,25,1,25,3,25,426,8,25,1,25,3,25,429, + 8,25,1,26,1,26,1,26,5,26,434,8,26,10,26,12,26,437,9,26,1,27,1,27, + 1,27,5,27,442,8,27,10,27,12,27,445,9,27,1,27,1,27,1,28,1,28,1,28, + 1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28, + 1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28, + 1,28,1,28,1,28,1,28,1,28,1,28,3,28,484,8,28,1,28,1,28,3,28,488,8, + 28,1,29,1,29,1,29,1,29,5,29,494,8,29,10,29,12,29,497,9,29,1,29,1, + 29,1,30,1,30,1,31,1,31,1,31,1,32,1,32,3,32,508,8,32,1,33,1,33,1, + 33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,3,33,522,8,33,1, + 33,1,33,1,34,1,34,1,34,1,34,1,34,1,34,3,34,532,8,34,1,35,1,35,1, + 35,1,35,1,35,1,35,1,35,1,35,1,35,1,36,1,36,1,36,1,36,1,36,1,36,1, + 36,3,36,550,8,36,1,36,1,36,3,36,554,8,36,1,36,3,36,557,8,36,1,36, + 1,36,3,36,561,8,36,1,36,3,36,564,8,36,1,36,1,36,1,37,1,37,1,37,1, + 37,1,37,1,37,3,37,574,8,37,1,37,1,37,3,37,578,8,37,1,37,1,37,5,37, + 582,8,37,10,37,12,37,585,9,37,1,37,1,37,1,38,1,38,1,38,1,38,3,38, + 593,8,38,1,39,1,39,1,39,1,39,1,39,1,39,1,39,1,39,1,39,1,39,1,39, + 1,39,1,39,1,39,1,40,1,40,1,40,1,40,1,40,1,40,1,41,1,41,1,41,1,41, + 1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,3,42,630, + 8,42,1,43,1,43,1,43,1,43,1,43,1,43,1,43,1,43,1,43,1,43,1,43,1,43, + 1,43,1,43,1,43,1,43,1,43,3,43,649,8,43,3,43,651,8,43,1,44,1,44,1, + 45,1,45,1,46,1,46,1,46,5,46,660,8,46,10,46,12,46,663,9,46,1,46,1, + 46,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,3,47,677,8, + 47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1, + 47,1,47,3,47,693,8,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1,47,1, + 47,1,47,1,47,1,47,3,47,707,8,47,1,47,1,47,1,47,1,47,1,47,1,47,1, + 47,1,47,3,47,717,8,47,1,48,1,48,1,48,1,48,1,48,1,48,1,48,3,48,726, + 8,48,1,48,1,48,1,49,1,49,1,49,1,49,1,49,1,49,1,49,1,49,1,49,1,49, 1,49,1,49,1,49,1,49,1,49,1,49,1,49,1,49,1,49,1,49,1,49,1,49,1,49, - 1,49,1,49,1,49,1,49,1,49,1,49,1,49,1,49,1,49,3,49,729,8,49,1,50, - 1,50,1,51,1,51,1,52,1,52,1,52,1,52,1,52,1,52,1,52,1,52,3,52,743, - 8,52,1,53,1,53,1,53,1,53,5,53,749,8,53,10,53,12,53,752,9,53,3,53, - 754,8,53,1,53,1,53,1,54,1,54,1,54,1,54,1,55,1,55,1,55,1,55,5,55, - 766,8,55,10,55,12,55,769,9,55,3,55,771,8,55,1,55,1,55,1,56,1,56, - 1,57,1,57,1,57,0,0,58,0,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,0,7,1,0,55,59,2,0,50,54,56,57,2,0,50,51,56,57,2,0,52,54,56,57, - 1,0,74,81,1,0,62,65,2,0,34,34,100,100,811,0,128,1,0,0,0,2,130,1, - 0,0,0,4,140,1,0,0,0,6,144,1,0,0,0,8,167,1,0,0,0,10,179,1,0,0,0,12, - 181,1,0,0,0,14,188,1,0,0,0,16,198,1,0,0,0,18,200,1,0,0,0,20,213, - 1,0,0,0,22,234,1,0,0,0,24,236,1,0,0,0,26,251,1,0,0,0,28,285,1,0, - 0,0,30,287,1,0,0,0,32,330,1,0,0,0,34,336,1,0,0,0,36,341,1,0,0,0, - 38,362,1,0,0,0,40,364,1,0,0,0,42,384,1,0,0,0,44,397,1,0,0,0,46,410, - 1,0,0,0,48,413,1,0,0,0,50,424,1,0,0,0,52,426,1,0,0,0,54,434,1,0, - 0,0,56,483,1,0,0,0,58,485,1,0,0,0,60,496,1,0,0,0,62,498,1,0,0,0, - 64,503,1,0,0,0,66,505,1,0,0,0,68,527,1,0,0,0,70,529,1,0,0,0,72,538, - 1,0,0,0,74,549,1,0,0,0,76,566,1,0,0,0,78,568,1,0,0,0,80,582,1,0, - 0,0,82,588,1,0,0,0,84,603,1,0,0,0,86,624,1,0,0,0,88,626,1,0,0,0, - 90,628,1,0,0,0,92,630,1,0,0,0,94,690,1,0,0,0,96,692,1,0,0,0,98,728, - 1,0,0,0,100,730,1,0,0,0,102,732,1,0,0,0,104,742,1,0,0,0,106,744, - 1,0,0,0,108,757,1,0,0,0,110,761,1,0,0,0,112,774,1,0,0,0,114,776, - 1,0,0,0,116,117,3,6,3,0,117,118,5,0,0,1,118,129,1,0,0,0,119,120, - 3,20,10,0,120,121,5,0,0,1,121,129,1,0,0,0,122,123,3,36,18,0,123, - 124,5,0,0,1,124,129,1,0,0,0,125,126,3,2,1,0,126,127,5,0,0,1,127, - 129,1,0,0,0,128,116,1,0,0,0,128,119,1,0,0,0,128,122,1,0,0,0,128, - 125,1,0,0,0,129,1,1,0,0,0,130,131,5,2,0,0,131,135,5,90,0,0,132,134, - 3,8,4,0,133,132,1,0,0,0,134,137,1,0,0,0,135,133,1,0,0,0,135,136, - 1,0,0,0,136,138,1,0,0,0,137,135,1,0,0,0,138,139,5,91,0,0,139,3,1, - 0,0,0,140,141,5,3,0,0,141,142,3,114,57,0,142,143,5,87,0,0,143,5, - 1,0,0,0,144,145,5,1,0,0,145,146,3,112,56,0,146,147,5,38,0,0,147, - 148,3,114,57,0,148,149,5,37,0,0,149,150,3,114,57,0,150,151,5,36, - 0,0,151,152,3,114,57,0,152,156,5,90,0,0,153,155,3,8,4,0,154,153, - 1,0,0,0,155,158,1,0,0,0,156,154,1,0,0,0,156,157,1,0,0,0,157,159, - 1,0,0,0,158,156,1,0,0,0,159,160,5,91,0,0,160,7,1,0,0,0,161,168,3, - 4,2,0,162,168,3,18,9,0,163,168,3,10,5,0,164,168,3,62,31,0,165,168, - 3,74,37,0,166,168,3,96,48,0,167,161,1,0,0,0,167,162,1,0,0,0,167, - 163,1,0,0,0,167,164,1,0,0,0,167,165,1,0,0,0,167,166,1,0,0,0,168, - 9,1,0,0,0,169,170,5,3,0,0,170,171,5,6,0,0,171,172,3,112,56,0,172, - 173,5,87,0,0,173,180,1,0,0,0,174,175,5,3,0,0,175,176,5,8,0,0,176, - 177,3,112,56,0,177,178,5,87,0,0,178,180,1,0,0,0,179,169,1,0,0,0, - 179,174,1,0,0,0,180,11,1,0,0,0,181,182,5,4,0,0,182,183,5,5,0,0,183, - 184,3,112,56,0,184,185,5,38,0,0,185,186,3,114,57,0,186,187,5,87, - 0,0,187,13,1,0,0,0,188,189,5,4,0,0,189,190,5,6,0,0,190,191,3,112, - 56,0,191,192,5,37,0,0,192,193,3,114,57,0,193,194,5,87,0,0,194,15, - 1,0,0,0,195,199,3,10,5,0,196,199,3,12,6,0,197,199,3,14,7,0,198,195, - 1,0,0,0,198,196,1,0,0,0,198,197,1,0,0,0,199,17,1,0,0,0,200,201,5, - 5,0,0,201,202,3,112,56,0,202,203,5,38,0,0,203,206,3,114,57,0,204, - 205,5,39,0,0,205,207,3,114,57,0,206,204,1,0,0,0,206,207,1,0,0,0, - 207,208,1,0,0,0,208,209,5,87,0,0,209,19,1,0,0,0,210,212,3,16,8,0, - 211,210,1,0,0,0,212,215,1,0,0,0,213,211,1,0,0,0,213,214,1,0,0,0, - 214,216,1,0,0,0,215,213,1,0,0,0,216,217,5,6,0,0,217,218,3,112,56, - 0,218,219,5,38,0,0,219,220,3,114,57,0,220,221,5,37,0,0,221,222,3, - 114,57,0,222,226,5,90,0,0,223,225,3,22,11,0,224,223,1,0,0,0,225, - 228,1,0,0,0,226,224,1,0,0,0,226,227,1,0,0,0,227,229,1,0,0,0,228, - 226,1,0,0,0,229,230,5,91,0,0,230,21,1,0,0,0,231,235,3,26,13,0,232, - 235,3,30,15,0,233,235,3,24,12,0,234,231,1,0,0,0,234,232,1,0,0,0, - 234,233,1,0,0,0,235,23,1,0,0,0,236,237,5,11,0,0,237,238,3,112,56, - 0,238,239,5,38,0,0,239,240,3,114,57,0,240,241,5,86,0,0,241,242,3, - 98,49,0,242,243,5,85,0,0,243,244,3,98,49,0,244,245,5,90,0,0,245, - 246,5,55,0,0,246,247,5,38,0,0,247,248,3,114,57,0,248,249,5,87,0, - 0,249,250,5,91,0,0,250,25,1,0,0,0,251,252,5,9,0,0,252,253,3,112, - 56,0,253,254,5,38,0,0,254,255,3,114,57,0,255,256,5,86,0,0,256,257, - 3,98,49,0,257,261,5,90,0,0,258,260,3,28,14,0,259,258,1,0,0,0,260, - 263,1,0,0,0,261,259,1,0,0,0,261,262,1,0,0,0,262,264,1,0,0,0,263, - 261,1,0,0,0,264,265,5,91,0,0,265,27,1,0,0,0,266,267,5,45,0,0,267, - 268,5,38,0,0,268,269,3,114,57,0,269,270,5,87,0,0,270,286,1,0,0,0, - 271,272,5,46,0,0,272,273,5,38,0,0,273,274,3,114,57,0,274,275,5,87, - 0,0,275,286,1,0,0,0,276,277,5,47,0,0,277,278,5,48,0,0,278,279,5, - 38,0,0,279,280,3,114,57,0,280,281,5,49,0,0,281,282,5,38,0,0,282, - 283,3,114,57,0,283,284,5,87,0,0,284,286,1,0,0,0,285,266,1,0,0,0, - 285,271,1,0,0,0,285,276,1,0,0,0,286,29,1,0,0,0,287,288,5,10,0,0, - 288,289,3,112,56,0,289,290,5,38,0,0,290,291,3,114,57,0,291,292,5, - 86,0,0,292,293,3,102,51,0,293,295,3,34,17,0,294,296,5,66,0,0,295, - 294,1,0,0,0,295,296,1,0,0,0,296,297,1,0,0,0,297,301,5,90,0,0,298, - 300,3,32,16,0,299,298,1,0,0,0,300,303,1,0,0,0,301,299,1,0,0,0,301, - 302,1,0,0,0,302,304,1,0,0,0,303,301,1,0,0,0,304,305,5,91,0,0,305, - 31,1,0,0,0,306,307,5,52,0,0,307,308,5,38,0,0,308,309,3,114,57,0, - 309,310,5,87,0,0,310,331,1,0,0,0,311,312,5,53,0,0,312,313,5,38,0, - 0,313,314,3,114,57,0,314,315,5,87,0,0,315,331,1,0,0,0,316,317,5, - 54,0,0,317,318,5,38,0,0,318,319,3,114,57,0,319,320,5,87,0,0,320, - 331,1,0,0,0,321,322,5,47,0,0,322,323,5,48,0,0,323,324,5,38,0,0,324, - 325,3,114,57,0,325,326,5,49,0,0,326,327,5,38,0,0,327,328,3,114,57, - 0,328,329,5,87,0,0,329,331,1,0,0,0,330,306,1,0,0,0,330,311,1,0,0, - 0,330,316,1,0,0,0,330,321,1,0,0,0,331,33,1,0,0,0,332,333,5,5,0,0, - 333,337,3,112,56,0,334,335,5,6,0,0,335,337,3,112,56,0,336,332,1, - 0,0,0,336,334,1,0,0,0,337,35,1,0,0,0,338,340,3,16,8,0,339,338,1, - 0,0,0,340,343,1,0,0,0,341,339,1,0,0,0,341,342,1,0,0,0,342,344,1, - 0,0,0,343,341,1,0,0,0,344,345,5,8,0,0,345,346,3,112,56,0,346,347, - 5,38,0,0,347,348,3,114,57,0,348,349,5,37,0,0,349,350,3,114,57,0, - 350,354,5,90,0,0,351,353,3,38,19,0,352,351,1,0,0,0,353,356,1,0,0, - 0,354,352,1,0,0,0,354,355,1,0,0,0,355,357,1,0,0,0,356,354,1,0,0, - 0,357,358,5,91,0,0,358,37,1,0,0,0,359,363,3,40,20,0,360,363,3,42, - 21,0,361,363,3,44,22,0,362,359,1,0,0,0,362,360,1,0,0,0,362,361,1, - 0,0,0,363,39,1,0,0,0,364,365,5,11,0,0,365,366,3,112,56,0,366,367, - 5,38,0,0,367,368,3,114,57,0,368,369,5,86,0,0,369,370,3,98,49,0,370, - 371,5,85,0,0,371,372,3,98,49,0,372,373,5,40,0,0,373,375,3,48,24, - 0,374,376,3,46,23,0,375,374,1,0,0,0,375,376,1,0,0,0,376,377,1,0, - 0,0,377,378,5,42,0,0,378,380,3,50,25,0,379,381,3,54,27,0,380,379, - 1,0,0,0,380,381,1,0,0,0,381,382,1,0,0,0,382,383,5,87,0,0,383,41, - 1,0,0,0,384,385,5,12,0,0,385,386,3,112,56,0,386,387,5,38,0,0,387, - 388,3,114,57,0,388,389,5,86,0,0,389,390,3,98,49,0,390,391,5,85,0, - 0,391,393,3,98,49,0,392,394,3,54,27,0,393,392,1,0,0,0,393,394,1, - 0,0,0,394,395,1,0,0,0,395,396,5,87,0,0,396,43,1,0,0,0,397,398,5, - 13,0,0,398,399,3,112,56,0,399,400,5,38,0,0,400,401,3,114,57,0,401, - 402,5,14,0,0,402,403,3,112,56,0,403,404,5,86,0,0,404,406,3,98,49, - 0,405,407,3,54,27,0,406,405,1,0,0,0,406,407,1,0,0,0,407,408,1,0, - 0,0,408,409,5,87,0,0,409,45,1,0,0,0,410,411,5,41,0,0,411,412,3,98, - 49,0,412,47,1,0,0,0,413,414,7,0,0,0,414,49,1,0,0,0,415,425,5,44, - 0,0,416,417,5,5,0,0,417,425,3,112,56,0,418,419,5,7,0,0,419,421,5, - 92,0,0,420,422,3,52,26,0,421,420,1,0,0,0,421,422,1,0,0,0,422,423, - 1,0,0,0,423,425,5,93,0,0,424,415,1,0,0,0,424,416,1,0,0,0,424,418, - 1,0,0,0,425,51,1,0,0,0,426,431,3,112,56,0,427,428,5,88,0,0,428,430, - 3,112,56,0,429,427,1,0,0,0,430,433,1,0,0,0,431,429,1,0,0,0,431,432, - 1,0,0,0,432,53,1,0,0,0,433,431,1,0,0,0,434,435,5,43,0,0,435,439, - 5,90,0,0,436,438,3,56,28,0,437,436,1,0,0,0,438,441,1,0,0,0,439,437, - 1,0,0,0,439,440,1,0,0,0,440,442,1,0,0,0,441,439,1,0,0,0,442,443, - 5,91,0,0,443,55,1,0,0,0,444,445,5,22,0,0,445,446,3,112,56,0,446, - 447,5,38,0,0,447,448,3,114,57,0,448,449,5,86,0,0,449,450,3,98,49, - 0,450,451,3,58,29,0,451,452,5,87,0,0,452,484,1,0,0,0,453,454,5,23, - 0,0,454,455,3,112,56,0,455,456,5,38,0,0,456,457,3,114,57,0,457,458, - 5,86,0,0,458,459,3,102,51,0,459,460,3,34,17,0,460,461,3,58,29,0, - 461,462,5,87,0,0,462,484,1,0,0,0,463,464,5,6,0,0,464,465,3,112,56, - 0,465,466,5,38,0,0,466,467,3,114,57,0,467,468,5,86,0,0,468,469,3, - 112,56,0,469,470,5,87,0,0,470,484,1,0,0,0,471,472,5,13,0,0,472,473, - 3,112,56,0,473,474,5,38,0,0,474,475,3,114,57,0,475,476,5,86,0,0, - 476,479,3,112,56,0,477,478,5,15,0,0,478,480,3,98,49,0,479,477,1, - 0,0,0,479,480,1,0,0,0,480,481,1,0,0,0,481,482,5,87,0,0,482,484,1, - 0,0,0,483,444,1,0,0,0,483,453,1,0,0,0,483,463,1,0,0,0,483,471,1, - 0,0,0,484,57,1,0,0,0,485,486,5,92,0,0,486,491,3,60,30,0,487,488, - 5,88,0,0,488,490,3,60,30,0,489,487,1,0,0,0,490,493,1,0,0,0,491,489, - 1,0,0,0,491,492,1,0,0,0,492,494,1,0,0,0,493,491,1,0,0,0,494,495, - 5,93,0,0,495,59,1,0,0,0,496,497,7,1,0,0,497,61,1,0,0,0,498,499,5, - 21,0,0,499,500,3,64,32,0,500,63,1,0,0,0,501,504,3,66,33,0,502,504, - 3,70,35,0,503,501,1,0,0,0,503,502,1,0,0,0,504,65,1,0,0,0,505,506, - 5,22,0,0,506,507,3,112,56,0,507,508,5,38,0,0,508,509,3,114,57,0, - 509,510,5,31,0,0,510,511,3,112,56,0,511,512,5,86,0,0,512,513,3,98, - 49,0,513,514,5,32,0,0,514,517,3,68,34,0,515,516,5,33,0,0,516,518, - 3,104,52,0,517,515,1,0,0,0,517,518,1,0,0,0,518,519,1,0,0,0,519,520, - 5,87,0,0,520,67,1,0,0,0,521,528,5,60,0,0,522,523,5,61,0,0,523,524, - 5,94,0,0,524,525,3,98,49,0,525,526,5,95,0,0,526,528,1,0,0,0,527, - 521,1,0,0,0,527,522,1,0,0,0,528,69,1,0,0,0,529,530,5,23,0,0,530, - 531,3,112,56,0,531,532,5,38,0,0,532,533,3,114,57,0,533,534,5,90, - 0,0,534,535,3,72,36,0,535,536,3,72,36,0,536,537,5,91,0,0,537,71, - 1,0,0,0,538,539,3,34,17,0,539,540,5,24,0,0,540,541,3,112,56,0,541, - 542,5,38,0,0,542,543,3,114,57,0,543,545,3,102,51,0,544,546,5,66, - 0,0,545,544,1,0,0,0,545,546,1,0,0,0,546,547,1,0,0,0,547,548,5,87, - 0,0,548,73,1,0,0,0,549,550,5,16,0,0,550,551,3,112,56,0,551,552,5, - 17,0,0,552,553,3,112,56,0,553,557,5,90,0,0,554,556,3,76,38,0,555, - 554,1,0,0,0,556,559,1,0,0,0,557,555,1,0,0,0,557,558,1,0,0,0,558, - 560,1,0,0,0,559,557,1,0,0,0,560,561,5,91,0,0,561,75,1,0,0,0,562, - 563,5,20,0,0,563,567,3,64,32,0,564,567,3,80,40,0,565,567,3,78,39, - 0,566,562,1,0,0,0,566,564,1,0,0,0,566,565,1,0,0,0,567,77,1,0,0,0, - 568,569,5,28,0,0,569,570,3,112,56,0,570,571,5,29,0,0,571,572,5,30, - 0,0,572,573,5,26,0,0,573,574,5,13,0,0,574,575,3,112,56,0,575,576, - 5,27,0,0,576,577,5,23,0,0,577,578,3,112,56,0,578,579,5,89,0,0,579, - 580,3,112,56,0,580,581,5,87,0,0,581,79,1,0,0,0,582,583,5,18,0,0, - 583,584,3,82,41,0,584,585,5,19,0,0,585,586,3,86,43,0,586,587,5,87, - 0,0,587,81,1,0,0,0,588,589,3,112,56,0,589,590,5,89,0,0,590,591,3, - 84,42,0,591,83,1,0,0,0,592,604,3,112,56,0,593,604,5,55,0,0,594,604, - 5,45,0,0,595,604,5,46,0,0,596,604,5,52,0,0,597,604,5,53,0,0,598, - 604,5,54,0,0,599,604,5,56,0,0,600,604,5,57,0,0,601,604,5,58,0,0, - 602,604,5,59,0,0,603,592,1,0,0,0,603,593,1,0,0,0,603,594,1,0,0,0, - 603,595,1,0,0,0,603,596,1,0,0,0,603,597,1,0,0,0,603,598,1,0,0,0, - 603,599,1,0,0,0,603,600,1,0,0,0,603,601,1,0,0,0,603,602,1,0,0,0, - 604,85,1,0,0,0,605,606,5,22,0,0,606,607,3,112,56,0,607,608,5,89, - 0,0,608,609,3,88,44,0,609,625,1,0,0,0,610,611,5,23,0,0,611,612,3, - 112,56,0,612,613,5,89,0,0,613,614,3,112,56,0,614,615,5,89,0,0,615, - 616,3,90,45,0,616,625,1,0,0,0,617,618,5,8,0,0,618,619,3,112,56,0, - 619,620,5,89,0,0,620,622,3,112,56,0,621,623,3,92,46,0,622,621,1, - 0,0,0,622,623,1,0,0,0,623,625,1,0,0,0,624,605,1,0,0,0,624,610,1, - 0,0,0,624,617,1,0,0,0,625,87,1,0,0,0,626,627,7,2,0,0,627,89,1,0, - 0,0,628,629,7,3,0,0,629,91,1,0,0,0,630,631,5,25,0,0,631,635,5,90, - 0,0,632,634,3,94,47,0,633,632,1,0,0,0,634,637,1,0,0,0,635,633,1, - 0,0,0,635,636,1,0,0,0,636,638,1,0,0,0,637,635,1,0,0,0,638,639,5, - 91,0,0,639,93,1,0,0,0,640,641,3,112,56,0,641,642,5,19,0,0,642,643, - 5,22,0,0,643,650,3,112,56,0,644,645,5,27,0,0,645,646,5,23,0,0,646, - 647,3,112,56,0,647,648,5,89,0,0,648,649,3,112,56,0,649,651,1,0,0, - 0,650,644,1,0,0,0,650,651,1,0,0,0,651,652,1,0,0,0,652,653,5,87,0, - 0,653,691,1,0,0,0,654,655,3,112,56,0,655,656,5,19,0,0,656,657,5, - 23,0,0,657,658,3,112,56,0,658,659,5,89,0,0,659,666,3,112,56,0,660, - 661,5,27,0,0,661,662,5,23,0,0,662,663,3,112,56,0,663,664,5,89,0, - 0,664,665,3,112,56,0,665,667,1,0,0,0,666,660,1,0,0,0,666,667,1,0, - 0,0,667,668,1,0,0,0,668,669,5,87,0,0,669,691,1,0,0,0,670,671,3,112, - 56,0,671,672,5,19,0,0,672,673,5,6,0,0,673,680,3,112,56,0,674,675, - 5,27,0,0,675,676,5,23,0,0,676,677,3,112,56,0,677,678,5,89,0,0,678, - 679,3,112,56,0,679,681,1,0,0,0,680,674,1,0,0,0,680,681,1,0,0,0,681, - 682,1,0,0,0,682,683,5,87,0,0,683,691,1,0,0,0,684,685,3,112,56,0, - 685,686,5,19,0,0,686,687,5,13,0,0,687,688,3,112,56,0,688,689,5,87, - 0,0,689,691,1,0,0,0,690,640,1,0,0,0,690,654,1,0,0,0,690,670,1,0, - 0,0,690,684,1,0,0,0,691,95,1,0,0,0,692,693,5,13,0,0,693,694,3,112, - 56,0,694,695,5,19,0,0,695,696,3,112,56,0,696,697,5,89,0,0,697,699, - 3,112,56,0,698,700,3,92,46,0,699,698,1,0,0,0,699,700,1,0,0,0,700, - 701,1,0,0,0,701,702,5,87,0,0,702,97,1,0,0,0,703,729,3,100,50,0,704, - 729,5,67,0,0,705,729,5,68,0,0,706,707,5,69,0,0,707,729,3,114,57, - 0,708,709,5,70,0,0,709,710,5,96,0,0,710,711,3,112,56,0,711,712,5, - 97,0,0,712,729,1,0,0,0,713,714,5,71,0,0,714,715,5,96,0,0,715,716, - 3,112,56,0,716,717,5,97,0,0,717,729,1,0,0,0,718,719,5,72,0,0,719, - 720,5,96,0,0,720,721,3,98,49,0,721,722,5,97,0,0,722,729,1,0,0,0, - 723,724,5,73,0,0,724,725,5,96,0,0,725,726,3,98,49,0,726,727,5,97, - 0,0,727,729,1,0,0,0,728,703,1,0,0,0,728,704,1,0,0,0,728,705,1,0, - 0,0,728,706,1,0,0,0,728,708,1,0,0,0,728,713,1,0,0,0,728,718,1,0, - 0,0,728,723,1,0,0,0,729,99,1,0,0,0,730,731,7,4,0,0,731,101,1,0,0, - 0,732,733,7,5,0,0,733,103,1,0,0,0,734,743,3,114,57,0,735,743,5,98, - 0,0,736,743,5,99,0,0,737,743,5,82,0,0,738,743,5,83,0,0,739,743,5, - 84,0,0,740,743,3,106,53,0,741,743,3,110,55,0,742,734,1,0,0,0,742, - 735,1,0,0,0,742,736,1,0,0,0,742,737,1,0,0,0,742,738,1,0,0,0,742, - 739,1,0,0,0,742,740,1,0,0,0,742,741,1,0,0,0,743,105,1,0,0,0,744, - 753,5,90,0,0,745,750,3,108,54,0,746,747,5,88,0,0,747,749,3,108,54, - 0,748,746,1,0,0,0,749,752,1,0,0,0,750,748,1,0,0,0,750,751,1,0,0, - 0,751,754,1,0,0,0,752,750,1,0,0,0,753,745,1,0,0,0,753,754,1,0,0, - 0,754,755,1,0,0,0,755,756,5,91,0,0,756,107,1,0,0,0,757,758,3,114, - 57,0,758,759,5,86,0,0,759,760,3,104,52,0,760,109,1,0,0,0,761,770, - 5,92,0,0,762,767,3,104,52,0,763,764,5,88,0,0,764,766,3,104,52,0, - 765,763,1,0,0,0,766,769,1,0,0,0,767,765,1,0,0,0,767,768,1,0,0,0, - 768,771,1,0,0,0,769,767,1,0,0,0,770,762,1,0,0,0,770,771,1,0,0,0, - 771,772,1,0,0,0,772,773,5,93,0,0,773,111,1,0,0,0,774,775,7,6,0,0, - 775,113,1,0,0,0,776,777,5,101,0,0,777,115,1,0,0,0,51,128,135,156, - 167,179,198,206,213,226,234,261,285,295,301,330,336,341,354,362, - 375,380,393,406,421,424,431,439,479,483,491,503,517,527,545,557, - 566,603,622,624,635,650,666,680,690,699,728,742,750,753,767,770 + 1,49,1,49,3,49,755,8,49,1,50,1,50,1,51,1,51,1,52,1,52,1,52,1,52, + 1,52,1,52,1,52,1,52,3,52,769,8,52,1,53,1,53,1,53,1,53,5,53,775,8, + 53,10,53,12,53,778,9,53,3,53,780,8,53,1,53,1,53,1,54,1,54,1,54,1, + 54,1,55,1,55,1,55,1,55,5,55,792,8,55,10,55,12,55,795,9,55,3,55,797, + 8,55,1,55,1,55,1,56,1,56,1,57,1,57,1,57,0,0,58,0,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,0,7,1,0,60,64,2,0,55,59,61,62,2,0,55, + 56,61,62,2,0,57,59,61,62,1,0,79,86,1,0,67,70,2,0,34,34,105,105,844, + 0,128,1,0,0,0,2,130,1,0,0,0,4,140,1,0,0,0,6,144,1,0,0,0,8,167,1, + 0,0,0,10,179,1,0,0,0,12,181,1,0,0,0,14,188,1,0,0,0,16,198,1,0,0, + 0,18,200,1,0,0,0,20,213,1,0,0,0,22,234,1,0,0,0,24,236,1,0,0,0,26, + 251,1,0,0,0,28,285,1,0,0,0,30,287,1,0,0,0,32,330,1,0,0,0,34,336, + 1,0,0,0,36,341,1,0,0,0,38,366,1,0,0,0,40,368,1,0,0,0,42,388,1,0, + 0,0,44,401,1,0,0,0,46,414,1,0,0,0,48,417,1,0,0,0,50,428,1,0,0,0, + 52,430,1,0,0,0,54,438,1,0,0,0,56,487,1,0,0,0,58,489,1,0,0,0,60,500, + 1,0,0,0,62,502,1,0,0,0,64,507,1,0,0,0,66,509,1,0,0,0,68,531,1,0, + 0,0,70,533,1,0,0,0,72,542,1,0,0,0,74,567,1,0,0,0,76,592,1,0,0,0, + 78,594,1,0,0,0,80,608,1,0,0,0,82,614,1,0,0,0,84,629,1,0,0,0,86,650, + 1,0,0,0,88,652,1,0,0,0,90,654,1,0,0,0,92,656,1,0,0,0,94,716,1,0, + 0,0,96,718,1,0,0,0,98,754,1,0,0,0,100,756,1,0,0,0,102,758,1,0,0, + 0,104,768,1,0,0,0,106,770,1,0,0,0,108,783,1,0,0,0,110,787,1,0,0, + 0,112,800,1,0,0,0,114,802,1,0,0,0,116,117,3,6,3,0,117,118,5,0,0, + 1,118,129,1,0,0,0,119,120,3,20,10,0,120,121,5,0,0,1,121,129,1,0, + 0,0,122,123,3,36,18,0,123,124,5,0,0,1,124,129,1,0,0,0,125,126,3, + 2,1,0,126,127,5,0,0,1,127,129,1,0,0,0,128,116,1,0,0,0,128,119,1, + 0,0,0,128,122,1,0,0,0,128,125,1,0,0,0,129,1,1,0,0,0,130,131,5,2, + 0,0,131,135,5,95,0,0,132,134,3,8,4,0,133,132,1,0,0,0,134,137,1,0, + 0,0,135,133,1,0,0,0,135,136,1,0,0,0,136,138,1,0,0,0,137,135,1,0, + 0,0,138,139,5,96,0,0,139,3,1,0,0,0,140,141,5,3,0,0,141,142,3,114, + 57,0,142,143,5,92,0,0,143,5,1,0,0,0,144,145,5,1,0,0,145,146,3,112, + 56,0,146,147,5,43,0,0,147,148,3,114,57,0,148,149,5,37,0,0,149,150, + 3,114,57,0,150,151,5,36,0,0,151,152,3,114,57,0,152,156,5,95,0,0, + 153,155,3,8,4,0,154,153,1,0,0,0,155,158,1,0,0,0,156,154,1,0,0,0, + 156,157,1,0,0,0,157,159,1,0,0,0,158,156,1,0,0,0,159,160,5,96,0,0, + 160,7,1,0,0,0,161,168,3,4,2,0,162,168,3,18,9,0,163,168,3,10,5,0, + 164,168,3,62,31,0,165,168,3,74,37,0,166,168,3,96,48,0,167,161,1, + 0,0,0,167,162,1,0,0,0,167,163,1,0,0,0,167,164,1,0,0,0,167,165,1, + 0,0,0,167,166,1,0,0,0,168,9,1,0,0,0,169,170,5,3,0,0,170,171,5,6, + 0,0,171,172,3,112,56,0,172,173,5,92,0,0,173,180,1,0,0,0,174,175, + 5,3,0,0,175,176,5,8,0,0,176,177,3,112,56,0,177,178,5,92,0,0,178, + 180,1,0,0,0,179,169,1,0,0,0,179,174,1,0,0,0,180,11,1,0,0,0,181,182, + 5,4,0,0,182,183,5,5,0,0,183,184,3,112,56,0,184,185,5,43,0,0,185, + 186,3,114,57,0,186,187,5,92,0,0,187,13,1,0,0,0,188,189,5,4,0,0,189, + 190,5,6,0,0,190,191,3,112,56,0,191,192,5,37,0,0,192,193,3,114,57, + 0,193,194,5,92,0,0,194,15,1,0,0,0,195,199,3,10,5,0,196,199,3,12, + 6,0,197,199,3,14,7,0,198,195,1,0,0,0,198,196,1,0,0,0,198,197,1,0, + 0,0,199,17,1,0,0,0,200,201,5,5,0,0,201,202,3,112,56,0,202,203,5, + 43,0,0,203,206,3,114,57,0,204,205,5,44,0,0,205,207,3,114,57,0,206, + 204,1,0,0,0,206,207,1,0,0,0,207,208,1,0,0,0,208,209,5,92,0,0,209, + 19,1,0,0,0,210,212,3,16,8,0,211,210,1,0,0,0,212,215,1,0,0,0,213, + 211,1,0,0,0,213,214,1,0,0,0,214,216,1,0,0,0,215,213,1,0,0,0,216, + 217,5,6,0,0,217,218,3,112,56,0,218,219,5,43,0,0,219,220,3,114,57, + 0,220,221,5,37,0,0,221,222,3,114,57,0,222,226,5,95,0,0,223,225,3, + 22,11,0,224,223,1,0,0,0,225,228,1,0,0,0,226,224,1,0,0,0,226,227, + 1,0,0,0,227,229,1,0,0,0,228,226,1,0,0,0,229,230,5,96,0,0,230,21, + 1,0,0,0,231,235,3,26,13,0,232,235,3,30,15,0,233,235,3,24,12,0,234, + 231,1,0,0,0,234,232,1,0,0,0,234,233,1,0,0,0,235,23,1,0,0,0,236,237, + 5,11,0,0,237,238,3,112,56,0,238,239,5,43,0,0,239,240,3,114,57,0, + 240,241,5,91,0,0,241,242,3,98,49,0,242,243,5,90,0,0,243,244,3,98, + 49,0,244,245,5,95,0,0,245,246,5,60,0,0,246,247,5,43,0,0,247,248, + 3,114,57,0,248,249,5,92,0,0,249,250,5,96,0,0,250,25,1,0,0,0,251, + 252,5,9,0,0,252,253,3,112,56,0,253,254,5,43,0,0,254,255,3,114,57, + 0,255,256,5,91,0,0,256,257,3,98,49,0,257,261,5,95,0,0,258,260,3, + 28,14,0,259,258,1,0,0,0,260,263,1,0,0,0,261,259,1,0,0,0,261,262, + 1,0,0,0,262,264,1,0,0,0,263,261,1,0,0,0,264,265,5,96,0,0,265,27, + 1,0,0,0,266,267,5,50,0,0,267,268,5,43,0,0,268,269,3,114,57,0,269, + 270,5,92,0,0,270,286,1,0,0,0,271,272,5,51,0,0,272,273,5,43,0,0,273, + 274,3,114,57,0,274,275,5,92,0,0,275,286,1,0,0,0,276,277,5,52,0,0, + 277,278,5,53,0,0,278,279,5,43,0,0,279,280,3,114,57,0,280,281,5,54, + 0,0,281,282,5,43,0,0,282,283,3,114,57,0,283,284,5,92,0,0,284,286, + 1,0,0,0,285,266,1,0,0,0,285,271,1,0,0,0,285,276,1,0,0,0,286,29,1, + 0,0,0,287,288,5,10,0,0,288,289,3,112,56,0,289,290,5,43,0,0,290,291, + 3,114,57,0,291,292,5,91,0,0,292,293,3,102,51,0,293,295,3,34,17,0, + 294,296,5,71,0,0,295,294,1,0,0,0,295,296,1,0,0,0,296,297,1,0,0,0, + 297,301,5,95,0,0,298,300,3,32,16,0,299,298,1,0,0,0,300,303,1,0,0, + 0,301,299,1,0,0,0,301,302,1,0,0,0,302,304,1,0,0,0,303,301,1,0,0, + 0,304,305,5,96,0,0,305,31,1,0,0,0,306,307,5,57,0,0,307,308,5,43, + 0,0,308,309,3,114,57,0,309,310,5,92,0,0,310,331,1,0,0,0,311,312, + 5,58,0,0,312,313,5,43,0,0,313,314,3,114,57,0,314,315,5,92,0,0,315, + 331,1,0,0,0,316,317,5,59,0,0,317,318,5,43,0,0,318,319,3,114,57,0, + 319,320,5,92,0,0,320,331,1,0,0,0,321,322,5,52,0,0,322,323,5,53,0, + 0,323,324,5,43,0,0,324,325,3,114,57,0,325,326,5,54,0,0,326,327,5, + 43,0,0,327,328,3,114,57,0,328,329,5,92,0,0,329,331,1,0,0,0,330,306, + 1,0,0,0,330,311,1,0,0,0,330,316,1,0,0,0,330,321,1,0,0,0,331,33,1, + 0,0,0,332,333,5,5,0,0,333,337,3,112,56,0,334,335,5,6,0,0,335,337, + 3,112,56,0,336,332,1,0,0,0,336,334,1,0,0,0,337,35,1,0,0,0,338,340, + 3,16,8,0,339,338,1,0,0,0,340,343,1,0,0,0,341,339,1,0,0,0,341,342, + 1,0,0,0,342,344,1,0,0,0,343,341,1,0,0,0,344,345,5,8,0,0,345,346, + 3,112,56,0,346,347,5,43,0,0,347,348,3,114,57,0,348,349,5,37,0,0, + 349,352,3,114,57,0,350,351,5,38,0,0,351,353,5,103,0,0,352,350,1, + 0,0,0,352,353,1,0,0,0,353,354,1,0,0,0,354,358,5,95,0,0,355,357,3, + 38,19,0,356,355,1,0,0,0,357,360,1,0,0,0,358,356,1,0,0,0,358,359, + 1,0,0,0,359,361,1,0,0,0,360,358,1,0,0,0,361,362,5,96,0,0,362,37, + 1,0,0,0,363,367,3,40,20,0,364,367,3,42,21,0,365,367,3,44,22,0,366, + 363,1,0,0,0,366,364,1,0,0,0,366,365,1,0,0,0,367,39,1,0,0,0,368,369, + 5,11,0,0,369,370,3,112,56,0,370,371,5,43,0,0,371,372,3,114,57,0, + 372,373,5,91,0,0,373,374,3,98,49,0,374,375,5,90,0,0,375,376,3,98, + 49,0,376,377,5,45,0,0,377,379,3,48,24,0,378,380,3,46,23,0,379,378, + 1,0,0,0,379,380,1,0,0,0,380,381,1,0,0,0,381,382,5,47,0,0,382,384, + 3,50,25,0,383,385,3,54,27,0,384,383,1,0,0,0,384,385,1,0,0,0,385, + 386,1,0,0,0,386,387,5,92,0,0,387,41,1,0,0,0,388,389,5,12,0,0,389, + 390,3,112,56,0,390,391,5,43,0,0,391,392,3,114,57,0,392,393,5,91, + 0,0,393,394,3,98,49,0,394,395,5,90,0,0,395,397,3,98,49,0,396,398, + 3,54,27,0,397,396,1,0,0,0,397,398,1,0,0,0,398,399,1,0,0,0,399,400, + 5,92,0,0,400,43,1,0,0,0,401,402,5,13,0,0,402,403,3,112,56,0,403, + 404,5,43,0,0,404,405,3,114,57,0,405,406,5,14,0,0,406,407,3,112,56, + 0,407,408,5,91,0,0,408,410,3,98,49,0,409,411,3,54,27,0,410,409,1, + 0,0,0,410,411,1,0,0,0,411,412,1,0,0,0,412,413,5,92,0,0,413,45,1, + 0,0,0,414,415,5,46,0,0,415,416,3,98,49,0,416,47,1,0,0,0,417,418, + 7,0,0,0,418,49,1,0,0,0,419,429,5,49,0,0,420,421,5,5,0,0,421,429, + 3,112,56,0,422,423,5,7,0,0,423,425,5,97,0,0,424,426,3,52,26,0,425, + 424,1,0,0,0,425,426,1,0,0,0,426,427,1,0,0,0,427,429,5,98,0,0,428, + 419,1,0,0,0,428,420,1,0,0,0,428,422,1,0,0,0,429,51,1,0,0,0,430,435, + 3,112,56,0,431,432,5,93,0,0,432,434,3,112,56,0,433,431,1,0,0,0,434, + 437,1,0,0,0,435,433,1,0,0,0,435,436,1,0,0,0,436,53,1,0,0,0,437,435, + 1,0,0,0,438,439,5,48,0,0,439,443,5,95,0,0,440,442,3,56,28,0,441, + 440,1,0,0,0,442,445,1,0,0,0,443,441,1,0,0,0,443,444,1,0,0,0,444, + 446,1,0,0,0,445,443,1,0,0,0,446,447,5,96,0,0,447,55,1,0,0,0,448, + 449,5,22,0,0,449,450,3,112,56,0,450,451,5,43,0,0,451,452,3,114,57, + 0,452,453,5,91,0,0,453,454,3,98,49,0,454,455,3,58,29,0,455,456,5, + 92,0,0,456,488,1,0,0,0,457,458,5,23,0,0,458,459,3,112,56,0,459,460, + 5,43,0,0,460,461,3,114,57,0,461,462,5,91,0,0,462,463,3,102,51,0, + 463,464,3,34,17,0,464,465,3,58,29,0,465,466,5,92,0,0,466,488,1,0, + 0,0,467,468,5,6,0,0,468,469,3,112,56,0,469,470,5,43,0,0,470,471, + 3,114,57,0,471,472,5,91,0,0,472,473,3,112,56,0,473,474,5,92,0,0, + 474,488,1,0,0,0,475,476,5,13,0,0,476,477,3,112,56,0,477,478,5,43, + 0,0,478,479,3,114,57,0,479,480,5,91,0,0,480,483,3,112,56,0,481,482, + 5,15,0,0,482,484,3,98,49,0,483,481,1,0,0,0,483,484,1,0,0,0,484,485, + 1,0,0,0,485,486,5,92,0,0,486,488,1,0,0,0,487,448,1,0,0,0,487,457, + 1,0,0,0,487,467,1,0,0,0,487,475,1,0,0,0,488,57,1,0,0,0,489,490,5, + 97,0,0,490,495,3,60,30,0,491,492,5,93,0,0,492,494,3,60,30,0,493, + 491,1,0,0,0,494,497,1,0,0,0,495,493,1,0,0,0,495,496,1,0,0,0,496, + 498,1,0,0,0,497,495,1,0,0,0,498,499,5,98,0,0,499,59,1,0,0,0,500, + 501,7,1,0,0,501,61,1,0,0,0,502,503,5,21,0,0,503,504,3,64,32,0,504, + 63,1,0,0,0,505,508,3,66,33,0,506,508,3,70,35,0,507,505,1,0,0,0,507, + 506,1,0,0,0,508,65,1,0,0,0,509,510,5,22,0,0,510,511,3,112,56,0,511, + 512,5,43,0,0,512,513,3,114,57,0,513,514,5,31,0,0,514,515,3,112,56, + 0,515,516,5,91,0,0,516,517,3,98,49,0,517,518,5,32,0,0,518,521,3, + 68,34,0,519,520,5,33,0,0,520,522,3,104,52,0,521,519,1,0,0,0,521, + 522,1,0,0,0,522,523,1,0,0,0,523,524,5,92,0,0,524,67,1,0,0,0,525, + 532,5,65,0,0,526,527,5,66,0,0,527,528,5,99,0,0,528,529,3,98,49,0, + 529,530,5,100,0,0,530,532,1,0,0,0,531,525,1,0,0,0,531,526,1,0,0, + 0,532,69,1,0,0,0,533,534,5,23,0,0,534,535,3,112,56,0,535,536,5,43, + 0,0,536,537,3,114,57,0,537,538,5,95,0,0,538,539,3,72,36,0,539,540, + 3,72,36,0,540,541,5,96,0,0,541,71,1,0,0,0,542,543,3,34,17,0,543, + 544,5,24,0,0,544,545,3,112,56,0,545,546,5,43,0,0,546,547,3,114,57, + 0,547,549,3,102,51,0,548,550,5,71,0,0,549,548,1,0,0,0,549,550,1, + 0,0,0,550,553,1,0,0,0,551,552,5,39,0,0,552,554,3,114,57,0,553,551, + 1,0,0,0,553,554,1,0,0,0,554,556,1,0,0,0,555,557,5,40,0,0,556,555, + 1,0,0,0,556,557,1,0,0,0,557,560,1,0,0,0,558,559,5,41,0,0,559,561, + 3,114,57,0,560,558,1,0,0,0,560,561,1,0,0,0,561,563,1,0,0,0,562,564, + 5,42,0,0,563,562,1,0,0,0,563,564,1,0,0,0,564,565,1,0,0,0,565,566, + 5,92,0,0,566,73,1,0,0,0,567,568,5,16,0,0,568,569,3,112,56,0,569, + 570,5,17,0,0,570,573,3,112,56,0,571,572,5,43,0,0,572,574,3,114,57, + 0,573,571,1,0,0,0,573,574,1,0,0,0,574,577,1,0,0,0,575,576,5,38,0, + 0,576,578,5,103,0,0,577,575,1,0,0,0,577,578,1,0,0,0,578,579,1,0, + 0,0,579,583,5,95,0,0,580,582,3,76,38,0,581,580,1,0,0,0,582,585,1, + 0,0,0,583,581,1,0,0,0,583,584,1,0,0,0,584,586,1,0,0,0,585,583,1, + 0,0,0,586,587,5,96,0,0,587,75,1,0,0,0,588,589,5,20,0,0,589,593,3, + 64,32,0,590,593,3,80,40,0,591,593,3,78,39,0,592,588,1,0,0,0,592, + 590,1,0,0,0,592,591,1,0,0,0,593,77,1,0,0,0,594,595,5,28,0,0,595, + 596,3,112,56,0,596,597,5,29,0,0,597,598,5,30,0,0,598,599,5,26,0, + 0,599,600,5,13,0,0,600,601,3,112,56,0,601,602,5,27,0,0,602,603,5, + 23,0,0,603,604,3,112,56,0,604,605,5,94,0,0,605,606,3,112,56,0,606, + 607,5,92,0,0,607,79,1,0,0,0,608,609,5,18,0,0,609,610,3,82,41,0,610, + 611,5,19,0,0,611,612,3,86,43,0,612,613,5,92,0,0,613,81,1,0,0,0,614, + 615,3,112,56,0,615,616,5,94,0,0,616,617,3,84,42,0,617,83,1,0,0,0, + 618,630,3,112,56,0,619,630,5,60,0,0,620,630,5,50,0,0,621,630,5,51, + 0,0,622,630,5,57,0,0,623,630,5,58,0,0,624,630,5,59,0,0,625,630,5, + 61,0,0,626,630,5,62,0,0,627,630,5,63,0,0,628,630,5,64,0,0,629,618, + 1,0,0,0,629,619,1,0,0,0,629,620,1,0,0,0,629,621,1,0,0,0,629,622, + 1,0,0,0,629,623,1,0,0,0,629,624,1,0,0,0,629,625,1,0,0,0,629,626, + 1,0,0,0,629,627,1,0,0,0,629,628,1,0,0,0,630,85,1,0,0,0,631,632,5, + 22,0,0,632,633,3,112,56,0,633,634,5,94,0,0,634,635,3,88,44,0,635, + 651,1,0,0,0,636,637,5,23,0,0,637,638,3,112,56,0,638,639,5,94,0,0, + 639,640,3,112,56,0,640,641,5,94,0,0,641,642,3,90,45,0,642,651,1, + 0,0,0,643,644,5,8,0,0,644,645,3,112,56,0,645,646,5,94,0,0,646,648, + 3,112,56,0,647,649,3,92,46,0,648,647,1,0,0,0,648,649,1,0,0,0,649, + 651,1,0,0,0,650,631,1,0,0,0,650,636,1,0,0,0,650,643,1,0,0,0,651, + 87,1,0,0,0,652,653,7,2,0,0,653,89,1,0,0,0,654,655,7,3,0,0,655,91, + 1,0,0,0,656,657,5,25,0,0,657,661,5,95,0,0,658,660,3,94,47,0,659, + 658,1,0,0,0,660,663,1,0,0,0,661,659,1,0,0,0,661,662,1,0,0,0,662, + 664,1,0,0,0,663,661,1,0,0,0,664,665,5,96,0,0,665,93,1,0,0,0,666, + 667,3,112,56,0,667,668,5,19,0,0,668,669,5,22,0,0,669,676,3,112,56, + 0,670,671,5,27,0,0,671,672,5,23,0,0,672,673,3,112,56,0,673,674,5, + 94,0,0,674,675,3,112,56,0,675,677,1,0,0,0,676,670,1,0,0,0,676,677, + 1,0,0,0,677,678,1,0,0,0,678,679,5,92,0,0,679,717,1,0,0,0,680,681, + 3,112,56,0,681,682,5,19,0,0,682,683,5,23,0,0,683,684,3,112,56,0, + 684,685,5,94,0,0,685,692,3,112,56,0,686,687,5,27,0,0,687,688,5,23, + 0,0,688,689,3,112,56,0,689,690,5,94,0,0,690,691,3,112,56,0,691,693, + 1,0,0,0,692,686,1,0,0,0,692,693,1,0,0,0,693,694,1,0,0,0,694,695, + 5,92,0,0,695,717,1,0,0,0,696,697,3,112,56,0,697,698,5,19,0,0,698, + 699,5,6,0,0,699,706,3,112,56,0,700,701,5,27,0,0,701,702,5,23,0,0, + 702,703,3,112,56,0,703,704,5,94,0,0,704,705,3,112,56,0,705,707,1, + 0,0,0,706,700,1,0,0,0,706,707,1,0,0,0,707,708,1,0,0,0,708,709,5, + 92,0,0,709,717,1,0,0,0,710,711,3,112,56,0,711,712,5,19,0,0,712,713, + 5,13,0,0,713,714,3,112,56,0,714,715,5,92,0,0,715,717,1,0,0,0,716, + 666,1,0,0,0,716,680,1,0,0,0,716,696,1,0,0,0,716,710,1,0,0,0,717, + 95,1,0,0,0,718,719,5,13,0,0,719,720,3,112,56,0,720,721,5,19,0,0, + 721,722,3,112,56,0,722,723,5,94,0,0,723,725,3,112,56,0,724,726,3, + 92,46,0,725,724,1,0,0,0,725,726,1,0,0,0,726,727,1,0,0,0,727,728, + 5,92,0,0,728,97,1,0,0,0,729,755,3,100,50,0,730,755,5,72,0,0,731, + 755,5,73,0,0,732,733,5,74,0,0,733,755,3,114,57,0,734,735,5,75,0, + 0,735,736,5,101,0,0,736,737,3,112,56,0,737,738,5,102,0,0,738,755, + 1,0,0,0,739,740,5,76,0,0,740,741,5,101,0,0,741,742,3,112,56,0,742, + 743,5,102,0,0,743,755,1,0,0,0,744,745,5,77,0,0,745,746,5,101,0,0, + 746,747,3,98,49,0,747,748,5,102,0,0,748,755,1,0,0,0,749,750,5,78, + 0,0,750,751,5,101,0,0,751,752,3,98,49,0,752,753,5,102,0,0,753,755, + 1,0,0,0,754,729,1,0,0,0,754,730,1,0,0,0,754,731,1,0,0,0,754,732, + 1,0,0,0,754,734,1,0,0,0,754,739,1,0,0,0,754,744,1,0,0,0,754,749, + 1,0,0,0,755,99,1,0,0,0,756,757,7,4,0,0,757,101,1,0,0,0,758,759,7, + 5,0,0,759,103,1,0,0,0,760,769,3,114,57,0,761,769,5,103,0,0,762,769, + 5,104,0,0,763,769,5,87,0,0,764,769,5,88,0,0,765,769,5,89,0,0,766, + 769,3,106,53,0,767,769,3,110,55,0,768,760,1,0,0,0,768,761,1,0,0, + 0,768,762,1,0,0,0,768,763,1,0,0,0,768,764,1,0,0,0,768,765,1,0,0, + 0,768,766,1,0,0,0,768,767,1,0,0,0,769,105,1,0,0,0,770,779,5,95,0, + 0,771,776,3,108,54,0,772,773,5,93,0,0,773,775,3,108,54,0,774,772, + 1,0,0,0,775,778,1,0,0,0,776,774,1,0,0,0,776,777,1,0,0,0,777,780, + 1,0,0,0,778,776,1,0,0,0,779,771,1,0,0,0,779,780,1,0,0,0,780,781, + 1,0,0,0,781,782,5,96,0,0,782,107,1,0,0,0,783,784,3,114,57,0,784, + 785,5,91,0,0,785,786,3,104,52,0,786,109,1,0,0,0,787,796,5,97,0,0, + 788,793,3,104,52,0,789,790,5,93,0,0,790,792,3,104,52,0,791,789,1, + 0,0,0,792,795,1,0,0,0,793,791,1,0,0,0,793,794,1,0,0,0,794,797,1, + 0,0,0,795,793,1,0,0,0,796,788,1,0,0,0,796,797,1,0,0,0,797,798,1, + 0,0,0,798,799,5,98,0,0,799,111,1,0,0,0,800,801,7,6,0,0,801,113,1, + 0,0,0,802,803,5,106,0,0,803,115,1,0,0,0,58,128,135,156,167,179,198, + 206,213,226,234,261,285,295,301,330,336,341,352,358,366,379,384, + 397,410,425,428,435,443,483,487,495,507,521,531,549,553,556,560, + 563,573,577,583,592,629,648,650,661,676,692,706,716,725,754,768, + 776,779,793,796 ]; private static __ATN: antlr.ATN; @@ -4288,6 +4388,12 @@ export class PackageResourceDeclContext extends antlr.ParserRuleContext { return this.getRuleContext(i, ResourcePreambleContext); } + public SEMANTIC_MAJOR(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.SEMANTIC_MAJOR, 0); + } + public INTEGER(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.INTEGER, 0); + } public packageExport(): PackageExportContext[]; public packageExport(i: number): PackageExportContext | null; public packageExport(i?: number): PackageExportContext[] | PackageExportContext | null { @@ -5005,8 +5111,14 @@ export class EdgeEndpointContext extends antlr.ParserRuleContext { public ID(): antlr.TerminalNode { return this.getToken(QuixosCapabilityParser.ID, 0)!; } - public stringLiteral(): StringLiteralContext { - return this.getRuleContext(0, StringLiteralContext)!; + public stringLiteral(): StringLiteralContext[]; + public stringLiteral(i: number): StringLiteralContext | null; + public stringLiteral(i?: number): StringLiteralContext[] | StringLiteralContext | null { + if (i === undefined) { + return this.getRuleContexts(StringLiteralContext); + } + + return this.getRuleContext(i, StringLiteralContext); } public cardinality(): CardinalityContext { return this.getRuleContext(0, CardinalityContext)!; @@ -5017,6 +5129,18 @@ export class EdgeEndpointContext extends antlr.ParserRuleContext { public ORDERED(): antlr.TerminalNode | null { return this.getToken(QuixosCapabilityParser.ORDERED, 0); } + public ON_DELETE(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.ON_DELETE, 0); + } + public RETAIN_OTHER(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.RETAIN_OTHER, 0); + } + public KEYED(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.KEYED, 0); + } + public PUBLIC_TRAVERSAL(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.PUBLIC_TRAVERSAL, 0); + } public override get ruleIndex(): number { return QuixosCapabilityParser.RULE_edgeEndpoint; } @@ -5055,6 +5179,18 @@ export class ConformanceDeclContext extends antlr.ParserRuleContext { public RBRACE(): antlr.TerminalNode { return this.getToken(QuixosCapabilityParser.RBRACE, 0)!; } + public ID(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.ID, 0); + } + public stringLiteral(): StringLiteralContext | null { + return this.getRuleContext(0, StringLiteralContext); + } + public SEMANTIC_MAJOR(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.SEMANTIC_MAJOR, 0); + } + public INTEGER(): antlr.TerminalNode | null { + return this.getToken(QuixosCapabilityParser.INTEGER, 0); + } public conformanceItem(): ConformanceItemContext[]; public conformanceItem(i: number): ConformanceItemContext | null; public conformanceItem(i?: number): ConformanceItemContext[] | ConformanceItemContext | null { diff --git a/src/capability-language/parser.ts b/src/capability-language/parser.ts index 08e7b2a..f2e9d78 100644 --- a/src/capability-language/parser.ts +++ b/src/capability-language/parser.ts @@ -894,6 +894,7 @@ const lowerPackage = ( return { packageId: capabilityId.package(stringValue(context.stringLiteral(0))), revisionId: state.packages.get(alias)!.revisionId, + ...(context.INTEGER() ? { semanticMajor: Number(context.INTEGER()!.getText()) } : {}), displayName: alias, source, exports, @@ -938,12 +939,16 @@ const lowerEdgeEndpoint = ( return constraint ? { projectionId: capabilityId.edgeProjection( - stringValue(context.stringLiteral()), + stringValue(context.stringLiteral(0)), ), displayName: identifier(context.identifier()), constraint, cardinality: lowerCardinality(context.cardinality()), ordered: Boolean(context.ORDERED()), + ...(context.ON_DELETE() ? { onDelete: stringValue(context.stringLiteral(1)) as EdgeEndpoint["onDelete"] } : {}), + ...(context.RETAIN_OTHER() ? { retainOther: true } : {}), + ...(context.KEYED() ? {keyType: stringValue(context.stringLiteral(context.ON_DELETE() ? 2 : 1)) as EdgeEndpoint["keyType"]} : {}), + ...(context.PUBLIC_TRAVERSAL() ? {publicTraversal: true} : {}), } : undefined; }; @@ -1406,6 +1411,8 @@ const lowerConformance = ( return { atomId, interfaceRevisionId: interfaceSymbol.revisionId, + ...(context.stringLiteral() ? { id: capabilityId.conformance(stringValue(context.stringLiteral()!)) } : {}), + ...(context.INTEGER() ? { semanticMajor: Number(context.INTEGER()!.getText()) } : {}), privateAttachments, operationBindings, relationshipMaterializations, diff --git a/src/capability-language/pin-upgrades.ts b/src/capability-language/pin-upgrades.ts new file mode 100644 index 0000000..7310dc0 --- /dev/null +++ b/src/capability-language/pin-upgrades.ts @@ -0,0 +1,249 @@ +import fs from "node:fs/promises"; +import path from "node:path"; +import os from "node:os"; +import {randomUUID} from "node:crypto"; +import {execFile as callback} from "node:child_process"; +import {promisify} from "node:util"; +import {loadQuixosLock, parseQuixosLockDocument} from "../resource-lock/index.js"; +import {contentDigest} from "../capability-model/evolution.js"; +import {planStructure, applyStructure, type StructuralRequest} from "./structural-plan.js"; +import {snapshotRepository, checkResourceCandidate, checkWorkspaceCandidate} from "./candidate-check.js"; +import {compileWorkspaceRepository, compileCapabilityResourceRepository, type ResolvedCapabilityResource} from "./assembly.js"; +import {createGitCapabilityResolver} from "./git-resolver.js"; +const execFile = promisify(callback); +type Source = {repository: string; commit: string}; +export type UpgradeNode = {kind: "workspace" | "package" | "interface"; directory: string; source: Source}; +export type UpgradeSpec = {nodes: UpgradeNode[]; quixos?: Source; baseline?: string; reviews?: string; bootstrap?: boolean}; +type NodePlan = UpgradeNode & {treeDigest: string; dependencies: string[]; lockFiles: string[]}; +export type UpgradePlan = {schemaVersion: 1; workbench: string; spec: UpgradeSpec; nodes: NodePlan[]; digest: string}; +type Step = {directory: string; phase: "editing" | "prepared" | "refactor" | "checked" | "publishing" | "published"; commit?: string; treeDigest?: string; structuralJournal?: string; structuralPlan?: Awaited>}; +type Journal = {schemaVersion: 1; plan: UpgradePlan; steps: Step[]}; +const sourceKey = (node: {kind: string; source: Source}) => JSON.stringify([node.kind, node.source.repository, node.source.commit]); +const command = async (cwd: string, tool: string, args: string[]) => (await execFile(tool, args, {cwd, maxBuffer: 16 * 1024 * 1024, env: {...process.env, GIT_TERMINAL_PROMPT: "0", QUIXOS_JJ_NO_CHECKPOINT: "1", QUIXOS_SUBTREE_PUBLISH: "0"}})).stdout.trim(); +const validSource = (value: Source) => { + const url = new URL(value.repository); + if (url.protocol !== "https:" || url.username || url.password || url.search || url.hash || !/^(?:[a-f0-9]{40}|[a-f0-9]{64})$/.test(value.commit)) throw new Error("Upgrade sources must be exact credential-free HTTPS revisions"); +}; +const location = async (root: string, directory: string) => { + if (directory !== "root" && !/^resources\/[A-Za-z0-9][A-Za-z0-9._-]*$/.test(directory)) throw new Error("Upgrade target must be a managed root/resource repository"); + const resolved = await fs.realpath(path.join(root, directory)); + if (resolved !== path.join(root, directory)) throw new Error("Upgrade target crosses a symlink"); + return resolved; +}; +const treeDigest = async (root: string) => { + const temporary = await fs.mkdtemp(path.join(os.tmpdir(), "qx-upgrade-tree-")); + try {return (await snapshotRepository(root, temporary)).treeDigest;} finally {await fs.rm(temporary, {recursive: true, force: true});} +}; +const writeJournal = async (filename: string, journal: unknown) => { + const temp = `${filename}.${randomUUID()}.tmp`; + const handle = await fs.open(temp, "wx", 0o600); + try {await handle.writeFile(JSON.stringify(journal, null, 2)); await handle.sync();} finally {await handle.close();} + await fs.rename(temp, filename); + const directory = await fs.open(path.dirname(filename), "r"); + try {await directory.sync();} finally {await directory.close();} +}; + +export const discoverUpgradeSpec = async (workbench: string): Promise => { + const graph = JSON.parse(await fs.readFile(path.join(workbench, ".quixos/resource-graph.json"), "utf8")); + const root = await location(workbench, "root"); + const nodes: UpgradeNode[] = [{kind: "workspace", directory: "root", source: { + repository: await command(root, "git", ["remote", "get-url", "origin"]), + commit: await command(root, "jj", ["--ignore-working-copy", "log", "--no-graph", "-r", "@", "-T", "commit_id"]), + }}, ...graph.resources.map((entry: {kind: "interface" | "package"; directory: string; source: Source}) => ({kind: entry.kind, source: entry.source, + directory: path.relative(workbench, path.resolve(workbench, entry.directory))}))]; + let baseline: string | undefined; + try { + const host = JSON.parse(await fs.readFile("/etc/quixos/workspace-source.json", "utf8")); + if (await fs.realpath(host.workbenchRoot) === await fs.realpath(workbench)) baseline = JSON.parse(await fs.readFile(path.join(host.runtimeClosureRoot, "manifest.json"), "utf8")).workspacePlanPath; + } catch (error) {if (!["ENOENT", "EACCES"].includes((error as NodeJS.ErrnoException).code ?? "")) throw error;} + return {nodes, baseline}; +}; + +/** Read-only source plan. Repositories are selected explicitly, including any + * parallel versions of the same resource; no guesses at a floating 'latest'. */ +export const planPinUpgrades = async (workbenchPath: string, spec: UpgradeSpec): Promise => { + const workbench = await fs.realpath(workbenchPath); + if (!Array.isArray(spec.nodes) || !spec.nodes.length || spec.nodes.length > 100 || spec.nodes.filter((node) => node.kind === "workspace").length !== 1) throw new Error("Upgrade graph requires one workspace and at most 100 repositories"); + if (spec.quixos) validSource(spec.quixos); + const keys = new Map(); + for (const node of spec.nodes) { + validSource(node.source); + if (!["workspace", "package", "interface"].includes(node.kind) || keys.has(sourceKey(node))) throw new Error("Duplicate/invalid upgrade resource identity"); + keys.set(sourceKey(node), node.directory); + } + if (new Set(spec.nodes.map((node) => node.directory)).size !== spec.nodes.length) throw new Error("Upgrade directories must be distinct"); + const nodes: NodePlan[] = []; + for (const node of spec.nodes) { + const root = await location(workbench, node.directory); + if (await command(root, "git", ["remote", "get-url", "origin"]) !== node.source.repository) throw new Error(`Upgrade origin differs from selected source: ${node.directory}`); + const loaded = await loadQuixosLock(path.join(root, "quixos.lock")); + if (!loaded.ok) throw new Error(`Invalid lock in ${node.directory}: ${loaded.diagnostics.map((entry) => entry.message).join("; ")}`); + const dependencies = loaded.lock.resources.map((resource) => keys.get(sourceKey(resource))).filter((value): value is string => Boolean(value)); + nodes.push({...node, treeDigest: await treeDigest(root), dependencies: [...new Set(dependencies)], lockFiles: loaded.lock.sourceFiles ?? ["quixos.lock"]}); + } + const ordered: NodePlan[] = [], remaining = [...nodes]; + while (remaining.length) { + const index = remaining.findIndex((node) => node.dependencies.every((dependency) => ordered.some((entry) => entry.directory === dependency))); + if (index < 0) throw new Error("Cyclic source publication graph"); + ordered.push(remaining.splice(index, 1)[0]); + } + const workspace = ordered.find((node) => node.kind === "workspace")!; + // Even unreferenced new resources are published before the root. + ordered.splice(ordered.indexOf(workspace), 1); ordered.push(workspace); + const plan = {schemaVersion: 1 as const, workbench, spec, nodes: ordered}; + return {...plan, digest: contentDigest(plan)}; +}; + +export type UpgradeEffects = { + check(node: NodePlan, root: string, output: string, spec: UpgradeSpec): Promise; + snapshot(root: string): Promise; + publish(root: string, commit: string): Promise; +}; +const effects: UpgradeEffects = { + async check(node, root, output, spec) { + if (node.kind === "workspace" && !spec.baseline && !spec.bootstrap) throw new Error("Upgrading a workspace requires its checked active baseline for major-review checks (or explicit bootstrap:true for a new workspace)"); + // Publication checks consume already-published dependency revisions, never + // workbench dirty overlays masquerading as those immutable identities. + const snapshotMap = `${output}-published-dependencies.json`; + await fs.writeFile(snapshotMap, JSON.stringify({resources: []}), {flag: "wx"}); + const result = node.kind === "workspace" ? await checkWorkspaceCandidate({root, output, snapshotMap, baseline: spec.baseline, reviews: spec.reviews}) + : await checkResourceCandidate({root, output, kind: node.kind, source: node.source, snapshotMap}); + if (result.blockers.length) throw new Error(`Refactor required in ${node.directory}: ${result.blockers.join("; ")}`); + const evolution = (result as {evolution?: {reviews: {accepted: boolean}[]}}).evolution; + if (evolution?.reviews.some((review) => !review.accepted)) throw new Error("Explicit semantic-major review required before publishing the workspace"); + }, + async snapshot(root) { + // Unlike checking, publication deliberately captures the working copy. + await command(root, "jj", ["status"]); + const conflicts = await command(root, "jj", ["resolve", "--list"]); + if (conflicts) throw new Error("Resolve source conflicts before publication"); + const commit = await command(root, "jj", ["--ignore-working-copy", "log", "--no-graph", "-r", "@", "-T", "commit_id"]); + if (!/^(?:[a-f0-9]{40}|[a-f0-9]{64})$/.test(commit)) throw new Error("Publication did not resolve an exact commit"); + await command(root, "git", ["diff", "--exit-code", "--no-ext-diff", "--no-textconv", commit, "--"]); + const tracked = new Set((await command(root, "git", ["ls-tree", "-r", "--name-only", "-z", commit])).split("\0")); + for (const file of (await command(root, "git", ["ls-files", "--others", "--exclude-standard", "-z"])).split("\0").filter(Boolean)) if (!tracked.has(file)) throw new Error(`Uncaptured source file ${file}`); + return commit; + }, + async publish(root, commit) { + const ref = `refs/tags/quixos-reachability/${commit}`; + const remote = await command(root, "git", ["ls-remote", "--refs", "origin", ref]); + if (remote && remote !== `${commit}\t${ref}`) throw new Error("Immutable publication ref conflict"); + if (!remote) await command(root, "git", ["push", "origin", `${commit}:${ref}`]); + if (await command(root, "git", ["ls-remote", "--refs", "origin", ref]) !== `${commit}\t${ref}`) throw new Error("Publication response uncertain; retry the same journal"); + }, +}; + +/** Explicit --publish only. Append-only remote retention; never moves the + * workspace branch, activates code, or rolls back previously published nodes. */ +export const applyPinUpgrades = async (plan: UpgradePlan, journalId?: string, implementation: UpgradeEffects = effects, options: {acceptEdits?: boolean} = {}) => { + if (implementation === effects && !plan.spec.baseline && !plan.spec.bootstrap) throw new Error("Publication requires an active checked baseline or explicit bootstrap:true"); + const {digest, ...body} = plan; + if (contentDigest(body) !== digest) throw new Error("Upgrade plan digest mismatch"); + const directory = path.join(plan.workbench, ".quixos", "upgrades"); + await fs.mkdir(directory, {recursive: true, mode: 0o700}); + if (await fs.realpath(directory) !== directory) throw new Error("Upgrade journals must not cross symlinks"); + const lock = await fs.open(path.join(directory, "writer.lock"), "wx", 0o600); + const id = journalId ?? randomUUID(); + if (!/^[a-f0-9-]{36}$/.test(id)) {await lock.close(); await fs.unlink(path.join(directory, "writer.lock")); throw new Error("Invalid upgrade journal ID");} + const filename = path.join(directory, `${id}.json`); + try { + const journal: Journal = journalId ? JSON.parse(await fs.readFile(filename, "utf8")) : {schemaVersion: 1, plan, steps: []}; + if (journal.plan.digest !== plan.digest) throw new Error("Upgrade journal belongs to another plan"); + if (!journalId) await writeJournal(filename, journal); + for (const node of plan.nodes) { + const root = await location(plan.workbench, node.directory); + if (await command(root, "git", ["remote", "get-url", "origin"]) !== node.source.repository) throw new Error("Upgrade remote changed after planning"); + let step = journal.steps.find((entry) => entry.directory === node.directory); + if (step?.phase === "published") continue; + if (!step) { + if (await treeDigest(root) !== node.treeDigest) throw new Error(`Stale upgrade plan: ${node.directory}`); + const files: StructuralRequest["files"] = []; + for (const file of node.lockFiles) { + const parsed = parseQuixosLockDocument(await fs.readFile(path.join(root, file), "utf8")); + if (!parsed.ok) throw new Error("Invalid lock during upgrade"); + const edits = []; + for (const resource of parsed.document.resources) { + const dependency = plan.nodes.find((entry) => sourceKey(entry) === sourceKey(resource)); + const published = dependency && journal.steps.find((entry) => entry.directory === dependency.directory && entry.phase === "published"); + if (published?.commit && published.commit !== resource.source.commit) edits.push({operation: "dependency" as const, kind: resource.kind, name: resource.binding, source: {...resource.source, commit: published.commit}}); + } + if (parsed.document.kind === "root" && plan.spec.quixos) edits.push({operation: "quixos-pin" as const, source: plan.spec.quixos}); + if (edits.length) files.push({file, edits}); + } + const structuralPlan = files.length ? await planStructure(root, {kind: node.kind, source: node.source, files}, process.env.QUIXOS_SNAPSHOT_MAP) : undefined; + step = {directory: node.directory, phase: "editing", treeDigest: node.treeDigest, structuralPlan, structuralJournal: structuralPlan ? randomUUID() : undefined}; + journal.steps.push(step); await writeJournal(filename, journal); + } + if (step.phase === "editing") { + if (step.structuralPlan) await applyStructure(step.structuralPlan, step.structuralJournal); + else if (await treeDigest(root) !== step.treeDigest) throw new Error("Source changed before upgrade editing"); + step.treeDigest = await treeDigest(root); + step.phase = "prepared"; + await writeJournal(filename, journal); + } + if (step.phase === "refactor") { + const current = await treeDigest(root); + if (current !== step.treeDigest && !options.acceptEdits) throw new Error("Refactored source requires --accept-edits when resuming"); + step.treeDigest = current; step.phase = "prepared"; await writeJournal(filename, journal); + } + if (await treeDigest(root) !== step.treeDigest) throw new Error(`Source changed during upgrade: ${node.directory}; inspect ${filename}`); + if (step.phase === "prepared") { + try {await implementation.check(node, root, path.join(directory, `${id}-${node.directory.replaceAll("/", "-")}-${randomUUID()}`), plan.spec);} + catch (error) {step.phase = "refactor"; await writeJournal(filename, journal); throw error;} + if (await treeDigest(root) !== step.treeDigest) throw new Error("Source changed while checking"); + step.phase = "checked"; await writeJournal(filename, journal); + } + if (step.phase === "checked") { + step.commit = await implementation.snapshot(root); + if (await treeDigest(root) !== step.treeDigest) throw new Error("Publication snapshot changed checked files"); + step.phase = "publishing"; await writeJournal(filename, journal); + } + await implementation.publish(root, step.commit!); + step.phase = "published"; await writeJournal(filename, journal); + } + // Keep subsequent automatic upgrades associated with the newly published + // identities, without renaming repositories or changing any selected branch. + // Explicit-spec callers without a managed graph retain the journal as their + // source of revisions instead. + const graphFile = path.join(plan.workbench, ".quixos/resource-graph.json"); + let graphText: string | undefined; + try {graphText = await fs.readFile(graphFile, "utf8");} catch (error) {if ((error as NodeJS.ErrnoException).code !== "ENOENT") throw error;} + if (graphText !== undefined) { + const previous = JSON.parse(graphText); + const snapshots = await Promise.all(previous.resources.map(async (entry: {kind: string; source: Source; directory: string}) => ({kind: entry.kind, ...entry.source, directory: await location(plan.workbench, path.relative(plan.workbench, path.resolve(plan.workbench, entry.directory)))}))); + for (const node of plan.nodes.filter((entry) => entry.kind !== "workspace")) { + const step = journal.steps.find((entry) => entry.directory === node.directory)!; + if (await treeDigest(await location(plan.workbench, node.directory)) !== step.treeDigest) throw new Error("Published source changed before workbench graph refresh"); + snapshots.push({kind: node.kind, repository: node.source.repository, commit: step.commit, directory: path.join(plan.workbench, node.directory)}); + } + const unique = [...new Map(snapshots.map((entry: {kind: string; repository: string; commit: string}) => [JSON.stringify([entry.kind, entry.repository, entry.commit]), entry])).values()]; + const snapshotMap = path.join(directory, `${id}-published-snapshots.json`); + await fs.writeFile(snapshotMap, JSON.stringify({resources: unique})); + const resolveResource = await createGitCapabilityResolver({checkoutRoot: path.join(directory, `${id}-graph-resources`), snapshotMap, snapshotOnly: true}); + const rootNode = plan.nodes.find((node) => node.kind === "workspace")!; + if (await treeDigest(await location(plan.workbench, rootNode.directory)) !== journal.steps.find((step) => step.directory === rootNode.directory)!.treeDigest) throw new Error("Root source changed before workbench graph refresh"); + const compiled = await compileWorkspaceRepository({rootDirectory: await location(plan.workbench, rootNode.directory), resolveResource}); + // Managed repositories need not currently be reachable from the workspace. + // Keep them discoverable/checkpointed until explicitly removed by the user. + const resources = new Map(compiled.resources.map((node) => [node.key, node])); + for (const node of plan.nodes.filter((entry) => entry.kind !== "workspace")) { + const step = journal.steps.find((entry) => entry.directory === node.directory)!; + const source = {resolver: "git" as const, repository: node.source.repository, commit: step.commit!}; + const key = `${node.kind}\0${source.repository}\0${source.commit}`; + if (resources.has(key)) continue; + const directory = await location(plan.workbench, node.directory); + const standalone = await compileCapabilityResourceRepository({rootDirectory: directory, kind: node.kind as "package" | "interface", source, resolveResource}); + for (const dependency of standalone.resources) resources.set(dependency.key, dependency); + resources.set(key, {key, kind: node.kind as "package" | "interface", source, directory, lock: standalone.lock, resource: standalone.resource, dependencies: standalone.directResources}); + } + await writeJournal(graphFile, {formatVersion: 1, quixos: compiled.lock.quixos, + directResources: [...compiled.directResources.entries()].map(([bindingKey, node]) => {const [kind, binding] = bindingKey.split("\0"); return {kind, binding, resourceKey: node.key, directory: node.directory};}), + resources: [...resources.values()].map((node) => ({key: node.key, kind: node.kind, source: node.source, directory: node.directory, + resourceId: node.resource.kind === "interface" ? node.resource.revision.interfaceId : node.resource.revision.packageId, + revisionId: node.resource.revision.revisionId, dependencies: [...node.dependencies.entries()].map(([binding, dependency]) => ({binding, resourceKey: dependency.key}))})), + }); + } + return {id, journal: filename, revisions: journal.steps.map((step) => ({directory: step.directory, commit: step.commit})), activated: false}; + } catch (error) {throw new Error(`${error instanceof Error ? error.message : String(error)}; upgrade journal ${filename}`, {cause: error});} + finally {await lock.close(); await fs.unlink(path.join(directory, "writer.lock"));} +}; diff --git a/src/capability-language/scaffold-recipes.ts b/src/capability-language/scaffold-recipes.ts new file mode 100644 index 0000000..de0112f --- /dev/null +++ b/src/capability-language/scaffold-recipes.ts @@ -0,0 +1,138 @@ +import fs from "node:fs/promises"; +import path from "node:path"; +import {contentDigest} from "../capability-model/evolution.js"; +import {validateMigrationCatalog, type MigrationCatalog, type MigrationDeclaration} from "../capability-model/migrations.js"; +import {formatQuixosLock, type GitSource} from "../resource-lock/index.js"; +import {parseQx, walkSyntax} from "./source.js"; +import type {StructuralRequest} from "./structural-plan.js"; + +type Source = {repository: string; commit: string}; +type Registry = {generatedBy: "qx-scaffold-v1"; name: string; id: string; revision: string; exports: {name: string; id: string; file: string; migration?: boolean}[]}; +export type ScaffoldRecipe = { + source: Source; directory?: string; name?: string; id?: string; revision?: string; + declaration?: string; + tools?: {quixos: Source; protocol: Source; helpers: Source; sdk: Source}; + nixifyPluginUrl?: string; + migration?: Omit & {contracts: Record}; +}; +const marker = "// Generated by qx-scaffold-v1\n"; +const json = (value: unknown) => `${JSON.stringify(value, null, 2)}\n`; +const source = (value: Source): GitSource => { + const url = new URL(value.repository); + if (url.protocol !== "https:" || url.username || url.password || url.search || url.hash || !/^(?:[0-9a-f]{40}|[0-9a-f]{64})$/.test(value.commit)) throw new Error("Scaffolds require credential-free HTTPS sources and full exact commits"); + return {resolver: "git", ...value}; +}; +const nixSource = (value: Source) => `git+${source(value).repository}?ref=refs/tags/quixos-reachability/${value.commit}&rev=${value.commit}`; +const nixString = (value: string) => JSON.stringify(value).replaceAll("${", "\\${"); +const safeName = (name: string | undefined): string => { + if (!name || !/^[A-Za-z_][A-Za-z0-9_]*$/.test(name)) throw new Error("Scaffold requires a simple authored name"); + return name; +}; +const ownedJson = async (root: string, file: string): Promise => { + const target = path.join(root, file); + if (!(await fs.realpath(target)).startsWith(`${await fs.realpath(root)}/`)) throw new Error("Scaffold input escapes repository"); + const value = JSON.parse(await fs.readFile(target, "utf8")); + if (value.generatedBy !== "qx-scaffold-v1") throw new Error(`Not scaffold-owned: ${file}`); + return value; +}; + +/** Recipes describe structural edits; planStructure owns validation/journaling. + * Implementation files are created once and never rewritten by refresh. */ +export const scaffoldRecipe = async (root: string, command: "package" | "function" | "migration" | "refresh", spec: ScaffoldRecipe): Promise => { + source(spec.source); + if (spec.directory && !/^[A-Za-z0-9_-][A-Za-z0-9_.-]*(?:\/[A-Za-z0-9_-][A-Za-z0-9_.-]*)*$/.test(spec.directory)) throw new Error("Scaffold directory must be contained"); + const prefix = spec.directory ? `${spec.directory}/` : ""; + const files: StructuralRequest["files"] = []; + const create = (file: string, content: string) => files.push({file: prefix + file, create: content}); + const generated = (file: string, content: string) => files.push({file: prefix + file, generated: content}); + let registry: Registry; + let catalog: MigrationCatalog & {generatedBy: "qx-scaffold-v1"}; + if (command === "package") { + const name = safeName(spec.name); + if (!spec.id || !spec.revision || !spec.tools) throw new Error("Package scaffold requires id, revision, and exact quixos/protocol/helpers/sdk tool sources"); + Object.values(spec.tools).forEach(source); + registry = {generatedBy: "qx-scaffold-v1", name, id: spec.id, revision: spec.revision, exports: []}; + catalog = {generatedBy: "qx-scaffold-v1", schemaVersion: 1, contracts: {}, migrations: []}; + create("package.qx", `package ${name} id ${JSON.stringify(spec.id)} revision ${JSON.stringify(spec.revision)} {\n}\n`); + create("quixos.lock", formatQuixosLock({formatVersion: 1, quixos: source(spec.tools.quixos), resources: []})); + create("package.json", json({name: `@quixos/${name.toLowerCase()}`, version: "0.1.0", private: true, type: "module", packageManager: "yarn@4.18.0", + scripts: {build: "tsc -p tsconfig.json", typecheck: "tsc --noEmit"}, dependencies: {"@quixos/camino-package-runtime": `${spec.tools.sdk.repository}#commit=${spec.tools.sdk.commit}`}, + devDependencies: {"@types/node": "^24", typescript: "^7.0.2"}})); + create("tsconfig.json", json({compilerOptions: {target: "ES2023", module: "NodeNext", moduleResolution: "NodeNext", strict: true, outDir: "dist", skipLibCheck: true}, include: ["src/**/*.ts"]})); + create(".gitignore", "node_modules/\ndist/\n.quixos/\nresult\n.yarn/install-state.gz\n"); + create(".yarnrc.yml", `nodeLinker: node-modules\nenableScripts: true\nnpmMinimalAgeGate: 0\napprovedGitRepositories:\n - ${JSON.stringify(spec.tools.sdk.repository)}\nsupportedArchitectures:\n os: [current, linux]\n cpu: [current, x64, arm64]\n libc: [current, glibc]\n`); + const nixifyPluginUrl = spec.nixifyPluginUrl ?? "https://gitea-external.egads.tutti.syntaxblitz.net/quixos/yarn-plugin-nixify-patched/raw/commit/4528fdd20b30d869262443b3f044549810e75fb8/dist/yarn-plugin-nixify.js"; + const plugin = new URL(nixifyPluginUrl); + if (plugin.protocol !== "https:" || plugin.username || plugin.password || plugin.search || plugin.hash || !/\/commit\/[a-f0-9]{40,64}\//.test(plugin.pathname)) throw new Error("Nixify plugin must have an exact credential-free HTTPS commit URL"); + generated("quixos.toolchain.json", json({generatedBy: "qx-scaffold-v1", nixifyPluginUrl})); + create("quixos.check.json", json({backend: "typescript", bindingOutput: "src/generated-bindings.ts"})); + create("flake.nix", `{ + inputs.protocol.url = ${nixString(nixSource(spec.tools.protocol))}; + inputs.nixpkgs.follows = "protocol/nixpkgs"; + inputs.flake-utils.follows = "protocol/flake-utils"; + inputs.helpers = { url = ${nixString(nixSource(spec.tools.helpers))}; flake = false; }; + outputs = inputs@{ self, protocol, nixpkgs, flake-utils, helpers, ... }: + (import (toString helpers + "/quixos-package-helpers.nix")).mkCaminoTsYarnNixifyFlake { + inherit inputs nixpkgs flake-utils; packageRoot = ./.; + bindings = { system, ... }: { + generator = (builtins.getAttr system protocol.packages).default; + repository = ${nixString(spec.source.repository)}; + commit = self.rev or (throw "Publish an exact package revision before building an activation artifact"); + packageRevisionId = ${nixString(spec.revision)}; + output = "src/generated-bindings.ts"; + resources = map (entry: entry // { directory = builtins.fetchGit { url = entry.repository; rev = entry.commit; ref = "refs/tags/quixos-reachability/" + entry.commit; }; }) (builtins.fromJSON (builtins.readFile ./quixos.resources.json)).resources; + }; + bundle = { entry = "dist/server.js"; }; + migrationEntrypoint = "dist/migrate.js"; + installServer = { libexecName = ${JSON.stringify(name.toLowerCase())}; descriptorPath = "descriptor.quixos-package.txtpb"; }; + }; +}\n`); + generated("quixos.resources.json", json({generatedBy: "qx-scaffold-v1", resources: []})); + } else { + registry = await ownedJson(root, prefix + "quixos.scaffold.json"); + catalog = await ownedJson(root, prefix + "quixos.migrations.json"); + if (command !== "refresh") { + const name = safeName(spec.name); + if (!spec.id || registry.exports.some((entry) => entry.id === spec.id || entry.name === name)) throw new Error("New export requires a unique name and ID"); + const declaration = spec.declaration ?? `function ${name} id ${JSON.stringify(spec.id)} : unit -> unit;`; + const parsed = parseQx(`package Scaffold id "scaffold" revision "scaffold@1" { ${declaration} }`); + const exports = [...walkSyntax(parsed.root)].filter((node) => ["packageFunctionExport", "packageOperationExport", "packageConstructorExport"].includes(node.kind)); + if (parsed.diagnostics.length || exports.length !== 1) throw new Error("Expected one valid package export declaration"); + const wrapped = `package Scaffold id "scaffold" revision "scaffold@1" { ${declaration} }`; + const node = exports[0]; + const derived = [...walkSyntax(node)].some((entry) => entry.kind === "eventClause"); + if (command === "migration" && (node.kind !== "packageFunctionExport" || spec.declaration)) throw new Error("Migration exports use the scaffold's unit function declaration and dedicated migration entrypoint"); + if (wrapped.slice(node.children.find((child) => child.kind === "identifier")!.start, node.children.find((child) => child.kind === "identifier")!.end) !== name + || JSON.parse(wrapped.slice(node.children.find((child) => child.kind === "stringLiteral")!.start, node.children.find((child) => child.kind === "stringLiteral")!.end)) !== spec.id) throw new Error("Declaration name/ID must match its registration"); + files.push({file: prefix + "package.qx", edits: [{operation: "append", parent: {kind: "packageResourceDecl", id: registry.id}, source: declaration}]}); + const file = `src/${command === "migration" ? "migrations" : "impl"}/${name}.ts`; + const implementation = command === "migration" ? `import type {MigrationContext} from "@quixos/camino-package-runtime";\nexport const handler = async (_context: MigrationContext): Promise => { throw new Error(${JSON.stringify(`Implement migration ${name}`)}); };\n` + : `import type {Implementation} from "../generated-bindings.js";\nexport const handler: Implementation[${JSON.stringify(name)}] = ${derived ? '{kind: "derived", get: ' : ""}async (_context) => { throw new Error(${JSON.stringify(`Implement ${name}`)}); }${derived ? "}" : ""};\n`; + create(file, implementation); + registry.exports.push({name, id: spec.id, file, ...(command === "migration" ? {migration: true} : {})}); + if (command === "migration") { + if (!spec.migration) throw new Error("Migration scaffold requires retained contracts and an explicit transition"); + const {contracts, ...transition} = spec.migration; + for (const [digest, contract] of Object.entries(contracts)) { + if (contentDigest(contract) !== digest || (catalog.contracts[digest] && contentDigest(catalog.contracts[digest]) !== digest)) throw new Error("Retained migration contract mismatch"); + catalog.contracts[digest] = contract; + } + catalog.migrations.push({...transition, implementation: {exportId: spec.id, file, digest: contentDigest(implementation)}}); + } + } + if (command === "refresh") for (const migration of catalog.migrations) { + const file = path.join(root, prefix, migration.implementation.file); + if (!(await fs.realpath(file)).startsWith(`${await fs.realpath(path.join(root, prefix))}/`)) throw new Error("Migration implementation escapes package"); + migration.implementation.digest = contentDigest(await fs.readFile(file, "utf8")); + } + } + validateMigrationCatalog(catalog, new Set(registry.exports.map((entry) => entry.id))); + generated("quixos.scaffold.json", json(registry)); + generated("quixos.migrations.json", json(catalog)); + generated("src/server.ts", marker + `import {servePackageRuntime} from "@quixos/camino-package-runtime";\nimport {createRuntime} from "./generated-bindings.js";\n` + registry.exports.filter((entry) => !entry.migration).map((entry, index) => `import {handler as impl${index}} from ${JSON.stringify(`./${entry.file.slice(4, -3)}.js`)};\n`).join("") + + `servePackageRuntime(createRuntime({\n` + registry.exports.map((entry) => ` ${JSON.stringify(entry.name)}: ${entry.migration ? 'async () => { throw new Error("Migration-only export"); }' : `impl${registry.exports.filter((value) => !value.migration).indexOf(entry)}`},`).join("\n") + `\n}));\n`); + const migrations = registry.exports.filter((entry) => entry.migration); + generated("src/migrate.ts", marker + `import {serveMigration} from "@quixos/camino-package-runtime";\n` + migrations.map((entry, index) => `import {handler as impl${index}} from ${JSON.stringify(`./${entry.file.slice(4, -3)}.js`)};\n`).join("") + `await serveMigration({${migrations.map((entry, index) => `${JSON.stringify(entry.id)}: impl${index}`).join(", ")}});\n`); + generated("descriptor.quixos-package.txtpb", `# Generated by qx-scaffold-v1\npackage_id: ${JSON.stringify(registry.id)}\npackage_revision_id: ${JSON.stringify(registry.revision)}\nruntime_protocol_version: "quixos-capabilities-v1"\n` + registry.exports.map((entry) => `exports: { export_id: ${JSON.stringify(entry.id)} runtime_symbol: ${JSON.stringify(entry.name)} }\n`).join("")); + return {kind: "package", source: spec.source, resourceRoot: spec.directory, files}; +}; diff --git a/src/capability-language/structural-edits.ts b/src/capability-language/structural-edits.ts new file mode 100644 index 0000000..0f983d2 --- /dev/null +++ b/src/capability-language/structural-edits.ts @@ -0,0 +1,135 @@ +import { CharStream, CommonTokenStream } from "antlr4ng"; +import { QuixosLockLexer } from "../resource-lock/generated/QuixosLockLexer.js"; +import { QuixosLockParser } from "../resource-lock/generated/QuixosLockParser.js"; +import { parseQuixosLockDocument } from "../resource-lock/parser.js"; +import { parseQx, walkSyntax, applySourceEdits, type SyntaxNode } from "./source.js"; + +export type StructuralSelector = { kind: string; id?: string; name?: string; names?: string[] }; +export type StructuralEdit = + | { operation: "append"; parent: StructuralSelector; source: string } + | { operation: "replace"; target: StructuralSelector; source: string } + | { operation: "remove"; target: StructuralSelector } + | { operation: "import"; kind: "interface" | "package"; name: string } + | { operation: "semantic-major"; target: StructuralSelector; major: number } + | { operation: "conformance-id"; target: StructuralSelector; id: string } + | { operation: "quixos-pin"; source: {repository: string; commit: string} } + | { operation: "dependency"; kind: "interface" | "package"; name: string; source: {repository: string; commit: string} | null }; + +// Deliberately exclude valueType/identifier/stringLiteral: callers operate on +// declaration structure, not arbitrary token offsets or lockfile text patches. +const selectable = new Set(["workspaceDecl", "fragmentDecl", "interfaceResourceDecl", "packageResourceDecl", "atomDecl", + "valueMember", "relationshipMember", "operationMember", "packageOperationExport", "packageFunctionExport", "packageConstructorExport", + "conformanceDecl", "stateDecl", "edgeDecl", "constructorBindingDecl", "resourceImportDecl", "sourceImportDecl", "operationBindingDecl"]); + +const select = (source: string, selector: StructuralSelector): {node: SyntaxNode; syntax: ReturnType} => { + if (!selectable.has(selector.kind)) throw new Error(`Unsupported structural selector ${selector.kind}`); + const syntax = parseQx(source); + if (syntax.diagnostics.length) throw new Error("Cannot scaffold syntactically invalid QX"); + const matches = [...walkSyntax(syntax.root)].filter((node) => { + if (node.kind !== selector.kind) return false; + if (selector.name && !node.children.some((child) => child.kind === "identifier" && source.slice(child.start, child.end) === selector.name)) return false; + if (selector.names && JSON.stringify(node.children.filter((child) => child.kind === "identifier").map((child) => source.slice(child.start, child.end))) !== JSON.stringify(selector.names)) return false; + if (selector.id) { + // Only an explicit ID field counts, not a coincidentally equal revision, + // default value, nested declaration, or comment. + const tokens = syntax.tokens.filter((token) => !token.trivia && token.start >= node.start && token.end <= node.end); + const literal = node.children.find((child) => child.kind === "stringLiteral" && tokens.some((token, index) => token.start === child.start && tokens[index - 1]?.kind === "ID")); + if (!literal || JSON.parse(source.slice(literal.start, literal.end)) !== selector.id) return false; + } + return true; + }); + if (matches.length !== 1) throw new Error(`Structural selector must resolve exactly once (found ${matches.length})`); + return {node: matches[0], syntax}; +}; + +/** Comment-preserving structural edits; every result is parsed before returning. */ +export const editStructure = (source: string, edit: StructuralEdit): string => { + if (edit.operation === "quixos-pin") { + const parsed = parseQuixosLockDocument(source); + if (!parsed.ok || parsed.document.kind !== "root") throw new Error("Quixos pins belong in a valid root lockfile"); + const parser = new QuixosLockParser(new CommonTokenStream(new QuixosLockLexer(CharStream.fromString(source)))); + const entries = parser.document().quixosEntry(); + if (entries.length !== 1) throw new Error("Expected one Quixos source declaration"); + const literals = entries[0].quixosSourceBlock().stringLiteral(); + const offsets = [0]; + for (const character of source) offsets.push(offsets[offsets.length - 1] + character.length); + const result = applySourceEdits(source, [ + {start: offsets[literals[0].start!.start], end: offsets[literals[0].stop!.stop + 1], text: JSON.stringify(edit.source.repository)}, + {start: offsets[literals[literals.length - 1].start!.start], end: offsets[literals[literals.length - 1].stop!.stop + 1], text: JSON.stringify(edit.source.commit)}, + ]); + const checked = parseQuixosLockDocument(result); + if (!checked.ok) throw new Error(`Invalid Quixos pin: ${checked.diagnostics.map((entry) => entry.message).join("; ")}`); + return result; + } + if (edit.operation === "import") { + if (!["interface", "package"].includes(edit.kind) || !/^[A-Za-z_][A-Za-z0-9_]*$/.test(edit.name)) throw new Error("Invalid resource import"); + const syntax = parseQx(source); + if (syntax.diagnostics.length) throw new Error("Cannot scaffold invalid QX"); + const text = `import ${edit.kind} ${edit.name};`; + if ([...walkSyntax(syntax.root)].some((entry) => entry.kind === "resourceImportDecl" && source.slice(entry.start, entry.end).replace(/\s+/g, " ") === text)) return source; + const root = syntax.root.children[0]; + const position = ["workspaceDecl", "fragmentDecl"].includes(root.kind) ? syntax.tokens.find((token) => token.kind === "LBRACE")!.end : root.start; + const result = applySourceEdits(source, [{start: position, end: position, text: `\n${text}\n`}]); + if (parseQx(result).diagnostics.length) throw new Error("Invalid resource import position"); + return result; + } + if (edit.operation === "dependency") { + const parsed = parseQuixosLockDocument(source); + if (!parsed.ok) throw new Error("Cannot scaffold an invalid lockfile"); + if (!["interface", "package"].includes(edit.kind) || !/^[A-Za-z_][A-Za-z0-9_]*$/.test(edit.name)) throw new Error("Invalid dependency selector"); + const parser = new QuixosLockParser(new CommonTokenStream(new QuixosLockLexer(CharStream.fromString(source)))); + const tree = parser.document(); + const offsets = [0]; + for (const character of source) offsets.push(offsets[offsets.length - 1] + character.length); + const entries = tree.resourceEntry().filter((entry) => entry.resourceKind().getText() === edit.kind && entry.identifier().getText() === edit.name); + if (entries.length > 1) throw new Error("Ambiguous dependency selector"); + const entry = entries[0]; + const replacement = edit.source ? `${edit.kind} ${edit.name} source {\n repository ${JSON.stringify(edit.source.repository)};\n commit ${JSON.stringify(edit.source.commit)};\n}` : ""; + if (!entry && !edit.source) throw new Error("Cannot remove an absent dependency"); + const start = entry ? offsets[entry.start!.start] : offsets[tree.RBRACE().symbol.start]; + const end = entry ? offsets[entry.stop!.stop + 1] : start; + const result = applySourceEdits(source, [{start, end, text: entry ? replacement : `${replacement}\n`}]); + const checked = parseQuixosLockDocument(result); + if (!checked.ok) throw new Error(`Invalid dependency change: ${checked.diagnostics.map((entry) => entry.message).join("; ")}`); + return result; + } + const {node, syntax} = select(source, edit.operation === "append" ? edit.parent : edit.target); + let result: string; + if (edit.operation === "semantic-major") { + if (!["conformanceDecl", "packageResourceDecl"].includes(node.kind) || !Number.isSafeInteger(edit.major) || edit.major < 1) throw new Error("Semantic major requires a package/conformance and positive integer"); + const tokens = syntax.tokens.filter((token) => !token.trivia && token.start >= node.start && token.end <= node.end); + const marker = tokens.findIndex((token) => token.kind === "SEMANTIC_MAJOR"); + const value = marker < 0 ? undefined : tokens[marker + 1]; + const brace = tokens.find((token) => token.kind === "LBRACE")!; + result = applySourceEdits(source, [{start: value?.start ?? brace.start, end: value?.end ?? brace.start, text: value ? String(edit.major) : `semantic-major ${edit.major} `}]); + } else if (edit.operation === "conformance-id") { + if (node.kind !== "conformanceDecl" || !edit.id) throw new Error("Identity enrollment requires a conformance and stable ID"); + const existing = node.children.find((entry) => entry.kind === "stringLiteral"); + if (existing) { + if (JSON.parse(source.slice(existing.start, existing.end)) !== edit.id) throw new Error("Cannot change an enrolled conformance identity; create a new conformance explicitly"); + return source; + } + const identifiers = node.children.filter((entry) => entry.kind === "identifier"); + const position = identifiers[identifiers.length - 1].end; + result = applySourceEdits(source, [{start: position, end: position, text: ` id ${JSON.stringify(edit.id)}`}]); + } else if (edit.operation === "append") { + const closing = syntax.tokens.find((token) => token.kind === "RBRACE" && token.end === node.end); + if (!closing) throw new Error("Append requires a declaration with a body"); + result = applySourceEdits(source, [{start: closing.start, end: closing.start, text: `\n${edit.source}\n`}]); + } else { + const wrapper = edit.operation === "remove" && ["stateDecl", "edgeDecl"].includes(node.kind) + ? [...walkSyntax(syntax.root)].filter((entry) => ["conformanceItem", "sharedAttachmentDecl"].includes(entry.kind) && entry.start <= node.start && entry.end >= node.end).sort((a, b) => (a.end - a.start) - (b.end - b.start))[0] + : undefined; + result = applySourceEdits(source, [{start: wrapper?.start ?? node.start, end: wrapper?.end ?? node.end, text: edit.operation === "replace" ? edit.source : ""}]); + } + const checked = parseQx(result); + if (checked.diagnostics.length) throw new Error(`Invalid structural change: ${checked.diagnostics.map((entry) => entry.message).join("; ")}`); + return result; +}; + +export const scaffoldResourceSource = (kind: "interface" | "package", name: string, id: string, revision: string) => { + if (!/^[A-Z][A-Za-z0-9]*$/.test(name) || !id || !revision) throw new Error("Resource scaffold requires a PascalCase name and explicit identities"); + const source = `${kind} ${name} id ${JSON.stringify(id)} revision ${JSON.stringify(revision)} {\n}\n`; + if (parseQx(source).diagnostics.length) throw new Error("Invalid resource scaffold"); + return source; +}; diff --git a/src/capability-language/structural-plan.ts b/src/capability-language/structural-plan.ts new file mode 100644 index 0000000..5cd0e01 --- /dev/null +++ b/src/capability-language/structural-plan.ts @@ -0,0 +1,189 @@ +import fs from "node:fs/promises"; +import path from "node:path"; +import os from "node:os"; +import { randomUUID } from "node:crypto"; +import { contentDigest } from "../capability-model/evolution.js"; +import { editStructure, type StructuralEdit } from "./structural-edits.js"; +import { snapshotRepository, localResourceSnapshots } from "./candidate-check.js"; +import { compileWorkspaceRepository, compileCapabilityResourceRepository } from "./assembly.js"; +import { createGitCapabilityResolver } from "./git-resolver.js"; +import {bindingSchema, generateTypeScriptBindings} from "../bindings/index.js"; + +export type StructuralRequest = { + kind: "workspace" | "interface" | "package"; + source?: {repository: string; commit: string}; + resourceRoot?: string; + files: ({file: string; edits: StructuralEdit[]} | {file: string; create: string} | {file: string; generated: string})[]; +}; +type Change = {file: string; before: string | null; after: string; mode: number}; +type Journal = {schemaVersion: 1; id: string; root: string; phase: "prepared" | "complete"; changes: Change[]}; +const safeFile = (file: string) => { + if (!/^(?:[A-Za-z0-9_-][A-Za-z0-9_.-]*\/)*(?:\.gitignore|\.yarnrc.yml|[A-Za-z0-9_-][A-Za-z0-9_.-]*\.(?:qx|lock|ts|tsx|json|nix|txtpb))$/.test(file) + || file.split("/").some((part) => [".git", ".jj", ".quixos", "node_modules"].includes(part))) throw new Error(`Unsafe scaffold path ${file}`); +}; +const read = async (root: string, file: string): Promise => { + safeFile(file); + const target = path.join(root, file); + try { + const metadata = await fs.lstat(target); + if (!metadata.isFile() || metadata.isSymbolicLink() || !(await fs.realpath(target)).startsWith(`${root}/`)) throw new Error(`Scaffold target is not a contained regular file: ${file}`); + return await fs.readFile(target, "utf8"); + } catch (error) { if ((error as NodeJS.ErrnoException).code === "ENOENT") return null; throw error; } +}; +const containedParent = async (root: string, file: string) => { + let current = root; + for (const part of file.split("/").slice(0, -1)) { + current = path.join(current, part); + await fs.mkdir(current).catch((error: NodeJS.ErrnoException) => { if (error.code !== "EEXIST") throw error; }); + const metadata = await fs.lstat(current); + if (!metadata.isDirectory() || metadata.isSymbolicLink()) throw new Error("Scaffold parent must be a real directory"); + } +}; +const durableJson = async (file: string, value: unknown) => { + const temporary = `${file}.${randomUUID()}.tmp`; + const handle = await fs.open(temporary, "wx", 0o600); + try { await handle.writeFile(`${JSON.stringify(value, null, 2)}\n`); await handle.sync(); } finally { await handle.close(); } + await fs.rename(temporary, file); + const directory = await fs.open(path.dirname(file), "r"); + try { await directory.sync(); } finally { await directory.close(); } +}; + +/** Validate the entire edited resource graph in a private snapshot before writes. */ +export const planStructure = async (rootPath: string, request: StructuralRequest, snapshotMap?: string) => { + const root = await fs.realpath(rootPath); + const temporary = await fs.mkdtemp(path.join(os.tmpdir(), "qx-structure-")); + try { + const snapshot = await snapshotRepository(root, path.join(temporary, "source")); + const observed = await Promise.all(snapshot.files.map(async ({name}) => ({file: name, digest: contentDigest(await fs.readFile(path.join(snapshot.directory, name), "utf8"))}))); + const changes: Change[] = []; + if (!Array.isArray(request.files) || !request.files.length || request.files.length > 100) throw new Error("Structural plan requires 1–100 files"); + for (const input of request.files) { + safeFile(input.file); + if (changes.some((entry) => entry.file === input.file)) throw new Error("Repeated structural file target"); + const before = await read(root, input.file); + let after: string; + if ("create" in input) { + if (before !== null || typeof input.create !== "string") throw new Error("Scaffold creation cannot replace an existing file"); + after = input.create; + } else if ("generated" in input) { + const generated = (text: string) => text.startsWith("// Generated by qx-scaffold-v1\n") || text.startsWith("# Generated by qx-scaffold-v1\n") || (() => {try {return JSON.parse(text).generatedBy === "qx-scaffold-v1";} catch {return false;}})(); + if (typeof input.generated !== "string" || !generated(input.generated) || (before !== null && !generated(before))) throw new Error("Only scaffold-owned generated files may be regenerated"); + after = input.generated; + } else { + if (before === null || !Array.isArray(input.edits)) throw new Error("Structural edit requires an existing source"); + after = input.edits.reduce(editStructure, before); + } + if (Buffer.byteLength(after) > 1024 * 1024) throw new Error("Scaffold file exceeds 1 MiB"); + const mode = before === null ? 0o644 : (await fs.stat(path.join(root, input.file))).mode & 0o777; + changes.push({file: input.file, before, after, mode}); + await containedParent(snapshot.directory, input.file); + await fs.writeFile(path.join(snapshot.directory, input.file), after); + } + const localMap = path.join(temporary, "local-resources.json"); + await fs.writeFile(localMap, JSON.stringify(await localResourceSnapshots(root, snapshotMap))); + const resolveResource = await createGitCapabilityResolver({checkoutRoot: path.join(temporary, "resources"), snapshotMap: localMap}); + if (request.resourceRoot && !/^[A-Za-z0-9_-][A-Za-z0-9_.-]*(?:\/[A-Za-z0-9_-][A-Za-z0-9_.-]*)*$/.test(request.resourceRoot)) throw new Error("Resource root must be a contained relative directory"); + const resourceRoot = path.join(snapshot.directory, request.resourceRoot ?? ""); + if (request.kind === "workspace") await compileWorkspaceRepository({rootDirectory: resourceRoot, resolveResource}); + else if (["package", "interface"].includes(request.kind) && request.source) { + const compiled = await compileCapabilityResourceRepository({rootDirectory: resourceRoot, kind: request.kind as "package" | "interface", source: {resolver: "git", ...request.source}, resolveResource}); + let scaffoldOwned = false; + try { scaffoldOwned = JSON.parse(await fs.readFile(path.join(resourceRoot, "quixos.scaffold.json"), "utf8")).generatedBy === "qx-scaffold-v1"; } catch { /* ordinary resource, no generated package scaffolding */ } + if (scaffoldOwned && compiled.resource.kind === "package") { + const configuration = JSON.parse(await fs.readFile(path.join(resourceRoot, "quixos.check.json"), "utf8")); + const artifacts = [ + {file: configuration.bindingOutput as string, after: generateTypeScriptBindings(bindingSchema(compiled), compiled.resource.revision.revisionId, configuration.options)}, + {file: "quixos.resources.json", after: JSON.stringify({generatedBy: "qx-scaffold-v1", resources: compiled.resources.filter((entry) => entry.directory !== resourceRoot).map((entry) => ({kind: entry.kind, repository: entry.source.repository, commit: entry.source.commit}))}, null, 2) + "\n"}, + ]; + for (const artifact of artifacts) { + const file = request.resourceRoot ? `${request.resourceRoot}/${artifact.file}` : artifact.file; + safeFile(file); + if (Buffer.byteLength(artifact.after) > 1024 * 1024) throw new Error("Generated scaffold file exceeds 1 MiB"); + const before = await read(root, file); + if (before !== null && !before.startsWith("// Generated by quixos-codegen-ts.") && (() => {try {return JSON.parse(before).generatedBy !== "qx-scaffold-v1";} catch {return true;}})()) throw new Error(`Refusing to overwrite hand-authored generated artifact ${file}`); + const previous = changes.find((entry) => entry.file === file); + if (previous) previous.after = artifact.after; + else changes.push({file, before, after: artifact.after, mode: 0o644}); + } + } + } + else throw new Error("Resource plans require kind and exact authored source identity"); + if (changes.length > 100) throw new Error("Structural plan including generated artifacts exceeds 100 files"); + // Validation may fetch dependencies; reject edits made while it was running. + for (const entry of changes) if (await read(root, entry.file) !== entry.before) throw new Error(`Source changed while planning: ${entry.file}`); + for (const entry of observed) if (contentDigest(await fs.readFile(path.join(root, entry.file), "utf8")) !== entry.digest) throw new Error(`Validation input changed while planning: ${entry.file}`); + return {root, changes, observed, digest: contentDigest(changes), validation: "resource-graph" as const}; + } finally { await fs.rm(temporary, {recursive: true, force: true}); } +}; + +/** Replay only exact before/after states. A crash never loses the original text. */ +const replayStructure = async (rootPath: string, id: string) => { + const root = await fs.realpath(rootPath); + if (!/^[a-f0-9-]{36}$/.test(id)) throw new Error("Invalid scaffold journal ID"); + const journalPath = path.join(root, ".quixos", "scaffolds", `${id}.json`); + const journal = JSON.parse(await fs.readFile(journalPath, "utf8")) as Journal; + if (journal.schemaVersion !== 1 || journal.root !== root || journal.id !== id) throw new Error("Scaffold journal identity mismatch"); + for (const entry of journal.changes) { + const current = await read(root, entry.file); + if (current !== entry.before && current !== entry.after) throw new Error(`Scaffold conflicts with newer edits: ${entry.file}; original text is retained in ${journalPath}`); + } + if (journal.phase === "complete") return {id, journalPath, phase: journal.phase}; + for (const entry of journal.changes) { + if (await read(root, entry.file) === entry.after) continue; + await containedParent(root, entry.file); + const target = path.join(root, entry.file); + const temporary = `${target}.qx-${randomUUID()}.tmp`; + const handle = await fs.open(temporary, "wx", entry.mode); + try { await handle.writeFile(entry.after); await handle.sync(); } finally { await handle.close(); } + if (entry.before === null) { + // link is atomic and fails if another author created the destination. + await fs.link(temporary, target); + await fs.unlink(temporary); + } else { + if (await read(root, entry.file) !== entry.before) throw new Error(`Source changed during scaffold: ${entry.file}`); + await fs.rename(temporary, target); + } + const directory = await fs.open(path.dirname(target), "r"); + try { await directory.sync(); } finally { await directory.close(); } + } + journal.phase = "complete"; + await durableJson(journalPath, journal); + return {id, journalPath, phase: journal.phase}; +}; + +const withStructureLock = async (root: string, work: () => Promise) => { + await containedParent(root, ".quixos/scaffolds/placeholder.json"); + const lock = path.join(root, ".quixos", "scaffolds", "writer.lock"); + // Never steal a possibly live writer's lock. A process crash requires the + // operator to verify that writer is gone, remove this lock, then resume its + // journal. This is deliberately fail-closed instead of guessing from a PID. + const handle = await fs.open(lock, "wx", 0o600).catch((error) => { + if ((error as NodeJS.ErrnoException).code === "EEXIST") throw new Error(`Another scaffold writer or interrupted writer owns ${lock}; verify it has exited before removing its lock and resuming`); + throw error; + }); + try { await handle.writeFile(JSON.stringify({pid: process.pid})); await handle.sync(); return await work(); } + finally { await handle.close(); await fs.unlink(lock); } +}; +export const resumeStructure = async (rootPath: string, id: string) => { + const root = await fs.realpath(rootPath); + return withStructureLock(root, () => replayStructure(root, id)); +}; +export const applyStructure = async (plan: Awaited>, id: string = randomUUID()) => withStructureLock(plan.root, async () => { + if (!/^[a-f0-9-]{36}$/.test(id)) throw new Error("Invalid scaffold journal ID"); + const directory = path.join(plan.root, ".quixos", "scaffolds"); + try { + const existing = JSON.parse(await fs.readFile(path.join(directory, `${id}.json`), "utf8")) as Journal; + if (existing.root !== plan.root || contentDigest(existing.changes) !== plan.digest) throw new Error("Scaffold journal identity conflict"); + for (const entry of plan.observed) if (!plan.changes.some((change) => change.file === entry.file) && contentDigest(await fs.readFile(path.join(plan.root, entry.file), "utf8")) !== entry.digest) throw new Error(`Stale scaffold validation input: ${entry.file}`); + return replayStructure(plan.root, id); + } catch (error) {if ((error as NodeJS.ErrnoException).code !== "ENOENT") throw error;} + // An unfinished journal must be recovered before another structural mutation. + for (const file of await fs.readdir(directory)) if (file.endsWith(".json")) { + const prior = JSON.parse(await fs.readFile(path.join(directory, file), "utf8")) as Journal; + if (prior.phase !== "complete") throw new Error(`Unfinished scaffold ${prior.id}; resume it first`); + } + for (const entry of plan.changes) if (await read(plan.root, entry.file) !== entry.before) throw new Error(`Stale scaffold plan: ${entry.file}`); + for (const entry of plan.observed) if (contentDigest(await fs.readFile(path.join(plan.root, entry.file), "utf8")) !== entry.digest) throw new Error(`Stale scaffold validation input: ${entry.file}`); + await durableJson(path.join(directory, `${id}.json`), {schemaVersion: 1, id, root: plan.root, phase: "prepared", changes: plan.changes} satisfies Journal); + return replayStructure(plan.root, id); +}); diff --git a/src/capability-language/tool-cli.ts b/src/capability-language/tool-cli.ts index 45c64a4..6ea6998 100644 --- a/src/capability-language/tool-cli.ts +++ b/src/capability-language/tool-cli.ts @@ -1,11 +1,107 @@ #!/usr/bin/env node -import { readFile, writeFile } from "node:fs/promises"; +import { readFile, writeFile, mkdtemp, rm } from "node:fs/promises"; import { parseQx, formatQx, lintQx } from "./source.js"; import { scaffoldAtom } from "./scaffold.js"; import { createGitCapabilityResolver } from "./git-resolver.js"; +import { planEvolution } from "../capability-model/index.js"; +import { checkWorkspaceCandidate, checkResourceCandidate, snapshotRepository } from "./candidate-check.js"; +import {planPinUpgrades, applyPinUpgrades, discoverUpgradeSpec, type UpgradeSpec} from "./pin-upgrades.js"; +import path from "node:path"; +import os from "node:os"; +import {spawnSync} from "node:child_process"; +import { planStructure, applyStructure, resumeStructure, type StructuralRequest } from "./structural-plan.js"; +import {scaffoldRecipe, type ScaffoldRecipe} from "./scaffold-recipes.js"; const main = async () => { const [command, ...args] = process.argv.slice(2); + if (command === "source-digest") { + if (!args[0] || args.length !== 1) throw new Error("usage: quixos-qx source-digest ROOT"); + const temporary = await mkdtemp(path.join(os.tmpdir(), "qx-source-digest-")); + try {process.stdout.write(`${(await snapshotRepository(args[0], temporary)).treeDigest}\n`);} finally {await rm(temporary, {recursive: true, force: true});} + return; + } + if (command === "pin-upgrade") { + const [workbench, specFile, ...flags] = args; + if (!workbench || !specFile) throw new Error("usage: quixos-qx pin-upgrade WORKBENCH SPEC_JSON [--publish] [--resume UUID]"); + let publish = false, acceptEdits = false, resume: string | undefined; + for (let index = 0; index < flags.length; index++) { + if (flags[index] === "--publish") publish = true; + else if (flags[index] === "--accept-edits") acceptEdits = true; + else if (flags[index] === "--resume" && /^[a-f0-9-]{36}$/.test(flags[index + 1] ?? "")) resume = flags[++index]; + else throw new Error(`Unknown pin-upgrade option ${flags[index]}`); + } + if (acceptEdits && !resume) throw new Error("--accept-edits requires an existing refactor journal (--resume)"); + const plan = resume ? JSON.parse(await readFile(path.join(workbench, ".quixos/upgrades", `${resume}.json`), "utf8")).plan + : await planPinUpgrades(workbench, specFile === "auto" ? await discoverUpgradeSpec(workbench) : JSON.parse(await readFile(specFile, "utf8")) as UpgradeSpec); + if (resume && path.resolve(workbench) !== plan.workbench) throw new Error("Upgrade journal belongs to another workbench"); + process.stdout.write(`${JSON.stringify(publish ? await applyPinUpgrades(plan, resume, undefined, {acceptEdits}) : plan, null, 2)}\n`); + return; + } + if (command === "check-resource") { + const [root, kind, repository, commit, output, ...extra] = args; + if (!root || !output || !["package", "interface"].includes(kind) || extra.length) throw new Error("usage: quixos-qx check-resource ROOT package|interface REPOSITORY COMMIT OUTPUT"); + const result = await checkResourceCandidate({root, kind: kind as "package" | "interface", source: {repository, commit}, output, publishedOnly: true}); + process.stdout.write(`${JSON.stringify(result, null, 2)}\n`); + if (result.blockers.length) process.exitCode = 1; + return; + } + if (["scaffold-package", "scaffold-function", "scaffold-migration", "scaffold-refresh"].includes(command)) { + const [root, specFile, ...flags] = args; + if (!root || !specFile || flags.some((flag) => !["--write", "--install"].includes(flag)) || (flags.includes("--install") && !flags.includes("--write"))) throw new Error("usage: quixos-qx scaffold-package|function|migration|refresh ROOT SPEC_JSON [--write [--install]]"); + const spec = JSON.parse(await readFile(specFile, "utf8")) as ScaffoldRecipe; + const request = await scaffoldRecipe(root, command.slice(9) as "package" | "function" | "migration" | "refresh", spec); + const plan = await planStructure(root, request, process.env.QUIXOS_SNAPSHOT_MAP); + const applied = flags.includes("--write") ? await applyStructure(plan) : undefined; + if (flags.includes("--install")) { + const cwd = path.resolve(root, spec.directory ?? ""); + const toolchain = JSON.parse(await readFile(path.join(cwd, "quixos.toolchain.json"), "utf8")); + if (toolchain.generatedBy !== "qx-scaffold-v1" || typeof toolchain.nixifyPluginUrl !== "string") throw new Error("Missing scaffold toolchain"); + for (const [executable, args] of [["corepack", ["yarn", "plugin", "import", toolchain.nixifyPluginUrl]], ["corepack", ["yarn", "config", "set", "generateDefaultNix", "false"]], ["corepack", ["yarn", "config", "set", "individualNixPackaging", "true"]], ["corepack", ["yarn", "install"]], ["corepack", ["yarn", "typecheck"]], ["nix", ["flake", "lock"]]] as const) { + const result = spawnSync(executable, [...args], {cwd, stdio: ["inherit", 2, 2]}); + if (result.error || result.status !== 0) throw new Error(`Scaffold files retained; ${executable} ${args.join(" ")} failed: ${result.error?.message ?? result.status}`); + } + } + process.stdout.write(`${JSON.stringify({...plan, applied}, null, 2)}\n`); + return; + } + if (command === "scaffold-structure") { + const [root, spec, ...flags] = args; + if (!root || !spec || flags.some((flag) => flag !== "--write")) throw new Error("usage: quixos-qx scaffold-structure ROOT SPEC_JSON [--write]"); + const request = JSON.parse(await readFile(spec, "utf8")) as StructuralRequest; + const plan = await planStructure(root, request, process.env.QUIXOS_SNAPSHOT_MAP); + const applied = flags.includes("--write") ? await applyStructure(plan) : undefined; + process.stdout.write(`${JSON.stringify({...plan, applied}, null, 2)}\n`); + return; + } + if (command === "scaffold-resume") { + const [root, id, ...extra] = args; + if (!root || !id || extra.length) throw new Error("usage: quixos-qx scaffold-resume ROOT JOURNAL_ID"); + process.stdout.write(`${JSON.stringify(await resumeStructure(root, id), null, 2)}\n`); + return; + } + if (command === "check") { + const [root, output, ...flags] = args; + if (!root || !output || flags.length % 2) throw new Error("usage: quixos-qx check ROOT OUTPUT [--snapshot-map FILE] [--baseline FILE] [--reviews FILE]"); + const values = new Map(); + for (let index = 0; index < flags.length; index += 2) { + if (!["--snapshot-map", "--baseline", "--reviews"].includes(flags[index])) throw new Error(`Unknown check option ${flags[index]}`); + values.set(flags[index], flags[index + 1]); + } + const result = await checkWorkspaceCandidate({ root, output, snapshotMap: values.get("--snapshot-map"), baseline: values.get("--baseline"), reviews: values.get("--reviews") }); + process.stdout.write(`${JSON.stringify(result, null, 2)}\n`); + if (result.blockers.length) process.exitCode = 1; + return; + } + if (command === "evolution") { + const [baseline, candidate, reviews, ...extra] = args; + if (!baseline || !candidate || extra.length) throw new Error("usage: quixos-qx evolution BASELINE_JSON CANDIDATE_JSON [REVIEWS_JSON]"); + const before = baseline === "none" ? null : JSON.parse(await readFile(baseline, "utf8")); + const after = JSON.parse(await readFile(candidate, "utf8")); + const decisions = reviews ? JSON.parse(await readFile(reviews, "utf8")) : []; + if (!Array.isArray(decisions)) throw new Error("Reviews must be an array"); + process.stdout.write(`${JSON.stringify(planEvolution(before, after, { reviews: decisions }), null, 2)}\n`); + return; + } if (command === "scaffold-atom") { const [root, name, id, ...flags] = args; if (!root || !name || !id || flags.some((flag) => flag !== "--write")) throw new Error("usage: quixos-qx scaffold-atom ROOT NAME ID [--write]"); diff --git a/src/capability-language/workspace-cli.ts b/src/capability-language/workspace-cli.ts index 178b8d7..75f69e7 100644 --- a/src/capability-language/workspace-cli.ts +++ b/src/capability-language/workspace-cli.ts @@ -1,13 +1,15 @@ #!/usr/bin/env node -import { writeFile } from "node:fs/promises"; +import { readFile, writeFile } from "node:fs/promises"; import process from "node:process"; import { compileWorkspaceRepository } from "./assembly.js"; import { createGitCapabilityResolver } from "./git-resolver.js"; +import { planEvolution, runtimeContracts, type EvolutionReview, type WorkspaceRevision } from "../capability-model/index.js"; const usage = `usage: quixos-workspace-compile --root DIRECTORY --checkout-root DIRECTORY [--snapshot-map PATH] [--graph-out PATH] [--workspace-id ID] [--workspace-revision-id ID] - [--source-root-commit GIT_REV] + [--source-root-commit GIT_REV] [--baseline PLAN_JSON] [--evolution-out PATH] + [--reviews REVIEW_JSON] Resolves a workspace's recursive resource-lock graph, clones every exact resource revision, validates standalone interface/package manifests, and emits @@ -32,6 +34,9 @@ const parseArgs = (args: string[]) => { workspaceId: values.get("--workspace-id"), workspaceRevisionId: values.get("--workspace-revision-id"), sourceRootCommit: values.get("--source-root-commit"), + baseline: values.get("--baseline"), + evolutionOut: values.get("--evolution-out"), + reviews: values.get("--reviews"), }; }; @@ -77,7 +82,14 @@ const main = async () => { })), }, null, 2)}\n`); } - process.stdout.write(`${JSON.stringify(assembled.workspace, null, 2)}\n`); + const candidate = { ...assembled.workspace, executionContracts: runtimeContracts(assembled.workspace) }; + if (options.evolutionOut) { + const baseline = options.baseline ? JSON.parse(await readFile(options.baseline, "utf8")) as WorkspaceRevision : null; + const reviews = options.reviews ? JSON.parse(await readFile(options.reviews, "utf8")) as EvolutionReview[] : []; + if (!Array.isArray(reviews)) throw new Error("Review file must contain an array"); + await writeFile(options.evolutionOut, `${JSON.stringify(planEvolution(baseline, candidate, { reviews }), null, 2)}\n`); + } + process.stdout.write(`${JSON.stringify(candidate, null, 2)}\n`); }; main().catch((error: unknown) => { diff --git a/src/capability-model/evolution.ts b/src/capability-model/evolution.ts new file mode 100644 index 0000000..5c0ba08 --- /dev/null +++ b/src/capability-model/evolution.ts @@ -0,0 +1,206 @@ +import { createHash } from "node:crypto"; +import type { Binding, Conformance, DependencyBinding, PersistentAttachment, WorkspaceRevision } from "./types.js"; +import { validateWorkspaceRevision } from "./validation.js"; + +/** Content hashing is independent of JSON object insertion order, not array order. */ +const compareText = (a: string, b: string) => a < b ? -1 : a > b ? 1 : 0; +export const canonicalJson = (value: unknown): string => { + if (value === null || typeof value === "string" || typeof value === "boolean") return JSON.stringify(value); + if (typeof value === "number" && Number.isFinite(value)) return JSON.stringify(value); + if (Array.isArray(value)) return `[${value.map(canonicalJson).join(",")}]`; + if (typeof value === "object" && value !== null) { + if (Object.getPrototypeOf(value) !== Object.prototype && Object.getPrototypeOf(value) !== null) throw new Error("Expected a plain JSON object"); + return `{${Object.entries(value).filter(([, entry]) => entry !== undefined).sort(([a], [b]) => compareText(a, b)) + .map(([key, entry]) => `${JSON.stringify(key)}:${canonicalJson(entry)}`).join(",")}}`; + } + throw new Error(`Cannot hash non-JSON value: ${typeof value}`); +}; +export const contentDigest = (value: unknown) => `sha256:${createHash("sha256").update(canonicalJson(value)).digest("hex")}`; +const semantic = (value: unknown): unknown => { + if (Array.isArray(value)) return value.map(semantic); + if (value && typeof value === "object") return Object.fromEntries(Object.entries(value) + .filter(([key, entry]) => entry !== undefined && key !== "displayName" && key !== "documentation") + .map(([key, entry]) => [key, semantic(entry)])); + return value; +}; +const sorted = (entries: readonly T[], key: (entry: T) => string) => [...entries].sort((a, b) => compareText(key(a), key(b))); +export const conformanceIdentity = (entry: Conformance): string => entry.id ?? `legacy:${entry.atomId}:${entry.interfaceRevisionId}`; + +export type StorageContract = { id: string; ownerId: string; kind: "state" | "edge"; digest: string; definition: unknown }; +export const storageContracts = (workspace: WorkspaceRevision): StorageContract[] => { + const result: StorageContract[] = []; + const add = (attachment: PersistentAttachment, ownerId: string) => { + const definition = semantic(attachment); + result.push({ id: attachment.id, ownerId, kind: attachment.kind, definition, digest: contentDigest({ ownerId, definition }) }); + }; + for (const attachment of workspace.sharedAttachments) add(attachment, "legacy:workspace"); + for (const conformance of workspace.conformances) for (const attachment of conformance.privateAttachments) add(attachment, conformanceIdentity(conformance)); + return sorted(result, (entry) => entry.id); +}; + +type GraphNode = { value: unknown; dependencies: Set; reviewProviders: Set }; +export type RuntimeContract = { groupId: string; packageId: string; packageRevisionId: string; digest: string; reviewProviders: string[]; dependencies: Array<{ id: string; digest: string }> }; + +/** Build only outbound execution dependencies. Incoming callers never retain or invalidate a provider. */ +export const runtimeContracts = (workspace: WorkspaceRevision): RuntimeContract[] => { + const nodes = new Map(); + const node = (key: string, value: unknown) => { + const result = { value: semantic(value), dependencies: new Set(), reviewProviders: new Set() }; + nodes.set(key, result); + return result; + }; + const conformanceKey = (atom: string, iface: string) => `conformance:${atom}:${iface}`; + for (const storage of storageContracts(workspace)) node(`attachment:${storage.id}`, storage); + for (const iface of workspace.interfaceImports) node(`interface:${iface.revisionId}`, { + ...iface, members: sorted(iface.members, (entry) => entry.id).map((entry) => ({ ...entry, operations: sorted(entry.operations, (operation) => operation.id) })), + }); + for (const pkg of workspace.packageImports) node(`package:${pkg.revisionId}`, { + ...pkg, semanticMajor: pkg.semanticMajor ?? 1, + exports: sorted(pkg.exports, (entry) => entry.id).map((entry) => ({ ...entry, dependencyPorts: sorted(entry.dependencyPorts, (port) => port.id) })), + }); + const dependency = (parent: GraphNode, binding: DependencyBinding, atomId: string, reviews?: Set) => { + if (binding.kind === "state") parent.dependencies.add(`attachment:${binding.slotId}`); + if (binding.kind === "edge") parent.dependencies.add(`attachment:${binding.edgeTypeId}`); + if (binding.kind === "constructor") { + parent.dependencies.add(`constructor:${binding.atomId}`); + const ctor = workspace.constructors.find((entry) => entry.atomId === binding.atomId); + const pkg = workspace.packageImports.find((entry) => entry.revisionId === ctor?.packageRevisionId); + if (pkg) reviews?.add(pkg.packageId); + } + if (binding.kind !== "constructor" && binding.via) parent.dependencies.add(`attachment:${binding.via.edgeTypeId}`); + if (binding.kind === "interface") { + parent.dependencies.add(`interface:${binding.interfaceRevisionId}`); + // An edge traversal may select any matching target. Conservatively include every possible witness. + for (const conformance of workspace.conformances) { + if (conformance.interfaceRevisionId === binding.interfaceRevisionId && (binding.via || conformance.atomId === atomId)) { + parent.dependencies.add(conformanceKey(conformance.atomId, conformance.interfaceRevisionId)); + reviews?.add(conformanceIdentity(conformance)); + for (const operation of conformance.operationBindings) { + if (operation.binding.kind !== "package") continue; + const revisionId = operation.binding.packageRevisionId; + const pkg = workspace.packageImports.find((entry) => entry.revisionId === revisionId); + if (pkg) reviews?.add(pkg.packageId); + } + } + } + } + }; + const binding = (parent: GraphNode, value: Binding, atomId: string, context: unknown) => { + if (value.kind !== "package") { dependency(parent, value, atomId); return; } + const packageNode = nodes.get(`package:${value.packageRevisionId}`)!; + parent.dependencies.add(`package:${value.packageRevisionId}`); + const normalized = { ...value, dependencies: sorted(value.dependencies, (entry) => entry.portId) }; + const key = `binding:${contentDigest({ atomId, context, value: semantic(normalized) })}`; + const bound = node(key, { atomId, context, binding: normalized }); + packageNode.dependencies.add(key); + for (const port of value.dependencies) dependency(bound, port.binding, atomId, packageNode.reviewProviders); + }; + for (const conformance of workspace.conformances) { + const parent = node(conformanceKey(conformance.atomId, conformance.interfaceRevisionId), { + id: conformanceIdentity(conformance), semanticMajor: conformance.semanticMajor ?? 1, + atomId: conformance.atomId, interfaceRevisionId: conformance.interfaceRevisionId, + operations: sorted(conformance.operationBindings, (entry) => entry.operationId), + materializations: sorted(conformance.relationshipMaterializations, (entry) => entry.memberId), + }); + parent.dependencies.add(`interface:${conformance.interfaceRevisionId}`); + for (const attachment of conformance.privateAttachments) parent.dependencies.add(`attachment:${attachment.id}`); + for (const operation of conformance.operationBindings) binding(parent, operation.binding, conformance.atomId, { + conformanceId: conformanceIdentity(conformance), semanticMajor: conformance.semanticMajor ?? 1, operationId: operation.operationId, + }); + for (const materialization of conformance.relationshipMaterializations) { + parent.dependencies.add(`constructor:${materialization.constructorAtomId}`); + parent.dependencies.add(`attachment:${materialization.edgeTypeId}`); + } + } + for (const constructor of workspace.constructors) { + const parent = node(`constructor:${constructor.atomId}`, constructor); + binding(parent, { kind: "package", ...constructor }, constructor.atomId, { constructor: constructor.atomId }); + } + const counts = new Map(); + for (const pkg of workspace.packageImports) counts.set(pkg.packageId, (counts.get(pkg.packageId) ?? 0) + 1); + return sorted(workspace.packageImports.map((pkg): RuntimeContract => { + const visited = new Set(); + const walk = (key: string) => { + if (visited.has(key)) return; + const entry = nodes.get(key); + if (!entry) throw new Error(`Unresolved execution dependency ${key}`); + visited.add(key); + for (const target of entry.dependencies) walk(target); + }; + walk(`package:${pkg.revisionId}`); + const dependencies = [...visited].sort().map((id) => ({ id, digest: contentDigest(nodes.get(id)!.value) })); + return { groupId: counts.get(pkg.packageId) === 1 ? pkg.packageId : `${pkg.packageId}#${pkg.revisionId}`, + packageId: pkg.packageId, packageRevisionId: pkg.revisionId, digest: contentDigest(dependencies), + reviewProviders: [...nodes.get(`package:${pkg.revisionId}`)!.reviewProviders].sort(), dependencies }; + }), (entry) => entry.groupId); +}; + +export type EvolutionReview = { requirementDigest: string; decision: "changed" | "accepted-unchanged"; rationale: string; agentId: string }; +export type ReviewRequirement = { consumerId: string; providerId: string; oldMajor: number; newMajor: number; requirementDigest: string }; +export type RuntimeAction = { groupId: string; action: "keep" | "start" | "replace" | "retire"; previous?: RuntimeContract; candidate?: RuntimeContract; reasons: string[] }; +export type EvolutionReport = { + schemaVersion: 1; baselineDigest: string | null; candidateDigest: string; checkerVersion: string; + runtimeActions: RuntimeAction[]; + storageChanges: Array<{ id: string; kind: "add" | "remove" | "change"; previous?: StorageContract; candidate?: StorageContract }>; + reviews: Array; + packageChecks: Array<{ groupId: string; contractDigest: string }>; + blockers: string[]; +}; + +export const planEvolution = (baseline: WorkspaceRevision | null, candidate: WorkspaceRevision, + options: { reviews?: EvolutionReview[]; allowLegacy?: boolean } = {}): EvolutionReport => { + const issues = validateWorkspaceRevision(candidate); + if (issues.length) throw new Error(`Invalid candidate workspace:\n${issues.map((entry) => `${entry.path}: ${entry.message}`).join("\n")}`); + if (baseline && baseline.workspaceId !== candidate.workspaceId) throw new Error("Cannot evolve a different workspace"); + const candidateDigest = contentDigest(candidate); + const checkerVersion = "quixos-evolution-v1"; + const blockers: string[] = []; + if (!options.allowLegacy) { + if (candidate.sharedAttachments.length) blockers.push("Assign legacy workspace-shared attachments to explicit conformance owners"); + for (const entry of candidate.conformances) if (!entry.id) blockers.push(`Conformance ${entry.atomId} as ${entry.interfaceRevisionId} requires an authored ID`); + } + const previousRuntimes = new Map((baseline ? runtimeContracts(baseline) : []).map((entry) => [entry.groupId, entry])); + const nextRuntimes = new Map(runtimeContracts(candidate).map((entry) => [entry.groupId, entry])); + const runtimeActions: RuntimeAction[] = [...new Set([...previousRuntimes.keys(), ...nextRuntimes.keys()])].sort().map((groupId) => { + const previous = previousRuntimes.get(groupId), next = nextRuntimes.get(groupId); + const before = new Map(previous?.dependencies.map((entry) => [entry.id, entry.digest])); + const after = new Map(next?.dependencies.map((entry) => [entry.id, entry.digest])); + const reasons = [...new Set([...before.keys(), ...after.keys()])].sort().filter((id) => before.get(id) !== after.get(id)); + return { groupId, action: !previous ? "start" : !next ? "retire" : previous.digest === next.digest ? "keep" : "replace", + ...(previous ? { previous } : {}), ...(next ? { candidate: next } : {}), reasons }; + }); + const beforeStorage = new Map((baseline ? storageContracts(baseline) : []).map((entry) => [entry.id, entry])); + const afterStorage = new Map(storageContracts(candidate).map((entry) => [entry.id, entry])); + const storageChanges: EvolutionReport["storageChanges"] = []; + for (const id of [...new Set([...beforeStorage.keys(), ...afterStorage.keys()])].sort()) { + const previous = beforeStorage.get(id), next = afterStorage.get(id); + if (previous?.digest !== next?.digest) storageChanges.push({ id, kind: !previous ? "add" : !next ? "remove" : "change", + ...(previous ? { previous } : {}), ...(next ? { candidate: next } : {}) }); + } + const providers = (workspace: WorkspaceRevision) => [ + ...workspace.packageImports.map((entry) => ({ id: entry.packageId as string, revision: entry.revisionId as string, major: entry.semanticMajor ?? 1, + node: `package:${entry.revisionId}`, digest: contentDigest(entry) })), + ...workspace.conformances.map((entry) => ({ id: conformanceIdentity(entry), revision: contentDigest(entry), major: entry.semanticMajor ?? 1, + node: `conformance:${entry.atomId}:${entry.interfaceRevisionId}`, digest: contentDigest(entry) })), + ]; + const oldProviders = baseline ? providers(baseline) : []; + const reviews: EvolutionReport["reviews"] = []; + for (const provider of providers(candidate)) { + const old = oldProviders.filter((entry) => entry.id === provider.id); + if (old.length > 1) { blockers.push(`Ambiguous semantic-major lineage for ${provider.id}`); continue; } + if (!old[0] || old[0].major === provider.major) continue; + if (provider.major < old[0].major) blockers.push(`Semantic major decreases for ${provider.id}`); + for (const consumer of nextRuntimes.values()) { + if (consumer.packageId === provider.id || !consumer.reviewProviders.includes(provider.id)) continue; + const requirement = { consumerId: consumer.groupId, providerId: provider.id, oldMajor: old[0].major, newMajor: provider.major }; + const requirementDigest = contentDigest({ ...requirement, oldProvider: old[0].digest, newProvider: provider.digest, consumer: consumer.digest, checkerVersion }); + const accepted = (options.reviews ?? []).some((entry) => entry.requirementDigest === requirementDigest && + ["changed", "accepted-unchanged"].includes(entry.decision) && entry.rationale.trim() && entry.agentId.trim()); + reviews.push({ ...requirement, requirementDigest, accepted }); + if (!accepted) blockers.push(`Semantic-major review required: ${consumer.groupId} consumes ${provider.id}`); + } + } + return { schemaVersion: 1, baselineDigest: baseline ? contentDigest(baseline) : null, candidateDigest, checkerVersion, + runtimeActions, storageChanges, reviews, packageChecks: runtimeActions.filter((entry) => entry.candidate && entry.action !== "keep") + .map((entry) => ({ groupId: entry.groupId, contractDigest: entry.candidate!.digest })), blockers }; +}; diff --git a/src/capability-model/index.ts b/src/capability-model/index.ts index 85fef54..d1055f3 100644 --- a/src/capability-model/index.ts +++ b/src/capability-model/index.ts @@ -1,2 +1,4 @@ export * from "./types.js"; export * from "./validation.js"; +export * from "./evolution.js"; +export * from "./migrations.js"; diff --git a/src/capability-model/migrations.ts b/src/capability-model/migrations.ts new file mode 100644 index 0000000..7330f90 --- /dev/null +++ b/src/capability-model/migrations.ts @@ -0,0 +1,96 @@ +import { contentDigest } from "./evolution.js"; +import type { PersistentAttachment } from "./types.js"; + +/** Portable storage shape: local owner/slot/projection identities are supplied + * by the consuming workspace's explicit bindings, never baked into this hash. */ +export const migrationPortContract = (attachment: PersistentAttachment): unknown => { + if (attachment.kind === "state") return {kind: "state", valueType: attachment.valueType, storagePolicy: attachment.storagePolicy, + ...(attachment.defaultValue === undefined ? {} : {defaultValue: attachment.defaultValue})}; + const endpoint = (value: typeof attachment.endpoints[number]) => ({constraint: value.constraint, cardinality: value.cardinality, + ordered: value.ordered, onDelete: value.onDelete ?? "restrict", retainOther: value.retainOther ?? false, + ...(value.keyType ? {keyType: value.keyType} : {}), ...(value.publicTraversal ? {publicTraversal: true} : {})}); + return {kind: "edge", first: endpoint(attachment.endpoints[0]), second: endpoint(attachment.endpoints[1])}; +}; + +export type MigrationDeclaration = { + id: string; + scopeId: string; + from: string; + to: string; + implementation: { exportId: string; file: string; digest: string }; + predecessors: string[]; + ports: { name: string; view: "old" | "new"; access: ("read" | "write" | "create" | "edge")[]; contractDigest: string }[]; + preservesOldReaders?: boolean; + preservesOldWriters?: boolean; +}; +export type MigrationCatalog = { + schemaVersion: 1; + contracts: Record; + migrations: MigrationDeclaration[]; +}; +export const validateMigrationCatalog = (value: unknown, exportIds?: ReadonlySet): MigrationCatalog => { + if (!value || typeof value !== "object" || Array.isArray(value)) throw new Error("Migration catalog must be an object"); + const catalog = value as MigrationCatalog; + if (catalog.schemaVersion !== 1 || !catalog.contracts || Array.isArray(catalog.contracts) || !Array.isArray(catalog.migrations)) throw new Error("Unsupported migration catalog"); + for (const [digest, contract] of Object.entries(catalog.contracts)) if (contentDigest(contract) !== digest) throw new Error(`Migration contract digest mismatch: ${digest}`); + const ids = new Set(); + for (const migration of catalog.migrations) { + if (!migration.id || !migration.scopeId || ids.has(migration.id)) throw new Error("Migration IDs must be stable and unique"); + ids.add(migration.id); + if (!catalog.contracts[migration.from] || !catalog.contracts[migration.to] || migration.from === migration.to) throw new Error(`Migration ${migration.id} requires distinct retained source and target contracts`); + if (!migration.implementation?.exportId || !/^sha256:[0-9a-f]{64}$/.test(migration.implementation.digest)) throw new Error(`Migration ${migration.id} requires an exact implementation digest`); + if (!migration.implementation.file || migration.implementation.file.startsWith("/") || migration.implementation.file.split(/[\\/]/).some((part) => !part || part === "." || part === "..")) throw new Error("Migration implementation must be a relative package file"); + if (exportIds && !exportIds.has(migration.implementation.exportId)) throw new Error(`Migration ${migration.id} refers to an undeclared package export`); + if (!Array.isArray(migration.predecessors) || !Array.isArray(migration.ports)) throw new Error(`Migration ${migration.id} requires predecessors and ports`); + if (new Set(migration.predecessors).size !== migration.predecessors.length) throw new Error(`Duplicate predecessor in ${migration.id}`); + for (const promise of [migration.preservesOldReaders, migration.preservesOldWriters]) if (promise !== undefined && typeof promise !== "boolean") throw new Error("Migration compatibility promises must be booleans"); + const ports = new Set(); + for (const port of migration.ports) { + if (!port.name || ports.has(port.name) || !["old", "new"].includes(port.view) || !Array.isArray(port.access) || !port.access.length + || port.access.some((access) => !["read", "write", "create", "edge"].includes(access)) || !catalog.contracts[port.contractDigest]) throw new Error(`Invalid migration port in ${migration.id}`); + if (port.view === "old" && port.access.some((access) => access !== "read")) throw new Error("Old migration views are read-only"); + ports.add(port.name); + } + } + for (const migration of catalog.migrations) for (const predecessor of migration.predecessors) if (!ids.has(predecessor)) throw new Error(`Missing retained predecessor ${predecessor}`); + // Catalogs are retained across releases. Reject impossible histories at + // publication/check time, not only when someone tries to select a path. + const remaining = new Map(catalog.migrations.map((entry) => [entry.id, new Set(entry.predecessors)])); + const ready = [...remaining].filter(([, dependencies]) => dependencies.size === 0).map(([id]) => id); + for (let index = 0; index < ready.length; index++) { + remaining.delete(ready[index]); + for (const [id, dependencies] of remaining) if (dependencies.delete(ready[index]) && dependencies.size === 0) ready.push(id); + } + if (remaining.size) throw new Error(`Cyclic migration predecessors: ${[...remaining.keys()].join(", ")}`); + return catalog; +}; + +export type MigrationSelection = { + scopeId: string; from: string; to: string; path: string[]; + bindings: Record; +}; +/** Explicit paths, not shortest-path guesses. Receipts identify code plus local scope mapping. */ +export const selectMigrationPath = (catalog: MigrationCatalog, selection: MigrationSelection, previousReceipts: ReadonlyMap = new Map()) => { + validateMigrationCatalog(catalog); + let current = selection.from; + const seen = new Set(); + const transitions = []; + for (const id of selection.path) { + const declaration = catalog.migrations.find((entry) => entry.id === id); + if (!declaration || declaration.scopeId !== selection.scopeId || declaration.from !== current || seen.has(id)) throw new Error(`Invalid selected migration transition ${id}`); + for (const predecessor of declaration.predecessors) if (!seen.has(predecessor) && !previousReceipts.has(predecessor)) throw new Error(`Unsatisfied predecessor ${predecessor}`); + const usedBindings: Record = {}; + for (const port of declaration.ports) { + if (!selection.bindings[port.name]) throw new Error(`Missing local migration binding ${port.name}`); + usedBindings[port.name] = selection.bindings[port.name]; + } + const digest = contentDigest({ declaration, bindings: usedBindings }); + const previous = previousReceipts.get(id); + if (previous && previous !== digest) throw new Error(`Migration identity ${id} was previously used with different code or scope`); + transitions.push({ declaration, bindings: usedBindings, digest, alreadyApplied: Boolean(previous) }); + seen.add(id); + current = declaration.to; + } + if (current !== selection.to) throw new Error("Selected migration path does not cover the target storage contract"); + return transitions; +}; diff --git a/src/capability-model/types.ts b/src/capability-model/types.ts index 203b4c5..30642d7 100644 --- a/src/capability-model/types.ts +++ b/src/capability-model/types.ts @@ -7,6 +7,7 @@ type OpaqueId = string & { export type WorkspaceId = OpaqueId<"WorkspaceId">; export type WorkspaceRevisionId = OpaqueId<"WorkspaceRevisionId">; export type AtomId = OpaqueId<"AtomId">; +export type ConformanceId = OpaqueId<"ConformanceId">; export type InterfaceId = OpaqueId<"InterfaceId">; export type InterfaceRevisionId = OpaqueId<"InterfaceRevisionId">; export type MemberId = OpaqueId<"MemberId">; @@ -31,6 +32,7 @@ export const capabilityId = { workspaceRevision: (value: string) => opaque<"WorkspaceRevisionId">(value), atom: (value: string) => opaque<"AtomId">(value), + conformance: (value: string) => opaque<"ConformanceId">(value), interface: (value: string) => opaque<"InterfaceId">(value), interfaceRevision: (value: string) => opaque<"InterfaceRevisionId">(value), @@ -192,11 +194,15 @@ export interface StateSlotDefinition { } export interface EdgeEndpoint { + keyType?: "string" | "boolean" | "int64"; + publicTraversal?: boolean; projectionId: EdgeProjectionId; displayName: string; constraint: EdgeEndpointConstraint; cardinality: EdgeCardinality; ordered: boolean; + onDelete?: "restrict" | "detach" | "cascade-other"; + retainOther?: boolean; } export interface EdgeDefinition { @@ -283,11 +289,14 @@ export type PackageExport = | PackageConstructorExport; export interface PackageRevision { + migrationCatalog?: import("./migrations.js").MigrationCatalog; packageId: PackageId; revisionId: PackageRevisionId; displayName: string; source: SourceRevision; exports: PackageExport[]; + /** Author-declared implementation semantics; omitted legacy values mean 1. */ + semanticMajor?: number; } export type DependencyBinding = @@ -353,6 +362,9 @@ export interface OperationBinding { } export interface Conformance { + /** Absent only for legacy assemblies awaiting explicit ownership enrollment. */ + id?: ConformanceId; + semanticMajor?: number; atomId: AtomId; interfaceRevisionId: InterfaceRevisionId; privateAttachments: PersistentAttachment[]; diff --git a/src/capability-model/validation.ts b/src/capability-model/validation.ts index 4d88f21..ddef9eb 100644 --- a/src/capability-model/validation.ts +++ b/src/capability-model/validation.ts @@ -36,6 +36,8 @@ import type { import { valueType } from "./types.js"; export type CapabilityValidationIssueCode = + | "invalid-semantic-major" + | "duplicate-conformance-id" | "required-value" | "invalid-source" | "invalid-value-type" @@ -562,6 +564,9 @@ const collectIdentityIndexes = ( const packages = new Map(); for (const [packageIndex, revision] of workspace.packageImports.entries()) { const path = `packageImports[${packageIndex}]`; + if (revision.semanticMajor !== undefined && (!Number.isSafeInteger(revision.semanticMajor) || revision.semanticMajor < 1)) { + issue(issues, "invalid-semantic-major", `${path}.semanticMajor`, "Semantic major must be a positive safe integer"); + } requireText(issues, revision.packageId, `${path}.packageId`, "Package ID"); requireText( issues, @@ -616,8 +621,17 @@ const collectIdentityIndexes = ( const conformances = new Map(); const conformancePaths = new Map(); + const conformanceIds = new Set(); for (const [index, conformance] of workspace.conformances.entries()) { const path = `conformances[${index}]`; + if (conformance.semanticMajor !== undefined && (!Number.isSafeInteger(conformance.semanticMajor) || conformance.semanticMajor < 1)) { + issue(issues, "invalid-semantic-major", `${path}.semanticMajor`, "Semantic major must be a positive safe integer"); + } + if (conformance.id !== undefined) { + requireText(issues, conformance.id, `${path}.id`, "Conformance ID"); + if (conformanceIds.has(conformance.id)) issue(issues, "duplicate-conformance-id", `${path}.id`, `Duplicate conformance ID ${conformance.id}`); + conformanceIds.add(conformance.id); + } const key = conformanceKey(conformance.atomId, conformance.interfaceRevisionId); if (conformances.has(key)) { issue( @@ -763,6 +777,10 @@ const validateAttachments = ( ); } validateValueType(issues, attachment.valueType, `${path}.valueType`, indexes); + const containsReference = (type: ValueType): boolean => type.kind === "object-ref" || ((type.kind === "optional" || type.kind === "list") && containsReference(type.value)); + if (containsReference(attachment.valueType) || (attachment.storagePolicy.kind === "crdt-document" && containsReference(attachment.storagePolicy.updateType))) { + issue(issues, "invalid-attachment", `${path}.valueType`, "Managed object references belong in graph relationships, not ordinary state"); + } if (attachment.storagePolicy.kind === "crdt-document") { validateValueType( issues, @@ -794,10 +812,17 @@ const validateAttachments = ( } for (const [endpointIndex, endpoint] of attachment.endpoints.entries()) { const endpointPath = `${path}.endpoints[${endpointIndex}]`; + if (endpoint.keyType !== undefined && (!["string", "boolean", "int64"].includes(endpoint.keyType) || endpoint.ordered || !["many", "many-unique"].includes(endpoint.cardinality))) { + issue(issues, "invalid-attachment", `${endpointPath}.keyType`, "Keyed projections require string/boolean/int64 keys, many cardinality, and no ordering"); + } requireText(issues, endpoint.projectionId, `${endpointPath}.projectionId`, "Projection ID"); + if (endpoint.onDelete !== undefined && !["restrict", "detach", "cascade-other"].includes(endpoint.onDelete)) { + issue(issues, "invalid-attachment", `${endpointPath}.onDelete`, "Deletion policy must be restrict, detach, or cascade-other"); + } requireText(issues, endpoint.displayName, `${endpointPath}.displayName`, "Projection name"); validateConstraint(issues, endpoint.constraint, `${endpointPath}.constraint`, indexes); } + if (attachment.endpoints.every((endpoint) => endpoint.keyType)) issue(issues, "invalid-attachment", `${path}.endpoints`, "A v0 map has one keyed projection and one unkeyed inverse"); if (owner.kind === "conformance") { if ( !attachment.endpoints.some((endpoint) => @@ -989,7 +1014,6 @@ const validateTraversal = ( ); return undefined; } - validateAttachmentAccess(issues, attachment, conformance, `${path}.edgeTypeId`); const projection = edgeProjection(attachment.attachment, traversal.projectionId); if (!projection) { issue( @@ -1000,6 +1024,7 @@ const validateTraversal = ( ); return undefined; } + if (!projection.endpoint.publicTraversal) validateAttachmentAccess(issues, attachment, conformance, `${path}.edgeTypeId`); if (!atomSatisfiesConstraint(atomId, projection.endpoint.constraint, indexes.conformances)) { issue( issues, diff --git a/src/gen/camino/api_pb.ts b/src/gen/camino/api_pb.ts index 8397fae..a8fe5e1 100644 --- a/src/gen/camino/api_pb.ts +++ b/src/gen/camino/api_pb.ts @@ -12,7 +12,7 @@ import type { Message } from "@bufbuild/protobuf"; * Describes the file camino/api.proto. */ export const file_camino_api: GenFile = /*@__PURE__*/ - fileDesc("ChBjYW1pbm8vYXBpLnByb3RvEgZjYW1pbm8iCwoJTnVsbFZhbHVlInwKC09iamVjdFZhbHVlEi8KBmZpZWxkcxgBIAMoCzIfLmNhbWluby5PYmplY3RWYWx1ZS5GaWVsZHNFbnRyeRo8CgtGaWVsZHNFbnRyeRILCgNrZXkYASABKAkSHAoFdmFsdWUYAiABKAsyDS5jYW1pbm8uVmFsdWU6AjgBIioKCUxpc3RWYWx1ZRIdCgZ2YWx1ZXMYASADKAsyDS5jYW1pbm8uVmFsdWUiHQoIUmVmVmFsdWUSEQoJb2JqZWN0X2lkGAEgASgJIjwKCUNyZHRWYWx1ZRIMCgR0eXBlGAEgASgJEhAKCGVuY29kaW5nGAIgASgJEg8KB3BheWxvYWQYAyABKAwiqAEKEFN0YXRlVmFsdWVTb3VyY2USEQoJb2JqZWN0X2lkGAEgASgJEg8KB3Nsb3RfaWQYAiABKAkSFwoPdmFsdWVfdHlwZV9qc29uGAMgASgJEhsKE3N0b3JhZ2VfcG9saWN5X2pzb24YBCABKAkSEAoIcmV2aXNpb24YBSABKAQSKAoNY3JkdF9zbmFwc2hvdBgGIAEoCzIRLmNhbWluby5DcmR0VmFsdWUiNgoLVmFsdWVTb3VyY2USJwoFc3RhdGUYASABKAsyGC5jYW1pbm8uU3RhdGVWYWx1ZVNvdXJjZSL5AgoFVmFsdWUSJwoKbnVsbF92YWx1ZRgBIAEoCzIRLmNhbWluby5OdWxsVmFsdWVIABIUCgpib29sX3ZhbHVlGAIgASgISAASFgoMbnVtYmVyX3ZhbHVlGAMgASgBSAASFgoMc3RyaW5nX3ZhbHVlGAQgASgJSAASFwoNaW50ZWdlcl92YWx1ZRgFIAEoCUgAEhUKC2J5dGVzX3ZhbHVlGAYgASgMSAASKwoMb2JqZWN0X3ZhbHVlGAcgASgLMhMuY2FtaW5vLk9iamVjdFZhbHVlSAASJwoKbGlzdF92YWx1ZRgIIAEoCzIRLmNhbWluby5MaXN0VmFsdWVIABIlCglyZWZfdmFsdWUYCSABKAsyEC5jYW1pbm8uUmVmVmFsdWVIABInCgpjcmR0X3ZhbHVlGAogASgLMhEuY2FtaW5vLkNyZHRWYWx1ZUgAEiMKBnNvdXJjZRgLIAEoCzITLmNhbWluby5WYWx1ZVNvdXJjZUIGCgRraW5kIkYKHUluc3RhbGxQZXJzaXN0ZW5jZVBsYW5SZXF1ZXN0EiUKBHBsYW4YASABKAsyFy5jYW1pbm8uUGVyc2lzdGVuY2VQbGFuIkcKHkluc3RhbGxQZXJzaXN0ZW5jZVBsYW5SZXNwb25zZRIlCgRwbGFuGAEgASgLMhcuY2FtaW5vLlBlcnNpc3RlbmNlUGxhbiIbChlHZXRQZXJzaXN0ZW5jZVBsYW5SZXF1ZXN0IkMKGkdldFBlcnNpc3RlbmNlUGxhblJlc3BvbnNlEiUKBHBsYW4YASABKAsyFy5jYW1pbm8uUGVyc2lzdGVuY2VQbGFuIrABChNDcmVhdGVPYmplY3RSZXF1ZXN0Eg8KB2F0b21faWQYASABKAkSRAoNaW5pdGlhbF9zdGF0ZRgCIAMoCzItLmNhbWluby5DcmVhdGVPYmplY3RSZXF1ZXN0LkluaXRpYWxTdGF0ZUVudHJ5GkIKEUluaXRpYWxTdGF0ZUVudHJ5EgsKA2tleRgBIAEoCRIcCgV2YWx1ZRgCIAEoCzINLmNhbWluby5WYWx1ZToCOAEiPAoUQ3JlYXRlT2JqZWN0UmVzcG9uc2USJAoGb2JqZWN0GAEgASgLMhQuY2FtaW5vLkNhbWlub09iamVjdCIlChBHZXRPYmplY3RSZXF1ZXN0EhEKCW9iamVjdF9pZBgBIAEoCSI5ChFHZXRPYmplY3RSZXNwb25zZRIkCgZvYmplY3QYASABKAsyFC5jYW1pbm8uQ2FtaW5vT2JqZWN0IiUKEkxpc3RPYmplY3RzUmVxdWVzdBIPCgdhdG9tX2lkGAEgASgJIjwKE0xpc3RPYmplY3RzUmVzcG9uc2USJQoHb2JqZWN0cxgBIAMoCzIULmNhbWluby5DYW1pbm9PYmplY3QiNgoQUmVhZFN0YXRlUmVxdWVzdBIRCglvYmplY3RfaWQYASABKAkSDwoHc2xvdF9pZBgCIAEoCSIxChFSZWFkU3RhdGVSZXNwb25zZRIcCgV2YWx1ZRgBIAEoCzINLmNhbWluby5WYWx1ZSJxChFXcml0ZVN0YXRlUmVxdWVzdBIRCglvYmplY3RfaWQYASABKAkSDwoHc2xvdF9pZBgCIAEoCRIcCgV2YWx1ZRgDIAEoCzINLmNhbWluby5WYWx1ZRIaChJjbGllbnRfbXV0YXRpb25faWQYBCABKAkiWAoSV3JpdGVTdGF0ZVJlc3BvbnNlEhwKBXZhbHVlGAEgASgLMg0uY2FtaW5vLlZhbHVlEiQKBm9iamVjdBgCIAEoCzIULmNhbWluby5DYW1pbm9PYmplY3QiwAEKEkNvbm5lY3RFZGdlUmVxdWVzdBIUCgxlZGdlX3R5cGVfaWQYASABKAkSFQoNcHJvamVjdGlvbl9pZBgCIAEoCRIRCglvYmplY3RfaWQYAyABKAkSGAoQdGFyZ2V0X29iamVjdF9pZBgEIAEoCRIUCgdvcmRpbmFsGAUgASgFSACIAQESGwoOdGFyZ2V0X29yZGluYWwYBiABKAVIAYgBAUIKCghfb3JkaW5hbEIRCg9fdGFyZ2V0X29yZGluYWwiNwoTQ29ubmVjdEVkZ2VSZXNwb25zZRIgCgRlZGdlGAEgASgLMhIuY2FtaW5vLkNhbWlub0VkZ2UiVAoSUmVzb2x2ZUVkZ2VSZXF1ZXN0EhEKCW9iamVjdF9pZBgBIAEoCRIUCgxlZGdlX3R5cGVfaWQYAiABKAkSFQoNcHJvamVjdGlvbl9pZBgDIAEoCSI4ChNSZXNvbHZlRWRnZVJlc3BvbnNlEiEKBWVkZ2VzGAEgAygLMhIuY2FtaW5vLkNhbWlub0VkZ2UiKAoVRGlzY29ubmVjdEVkZ2VSZXF1ZXN0Eg8KB2VkZ2VfaWQYASABKAkiKQoWRGlzY29ubmVjdEVkZ2VSZXNwb25zZRIPCgdlZGdlX2lkGAEgASgJIiMKDkxpc3RPcHNSZXF1ZXN0EhEKCW9iamVjdF9pZBgBIAEoCSIwCg9MaXN0T3BzUmVzcG9uc2USHQoDb3BzGAEgAygLMhAuY2FtaW5vLkNhbWlub09wIlYKEldhdGNoT2JqZWN0UmVxdWVzdBIRCglvYmplY3RfaWQYASABKAkSEwoLYWZ0ZXJfb3BfaWQYAiABKAkSGAoQaW5jbHVkZV9zbmFwc2hvdBgDIAEoCCJrChBXYXRjaE9iamVjdEV2ZW50EhEKCW9iamVjdF9pZBgBIAEoCRImCghzbmFwc2hvdBgCIAEoCzIULmNhbWluby5DYW1pbm9PYmplY3QSHAoCb3AYAyABKAsyEC5jYW1pbm8uQ2FtaW5vT3Ai2QIKDENhbWlub09iamVjdBIKCgJpZBgBIAEoCRIPCgdhdG9tX2lkGAIgASgJEh0KFXdvcmtzcGFjZV9yZXZpc2lvbl9pZBgDIAEoCRISCgpjcmVhdGVkX2F0GAQgASgJEhIKCnVwZGF0ZWRfYXQYBSABKAkSLgoFc3RhdGUYBiADKAsyHy5jYW1pbm8uQ2FtaW5vT2JqZWN0LlN0YXRlRW50cnkSQQoPc3RhdGVfcmV2aXNpb25zGAcgAygLMiguY2FtaW5vLkNhbWlub09iamVjdC5TdGF0ZVJldmlzaW9uc0VudHJ5GjsKClN0YXRlRW50cnkSCwoDa2V5GAEgASgJEhwKBXZhbHVlGAIgASgLMg0uY2FtaW5vLlZhbHVlOgI4ARo1ChNTdGF0ZVJldmlzaW9uc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoBDoCOAEijgIKCkNhbWlub0VkZ2USCgoCaWQYASABKAkSFAoMZWRnZV90eXBlX2lkGAIgASgJEhcKD2ZpcnN0X29iamVjdF9pZBgDIAEoCRIYChBzZWNvbmRfb2JqZWN0X2lkGAQgASgJEhsKE2ZpcnN0X3Byb2plY3Rpb25faWQYBSABKAkSHAoUc2Vjb25kX3Byb2plY3Rpb25faWQYBiABKAkSGgoNZmlyc3Rfb3JkaW5hbBgHIAEoBUgAiAEBEhsKDnNlY29uZF9vcmRpbmFsGAggASgFSAGIAQESEgoKY3JlYXRlZF9hdBgJIAEoCUIQCg5fZmlyc3Rfb3JkaW5hbEIRCg9fc2Vjb25kX29yZGluYWwimQEKCENhbWlub09wEgoKAmlkGAEgASgJEhEKCW9iamVjdF9pZBgCIAEoCRIPCgdvcF9raW5kGAMgASgJEh4KB3BheWxvYWQYBCABKAsyDS5jYW1pbm8uVmFsdWUSDQoFYWN0b3IYBSABKAkSEgoKY3JlYXRlZF9hdBgGIAEoCRIaChJjbGllbnRfbXV0YXRpb25faWQYByABKAkylQcKDUNhbWlub1NlcnZpY2USZwoWSW5zdGFsbFBlcnNpc3RlbmNlUGxhbhIlLmNhbWluby5JbnN0YWxsUGVyc2lzdGVuY2VQbGFuUmVxdWVzdBomLmNhbWluby5JbnN0YWxsUGVyc2lzdGVuY2VQbGFuUmVzcG9uc2USWwoSR2V0UGVyc2lzdGVuY2VQbGFuEiEuY2FtaW5vLkdldFBlcnNpc3RlbmNlUGxhblJlcXVlc3QaIi5jYW1pbm8uR2V0UGVyc2lzdGVuY2VQbGFuUmVzcG9uc2USSQoMQ3JlYXRlT2JqZWN0EhsuY2FtaW5vLkNyZWF0ZU9iamVjdFJlcXVlc3QaHC5jYW1pbm8uQ3JlYXRlT2JqZWN0UmVzcG9uc2USQAoJR2V0T2JqZWN0EhguY2FtaW5vLkdldE9iamVjdFJlcXVlc3QaGS5jYW1pbm8uR2V0T2JqZWN0UmVzcG9uc2USRgoLTGlzdE9iamVjdHMSGi5jYW1pbm8uTGlzdE9iamVjdHNSZXF1ZXN0GhsuY2FtaW5vLkxpc3RPYmplY3RzUmVzcG9uc2USQAoJUmVhZFN0YXRlEhguY2FtaW5vLlJlYWRTdGF0ZVJlcXVlc3QaGS5jYW1pbm8uUmVhZFN0YXRlUmVzcG9uc2USQwoKV3JpdGVTdGF0ZRIZLmNhbWluby5Xcml0ZVN0YXRlUmVxdWVzdBoaLmNhbWluby5Xcml0ZVN0YXRlUmVzcG9uc2USRgoLQ29ubmVjdEVkZ2USGi5jYW1pbm8uQ29ubmVjdEVkZ2VSZXF1ZXN0GhsuY2FtaW5vLkNvbm5lY3RFZGdlUmVzcG9uc2USRgoLUmVzb2x2ZUVkZ2USGi5jYW1pbm8uUmVzb2x2ZUVkZ2VSZXF1ZXN0GhsuY2FtaW5vLlJlc29sdmVFZGdlUmVzcG9uc2USTwoORGlzY29ubmVjdEVkZ2USHS5jYW1pbm8uRGlzY29ubmVjdEVkZ2VSZXF1ZXN0Gh4uY2FtaW5vLkRpc2Nvbm5lY3RFZGdlUmVzcG9uc2USOgoHTGlzdE9wcxIWLmNhbWluby5MaXN0T3BzUmVxdWVzdBoXLmNhbWluby5MaXN0T3BzUmVzcG9uc2USRQoLV2F0Y2hPYmplY3QSGi5jYW1pbm8uV2F0Y2hPYmplY3RSZXF1ZXN0GhguY2FtaW5vLldhdGNoT2JqZWN0RXZlbnQwAWIGcHJvdG8z", [file_camino_schema]); + fileDesc("ChBjYW1pbm8vYXBpLnByb3RvEgZjYW1pbm8iCwoJTnVsbFZhbHVlInwKC09iamVjdFZhbHVlEi8KBmZpZWxkcxgBIAMoCzIfLmNhbWluby5PYmplY3RWYWx1ZS5GaWVsZHNFbnRyeRo8CgtGaWVsZHNFbnRyeRILCgNrZXkYASABKAkSHAoFdmFsdWUYAiABKAsyDS5jYW1pbm8uVmFsdWU6AjgBIioKCUxpc3RWYWx1ZRIdCgZ2YWx1ZXMYASADKAsyDS5jYW1pbm8uVmFsdWUiHQoIUmVmVmFsdWUSEQoJb2JqZWN0X2lkGAEgASgJIjwKCUNyZHRWYWx1ZRIMCgR0eXBlGAEgASgJEhAKCGVuY29kaW5nGAIgASgJEg8KB3BheWxvYWQYAyABKAwiqAEKEFN0YXRlVmFsdWVTb3VyY2USEQoJb2JqZWN0X2lkGAEgASgJEg8KB3Nsb3RfaWQYAiABKAkSFwoPdmFsdWVfdHlwZV9qc29uGAMgASgJEhsKE3N0b3JhZ2VfcG9saWN5X2pzb24YBCABKAkSEAoIcmV2aXNpb24YBSABKAQSKAoNY3JkdF9zbmFwc2hvdBgGIAEoCzIRLmNhbWluby5DcmR0VmFsdWUiNgoLVmFsdWVTb3VyY2USJwoFc3RhdGUYASABKAsyGC5jYW1pbm8uU3RhdGVWYWx1ZVNvdXJjZSL5AgoFVmFsdWUSJwoKbnVsbF92YWx1ZRgBIAEoCzIRLmNhbWluby5OdWxsVmFsdWVIABIUCgpib29sX3ZhbHVlGAIgASgISAASFgoMbnVtYmVyX3ZhbHVlGAMgASgBSAASFgoMc3RyaW5nX3ZhbHVlGAQgASgJSAASFwoNaW50ZWdlcl92YWx1ZRgFIAEoCUgAEhUKC2J5dGVzX3ZhbHVlGAYgASgMSAASKwoMb2JqZWN0X3ZhbHVlGAcgASgLMhMuY2FtaW5vLk9iamVjdFZhbHVlSAASJwoKbGlzdF92YWx1ZRgIIAEoCzIRLmNhbWluby5MaXN0VmFsdWVIABIlCglyZWZfdmFsdWUYCSABKAsyEC5jYW1pbm8uUmVmVmFsdWVIABInCgpjcmR0X3ZhbHVlGAogASgLMhEuY2FtaW5vLkNyZHRWYWx1ZUgAEiMKBnNvdXJjZRgLIAEoCzITLmNhbWluby5WYWx1ZVNvdXJjZUIGCgRraW5kIkYKHUluc3RhbGxQZXJzaXN0ZW5jZVBsYW5SZXF1ZXN0EiUKBHBsYW4YASABKAsyFy5jYW1pbm8uUGVyc2lzdGVuY2VQbGFuIkcKHkluc3RhbGxQZXJzaXN0ZW5jZVBsYW5SZXNwb25zZRIlCgRwbGFuGAEgASgLMhcuY2FtaW5vLlBlcnNpc3RlbmNlUGxhbiIbChlHZXRQZXJzaXN0ZW5jZVBsYW5SZXF1ZXN0IkMKGkdldFBlcnNpc3RlbmNlUGxhblJlc3BvbnNlEiUKBHBsYW4YASABKAsyFy5jYW1pbm8uUGVyc2lzdGVuY2VQbGFuIrABChNDcmVhdGVPYmplY3RSZXF1ZXN0Eg8KB2F0b21faWQYASABKAkSRAoNaW5pdGlhbF9zdGF0ZRgCIAMoCzItLmNhbWluby5DcmVhdGVPYmplY3RSZXF1ZXN0LkluaXRpYWxTdGF0ZUVudHJ5GkIKEUluaXRpYWxTdGF0ZUVudHJ5EgsKA2tleRgBIAEoCRIcCgV2YWx1ZRgCIAEoCzINLmNhbWluby5WYWx1ZToCOAEiPAoUQ3JlYXRlT2JqZWN0UmVzcG9uc2USJAoGb2JqZWN0GAEgASgLMhQuY2FtaW5vLkNhbWlub09iamVjdCIlChBHZXRPYmplY3RSZXF1ZXN0EhEKCW9iamVjdF9pZBgBIAEoCSI5ChFHZXRPYmplY3RSZXNwb25zZRIkCgZvYmplY3QYASABKAsyFC5jYW1pbm8uQ2FtaW5vT2JqZWN0IiUKEkxpc3RPYmplY3RzUmVxdWVzdBIPCgdhdG9tX2lkGAEgASgJIjwKE0xpc3RPYmplY3RzUmVzcG9uc2USJQoHb2JqZWN0cxgBIAMoCzIULmNhbWluby5DYW1pbm9PYmplY3QiNgoQUmVhZFN0YXRlUmVxdWVzdBIRCglvYmplY3RfaWQYASABKAkSDwoHc2xvdF9pZBgCIAEoCSIxChFSZWFkU3RhdGVSZXNwb25zZRIcCgV2YWx1ZRgBIAEoCzINLmNhbWluby5WYWx1ZSJxChFXcml0ZVN0YXRlUmVxdWVzdBIRCglvYmplY3RfaWQYASABKAkSDwoHc2xvdF9pZBgCIAEoCRIcCgV2YWx1ZRgDIAEoCzINLmNhbWluby5WYWx1ZRIaChJjbGllbnRfbXV0YXRpb25faWQYBCABKAkiWAoSV3JpdGVTdGF0ZVJlc3BvbnNlEhwKBXZhbHVlGAEgASgLMg0uY2FtaW5vLlZhbHVlEiQKBm9iamVjdBgCIAEoCzIULmNhbWluby5DYW1pbm9PYmplY3QiwAEKEkNvbm5lY3RFZGdlUmVxdWVzdBIUCgxlZGdlX3R5cGVfaWQYASABKAkSFQoNcHJvamVjdGlvbl9pZBgCIAEoCRIRCglvYmplY3RfaWQYAyABKAkSGAoQdGFyZ2V0X29iamVjdF9pZBgEIAEoCRIUCgdvcmRpbmFsGAUgASgFSACIAQESGwoOdGFyZ2V0X29yZGluYWwYBiABKAVIAYgBAUIKCghfb3JkaW5hbEIRCg9fdGFyZ2V0X29yZGluYWwiNwoTQ29ubmVjdEVkZ2VSZXNwb25zZRIgCgRlZGdlGAEgASgLMhIuY2FtaW5vLkNhbWlub0VkZ2UiVAoSUmVzb2x2ZUVkZ2VSZXF1ZXN0EhEKCW9iamVjdF9pZBgBIAEoCRIUCgxlZGdlX3R5cGVfaWQYAiABKAkSFQoNcHJvamVjdGlvbl9pZBgDIAEoCSI4ChNSZXNvbHZlRWRnZVJlc3BvbnNlEiEKBWVkZ2VzGAEgAygLMhIuY2FtaW5vLkNhbWlub0VkZ2UiKAoVRGlzY29ubmVjdEVkZ2VSZXF1ZXN0Eg8KB2VkZ2VfaWQYASABKAkiKQoWRGlzY29ubmVjdEVkZ2VSZXNwb25zZRIPCgdlZGdlX2lkGAEgASgJIlgKD0NvbGxlY3Rpb25FbnRyeRIPCgdlZGdlX2lkGAEgASgJEhgKEHRhcmdldF9vYmplY3RfaWQYAiABKAkSGgoDa2V5GAMgASgLMg0uY2FtaW5vLlZhbHVlIlQKFlJlYWRDb2xsZWN0aW9uUmVzcG9uc2USEAoIcmV2aXNpb24YASABKAQSKAoHZW50cmllcxgCIAMoCzIXLmNhbWluby5Db2xsZWN0aW9uRW50cnkinwEKGFJlcGxhY2VDb2xsZWN0aW9uUmVxdWVzdBIRCglvYmplY3RfaWQYASABKAkSFAoMZWRnZV90eXBlX2lkGAIgASgJEhUKDXByb2plY3Rpb25faWQYAyABKAkSGQoRZXhwZWN0ZWRfcmV2aXNpb24YBCABKAQSKAoHZW50cmllcxgFIAMoCzIXLmNhbWluby5Db2xsZWN0aW9uRW50cnkiIwoOTGlzdE9wc1JlcXVlc3QSEQoJb2JqZWN0X2lkGAEgASgJIjAKD0xpc3RPcHNSZXNwb25zZRIdCgNvcHMYASADKAsyEC5jYW1pbm8uQ2FtaW5vT3AibgoSV2F0Y2hPYmplY3RSZXF1ZXN0EhEKCW9iamVjdF9pZBgBIAEoCRITCgthZnRlcl9vcF9pZBgCIAEoCRIYChBpbmNsdWRlX3NuYXBzaG90GAMgASgIEhYKDmF0dGFjaG1lbnRfaWRzGAQgAygJImsKEFdhdGNoT2JqZWN0RXZlbnQSEQoJb2JqZWN0X2lkGAEgASgJEiYKCHNuYXBzaG90GAIgASgLMhQuY2FtaW5vLkNhbWlub09iamVjdBIcCgJvcBgDIAEoCzIQLmNhbWluby5DYW1pbm9PcCLZAgoMQ2FtaW5vT2JqZWN0EgoKAmlkGAEgASgJEg8KB2F0b21faWQYAiABKAkSHQoVd29ya3NwYWNlX3JldmlzaW9uX2lkGAMgASgJEhIKCmNyZWF0ZWRfYXQYBCABKAkSEgoKdXBkYXRlZF9hdBgFIAEoCRIuCgVzdGF0ZRgGIAMoCzIfLmNhbWluby5DYW1pbm9PYmplY3QuU3RhdGVFbnRyeRJBCg9zdGF0ZV9yZXZpc2lvbnMYByADKAsyKC5jYW1pbm8uQ2FtaW5vT2JqZWN0LlN0YXRlUmV2aXNpb25zRW50cnkaOwoKU3RhdGVFbnRyeRILCgNrZXkYASABKAkSHAoFdmFsdWUYAiABKAsyDS5jYW1pbm8uVmFsdWU6AjgBGjUKE1N0YXRlUmV2aXNpb25zRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgEOgI4ASK/AgoKQ2FtaW5vRWRnZRIKCgJpZBgBIAEoCRIUCgxlZGdlX3R5cGVfaWQYAiABKAkSFwoPZmlyc3Rfb2JqZWN0X2lkGAMgASgJEhgKEHNlY29uZF9vYmplY3RfaWQYBCABKAkSGwoTZmlyc3RfcHJvamVjdGlvbl9pZBgFIAEoCRIcChRzZWNvbmRfcHJvamVjdGlvbl9pZBgGIAEoCRIaCg1maXJzdF9vcmRpbmFsGAcgASgFSACIAQESGwoOc2Vjb25kX29yZGluYWwYCCABKAVIAYgBARISCgpjcmVhdGVkX2F0GAkgASgJEhYKDmZpcnN0X2tleV9qc29uGAogASgJEhcKD3NlY29uZF9rZXlfanNvbhgLIAEoCUIQCg5fZmlyc3Rfb3JkaW5hbEIRCg9fc2Vjb25kX29yZGluYWwimQEKCENhbWlub09wEgoKAmlkGAEgASgJEhEKCW9iamVjdF9pZBgCIAEoCRIPCgdvcF9raW5kGAMgASgJEh4KB3BheWxvYWQYBCABKAsyDS5jYW1pbm8uVmFsdWUSDQoFYWN0b3IYBSABKAkSEgoKY3JlYXRlZF9hdBgGIAEoCRIaChJjbGllbnRfbXV0YXRpb25faWQYByABKAkyuggKDUNhbWlub1NlcnZpY2USZwoWSW5zdGFsbFBlcnNpc3RlbmNlUGxhbhIlLmNhbWluby5JbnN0YWxsUGVyc2lzdGVuY2VQbGFuUmVxdWVzdBomLmNhbWluby5JbnN0YWxsUGVyc2lzdGVuY2VQbGFuUmVzcG9uc2USWwoSR2V0UGVyc2lzdGVuY2VQbGFuEiEuY2FtaW5vLkdldFBlcnNpc3RlbmNlUGxhblJlcXVlc3QaIi5jYW1pbm8uR2V0UGVyc2lzdGVuY2VQbGFuUmVzcG9uc2USSQoMQ3JlYXRlT2JqZWN0EhsuY2FtaW5vLkNyZWF0ZU9iamVjdFJlcXVlc3QaHC5jYW1pbm8uQ3JlYXRlT2JqZWN0UmVzcG9uc2USQAoJR2V0T2JqZWN0EhguY2FtaW5vLkdldE9iamVjdFJlcXVlc3QaGS5jYW1pbm8uR2V0T2JqZWN0UmVzcG9uc2USRgoLTGlzdE9iamVjdHMSGi5jYW1pbm8uTGlzdE9iamVjdHNSZXF1ZXN0GhsuY2FtaW5vLkxpc3RPYmplY3RzUmVzcG9uc2USQAoJUmVhZFN0YXRlEhguY2FtaW5vLlJlYWRTdGF0ZVJlcXVlc3QaGS5jYW1pbm8uUmVhZFN0YXRlUmVzcG9uc2USQwoKV3JpdGVTdGF0ZRIZLmNhbWluby5Xcml0ZVN0YXRlUmVxdWVzdBoaLmNhbWluby5Xcml0ZVN0YXRlUmVzcG9uc2USRgoLQ29ubmVjdEVkZ2USGi5jYW1pbm8uQ29ubmVjdEVkZ2VSZXF1ZXN0GhsuY2FtaW5vLkNvbm5lY3RFZGdlUmVzcG9uc2USRgoLUmVzb2x2ZUVkZ2USGi5jYW1pbm8uUmVzb2x2ZUVkZ2VSZXF1ZXN0GhsuY2FtaW5vLlJlc29sdmVFZGdlUmVzcG9uc2USTwoORGlzY29ubmVjdEVkZ2USHS5jYW1pbm8uRGlzY29ubmVjdEVkZ2VSZXF1ZXN0Gh4uY2FtaW5vLkRpc2Nvbm5lY3RFZGdlUmVzcG9uc2USTAoOUmVhZENvbGxlY3Rpb24SGi5jYW1pbm8uUmVzb2x2ZUVkZ2VSZXF1ZXN0Gh4uY2FtaW5vLlJlYWRDb2xsZWN0aW9uUmVzcG9uc2USVQoRUmVwbGFjZUNvbGxlY3Rpb24SIC5jYW1pbm8uUmVwbGFjZUNvbGxlY3Rpb25SZXF1ZXN0Gh4uY2FtaW5vLlJlYWRDb2xsZWN0aW9uUmVzcG9uc2USOgoHTGlzdE9wcxIWLmNhbWluby5MaXN0T3BzUmVxdWVzdBoXLmNhbWluby5MaXN0T3BzUmVzcG9uc2USRQoLV2F0Y2hPYmplY3QSGi5jYW1pbm8uV2F0Y2hPYmplY3RSZXF1ZXN0GhguY2FtaW5vLldhdGNoT2JqZWN0RXZlbnQwAWIGcHJvdG8z", [file_camino_schema]); /** * @generated from message camino.NullValue @@ -651,6 +651,94 @@ export type DisconnectEdgeResponse = Message<"camino.DisconnectEdgeResponse"> & export const DisconnectEdgeResponseSchema: GenMessage = /*@__PURE__*/ messageDesc(file_camino_api, 27); +/** + * @generated from message camino.CollectionEntry + */ +export type CollectionEntry = Message<"camino.CollectionEntry"> & { + /** + * Existing entry identity to preserve; empty allocates a new canonical edge. + * + * @generated from field: string edge_id = 1; + */ + edgeId: string; + + /** + * @generated from field: string target_object_id = 2; + */ + targetObjectId: string; + + /** + * @generated from field: camino.Value key = 3; + */ + key?: Value | undefined; +}; + +/** + * Describes the message camino.CollectionEntry. + * Use `create(CollectionEntrySchema)` to create a new message. + */ +export const CollectionEntrySchema: GenMessage = /*@__PURE__*/ + messageDesc(file_camino_api, 28); + +/** + * @generated from message camino.ReadCollectionResponse + */ +export type ReadCollectionResponse = Message<"camino.ReadCollectionResponse"> & { + /** + * @generated from field: uint64 revision = 1; + */ + revision: bigint; + + /** + * @generated from field: repeated camino.CollectionEntry entries = 2; + */ + entries: CollectionEntry[]; +}; + +/** + * Describes the message camino.ReadCollectionResponse. + * Use `create(ReadCollectionResponseSchema)` to create a new message. + */ +export const ReadCollectionResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_camino_api, 29); + +/** + * @generated from message camino.ReplaceCollectionRequest + */ +export type ReplaceCollectionRequest = Message<"camino.ReplaceCollectionRequest"> & { + /** + * @generated from field: string object_id = 1; + */ + objectId: string; + + /** + * @generated from field: string edge_type_id = 2; + */ + edgeTypeId: string; + + /** + * @generated from field: string projection_id = 3; + */ + projectionId: string; + + /** + * @generated from field: uint64 expected_revision = 4; + */ + expectedRevision: bigint; + + /** + * @generated from field: repeated camino.CollectionEntry entries = 5; + */ + entries: CollectionEntry[]; +}; + +/** + * Describes the message camino.ReplaceCollectionRequest. + * Use `create(ReplaceCollectionRequestSchema)` to create a new message. + */ +export const ReplaceCollectionRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_camino_api, 30); + /** * @generated from message camino.ListOpsRequest */ @@ -666,7 +754,7 @@ export type ListOpsRequest = Message<"camino.ListOpsRequest"> & { * Use `create(ListOpsRequestSchema)` to create a new message. */ export const ListOpsRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_camino_api, 28); + messageDesc(file_camino_api, 31); /** * @generated from message camino.ListOpsResponse @@ -683,7 +771,7 @@ export type ListOpsResponse = Message<"camino.ListOpsResponse"> & { * Use `create(ListOpsResponseSchema)` to create a new message. */ export const ListOpsResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_camino_api, 29); + messageDesc(file_camino_api, 32); /** * @generated from message camino.WatchObjectRequest @@ -703,6 +791,13 @@ export type WatchObjectRequest = Message<"camino.WatchObjectRequest"> & { * @generated from field: bool include_snapshot = 3; */ includeSnapshot: boolean; + + /** + * Managed runtimes must watch only their injected attachments. + * + * @generated from field: repeated string attachment_ids = 4; + */ + attachmentIds: string[]; }; /** @@ -710,7 +805,7 @@ export type WatchObjectRequest = Message<"camino.WatchObjectRequest"> & { * Use `create(WatchObjectRequestSchema)` to create a new message. */ export const WatchObjectRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_camino_api, 30); + messageDesc(file_camino_api, 33); /** * @generated from message camino.WatchObjectEvent @@ -737,7 +832,7 @@ export type WatchObjectEvent = Message<"camino.WatchObjectEvent"> & { * Use `create(WatchObjectEventSchema)` to create a new message. */ export const WatchObjectEventSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_camino_api, 31); + messageDesc(file_camino_api, 34); /** * @generated from message camino.CaminoObject @@ -784,7 +879,7 @@ export type CaminoObject = Message<"camino.CaminoObject"> & { * Use `create(CaminoObjectSchema)` to create a new message. */ export const CaminoObjectSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_camino_api, 32); + messageDesc(file_camino_api, 35); /** * @generated from message camino.CaminoEdge @@ -834,6 +929,16 @@ export type CaminoEdge = Message<"camino.CaminoEdge"> & { * @generated from field: string created_at = 9; */ createdAt: string; + + /** + * @generated from field: string first_key_json = 10; + */ + firstKeyJson: string; + + /** + * @generated from field: string second_key_json = 11; + */ + secondKeyJson: string; }; /** @@ -841,7 +946,7 @@ export type CaminoEdge = Message<"camino.CaminoEdge"> & { * Use `create(CaminoEdgeSchema)` to create a new message. */ export const CaminoEdgeSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_camino_api, 33); + messageDesc(file_camino_api, 36); /** * @generated from message camino.CaminoOp @@ -888,7 +993,7 @@ export type CaminoOp = Message<"camino.CaminoOp"> & { * Use `create(CaminoOpSchema)` to create a new message. */ export const CaminoOpSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_camino_api, 34); + messageDesc(file_camino_api, 37); /** * @generated from service camino.CaminoService @@ -974,6 +1079,22 @@ export const CaminoService: GenService<{ input: typeof DisconnectEdgeRequestSchema; output: typeof DisconnectEdgeResponseSchema; }, + /** + * @generated from rpc camino.CaminoService.ReadCollection + */ + readCollection: { + methodKind: "unary"; + input: typeof ResolveEdgeRequestSchema; + output: typeof ReadCollectionResponseSchema; + }, + /** + * @generated from rpc camino.CaminoService.ReplaceCollection + */ + replaceCollection: { + methodKind: "unary"; + input: typeof ReplaceCollectionRequestSchema; + output: typeof ReadCollectionResponseSchema; + }, /** * @generated from rpc camino.CaminoService.ListOps */ diff --git a/src/gen/camino/schema_pb.ts b/src/gen/camino/schema_pb.ts index 20466d3..3cbbaef 100644 --- a/src/gen/camino/schema_pb.ts +++ b/src/gen/camino/schema_pb.ts @@ -10,7 +10,7 @@ import type { Message } from "@bufbuild/protobuf"; * Describes the file camino/schema.proto. */ export const file_camino_schema: GenFile = /*@__PURE__*/ - fileDesc("ChNjYW1pbm8vc2NoZW1hLnByb3RvEgZjYW1pbm8iNwoOQXRvbURlZmluaXRpb24SDwoHYXRvbV9pZBgBIAEoCRIUCgxkaXNwbGF5X25hbWUYAiABKAkiQQoPQXRvbUNvbmZvcm1hbmNlEg8KB2F0b21faWQYASABKAkSHQoVaW50ZXJmYWNlX3JldmlzaW9uX2lkGAIgASgJIqQBCg9TdGF0ZUF0dGFjaG1lbnQSDwoHc2xvdF9pZBgBIAEoCRIYChBhdHRhY2hlZF9hdG9tX2lkGAIgASgJEhQKDGRpc3BsYXlfbmFtZRgDIAEoCRIXCg92YWx1ZV90eXBlX2pzb24YBCABKAkSGwoTc3RvcmFnZV9wb2xpY3lfanNvbhgFIAEoCRIaChJkZWZhdWx0X3ZhbHVlX2pzb24YBiABKAkiUAoSRW5kcG9pbnRDb25zdHJhaW50EhEKB2F0b21faWQYASABKAlIABIfChVpbnRlcmZhY2VfcmV2aXNpb25faWQYAiABKAlIAEIGCgRraW5kIqYBCgxFZGdlRW5kcG9pbnQSFQoNcHJvamVjdGlvbl9pZBgBIAEoCRIUCgxkaXNwbGF5X25hbWUYAiABKAkSLgoKY29uc3RyYWludBgDIAEoCzIaLmNhbWluby5FbmRwb2ludENvbnN0cmFpbnQSKAoLY2FyZGluYWxpdHkYBCABKA4yEy5jYW1pbm8uQ2FyZGluYWxpdHkSDwoHb3JkZXJlZBgFIAEoCCKHAQoORWRnZUF0dGFjaG1lbnQSFAoMZWRnZV90eXBlX2lkGAEgASgJEhQKDGRpc3BsYXlfbmFtZRgCIAEoCRIjCgVmaXJzdBgDIAEoCzIULmNhbWluby5FZGdlRW5kcG9pbnQSJAoGc2Vjb25kGAQgASgLMhQuY2FtaW5vLkVkZ2VFbmRwb2ludCLsAQoPUGVyc2lzdGVuY2VQbGFuEhQKDHdvcmtzcGFjZV9pZBgBIAEoCRIdChV3b3Jrc3BhY2VfcmV2aXNpb25faWQYAiABKAkSJQoFYXRvbXMYAyADKAsyFi5jYW1pbm8uQXRvbURlZmluaXRpb24SLQoMY29uZm9ybWFuY2VzGAQgAygLMhcuY2FtaW5vLkF0b21Db25mb3JtYW5jZRInCgZzdGF0ZXMYBSADKAsyFy5jYW1pbm8uU3RhdGVBdHRhY2htZW50EiUKBWVkZ2VzGAYgAygLMhYuY2FtaW5vLkVkZ2VBdHRhY2htZW50KmgKC0NhcmRpbmFsaXR5EhsKF0NBUkRJTkFMSVRZX1VOU1BFQ0lGSUVEEAASEAoMT1BUSU9OQUxfT05FEAESDwoLRVhBQ1RMWV9PTkUQAhIICgRNQU5ZEAMSDwoLTUFOWV9VTklRVUUQBGIGcHJvdG8z"); + fileDesc("ChNjYW1pbm8vc2NoZW1hLnByb3RvEgZjYW1pbm8iNwoOQXRvbURlZmluaXRpb24SDwoHYXRvbV9pZBgBIAEoCRIUCgxkaXNwbGF5X25hbWUYAiABKAkiWQoPQXRvbUNvbmZvcm1hbmNlEg8KB2F0b21faWQYASABKAkSHQoVaW50ZXJmYWNlX3JldmlzaW9uX2lkGAIgASgJEhYKDmNvbmZvcm1hbmNlX2lkGAMgASgJIsIBCg9TdGF0ZUF0dGFjaG1lbnQSDwoHc2xvdF9pZBgBIAEoCRIYChBhdHRhY2hlZF9hdG9tX2lkGAIgASgJEhQKDGRpc3BsYXlfbmFtZRgDIAEoCRIXCg92YWx1ZV90eXBlX2pzb24YBCABKAkSGwoTc3RvcmFnZV9wb2xpY3lfanNvbhgFIAEoCRIaChJkZWZhdWx0X3ZhbHVlX2pzb24YBiABKAkSHAoUb3duZXJfY29uZm9ybWFuY2VfaWQYByABKAkiUAoSRW5kcG9pbnRDb25zdHJhaW50EhEKB2F0b21faWQYASABKAlIABIfChVpbnRlcmZhY2VfcmV2aXNpb25faWQYAiABKAlIAEIGCgRraW5kIvsBCgxFZGdlRW5kcG9pbnQSFQoNcHJvamVjdGlvbl9pZBgBIAEoCRIUCgxkaXNwbGF5X25hbWUYAiABKAkSLgoKY29uc3RyYWludBgDIAEoCzIaLmNhbWluby5FbmRwb2ludENvbnN0cmFpbnQSKAoLY2FyZGluYWxpdHkYBCABKA4yEy5jYW1pbm8uQ2FyZGluYWxpdHkSDwoHb3JkZXJlZBgFIAEoCBIRCglvbl9kZWxldGUYBiABKAkSFAoMcmV0YWluX290aGVyGAcgASgIEhAKCGtleV90eXBlGAggASgJEhgKEHB1YmxpY190cmF2ZXJzYWwYCSABKAgipQEKDkVkZ2VBdHRhY2htZW50EhQKDGVkZ2VfdHlwZV9pZBgBIAEoCRIUCgxkaXNwbGF5X25hbWUYAiABKAkSIwoFZmlyc3QYAyABKAsyFC5jYW1pbm8uRWRnZUVuZHBvaW50EiQKBnNlY29uZBgEIAEoCzIULmNhbWluby5FZGdlRW5kcG9pbnQSHAoUb3duZXJfY29uZm9ybWFuY2VfaWQYBSABKAki7AEKD1BlcnNpc3RlbmNlUGxhbhIUCgx3b3Jrc3BhY2VfaWQYASABKAkSHQoVd29ya3NwYWNlX3JldmlzaW9uX2lkGAIgASgJEiUKBWF0b21zGAMgAygLMhYuY2FtaW5vLkF0b21EZWZpbml0aW9uEi0KDGNvbmZvcm1hbmNlcxgEIAMoCzIXLmNhbWluby5BdG9tQ29uZm9ybWFuY2USJwoGc3RhdGVzGAUgAygLMhcuY2FtaW5vLlN0YXRlQXR0YWNobWVudBIlCgVlZGdlcxgGIAMoCzIWLmNhbWluby5FZGdlQXR0YWNobWVudCpoCgtDYXJkaW5hbGl0eRIbChdDQVJESU5BTElUWV9VTlNQRUNJRklFRBAAEhAKDE9QVElPTkFMX09ORRABEg8KC0VYQUNUTFlfT05FEAISCAoETUFOWRADEg8KC01BTllfVU5JUVVFEARiBnByb3RvMw"); /** * @generated from message camino.AtomDefinition @@ -47,6 +47,11 @@ export type AtomConformance = Message<"camino.AtomConformance"> & { * @generated from field: string interface_revision_id = 2; */ interfaceRevisionId: string; + + /** + * @generated from field: string conformance_id = 3; + */ + conformanceId: string; }; /** @@ -89,6 +94,11 @@ export type StateAttachment = Message<"camino.StateAttachment"> & { * @generated from field: string default_value_json = 6; */ defaultValueJson: string; + + /** + * @generated from field: string owner_conformance_id = 7; + */ + ownerConformanceId: string; }; /** @@ -155,6 +165,32 @@ export type EdgeEndpoint = Message<"camino.EdgeEndpoint"> & { * @generated from field: bool ordered = 5; */ ordered: boolean; + + /** + * Empty means restrict. Direction is the endpoint being deleted. + * + * @generated from field: string on_delete = 6; + */ + onDelete: string; + + /** + * @generated from field: bool retain_other = 7; + */ + retainOther: boolean; + + /** + * Empty for sets/lists, otherwise string, boolean, or int64 map keys. + * + * @generated from field: string key_type = 8; + */ + keyType: string; + + /** + * Explicit read-only dependency injection traversal, not mutation authority. + * + * @generated from field: bool public_traversal = 9; + */ + publicTraversal: boolean; }; /** @@ -187,6 +223,11 @@ export type EdgeAttachment = Message<"camino.EdgeAttachment"> & { * @generated from field: camino.EdgeEndpoint second = 4; */ second?: EdgeEndpoint | undefined; + + /** + * @generated from field: string owner_conformance_id = 5; + */ + ownerConformanceId: string; }; /** diff --git a/src/gen/quixos/runtime_pb.ts b/src/gen/quixos/runtime_pb.ts index b274479..6d3b546 100644 --- a/src/gen/quixos/runtime_pb.ts +++ b/src/gen/quixos/runtime_pb.ts @@ -14,7 +14,7 @@ import type { Message } from "@bufbuild/protobuf"; * Describes the file quixos/runtime.proto. */ export const file_quixos_runtime: GenFile = /*@__PURE__*/ - fileDesc("ChRxdWl4b3MvcnVudGltZS5wcm90bxIOcXVpeG9zLnJ1bnRpbWUiMQoQSGFuZHNoYWtlUmVxdWVzdBIdChVvcmNoX3Byb3RvY29sX3ZlcnNpb24YASABKAkiZgoRSGFuZHNoYWtlUmVzcG9uc2USGwoTcGFja2FnZV9yZXZpc2lvbl9pZBgBIAEoCRIgChhydW50aW1lX3Byb3RvY29sX3ZlcnNpb24YAiABKAkSEgoKZXhwb3J0X2lkcxgDIAMoCSKLAgoNSW52b2tlUmVxdWVzdBIVCg1pbnZvY2F0aW9uX2lkGAEgASgJEigKBmV4cG9ydBgCIAEoCzIYLnF1aXhvcy5QYWNrYWdlRXhwb3J0UmVmEhEKCW9iamVjdF9pZBgDIAEoCRI3CgVpbnB1dBgEIAMoCzIoLnF1aXhvcy5ydW50aW1lLkludm9rZVJlcXVlc3QuSW5wdXRFbnRyeRIwCgxkZXBlbmRlbmNpZXMYBSADKAsyGi5xdWl4b3MuSW5qZWN0ZWREZXBlbmRlbmN5GjsKCklucHV0RW50cnkSCwoDa2V5GAEgASgJEhwKBXZhbHVlGAIgASgLMg0uY2FtaW5vLlZhbHVlOgI4ASKDAQoOSW52b2tlUmVzcG9uc2USCgoCb2sYASABKAgSHQoGcmVzdWx0GAIgASgLMg0uY2FtaW5vLlZhbHVlEg0KBWVycm9yGAMgASgJEjcKDGRlcGVuZGVuY2llcxgEIAMoCzIhLnF1aXhvcy5ydW50aW1lLkRlcml2ZWREZXBlbmRlbmN5IokCCgxXYXRjaFJlcXVlc3QSFQoNaW52b2NhdGlvbl9pZBgBIAEoCRIoCgZleHBvcnQYAiABKAsyGC5xdWl4b3MuUGFja2FnZUV4cG9ydFJlZhIRCglvYmplY3RfaWQYAyABKAkSNgoFaW5wdXQYBCADKAsyJy5xdWl4b3MucnVudGltZS5XYXRjaFJlcXVlc3QuSW5wdXRFbnRyeRIwCgxkZXBlbmRlbmNpZXMYBSADKAsyGi5xdWl4b3MuSW5qZWN0ZWREZXBlbmRlbmN5GjsKCklucHV0RW50cnkSCwoDa2V5GAEgASgJEhwKBXZhbHVlGAIgASgLMg0uY2FtaW5vLlZhbHVlOgI4ASJiChFEZXJpdmVkRGVwZW5kZW5jeRIMCgRraW5kGAEgASgJEhEKCW9iamVjdF9pZBgCIAEoCRIVCg1hdHRhY2htZW50X2lkGAMgASgJEhUKDXByb2plY3Rpb25faWQYBCABKAkilQEKCldhdGNoRXZlbnQSEAoId2F0Y2hfaWQYASABKAkSHAoFdmFsdWUYAiABKAsyDS5jYW1pbm8uVmFsdWUSNwoMZGVwZW5kZW5jaWVzGAMgAygLMiEucXVpeG9zLnJ1bnRpbWUuRGVyaXZlZERlcGVuZGVuY3kSDQoFZXJyb3IYBCABKAkSDwoHaW5pdGlhbBgFIAEoCDLwAQoOUGFja2FnZVJ1bnRpbWUSUAoJSGFuZHNoYWtlEiAucXVpeG9zLnJ1bnRpbWUuSGFuZHNoYWtlUmVxdWVzdBohLnF1aXhvcy5ydW50aW1lLkhhbmRzaGFrZVJlc3BvbnNlEkcKBkludm9rZRIdLnF1aXhvcy5ydW50aW1lLkludm9rZVJlcXVlc3QaHi5xdWl4b3MucnVudGltZS5JbnZva2VSZXNwb25zZRJDCgVXYXRjaBIcLnF1aXhvcy5ydW50aW1lLldhdGNoUmVxdWVzdBoaLnF1aXhvcy5ydW50aW1lLldhdGNoRXZlbnQwAWIGcHJvdG8z", [file_camino_api, file_quixos_refs]); + fileDesc("ChRxdWl4b3MvcnVudGltZS5wcm90bxIOcXVpeG9zLnJ1bnRpbWUiQAoQSGFuZHNoYWtlUmVxdWVzdBIdChVvcmNoX3Byb3RvY29sX3ZlcnNpb24YASABKAkSDQoFbm9uY2UYAiABKAkirwEKEUhhbmRzaGFrZVJlc3BvbnNlEhsKE3BhY2thZ2VfcmV2aXNpb25faWQYASABKAkSIAoYcnVudGltZV9wcm90b2NvbF92ZXJzaW9uGAIgASgJEhIKCmV4cG9ydF9pZHMYAyADKAkSEwoLaW5zdGFuY2VfaWQYBCABKAkSHAoUYXV0aGVudGljYXRpb25fcHJvb2YYBSABKAkSFAoMY2FwYWJpbGl0aWVzGAYgAygJIpoBChFJbnZvY2F0aW9uQ29udGV4dBIXCg93b3Jrc3BhY2VfZXBvY2gYASABKAkSEwoLaW5zdGFuY2VfaWQYAiABKAkSFgoOYmluZGluZ19kaWdlc3QYAyABKAkSDQoFZ3JhbnQYBCABKAkSEgoKc2Vzc2lvbl9pZBgFIAEoCRIcChRvd25lcl9jb25mb3JtYW5jZV9pZBgGIAEoCSIxChhJbnZvY2F0aW9uQ29udHJvbFJlcXVlc3QSFQoNaW52b2NhdGlvbl9pZBgBIAEoCSI4ChBJbnZvY2F0aW9uU3RhdHVzEhUKDWludm9jYXRpb25faWQYASABKAkSDQoFc3RhdGUYAiABKAkivwIKDUludm9rZVJlcXVlc3QSFQoNaW52b2NhdGlvbl9pZBgBIAEoCRIoCgZleHBvcnQYAiABKAsyGC5xdWl4b3MuUGFja2FnZUV4cG9ydFJlZhIRCglvYmplY3RfaWQYAyABKAkSNwoFaW5wdXQYBCADKAsyKC5xdWl4b3MucnVudGltZS5JbnZva2VSZXF1ZXN0LklucHV0RW50cnkSMAoMZGVwZW5kZW5jaWVzGAUgAygLMhoucXVpeG9zLkluamVjdGVkRGVwZW5kZW5jeRIyCgdjb250ZXh0GAYgASgLMiEucXVpeG9zLnJ1bnRpbWUuSW52b2NhdGlvbkNvbnRleHQaOwoKSW5wdXRFbnRyeRILCgNrZXkYASABKAkSHAoFdmFsdWUYAiABKAsyDS5jYW1pbm8uVmFsdWU6AjgBIoMBCg5JbnZva2VSZXNwb25zZRIKCgJvaxgBIAEoCBIdCgZyZXN1bHQYAiABKAsyDS5jYW1pbm8uVmFsdWUSDQoFZXJyb3IYAyABKAkSNwoMZGVwZW5kZW5jaWVzGAQgAygLMiEucXVpeG9zLnJ1bnRpbWUuRGVyaXZlZERlcGVuZGVuY3kivQIKDFdhdGNoUmVxdWVzdBIVCg1pbnZvY2F0aW9uX2lkGAEgASgJEigKBmV4cG9ydBgCIAEoCzIYLnF1aXhvcy5QYWNrYWdlRXhwb3J0UmVmEhEKCW9iamVjdF9pZBgDIAEoCRI2CgVpbnB1dBgEIAMoCzInLnF1aXhvcy5ydW50aW1lLldhdGNoUmVxdWVzdC5JbnB1dEVudHJ5EjAKDGRlcGVuZGVuY2llcxgFIAMoCzIaLnF1aXhvcy5JbmplY3RlZERlcGVuZGVuY3kSMgoHY29udGV4dBgGIAEoCzIhLnF1aXhvcy5ydW50aW1lLkludm9jYXRpb25Db250ZXh0GjsKCklucHV0RW50cnkSCwoDa2V5GAEgASgJEhwKBXZhbHVlGAIgASgLMg0uY2FtaW5vLlZhbHVlOgI4ASJiChFEZXJpdmVkRGVwZW5kZW5jeRIMCgRraW5kGAEgASgJEhEKCW9iamVjdF9pZBgCIAEoCRIVCg1hdHRhY2htZW50X2lkGAMgASgJEhUKDXByb2plY3Rpb25faWQYBCABKAkilQEKCldhdGNoRXZlbnQSEAoId2F0Y2hfaWQYASABKAkSHAoFdmFsdWUYAiABKAsyDS5jYW1pbm8uVmFsdWUSNwoMZGVwZW5kZW5jaWVzGAMgAygLMiEucXVpeG9zLnJ1bnRpbWUuRGVyaXZlZERlcGVuZGVuY3kSDQoFZXJyb3IYBCABKAkSDwoHaW5pdGlhbBgFIAEoCDKzAwoOUGFja2FnZVJ1bnRpbWUSUAoJSGFuZHNoYWtlEiAucXVpeG9zLnJ1bnRpbWUuSGFuZHNoYWtlUmVxdWVzdBohLnF1aXhvcy5ydW50aW1lLkhhbmRzaGFrZVJlc3BvbnNlEkcKBkludm9rZRIdLnF1aXhvcy5ydW50aW1lLkludm9rZVJlcXVlc3QaHi5xdWl4b3MucnVudGltZS5JbnZva2VSZXNwb25zZRJDCgVXYXRjaBIcLnF1aXhvcy5ydW50aW1lLldhdGNoUmVxdWVzdBoaLnF1aXhvcy5ydW50aW1lLldhdGNoRXZlbnQwARJhChNHZXRJbnZvY2F0aW9uU3RhdHVzEigucXVpeG9zLnJ1bnRpbWUuSW52b2NhdGlvbkNvbnRyb2xSZXF1ZXN0GiAucXVpeG9zLnJ1bnRpbWUuSW52b2NhdGlvblN0YXR1cxJeChBDYW5jZWxJbnZvY2F0aW9uEigucXVpeG9zLnJ1bnRpbWUuSW52b2NhdGlvbkNvbnRyb2xSZXF1ZXN0GiAucXVpeG9zLnJ1bnRpbWUuSW52b2NhdGlvblN0YXR1c2IGcHJvdG8z", [file_camino_api, file_quixos_refs]); /** * @generated from message quixos.runtime.HandshakeRequest @@ -24,6 +24,11 @@ export type HandshakeRequest = Message<"quixos.runtime.HandshakeRequest"> & { * @generated from field: string orch_protocol_version = 1; */ orchProtocolVersion: string; + + /** + * @generated from field: string nonce = 2; + */ + nonce: string; }; /** @@ -51,6 +56,21 @@ export type HandshakeResponse = Message<"quixos.runtime.HandshakeResponse"> & { * @generated from field: repeated string export_ids = 3; */ exportIds: string[]; + + /** + * @generated from field: string instance_id = 4; + */ + instanceId: string; + + /** + * @generated from field: string authentication_proof = 5; + */ + authenticationProof: string; + + /** + * @generated from field: repeated string capabilities = 6; + */ + capabilities: string[]; }; /** @@ -60,6 +80,91 @@ export type HandshakeResponse = Message<"quixos.runtime.HandshakeResponse"> & { export const HandshakeResponseSchema: GenMessage = /*@__PURE__*/ messageDesc(file_quixos_runtime, 1); +/** + * @generated from message quixos.runtime.InvocationContext + */ +export type InvocationContext = Message<"quixos.runtime.InvocationContext"> & { + /** + * @generated from field: string workspace_epoch = 1; + */ + workspaceEpoch: string; + + /** + * @generated from field: string instance_id = 2; + */ + instanceId: string; + + /** + * @generated from field: string binding_digest = 3; + */ + bindingDigest: string; + + /** + * @generated from field: string grant = 4; + */ + grant: string; + + /** + * @generated from field: string session_id = 5; + */ + sessionId: string; + + /** + * Host-selected owner; packages must not invent workspace-local ownership. + * + * @generated from field: string owner_conformance_id = 6; + */ + ownerConformanceId: string; +}; + +/** + * Describes the message quixos.runtime.InvocationContext. + * Use `create(InvocationContextSchema)` to create a new message. + */ +export const InvocationContextSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_quixos_runtime, 2); + +/** + * @generated from message quixos.runtime.InvocationControlRequest + */ +export type InvocationControlRequest = Message<"quixos.runtime.InvocationControlRequest"> & { + /** + * @generated from field: string invocation_id = 1; + */ + invocationId: string; +}; + +/** + * Describes the message quixos.runtime.InvocationControlRequest. + * Use `create(InvocationControlRequestSchema)` to create a new message. + */ +export const InvocationControlRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_quixos_runtime, 3); + +/** + * @generated from message quixos.runtime.InvocationStatus + */ +export type InvocationStatus = Message<"quixos.runtime.InvocationStatus"> & { + /** + * @generated from field: string invocation_id = 1; + */ + invocationId: string; + + /** + * unknown, running, cancellation-requested, completed, failed + * + * @generated from field: string state = 2; + */ + state: string; +}; + +/** + * Describes the message quixos.runtime.InvocationStatus. + * Use `create(InvocationStatusSchema)` to create a new message. + */ +export const InvocationStatusSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_quixos_runtime, 4); + /** * @generated from message quixos.runtime.InvokeRequest */ @@ -88,6 +193,11 @@ export type InvokeRequest = Message<"quixos.runtime.InvokeRequest"> & { * @generated from field: repeated quixos.InjectedDependency dependencies = 5; */ dependencies: InjectedDependency[]; + + /** + * @generated from field: quixos.runtime.InvocationContext context = 6; + */ + context?: InvocationContext | undefined; }; /** @@ -95,7 +205,7 @@ export type InvokeRequest = Message<"quixos.runtime.InvokeRequest"> & { * Use `create(InvokeRequestSchema)` to create a new message. */ export const InvokeRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_runtime, 2); + messageDesc(file_quixos_runtime, 5); /** * @generated from message quixos.runtime.InvokeResponse @@ -127,7 +237,7 @@ export type InvokeResponse = Message<"quixos.runtime.InvokeResponse"> & { * Use `create(InvokeResponseSchema)` to create a new message. */ export const InvokeResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_runtime, 3); + messageDesc(file_quixos_runtime, 6); /** * @generated from message quixos.runtime.WatchRequest @@ -157,6 +267,11 @@ export type WatchRequest = Message<"quixos.runtime.WatchRequest"> & { * @generated from field: repeated quixos.InjectedDependency dependencies = 5; */ dependencies: InjectedDependency[]; + + /** + * @generated from field: quixos.runtime.InvocationContext context = 6; + */ + context?: InvocationContext | undefined; }; /** @@ -164,7 +279,7 @@ export type WatchRequest = Message<"quixos.runtime.WatchRequest"> & { * Use `create(WatchRequestSchema)` to create a new message. */ export const WatchRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_runtime, 4); + messageDesc(file_quixos_runtime, 7); /** * @generated from message quixos.runtime.DerivedDependency @@ -196,7 +311,7 @@ export type DerivedDependency = Message<"quixos.runtime.DerivedDependency"> & { * Use `create(DerivedDependencySchema)` to create a new message. */ export const DerivedDependencySchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_runtime, 5); + messageDesc(file_quixos_runtime, 8); /** * @generated from message quixos.runtime.WatchEvent @@ -233,7 +348,7 @@ export type WatchEvent = Message<"quixos.runtime.WatchEvent"> & { * Use `create(WatchEventSchema)` to create a new message. */ export const WatchEventSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_quixos_runtime, 6); + messageDesc(file_quixos_runtime, 9); /** * @generated from service quixos.runtime.PackageRuntime @@ -263,6 +378,22 @@ export const PackageRuntime: GenService<{ input: typeof WatchRequestSchema; output: typeof WatchEventSchema; }, + /** + * @generated from rpc quixos.runtime.PackageRuntime.GetInvocationStatus + */ + getInvocationStatus: { + methodKind: "unary"; + input: typeof InvocationControlRequestSchema; + output: typeof InvocationStatusSchema; + }, + /** + * @generated from rpc quixos.runtime.PackageRuntime.CancelInvocation + */ + cancelInvocation: { + methodKind: "unary"; + input: typeof InvocationControlRequestSchema; + output: typeof InvocationStatusSchema; + }, }> = /*@__PURE__*/ serviceDesc(file_quixos_runtime, 0); diff --git a/test/candidate-check.test.ts b/test/candidate-check.test.ts new file mode 100644 index 0000000..5248d30 --- /dev/null +++ b/test/candidate-check.test.ts @@ -0,0 +1,50 @@ +import test from "node:test"; +import assert from "node:assert/strict"; +import fs from "node:fs/promises"; +import path from "node:path"; +import os from "node:os"; +import { execFile as callback } from "node:child_process"; +import { promisify } from "node:util"; +import { snapshotRepository, checkWorkspaceCandidate } from "../src/capability-language/candidate-check.js"; +const execFile = promisify(callback); + +test("candidate snapshots include dirty and new files without changing Git history or index", async (context) => { + const directory = await fs.mkdtemp(path.join(os.tmpdir(), "qx-candidate-test-")); + context.after(() => fs.rm(directory, { recursive: true, force: true })); + const root = path.join(directory, "source"); + await fs.mkdir(root); + const git = (...args: string[]) => execFile("git", ["-C", root, ...args]); + await git("init"); + await fs.writeFile(path.join(root, "tracked"), "original"); + await fs.writeFile(path.join(root, ".gitignore"), "ignored\n"); + await git("add", "."); + const index = await fs.readFile(path.join(root, ".git/index")); + await fs.writeFile(path.join(root, "tracked"), "edited"); + await fs.writeFile(path.join(root, "new"), "new content"); + await fs.writeFile(path.join(root, "ignored"), "not source"); + const snapshot = await snapshotRepository(root, path.join(directory, "snapshot")); + assert.equal(await fs.readFile(path.join(snapshot.directory, "tracked"), "utf8"), "edited"); + assert.equal(await fs.readFile(path.join(snapshot.directory, "new"), "utf8"), "new content"); + await assert.rejects(fs.access(path.join(snapshot.directory, "ignored"))); + assert.deepEqual(await fs.readFile(path.join(root, ".git/index")), index); + await assert.rejects(git("rev-parse", "--verify", "HEAD"), "no commit was created"); + await fs.symlink("tracked", path.join(root, "link")); + await assert.rejects(snapshotRepository(root, path.join(directory, "rejected")), /regular file/); +}); + +test("candidate check produces explicitly non-activation evidence and never overwrites a report", async (context) => { + const directory = await fs.mkdtemp(path.join(os.tmpdir(), "qx-check-test-")); + context.after(() => fs.rm(directory, { recursive: true, force: true })); + const root = path.join(directory, "source"), output = path.join(directory, "check"); + await fs.mkdir(root); + await execFile("git", ["-C", root, "init"]); + await fs.writeFile(path.join(root, "quixos.lock"), `quixos-lock version 1 { quixos source { repository "https://example.test/quixos.git"; commit "${"a".repeat(40)}"; } }`); + await fs.writeFile(path.join(root, "workspace.qx"), `workspace Test id "workspace:test" revision "workspace:test@1" commit "${"b".repeat(40)}" { atom Subject id "atom:subject"; }`); + const result = await checkWorkspaceCandidate({root, output}); + assert.equal(result.candidateOnly, true); + assert.equal(result.activationEvidence, false); + assert.deepEqual(result.blockers, []); + const report = await fs.readFile(path.join(output, "report.json")); + await assert.rejects(checkWorkspaceCandidate({root, output}), /EEXIST/); + assert.deepEqual(await fs.readFile(path.join(output, "report.json")), report); +}); diff --git a/test/capability-language.test.ts b/test/capability-language.test.ts index 918dd8c..a2d8abe 100644 --- a/test/capability-language.test.ts +++ b/test/capability-language.test.ts @@ -101,16 +101,16 @@ test("ANTLR parses and validates a complete capability workspace", () => { assert.equal("id" in result.workspace.conformances[0]!, false); }); -test("conformances do not accept authored IDs", () => { +test("conformances preserve authored migration lineage IDs", () => { const result = compileCapabilityFixture({ workspace: capabilityFixtureSource.replace( "conform Project as Named {", 'conform Project as Named id "conformance:project:named" {', ), }); - assert.equal(result.ok, false); - if (result.ok) return; - assert.ok(result.diagnostics.some((entry) => entry.phase === "syntax")); + assert.equal(result.ok, true); + if (!result.ok) return; + assert.equal(result.workspace.conformances[0]!.id, "conformance:project:named"); }); test("the v1 language has no implicit relationship materialization rule", () => { diff --git a/test/capability-model.test.ts b/test/capability-model.test.ts index 52e58eb..2945c52 100644 --- a/test/capability-model.test.ts +++ b/test/capability-model.test.ts @@ -14,6 +14,14 @@ import { makeValidCapabilityWorkspace, } from "./fixtures/capability-model.js"; +test("ordinary state rejects managed references even under list/optional wrappers", () => { + const workspace = makeValidCapabilityWorkspace(); + const state = [...workspace.sharedAttachments, ...workspace.conformances.flatMap((entry) => entry.privateAttachments)].find((entry) => entry.kind === "state")!; + if (state.kind !== "state") throw new Error("fixture missing state"); + state.valueType = {kind: "list", value: {kind: "optional", value: {kind: "object-ref", expectation: {kind: "atom", atomId: state.attachedTo}}}}; + assert.ok(validateWorkspaceRevision(workspace).some((entry) => entry.message.includes("graph relationships"))); +}); + const expectIssue = ( workspace: WorkspaceRevision, code: CapabilityValidationIssueCode, @@ -193,6 +201,11 @@ test("related-object dependency views cannot traverse another conformance's priv projectionId: fixtureId.projectOwnerProjection, }; expectIssue(workspace, "private-attachment-access"); + const owner = conformance(workspace, fixtureId.projectOwnedConformance); + const edge = owner.privateAttachments.find((entry) => entry.kind === "edge" && entry.id === fixtureId.projectOwner); + assert.ok(edge?.kind === "edge"); + edge.endpoints.find((endpoint) => endpoint.projectionId === fixtureId.projectOwnerProjection)!.publicTraversal = true; + assert.equal(validateWorkspaceRevision(workspace).some((entry) => entry.code === "private-attachment-access"), false, "Only an explicitly exported read-only traversal crosses ownership"); }); test("native state and edge providers must match operation shape", () => { diff --git a/test/evolution.test.ts b/test/evolution.test.ts new file mode 100644 index 0000000..1139649 --- /dev/null +++ b/test/evolution.test.ts @@ -0,0 +1,98 @@ +import assert from "node:assert/strict"; +import { test } from "node:test"; +import { capabilityId as id, valueType, validateWorkspaceRevision } from "../src/capability-model/index.js"; +import { contentDigest, planEvolution, runtimeContracts, storageContracts } from "../src/capability-model/evolution.js"; +import { capabilityFixtureSource, capabilityResourceSources, compileCapabilityFixture, makeValidCapabilityWorkspace } from "./fixtures/capability-model.js"; + +test("QX carries stable conformance IDs and implementation semantic majors", () => { + const result = compileCapabilityFixture({ + workspace: capabilityFixtureSource.replace("conform Project as Named {", 'conform Project as Named id "conformance:project:named" semantic-major 3 {'), + todo: capabilityResourceSources.todo.replace('revision "package:todo-runtime@1" {', 'revision "package:todo-runtime@1" semantic-major 2 {'), + }); + assert.ok(result.ok, JSON.stringify(result)); + assert.equal(result.workspace.conformances[0]!.id, "conformance:project:named"); + assert.equal(result.workspace.conformances[0]!.semanticMajor, 3); + assert.equal(result.workspace.packageImports[0]!.semanticMajor, 2); +}); + +test("invalid majors and duplicate owner identities are rejected", () => { + const workspace = makeValidCapabilityWorkspace(); + workspace.packageImports[0]!.semanticMajor = 0; + workspace.conformances[0]!.semanticMajor = 1.5; + workspace.conformances[0]!.id = id.conformance("same"); + workspace.conformances[1]!.id = id.conformance("same"); + const issues = validateWorkspaceRevision(workspace); + assert.equal(issues.filter((entry) => entry.code === "invalid-semantic-major").length, 2); + assert.ok(issues.some((entry) => entry.code === "duplicate-conformance-id")); +}); + +test("hashing is canonical and rejects values outside the persisted JSON contract", () => { + assert.equal(contentDigest({ z: 1, a: { y: 3, b: 2 } }), contentDigest({ a: { b: 2, y: 3 }, z: 1 })); + assert.notEqual(contentDigest([1, 2]), contentDigest([2, 1])); + assert.throws(() => contentDigest(NaN)); + assert.throws(() => contentDigest(new Date())); +}); + +test("a workspace root change and display names do not restart package runtimes", () => { + const before = makeValidCapabilityWorkspace(); + const after = structuredClone(before); + after.id = id.workspaceRevision("next"); + after.sourceRootCommit = "f".repeat(40); + after.atoms[0]!.displayName = "Renamed"; + after.sharedAttachments[0]!.displayName = "Renamed storage"; + after.conformances.reverse(); + after.interfaceImports.reverse(); + const report = planEvolution(before, after, { allowLegacy: true }); + assert.deepEqual(report.runtimeActions.map((entry) => entry.action), ["keep"]); + assert.deepEqual(report.storageChanges, []); + assert.deepEqual(report.packageChecks, []); +}); + +test("consumer changes preserve unrelated resource owners", () => { + const before = makeValidCapabilityWorkspace(); + before.packageImports.push({ packageId: id.package("package:resource-owner"), revisionId: id.packageRevision("package:resource-owner@1"), + displayName: "ResourceOwner", source: { repository: "https://example.org/owner.git", commit: "a".repeat(40) }, + exports: [{ kind: "function", id: id.packageExport("export:owner:ping"), displayName: "ping", inputType: valueType.unit, outputType: valueType.unit, dependencyPorts: [] }] }); + const after = structuredClone(before); + after.packageImports[0]!.source.commit = "e".repeat(40); + const actions = planEvolution(before, after, { allowLegacy: true }).runtimeActions; + assert.equal(actions.find((entry) => entry.groupId === "package:resource-owner")!.action, "keep"); + assert.equal(actions.find((entry) => entry.groupId === "package:todo-runtime")!.action, "replace"); +}); + +test("storage defaults and ownership changes invalidate consumers without requiring a major", () => { + const before = makeValidCapabilityWorkspace(); + const after = structuredClone(before); + const slot = after.sharedAttachments[0]!; + assert.equal(slot.kind, "state"); + if (slot.kind === "state") slot.defaultValue = "Different default"; + const report = planEvolution(before, after, { allowLegacy: true }); + assert.equal(report.storageChanges.length, 1); + assert.equal(report.runtimeActions[0]!.action, "replace"); + assert.deepEqual(report.reviews, []); + assert.notDeepEqual(storageContracts(before), storageContracts(after)); +}); + +test("semantic review receipts cover exact consumer/provider contracts", () => { + const before = makeValidCapabilityWorkspace(); + before.conformances[0]!.id = id.conformance("conformance:project:named"); + const after = structuredClone(before); + after.conformances[0]!.semanticMajor = 2; + const report = planEvolution(before, after, { allowLegacy: true }); + assert.equal(report.reviews.length, 1); + assert.equal(report.reviews[0]!.accepted, false); + const receipt = { requirementDigest: report.reviews[0]!.requirementDigest, decision: "accepted-unchanged" as const, + rationale: "Reviewed the semantic change against summary behavior", agentId: "workspace-agent" }; + assert.equal(planEvolution(before, after, { allowLegacy: true, reviews: [receipt] }).reviews[0]!.accepted, true); + after.packageImports[0]!.source.commit = "f".repeat(40); + assert.equal(planEvolution(before, after, { allowLegacy: true, reviews: [receipt] }).reviews[0]!.accepted, false); +}); + +test("evolution enrollment is explicit and never erases legacy ownership", () => { + const workspace = makeValidCapabilityWorkspace(); + const report = planEvolution(workspace, workspace); + assert.ok(report.blockers.some((entry) => entry.includes("workspace-shared"))); + assert.ok(report.blockers.some((entry) => entry.includes("authored ID"))); + assert.equal(runtimeContracts(workspace).length, 1); + assert.throws(() => planEvolution(workspace, { ...workspace, workspaceId: id.workspace("other") }), /different workspace/); +}); diff --git a/test/migrations.test.ts b/test/migrations.test.ts new file mode 100644 index 0000000..1ddf1df --- /dev/null +++ b/test/migrations.test.ts @@ -0,0 +1,36 @@ +import test from "node:test"; +import assert from "node:assert/strict"; +import { contentDigest, validateMigrationCatalog, selectMigrationPath, type MigrationCatalog } from "../src/capability-model/index.js"; +const before = { fields: ["name"] }, after = { fields: ["first", "last"] }; +const from = contentDigest(before), to = contentDigest(after); +const catalog = (): MigrationCatalog => ({ schemaVersion: 1, contracts: { [from]: before, [to]: after }, migrations: [{ + id: "split-name", scopeId: "person-name", from, to, + implementation: { exportId: "migrate-name", file: "src/migrate-name.ts", digest: contentDigest("implementation") }, predecessors: [], + ports: [{ name: "source", view: "old", access: ["read"], contractDigest: from }, { name: "target", view: "new", access: ["write"], contractDigest: to }], +}] }); +test("published migrations retain exact old contracts and explicit local bindings", () => { + const value = validateMigrationCatalog(catalog(), new Set(["migrate-name"])); + const selection = { scopeId: "person-name", from, to, path: ["split-name"], bindings: { source: "old-slot", target: "new-slot" } }; + const result = selectMigrationPath(value, selection); + assert.equal(result[0].alreadyApplied, false); + assert.equal(selectMigrationPath(value, selection, new Map([["split-name", result[0].digest]]))[0].alreadyApplied, true); + const changed = catalog(); changed.migrations[0].implementation.digest = contentDigest("new code"); + assert.throws(() => selectMigrationPath(changed, selection, new Map([["split-name", result[0].digest]])), /different code/); + assert.throws(() => selectMigrationPath(value, { ...selection, path: [] }), /does not cover/); + assert.throws(() => selectMigrationPath(value, { ...selection, bindings: {} }), /Missing local/); +}); +test("old migration views cannot be writable and contract hashes are verified", () => { + const value = catalog(); value.migrations[0].ports[0].access = ["write"]; + assert.throws(() => validateMigrationCatalog(value), /read-only/); + const corrupt = catalog(); corrupt.contracts[from] = {}; + assert.throws(() => validateMigrationCatalog(corrupt), /digest mismatch/); +}); + +test("migration history rejects cycles and non-boolean compatibility promises", () => { + const cyclic = catalog(); + cyclic.migrations[0].predecessors = ["split-name"]; + assert.throws(() => validateMigrationCatalog(cyclic), /Cyclic/); + const misleading = catalog(); + (misleading.migrations[0] as unknown as {preservesOldReaders: string}).preservesOldReaders = "false"; + assert.throws(() => validateMigrationCatalog(misleading), /must be booleans/); +}); diff --git a/test/pin-upgrades.test.ts b/test/pin-upgrades.test.ts new file mode 100644 index 0000000..bf9baad --- /dev/null +++ b/test/pin-upgrades.test.ts @@ -0,0 +1,59 @@ +import test from "node:test"; +import assert from "node:assert/strict"; +import fs from "node:fs/promises"; +import os from "node:os"; +import path from "node:path"; +import {promisify} from "node:util"; +import {execFile as callback} from "node:child_process"; +import {planPinUpgrades, applyPinUpgrades, type UpgradeEffects} from "../src/capability-language/pin-upgrades.js"; +const execFile = promisify(callback); + +test("pin upgrades publish children before parent locks and resume without republishing completed nodes", async (context) => { + const workbench = await fs.mkdtemp(path.join(os.tmpdir(), "qx-upgrade-test-")); + context.after(() => fs.rm(workbench, {recursive: true, force: true})); + const from = "a".repeat(40), to = "b".repeat(40), framework = "c".repeat(40); + const sources = [{kind: "workspace" as const, directory: "root", source: {repository: "https://example.test/workspace.git", commit: from}}, + {kind: "interface" as const, directory: "resources/Named", source: {repository: "https://example.test/named.git", commit: from}}]; + const lock = `quixos-lock version 1 { quixos source { repository "https://example.test/quixos.git"; commit "${framework}"; }`; + for (const node of sources) { + const directory = path.join(workbench, node.directory); + await fs.mkdir(directory, {recursive: true}); + await execFile("git", ["-C", directory, "init"]); + await execFile("git", ["-C", directory, "remote", "add", "origin", node.source.repository]); + await fs.writeFile(path.join(directory, ".gitignore"), ".quixos/\n"); + await fs.writeFile(path.join(directory, "quixos.lock"), lock + (node.kind === "workspace" ? ` interface Named source { repository "${sources[1].source.repository}"; commit "${from}"; }` : "") + " }"); + } + await fs.writeFile(path.join(workbench, "resources/Named/interface.qx"), 'interface Named id "interface:named" revision "interface:named@1" { value name id "member:name" : string { get id "op:get"; } }'); + await fs.writeFile(path.join(workbench, "root/workspace.qx"), `workspace W id "workspace:w" revision "workspace:w@1" commit "${from}" { import interface Named; atom A id "atom:a"; }`); + const snapshotMap = path.join(workbench, "snapshots.json"); + await fs.writeFile(snapshotMap, JSON.stringify({resources: [{kind: "interface", repository: sources[1].source.repository, commit: to, directory: path.join(workbench, "resources/Named")}]})); + const oldMap = process.env.QUIXOS_SNAPSHOT_MAP; + process.env.QUIXOS_SNAPSHOT_MAP = snapshotMap; + context.after(() => {if (oldMap === undefined) delete process.env.QUIXOS_SNAPSHOT_MAP; else process.env.QUIXOS_SNAPSHOT_MAP = oldMap;}); + const plan = await planPinUpgrades(workbench, {nodes: sources}); + await fs.mkdir(path.join(workbench, ".quixos"), {recursive: true}); + await fs.writeFile(path.join(workbench, ".quixos/resource-graph.json"), JSON.stringify({resources: [{...sources[1], source: {resolver: "git", ...sources[1].source}}]})); + assert.deepEqual(plan.nodes.map((node) => node.directory), ["resources/Named", "root"]); + let fail = true; + const published: string[] = []; + const effects: UpgradeEffects = { + check: async (node) => {if (node.kind === "workspace" && fail) throw new Error("refactor required");}, + snapshot: async () => to, + publish: async (root) => {published.push(path.relative(workbench, root));}, + }; + await assert.rejects(() => applyPinUpgrades(plan, undefined, effects), /refactor required/); + assert.deepEqual(published, ["resources/Named"]); + assert.match(await fs.readFile(path.join(workbench, "root/quixos.lock"), "utf8"), new RegExp(to)); + const id = (await fs.readdir(path.join(workbench, ".quixos/upgrades"))).find((name) => name.endsWith(".json"))!.slice(0, -5); + fail = false; + await fs.appendFile(path.join(workbench, "root/workspace.qx"), "\n// explicit refactor\n"); + await assert.rejects(() => applyPinUpgrades(plan, id, effects), /accept-edits/); + const result = await applyPinUpgrades(plan, id, effects, {acceptEdits: true}); + assert.equal(result.activated, false); + assert.deepEqual(published, ["resources/Named", "root"]); + const graph = JSON.parse(await fs.readFile(path.join(workbench, ".quixos/resource-graph.json"), "utf8")); + assert.equal(graph.resources.length, 1); + assert.equal(graph.resources[0].source.commit, to); + const next = await planPinUpgrades(workbench, {nodes: [sources[0], {...sources[1], source: graph.resources[0].source}]}); + assert.deepEqual(next.nodes.find((node) => node.kind === "workspace")!.dependencies, ["resources/Named"]); +}); diff --git a/test/scaffold-recipes.test.ts b/test/scaffold-recipes.test.ts new file mode 100644 index 0000000..44cc359 --- /dev/null +++ b/test/scaffold-recipes.test.ts @@ -0,0 +1,47 @@ +import test from "node:test"; +import assert from "node:assert/strict"; +import fs from "node:fs/promises"; +import os from "node:os"; +import path from "node:path"; +import {execFile as callback} from "node:child_process"; +import {promisify} from "node:util"; +import {scaffoldRecipe} from "../src/capability-language/scaffold-recipes.js"; +import {planStructure, applyStructure} from "../src/capability-language/structural-plan.js"; +import {contentDigest} from "../src/capability-model/evolution.js"; +const execFile = promisify(callback); + +test("package/function/migration scaffolds register implementations and refresh code digests without overwriting code", async (context) => { + const root = await fs.mkdtemp(path.join(os.tmpdir(), "qx-recipes-")); + context.after(() => fs.rm(root, {recursive: true, force: true})); + await execFile("git", ["-C", root, "init"]); + await fs.writeFile(path.join(root, ".gitignore"), ".quixos/\n"); + const source = {repository: "https://example.test/chess.git", commit: "a".repeat(40)}; + const base = {source, directory: "packages/Chess"}; + const apply = async (command: Parameters[1], input: Parameters[2]) => applyStructure(await planStructure(root, await scaffoldRecipe(root, command, input))); + await apply("package", {...base, name: "Chess", id: "package:chess", revision: "package:chess@1", tools: {quixos: source, protocol: source, helpers: source, sdk: source}}); + await apply("function", {...base, name: "play", id: "export:play"}); + const filename = path.join(root, base.directory, "src/impl/play.ts"); + const edited = 'import type {Implementation} from "../generated-bindings.js";\nexport const handler: Implementation["play"] = async () => null;\n'; + await fs.writeFile(filename, edited); + const old = {version: 1}, next = {version: 2}, from = contentDigest(old), to = contentDigest(next); + await apply("migration", {...base, name: "upgrade", id: "export:upgrade", migration: {id: "upgrade-v2", scopeId: "board", from, to, predecessors: [], ports: [], contracts: {[from]: old, [to]: next}}}); + const migrationFile = path.join(root, base.directory, "src/migrations/upgrade.ts"); + await fs.appendFile(migrationFile, "\n// authored migration change\n"); + await apply("refresh", base); + assert.equal(await fs.readFile(filename, "utf8"), edited); + const catalog = JSON.parse(await fs.readFile(path.join(root, base.directory, "quixos.migrations.json"), "utf8")); + assert.equal(catalog.migrations[0].implementation.digest, contentDigest(await fs.readFile(migrationFile, "utf8"))); + const bindings = await fs.readFile(path.join(root, base.directory, "src/generated-bindings.ts"), "utf8"); + assert.match(bindings, /export:play/); + assert.match(await fs.readFile(path.join(root, base.directory, "src/migrate.ts"), "utf8"), /export:upgrade/); + if (process.env.QX_SCAFFOLD_TEST_SDK) { + const sdk = await fs.realpath(process.env.QX_SCAFFOLD_TEST_SDK); + const packageRoot = path.join(root, base.directory); + await fs.mkdir(path.join(packageRoot, "node_modules/@quixos"), {recursive: true}); + await fs.symlink(sdk, path.join(packageRoot, "node_modules/@quixos/camino-package-runtime")); + await fs.symlink(path.join(sdk, "node_modules/@types"), path.join(packageRoot, "node_modules/@types")); + await execFile(path.join(sdk, "node_modules/.bin/tsc"), ["--noEmit"], {cwd: packageRoot}); + await execFile("nix-instantiate", ["--parse", path.join(packageRoot, "flake.nix")]); + } + await assert.rejects(() => apply("function", {...base, name: "play", id: "export:play"}), /unique/); +}); diff --git a/test/structural-edits.test.ts b/test/structural-edits.test.ts new file mode 100644 index 0000000..f6c2c32 --- /dev/null +++ b/test/structural-edits.test.ts @@ -0,0 +1,42 @@ +import test from "node:test"; +import assert from "node:assert/strict"; +import { editStructure, scaffoldResourceSource } from "../src/capability-language/structural-edits.js"; + +test("package scaffolding and function edits preserve surrounding source and use exact selectors", () => { + const source = `// 🧭 resource comment\n${scaffoldResourceSource("package", "Chess", "package:chess", "package:chess@1")}`; + const functionSource = 'function evaluate id "export:evaluate" : string -> string;'; + const appended = editStructure(source, {operation: "append", parent: {kind: "packageResourceDecl", id: "package:chess"}, source: functionSource}); + assert.ok(appended.startsWith("// 🧭 resource comment\n")); + assert.ok(appended.includes(functionSource)); + const replaced = editStructure(appended, {operation: "replace", target: {kind: "packageFunctionExport", id: "export:evaluate"}, source: 'function evaluate id "export:evaluate" : unit -> string;'}); + assert.ok(replaced.includes(": unit -> string;")); + assert.ok(!editStructure(replaced, {operation: "remove", target: {kind: "packageFunctionExport", id: "export:evaluate"}}).includes("evaluate")); + assert.throws(() => editStructure(source, {operation: "remove", target: {kind: "packageResourceDecl", id: "package:chess@1"}}), /exactly once/); + assert.throws(() => editStructure(source, {operation: "append", parent: {kind: "packageResourceDecl"}, source: "not valid QX"}), /Invalid structural/); +}); + +test("dependency scaffolding validates exact sources and preserves unrelated lock comments", () => { + const source = `// 🧭 lock\nquixos-lock version 1 {\n quixos source { repository "https://example.test/quixos.git"; commit "${"a".repeat(40)}"; }\n // retained comment\n}\n`; + const dependency = {operation: "dependency" as const, kind: "package" as const, name: "Chess", source: {repository: "https://example.test/chess.git", commit: "b".repeat(40)}}; + const appended = editStructure(source, dependency); + assert.ok(appended.includes("// retained comment")); + assert.ok(appended.startsWith("// 🧭 lock\n")); + assert.throws(() => editStructure(source, {...dependency, source: {...dependency.source, commit: "main"}}), /Invalid dependency/); + const changed = editStructure(appended, {...dependency, source: {...dependency.source, commit: "c".repeat(40)}}); + assert.ok(!changed.includes("b".repeat(40))); + assert.ok(!editStructure(changed, {...dependency, source: null}).includes("package Chess")); +}); + +test("conformance enrollment, major edits, imports, and private attachment removal preserve valid structure", () => { + const source = `fragment { conform Game as Playable { private state Board id "slot:board" on Game : string policy optimistic-register; } }`; + const selector = {kind: "conformanceDecl", names: ["Game", "Playable"]}; + const enrolled = editStructure(source, {operation: "conformance-id", target: selector, id: "conformance:playable"}); + assert.ok(enrolled.includes('as Playable id "conformance:playable"')); + const major = editStructure(enrolled, {operation: "semantic-major", target: {kind: "conformanceDecl", id: "conformance:playable"}, major: 2}); + assert.ok(major.includes("semantic-major 2")); + assert.throws(() => editStructure(major, {operation: "conformance-id", target: selector, id: "different"}), /Cannot change/); + const removed = editStructure(major, {operation: "remove", target: {kind: "stateDecl", id: "slot:board"}}); + assert.ok(!removed.includes("private")); + const imported = editStructure(removed, {operation: "import", kind: "interface", name: "Playable"}); + assert.equal(editStructure(imported, {operation: "import", kind: "interface", name: "Playable"}), imported); +}); diff --git a/test/structural-plan.test.ts b/test/structural-plan.test.ts new file mode 100644 index 0000000..697b2b9 --- /dev/null +++ b/test/structural-plan.test.ts @@ -0,0 +1,37 @@ +import test from "node:test"; +import assert from "node:assert/strict"; +import fs from "node:fs/promises"; +import os from "node:os"; +import path from "node:path"; +import { promisify } from "node:util"; +import { execFile as callback } from "node:child_process"; +import { planStructure, applyStructure, resumeStructure, type StructuralRequest } from "../src/capability-language/structural-plan.js"; +const execFile = promisify(callback); + +test("structural plans validate the graph, journal originals, and reject stale edits", async (context) => { + const root = await fs.mkdtemp(path.join(os.tmpdir(), "qx-structural-test-")); + context.after(() => fs.rm(root, {recursive: true, force: true})); + await execFile("git", ["-C", root, "init"]); + await fs.writeFile(path.join(root, ".gitignore"), ".quixos/\n"); + await fs.writeFile(path.join(root, "quixos.lock"), `quixos-lock version 1 { quixos source { repository "https://example.test/quixos.git"; commit "${"a".repeat(40)}"; } }`); + const before = `workspace Test id "workspace:test" revision "workspace:test@1" commit "${"b".repeat(40)}" { atom Subject id "atom:subject"; }`; + await fs.writeFile(path.join(root, "workspace.qx"), before); + const request: StructuralRequest = {kind: "workspace", files: [{file: "workspace.qx", edits: [{operation: "append", parent: {kind: "workspaceDecl"}, source: 'atom Game id "atom:game";'}]}]}; + const plan = await planStructure(root, request); + assert.equal(await fs.readFile(path.join(root, "workspace.qx"), "utf8"), before); + await fs.writeFile(path.join(root, "workspace.qx"), `${before}\n// newer edit`); + await assert.rejects(() => applyStructure(plan), /Stale scaffold/); + await fs.writeFile(path.join(root, "workspace.qx"), before); + const applied = await applyStructure(plan); + assert.equal(applied.phase, "complete"); + assert.ok((await fs.readFile(path.join(root, "workspace.qx"), "utf8")).includes("atom Game")); + const journal = JSON.parse(await fs.readFile(applied.journalPath, "utf8")); + assert.equal(journal.changes[0].before, before); + assert.equal((await resumeStructure(root, applied.id)).phase, "complete"); + // Simulate a process interrupted after one file was written, before recording + // completion. Replay accepts the already-written exact after image. + journal.phase = "prepared"; + await fs.writeFile(applied.journalPath, JSON.stringify(journal)); + assert.equal((await resumeStructure(root, applied.id)).phase, "complete"); + await assert.rejects(() => planStructure(root, request), /Duplicate|duplicate/); +});