diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 000000000..e69de29bb diff --git a/base64.mjs b/base64.mjs new file mode 100644 index 000000000..a175b5e55 --- /dev/null +++ b/base64.mjs @@ -0,0 +1,113 @@ +/** + * Convert between Uint8Array and Base64 strings + * Allows for any encoded JS string to be converted (as opposed to atob()/btoa() which only supports latin1) + * + * Original implementation by madmurphy on MDN + * @see https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding#Solution_1_–_JavaScript%27s_UTF-16_%3E_base64 + */ + +function b64ToUint6(nChr) { + return nChr > 64 && nChr < 91 + ? nChr - 65 + : nChr > 96 && nChr < 123 + ? nChr - 71 + : nChr > 47 && nChr < 58 + ? nChr + 4 + : nChr === 43 + ? 62 + : nChr === 47 + ? 63 + : 0 +} + +export function decodeToArray(base64string, blockSize) { + var sB64Enc = base64string.replace(/[^A-Za-z0-9\+\/]/g, ''), + nInLen = sB64Enc.length, + nOutLen = blockSize + ? Math.ceil(((nInLen * 3 + 1) >>> 2) / blockSize) * blockSize + : (nInLen * 3 + 1) >>> 2, + aBytes = new Uint8Array(nOutLen) + + for ( + var nMod3, nMod4, nUint24 = 0, nOutIdx = 0, nInIdx = 0; + nInIdx < nInLen; + nInIdx++ + ) { + nMod4 = nInIdx & 3 + nUint24 |= b64ToUint6(sB64Enc.charCodeAt(nInIdx)) << (18 - 6 * nMod4) + if (nMod4 === 3 || nInLen - nInIdx === 1) { + for (nMod3 = 0; nMod3 < 3 && nOutIdx < nOutLen; nMod3++, nOutIdx++) { + aBytes[nOutIdx] = (nUint24 >>> ((16 >>> nMod3) & 24)) & 255 + } + nUint24 = 0 + } + } + + return aBytes +} + +function uint6ToB64(nUint6) { + return nUint6 < 26 + ? nUint6 + 65 + : nUint6 < 52 + ? nUint6 + 71 + : nUint6 < 62 + ? nUint6 - 4 + : nUint6 === 62 + ? 43 + : nUint6 === 63 + ? 47 + : 65 +} + +export function encodeFromArray(bytes) { + var eqLen = (3 - (bytes.length % 3)) % 3, + sB64Enc = '' + + for ( + var nMod3, nLen = bytes.length, nUint24 = 0, nIdx = 0; + nIdx < nLen; + nIdx++ + ) { + nMod3 = nIdx % 3 + /* Uncomment the following line in order to split the output in lines 76-character long: */ + /* + if (nIdx > 0 && (nIdx * 4 / 3) % 76 === 0) { sB64Enc += "\r\n"; } + */ + nUint24 |= bytes[nIdx] << ((16 >>> nMod3) & 24) + if (nMod3 === 2 || bytes.length - nIdx === 1) { + sB64Enc += String.fromCharCode( + uint6ToB64((nUint24 >>> 18) & 63), + uint6ToB64((nUint24 >>> 12) & 63), + uint6ToB64((nUint24 >>> 6) & 63), + uint6ToB64(nUint24 & 63) + ) + nUint24 = 0 + } + } + + return eqLen === 0 + ? sB64Enc + : sB64Enc.substring(0, sB64Enc.length - eqLen) + (eqLen === 1 ? '=' : '==') +} + +/** + * URL-safe variants of Base64 conversion functions (aka base64url) + * @see https://tools.ietf.org/html/rfc4648#section-5 + */ + +export function encodeFromArrayUrlSafe(bytes) { + return encodeURIComponent( + encodeFromArray(bytes) + .replace(/\+/g, '-') + .replace(/\//g, '_') + ) +} + +export function decodeToArrayUrlSafe(base64string) { + return decodeToArray( + decodeURIComponent(base64string) + .replace(/-/g, '+') + .replace(/_/g, '/') + ) +} diff --git a/docs/.lock b/docs/.lock new file mode 100644 index 000000000..e69de29bb diff --git a/docs/.nojekyll b/docs/.nojekyll new file mode 100644 index 000000000..e69de29bb diff --git a/docs/crates.js b/docs/crates.js new file mode 100644 index 000000000..7b7e68c84 --- /dev/null +++ b/docs/crates.js @@ -0,0 +1 @@ +window.ALL_CRATES = ["egglog"]; \ No newline at end of file diff --git a/docs/egglog/all.html b/docs/egglog/all.html new file mode 100644 index 000000000..3af793744 --- /dev/null +++ b/docs/egglog/all.html @@ -0,0 +1 @@ +List of all items in this crate

List of all items

Structs

Enums

Traits

Macros

Type Definitions

Constants

\ No newline at end of file diff --git a/docs/egglog/ast/desugar/index.html b/docs/egglog/ast/desugar/index.html new file mode 100644 index 000000000..755ef53b3 --- /dev/null +++ b/docs/egglog/ast/desugar/index.html @@ -0,0 +1 @@ +egglog::ast::desugar - Rust

Module egglog::ast::desugar

source ·

Structs

\ No newline at end of file diff --git a/docs/egglog/ast/desugar/sidebar-items.js b/docs/egglog/ast/desugar/sidebar-items.js new file mode 100644 index 000000000..62982dbe3 --- /dev/null +++ b/docs/egglog/ast/desugar/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"struct":["Desugar"]}; \ No newline at end of file diff --git a/docs/egglog/ast/desugar/struct.Desugar.html b/docs/egglog/ast/desugar/struct.Desugar.html new file mode 100644 index 000000000..9715948c0 --- /dev/null +++ b/docs/egglog/ast/desugar/struct.Desugar.html @@ -0,0 +1,13 @@ +Desugar in egglog::ast::desugar - Rust

Struct egglog::ast::desugar::Desugar

source ·
pub struct Desugar { /* private fields */ }

Implementations§

source§

impl Desugar

source

pub fn merge_ruleset_name(&self) -> Symbol

source

pub fn get_fresh(&mut self) -> Symbol

source

pub fn get_new_id(&mut self) -> CommandId

source

pub fn parse_program(&self, input: &str) -> Result<Vec<Command>, Error>

source

pub fn declare(&mut self, name: Symbol, sort: Symbol) -> Vec<NCommand>

Trait Implementations§

source§

impl Clone for Desugar

source§

fn clone(&self) -> Self

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Default for Desugar

source§

fn default() -> Self

Returns the “default value” for a type. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToOwned for Twhere + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

\ No newline at end of file diff --git a/docs/egglog/ast/enum.Action.html b/docs/egglog/ast/enum.Action.html new file mode 100644 index 000000000..60a254d10 --- /dev/null +++ b/docs/egglog/ast/enum.Action.html @@ -0,0 +1,36 @@ +Action in egglog::ast - Rust

Enum egglog::ast::Action

source ·
pub enum Action {
+    Let(Symbol, Expr),
+    Set(Symbol, Vec<Expr>, Expr),
+    Delete(Symbol, Vec<Expr>),
+    Union(Expr, Expr),
+    Extract(Expr, Expr),
+    Panic(String),
+    Expr(Expr),
+}

Variants§

§

Let(Symbol, Expr)

§

Set(Symbol, Vec<Expr>, Expr)

§

Delete(Symbol, Vec<Expr>)

§

Union(Expr, Expr)

§

Extract(Expr, Expr)

§

Panic(String)

§

Expr(Expr)

Implementations§

source§

impl Action

source

pub fn map_exprs(&self, f: &mut impl FnMut(&Expr) -> Expr) -> Self

source

pub fn replace_canon( + &self, + canon: &HashMap<Symbol, Expr, BuildHasherDefault<FxHasher>> +) -> Self

Trait Implementations§

source§

impl Clone for Action

source§

fn clone(&self) -> Action

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for Action

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Display for Action

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Hash for Action

source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl PartialEq<Action> for Action

source§

fn eq(&self, other: &Action) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl Eq for Action

source§

impl StructuralEq for Action

source§

impl StructuralPartialEq for Action

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CallHasher for Twhere + T: Hash + ?Sized,

§

fn get_hash<H, B>(value: &H, build_hasher: &B) -> u64where + H: Hash + ?Sized, + B: BuildHasher,

§

impl<Q, K> Equivalent<K> for Qwhere + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Qwhere + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToOwned for Twhere + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for Twhere + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

\ No newline at end of file diff --git a/docs/egglog/ast/enum.Command.html b/docs/egglog/ast/enum.Command.html new file mode 100644 index 000000000..8effe685f --- /dev/null +++ b/docs/egglog/ast/enum.Command.html @@ -0,0 +1,64 @@ +Command in egglog::ast - Rust

Enum egglog::ast::Command

source ·
pub enum Command {
+
Show 24 variants SetOption { + name: Symbol, + value: Expr, + }, + Datatype { + name: Symbol, + variants: Vec<Variant>, + }, + Declare { + name: Symbol, + sort: Symbol, + }, + Sort(Symbol, Option<(Symbol, Vec<Expr>)>), + Function(FunctionDecl), + AddRuleset(Symbol), + Rule { + name: Symbol, + ruleset: Symbol, + rule: Rule, + }, + Rewrite(Symbol, Rewrite), + BiRewrite(Symbol, Rewrite), + Action(Action), + RunSchedule(Schedule), + Simplify { + expr: Expr, + schedule: Schedule, + }, + Calc(Vec<IdentSort>, Vec<Expr>), + Extract { + variants: usize, + fact: Fact, + }, + Check(Vec<Fact>), + CheckProof, + PrintTable(Symbol, usize), + PrintSize(Symbol), + Input { + name: Symbol, + file: String, + }, + Output { + file: String, + exprs: Vec<Expr>, + }, + Push(usize), + Pop(usize), + Fail(Box<Command>), + Include(String), +
}

Variants§

§

SetOption

Fields

§name: Symbol
§value: Expr
§

Datatype

Fields

§name: Symbol
§variants: Vec<Variant>
§

Declare

Fields

§name: Symbol
§sort: Symbol
§

Sort(Symbol, Option<(Symbol, Vec<Expr>)>)

§

Function(FunctionDecl)

§

AddRuleset(Symbol)

§

Rule

Fields

§name: Symbol
§ruleset: Symbol
§rule: Rule
§

Rewrite(Symbol, Rewrite)

§

BiRewrite(Symbol, Rewrite)

§

Action(Action)

§

RunSchedule(Schedule)

§

Simplify

Fields

§expr: Expr
§schedule: Schedule
§

Calc(Vec<IdentSort>, Vec<Expr>)

§

Extract

Fields

§variants: usize
§fact: Fact
§

Check(Vec<Fact>)

§

CheckProof

§

PrintTable(Symbol, usize)

§

PrintSize(Symbol)

§

Input

Fields

§name: Symbol
§file: String
§

Output

Fields

§file: String
§exprs: Vec<Expr>
§

Push(usize)

§

Pop(usize)

§

Fail(Box<Command>)

§

Include(String)

Trait Implementations§

source§

impl Clone for Command

source§

fn clone(&self) -> Command

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for Command

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Display for Command

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToOwned for Twhere + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for Twhere + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

\ No newline at end of file diff --git a/docs/egglog/ast/enum.Expr.html b/docs/egglog/ast/enum.Expr.html new file mode 100644 index 000000000..e273b0c4c --- /dev/null +++ b/docs/egglog/ast/enum.Expr.html @@ -0,0 +1,42 @@ +Expr in egglog::ast - Rust

Enum egglog::ast::Expr

source ·
pub enum Expr {
+    Lit(Literal),
+    Var(Symbol),
+    Call(Symbol, Vec<Self>),
+}

Variants§

§

Lit(Literal)

§

Var(Symbol)

§

Call(Symbol, Vec<Self>)

Implementations§

source§

impl Expr

source

pub fn is_var(&self) -> bool

source

pub fn call( + op: impl Into<Symbol>, + children: impl IntoIterator<Item = Self> +) -> Self

source

pub fn lit(lit: impl Into<Literal>) -> Self

source

pub fn get_var(&self) -> Option<Symbol>

source

pub fn ast_size(&self) -> usize

source

pub fn walk(&self, pre: &mut impl FnMut(&Self), post: &mut impl FnMut(&Self))

source

pub fn fold<Out>(&self, f: &mut impl FnMut(&Self, Vec<Out>) -> Out) -> Out

source

pub fn map(&self, f: &mut impl FnMut(&Self) -> Self) -> Self

source

pub fn subst( + &self, + canon: &HashMap<Symbol, Expr, BuildHasherDefault<FxHasher>> +) -> Self

source

pub fn vars(&self) -> impl Iterator<Item = Symbol> + '_

Trait Implementations§

source§

impl Clone for Expr

source§

fn clone(&self) -> Expr

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for Expr

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Display for Expr

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Hash for Expr

source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl Ord for Expr

source§

fn cmp(&self, other: &Expr) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · source§

fn max(self, other: Self) -> Selfwhere + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · source§

fn min(self, other: Self) -> Selfwhere + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · source§

fn clamp(self, min: Self, max: Self) -> Selfwhere + Self: Sized + PartialOrd<Self>,

Restrict a value to a certain interval. Read more
source§

impl PartialEq<Expr> for Expr

source§

fn eq(&self, other: &Expr) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PartialOrd<Expr> for Expr

source§

fn partial_cmp(&self, other: &Expr) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · source§

fn lt(&self, other: &Rhs) -> bool

This method tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · source§

fn le(&self, other: &Rhs) -> bool

This method tests less than or equal to (for self and other) and is used by the <= +operator. Read more
1.0.0 · source§

fn gt(&self, other: &Rhs) -> bool

This method tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 · source§

fn ge(&self, other: &Rhs) -> bool

This method tests greater than or equal to (for self and other) and is used by the >= +operator. Read more
source§

impl Eq for Expr

source§

impl StructuralEq for Expr

source§

impl StructuralPartialEq for Expr

Auto Trait Implementations§

§

impl RefUnwindSafe for Expr

§

impl Send for Expr

§

impl Sync for Expr

§

impl Unpin for Expr

§

impl UnwindSafe for Expr

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CallHasher for Twhere + T: Hash + ?Sized,

§

fn get_hash<H, B>(value: &H, build_hasher: &B) -> u64where + H: Hash + ?Sized, + B: BuildHasher,

§

impl<Q, K> Comparable<K> for Qwhere + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
§

impl<Q, K> Equivalent<K> for Qwhere + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Qwhere + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToOwned for Twhere + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for Twhere + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

\ No newline at end of file diff --git a/docs/egglog/ast/enum.Fact.html b/docs/egglog/ast/enum.Fact.html new file mode 100644 index 000000000..ee0800bde --- /dev/null +++ b/docs/egglog/ast/enum.Fact.html @@ -0,0 +1,32 @@ +Fact in egglog::ast - Rust

Enum egglog::ast::Fact

source ·
pub enum Fact {
+    Eq(Vec<Expr>),
+    Fact(Expr),
+}

Variants§

§

Eq(Vec<Expr>)

Must be at least two things in an eq fact

+
§

Fact(Expr)

Implementations§

source§

impl Fact

source

pub fn map_exprs(&self, f: &mut impl FnMut(&Expr) -> Expr) -> Fact

source

pub fn subst( + &self, + subst: &HashMap<Symbol, Expr, BuildHasherDefault<FxHasher>> +) -> Fact

Trait Implementations§

source§

impl Clone for Fact

source§

fn clone(&self) -> Fact

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for Fact

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Display for Fact

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Hash for Fact

source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl PartialEq<Fact> for Fact

source§

fn eq(&self, other: &Fact) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl Eq for Fact

source§

impl StructuralEq for Fact

source§

impl StructuralPartialEq for Fact

Auto Trait Implementations§

§

impl RefUnwindSafe for Fact

§

impl Send for Fact

§

impl Sync for Fact

§

impl Unpin for Fact

§

impl UnwindSafe for Fact

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CallHasher for Twhere + T: Hash + ?Sized,

§

fn get_hash<H, B>(value: &H, build_hasher: &B) -> u64where + H: Hash + ?Sized, + B: BuildHasher,

§

impl<Q, K> Equivalent<K> for Qwhere + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Qwhere + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToOwned for Twhere + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for Twhere + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

\ No newline at end of file diff --git a/docs/egglog/ast/enum.Literal.html b/docs/egglog/ast/enum.Literal.html new file mode 100644 index 000000000..922456421 --- /dev/null +++ b/docs/egglog/ast/enum.Literal.html @@ -0,0 +1,37 @@ +Literal in egglog::ast - Rust

Enum egglog::ast::Literal

source ·
pub enum Literal {
+    Int(i64),
+    F64(OrderedFloat<f64>),
+    String(Symbol),
+    Unit,
+}

Variants§

§

Int(i64)

§

F64(OrderedFloat<f64>)

§

String(Symbol)

§

Unit

Trait Implementations§

source§

impl Clone for Literal

source§

fn clone(&self) -> Literal

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for Literal

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Display for Literal

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl From<GlobalSymbol> for Literal

source§

fn from(t: Symbol) -> Self

Converts to this type from the input type.
source§

impl From<Literal> for OrderedFloat<f64>

source§

fn from(literal: Literal) -> Self

Converts to this type from the input type.
source§

impl From<Literal> for Symbol

source§

fn from(literal: Literal) -> Self

Converts to this type from the input type.
source§

impl From<Literal> for i64

source§

fn from(literal: Literal) -> Self

Converts to this type from the input type.
source§

impl From<OrderedFloat<f64>> for Literal

source§

fn from(t: OrderedFloat<f64>) -> Self

Converts to this type from the input type.
source§

impl From<i64> for Literal

source§

fn from(t: i64) -> Self

Converts to this type from the input type.
source§

impl Hash for Literal

source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl Ord for Literal

source§

fn cmp(&self, other: &Literal) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · source§

fn max(self, other: Self) -> Selfwhere + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · source§

fn min(self, other: Self) -> Selfwhere + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · source§

fn clamp(self, min: Self, max: Self) -> Selfwhere + Self: Sized + PartialOrd<Self>,

Restrict a value to a certain interval. Read more
source§

impl PartialEq<Literal> for Literal

source§

fn eq(&self, other: &Literal) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PartialOrd<Literal> for Literal

source§

fn partial_cmp(&self, other: &Literal) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · source§

fn lt(&self, other: &Rhs) -> bool

This method tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · source§

fn le(&self, other: &Rhs) -> bool

This method tests less than or equal to (for self and other) and is used by the <= +operator. Read more
1.0.0 · source§

fn gt(&self, other: &Rhs) -> bool

This method tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 · source§

fn ge(&self, other: &Rhs) -> bool

This method tests greater than or equal to (for self and other) and is used by the >= +operator. Read more
source§

impl Eq for Literal

source§

impl StructuralEq for Literal

source§

impl StructuralPartialEq for Literal

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CallHasher for Twhere + T: Hash + ?Sized,

§

fn get_hash<H, B>(value: &H, build_hasher: &B) -> u64where + H: Hash + ?Sized, + B: BuildHasher,

§

impl<Q, K> Comparable<K> for Qwhere + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
§

impl<Q, K> Equivalent<K> for Qwhere + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Qwhere + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToOwned for Twhere + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for Twhere + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

\ No newline at end of file diff --git a/docs/egglog/ast/enum.NCommand.html b/docs/egglog/ast/enum.NCommand.html new file mode 100644 index 000000000..87d754134 --- /dev/null +++ b/docs/egglog/ast/enum.NCommand.html @@ -0,0 +1,55 @@ +NCommand in egglog::ast - Rust

Enum egglog::ast::NCommand

source ·
pub enum NCommand {
+
Show 16 variants SetOption { + name: Symbol, + value: Expr, + }, + Sort(Symbol, Option<(Symbol, Vec<Expr>)>), + Function(FunctionDecl), + AddRuleset(Symbol), + NormRule { + name: Symbol, + ruleset: Symbol, + rule: NormRule, + }, + NormAction(NormAction), + RunSchedule(NormSchedule), + Check(Vec<NormFact>), + CheckProof, + PrintTable(Symbol, usize), + PrintSize(Symbol), + Output { + file: String, + exprs: Vec<Expr>, + }, + Push(usize), + Pop(usize), + Fail(Box<NCommand>), + Input { + name: Symbol, + file: String, + }, +
}

Variants§

§

SetOption

Fields

§name: Symbol
§value: Expr
§

Sort(Symbol, Option<(Symbol, Vec<Expr>)>)

§

Function(FunctionDecl)

§

AddRuleset(Symbol)

§

NormRule

Fields

§name: Symbol
§ruleset: Symbol
§

NormAction(NormAction)

§

RunSchedule(NormSchedule)

§

Check(Vec<NormFact>)

§

CheckProof

§

PrintTable(Symbol, usize)

§

PrintSize(Symbol)

§

Output

Fields

§file: String
§exprs: Vec<Expr>
§

Push(usize)

§

Pop(usize)

§

Fail(Box<NCommand>)

§

Input

Fields

§name: Symbol
§file: String

Implementations§

source§

impl NCommand

source

pub fn to_command(&self) -> Command

source

pub fn map_exprs(&self, f: &mut impl FnMut(&NormExpr) -> NormExpr) -> NCommand

Trait Implementations§

source§

impl Clone for NCommand

source§

fn clone(&self) -> NCommand

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for NCommand

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Display for NCommand

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Hash for NCommand

source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl PartialEq<NCommand> for NCommand

source§

fn eq(&self, other: &NCommand) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl Eq for NCommand

source§

impl StructuralEq for NCommand

source§

impl StructuralPartialEq for NCommand

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CallHasher for Twhere + T: Hash + ?Sized,

§

fn get_hash<H, B>(value: &H, build_hasher: &B) -> u64where + H: Hash + ?Sized, + B: BuildHasher,

§

impl<Q, K> Equivalent<K> for Qwhere + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Qwhere + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToOwned for Twhere + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for Twhere + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

\ No newline at end of file diff --git a/docs/egglog/ast/enum.NormAction.html b/docs/egglog/ast/enum.NormAction.html new file mode 100644 index 000000000..54dea96e5 --- /dev/null +++ b/docs/egglog/ast/enum.NormAction.html @@ -0,0 +1,34 @@ +NormAction in egglog::ast - Rust

Enum egglog::ast::NormAction

source ·
pub enum NormAction {
+    Let(Symbol, NormExpr),
+    LetVar(Symbol, Symbol),
+    LetLit(Symbol, Literal),
+    Extract(Symbol, Symbol),
+    Set(NormExpr, Symbol),
+    Delete(NormExpr),
+    Union(Symbol, Symbol),
+    Panic(String),
+}

Variants§

Implementations§

source§

impl NormAction

source

pub fn to_action(&self) -> Action

source

pub fn map_exprs(&self, f: &mut impl FnMut(&NormExpr) -> NormExpr) -> NormAction

Trait Implementations§

source§

impl Clone for NormAction

source§

fn clone(&self) -> NormAction

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for NormAction

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Display for NormAction

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Hash for NormAction

source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl PartialEq<NormAction> for NormAction

source§

fn eq(&self, other: &NormAction) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl Eq for NormAction

source§

impl StructuralEq for NormAction

source§

impl StructuralPartialEq for NormAction

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CallHasher for Twhere + T: Hash + ?Sized,

§

fn get_hash<H, B>(value: &H, build_hasher: &B) -> u64where + H: Hash + ?Sized, + B: BuildHasher,

§

impl<Q, K> Equivalent<K> for Qwhere + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Qwhere + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToOwned for Twhere + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for Twhere + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

\ No newline at end of file diff --git a/docs/egglog/ast/enum.NormExpr.html b/docs/egglog/ast/enum.NormExpr.html new file mode 100644 index 000000000..6a3838f15 --- /dev/null +++ b/docs/egglog/ast/enum.NormExpr.html @@ -0,0 +1,34 @@ +NormExpr in egglog::ast - Rust

Enum egglog::ast::NormExpr

source ·
pub enum NormExpr {
+    Call(Symbol, Vec<Symbol>),
+}

Variants§

Implementations§

source§

impl NormExpr

source

pub fn to_expr(&self) -> Expr

Trait Implementations§

source§

impl Clone for NormExpr

source§

fn clone(&self) -> NormExpr

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for NormExpr

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Display for NormExpr

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Hash for NormExpr

source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl Ord for NormExpr

source§

fn cmp(&self, other: &NormExpr) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · source§

fn max(self, other: Self) -> Selfwhere + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · source§

fn min(self, other: Self) -> Selfwhere + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · source§

fn clamp(self, min: Self, max: Self) -> Selfwhere + Self: Sized + PartialOrd<Self>,

Restrict a value to a certain interval. Read more
source§

impl PartialEq<NormExpr> for NormExpr

source§

fn eq(&self, other: &NormExpr) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PartialOrd<NormExpr> for NormExpr

source§

fn partial_cmp(&self, other: &NormExpr) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · source§

fn lt(&self, other: &Rhs) -> bool

This method tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · source§

fn le(&self, other: &Rhs) -> bool

This method tests less than or equal to (for self and other) and is used by the <= +operator. Read more
1.0.0 · source§

fn gt(&self, other: &Rhs) -> bool

This method tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 · source§

fn ge(&self, other: &Rhs) -> bool

This method tests greater than or equal to (for self and other) and is used by the >= +operator. Read more
source§

impl Eq for NormExpr

source§

impl StructuralEq for NormExpr

source§

impl StructuralPartialEq for NormExpr

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CallHasher for Twhere + T: Hash + ?Sized,

§

fn get_hash<H, B>(value: &H, build_hasher: &B) -> u64where + H: Hash + ?Sized, + B: BuildHasher,

§

impl<Q, K> Comparable<K> for Qwhere + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
§

impl<Q, K> Equivalent<K> for Qwhere + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Qwhere + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToOwned for Twhere + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for Twhere + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

\ No newline at end of file diff --git a/docs/egglog/ast/enum.NormFact.html b/docs/egglog/ast/enum.NormFact.html new file mode 100644 index 000000000..4019b9468 --- /dev/null +++ b/docs/egglog/ast/enum.NormFact.html @@ -0,0 +1,31 @@ +NormFact in egglog::ast - Rust

Enum egglog::ast::NormFact

source ·
pub enum NormFact {
+    Assign(Symbol, NormExpr),
+    AssignVar(Symbol, Symbol),
+    Compute(Symbol, NormExpr),
+    AssignLit(Symbol, Literal),
+    ConstrainEq(Symbol, Symbol),
+}

Variants§

§

Assign(Symbol, NormExpr)

§

AssignVar(Symbol, Symbol)

§

Compute(Symbol, NormExpr)

§

AssignLit(Symbol, Literal)

§

ConstrainEq(Symbol, Symbol)

Implementations§

source§

impl NormFact

source

pub fn to_fact(&self) -> Fact

source

pub fn map_exprs(&self, f: &mut impl FnMut(&NormExpr) -> NormExpr) -> NormFact

Trait Implementations§

source§

impl Clone for NormFact

source§

fn clone(&self) -> NormFact

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for NormFact

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Display for NormFact

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Hash for NormFact

source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl PartialEq<NormFact> for NormFact

source§

fn eq(&self, other: &NormFact) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl Eq for NormFact

source§

impl StructuralEq for NormFact

source§

impl StructuralPartialEq for NormFact

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CallHasher for Twhere + T: Hash + ?Sized,

§

fn get_hash<H, B>(value: &H, build_hasher: &B) -> u64where + H: Hash + ?Sized, + B: BuildHasher,

§

impl<Q, K> Equivalent<K> for Qwhere + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Qwhere + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToOwned for Twhere + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for Twhere + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

\ No newline at end of file diff --git a/docs/egglog/ast/enum.NormSchedule.html b/docs/egglog/ast/enum.NormSchedule.html new file mode 100644 index 000000000..047f62f8d --- /dev/null +++ b/docs/egglog/ast/enum.NormSchedule.html @@ -0,0 +1,33 @@ +NormSchedule in egglog::ast - Rust

Enum egglog::ast::NormSchedule

source ·
pub enum NormSchedule {
+    Saturate(Box<NormSchedule>),
+    Repeat(usize, Box<NormSchedule>),
+    Run(NormRunConfig),
+    Sequence(Vec<NormSchedule>),
+}

Variants§

Implementations§

source§

impl NormSchedule

source

pub fn map_run_commands( + &self, + f: &mut impl FnMut(&NormRunConfig) -> Schedule +) -> Schedule

Trait Implementations§

source§

impl Clone for NormSchedule

source§

fn clone(&self) -> NormSchedule

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for NormSchedule

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Display for NormSchedule

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Hash for NormSchedule

source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl PartialEq<NormSchedule> for NormSchedule

source§

fn eq(&self, other: &NormSchedule) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl Eq for NormSchedule

source§

impl StructuralEq for NormSchedule

source§

impl StructuralPartialEq for NormSchedule

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CallHasher for Twhere + T: Hash + ?Sized,

§

fn get_hash<H, B>(value: &H, build_hasher: &B) -> u64where + H: Hash + ?Sized, + B: BuildHasher,

§

impl<Q, K> Equivalent<K> for Qwhere + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Qwhere + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToOwned for Twhere + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for Twhere + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

\ No newline at end of file diff --git a/docs/egglog/ast/enum.Schedule.html b/docs/egglog/ast/enum.Schedule.html new file mode 100644 index 000000000..a1d7885bc --- /dev/null +++ b/docs/egglog/ast/enum.Schedule.html @@ -0,0 +1,30 @@ +Schedule in egglog::ast - Rust

Enum egglog::ast::Schedule

source ·
pub enum Schedule {
+    Saturate(Box<Schedule>),
+    Repeat(usize, Box<Schedule>),
+    Run(RunConfig),
+    Sequence(Vec<Schedule>),
+}

Variants§

§

Saturate(Box<Schedule>)

§

Repeat(usize, Box<Schedule>)

§

Run(RunConfig)

§

Sequence(Vec<Schedule>)

Trait Implementations§

source§

impl Clone for Schedule

source§

fn clone(&self) -> Schedule

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for Schedule

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Display for Schedule

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Hash for Schedule

source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl PartialEq<Schedule> for Schedule

source§

fn eq(&self, other: &Schedule) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl Eq for Schedule

source§

impl StructuralEq for Schedule

source§

impl StructuralPartialEq for Schedule

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CallHasher for Twhere + T: Hash + ?Sized,

§

fn get_hash<H, B>(value: &H, build_hasher: &B) -> u64where + H: Hash + ?Sized, + B: BuildHasher,

§

impl<Q, K> Equivalent<K> for Qwhere + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Qwhere + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToOwned for Twhere + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for Twhere + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

\ No newline at end of file diff --git a/docs/egglog/ast/expr/enum.Expr.html b/docs/egglog/ast/expr/enum.Expr.html new file mode 100644 index 000000000..1245f182e --- /dev/null +++ b/docs/egglog/ast/expr/enum.Expr.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../egglog/ast/enum.Expr.html...

+ + + \ No newline at end of file diff --git a/docs/egglog/ast/expr/enum.Literal.html b/docs/egglog/ast/expr/enum.Literal.html new file mode 100644 index 000000000..a25b001bc --- /dev/null +++ b/docs/egglog/ast/expr/enum.Literal.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../egglog/ast/enum.Literal.html...

+ + + \ No newline at end of file diff --git a/docs/egglog/ast/expr/enum.NormExpr.html b/docs/egglog/ast/expr/enum.NormExpr.html new file mode 100644 index 000000000..b78bf1e86 --- /dev/null +++ b/docs/egglog/ast/expr/enum.NormExpr.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../egglog/ast/enum.NormExpr.html...

+ + + \ No newline at end of file diff --git a/docs/egglog/ast/index.html b/docs/egglog/ast/index.html new file mode 100644 index 000000000..06b194070 --- /dev/null +++ b/docs/egglog/ast/index.html @@ -0,0 +1 @@ +egglog::ast - Rust

Module egglog::ast

source ·

Modules

Structs

Enums

Type Definitions

\ No newline at end of file diff --git a/docs/egglog/ast/parse/__parse__Action/struct.ActionParser.html b/docs/egglog/ast/parse/__parse__Action/struct.ActionParser.html new file mode 100644 index 000000000..00746efca --- /dev/null +++ b/docs/egglog/ast/parse/__parse__Action/struct.ActionParser.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../../egglog/ast/parse/struct.ActionParser.html...

+ + + \ No newline at end of file diff --git a/docs/egglog/ast/parse/__parse__Expr/struct.ExprParser.html b/docs/egglog/ast/parse/__parse__Expr/struct.ExprParser.html new file mode 100644 index 000000000..fa588ab80 --- /dev/null +++ b/docs/egglog/ast/parse/__parse__Expr/struct.ExprParser.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../../egglog/ast/parse/struct.ExprParser.html...

+ + + \ No newline at end of file diff --git a/docs/egglog/ast/parse/__parse__Fact/struct.FactParser.html b/docs/egglog/ast/parse/__parse__Fact/struct.FactParser.html new file mode 100644 index 000000000..f0836d5b9 --- /dev/null +++ b/docs/egglog/ast/parse/__parse__Fact/struct.FactParser.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../../egglog/ast/parse/struct.FactParser.html...

+ + + \ No newline at end of file diff --git a/docs/egglog/ast/parse/__parse__Program/struct.ProgramParser.html b/docs/egglog/ast/parse/__parse__Program/struct.ProgramParser.html new file mode 100644 index 000000000..f0246fcd8 --- /dev/null +++ b/docs/egglog/ast/parse/__parse__Program/struct.ProgramParser.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../../egglog/ast/parse/struct.ProgramParser.html...

+ + + \ No newline at end of file diff --git a/docs/egglog/ast/parse/index.html b/docs/egglog/ast/parse/index.html new file mode 100644 index 000000000..c1a8a75fa --- /dev/null +++ b/docs/egglog/ast/parse/index.html @@ -0,0 +1 @@ +egglog::ast::parse - Rust

Module egglog::ast::parse

source ·

Structs

Traits

\ No newline at end of file diff --git a/docs/egglog/ast/parse/sidebar-items.js b/docs/egglog/ast/parse/sidebar-items.js new file mode 100644 index 000000000..27ccf0b69 --- /dev/null +++ b/docs/egglog/ast/parse/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"struct":["ActionParser","ExprParser","FactParser","ProgramParser"],"trait":["__ToTriple"]}; \ No newline at end of file diff --git a/docs/egglog/ast/parse/struct.ActionParser.html b/docs/egglog/ast/parse/struct.ActionParser.html new file mode 100644 index 000000000..369e58134 --- /dev/null +++ b/docs/egglog/ast/parse/struct.ActionParser.html @@ -0,0 +1,15 @@ +ActionParser in egglog::ast::parse - Rust

Struct egglog::ast::parse::ActionParser

source ·
pub struct ActionParser { /* private fields */ }

Implementations§

source§

impl ActionParser

source

pub fn new() -> ActionParser

source

pub fn parse<'input>( + &self, + input: &'input str +) -> Result<Action, ParseError<usize, Token<'input>, String>>

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

\ No newline at end of file diff --git a/docs/egglog/ast/parse/struct.ExprParser.html b/docs/egglog/ast/parse/struct.ExprParser.html new file mode 100644 index 000000000..69e61b333 --- /dev/null +++ b/docs/egglog/ast/parse/struct.ExprParser.html @@ -0,0 +1,15 @@ +ExprParser in egglog::ast::parse - Rust

Struct egglog::ast::parse::ExprParser

source ·
pub struct ExprParser { /* private fields */ }

Implementations§

source§

impl ExprParser

source

pub fn new() -> ExprParser

source

pub fn parse<'input>( + &self, + input: &'input str +) -> Result<Expr, ParseError<usize, Token<'input>, String>>

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

\ No newline at end of file diff --git a/docs/egglog/ast/parse/struct.FactParser.html b/docs/egglog/ast/parse/struct.FactParser.html new file mode 100644 index 000000000..49bc22211 --- /dev/null +++ b/docs/egglog/ast/parse/struct.FactParser.html @@ -0,0 +1,15 @@ +FactParser in egglog::ast::parse - Rust

Struct egglog::ast::parse::FactParser

source ·
pub struct FactParser { /* private fields */ }

Implementations§

source§

impl FactParser

source

pub fn new() -> FactParser

source

pub fn parse<'input>( + &self, + input: &'input str +) -> Result<Fact, ParseError<usize, Token<'input>, String>>

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

\ No newline at end of file diff --git a/docs/egglog/ast/parse/struct.ProgramParser.html b/docs/egglog/ast/parse/struct.ProgramParser.html new file mode 100644 index 000000000..a0e8e645c --- /dev/null +++ b/docs/egglog/ast/parse/struct.ProgramParser.html @@ -0,0 +1,15 @@ +ProgramParser in egglog::ast::parse - Rust

Struct egglog::ast::parse::ProgramParser

source ·
pub struct ProgramParser { /* private fields */ }

Implementations§

source§

impl ProgramParser

source

pub fn new() -> ProgramParser

source

pub fn parse<'input>( + &self, + input: &'input str +) -> Result<Vec<Command>, ParseError<usize, Token<'input>, String>>

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

\ No newline at end of file diff --git a/docs/egglog/ast/parse/trait.__ToTriple.html b/docs/egglog/ast/parse/trait.__ToTriple.html new file mode 100644 index 000000000..c5062c47c --- /dev/null +++ b/docs/egglog/ast/parse/trait.__ToTriple.html @@ -0,0 +1,12 @@ +__ToTriple in egglog::ast::parse - Rust

Trait egglog::ast::parse::__ToTriple

source ·
pub trait __ToTriple<'input> {
+    // Required method
+    fn to_triple(
+        value: Self
+    ) -> Result<(usize, Token<'input>, usize), ParseError<usize, Token<'input>, String>>;
+}

Required Methods§

source

fn to_triple( + value: Self +) -> Result<(usize, Token<'input>, usize), ParseError<usize, Token<'input>, String>>

Implementations on Foreign Types§

source§

impl<'input> __ToTriple<'input> for (usize, Token<'input>, usize)

source§

fn to_triple( + value: Self +) -> Result<(usize, Token<'input>, usize), ParseError<usize, Token<'input>, String>>

source§

impl<'input> __ToTriple<'input> for Result<(usize, Token<'input>, usize), String>

source§

fn to_triple( + value: Self +) -> Result<(usize, Token<'input>, usize), ParseError<usize, Token<'input>, String>>

Implementors§

\ No newline at end of file diff --git a/docs/egglog/ast/sidebar-items.js b/docs/egglog/ast/sidebar-items.js new file mode 100644 index 000000000..287582f0e --- /dev/null +++ b/docs/egglog/ast/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"enum":["Action","Command","Expr","Fact","Literal","NCommand","NormAction","NormExpr","NormFact","NormSchedule","Schedule"],"mod":["desugar","parse"],"struct":["FunctionDecl","Id","IdentSort","Metadata","NormCommand","NormRule","NormRunConfig","Rewrite","Rule","RunConfig","Schema","Symbol","Variant"],"type":["CommandId"]}; \ No newline at end of file diff --git a/docs/egglog/ast/struct.FunctionDecl.html b/docs/egglog/ast/struct.FunctionDecl.html new file mode 100644 index 000000000..cb36aa65e --- /dev/null +++ b/docs/egglog/ast/struct.FunctionDecl.html @@ -0,0 +1,32 @@ +FunctionDecl in egglog::ast - Rust

Struct egglog::ast::FunctionDecl

source ·
pub struct FunctionDecl {
+    pub name: Symbol,
+    pub schema: Schema,
+    pub default: Option<Expr>,
+    pub merge: Option<Expr>,
+    pub merge_action: Vec<Action>,
+    pub cost: Option<usize>,
+    pub unextractable: bool,
+}

Fields§

§name: Symbol§schema: Schema§default: Option<Expr>§merge: Option<Expr>§merge_action: Vec<Action>§cost: Option<usize>§unextractable: bool

Implementations§

source§

impl FunctionDecl

source

pub fn relation(name: Symbol, input: Vec<Symbol>) -> Self

Trait Implementations§

source§

impl Clone for FunctionDecl

source§

fn clone(&self) -> FunctionDecl

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for FunctionDecl

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Hash for FunctionDecl

source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl PartialEq<FunctionDecl> for FunctionDecl

source§

fn eq(&self, other: &FunctionDecl) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl Eq for FunctionDecl

source§

impl StructuralEq for FunctionDecl

source§

impl StructuralPartialEq for FunctionDecl

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CallHasher for Twhere + T: Hash + ?Sized,

§

fn get_hash<H, B>(value: &H, build_hasher: &B) -> u64where + H: Hash + ?Sized, + B: BuildHasher,

§

impl<Q, K> Equivalent<K> for Qwhere + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Qwhere + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToOwned for Twhere + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

\ No newline at end of file diff --git a/docs/egglog/ast/struct.Id.html b/docs/egglog/ast/struct.Id.html new file mode 100644 index 000000000..f83b57258 --- /dev/null +++ b/docs/egglog/ast/struct.Id.html @@ -0,0 +1,33 @@ +Id in egglog::ast - Rust

Struct egglog::ast::Id

source ·
pub struct Id(_);

Trait Implementations§

source§

impl Clone for Id

source§

fn clone(&self) -> Id

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for Id

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Display for Id

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl From<Id> for usize

source§

fn from(id: Id) -> Self

Converts to this type from the input type.
source§

impl From<usize> for Id

source§

fn from(n: usize) -> Self

Converts to this type from the input type.
source§

impl Hash for Id

source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl Ord for Id

source§

fn cmp(&self, other: &Id) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · source§

fn max(self, other: Self) -> Selfwhere + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · source§

fn min(self, other: Self) -> Selfwhere + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · source§

fn clamp(self, min: Self, max: Self) -> Selfwhere + Self: Sized + PartialOrd<Self>,

Restrict a value to a certain interval. Read more
source§

impl PartialEq<Id> for Id

source§

fn eq(&self, other: &Id) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PartialOrd<Id> for Id

source§

fn partial_cmp(&self, other: &Id) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · source§

fn lt(&self, other: &Rhs) -> bool

This method tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · source§

fn le(&self, other: &Rhs) -> bool

This method tests less than or equal to (for self and other) and is used by the <= +operator. Read more
1.0.0 · source§

fn gt(&self, other: &Rhs) -> bool

This method tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 · source§

fn ge(&self, other: &Rhs) -> bool

This method tests greater than or equal to (for self and other) and is used by the >= +operator. Read more
source§

impl Copy for Id

source§

impl Eq for Id

source§

impl StructuralEq for Id

source§

impl StructuralPartialEq for Id

Auto Trait Implementations§

§

impl RefUnwindSafe for Id

§

impl Send for Id

§

impl Sync for Id

§

impl Unpin for Id

§

impl UnwindSafe for Id

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CallHasher for Twhere + T: Hash + ?Sized,

§

fn get_hash<H, B>(value: &H, build_hasher: &B) -> u64where + H: Hash + ?Sized, + B: BuildHasher,

§

impl<Q, K> Comparable<K> for Qwhere + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
§

impl<Q, K> Equivalent<K> for Qwhere + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Qwhere + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToOwned for Twhere + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for Twhere + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

source§

impl<T> RuleType for Twhere + T: Copy + Debug + Eq + Hash + Ord,

\ No newline at end of file diff --git a/docs/egglog/ast/struct.IdentSort.html b/docs/egglog/ast/struct.IdentSort.html new file mode 100644 index 000000000..e2a1d00e8 --- /dev/null +++ b/docs/egglog/ast/struct.IdentSort.html @@ -0,0 +1,28 @@ +IdentSort in egglog::ast - Rust

Struct egglog::ast::IdentSort

source ·
pub struct IdentSort {
+    pub ident: Symbol,
+    pub sort: Symbol,
+}

Fields§

§ident: Symbol§sort: Symbol

Trait Implementations§

source§

impl Clone for IdentSort

source§

fn clone(&self) -> IdentSort

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for IdentSort

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Display for IdentSort

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Hash for IdentSort

source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl PartialEq<IdentSort> for IdentSort

source§

fn eq(&self, other: &IdentSort) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl Eq for IdentSort

source§

impl StructuralEq for IdentSort

source§

impl StructuralPartialEq for IdentSort

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CallHasher for Twhere + T: Hash + ?Sized,

§

fn get_hash<H, B>(value: &H, build_hasher: &B) -> u64where + H: Hash + ?Sized, + B: BuildHasher,

§

impl<Q, K> Equivalent<K> for Qwhere + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Qwhere + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToOwned for Twhere + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for Twhere + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

\ No newline at end of file diff --git a/docs/egglog/ast/struct.Metadata.html b/docs/egglog/ast/struct.Metadata.html new file mode 100644 index 000000000..c199d3b0f --- /dev/null +++ b/docs/egglog/ast/struct.Metadata.html @@ -0,0 +1,26 @@ +Metadata in egglog::ast - Rust

Struct egglog::ast::Metadata

source ·
pub struct Metadata {
+    pub id: CommandId,
+}

Fields§

§id: CommandId

Trait Implementations§

source§

impl Clone for Metadata

source§

fn clone(&self) -> Metadata

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for Metadata

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Hash for Metadata

source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl PartialEq<Metadata> for Metadata

source§

fn eq(&self, other: &Metadata) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl Eq for Metadata

source§

impl StructuralEq for Metadata

source§

impl StructuralPartialEq for Metadata

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CallHasher for Twhere + T: Hash + ?Sized,

§

fn get_hash<H, B>(value: &H, build_hasher: &B) -> u64where + H: Hash + ?Sized, + B: BuildHasher,

§

impl<Q, K> Equivalent<K> for Qwhere + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Qwhere + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToOwned for Twhere + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

\ No newline at end of file diff --git a/docs/egglog/ast/struct.NormCommand.html b/docs/egglog/ast/struct.NormCommand.html new file mode 100644 index 000000000..ed99c6a89 --- /dev/null +++ b/docs/egglog/ast/struct.NormCommand.html @@ -0,0 +1,28 @@ +NormCommand in egglog::ast - Rust

Struct egglog::ast::NormCommand

source ·
pub struct NormCommand {
+    pub metadata: Metadata,
+    pub command: NCommand,
+}

Fields§

§metadata: Metadata§command: NCommand

Implementations§

Trait Implementations§

source§

impl Clone for NormCommand

source§

fn clone(&self) -> NormCommand

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for NormCommand

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Display for NormCommand

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Hash for NormCommand

source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl PartialEq<NormCommand> for NormCommand

source§

fn eq(&self, other: &NormCommand) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl Eq for NormCommand

source§

impl StructuralEq for NormCommand

source§

impl StructuralPartialEq for NormCommand

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CallHasher for Twhere + T: Hash + ?Sized,

§

fn get_hash<H, B>(value: &H, build_hasher: &B) -> u64where + H: Hash + ?Sized, + B: BuildHasher,

§

impl<Q, K> Equivalent<K> for Qwhere + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Qwhere + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToOwned for Twhere + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for Twhere + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

\ No newline at end of file diff --git a/docs/egglog/ast/struct.NormRule.html b/docs/egglog/ast/struct.NormRule.html new file mode 100644 index 000000000..0ec98f191 --- /dev/null +++ b/docs/egglog/ast/struct.NormRule.html @@ -0,0 +1,36 @@ +NormRule in egglog::ast - Rust

Struct egglog::ast::NormRule

source ·
pub struct NormRule {
+    pub head: Vec<NormAction>,
+    pub body: Vec<NormFact>,
+}

Fields§

§head: Vec<NormAction>§body: Vec<NormFact>

Implementations§

source§

impl NormRule

source

pub fn to_rule(&self) -> Rule

source

pub fn globals_used_in_matcher( + facts: &Vec<NormFact> +) -> HashSet<Symbol, BuildHasherDefault<FxHasher>>

source

pub fn resugar_facts( + facts: &Vec<NormFact>, + subst: &mut HashMap<Symbol, Expr, BuildHasherDefault<FxHasher>> +) -> Vec<Fact>

source

pub fn resugar_actions( + &self, + subst: &mut HashMap<Symbol, Expr, BuildHasherDefault<FxHasher>> +) -> Vec<Action>

source

pub fn resugar(&self) -> Rule

source

pub fn map_exprs(&self, f: &mut impl FnMut(&NormExpr) -> NormExpr) -> Self

source

pub fn map_def_use(&self, fvar: &mut impl FnMut(Symbol, bool) -> Symbol) -> Self

Trait Implementations§

source§

impl Clone for NormRule

source§

fn clone(&self) -> NormRule

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for NormRule

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Display for NormRule

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Hash for NormRule

source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl PartialEq<NormRule> for NormRule

source§

fn eq(&self, other: &NormRule) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl Eq for NormRule

source§

impl StructuralEq for NormRule

source§

impl StructuralPartialEq for NormRule

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CallHasher for Twhere + T: Hash + ?Sized,

§

fn get_hash<H, B>(value: &H, build_hasher: &B) -> u64where + H: Hash + ?Sized, + B: BuildHasher,

§

impl<Q, K> Equivalent<K> for Qwhere + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Qwhere + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToOwned for Twhere + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for Twhere + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

\ No newline at end of file diff --git a/docs/egglog/ast/struct.NormRunConfig.html b/docs/egglog/ast/struct.NormRunConfig.html new file mode 100644 index 000000000..971187561 --- /dev/null +++ b/docs/egglog/ast/struct.NormRunConfig.html @@ -0,0 +1,27 @@ +NormRunConfig in egglog::ast - Rust

Struct egglog::ast::NormRunConfig

source ·
pub struct NormRunConfig {
+    pub ruleset: Symbol,
+    pub until: Option<Vec<NormFact>>,
+}

Fields§

§ruleset: Symbol§until: Option<Vec<NormFact>>

Implementations§

Trait Implementations§

source§

impl Clone for NormRunConfig

source§

fn clone(&self) -> NormRunConfig

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for NormRunConfig

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Hash for NormRunConfig

source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl PartialEq<NormRunConfig> for NormRunConfig

source§

fn eq(&self, other: &NormRunConfig) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl Eq for NormRunConfig

source§

impl StructuralEq for NormRunConfig

source§

impl StructuralPartialEq for NormRunConfig

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CallHasher for Twhere + T: Hash + ?Sized,

§

fn get_hash<H, B>(value: &H, build_hasher: &B) -> u64where + H: Hash + ?Sized, + B: BuildHasher,

§

impl<Q, K> Equivalent<K> for Qwhere + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Qwhere + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToOwned for Twhere + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

\ No newline at end of file diff --git a/docs/egglog/ast/struct.Rewrite.html b/docs/egglog/ast/struct.Rewrite.html new file mode 100644 index 000000000..f22d223e8 --- /dev/null +++ b/docs/egglog/ast/struct.Rewrite.html @@ -0,0 +1,18 @@ +Rewrite in egglog::ast - Rust

Struct egglog::ast::Rewrite

source ·
pub struct Rewrite {
+    pub lhs: Expr,
+    pub rhs: Expr,
+    pub conditions: Vec<Fact>,
+}

Fields§

§lhs: Expr§rhs: Expr§conditions: Vec<Fact>

Trait Implementations§

source§

impl Clone for Rewrite

source§

fn clone(&self) -> Rewrite

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for Rewrite

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Display for Rewrite

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToOwned for Twhere + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for Twhere + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

\ No newline at end of file diff --git a/docs/egglog/ast/struct.Rule.html b/docs/egglog/ast/struct.Rule.html new file mode 100644 index 000000000..e9e3f88bb --- /dev/null +++ b/docs/egglog/ast/struct.Rule.html @@ -0,0 +1,17 @@ +Rule in egglog::ast - Rust

Struct egglog::ast::Rule

source ·
pub struct Rule {
+    pub head: Vec<Action>,
+    pub body: Vec<Fact>,
+}

Fields§

§head: Vec<Action>§body: Vec<Fact>

Implementations§

source§

impl Rule

source

pub fn map_exprs(&self, f: &mut impl FnMut(&Expr) -> Expr) -> Self

Trait Implementations§

source§

impl Clone for Rule

source§

fn clone(&self) -> Rule

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for Rule

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Display for Rule

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

impl RefUnwindSafe for Rule

§

impl Send for Rule

§

impl Sync for Rule

§

impl Unpin for Rule

§

impl UnwindSafe for Rule

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToOwned for Twhere + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for Twhere + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

\ No newline at end of file diff --git a/docs/egglog/ast/struct.RunConfig.html b/docs/egglog/ast/struct.RunConfig.html new file mode 100644 index 000000000..ec06eee7a --- /dev/null +++ b/docs/egglog/ast/struct.RunConfig.html @@ -0,0 +1,27 @@ +RunConfig in egglog::ast - Rust

Struct egglog::ast::RunConfig

source ·
pub struct RunConfig {
+    pub ruleset: Symbol,
+    pub until: Option<Vec<Fact>>,
+}

Fields§

§ruleset: Symbol§until: Option<Vec<Fact>>

Trait Implementations§

source§

impl Clone for RunConfig

source§

fn clone(&self) -> RunConfig

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for RunConfig

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Hash for RunConfig

source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl PartialEq<RunConfig> for RunConfig

source§

fn eq(&self, other: &RunConfig) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl Eq for RunConfig

source§

impl StructuralEq for RunConfig

source§

impl StructuralPartialEq for RunConfig

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CallHasher for Twhere + T: Hash + ?Sized,

§

fn get_hash<H, B>(value: &H, build_hasher: &B) -> u64where + H: Hash + ?Sized, + B: BuildHasher,

§

impl<Q, K> Equivalent<K> for Qwhere + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Qwhere + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToOwned for Twhere + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

\ No newline at end of file diff --git a/docs/egglog/ast/struct.Schema.html b/docs/egglog/ast/struct.Schema.html new file mode 100644 index 000000000..6f750a685 --- /dev/null +++ b/docs/egglog/ast/struct.Schema.html @@ -0,0 +1,27 @@ +Schema in egglog::ast - Rust

Struct egglog::ast::Schema

source ·
pub struct Schema {
+    pub input: Vec<Symbol>,
+    pub output: Symbol,
+}

Fields§

§input: Vec<Symbol>§output: Symbol

Implementations§

source§

impl Schema

source

pub fn new(input: Vec<Symbol>, output: Symbol) -> Self

Trait Implementations§

source§

impl Clone for Schema

source§

fn clone(&self) -> Schema

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for Schema

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Hash for Schema

source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl PartialEq<Schema> for Schema

source§

fn eq(&self, other: &Schema) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl Eq for Schema

source§

impl StructuralEq for Schema

source§

impl StructuralPartialEq for Schema

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CallHasher for Twhere + T: Hash + ?Sized,

§

fn get_hash<H, B>(value: &H, build_hasher: &B) -> u64where + H: Hash + ?Sized, + B: BuildHasher,

§

impl<Q, K> Equivalent<K> for Qwhere + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Qwhere + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToOwned for Twhere + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

\ No newline at end of file diff --git a/docs/egglog/ast/struct.Symbol.html b/docs/egglog/ast/struct.Symbol.html new file mode 100644 index 000000000..9d51599bb --- /dev/null +++ b/docs/egglog/ast/struct.Symbol.html @@ -0,0 +1,45 @@ +Symbol in egglog::ast - Rust

Struct egglog::ast::Symbol

pub struct Symbol(_);
Expand description

A interned string in the global symbol table.

+

This requires the global feature on the crate.

+

GlobalSymbol is a wrapper around [Symbol] that knows to refer to a +built-in, global [SymbolTable]. Strings into the global table are never freed.

+

This enables a lot of convience methods and trait implementations over +GlobalSymbol (see below). In particular, +you can convert it to &'static str, +convert From and Into a &str, +and de/serialize using serde if the serde feature is enabled.

+

Implementations§

§

impl GlobalSymbol

pub fn new(s: impl AsRef<str>) -> GlobalSymbol

Intern a string into the global symbol table.

+

pub fn as_str(&self) -> &'static str

Convert this symbol into the string in the static, global symbol table.

+

Trait Implementations§

§

impl Clone for GlobalSymbol

§

fn clone(&self) -> GlobalSymbol

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
§

impl Debug for GlobalSymbol

§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
§

impl Display for GlobalSymbol

§

fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error>

Formats the value using the given formatter. Read more
§

impl From<&String> for GlobalSymbol

§

fn from(s: &String) -> GlobalSymbol

Converts to this type from the input type.
§

impl From<&str> for GlobalSymbol

§

fn from(s: &str) -> GlobalSymbol

Converts to this type from the input type.
§

impl From<GlobalSymbol> for &'static str

§

fn from(sym: GlobalSymbol) -> &'static str

Converts to this type from the input type.
source§

impl From<GlobalSymbol> for Literal

source§

fn from(t: Symbol) -> Self

Converts to this type from the input type.
source§

impl From<GlobalSymbol> for Value

source§

fn from(s: Symbol) -> Self

Converts to this type from the input type.
source§

impl From<Literal> for Symbol

source§

fn from(literal: Literal) -> Self

Converts to this type from the input type.
§

impl From<NonZeroU32> for GlobalSymbol

§

fn from(n: NonZeroU32) -> GlobalSymbol

Converts to this type from the input type.
§

impl From<String> for GlobalSymbol

§

fn from(s: String) -> GlobalSymbol

Converts to this type from the input type.
source§

impl FromSort for Symbol

§

type Sort = StringSort

source§

fn load(_sort: &Self::Sort, value: &Value) -> Self

§

impl FromStr for GlobalSymbol

§

type Err = Infallible

The associated error which can be returned from parsing.
§

fn from_str(s: &str) -> Result<GlobalSymbol, <GlobalSymbol as FromStr>::Err>

Parses a string s to return a value of this type. Read more
§

impl Hash for GlobalSymbol

§

fn hash<__H>(&self, state: &mut __H)where + __H: Hasher,

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl IntoSort for Symbol

§

type Sort = StringSort

source§

fn store(self, sort: &Self::Sort) -> Option<Value>

§

impl Ord for GlobalSymbol

§

fn cmp(&self, other: &GlobalSymbol) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · source§

fn max(self, other: Self) -> Selfwhere + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · source§

fn min(self, other: Self) -> Selfwhere + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · source§

fn clamp(self, min: Self, max: Self) -> Selfwhere + Self: Sized + PartialOrd<Self>,

Restrict a value to a certain interval. Read more
§

impl PartialEq<GlobalSymbol> for GlobalSymbol

§

fn eq(&self, other: &GlobalSymbol) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
§

impl PartialOrd<GlobalSymbol> for GlobalSymbol

§

fn partial_cmp(&self, other: &GlobalSymbol) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · source§

fn lt(&self, other: &Rhs) -> bool

This method tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · source§

fn le(&self, other: &Rhs) -> bool

This method tests less than or equal to (for self and other) and is used by the <= +operator. Read more
1.0.0 · source§

fn gt(&self, other: &Rhs) -> bool

This method tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 · source§

fn ge(&self, other: &Rhs) -> bool

This method tests greater than or equal to (for self and other) and is used by the >= +operator. Read more
§

impl Copy for GlobalSymbol

§

impl Eq for GlobalSymbol

§

impl StructuralEq for GlobalSymbol

§

impl StructuralPartialEq for GlobalSymbol

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CallHasher for Twhere + T: Hash + ?Sized,

§

fn get_hash<H, B>(value: &H, build_hasher: &B) -> u64where + H: Hash + ?Sized, + B: BuildHasher,

§

impl<Q, K> Comparable<K> for Qwhere + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
§

impl<Q, K> Equivalent<K> for Qwhere + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Qwhere + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToOwned for Twhere + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for Twhere + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

source§

impl<T> RuleType for Twhere + T: Copy + Debug + Eq + Hash + Ord,

\ No newline at end of file diff --git a/docs/egglog/ast/struct.Variant.html b/docs/egglog/ast/struct.Variant.html new file mode 100644 index 000000000..a0f88f6ca --- /dev/null +++ b/docs/egglog/ast/struct.Variant.html @@ -0,0 +1,28 @@ +Variant in egglog::ast - Rust

Struct egglog::ast::Variant

source ·
pub struct Variant {
+    pub name: Symbol,
+    pub types: Vec<Symbol>,
+    pub cost: Option<usize>,
+}

Fields§

§name: Symbol§types: Vec<Symbol>§cost: Option<usize>

Trait Implementations§

source§

impl Clone for Variant

source§

fn clone(&self) -> Variant

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for Variant

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Hash for Variant

source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl PartialEq<Variant> for Variant

source§

fn eq(&self, other: &Variant) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl Eq for Variant

source§

impl StructuralEq for Variant

source§

impl StructuralPartialEq for Variant

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CallHasher for Twhere + T: Hash + ?Sized,

§

fn get_hash<H, B>(value: &H, build_hasher: &B) -> u64where + H: Hash + ?Sized, + B: BuildHasher,

§

impl<Q, K> Equivalent<K> for Qwhere + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Qwhere + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToOwned for Twhere + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

\ No newline at end of file diff --git a/docs/egglog/ast/type.CommandId.html b/docs/egglog/ast/type.CommandId.html new file mode 100644 index 000000000..b892c88d7 --- /dev/null +++ b/docs/egglog/ast/type.CommandId.html @@ -0,0 +1 @@ +CommandId in egglog::ast - Rust

Type Definition egglog::ast::CommandId

source ·
pub type CommandId = usize;
\ No newline at end of file diff --git a/docs/egglog/constant.HIGH_COST.html b/docs/egglog/constant.HIGH_COST.html new file mode 100644 index 000000000..a5289b2de --- /dev/null +++ b/docs/egglog/constant.HIGH_COST.html @@ -0,0 +1 @@ +HIGH_COST in egglog - Rust

Constant egglog::HIGH_COST

source ·
pub const HIGH_COST: usize = _; // 9_223_372_036_854_775_807usize
\ No newline at end of file diff --git a/docs/egglog/constant.UNIT_SYM.html b/docs/egglog/constant.UNIT_SYM.html new file mode 100644 index 000000000..98d19ba8e --- /dev/null +++ b/docs/egglog/constant.UNIT_SYM.html @@ -0,0 +1 @@ +UNIT_SYM in egglog - Rust

Constant egglog::UNIT_SYM

source ·
pub const UNIT_SYM: &str = "Unit";
\ No newline at end of file diff --git a/docs/egglog/enum.CompilerPassStop.html b/docs/egglog/enum.CompilerPassStop.html new file mode 100644 index 000000000..9c5dd95fc --- /dev/null +++ b/docs/egglog/enum.CompilerPassStop.html @@ -0,0 +1,33 @@ +CompilerPassStop in egglog - Rust
pub enum CompilerPassStop {
+    Desugar,
+    TypecheckDesugared,
+    TermEncoding,
+    TypecheckTermEncoding,
+    Proofs,
+    TypecheckProofs,
+    All,
+}

Variants§

§

Desugar

§

TypecheckDesugared

§

TermEncoding

§

TypecheckTermEncoding

§

Proofs

§

TypecheckProofs

§

All

Trait Implementations§

source§

impl Clone for CompilerPassStop

source§

fn clone(&self) -> CompilerPassStop

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for CompilerPassStop

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Display for CompilerPassStop

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl FromStr for CompilerPassStop

§

type Err = String

The associated error which can be returned from parsing.
source§

fn from_str(s: &str) -> Result<Self, Self::Err>

Parses a string s to return a value of this type. Read more
source§

impl Hash for CompilerPassStop

source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl PartialEq<CompilerPassStop> for CompilerPassStop

source§

fn eq(&self, other: &CompilerPassStop) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl Copy for CompilerPassStop

source§

impl Eq for CompilerPassStop

source§

impl StructuralEq for CompilerPassStop

source§

impl StructuralPartialEq for CompilerPassStop

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CallHasher for Twhere + T: Hash + ?Sized,

§

fn get_hash<H, B>(value: &H, build_hasher: &B) -> u64where + H: Hash + ?Sized, + B: BuildHasher,

§

impl<Q, K> Equivalent<K> for Qwhere + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Qwhere + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToOwned for Twhere + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T> ToString for Twhere + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

\ No newline at end of file diff --git a/docs/egglog/enum.Error.html b/docs/egglog/enum.Error.html new file mode 100644 index 000000000..8bd3f0b94 --- /dev/null +++ b/docs/egglog/enum.Error.html @@ -0,0 +1,26 @@ +Error in egglog - Rust

Enum egglog::Error

source ·
pub enum Error {
+    ParseError(ParseError<usize, String, String>),
+    NotFoundError(NotFoundError),
+    TypeError(TypeError),
+    TypeErrors(Vec<TypeError>),
+    CheckError(Vec<NormFact>),
+    PrimitiveError(Primitive, Vec<Value>),
+    MergeError(Symbol, Value, Value),
+    Pop,
+    ExpectFail,
+    IoError(PathBuf, Error),
+}

Variants§

§

ParseError(ParseError<usize, String, String>)

§

NotFoundError(NotFoundError)

§

TypeError(TypeError)

§

TypeErrors(Vec<TypeError>)

§

CheckError(Vec<NormFact>)

§

PrimitiveError(Primitive, Vec<Value>)

§

MergeError(Symbol, Value, Value)

§

Pop

§

ExpectFail

§

IoError(PathBuf, Error)

Trait Implementations§

source§

impl Debug for Error

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Display for Error

source§

fn fmt(&self, __formatter: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Error for Error

source§

fn source(&self) -> Option<&(dyn Error + 'static)>

The lower-level source of this error, if any. Read more
1.0.0 · source§

fn description(&self) -> &str

👎Deprecated since 1.42.0: use the Display impl or to_string()
1.0.0 · source§

fn cause(&self) -> Option<&dyn Error>

👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
source§

fn provide<'a>(&'a self, demand: &mut Demand<'a>)

🔬This is a nightly-only experimental API. (error_generic_member_access)
Provides type based access to context intended for error reports. Read more
source§

impl From<NotFoundError> for Error

source§

fn from(source: NotFoundError) -> Self

Converts to this type from the input type.
source§

impl From<ParseError<usize, String, String>> for Error

source§

fn from(source: ParseError<usize, String, String>) -> Self

Converts to this type from the input type.

Auto Trait Implementations§

§

impl !RefUnwindSafe for Error

§

impl !Send for Error

§

impl !Sync for Error

§

impl Unpin for Error

§

impl !UnwindSafe for Error

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<E> Provider for Ewhere + E: Error + ?Sized,

source§

fn provide<'a>(&'a self, demand: &mut Demand<'a>)

🔬This is a nightly-only experimental API. (provide_any)
Data providers should implement this method to provide all values they are able to +provide by using demand. Read more
source§

impl<T> ToString for Twhere + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

\ No newline at end of file diff --git a/docs/egglog/enum.Term.html b/docs/egglog/enum.Term.html new file mode 100644 index 000000000..4a5e94300 --- /dev/null +++ b/docs/egglog/enum.Term.html @@ -0,0 +1,31 @@ +Term in egglog - Rust

Enum egglog::Term

source ·
pub enum Term {
+    Lit(Literal),
+    Var(Symbol),
+    App(Symbol, Vec<TermId>),
+}
Expand description

Like Exprs but with sharing and deduplication.

+

Terms refer to their children indirectly via opaque [TermId]s (internally +these are just usizes) that map into an ambient TermDag.

+

Variants§

§

Lit(Literal)

§

Var(Symbol)

§

App(Symbol, Vec<TermId>)

Trait Implementations§

source§

impl Clone for Term

source§

fn clone(&self) -> Term

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for Term

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Hash for Term

source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl PartialEq<Term> for Term

source§

fn eq(&self, other: &Term) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl Eq for Term

source§

impl StructuralEq for Term

source§

impl StructuralPartialEq for Term

Auto Trait Implementations§

§

impl RefUnwindSafe for Term

§

impl Send for Term

§

impl Sync for Term

§

impl Unpin for Term

§

impl UnwindSafe for Term

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CallHasher for Twhere + T: Hash + ?Sized,

§

fn get_hash<H, B>(value: &H, build_hasher: &B) -> u64where + H: Hash + ?Sized, + B: BuildHasher,

§

impl<Q, K> Equivalent<K> for Qwhere + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Qwhere + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToOwned for Twhere + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

\ No newline at end of file diff --git a/docs/egglog/index.html b/docs/egglog/index.html new file mode 100644 index 000000000..e0cb10dce --- /dev/null +++ b/docs/egglog/index.html @@ -0,0 +1 @@ +egglog - Rust

Crate egglog

source ·

Modules

Macros

Structs

Enums

Constants

Traits

Type Definitions

\ No newline at end of file diff --git a/docs/egglog/macro.add_primitives!.html b/docs/egglog/macro.add_primitives!.html new file mode 100644 index 000000000..08915a06e --- /dev/null +++ b/docs/egglog/macro.add_primitives!.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to macro.add_primitives.html...

+ + + \ No newline at end of file diff --git a/docs/egglog/macro.add_primitives.html b/docs/egglog/macro.add_primitives.html new file mode 100644 index 000000000..df8f9f065 --- /dev/null +++ b/docs/egglog/macro.add_primitives.html @@ -0,0 +1,6 @@ +add_primitives in egglog - Rust
macro_rules! add_primitives {
+    ($type_info:expr,
+        $name:literal = |$($param:ident : $param_t:ty),*| -> $ret:ty { $body:expr }
+        // $name2:literal = |$($param2:ident : $(&)? $base_param_t:ident),*| -> $ret2:ty { $body2:expr }
+    ) => { ... };
+}
\ No newline at end of file diff --git a/docs/egglog/macro.match_term_app!.html b/docs/egglog/macro.match_term_app!.html new file mode 100644 index 000000000..5065919c5 --- /dev/null +++ b/docs/egglog/macro.match_term_app!.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to macro.match_term_app.html...

+ + + \ No newline at end of file diff --git a/docs/egglog/macro.match_term_app.html b/docs/egglog/macro.match_term_app.html new file mode 100644 index 000000000..fc2e00972 --- /dev/null +++ b/docs/egglog/macro.match_term_app.html @@ -0,0 +1,5 @@ +match_term_app in egglog - Rust
macro_rules! match_term_app {
+    ($e:expr; { $(
+        ($head:expr, $args:pat) => $body:expr $(,)?
+    ),*}) => { ... };
+}
\ No newline at end of file diff --git a/docs/egglog/macro.to_tt!.html b/docs/egglog/macro.to_tt!.html new file mode 100644 index 000000000..aea6c4d12 --- /dev/null +++ b/docs/egglog/macro.to_tt!.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to macro.to_tt.html...

+ + + \ No newline at end of file diff --git a/docs/egglog/macro.to_tt.html b/docs/egglog/macro.to_tt.html new file mode 100644 index 000000000..57bab9b82 --- /dev/null +++ b/docs/egglog/macro.to_tt.html @@ -0,0 +1,3 @@ +to_tt in egglog - Rust

Macro egglog::to_tt

source ·
macro_rules! to_tt {
+    ($tt:tt, $callback:ident) => { ... };
+}
\ No newline at end of file diff --git a/docs/egglog/macro.unpack!.html b/docs/egglog/macro.unpack!.html new file mode 100644 index 000000000..126c5504d --- /dev/null +++ b/docs/egglog/macro.unpack!.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to macro.unpack.html...

+ + + \ No newline at end of file diff --git a/docs/egglog/macro.unpack.html b/docs/egglog/macro.unpack.html new file mode 100644 index 000000000..65f221da0 --- /dev/null +++ b/docs/egglog/macro.unpack.html @@ -0,0 +1,4 @@ +unpack in egglog - Rust

Macro egglog::unpack

source ·
macro_rules! unpack {
+    (& $t:ident) => { ... };
+    ($t:ident) => { ... };
+}
\ No newline at end of file diff --git a/docs/egglog/serialize/struct.SerializeConfig.html b/docs/egglog/serialize/struct.SerializeConfig.html new file mode 100644 index 000000000..4fc2dacca --- /dev/null +++ b/docs/egglog/serialize/struct.SerializeConfig.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../egglog/struct.SerializeConfig.html...

+ + + \ No newline at end of file diff --git a/docs/egglog/sidebar-items.js b/docs/egglog/sidebar-items.js new file mode 100644 index 000000000..695e6737b --- /dev/null +++ b/docs/egglog/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"constant":["HIGH_COST","UNIT_SYM"],"enum":["CompilerPassStop","Error","Term"],"macro":["add_primitives","match_term_app","to_tt","unpack"],"mod":["ast","sort","util"],"struct":["EGraph","ExtractReport","NotFoundError","Primitive","RunReport","SerializeConfig","SimplePrimitive","TermDag","TypeInfo","Value"],"trait":["PrimitiveLike"],"type":["ArcSort","Subst"]}; \ No newline at end of file diff --git a/docs/egglog/sort/f64/struct.F64Sort.html b/docs/egglog/sort/f64/struct.F64Sort.html new file mode 100644 index 000000000..327cb05b5 --- /dev/null +++ b/docs/egglog/sort/f64/struct.F64Sort.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../egglog/sort/struct.F64Sort.html...

+ + + \ No newline at end of file diff --git a/docs/egglog/sort/i64/struct.I64Sort.html b/docs/egglog/sort/i64/struct.I64Sort.html new file mode 100644 index 000000000..7b874b10d --- /dev/null +++ b/docs/egglog/sort/i64/struct.I64Sort.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../egglog/sort/struct.I64Sort.html...

+ + + \ No newline at end of file diff --git a/docs/egglog/sort/index.html b/docs/egglog/sort/index.html new file mode 100644 index 000000000..e92d78782 --- /dev/null +++ b/docs/egglog/sort/index.html @@ -0,0 +1 @@ +egglog::sort - Rust

Module egglog::sort

source ·

Structs

Traits

Type Definitions

\ No newline at end of file diff --git a/docs/egglog/sort/map/struct.MapSort.html b/docs/egglog/sort/map/struct.MapSort.html new file mode 100644 index 000000000..0cb67a313 --- /dev/null +++ b/docs/egglog/sort/map/struct.MapSort.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../egglog/sort/struct.MapSort.html...

+ + + \ No newline at end of file diff --git a/docs/egglog/sort/rational/struct.RationalSort.html b/docs/egglog/sort/rational/struct.RationalSort.html new file mode 100644 index 000000000..a990397a2 --- /dev/null +++ b/docs/egglog/sort/rational/struct.RationalSort.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../egglog/sort/struct.RationalSort.html...

+ + + \ No newline at end of file diff --git a/docs/egglog/sort/set/struct.SetSort.html b/docs/egglog/sort/set/struct.SetSort.html new file mode 100644 index 000000000..4ca1dc955 --- /dev/null +++ b/docs/egglog/sort/set/struct.SetSort.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../egglog/sort/struct.SetSort.html...

+ + + \ No newline at end of file diff --git a/docs/egglog/sort/sidebar-items.js b/docs/egglog/sort/sidebar-items.js new file mode 100644 index 000000000..0f44838de --- /dev/null +++ b/docs/egglog/sort/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"struct":["EqSort","F64Sort","I64Sort","MapSort","NotEqualPrimitive","RationalSort","SetSort","StringSort","UnitSort","VecSort"],"trait":["FromSort","IntoSort","Sort"],"type":["PreSort"]}; \ No newline at end of file diff --git a/docs/egglog/sort/string/struct.StringSort.html b/docs/egglog/sort/string/struct.StringSort.html new file mode 100644 index 000000000..f5c9005cd --- /dev/null +++ b/docs/egglog/sort/string/struct.StringSort.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../egglog/sort/struct.StringSort.html...

+ + + \ No newline at end of file diff --git a/docs/egglog/sort/struct.EqSort.html b/docs/egglog/sort/struct.EqSort.html new file mode 100644 index 000000000..130ce036e --- /dev/null +++ b/docs/egglog/sort/struct.EqSort.html @@ -0,0 +1,27 @@ +EqSort in egglog::sort - Rust

Struct egglog::sort::EqSort

source ·
pub struct EqSort {
+    pub name: Symbol,
+}

Fields§

§name: Symbol

Trait Implementations§

source§

impl Debug for EqSort

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Sort for EqSort

source§

fn name(&self) -> Symbol

source§

fn as_arc_any(self: Arc<Self>) -> Arc<dyn Any + Send + Sync + 'static>

source§

fn is_eq_sort(&self) -> bool

source§

fn canonicalize(&self, value: &mut Value, unionfind: &UnionFind) -> bool

source§

fn make_expr(&self, _egraph: &EGraph, _value: Value) -> (usize, Expr)

Extracting an expression (with smallest cost) out of a primitive value
source§

fn is_container_sort(&self) -> bool

source§

fn is_eq_container_sort(&self) -> bool

source§

fn foreach_tracked_values<'a>( + &'a self, + value: &'a Value, + f: Box<dyn FnMut(Value) + 'a> +)

source§

fn inner_values(&self, value: &Value) -> Vec<(&ArcSort, Value)>

Return the inner values and sorts. +Only eq_container_sort need to implement this method,
source§

fn register_primitives(self: Arc<Self>, info: &mut TypeInfo)

source§

fn extract_expr( + &self, + egraph: &EGraph, + value: Value, + _extractor: &Extractor<'_>, + _termdag: &mut TermDag +) -> Option<(usize, Expr)>

For values like EqSort containers, to make/extract an expression from it +requires an extractor. Moreover, the extraction may be unsuccessful if +the extractor is not fully initialized. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

\ No newline at end of file diff --git a/docs/egglog/sort/struct.F64Sort.html b/docs/egglog/sort/struct.F64Sort.html new file mode 100644 index 000000000..1c003ac66 --- /dev/null +++ b/docs/egglog/sort/struct.F64Sort.html @@ -0,0 +1,25 @@ +F64Sort in egglog::sort - Rust

Struct egglog::sort::F64Sort

source ·
pub struct F64Sort { /* private fields */ }

Implementations§

source§

impl F64Sort

source

pub fn new(name: Symbol) -> Self

Trait Implementations§

source§

impl Debug for F64Sort

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Sort for F64Sort

source§

fn name(&self) -> Symbol

source§

fn as_arc_any(self: Arc<Self>) -> Arc<dyn Any + Send + Sync + 'static>

source§

fn register_primitives(self: Arc<Self>, eg: &mut TypeInfo)

source§

fn make_expr(&self, _egraph: &EGraph, value: Value) -> (usize, Expr)

Extracting an expression (with smallest cost) out of a primitive value
source§

fn is_eq_sort(&self) -> bool

source§

fn is_container_sort(&self) -> bool

source§

fn is_eq_container_sort(&self) -> bool

source§

fn foreach_tracked_values<'a>( + &'a self, + value: &'a Value, + f: Box<dyn FnMut(Value) + 'a> +)

source§

fn canonicalize(&self, value: &mut Value, unionfind: &UnionFind) -> bool

source§

fn inner_values(&self, value: &Value) -> Vec<(&ArcSort, Value)>

Return the inner values and sorts. +Only eq_container_sort need to implement this method,
source§

fn extract_expr( + &self, + egraph: &EGraph, + value: Value, + _extractor: &Extractor<'_>, + _termdag: &mut TermDag +) -> Option<(usize, Expr)>

For values like EqSort containers, to make/extract an expression from it +requires an extractor. Moreover, the extraction may be unsuccessful if +the extractor is not fully initialized. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

\ No newline at end of file diff --git a/docs/egglog/sort/struct.I64Sort.html b/docs/egglog/sort/struct.I64Sort.html new file mode 100644 index 000000000..3692b1987 --- /dev/null +++ b/docs/egglog/sort/struct.I64Sort.html @@ -0,0 +1,25 @@ +I64Sort in egglog::sort - Rust

Struct egglog::sort::I64Sort

source ·
pub struct I64Sort { /* private fields */ }

Implementations§

source§

impl I64Sort

source

pub fn new(name: Symbol) -> Self

Trait Implementations§

source§

impl Debug for I64Sort

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Sort for I64Sort

source§

fn name(&self) -> Symbol

source§

fn as_arc_any(self: Arc<Self>) -> Arc<dyn Any + Send + Sync + 'static>

source§

fn register_primitives(self: Arc<Self>, typeinfo: &mut TypeInfo)

source§

fn make_expr(&self, _egraph: &EGraph, value: Value) -> (usize, Expr)

Extracting an expression (with smallest cost) out of a primitive value
source§

fn is_eq_sort(&self) -> bool

source§

fn is_container_sort(&self) -> bool

source§

fn is_eq_container_sort(&self) -> bool

source§

fn foreach_tracked_values<'a>( + &'a self, + value: &'a Value, + f: Box<dyn FnMut(Value) + 'a> +)

source§

fn canonicalize(&self, value: &mut Value, unionfind: &UnionFind) -> bool

source§

fn inner_values(&self, value: &Value) -> Vec<(&ArcSort, Value)>

Return the inner values and sorts. +Only eq_container_sort need to implement this method,
source§

fn extract_expr( + &self, + egraph: &EGraph, + value: Value, + _extractor: &Extractor<'_>, + _termdag: &mut TermDag +) -> Option<(usize, Expr)>

For values like EqSort containers, to make/extract an expression from it +requires an extractor. Moreover, the extraction may be unsuccessful if +the extractor is not fully initialized. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

\ No newline at end of file diff --git a/docs/egglog/sort/struct.MapSort.html b/docs/egglog/sort/struct.MapSort.html new file mode 100644 index 000000000..31fcaf7d5 --- /dev/null +++ b/docs/egglog/sort/struct.MapSort.html @@ -0,0 +1,29 @@ +MapSort in egglog::sort - Rust

Struct egglog::sort::MapSort

source ·
pub struct MapSort { /* private fields */ }

Implementations§

source§

impl MapSort

source

pub fn make_sort( + typeinfo: &mut TypeInfo, + name: Symbol, + args: &[Expr] +) -> Result<ArcSort, TypeError>

source§

impl MapSort

Trait Implementations§

source§

impl Debug for MapSort

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Sort for MapSort

source§

fn name(&self) -> Symbol

source§

fn as_arc_any(self: Arc<Self>) -> Arc<dyn Any + Send + Sync + 'static>

source§

fn is_container_sort(&self) -> bool

source§

fn is_eq_container_sort(&self) -> bool

source§

fn inner_values(&self, value: &Value) -> Vec<(&ArcSort, Value)>

Return the inner values and sorts. +Only eq_container_sort need to implement this method,
source§

fn canonicalize(&self, _value: &mut Value, _unionfind: &UnionFind) -> bool

source§

fn register_primitives(self: Arc<Self>, typeinfo: &mut TypeInfo)

source§

fn make_expr(&self, egraph: &EGraph, value: Value) -> (usize, Expr)

Extracting an expression (with smallest cost) out of a primitive value
source§

fn extract_expr( + &self, + _egraph: &EGraph, + value: Value, + extractor: &Extractor<'_>, + termdag: &mut TermDag +) -> Option<(usize, Expr)>

For values like EqSort containers, to make/extract an expression from it +requires an extractor. Moreover, the extraction may be unsuccessful if +the extractor is not fully initialized. Read more
source§

fn is_eq_sort(&self) -> bool

source§

fn foreach_tracked_values<'a>( + &'a self, + value: &'a Value, + f: Box<dyn FnMut(Value) + 'a> +)

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

\ No newline at end of file diff --git a/docs/egglog/sort/struct.NotEqualPrimitive.html b/docs/egglog/sort/struct.NotEqualPrimitive.html new file mode 100644 index 000000000..ddb106a1d --- /dev/null +++ b/docs/egglog/sort/struct.NotEqualPrimitive.html @@ -0,0 +1,12 @@ +NotEqualPrimitive in egglog::sort - Rust
pub struct NotEqualPrimitive { /* private fields */ }

Trait Implementations§

source§

impl PrimitiveLike for NotEqualPrimitive

source§

fn name(&self) -> Symbol

source§

fn accept(&self, types: &[ArcSort]) -> Option<ArcSort>

source§

fn apply(&self, values: &[Value]) -> Option<Value>

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

\ No newline at end of file diff --git a/docs/egglog/sort/struct.RationalSort.html b/docs/egglog/sort/struct.RationalSort.html new file mode 100644 index 000000000..714fe20c9 --- /dev/null +++ b/docs/egglog/sort/struct.RationalSort.html @@ -0,0 +1,25 @@ +RationalSort in egglog::sort - Rust

Struct egglog::sort::RationalSort

source ·
pub struct RationalSort { /* private fields */ }

Implementations§

source§

impl RationalSort

source

pub fn new(name: Symbol) -> Self

Trait Implementations§

source§

impl Debug for RationalSort

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Sort for RationalSort

source§

fn name(&self) -> Symbol

source§

fn as_arc_any(self: Arc<Self>) -> Arc<dyn Any + Send + Sync + 'static>

source§

fn register_primitives(self: Arc<Self>, eg: &mut TypeInfo)

source§

fn make_expr(&self, _egraph: &EGraph, value: Value) -> (usize, Expr)

Extracting an expression (with smallest cost) out of a primitive value
source§

fn is_eq_sort(&self) -> bool

source§

fn is_container_sort(&self) -> bool

source§

fn is_eq_container_sort(&self) -> bool

source§

fn foreach_tracked_values<'a>( + &'a self, + value: &'a Value, + f: Box<dyn FnMut(Value) + 'a> +)

source§

fn canonicalize(&self, value: &mut Value, unionfind: &UnionFind) -> bool

source§

fn inner_values(&self, value: &Value) -> Vec<(&ArcSort, Value)>

Return the inner values and sorts. +Only eq_container_sort need to implement this method,
source§

fn extract_expr( + &self, + egraph: &EGraph, + value: Value, + _extractor: &Extractor<'_>, + _termdag: &mut TermDag +) -> Option<(usize, Expr)>

For values like EqSort containers, to make/extract an expression from it +requires an extractor. Moreover, the extraction may be unsuccessful if +the extractor is not fully initialized. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

\ No newline at end of file diff --git a/docs/egglog/sort/struct.SetSort.html b/docs/egglog/sort/struct.SetSort.html new file mode 100644 index 000000000..49996a9b3 --- /dev/null +++ b/docs/egglog/sort/struct.SetSort.html @@ -0,0 +1,29 @@ +SetSort in egglog::sort - Rust

Struct egglog::sort::SetSort

source ·
pub struct SetSort { /* private fields */ }

Implementations§

source§

impl SetSort

source

pub fn element_name(&self) -> Symbol

source

pub fn make_sort( + typeinfo: &mut TypeInfo, + name: Symbol, + args: &[Expr] +) -> Result<ArcSort, TypeError>

source§

impl SetSort

Trait Implementations§

source§

impl Debug for SetSort

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Sort for SetSort

source§

fn name(&self) -> Symbol

source§

fn as_arc_any(self: Arc<Self>) -> Arc<dyn Any + Send + Sync + 'static>

source§

fn is_container_sort(&self) -> bool

source§

fn is_eq_container_sort(&self) -> bool

source§

fn inner_values(&self, value: &Value) -> Vec<(&ArcSort, Value)>

Return the inner values and sorts. +Only eq_container_sort need to implement this method,
source§

fn canonicalize(&self, _value: &mut Value, _unionfind: &UnionFind) -> bool

source§

fn register_primitives(self: Arc<Self>, typeinfo: &mut TypeInfo)

source§

fn make_expr(&self, egraph: &EGraph, value: Value) -> (usize, Expr)

Extracting an expression (with smallest cost) out of a primitive value
source§

fn extract_expr( + &self, + _egraph: &EGraph, + value: Value, + extractor: &Extractor<'_>, + termdag: &mut TermDag +) -> Option<(usize, Expr)>

For values like EqSort containers, to make/extract an expression from it +requires an extractor. Moreover, the extraction may be unsuccessful if +the extractor is not fully initialized. Read more
source§

fn is_eq_sort(&self) -> bool

source§

fn foreach_tracked_values<'a>( + &'a self, + value: &'a Value, + f: Box<dyn FnMut(Value) + 'a> +)

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

\ No newline at end of file diff --git a/docs/egglog/sort/struct.StringSort.html b/docs/egglog/sort/struct.StringSort.html new file mode 100644 index 000000000..485864471 --- /dev/null +++ b/docs/egglog/sort/struct.StringSort.html @@ -0,0 +1,25 @@ +StringSort in egglog::sort - Rust

Struct egglog::sort::StringSort

source ·
pub struct StringSort { /* private fields */ }

Implementations§

source§

impl StringSort

source

pub fn new(name: Symbol) -> Self

Trait Implementations§

source§

impl Debug for StringSort

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Sort for StringSort

source§

fn name(&self) -> Symbol

source§

fn as_arc_any(self: Arc<Self>) -> Arc<dyn Any + Send + Sync + 'static>

source§

fn make_expr(&self, _egraph: &EGraph, value: Value) -> (usize, Expr)

Extracting an expression (with smallest cost) out of a primitive value
source§

fn register_primitives(self: Arc<Self>, typeinfo: &mut TypeInfo)

source§

fn is_eq_sort(&self) -> bool

source§

fn is_container_sort(&self) -> bool

source§

fn is_eq_container_sort(&self) -> bool

source§

fn foreach_tracked_values<'a>( + &'a self, + value: &'a Value, + f: Box<dyn FnMut(Value) + 'a> +)

source§

fn canonicalize(&self, value: &mut Value, unionfind: &UnionFind) -> bool

source§

fn inner_values(&self, value: &Value) -> Vec<(&ArcSort, Value)>

Return the inner values and sorts. +Only eq_container_sort need to implement this method,
source§

fn extract_expr( + &self, + egraph: &EGraph, + value: Value, + _extractor: &Extractor<'_>, + _termdag: &mut TermDag +) -> Option<(usize, Expr)>

For values like EqSort containers, to make/extract an expression from it +requires an extractor. Moreover, the extraction may be unsuccessful if +the extractor is not fully initialized. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

\ No newline at end of file diff --git a/docs/egglog/sort/struct.UnitSort.html b/docs/egglog/sort/struct.UnitSort.html new file mode 100644 index 000000000..838e9fd1e --- /dev/null +++ b/docs/egglog/sort/struct.UnitSort.html @@ -0,0 +1,25 @@ +UnitSort in egglog::sort - Rust

Struct egglog::sort::UnitSort

source ·
pub struct UnitSort { /* private fields */ }

Implementations§

source§

impl UnitSort

source

pub fn new(name: Symbol) -> Self

Trait Implementations§

source§

impl Debug for UnitSort

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Sort for UnitSort

source§

fn name(&self) -> Symbol

source§

fn as_arc_any(self: Arc<Self>) -> Arc<dyn Any + Send + Sync + 'static>

source§

fn register_primitives(self: Arc<Self>, type_info: &mut TypeInfo)

source§

fn make_expr(&self, _egraph: &EGraph, value: Value) -> (usize, Expr)

Extracting an expression (with smallest cost) out of a primitive value
source§

fn is_eq_sort(&self) -> bool

source§

fn is_container_sort(&self) -> bool

source§

fn is_eq_container_sort(&self) -> bool

source§

fn foreach_tracked_values<'a>( + &'a self, + value: &'a Value, + f: Box<dyn FnMut(Value) + 'a> +)

source§

fn canonicalize(&self, value: &mut Value, unionfind: &UnionFind) -> bool

source§

fn inner_values(&self, value: &Value) -> Vec<(&ArcSort, Value)>

Return the inner values and sorts. +Only eq_container_sort need to implement this method,
source§

fn extract_expr( + &self, + egraph: &EGraph, + value: Value, + _extractor: &Extractor<'_>, + _termdag: &mut TermDag +) -> Option<(usize, Expr)>

For values like EqSort containers, to make/extract an expression from it +requires an extractor. Moreover, the extraction may be unsuccessful if +the extractor is not fully initialized. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

\ No newline at end of file diff --git a/docs/egglog/sort/struct.VecSort.html b/docs/egglog/sort/struct.VecSort.html new file mode 100644 index 000000000..0ae8ee5bb --- /dev/null +++ b/docs/egglog/sort/struct.VecSort.html @@ -0,0 +1,29 @@ +VecSort in egglog::sort - Rust

Struct egglog::sort::VecSort

source ·
pub struct VecSort { /* private fields */ }

Implementations§

source§

impl VecSort

source

pub fn element_name(&self) -> Symbol

source

pub fn presort_names() -> Vec<Symbol>

source

pub fn make_sort( + typeinfo: &mut TypeInfo, + name: Symbol, + args: &[Expr] +) -> Result<ArcSort, TypeError>

Trait Implementations§

source§

impl Debug for VecSort

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Sort for VecSort

source§

fn name(&self) -> Symbol

source§

fn as_arc_any(self: Arc<Self>) -> Arc<dyn Any + Send + Sync + 'static>

source§

fn is_container_sort(&self) -> bool

source§

fn is_eq_container_sort(&self) -> bool

source§

fn inner_values(&self, value: &Value) -> Vec<(&ArcSort, Value)>

Return the inner values and sorts. +Only eq_container_sort need to implement this method,
source§

fn canonicalize(&self, value: &mut Value, unionfind: &UnionFind) -> bool

source§

fn register_primitives(self: Arc<Self>, typeinfo: &mut TypeInfo)

source§

fn make_expr(&self, egraph: &EGraph, value: Value) -> (usize, Expr)

Extracting an expression (with smallest cost) out of a primitive value
source§

fn extract_expr( + &self, + _egraph: &EGraph, + value: Value, + extractor: &Extractor<'_>, + termdag: &mut TermDag +) -> Option<(usize, Expr)>

For values like EqSort containers, to make/extract an expression from it +requires an extractor. Moreover, the extraction may be unsuccessful if +the extractor is not fully initialized. Read more
source§

fn is_eq_sort(&self) -> bool

source§

fn foreach_tracked_values<'a>( + &'a self, + value: &'a Value, + f: Box<dyn FnMut(Value) + 'a> +)

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

\ No newline at end of file diff --git a/docs/egglog/sort/trait.FromSort.html b/docs/egglog/sort/trait.FromSort.html new file mode 100644 index 000000000..92df3046a --- /dev/null +++ b/docs/egglog/sort/trait.FromSort.html @@ -0,0 +1,6 @@ +FromSort in egglog::sort - Rust

Trait egglog::sort::FromSort

source ·
pub trait FromSort: Sized {
+    type Sort: Sort;
+
+    // Required method
+    fn load(sort: &Self::Sort, value: &Value) -> Self;
+}

Required Associated Types§

Required Methods§

source

fn load(sort: &Self::Sort, value: &Value) -> Self

Implementations on Foreign Types§

source§

impl FromSort for BTreeSet<Value>

§

type Sort = SetSort

source§

fn load(sort: &Self::Sort, value: &Value) -> Self

source§

impl FromSort for BTreeMap<Value, Value>

§

type Sort = MapSort

source§

fn load(sort: &Self::Sort, value: &Value) -> Self

source§

impl FromSort for Rational64

§

type Sort = RationalSort

source§

fn load(sort: &Self::Sort, value: &Value) -> Self

source§

impl FromSort for Vec<Value>

§

type Sort = VecSort

source§

fn load(sort: &Self::Sort, value: &Value) -> Self

source§

impl FromSort for i64

§

type Sort = I64Sort

source§

fn load(_sort: &Self::Sort, value: &Value) -> Self

source§

impl FromSort for f64

§

type Sort = F64Sort

source§

fn load(_sort: &Self::Sort, value: &Value) -> Self

Implementors§

\ No newline at end of file diff --git a/docs/egglog/sort/trait.IntoSort.html b/docs/egglog/sort/trait.IntoSort.html new file mode 100644 index 000000000..8c5b9b175 --- /dev/null +++ b/docs/egglog/sort/trait.IntoSort.html @@ -0,0 +1,6 @@ +IntoSort in egglog::sort - Rust

Trait egglog::sort::IntoSort

source ·
pub trait IntoSort: Sized {
+    type Sort: Sort;
+
+    // Required method
+    fn store(self, sort: &Self::Sort) -> Option<Value>;
+}

Required Associated Types§

Required Methods§

source

fn store(self, sort: &Self::Sort) -> Option<Value>

Implementations on Foreign Types§

source§

impl IntoSort for f64

§

type Sort = F64Sort

source§

fn store(self, sort: &Self::Sort) -> Option<Value>

source§

impl<T: IntoSort> IntoSort for Option<T>

§

type Sort = <T as IntoSort>::Sort

source§

fn store(self, sort: &Self::Sort) -> Option<Value>

source§

impl IntoSort for BTreeMap<Value, Value>

§

type Sort = MapSort

source§

fn store(self, sort: &Self::Sort) -> Option<Value>

source§

impl IntoSort for Vec<Value>

§

type Sort = VecSort

source§

fn store(self, sort: &Self::Sort) -> Option<Value>

source§

impl IntoSort for ()

§

type Sort = UnitSort

source§

fn store(self, _sort: &Self::Sort) -> Option<Value>

source§

impl IntoSort for Rational64

§

type Sort = RationalSort

source§

fn store(self, sort: &Self::Sort) -> Option<Value>

source§

impl IntoSort for i64

§

type Sort = I64Sort

source§

fn store(self, sort: &Self::Sort) -> Option<Value>

source§

impl IntoSort for BTreeSet<Value>

§

type Sort = SetSort

source§

fn store(self, sort: &Self::Sort) -> Option<Value>

Implementors§

\ No newline at end of file diff --git a/docs/egglog/sort/trait.Sort.html b/docs/egglog/sort/trait.Sort.html new file mode 100644 index 000000000..52b40b238 --- /dev/null +++ b/docs/egglog/sort/trait.Sort.html @@ -0,0 +1,43 @@ +Sort in egglog::sort - Rust

Trait egglog::sort::Sort

source ·
pub trait Sort: Any + Send + Sync + Debug {
+    // Required methods
+    fn name(&self) -> Symbol;
+    fn as_arc_any(self: Arc<Self>) -> Arc<dyn Any + Send + Sync + 'static>;
+    fn make_expr(&self, egraph: &EGraph, value: Value) -> (usize, Expr);
+
+    // Provided methods
+    fn is_eq_sort(&self) -> bool { ... }
+    fn is_container_sort(&self) -> bool { ... }
+    fn is_eq_container_sort(&self) -> bool { ... }
+    fn foreach_tracked_values<'a>(
+        &'a self,
+        value: &'a Value,
+        f: Box<dyn FnMut(Value) + 'a>
+    ) { ... }
+    fn canonicalize(&self, value: &mut Value, unionfind: &UnionFind) -> bool { ... }
+    fn inner_values(&self, value: &Value) -> Vec<(&ArcSort, Value)> { ... }
+    fn register_primitives(self: Arc<Self>, info: &mut TypeInfo) { ... }
+    fn extract_expr(
+        &self,
+        egraph: &EGraph,
+        value: Value,
+        _extractor: &Extractor<'_>,
+        _termdag: &mut TermDag
+    ) -> Option<(usize, Expr)> { ... }
+}

Required Methods§

source

fn name(&self) -> Symbol

source

fn as_arc_any(self: Arc<Self>) -> Arc<dyn Any + Send + Sync + 'static>

source

fn make_expr(&self, egraph: &EGraph, value: Value) -> (usize, Expr)

Extracting an expression (with smallest cost) out of a primitive value

+

Provided Methods§

source

fn is_eq_sort(&self) -> bool

source

fn is_container_sort(&self) -> bool

source

fn is_eq_container_sort(&self) -> bool

source

fn foreach_tracked_values<'a>( + &'a self, + value: &'a Value, + f: Box<dyn FnMut(Value) + 'a> +)

source

fn canonicalize(&self, value: &mut Value, unionfind: &UnionFind) -> bool

source

fn inner_values(&self, value: &Value) -> Vec<(&ArcSort, Value)>

Return the inner values and sorts. +Only eq_container_sort need to implement this method,

+
source

fn register_primitives(self: Arc<Self>, info: &mut TypeInfo)

source

fn extract_expr( + &self, + egraph: &EGraph, + value: Value, + _extractor: &Extractor<'_>, + _termdag: &mut TermDag +) -> Option<(usize, Expr)>

For values like EqSort containers, to make/extract an expression from it +requires an extractor. Moreover, the extraction may be unsuccessful if +the extractor is not fully initialized.

+

The default behavior is to call make_expr

+

Implementors§

\ No newline at end of file diff --git a/docs/egglog/sort/type.PreSort.html b/docs/egglog/sort/type.PreSort.html new file mode 100644 index 000000000..8809dea43 --- /dev/null +++ b/docs/egglog/sort/type.PreSort.html @@ -0,0 +1 @@ +PreSort in egglog::sort - Rust

Type Definition egglog::sort::PreSort

source ·
pub type PreSort = fn(typeinfo: &mut TypeInfo, name: Symbol, params: &[Expr]) -> Result<ArcSort, TypeError>;
\ No newline at end of file diff --git a/docs/egglog/sort/unit/struct.NotEqualPrimitive.html b/docs/egglog/sort/unit/struct.NotEqualPrimitive.html new file mode 100644 index 000000000..440746aae --- /dev/null +++ b/docs/egglog/sort/unit/struct.NotEqualPrimitive.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../egglog/sort/struct.NotEqualPrimitive.html...

+ + + \ No newline at end of file diff --git a/docs/egglog/sort/unit/struct.UnitSort.html b/docs/egglog/sort/unit/struct.UnitSort.html new file mode 100644 index 000000000..04d2725bb --- /dev/null +++ b/docs/egglog/sort/unit/struct.UnitSort.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../egglog/sort/struct.UnitSort.html...

+ + + \ No newline at end of file diff --git a/docs/egglog/sort/vec/struct.VecSort.html b/docs/egglog/sort/vec/struct.VecSort.html new file mode 100644 index 000000000..c53ac6c60 --- /dev/null +++ b/docs/egglog/sort/vec/struct.VecSort.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../../egglog/sort/struct.VecSort.html...

+ + + \ No newline at end of file diff --git a/docs/egglog/struct.EGraph.html b/docs/egglog/struct.EGraph.html new file mode 100644 index 000000000..6df110d79 --- /dev/null +++ b/docs/egglog/struct.EGraph.html @@ -0,0 +1,103 @@ +EGraph in egglog - Rust

Struct egglog::EGraph

source ·
pub struct EGraph {
+    pub test_proofs: bool,
+    pub match_limit: usize,
+    pub node_limit: usize,
+    pub fact_directory: Option<PathBuf>,
+    pub seminaive: bool,
+    pub global_bindings: HashMap<Symbol, (ArcSort, Value, u32), BuildHasherDefault<FxHasher>>,
+    /* private fields */
+}

Fields§

§test_proofs: bool§match_limit: usize§node_limit: usize§fact_directory: Option<PathBuf>§seminaive: bool§global_bindings: HashMap<Symbol, (ArcSort, Value, u32), BuildHasherDefault<FxHasher>>

Implementations§

source§

impl EGraph

source

pub fn value_to_id(&self, value: Value) -> Option<(Symbol, Id)>

source

pub fn extract( + &self, + value: Value, + termdag: &mut TermDag, + arcsort: &ArcSort +) -> (usize, Term)

source

pub fn extract_variants( + &mut self, + value: Value, + limit: usize, + termdag: &mut TermDag +) -> Vec<Term>

source§

impl EGraph

source

pub fn serialize(&self, config: SerializeConfig) -> EGraph

Serialize the egraph into a format that can be read by the egraph-serialize crate.

+

There are multiple different semantically valid ways to do this.

+

For node costs:

+
    +
  • Primitives: 1.0
  • +
  • Function without costs: 1.0
  • +
  • Function with costs: the cost
  • +
+

For node IDs:

+
    +
  • Functions: Function name + hash of input values
  • +
  • Args which are eq sorts: Choose one ID from the e-class, distribute roughly evenly.
  • +
  • Args and outputs values which are primitives: Sort name + hash of value
  • +
+

For e-classes:

+
    +
  • Eq sorts: Use the canonical ID of the e-class
  • +
  • Primitives: Use the node ID
  • +
+

This is to achieve the following properties:

+
    +
  • Equivalent primitive values will show up once in the e-graph.
  • +
  • Functions which return primitive values will be added to the e-class of that value.
  • +
  • Nodes will have consistant IDs throughout execution of e-graph (used for animating changes in the visualization)
  • +
  • Edges in the visualization will be well distributed (used for animating changes in the visualization) +(Note that this will be changed in <https://github.com/egraphs-good/egglog/pull/158> so that edges point to exact nodes instead of looking up the e-class)
  • +
+
source§

impl EGraph

source

pub fn compile_actions( + &self, + types: &IndexMap<Symbol, ArcSort>, + actions: &[Action] +) -> Result<Program, Vec<TypeError>>

source

pub fn compile_expr( + &self, + types: &IndexMap<Symbol, ArcSort>, + expr: &Expr, + expected_type: Option<ArcSort> +) -> Result<(ArcSort, Program), Vec<TypeError>>

source

pub fn run_actions( + &mut self, + stack: &mut Vec<Value>, + subst: &[Value], + program: &Program, + make_defaults: bool +) -> Result<(), Error>

source§

impl EGraph

source

pub fn is_interactive_mode(&self) -> bool

source

pub fn push(&mut self)

source

pub fn pop(&mut self) -> Result<(), Error>

source

pub fn union(&mut self, id1: Id, id2: Id, sort: Symbol) -> Id

source

pub fn find(&self, id: Id) -> Id

source

pub fn rebuild_nofail(&mut self) -> usize

source

pub fn rebuild(&mut self) -> Result<usize, Error>

source

pub fn declare_function(&mut self, decl: &FunctionDecl) -> Result<(), Error>

source

pub fn declare_constructor( + &mut self, + variant: Variant, + sort: impl Into<Symbol> +) -> Result<(), Error>

source

pub fn eval_lit(&self, lit: &Literal) -> Value

source

pub fn function_to_dag( + &mut self, + sym: Symbol, + n: usize +) -> Result<(Vec<(Term, Term)>, TermDag), Error>

source

pub fn print_function(&mut self, sym: Symbol, n: usize) -> Result<(), Error>

source

pub fn print_size(&mut self, sym: Symbol) -> Result<(), Error>

source

pub fn run_schedule(&mut self, sched: &NormSchedule) -> RunReport

source

pub fn run_rules_once(&mut self, config: &NormRunConfig, report: &mut RunReport)

source

pub fn run_rules(&mut self, config: &NormRunConfig) -> RunReport

source

pub fn add_rule(&mut self, rule: Rule, ruleset: Symbol) -> Result<Symbol, Error>

source

pub fn eval_actions(&mut self, actions: &[Action]) -> Result<(), Error>

source

pub fn eval_expr( + &mut self, + expr: &Expr, + expected_type: Option<ArcSort>, + make_defaults: bool +) -> Result<(ArcSort, Value), Error>

source

pub fn set_option(&mut self, name: &str, value: Expr)

source

pub fn clear(&mut self)

source

pub fn extract_expr( + &mut self, + e: Expr, + num_variants: usize +) -> Result<ExtractReport, Error>

source

pub fn process_commands( + &mut self, + program: Vec<Command>, + stop: CompilerPassStop +) -> Result<Vec<NormCommand>, Error>

source

pub fn set_underscores_for_desugaring(&mut self, underscores: usize)

source

pub fn run_program( + &mut self, + program: Vec<Command> +) -> Result<Vec<String>, Error>

source

pub fn parse_program(&self, input: &str) -> Result<Vec<Command>, Error>

source

pub fn parse_and_run_program( + &mut self, + input: &str +) -> Result<Vec<String>, Error>

source

pub fn num_tuples(&self) -> usize

source

pub fn add_arcsort(&mut self, arcsort: ArcSort) -> Result<(), TypeError>

source

pub fn get_extract_report(&self) -> &Option<ExtractReport>

Gets the last extract report and returns it, if the last command saved it.

+
source

pub fn get_run_report(&self) -> &Option<RunReport>

Gets the last run report and returns it, if the last command saved it.

+
source

pub fn serialize_for_graphviz(&self) -> EGraph

Serializes the egraph for export to graphviz.

+

Trait Implementations§

source§

impl Clone for EGraph

source§

fn clone(&self) -> EGraph

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Default for EGraph

source§

fn default() -> Self

Returns the “default value” for a type. Read more

Auto Trait Implementations§

§

impl !RefUnwindSafe for EGraph

§

impl !Send for EGraph

§

impl !Sync for EGraph

§

impl Unpin for EGraph

§

impl !UnwindSafe for EGraph

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToOwned for Twhere + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

\ No newline at end of file diff --git a/docs/egglog/struct.ExtractReport.html b/docs/egglog/struct.ExtractReport.html new file mode 100644 index 000000000..ca05cb523 --- /dev/null +++ b/docs/egglog/struct.ExtractReport.html @@ -0,0 +1,18 @@ +ExtractReport in egglog - Rust

Struct egglog::ExtractReport

source ·
pub struct ExtractReport {
+    pub cost: usize,
+    pub expr: Term,
+    pub variants: Vec<Term>,
+    pub termdag: TermDag,
+}

Fields§

§cost: usize§expr: Term§variants: Vec<Term>§termdag: TermDag

Trait Implementations§

source§

impl Clone for ExtractReport

source§

fn clone(&self) -> ExtractReport

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for ExtractReport

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToOwned for Twhere + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

\ No newline at end of file diff --git a/docs/egglog/struct.NotFoundError.html b/docs/egglog/struct.NotFoundError.html new file mode 100644 index 000000000..512e64b63 --- /dev/null +++ b/docs/egglog/struct.NotFoundError.html @@ -0,0 +1,15 @@ +NotFoundError in egglog - Rust

Struct egglog::NotFoundError

source ·
pub struct NotFoundError(_);

Trait Implementations§

source§

impl Debug for NotFoundError

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Display for NotFoundError

source§

fn fmt(&self, __formatter: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Error for NotFoundError

1.30.0 · source§

fn source(&self) -> Option<&(dyn Error + 'static)>

The lower-level source of this error, if any. Read more
1.0.0 · source§

fn description(&self) -> &str

👎Deprecated since 1.42.0: use the Display impl or to_string()
1.0.0 · source§

fn cause(&self) -> Option<&dyn Error>

👎Deprecated since 1.33.0: replaced by Error::source, which can support downcasting
source§

fn provide<'a>(&'a self, demand: &mut Demand<'a>)

🔬This is a nightly-only experimental API. (error_generic_member_access)
Provides type based access to context intended for error reports. Read more
source§

impl From<NotFoundError> for Error

source§

fn from(source: NotFoundError) -> Self

Converts to this type from the input type.

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<E> Provider for Ewhere + E: Error + ?Sized,

source§

fn provide<'a>(&'a self, demand: &mut Demand<'a>)

🔬This is a nightly-only experimental API. (provide_any)
Data providers should implement this method to provide all values they are able to +provide by using demand. Read more
source§

impl<T> ToString for Twhere + T: Display + ?Sized,

source§

default fn to_string(&self) -> String

Converts the given value to a String. Read more
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

\ No newline at end of file diff --git a/docs/egglog/struct.Primitive.html b/docs/egglog/struct.Primitive.html new file mode 100644 index 000000000..cbace5738 --- /dev/null +++ b/docs/egglog/struct.Primitive.html @@ -0,0 +1,24 @@ +Primitive in egglog - Rust

Struct egglog::Primitive

source ·
pub struct Primitive(_);

Trait Implementations§

source§

impl Clone for Primitive

source§

fn clone(&self) -> Primitive

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for Primitive

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Deref for Primitive

§

type Target = dyn PrimitiveLike + 'static

The resulting type after dereferencing.
source§

fn deref(&self) -> &Self::Target

Dereferences the value.
source§

impl<T: PrimitiveLike + 'static> From<T> for Primitive

source§

fn from(p: T) -> Self

Converts to this type from the input type.
source§

impl Hash for Primitive

source§

fn hash<H: Hasher>(&self, state: &mut H)

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl PartialEq<Primitive> for Primitive

source§

fn eq(&self, other: &Self) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl Eq for Primitive

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CallHasher for Twhere + T: Hash + ?Sized,

§

fn get_hash<H, B>(value: &H, build_hasher: &B) -> u64where + H: Hash + ?Sized, + B: BuildHasher,

§

impl<Q, K> Equivalent<K> for Qwhere + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Qwhere + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToOwned for Twhere + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

\ No newline at end of file diff --git a/docs/egglog/struct.RunReport.html b/docs/egglog/struct.RunReport.html new file mode 100644 index 000000000..aa15d56ba --- /dev/null +++ b/docs/egglog/struct.RunReport.html @@ -0,0 +1,18 @@ +RunReport in egglog - Rust

Struct egglog::RunReport

source ·
pub struct RunReport {
+    pub updated: bool,
+    pub search_time: Duration,
+    pub apply_time: Duration,
+    pub rebuild_time: Duration,
+}

Fields§

§updated: bool§search_time: Duration§apply_time: Duration§rebuild_time: Duration

Implementations§

source§

impl RunReport

source

pub fn union(&self, other: &Self) -> Self

Trait Implementations§

source§

impl Clone for RunReport

source§

fn clone(&self) -> RunReport

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for RunReport

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for RunReport

source§

fn default() -> RunReport

Returns the “default value” for a type. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToOwned for Twhere + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

\ No newline at end of file diff --git a/docs/egglog/struct.SerializeConfig.html b/docs/egglog/struct.SerializeConfig.html new file mode 100644 index 000000000..391a42281 --- /dev/null +++ b/docs/egglog/struct.SerializeConfig.html @@ -0,0 +1,16 @@ +SerializeConfig in egglog - Rust

Struct egglog::SerializeConfig

source ·
pub struct SerializeConfig {
+    pub max_functions: Option<usize>,
+    pub max_calls_per_function: Option<usize>,
+    pub include_temporary_functions: bool,
+}

Fields§

§max_functions: Option<usize>§max_calls_per_function: Option<usize>§include_temporary_functions: bool

Trait Implementations§

source§

impl Default for SerializeConfig

source§

fn default() -> Self

Returns the “default value” for a type. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

\ No newline at end of file diff --git a/docs/egglog/struct.SimplePrimitive.html b/docs/egglog/struct.SimplePrimitive.html new file mode 100644 index 000000000..5d722b4c4 --- /dev/null +++ b/docs/egglog/struct.SimplePrimitive.html @@ -0,0 +1,12 @@ +SimplePrimitive in egglog - Rust

Struct egglog::SimplePrimitive

source ·
pub struct SimplePrimitive { /* private fields */ }

Trait Implementations§

source§

impl PrimitiveLike for SimplePrimitive

source§

fn name(&self) -> Symbol

source§

fn accept(&self, types: &[ArcSort]) -> Option<ArcSort>

source§

fn apply(&self, values: &[Value]) -> Option<Value>

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

\ No newline at end of file diff --git a/docs/egglog/struct.TermDag.html b/docs/egglog/struct.TermDag.html new file mode 100644 index 000000000..5db27e0a1 --- /dev/null +++ b/docs/egglog/struct.TermDag.html @@ -0,0 +1,43 @@ +TermDag in egglog - Rust

Struct egglog::TermDag

source ·
pub struct TermDag {
+    pub nodes: Vec<Term>,
+    pub hashcons: HashMap<Term, TermId, BuildHasherDefault<FxHasher>>,
+}
Expand description

A hashconsing arena for Terms.

+

Fields§

§nodes: Vec<Term>§hashcons: HashMap<Term, TermId, BuildHasherDefault<FxHasher>>

Implementations§

source§

impl TermDag

source

pub fn size(&self) -> usize

Returns the number of nodes in this DAG.

+
source

pub fn lookup(&self, node: &Term) -> TermId

Convert the given term to its id.

+

Panics if the term does not already exist in this TermDag.

+
source

pub fn get(&self, id: TermId) -> Term

Convert the given id to the corresponding term.

+

Panics if the id is not valid.

+
source

pub fn app(&mut self, sym: Symbol, children: Vec<Term>) -> Term

Make and return a Term::App with the given head symbol and children, +and insert into the DAG if it is not already present.

+

Panics if any of the children are not already in the DAG.

+
source

pub fn lit(&mut self, lit: Literal) -> Term

Make and return a Term::Lit with the given literal, and insert into +the DAG if it is not already present.

+
source

pub fn var(&mut self, sym: Symbol) -> Term

Make and return a Term::Var with the given symbol, and insert into +the DAG if it is not already present.

+
source

pub fn expr_to_term(&mut self, expr: &Expr) -> Term

Recursively converts the given expression to a term.

+

This involves inserting every subexpression into this DAG. Because +TermDags are hashconsed, the resulting term is guaranteed to maximally +share subterms.

+
source

pub fn term_to_expr(&self, term: &Term) -> Expr

Recursively converts the given term to an expression.

+

Panics if the term contains subterms that are not in the DAG.

+
source

pub fn to_string(&self, term: &Term) -> String

Converts the given term to a string.

+

Panics if the term or any of its subterms are not in the DAG.

+

Trait Implementations§

source§

impl Clone for TermDag

source§

fn clone(&self) -> TermDag

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for TermDag

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for TermDag

source§

fn default() -> TermDag

Returns the “default value” for a type. Read more
source§

impl PartialEq<TermDag> for TermDag

source§

fn eq(&self, other: &TermDag) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl Eq for TermDag

source§

impl StructuralEq for TermDag

source§

impl StructuralPartialEq for TermDag

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<Q, K> Equivalent<K> for Qwhere + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Qwhere + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToOwned for Twhere + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

\ No newline at end of file diff --git a/docs/egglog/struct.TypeInfo.html b/docs/egglog/struct.TypeInfo.html new file mode 100644 index 000000000..e51ea1800 --- /dev/null +++ b/docs/egglog/struct.TypeInfo.html @@ -0,0 +1,25 @@ +TypeInfo in egglog - Rust

Struct egglog::TypeInfo

source ·
pub struct TypeInfo {
+    pub presorts: HashMap<Symbol, PreSort, BuildHasherDefault<FxHasher>>,
+    pub presort_names: HashSet<Symbol, BuildHasherDefault<FxHasher>>,
+    pub sorts: HashMap<Symbol, Arc<dyn Sort>, BuildHasherDefault<FxHasher>>,
+    pub primitives: HashMap<Symbol, Vec<Primitive>, BuildHasherDefault<FxHasher>>,
+    pub func_types: HashMap<Symbol, FuncType, BuildHasherDefault<FxHasher>>,
+    pub global_types: HashMap<Symbol, ArcSort, BuildHasherDefault<FxHasher>>,
+    pub local_types: HashMap<CommandId, HashMap<Symbol, ArcSort, BuildHasherDefault<FxHasher>>, BuildHasherDefault<FxHasher>>,
+}

Fields§

§presorts: HashMap<Symbol, PreSort, BuildHasherDefault<FxHasher>>§presort_names: HashSet<Symbol, BuildHasherDefault<FxHasher>>§sorts: HashMap<Symbol, Arc<dyn Sort>, BuildHasherDefault<FxHasher>>§primitives: HashMap<Symbol, Vec<Primitive>, BuildHasherDefault<FxHasher>>§func_types: HashMap<Symbol, FuncType, BuildHasherDefault<FxHasher>>§global_types: HashMap<Symbol, ArcSort, BuildHasherDefault<FxHasher>>§local_types: HashMap<CommandId, HashMap<Symbol, ArcSort, BuildHasherDefault<FxHasher>>, BuildHasherDefault<FxHasher>>

Implementations§

source§

impl TypeInfo

source

pub fn add_sort<S: Sort + 'static>(&mut self, sort: S)

source

pub fn add_arcsort(&mut self, sort: ArcSort) -> Result<(), TypeError>

source

pub fn get_sort<S: Sort + Send + Sync>(&self) -> Arc<S>

source

pub fn add_primitive(&mut self, prim: impl Into<Primitive>)

source

pub fn declare_sort( + &mut self, + name: impl Into<Symbol>, + presort_and_args: &Option<(Symbol, Vec<Expr>)> +) -> Result<(), TypeError>

source

pub fn reserved_type(&self, sym: Symbol) -> Option<ArcSort>

source

pub fn lookup(&self, ctx: CommandId, sym: Symbol) -> Result<ArcSort, TypeError>

Trait Implementations§

source§

impl Clone for TypeInfo

source§

fn clone(&self) -> TypeInfo

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Default for TypeInfo

source§

fn default() -> Self

Returns the “default value” for a type. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToOwned for Twhere + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

\ No newline at end of file diff --git a/docs/egglog/struct.Value.html b/docs/egglog/struct.Value.html new file mode 100644 index 000000000..94baa8622 --- /dev/null +++ b/docs/egglog/struct.Value.html @@ -0,0 +1,35 @@ +Value in egglog - Rust

Struct egglog::Value

source ·
pub struct Value {
+    pub tag: Symbol,
+    pub bits: u64,
+}

Fields§

§tag: Symbol§bits: u64

Implementations§

source§

impl Value

source

pub fn unit() -> Self

source

pub fn fake() -> Self

source

pub fn from_id(tag: Symbol, id: Id) -> Self

Trait Implementations§

source§

impl Clone for Value

source§

fn clone(&self) -> Value

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for Value

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl From<GlobalSymbol> for Value

source§

fn from(s: Symbol) -> Self

Converts to this type from the input type.
source§

impl From<OrderedFloat<f64>> for Value

source§

fn from(f: OrderedFloat<f64>) -> Self

Converts to this type from the input type.
source§

impl From<i64> for Value

source§

fn from(i: i64) -> Self

Converts to this type from the input type.
source§

impl Hash for Value

source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)where + H: Hasher, + Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl Ord for Value

source§

fn cmp(&self, other: &Value) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · source§

fn max(self, other: Self) -> Selfwhere + Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · source§

fn min(self, other: Self) -> Selfwhere + Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · source§

fn clamp(self, min: Self, max: Self) -> Selfwhere + Self: Sized + PartialOrd<Self>,

Restrict a value to a certain interval. Read more
source§

impl PartialEq<Value> for Value

source§

fn eq(&self, other: &Value) -> bool

This method tests for self and other values to be equal, and is used +by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always +sufficient, and should not be overridden without very good reason.
source§

impl PartialOrd<Value> for Value

source§

fn partial_cmp(&self, other: &Value) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · source§

fn lt(&self, other: &Rhs) -> bool

This method tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · source§

fn le(&self, other: &Rhs) -> bool

This method tests less than or equal to (for self and other) and is used by the <= +operator. Read more
1.0.0 · source§

fn gt(&self, other: &Rhs) -> bool

This method tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 · source§

fn ge(&self, other: &Rhs) -> bool

This method tests greater than or equal to (for self and other) and is used by the >= +operator. Read more
source§

impl Copy for Value

source§

impl Eq for Value

source§

impl StructuralEq for Value

source§

impl StructuralPartialEq for Value

Auto Trait Implementations§

§

impl RefUnwindSafe for Value

§

impl Send for Value

§

impl Sync for Value

§

impl Unpin for Value

§

impl UnwindSafe for Value

Blanket Implementations§

source§

impl<T> Any for Twhere + T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere + T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere + T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CallHasher for Twhere + T: Hash + ?Sized,

§

fn get_hash<H, B>(value: &H, build_hasher: &B) -> u64where + H: Hash + ?Sized, + B: BuildHasher,

§

impl<Q, K> Comparable<K> for Qwhere + Q: Ord + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn compare(&self, key: &K) -> Ordering

Compare self to key and return their ordering.
§

impl<Q, K> Equivalent<K> for Qwhere + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Qwhere + Q: Eq + ?Sized, + K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

+
source§

impl<T, U> Into<U> for Twhere + U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+
source§

impl<T> ToOwned for Twhere + T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for Twhere + U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere + U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for Twhere + V: MultiLane<T>,

§

fn vzip(self) -> V

source§

impl<T> RuleType for Twhere + T: Copy + Debug + Eq + Hash + Ord,

\ No newline at end of file diff --git a/docs/egglog/termdag/enum.Term.html b/docs/egglog/termdag/enum.Term.html new file mode 100644 index 000000000..165475ecc --- /dev/null +++ b/docs/egglog/termdag/enum.Term.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../egglog/enum.Term.html...

+ + + \ No newline at end of file diff --git a/docs/egglog/termdag/struct.TermDag.html b/docs/egglog/termdag/struct.TermDag.html new file mode 100644 index 000000000..5a40af8f0 --- /dev/null +++ b/docs/egglog/termdag/struct.TermDag.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../egglog/struct.TermDag.html...

+ + + \ No newline at end of file diff --git a/docs/egglog/trait.PrimitiveLike.html b/docs/egglog/trait.PrimitiveLike.html new file mode 100644 index 000000000..f9a99d091 --- /dev/null +++ b/docs/egglog/trait.PrimitiveLike.html @@ -0,0 +1,6 @@ +PrimitiveLike in egglog - Rust

Trait egglog::PrimitiveLike

source ·
pub trait PrimitiveLike {
+    // Required methods
+    fn name(&self) -> Symbol;
+    fn accept(&self, types: &[ArcSort]) -> Option<ArcSort>;
+    fn apply(&self, values: &[Value]) -> Option<Value>;
+}

Required Methods§

source

fn name(&self) -> Symbol

source

fn accept(&self, types: &[ArcSort]) -> Option<ArcSort>

source

fn apply(&self, values: &[Value]) -> Option<Value>

Implementors§

\ No newline at end of file diff --git a/docs/egglog/type.ArcSort.html b/docs/egglog/type.ArcSort.html new file mode 100644 index 000000000..61a529f43 --- /dev/null +++ b/docs/egglog/type.ArcSort.html @@ -0,0 +1 @@ +ArcSort in egglog - Rust

Type Definition egglog::ArcSort

source ·
pub type ArcSort = Arc<dyn Sort>;
\ No newline at end of file diff --git a/docs/egglog/type.Subst.html b/docs/egglog/type.Subst.html new file mode 100644 index 000000000..ddc3181e7 --- /dev/null +++ b/docs/egglog/type.Subst.html @@ -0,0 +1 @@ +Subst in egglog - Rust

Type Definition egglog::Subst

source ·
pub type Subst = IndexMap<Symbol, Value>;
\ No newline at end of file diff --git a/docs/egglog/typechecking/constant.UNIT_SYM.html b/docs/egglog/typechecking/constant.UNIT_SYM.html new file mode 100644 index 000000000..fdc4eab67 --- /dev/null +++ b/docs/egglog/typechecking/constant.UNIT_SYM.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../egglog/constant.UNIT_SYM.html...

+ + + \ No newline at end of file diff --git a/docs/egglog/typechecking/struct.TypeInfo.html b/docs/egglog/typechecking/struct.TypeInfo.html new file mode 100644 index 000000000..73bba1246 --- /dev/null +++ b/docs/egglog/typechecking/struct.TypeInfo.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../egglog/struct.TypeInfo.html...

+ + + \ No newline at end of file diff --git a/docs/egglog/util/index.html b/docs/egglog/util/index.html new file mode 100644 index 000000000..14da362bd --- /dev/null +++ b/docs/egglog/util/index.html @@ -0,0 +1 @@ +egglog::util - Rust

Module egglog::util

source ·

Type Definitions

\ No newline at end of file diff --git a/docs/egglog/util/sidebar-items.js b/docs/egglog/util/sidebar-items.js new file mode 100644 index 000000000..cf03ca4bd --- /dev/null +++ b/docs/egglog/util/sidebar-items.js @@ -0,0 +1 @@ +window.SIDEBAR_ITEMS = {"type":["IndexMap","IndexSet"]}; \ No newline at end of file diff --git a/docs/egglog/util/type.IndexMap.html b/docs/egglog/util/type.IndexMap.html new file mode 100644 index 000000000..a6e1ac326 --- /dev/null +++ b/docs/egglog/util/type.IndexMap.html @@ -0,0 +1 @@ +IndexMap in egglog::util - Rust

Type Definition egglog::util::IndexMap

source ·
pub type IndexMap<K, V> = IndexMap<K, V, BuildHasherDefault<FxHasher>>;
\ No newline at end of file diff --git a/docs/egglog/util/type.IndexSet.html b/docs/egglog/util/type.IndexSet.html new file mode 100644 index 000000000..21006d878 --- /dev/null +++ b/docs/egglog/util/type.IndexSet.html @@ -0,0 +1 @@ +IndexSet in egglog::util - Rust

Type Definition egglog::util::IndexSet

source ·
pub type IndexSet<K> = IndexSet<K, BuildHasherDefault<FxHasher>>;
\ No newline at end of file diff --git a/docs/egglog/value/struct.Value.html b/docs/egglog/value/struct.Value.html new file mode 100644 index 000000000..de6e67eea --- /dev/null +++ b/docs/egglog/value/struct.Value.html @@ -0,0 +1,11 @@ + + + + + Redirection + + +

Redirecting to ../../egglog/struct.Value.html...

+ + + \ No newline at end of file diff --git a/docs/help.html b/docs/help.html new file mode 100644 index 000000000..c6301740c --- /dev/null +++ b/docs/help.html @@ -0,0 +1 @@ +Rustdoc help

Rustdoc help

Back
\ No newline at end of file diff --git a/docs/implementors/core/clone/trait.Clone.js b/docs/implementors/core/clone/trait.Clone.js new file mode 100644 index 000000000..d2c25cf1e --- /dev/null +++ b/docs/implementors/core/clone/trait.Clone.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"egglog":[["impl Clone for Rewrite"],["impl Clone for Command"],["impl Clone for TypeInfo"],["impl Clone for CompilerPassStop"],["impl Clone for Fact"],["impl Clone for TermDag"],["impl Clone for NormFact"],["impl Clone for Value"],["impl Clone for Variant"],["impl Clone for NormRunConfig"],["impl Clone for NormRule"],["impl Clone for NormExpr"],["impl Clone for RunReport"],["impl Clone for Action"],["impl Clone for IdentSort"],["impl Clone for Rule"],["impl Clone for Schedule"],["impl Clone for Expr"],["impl Clone for NormAction"],["impl Clone for Term"],["impl Clone for NCommand"],["impl Clone for NormCommand"],["impl Clone for Metadata"],["impl Clone for Desugar"],["impl Clone for ExtractReport"],["impl Clone for FunctionDecl"],["impl Clone for RunConfig"],["impl Clone for NormSchedule"],["impl Clone for Schema"],["impl Clone for Id"],["impl Clone for EGraph"],["impl Clone for Primitive"],["impl Clone for Literal"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/implementors/core/cmp/trait.Eq.js b/docs/implementors/core/cmp/trait.Eq.js new file mode 100644 index 000000000..db22246cd --- /dev/null +++ b/docs/implementors/core/cmp/trait.Eq.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"egglog":[["impl Eq for Action"],["impl Eq for Fact"],["impl Eq for Value"],["impl Eq for Term"],["impl Eq for Primitive"],["impl Eq for CompilerPassStop"],["impl Eq for Literal"],["impl Eq for NormAction"],["impl Eq for Expr"],["impl Eq for Schedule"],["impl Eq for Id"],["impl Eq for NormFact"],["impl Eq for FunctionDecl"],["impl Eq for Schema"],["impl Eq for NormRule"],["impl Eq for NormCommand"],["impl Eq for IdentSort"],["impl Eq for Metadata"],["impl Eq for NormRunConfig"],["impl Eq for RunConfig"],["impl Eq for NormSchedule"],["impl Eq for NCommand"],["impl Eq for NormExpr"],["impl Eq for Variant"],["impl Eq for TermDag"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/implementors/core/cmp/trait.Ord.js b/docs/implementors/core/cmp/trait.Ord.js new file mode 100644 index 000000000..4c0c6c663 --- /dev/null +++ b/docs/implementors/core/cmp/trait.Ord.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"egglog":[["impl Ord for Value"],["impl Ord for NormExpr"],["impl Ord for Literal"],["impl Ord for Id"],["impl Ord for Expr"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/implementors/core/cmp/trait.PartialEq.js b/docs/implementors/core/cmp/trait.PartialEq.js new file mode 100644 index 000000000..60c4540af --- /dev/null +++ b/docs/implementors/core/cmp/trait.PartialEq.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"egglog":[["impl PartialEq<NormExpr> for NormExpr"],["impl PartialEq<NormRule> for NormRule"],["impl PartialEq<Expr> for Expr"],["impl PartialEq<Value> for Value"],["impl PartialEq<Term> for Term"],["impl PartialEq<TermDag> for TermDag"],["impl PartialEq<NormFact> for NormFact"],["impl PartialEq<Metadata> for Metadata"],["impl PartialEq<NormAction> for NormAction"],["impl PartialEq<Schema> for Schema"],["impl PartialEq<NormRunConfig> for NormRunConfig"],["impl PartialEq<Fact> for Fact"],["impl PartialEq<NormCommand> for NormCommand"],["impl PartialEq<Action> for Action"],["impl PartialEq<NormSchedule> for NormSchedule"],["impl PartialEq<Id> for Id"],["impl PartialEq<IdentSort> for IdentSort"],["impl PartialEq<Primitive> for Primitive"],["impl PartialEq<CompilerPassStop> for CompilerPassStop"],["impl PartialEq<RunConfig> for RunConfig"],["impl PartialEq<Variant> for Variant"],["impl PartialEq<NCommand> for NCommand"],["impl PartialEq<Literal> for Literal"],["impl PartialEq<FunctionDecl> for FunctionDecl"],["impl PartialEq<Schedule> for Schedule"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/implementors/core/cmp/trait.PartialOrd.js b/docs/implementors/core/cmp/trait.PartialOrd.js new file mode 100644 index 000000000..7f26f96c5 --- /dev/null +++ b/docs/implementors/core/cmp/trait.PartialOrd.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"egglog":[["impl PartialOrd<Literal> for Literal"],["impl PartialOrd<Expr> for Expr"],["impl PartialOrd<Id> for Id"],["impl PartialOrd<NormExpr> for NormExpr"],["impl PartialOrd<Value> for Value"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/implementors/core/convert/trait.From.js b/docs/implementors/core/convert/trait.From.js new file mode 100644 index 000000000..95dcefde3 --- /dev/null +++ b/docs/implementors/core/convert/trait.From.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"egglog":[["impl From<GlobalSymbol> for Value"],["impl<T: PrimitiveLike + 'static> From<T> for Primitive"],["impl From<GlobalSymbol> for Literal"],["impl From<Literal> for Symbol"],["impl From<OrderedFloat<f64>> for Literal"],["impl From<Literal> for OrderedFloat<f64>"],["impl From<Literal> for i64"],["impl From<ParseError<usize, String, String>> for Error"],["impl From<usize> for Id"],["impl From<NotFoundError> for Error"],["impl From<Id> for usize"],["impl From<OrderedFloat<f64>> for Value"],["impl From<i64> for Value"],["impl From<i64> for Literal"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/implementors/core/default/trait.Default.js b/docs/implementors/core/default/trait.Default.js new file mode 100644 index 000000000..5888376d5 --- /dev/null +++ b/docs/implementors/core/default/trait.Default.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"egglog":[["impl Default for TypeInfo"],["impl Default for RunReport"],["impl Default for SerializeConfig"],["impl Default for Desugar"],["impl Default for TermDag"],["impl Default for EGraph"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/implementors/core/error/trait.Error.js b/docs/implementors/core/error/trait.Error.js new file mode 100644 index 000000000..e77efdaa7 --- /dev/null +++ b/docs/implementors/core/error/trait.Error.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"egglog":[["impl Error for Error"],["impl Error for NotFoundError"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/implementors/core/fmt/trait.Debug.js b/docs/implementors/core/fmt/trait.Debug.js new file mode 100644 index 000000000..5be12187b --- /dev/null +++ b/docs/implementors/core/fmt/trait.Debug.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"egglog":[["impl Debug for MapSort"],["impl Debug for NormAction"],["impl Debug for RunReport"],["impl Debug for NotFoundError"],["impl Debug for FunctionDecl"],["impl Debug for Command"],["impl Debug for RunConfig"],["impl Debug for CompilerPassStop"],["impl Debug for Primitive"],["impl Debug for Metadata"],["impl Debug for SetSort"],["impl Debug for NormFact"],["impl Debug for Fact"],["impl Debug for Literal"],["impl Debug for TermDag"],["impl Debug for EqSort"],["impl Debug for F64Sort"],["impl Debug for Action"],["impl Debug for Schema"],["impl Debug for IdentSort"],["impl Debug for Schedule"],["impl Debug for Variant"],["impl Debug for Value"],["impl Debug for NormSchedule"],["impl Debug for Id"],["impl Debug for Term"],["impl Debug for Expr"],["impl Debug for Error"],["impl Debug for RationalSort"],["impl Debug for NormExpr"],["impl Debug for NormCommand"],["impl Debug for ExtractReport"],["impl Debug for I64Sort"],["impl Debug for Rewrite"],["impl Debug for Rule"],["impl Debug for VecSort"],["impl Debug for NormRunConfig"],["impl Debug for NormRule"],["impl Debug for StringSort"],["impl Debug for UnitSort"],["impl Debug for NCommand"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/implementors/core/fmt/trait.Display.js b/docs/implementors/core/fmt/trait.Display.js new file mode 100644 index 000000000..17c19e94b --- /dev/null +++ b/docs/implementors/core/fmt/trait.Display.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"egglog":[["impl Display for NormAction"],["impl Display for NormFact"],["impl Display for NCommand"],["impl Display for NormRule"],["impl Display for Error"],["impl Display for Id"],["impl Display for IdentSort"],["impl Display for Fact"],["impl Display for NotFoundError"],["impl Display for Expr"],["impl Display for Rule"],["impl Display for Schedule"],["impl Display for CompilerPassStop"],["impl Display for Action"],["impl Display for Literal"],["impl Display for Rewrite"],["impl Display for Command"],["impl Display for NormCommand"],["impl Display for NormSchedule"],["impl Display for NormExpr"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/implementors/core/hash/trait.Hash.js b/docs/implementors/core/hash/trait.Hash.js new file mode 100644 index 000000000..0267f7e58 --- /dev/null +++ b/docs/implementors/core/hash/trait.Hash.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"egglog":[["impl Hash for Variant"],["impl Hash for Literal"],["impl Hash for Schedule"],["impl Hash for FunctionDecl"],["impl Hash for NCommand"],["impl Hash for RunConfig"],["impl Hash for NormExpr"],["impl Hash for Metadata"],["impl Hash for Id"],["impl Hash for Term"],["impl Hash for Value"],["impl Hash for Expr"],["impl Hash for NormRule"],["impl Hash for Schema"],["impl Hash for NormSchedule"],["impl Hash for Action"],["impl Hash for CompilerPassStop"],["impl Hash for NormAction"],["impl Hash for NormFact"],["impl Hash for Fact"],["impl Hash for Primitive"],["impl Hash for NormCommand"],["impl Hash for IdentSort"],["impl Hash for NormRunConfig"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/implementors/core/marker/trait.Copy.js b/docs/implementors/core/marker/trait.Copy.js new file mode 100644 index 000000000..6b62cddaf --- /dev/null +++ b/docs/implementors/core/marker/trait.Copy.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"egglog":[["impl Copy for Id"],["impl Copy for Value"],["impl Copy for CompilerPassStop"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/implementors/core/marker/trait.Freeze.js b/docs/implementors/core/marker/trait.Freeze.js new file mode 100644 index 000000000..84b0a863e --- /dev/null +++ b/docs/implementors/core/marker/trait.Freeze.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"egglog":[["impl Freeze for ActionParser",1,["egglog::ast::parse::__parse__Action::ActionParser"]],["impl Freeze for ExprParser",1,["egglog::ast::parse::__parse__Expr::ExprParser"]],["impl Freeze for FactParser",1,["egglog::ast::parse::__parse__Fact::FactParser"]],["impl Freeze for ProgramParser",1,["egglog::ast::parse::__parse__Program::ProgramParser"]],["impl Freeze for Literal",1,["egglog::ast::expr::Literal"]],["impl Freeze for Expr",1,["egglog::ast::expr::Expr"]],["impl Freeze for NormExpr",1,["egglog::ast::expr::NormExpr"]],["impl Freeze for Desugar",1,["egglog::ast::desugar::Desugar"]],["impl Freeze for Id",1,["egglog::ast::Id"]],["impl Freeze for Metadata",1,["egglog::ast::Metadata"]],["impl Freeze for NormCommand",1,["egglog::ast::NormCommand"]],["impl Freeze for NCommand",1,["egglog::ast::NCommand"]],["impl Freeze for Schedule",1,["egglog::ast::Schedule"]],["impl Freeze for NormSchedule",1,["egglog::ast::NormSchedule"]],["impl Freeze for Command",1,["egglog::ast::Command"]],["impl Freeze for IdentSort",1,["egglog::ast::IdentSort"]],["impl Freeze for RunConfig",1,["egglog::ast::RunConfig"]],["impl Freeze for NormRunConfig",1,["egglog::ast::NormRunConfig"]],["impl Freeze for FunctionDecl",1,["egglog::ast::FunctionDecl"]],["impl Freeze for Variant",1,["egglog::ast::Variant"]],["impl Freeze for Schema",1,["egglog::ast::Schema"]],["impl Freeze for Fact",1,["egglog::ast::Fact"]],["impl Freeze for NormFact",1,["egglog::ast::NormFact"]],["impl Freeze for Action",1,["egglog::ast::Action"]],["impl Freeze for NormAction",1,["egglog::ast::NormAction"]],["impl Freeze for Rule",1,["egglog::ast::Rule"]],["impl Freeze for NormRule",1,["egglog::ast::NormRule"]],["impl Freeze for Rewrite",1,["egglog::ast::Rewrite"]],["impl Freeze for SerializeConfig",1,["egglog::serialize::SerializeConfig"]],["impl !Freeze for RationalSort",1,["egglog::sort::rational::RationalSort"]],["impl Freeze for StringSort",1,["egglog::sort::string::StringSort"]],["impl Freeze for UnitSort",1,["egglog::sort::unit::UnitSort"]],["impl Freeze for NotEqualPrimitive",1,["egglog::sort::unit::NotEqualPrimitive"]],["impl Freeze for I64Sort",1,["egglog::sort::i64::I64Sort"]],["impl Freeze for F64Sort",1,["egglog::sort::f64::F64Sort"]],["impl !Freeze for MapSort",1,["egglog::sort::map::MapSort"]],["impl !Freeze for SetSort",1,["egglog::sort::set::SetSort"]],["impl !Freeze for VecSort",1,["egglog::sort::vec::VecSort"]],["impl Freeze for EqSort",1,["egglog::sort::EqSort"]],["impl Freeze for Term",1,["egglog::termdag::Term"]],["impl Freeze for TermDag",1,["egglog::termdag::TermDag"]],["impl Freeze for TypeInfo",1,["egglog::typechecking::TypeInfo"]],["impl Freeze for Value",1,["egglog::value::Value"]],["impl Freeze for RunReport",1,["egglog::RunReport"]],["impl Freeze for ExtractReport",1,["egglog::ExtractReport"]],["impl Freeze for Primitive",1,["egglog::Primitive"]],["impl Freeze for SimplePrimitive",1,["egglog::SimplePrimitive"]],["impl Freeze for CompilerPassStop",1,["egglog::CompilerPassStop"]],["impl Freeze for EGraph",1,["egglog::EGraph"]],["impl Freeze for NotFoundError",1,["egglog::NotFoundError"]],["impl Freeze for Error",1,["egglog::Error"]]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/implementors/core/marker/trait.Send.js b/docs/implementors/core/marker/trait.Send.js new file mode 100644 index 000000000..ded67a8f0 --- /dev/null +++ b/docs/implementors/core/marker/trait.Send.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"egglog":[["impl Send for ActionParser",1,["egglog::ast::parse::__parse__Action::ActionParser"]],["impl Send for ExprParser",1,["egglog::ast::parse::__parse__Expr::ExprParser"]],["impl Send for FactParser",1,["egglog::ast::parse::__parse__Fact::FactParser"]],["impl Send for ProgramParser",1,["egglog::ast::parse::__parse__Program::ProgramParser"]],["impl Send for Literal",1,["egglog::ast::expr::Literal"]],["impl Send for Expr",1,["egglog::ast::expr::Expr"]],["impl Send for NormExpr",1,["egglog::ast::expr::NormExpr"]],["impl Send for Desugar",1,["egglog::ast::desugar::Desugar"]],["impl Send for Id",1,["egglog::ast::Id"]],["impl Send for Metadata",1,["egglog::ast::Metadata"]],["impl Send for NormCommand",1,["egglog::ast::NormCommand"]],["impl Send for NCommand",1,["egglog::ast::NCommand"]],["impl Send for Schedule",1,["egglog::ast::Schedule"]],["impl Send for NormSchedule",1,["egglog::ast::NormSchedule"]],["impl Send for Command",1,["egglog::ast::Command"]],["impl Send for IdentSort",1,["egglog::ast::IdentSort"]],["impl Send for RunConfig",1,["egglog::ast::RunConfig"]],["impl Send for NormRunConfig",1,["egglog::ast::NormRunConfig"]],["impl Send for FunctionDecl",1,["egglog::ast::FunctionDecl"]],["impl Send for Variant",1,["egglog::ast::Variant"]],["impl Send for Schema",1,["egglog::ast::Schema"]],["impl Send for Fact",1,["egglog::ast::Fact"]],["impl Send for NormFact",1,["egglog::ast::NormFact"]],["impl Send for Action",1,["egglog::ast::Action"]],["impl Send for NormAction",1,["egglog::ast::NormAction"]],["impl Send for Rule",1,["egglog::ast::Rule"]],["impl Send for NormRule",1,["egglog::ast::NormRule"]],["impl Send for Rewrite",1,["egglog::ast::Rewrite"]],["impl Send for SerializeConfig",1,["egglog::serialize::SerializeConfig"]],["impl Send for RationalSort",1,["egglog::sort::rational::RationalSort"]],["impl Send for StringSort",1,["egglog::sort::string::StringSort"]],["impl Send for UnitSort",1,["egglog::sort::unit::UnitSort"]],["impl Send for NotEqualPrimitive",1,["egglog::sort::unit::NotEqualPrimitive"]],["impl Send for I64Sort",1,["egglog::sort::i64::I64Sort"]],["impl Send for F64Sort",1,["egglog::sort::f64::F64Sort"]],["impl Send for MapSort",1,["egglog::sort::map::MapSort"]],["impl Send for SetSort",1,["egglog::sort::set::SetSort"]],["impl Send for VecSort",1,["egglog::sort::vec::VecSort"]],["impl Send for EqSort",1,["egglog::sort::EqSort"]],["impl Send for Term",1,["egglog::termdag::Term"]],["impl Send for TermDag",1,["egglog::termdag::TermDag"]],["impl !Send for TypeInfo",1,["egglog::typechecking::TypeInfo"]],["impl Send for Value",1,["egglog::value::Value"]],["impl Send for RunReport",1,["egglog::RunReport"]],["impl Send for ExtractReport",1,["egglog::ExtractReport"]],["impl !Send for Primitive",1,["egglog::Primitive"]],["impl Send for SimplePrimitive",1,["egglog::SimplePrimitive"]],["impl Send for CompilerPassStop",1,["egglog::CompilerPassStop"]],["impl !Send for EGraph",1,["egglog::EGraph"]],["impl Send for NotFoundError",1,["egglog::NotFoundError"]],["impl !Send for Error",1,["egglog::Error"]]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/implementors/core/marker/trait.StructuralEq.js b/docs/implementors/core/marker/trait.StructuralEq.js new file mode 100644 index 000000000..9e1555985 --- /dev/null +++ b/docs/implementors/core/marker/trait.StructuralEq.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"egglog":[["impl StructuralEq for FunctionDecl"],["impl StructuralEq for Schema"],["impl StructuralEq for RunConfig"],["impl StructuralEq for Action"],["impl StructuralEq for Term"],["impl StructuralEq for NormRule"],["impl StructuralEq for Schedule"],["impl StructuralEq for NormSchedule"],["impl StructuralEq for NormFact"],["impl StructuralEq for Metadata"],["impl StructuralEq for Variant"],["impl StructuralEq for NormCommand"],["impl StructuralEq for CompilerPassStop"],["impl StructuralEq for NormAction"],["impl StructuralEq for Id"],["impl StructuralEq for IdentSort"],["impl StructuralEq for NCommand"],["impl StructuralEq for Literal"],["impl StructuralEq for TermDag"],["impl StructuralEq for Expr"],["impl StructuralEq for Fact"],["impl StructuralEq for NormRunConfig"],["impl StructuralEq for NormExpr"],["impl StructuralEq for Value"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/implementors/core/marker/trait.StructuralPartialEq.js b/docs/implementors/core/marker/trait.StructuralPartialEq.js new file mode 100644 index 000000000..2ae127a05 --- /dev/null +++ b/docs/implementors/core/marker/trait.StructuralPartialEq.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"egglog":[["impl StructuralPartialEq for Variant"],["impl StructuralPartialEq for Term"],["impl StructuralPartialEq for Fact"],["impl StructuralPartialEq for Schema"],["impl StructuralPartialEq for TermDag"],["impl StructuralPartialEq for IdentSort"],["impl StructuralPartialEq for RunConfig"],["impl StructuralPartialEq for Action"],["impl StructuralPartialEq for NormFact"],["impl StructuralPartialEq for Metadata"],["impl StructuralPartialEq for Literal"],["impl StructuralPartialEq for Schedule"],["impl StructuralPartialEq for FunctionDecl"],["impl StructuralPartialEq for NormRule"],["impl StructuralPartialEq for CompilerPassStop"],["impl StructuralPartialEq for NormCommand"],["impl StructuralPartialEq for Value"],["impl StructuralPartialEq for Id"],["impl StructuralPartialEq for NormSchedule"],["impl StructuralPartialEq for NormAction"],["impl StructuralPartialEq for NCommand"],["impl StructuralPartialEq for Expr"],["impl StructuralPartialEq for NormRunConfig"],["impl StructuralPartialEq for NormExpr"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/implementors/core/marker/trait.Sync.js b/docs/implementors/core/marker/trait.Sync.js new file mode 100644 index 000000000..d1f7358f1 --- /dev/null +++ b/docs/implementors/core/marker/trait.Sync.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"egglog":[["impl Sync for ActionParser",1,["egglog::ast::parse::__parse__Action::ActionParser"]],["impl Sync for ExprParser",1,["egglog::ast::parse::__parse__Expr::ExprParser"]],["impl Sync for FactParser",1,["egglog::ast::parse::__parse__Fact::FactParser"]],["impl Sync for ProgramParser",1,["egglog::ast::parse::__parse__Program::ProgramParser"]],["impl Sync for Literal",1,["egglog::ast::expr::Literal"]],["impl Sync for Expr",1,["egglog::ast::expr::Expr"]],["impl Sync for NormExpr",1,["egglog::ast::expr::NormExpr"]],["impl Sync for Desugar",1,["egglog::ast::desugar::Desugar"]],["impl Sync for Id",1,["egglog::ast::Id"]],["impl Sync for Metadata",1,["egglog::ast::Metadata"]],["impl Sync for NormCommand",1,["egglog::ast::NormCommand"]],["impl Sync for NCommand",1,["egglog::ast::NCommand"]],["impl Sync for Schedule",1,["egglog::ast::Schedule"]],["impl Sync for NormSchedule",1,["egglog::ast::NormSchedule"]],["impl Sync for Command",1,["egglog::ast::Command"]],["impl Sync for IdentSort",1,["egglog::ast::IdentSort"]],["impl Sync for RunConfig",1,["egglog::ast::RunConfig"]],["impl Sync for NormRunConfig",1,["egglog::ast::NormRunConfig"]],["impl Sync for FunctionDecl",1,["egglog::ast::FunctionDecl"]],["impl Sync for Variant",1,["egglog::ast::Variant"]],["impl Sync for Schema",1,["egglog::ast::Schema"]],["impl Sync for Fact",1,["egglog::ast::Fact"]],["impl Sync for NormFact",1,["egglog::ast::NormFact"]],["impl Sync for Action",1,["egglog::ast::Action"]],["impl Sync for NormAction",1,["egglog::ast::NormAction"]],["impl Sync for Rule",1,["egglog::ast::Rule"]],["impl Sync for NormRule",1,["egglog::ast::NormRule"]],["impl Sync for Rewrite",1,["egglog::ast::Rewrite"]],["impl Sync for SerializeConfig",1,["egglog::serialize::SerializeConfig"]],["impl Sync for RationalSort",1,["egglog::sort::rational::RationalSort"]],["impl Sync for StringSort",1,["egglog::sort::string::StringSort"]],["impl Sync for UnitSort",1,["egglog::sort::unit::UnitSort"]],["impl Sync for NotEqualPrimitive",1,["egglog::sort::unit::NotEqualPrimitive"]],["impl Sync for I64Sort",1,["egglog::sort::i64::I64Sort"]],["impl Sync for F64Sort",1,["egglog::sort::f64::F64Sort"]],["impl Sync for MapSort",1,["egglog::sort::map::MapSort"]],["impl Sync for SetSort",1,["egglog::sort::set::SetSort"]],["impl Sync for VecSort",1,["egglog::sort::vec::VecSort"]],["impl Sync for EqSort",1,["egglog::sort::EqSort"]],["impl Sync for Term",1,["egglog::termdag::Term"]],["impl Sync for TermDag",1,["egglog::termdag::TermDag"]],["impl !Sync for TypeInfo",1,["egglog::typechecking::TypeInfo"]],["impl Sync for Value",1,["egglog::value::Value"]],["impl Sync for RunReport",1,["egglog::RunReport"]],["impl Sync for ExtractReport",1,["egglog::ExtractReport"]],["impl !Sync for Primitive",1,["egglog::Primitive"]],["impl Sync for SimplePrimitive",1,["egglog::SimplePrimitive"]],["impl Sync for CompilerPassStop",1,["egglog::CompilerPassStop"]],["impl !Sync for EGraph",1,["egglog::EGraph"]],["impl Sync for NotFoundError",1,["egglog::NotFoundError"]],["impl !Sync for Error",1,["egglog::Error"]]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/implementors/core/marker/trait.Unpin.js b/docs/implementors/core/marker/trait.Unpin.js new file mode 100644 index 000000000..90706ef20 --- /dev/null +++ b/docs/implementors/core/marker/trait.Unpin.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"egglog":[["impl Unpin for ActionParser",1,["egglog::ast::parse::__parse__Action::ActionParser"]],["impl Unpin for ExprParser",1,["egglog::ast::parse::__parse__Expr::ExprParser"]],["impl Unpin for FactParser",1,["egglog::ast::parse::__parse__Fact::FactParser"]],["impl Unpin for ProgramParser",1,["egglog::ast::parse::__parse__Program::ProgramParser"]],["impl Unpin for Literal",1,["egglog::ast::expr::Literal"]],["impl Unpin for Expr",1,["egglog::ast::expr::Expr"]],["impl Unpin for NormExpr",1,["egglog::ast::expr::NormExpr"]],["impl Unpin for Desugar",1,["egglog::ast::desugar::Desugar"]],["impl Unpin for Id",1,["egglog::ast::Id"]],["impl Unpin for Metadata",1,["egglog::ast::Metadata"]],["impl Unpin for NormCommand",1,["egglog::ast::NormCommand"]],["impl Unpin for NCommand",1,["egglog::ast::NCommand"]],["impl Unpin for Schedule",1,["egglog::ast::Schedule"]],["impl Unpin for NormSchedule",1,["egglog::ast::NormSchedule"]],["impl Unpin for Command",1,["egglog::ast::Command"]],["impl Unpin for IdentSort",1,["egglog::ast::IdentSort"]],["impl Unpin for RunConfig",1,["egglog::ast::RunConfig"]],["impl Unpin for NormRunConfig",1,["egglog::ast::NormRunConfig"]],["impl Unpin for FunctionDecl",1,["egglog::ast::FunctionDecl"]],["impl Unpin for Variant",1,["egglog::ast::Variant"]],["impl Unpin for Schema",1,["egglog::ast::Schema"]],["impl Unpin for Fact",1,["egglog::ast::Fact"]],["impl Unpin for NormFact",1,["egglog::ast::NormFact"]],["impl Unpin for Action",1,["egglog::ast::Action"]],["impl Unpin for NormAction",1,["egglog::ast::NormAction"]],["impl Unpin for Rule",1,["egglog::ast::Rule"]],["impl Unpin for NormRule",1,["egglog::ast::NormRule"]],["impl Unpin for Rewrite",1,["egglog::ast::Rewrite"]],["impl Unpin for SerializeConfig",1,["egglog::serialize::SerializeConfig"]],["impl Unpin for RationalSort",1,["egglog::sort::rational::RationalSort"]],["impl Unpin for StringSort",1,["egglog::sort::string::StringSort"]],["impl Unpin for UnitSort",1,["egglog::sort::unit::UnitSort"]],["impl Unpin for NotEqualPrimitive",1,["egglog::sort::unit::NotEqualPrimitive"]],["impl Unpin for I64Sort",1,["egglog::sort::i64::I64Sort"]],["impl Unpin for F64Sort",1,["egglog::sort::f64::F64Sort"]],["impl Unpin for MapSort",1,["egglog::sort::map::MapSort"]],["impl Unpin for SetSort",1,["egglog::sort::set::SetSort"]],["impl Unpin for VecSort",1,["egglog::sort::vec::VecSort"]],["impl Unpin for EqSort",1,["egglog::sort::EqSort"]],["impl Unpin for Term",1,["egglog::termdag::Term"]],["impl Unpin for TermDag",1,["egglog::termdag::TermDag"]],["impl Unpin for TypeInfo",1,["egglog::typechecking::TypeInfo"]],["impl Unpin for Value",1,["egglog::value::Value"]],["impl Unpin for RunReport",1,["egglog::RunReport"]],["impl Unpin for ExtractReport",1,["egglog::ExtractReport"]],["impl Unpin for Primitive",1,["egglog::Primitive"]],["impl Unpin for SimplePrimitive",1,["egglog::SimplePrimitive"]],["impl Unpin for CompilerPassStop",1,["egglog::CompilerPassStop"]],["impl Unpin for EGraph",1,["egglog::EGraph"]],["impl Unpin for NotFoundError",1,["egglog::NotFoundError"]],["impl Unpin for Error",1,["egglog::Error"]]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/implementors/core/ops/deref/trait.Deref.js b/docs/implementors/core/ops/deref/trait.Deref.js new file mode 100644 index 000000000..17f15cd8a --- /dev/null +++ b/docs/implementors/core/ops/deref/trait.Deref.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"egglog":[["impl Deref for Primitive"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/implementors/core/panic/unwind_safe/trait.RefUnwindSafe.js b/docs/implementors/core/panic/unwind_safe/trait.RefUnwindSafe.js new file mode 100644 index 000000000..cbce67062 --- /dev/null +++ b/docs/implementors/core/panic/unwind_safe/trait.RefUnwindSafe.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"egglog":[["impl RefUnwindSafe for ActionParser",1,["egglog::ast::parse::__parse__Action::ActionParser"]],["impl RefUnwindSafe for ExprParser",1,["egglog::ast::parse::__parse__Expr::ExprParser"]],["impl RefUnwindSafe for FactParser",1,["egglog::ast::parse::__parse__Fact::FactParser"]],["impl RefUnwindSafe for ProgramParser",1,["egglog::ast::parse::__parse__Program::ProgramParser"]],["impl RefUnwindSafe for Literal",1,["egglog::ast::expr::Literal"]],["impl RefUnwindSafe for Expr",1,["egglog::ast::expr::Expr"]],["impl RefUnwindSafe for NormExpr",1,["egglog::ast::expr::NormExpr"]],["impl RefUnwindSafe for Desugar",1,["egglog::ast::desugar::Desugar"]],["impl RefUnwindSafe for Id",1,["egglog::ast::Id"]],["impl RefUnwindSafe for Metadata",1,["egglog::ast::Metadata"]],["impl RefUnwindSafe for NormCommand",1,["egglog::ast::NormCommand"]],["impl RefUnwindSafe for NCommand",1,["egglog::ast::NCommand"]],["impl RefUnwindSafe for Schedule",1,["egglog::ast::Schedule"]],["impl RefUnwindSafe for NormSchedule",1,["egglog::ast::NormSchedule"]],["impl RefUnwindSafe for Command",1,["egglog::ast::Command"]],["impl RefUnwindSafe for IdentSort",1,["egglog::ast::IdentSort"]],["impl RefUnwindSafe for RunConfig",1,["egglog::ast::RunConfig"]],["impl RefUnwindSafe for NormRunConfig",1,["egglog::ast::NormRunConfig"]],["impl RefUnwindSafe for FunctionDecl",1,["egglog::ast::FunctionDecl"]],["impl RefUnwindSafe for Variant",1,["egglog::ast::Variant"]],["impl RefUnwindSafe for Schema",1,["egglog::ast::Schema"]],["impl RefUnwindSafe for Fact",1,["egglog::ast::Fact"]],["impl RefUnwindSafe for NormFact",1,["egglog::ast::NormFact"]],["impl RefUnwindSafe for Action",1,["egglog::ast::Action"]],["impl RefUnwindSafe for NormAction",1,["egglog::ast::NormAction"]],["impl RefUnwindSafe for Rule",1,["egglog::ast::Rule"]],["impl RefUnwindSafe for NormRule",1,["egglog::ast::NormRule"]],["impl RefUnwindSafe for Rewrite",1,["egglog::ast::Rewrite"]],["impl RefUnwindSafe for SerializeConfig",1,["egglog::serialize::SerializeConfig"]],["impl RefUnwindSafe for RationalSort",1,["egglog::sort::rational::RationalSort"]],["impl RefUnwindSafe for StringSort",1,["egglog::sort::string::StringSort"]],["impl RefUnwindSafe for UnitSort",1,["egglog::sort::unit::UnitSort"]],["impl !RefUnwindSafe for NotEqualPrimitive",1,["egglog::sort::unit::NotEqualPrimitive"]],["impl RefUnwindSafe for I64Sort",1,["egglog::sort::i64::I64Sort"]],["impl RefUnwindSafe for F64Sort",1,["egglog::sort::f64::F64Sort"]],["impl !RefUnwindSafe for MapSort",1,["egglog::sort::map::MapSort"]],["impl !RefUnwindSafe for SetSort",1,["egglog::sort::set::SetSort"]],["impl !RefUnwindSafe for VecSort",1,["egglog::sort::vec::VecSort"]],["impl RefUnwindSafe for EqSort",1,["egglog::sort::EqSort"]],["impl RefUnwindSafe for Term",1,["egglog::termdag::Term"]],["impl RefUnwindSafe for TermDag",1,["egglog::termdag::TermDag"]],["impl !RefUnwindSafe for TypeInfo",1,["egglog::typechecking::TypeInfo"]],["impl RefUnwindSafe for Value",1,["egglog::value::Value"]],["impl RefUnwindSafe for RunReport",1,["egglog::RunReport"]],["impl RefUnwindSafe for ExtractReport",1,["egglog::ExtractReport"]],["impl !RefUnwindSafe for Primitive",1,["egglog::Primitive"]],["impl !RefUnwindSafe for SimplePrimitive",1,["egglog::SimplePrimitive"]],["impl RefUnwindSafe for CompilerPassStop",1,["egglog::CompilerPassStop"]],["impl !RefUnwindSafe for EGraph",1,["egglog::EGraph"]],["impl RefUnwindSafe for NotFoundError",1,["egglog::NotFoundError"]],["impl !RefUnwindSafe for Error",1,["egglog::Error"]]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/implementors/core/panic/unwind_safe/trait.UnwindSafe.js b/docs/implementors/core/panic/unwind_safe/trait.UnwindSafe.js new file mode 100644 index 000000000..0f9fbf71d --- /dev/null +++ b/docs/implementors/core/panic/unwind_safe/trait.UnwindSafe.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"egglog":[["impl UnwindSafe for ActionParser",1,["egglog::ast::parse::__parse__Action::ActionParser"]],["impl UnwindSafe for ExprParser",1,["egglog::ast::parse::__parse__Expr::ExprParser"]],["impl UnwindSafe for FactParser",1,["egglog::ast::parse::__parse__Fact::FactParser"]],["impl UnwindSafe for ProgramParser",1,["egglog::ast::parse::__parse__Program::ProgramParser"]],["impl UnwindSafe for Literal",1,["egglog::ast::expr::Literal"]],["impl UnwindSafe for Expr",1,["egglog::ast::expr::Expr"]],["impl UnwindSafe for NormExpr",1,["egglog::ast::expr::NormExpr"]],["impl UnwindSafe for Desugar",1,["egglog::ast::desugar::Desugar"]],["impl UnwindSafe for Id",1,["egglog::ast::Id"]],["impl UnwindSafe for Metadata",1,["egglog::ast::Metadata"]],["impl UnwindSafe for NormCommand",1,["egglog::ast::NormCommand"]],["impl UnwindSafe for NCommand",1,["egglog::ast::NCommand"]],["impl UnwindSafe for Schedule",1,["egglog::ast::Schedule"]],["impl UnwindSafe for NormSchedule",1,["egglog::ast::NormSchedule"]],["impl UnwindSafe for Command",1,["egglog::ast::Command"]],["impl UnwindSafe for IdentSort",1,["egglog::ast::IdentSort"]],["impl UnwindSafe for RunConfig",1,["egglog::ast::RunConfig"]],["impl UnwindSafe for NormRunConfig",1,["egglog::ast::NormRunConfig"]],["impl UnwindSafe for FunctionDecl",1,["egglog::ast::FunctionDecl"]],["impl UnwindSafe for Variant",1,["egglog::ast::Variant"]],["impl UnwindSafe for Schema",1,["egglog::ast::Schema"]],["impl UnwindSafe for Fact",1,["egglog::ast::Fact"]],["impl UnwindSafe for NormFact",1,["egglog::ast::NormFact"]],["impl UnwindSafe for Action",1,["egglog::ast::Action"]],["impl UnwindSafe for NormAction",1,["egglog::ast::NormAction"]],["impl UnwindSafe for Rule",1,["egglog::ast::Rule"]],["impl UnwindSafe for NormRule",1,["egglog::ast::NormRule"]],["impl UnwindSafe for Rewrite",1,["egglog::ast::Rewrite"]],["impl UnwindSafe for SerializeConfig",1,["egglog::serialize::SerializeConfig"]],["impl UnwindSafe for RationalSort",1,["egglog::sort::rational::RationalSort"]],["impl UnwindSafe for StringSort",1,["egglog::sort::string::StringSort"]],["impl UnwindSafe for UnitSort",1,["egglog::sort::unit::UnitSort"]],["impl !UnwindSafe for NotEqualPrimitive",1,["egglog::sort::unit::NotEqualPrimitive"]],["impl UnwindSafe for I64Sort",1,["egglog::sort::i64::I64Sort"]],["impl UnwindSafe for F64Sort",1,["egglog::sort::f64::F64Sort"]],["impl !UnwindSafe for MapSort",1,["egglog::sort::map::MapSort"]],["impl !UnwindSafe for SetSort",1,["egglog::sort::set::SetSort"]],["impl !UnwindSafe for VecSort",1,["egglog::sort::vec::VecSort"]],["impl UnwindSafe for EqSort",1,["egglog::sort::EqSort"]],["impl UnwindSafe for Term",1,["egglog::termdag::Term"]],["impl UnwindSafe for TermDag",1,["egglog::termdag::TermDag"]],["impl !UnwindSafe for TypeInfo",1,["egglog::typechecking::TypeInfo"]],["impl UnwindSafe for Value",1,["egglog::value::Value"]],["impl UnwindSafe for RunReport",1,["egglog::RunReport"]],["impl UnwindSafe for ExtractReport",1,["egglog::ExtractReport"]],["impl !UnwindSafe for Primitive",1,["egglog::Primitive"]],["impl !UnwindSafe for SimplePrimitive",1,["egglog::SimplePrimitive"]],["impl UnwindSafe for CompilerPassStop",1,["egglog::CompilerPassStop"]],["impl !UnwindSafe for EGraph",1,["egglog::EGraph"]],["impl UnwindSafe for NotFoundError",1,["egglog::NotFoundError"]],["impl !UnwindSafe for Error",1,["egglog::Error"]]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/implementors/core/str/traits/trait.FromStr.js b/docs/implementors/core/str/traits/trait.FromStr.js new file mode 100644 index 000000000..c4fad139d --- /dev/null +++ b/docs/implementors/core/str/traits/trait.FromStr.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"egglog":[["impl FromStr for CompilerPassStop"]] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/implementors/egglog/ast/parse/trait.__ToTriple.js b/docs/implementors/egglog/ast/parse/trait.__ToTriple.js new file mode 100644 index 000000000..1c3c91f19 --- /dev/null +++ b/docs/implementors/egglog/ast/parse/trait.__ToTriple.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"egglog":[] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/implementors/egglog/sort/trait.FromSort.js b/docs/implementors/egglog/sort/trait.FromSort.js new file mode 100644 index 000000000..1c3c91f19 --- /dev/null +++ b/docs/implementors/egglog/sort/trait.FromSort.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"egglog":[] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/implementors/egglog/sort/trait.IntoSort.js b/docs/implementors/egglog/sort/trait.IntoSort.js new file mode 100644 index 000000000..1c3c91f19 --- /dev/null +++ b/docs/implementors/egglog/sort/trait.IntoSort.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"egglog":[] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/implementors/egglog/sort/trait.Sort.js b/docs/implementors/egglog/sort/trait.Sort.js new file mode 100644 index 000000000..1c3c91f19 --- /dev/null +++ b/docs/implementors/egglog/sort/trait.Sort.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"egglog":[] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/implementors/egglog/trait.PrimitiveLike.js b/docs/implementors/egglog/trait.PrimitiveLike.js new file mode 100644 index 000000000..1c3c91f19 --- /dev/null +++ b/docs/implementors/egglog/trait.PrimitiveLike.js @@ -0,0 +1,3 @@ +(function() {var implementors = { +"egglog":[] +};if (window.register_implementors) {window.register_implementors(implementors);} else {window.pending_implementors = implementors;}})() \ No newline at end of file diff --git a/docs/search-index.js b/docs/search-index.js new file mode 100644 index 000000000..7bc7193c5 --- /dev/null +++ b/docs/search-index.js @@ -0,0 +1,5 @@ +var searchIndex = JSON.parse('{\ +"egglog":{"doc":"","t":"NNGNENDENDRNNNDNNNDNINDDDGEDNNNDNNNRDNKLLLLOLLLKLMAMLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLMLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLMLLLLMLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLMLLLLLLLLLMMLLLLMMLLLLLLLLLLLLLLLMLLMOMMKLMMLLLLLMMMLLLLLLLLMLLLLLLMMLLLLLAMLMLMMLLLLLLLLLLLLLOLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLOMALLMLLLLLLLLLLLLLENNNNNNNNNNNNNNEGNNNNNNNENNNNNENNNNNDDDNNNNNNNNNEDEENDEEDNDENNNNNNNNNNNNNNDNDNNNDNNNNEDNNNNNNNNNNDNNNNDLLMMLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLMLLLLLMMMMALLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMLLLLLLLLLLLLLLLLLLLLLLLLLMLLLLLLLLLLLLMMMMMLLMALLLLLLLLLLLMMMMMLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMMMMMMMMMMMMMMMMMMDLLLLLLLLLLLLLLLLLDDDDILLLLLLLLLLLLLLLLLLLLLLLLKLLLLLLLLLLLLLLLLDDIDIDDGDDIQQDDDLLKLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLKKLLLLLLLLLLLLKLLLLLLLLLLMLLLLLLLLLLLLLLLLLKLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLGG","n":["All","App","ArcSort","CheckError","CompilerPassStop","Desugar","EGraph","Error","ExpectFail","ExtractReport","HIGH_COST","IoError","Lit","MergeError","NotFoundError","NotFoundError","ParseError","Pop","Primitive","PrimitiveError","PrimitiveLike","Proofs","RunReport","SerializeConfig","SimplePrimitive","Subst","Term","TermDag","TermEncoding","TypeError","TypeErrors","TypeInfo","TypecheckDesugared","TypecheckProofs","TypecheckTermEncoding","UNIT_SYM","Value","Var","accept","accept","add_arcsort","add_arcsort","add_primitive","add_primitives","add_rule","add_sort","app","apply","apply","apply_time","ast","bits","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clear","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","cmp","compare","compile_actions","compile_expr","cost","declare_constructor","declare_function","declare_sort","default","default","default","default","default","deref","eq","eq","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","eval_actions","eval_expr","eval_lit","expr","expr_to_term","extract","extract_expr","extract_variants","fact_directory","fake","find","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from_id","from_str","func_types","function_to_dag","get","get_extract_report","get_hash","get_hash","get_hash","get_hash","get_run_report","get_sort","global_bindings","global_types","hash","hash","hash","hash","hashcons","include_temporary_functions","into","into","into","into","into","into","into","into","into","into","into","into","into","is_interactive_mode","lit","local_types","lookup","lookup","match_limit","match_term_app","max_calls_per_function","max_functions","name","name","node_limit","nodes","num_tuples","parse_and_run_program","parse_program","partial_cmp","pop","presort_names","presorts","primitives","print_function","print_size","process_commands","provide","provide","push","rebuild","rebuild_nofail","rebuild_time","reserved_type","run_actions","run_program","run_rules","run_rules_once","run_schedule","search_time","seminaive","serialize","serialize_for_graphviz","set_option","set_underscores_for_desugaring","size","sort","sorts","source","tag","term_to_expr","termdag","test_proofs","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","to_string","to_string","to_string","to_tt","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","union","union","unit","unpack","updated","util","value_to_id","var","variants","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","Action","Action","AddRuleset","AddRuleset","Assign","AssignLit","AssignVar","BiRewrite","Calc","Call","Call","Check","Check","CheckProof","CheckProof","Command","CommandId","Compute","ConstrainEq","Datatype","Declare","Delete","Delete","Eq","Expr","Expr","Extract","Extract","Extract","F64","Fact","Fact","Fail","Fail","Function","Function","FunctionDecl","Id","IdentSort","Include","Input","Input","Int","Let","Let","LetLit","LetVar","Lit","Literal","Metadata","NCommand","NormAction","NormAction","NormCommand","NormExpr","NormFact","NormRule","NormRule","NormRunConfig","NormSchedule","Output","Output","Panic","Panic","Pop","Pop","PrintSize","PrintSize","PrintTable","PrintTable","Push","Push","Repeat","Repeat","Rewrite","Rewrite","Rule","Rule","Run","Run","RunConfig","RunSchedule","RunSchedule","Saturate","Saturate","Schedule","Schema","Sequence","Sequence","Set","Set","SetOption","SetOption","Simplify","Sort","Sort","String","Symbol","Union","Union","Unit","Var","Variant","as_str","ast_size","body","body","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","call","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","cmp","cmp","cmp","cmp","cmp","command","compare","compare","compare","compare","compare","conditions","cost","cost","default","desugar","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","equivalent","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fold","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from_str","get_hash","get_hash","get_hash","get_hash","get_hash","get_hash","get_hash","get_hash","get_hash","get_hash","get_hash","get_hash","get_hash","get_hash","get_hash","get_hash","get_hash","get_hash","get_hash","get_hash","get_hash","get_var","globals_used_in_matcher","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","hash","head","head","id","ident","input","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","into","is_var","lhs","lit","load","map","map_def_use","map_exprs","map_exprs","map_exprs","map_exprs","map_exprs","map_exprs","map_exprs","map_run_commands","merge","merge_action","metadata","name","name","new","new","output","parse","partial_cmp","partial_cmp","partial_cmp","partial_cmp","partial_cmp","relation","replace_canon","resugar","resugar","resugar_actions","resugar_facts","rhs","ruleset","ruleset","schema","sort","store","subst","subst","to_action","to_command","to_command","to_expr","to_fact","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_rule","to_run_config","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","to_string","transforms_to","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","types","unextractable","until","until","vars","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","walk","expr","exprs","fact","file","file","name","name","name","name","name","rule","ruleset","schedule","sort","value","variants","variants","exprs","file","file","name","name","name","rule","ruleset","value","Desugar","borrow","borrow_mut","clone","clone_into","declare","default","from","get_fresh","get_new_id","into","merge_ruleset_name","parse_program","to_owned","try_from","try_into","type_id","vzip","ActionParser","ExprParser","FactParser","ProgramParser","__ToTriple","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","from","from","from","from","into","into","into","into","new","new","new","new","parse","parse","parse","parse","to_triple","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","EqSort","F64Sort","FromSort","I64Sort","IntoSort","MapSort","NotEqualPrimitive","PreSort","RationalSort","SetSort","Sort","Sort","Sort","StringSort","UnitSort","VecSort","accept","apply","as_arc_any","as_arc_any","as_arc_any","as_arc_any","as_arc_any","as_arc_any","as_arc_any","as_arc_any","as_arc_any","as_arc_any","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","canonicalize","canonicalize","canonicalize","canonicalize","canonicalize","element_name","element_name","extract_expr","extract_expr","extract_expr","extract_expr","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","foreach_tracked_values","from","from","from","from","from","from","from","from","from","from","inner_values","inner_values","inner_values","inner_values","into","into","into","into","into","into","into","into","into","into","is_container_sort","is_container_sort","is_container_sort","is_container_sort","is_eq_container_sort","is_eq_container_sort","is_eq_container_sort","is_eq_container_sort","is_eq_sort","is_eq_sort","load","make_expr","make_expr","make_expr","make_expr","make_expr","make_expr","make_expr","make_expr","make_expr","make_expr","make_sort","make_sort","make_sort","name","name","name","name","name","name","name","name","name","name","name","name","new","new","new","new","new","presort_names","presort_names","presort_names","register_primitives","register_primitives","register_primitives","register_primitives","register_primitives","register_primitives","register_primitives","register_primitives","register_primitives","store","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","IndexMap","IndexSet"],"q":[[0,"egglog"],[331,"egglog::ast"],[979,"egglog::ast::Command"],[996,"egglog::ast::NCommand"],[1005,"egglog::ast::desugar"],[1023,"egglog::ast::parse"],[1069,"egglog::sort"],[1256,"egglog::util"]],"d":["","","","","","","","","","","","","","","","","","","","","","","","","","","Like Exprs but with sharing and deduplication.","A hashconsing arena for Terms.","","","","","","","","","","","","","","","","","","","Make and return a Term::App with the given head symbol and …","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Recursively converts the given expression to a term.","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","","","","Returns the argument unchanged.","Returns the argument unchanged.","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","","Returns the argument unchanged.","","","","","","Convert the given id to the corresponding term.","Gets the last extract report and returns it, if the last …","","","","","Gets the last run report and returns it, if the last …","","","","","","","","","","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","Make and return a Term::Lit with the given literal, and …","","Convert the given term to its id.","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Serialize the egraph into a format that can be read by the …","Serializes the egraph for export to graphviz.","","","Returns the number of nodes in this DAG.","","","","","Recursively converts the given term to an expression.","","","","","","","","","","","","Converts the given term to a string.","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Make and return a Term::Var with the given symbol, and …","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Must be at least two things in an eq fact","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","A interned string in the global symbol table.","","","","","","Convert this symbol into the string in the static, global …","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","","","Returns the argument unchanged.","","","Returns the argument unchanged.","Returns the argument unchanged.","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","Intern a string into the global symbol table.","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","","","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","For values like EqSort containers, to make/extract an …","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Return the inner values and sorts. Only eq_container_sort …","","","","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","Extracting an expression (with smallest cost) out of a …","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""],"i":[20,15,0,12,0,20,0,0,12,0,0,12,15,12,0,12,12,12,0,12,0,20,0,0,0,0,0,0,20,12,12,0,20,20,20,0,0,15,38,4,5,7,5,0,7,5,14,38,4,18,0,17,27,4,15,14,5,17,18,19,8,20,7,34,12,27,4,15,14,5,17,18,19,8,20,7,34,12,7,15,14,5,17,18,19,8,20,7,15,14,5,17,18,19,8,20,7,17,17,7,7,19,7,7,5,27,14,5,18,7,8,15,14,17,8,20,15,15,15,14,14,14,17,17,17,8,8,8,20,20,20,7,7,7,19,14,7,7,7,7,17,7,15,14,17,18,19,8,20,20,34,34,12,12,27,4,15,14,5,17,17,17,17,18,19,8,8,20,7,34,12,12,12,17,20,5,7,14,7,15,17,8,20,7,5,7,5,15,17,8,20,14,27,27,4,15,14,5,17,18,19,8,20,7,34,12,7,14,5,14,5,7,0,27,27,38,4,7,14,7,7,7,17,7,5,5,5,7,7,7,34,12,7,7,7,18,5,7,7,7,7,7,18,7,7,7,7,7,14,0,5,12,17,14,19,7,15,14,5,17,18,19,8,20,7,14,20,34,12,0,27,4,15,14,5,17,18,19,8,20,7,34,12,27,4,15,14,5,17,18,19,8,20,7,34,12,27,4,15,14,5,17,18,19,8,20,7,34,12,18,7,17,0,18,0,7,14,19,27,4,15,14,5,17,18,19,8,20,7,34,12,0,51,62,51,68,68,68,51,51,24,60,62,51,62,51,0,0,68,68,51,51,23,69,67,0,23,51,23,69,29,0,67,62,51,62,51,0,0,0,51,62,51,29,23,69,69,69,24,0,0,0,0,62,0,0,0,0,62,0,0,62,51,23,69,62,51,62,51,62,51,62,51,63,55,0,51,0,51,63,55,0,62,51,63,55,0,0,63,55,23,69,62,51,51,62,51,29,0,23,69,29,24,0,11,24,10,70,11,29,24,60,31,61,52,62,63,55,51,64,65,54,26,25,66,67,68,23,69,10,70,71,11,29,24,60,31,61,52,62,63,55,51,64,65,54,26,25,66,67,68,23,69,10,70,71,24,11,29,24,60,31,61,52,62,63,55,51,64,65,54,26,25,66,67,68,23,69,10,70,71,11,29,24,60,31,61,52,62,63,55,51,64,65,54,26,25,66,67,68,23,69,10,70,71,11,29,24,60,31,52,11,29,24,60,31,71,26,25,26,0,11,29,24,60,31,61,52,62,63,55,64,65,54,26,25,66,67,68,23,69,70,11,11,11,29,29,29,24,24,24,60,60,60,31,31,31,61,61,61,52,52,52,62,62,62,63,63,63,55,55,55,64,64,64,65,65,65,54,54,54,26,26,26,25,25,25,66,66,66,67,67,67,68,68,68,23,23,23,69,69,69,70,70,70,11,11,29,29,24,24,60,60,31,31,61,52,52,62,62,63,63,55,55,51,51,64,64,65,54,26,25,66,67,67,68,68,23,23,69,69,10,10,70,70,71,71,24,11,11,11,11,11,11,29,29,29,29,24,60,31,31,61,52,62,63,55,51,64,65,54,26,25,66,67,68,23,69,10,70,71,11,11,29,24,60,31,61,52,62,63,55,64,65,54,26,25,66,67,68,23,69,70,24,70,11,29,24,60,31,61,52,62,63,55,64,65,54,26,25,66,67,68,23,69,70,10,70,61,64,66,11,29,24,60,31,61,52,62,63,55,51,64,65,54,26,25,66,67,68,23,69,10,70,71,24,71,24,11,24,70,62,67,68,23,69,10,70,55,26,26,52,26,25,11,66,66,0,11,29,24,60,31,26,23,52,70,70,70,71,65,54,26,64,11,24,67,69,52,62,60,68,11,29,24,60,31,61,52,62,63,55,51,64,65,54,26,25,66,67,68,23,69,10,70,71,70,54,11,29,24,60,31,52,62,63,55,51,64,67,68,23,69,10,70,71,52,11,29,24,60,31,61,52,62,63,55,51,64,65,54,26,25,66,67,68,23,69,10,70,71,11,29,24,60,31,61,52,62,63,55,51,64,65,54,26,25,66,67,68,23,69,10,70,71,11,29,24,60,31,61,52,62,63,55,51,64,65,54,26,25,66,67,68,23,69,10,70,71,25,26,65,54,24,11,29,24,60,31,61,52,62,63,55,51,64,65,54,26,25,66,67,68,23,69,10,70,71,24,99,100,101,102,100,103,104,105,106,102,106,106,99,105,103,104,101,107,107,108,109,110,108,110,110,109,0,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,81,0,0,0,0,0,82,83,84,85,82,83,84,85,82,83,84,85,82,83,84,85,82,83,84,85,82,83,84,85,111,82,83,84,85,82,83,84,85,82,83,84,85,82,83,84,85,0,0,0,0,0,0,0,0,0,0,0,112,113,0,0,0,87,87,13,89,90,91,92,93,94,95,96,97,87,89,90,91,92,93,94,95,96,97,87,89,90,91,92,93,94,95,96,97,13,94,95,96,97,95,96,13,94,95,96,89,90,91,92,93,94,95,96,97,13,87,89,90,91,92,93,94,95,96,97,13,94,95,96,87,89,90,91,92,93,94,95,96,97,13,94,95,96,13,94,95,96,13,97,112,13,89,90,91,92,93,94,95,96,97,94,95,96,13,87,89,90,91,92,93,94,95,96,97,97,89,90,91,92,93,94,95,96,13,89,90,91,92,93,94,95,96,113,87,89,90,91,92,93,94,95,96,97,87,89,90,91,92,93,94,95,96,97,87,89,90,91,92,93,94,95,96,97,87,89,90,91,92,93,94,95,96,97,0,0],"f":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,[[[2,[1]]],[[3,[1]]]],[[4,[2,[1]]],[[3,[1]]]],[[5,1],[[6,[0]]]],[[7,1],[[6,[0]]]],[[5,[9,[8]]]],0,[[7,10,11],[[6,[11,12]]]],[[5,13]],[[14,11,[16,[15]]],15],[[[2,[17]]],[[3,[17]]]],[[4,[2,[17]]],[[3,[17]]]],0,0,0,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[7],[15,15],[14,14],[5,5],[17,17],[18,18],[19,19],[8,8],[20,20],[7,7],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[17,17],21],[[],21],[[7,[22,[11,1]],[2,[23]]],[[6,[0,[16,[0]]]]]],[[7,[22,[11,1]],24,[3,[1]]],[[6,[[16,[0]]]]]],0,[[7,25,[9,[11]]],[[6,[12]]]],[[7,26],[[6,[12]]]],[[5,[9,[11]],3],[[6,[0]]]],[[],27],[[],14],[[],5],[[],18],[[],7],[8],[[15,15],28],[[14,14],28],[[17,17],28],[[8,8],28],[[20,20],28],[[],28],[[],28],[[],28],[[],28],[[],28],[[],28],[[],28],[[],28],[[],28],[[],28],[[],28],[[],28],[[],28],[[],28],[[],28],[[7,[2,[23]]],[[6,[12]]]],[[7,24,[3,[1]],28],[[6,[12]]]],[[7,29],17],0,[[14,24],15],[[7,17,14,1]],[[7,24,30],[[6,[19,12]]]],[[7,17,30,14],[[16,[15]]]],0,[[],17],[[7,31],31],[[15,32],33],[[14,32],33],[[17,32],33],[[18,32],33],[[19,32],33],[[8,32],33],[[20,32],33],[[20,32],33],[[34,32],33],[[34,32],33],[[12,32],33],[[12,32],33],[[]],[[]],[[]],[[]],[[]],[[]],[[[36,[35]]],17],[37,17],[11,17],[[]],[[]],[38,8],[[]],[[]],[[]],[[]],[[[40,[30,39,39]]],12],[[]],[34,12],[[11,31],17],[41,[[6,[20]]]],0,[[7,11,30],[[6,[12]]]],0,[7,[[3,[19]]]],[[[0,[42,43]],44],45],[[[0,[42,43]],44],45],[[[0,[42,43]],44],45],[[[0,[42,43]],44],45],[7,[[3,[18]]]],[5,[[48,[[0,[13,46,47]]]]]],0,0,[[15,49]],[[17,49]],[[8,49]],[[20,49]],0,0,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[7,28],[[14,29],15],0,0,[[5,50,11],[[6,[1,0]]]],0,0,0,0,[[],11],[4,11],0,0,[7,30],[[7,41],[[6,[[16,[39]],12]]]],[[7,41],[[6,[[16,[51]],12]]]],[[17,17],[[3,[21]]]],[7,[[6,[12]]]],0,0,0,[[7,11,30],[[6,[12]]]],[[7,11],[[6,[12]]]],[[7,[16,[51]],20],[[6,[[16,[52]],12]]]],[53],[53],[7],[7,[[6,[30,12]]]],[7,30],0,[[5,11],[[3,[1]]]],0,[[7,[16,[51]]],[[6,[[16,[39]],12]]]],[[7,54],18],[[7,54,18]],[[7,55],18],0,0,[[7,27],56],[7,56],[[7,41,24]],[[7,30]],[14,30],0,0,[12,[[3,[57]]]],0,[[14,15],24],0,0,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[14,15],39],[[],39],[[],39],[[],39],0,[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],58],[[],58],[[],58],[[],58],[[],58],[[],58],[[],58],[[],58],[[],58],[[],58],[[],58],[[],58],[[],58],[[18,18],18],[[7,31,31,11],31],[[],17],0,0,0,[[7,17],3],[[14,11],15],0,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,[11,41],[24,30],0,0,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[[9,[11]],59],24],[11,11],[29,29],[24,24],[60,60],[31,31],[61,61],[52,52],[62,62],[63,63],[55,55],[51,51],[64,64],[65,65],[54,54],[26,26],[25,25],[66,66],[67,67],[68,68],[23,23],[69,69],[10,10],[70,70],[71,71],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[11,11],21],[[29,29],21],[[24,24],21],[[60,60],21],[[31,31],21],0,[[],21],[[],21],[[],21],[[],21],[[],21],0,0,0,0,0,[[11,11],28],[[29,29],28],[[24,24],28],[[60,60],28],[[31,31],28],[[61,61],28],[[52,52],28],[[62,62],28],[[63,63],28],[[55,55],28],[[64,64],28],[[65,65],28],[[54,54],28],[[26,26],28],[[25,25],28],[[66,66],28],[[67,67],28],[[68,68],28],[[23,23],28],[[69,69],28],[[70,70],28],[[],28],[[],28],[[],28],[[],28],[[],28],[[],28],[[],28],[[],28],[[],28],[[],28],[[],28],[[],28],[[],28],[[],28],[[],28],[[],28],[[],28],[[],28],[[],28],[[],28],[[],28],[[],28],[[],28],[[],28],[[],28],[[],28],[[],28],[[],28],[[],28],[[],28],[[],28],[[],28],[[],28],[[],28],[[],28],[[],28],[[],28],[[],28],[[],28],[[],28],[[],28],[[],28],[[],28],[[],28],[[],28],[[],28],[[],28],[[],28],[[],28],[[],28],[[],28],[[],28],[[],28],[[],28],[[],28],[[],28],[[],28],[[],28],[[],28],[[],28],[[],28],[[],28],[[],28],[[11,32],[[6,[72]]]],[[11,32],[[6,[72]]]],[[29,32],33],[[29,32],33],[[24,32],33],[[24,32],33],[[60,32],33],[[60,32],33],[[31,32],33],[[31,32],33],[[61,32],33],[[52,32],33],[[52,32],33],[[62,32],33],[[62,32],33],[[63,32],33],[[63,32],33],[[55,32],33],[[55,32],33],[[51,32],33],[[51,32],33],[[64,32],33],[[64,32],33],[[65,32],33],[[54,32],33],[[26,32],33],[[25,32],33],[[66,32],33],[[67,32],33],[[67,32],33],[[68,32],33],[[68,32],33],[[23,32],33],[[23,32],33],[[69,32],33],[[69,32],33],[[10,32],33],[[10,32],33],[[70,32],33],[[70,32],33],[[71,32],33],[[71,32],33],[[24,73]],[29,11],[39,11],[41,11],[74,11],[[]],[39,11],[11,29],[[]],[37,29],[[[36,[35]]],29],[[]],[[]],[30,31],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[41,[[6,[11]]]],[[[0,[42,43]],44],45],[[[0,[42,43]],44],45],[[[0,[42,43]],44],45],[[[0,[42,43]],44],45],[[[0,[42,43]],44],45],[[[0,[42,43]],44],45],[[[0,[42,43]],44],45],[[[0,[42,43]],44],45],[[[0,[42,43]],44],45],[[[0,[42,43]],44],45],[[[0,[42,43]],44],45],[[[0,[42,43]],44],45],[[[0,[42,43]],44],45],[[[0,[42,43]],44],45],[[[0,[42,43]],44],45],[[[0,[42,43]],44],45],[[[0,[42,43]],44],45],[[[0,[42,43]],44],45],[[[0,[42,43]],44],45],[[[0,[42,43]],44],45],[[[0,[42,43]],44],45],[24,[[3,[11]]]],[[[16,[68]]],[[77,[11,[76,[75]]]]]],[[11,49]],[[29,49]],[[24,49]],[[60,49]],[[31,49]],[[61,49]],[[52,49]],[[62,49]],[[63,49]],[[55,49]],[[64,49]],[[65,49]],[[54,49]],[[26,49]],[[25,49]],[[66,49]],[[67,49]],[[68,49]],[[23,49]],[[69,49]],[[70,49]],0,0,0,0,0,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[24,28],0,[[[9,[29]]],24],[17,11],[[24,73],24],[[70,73],70],[[62,73],62],[[67,73],67],[[68,73],68],[[23,73],23],[[69,73],69],[[10,73],10],[[70,73],70],[[55,73],63],0,0,0,0,0,[[[78,[41]]],11],[[[16,[11]],11],66],0,0,[[11,11],[[3,[21]]]],[[29,29],[[3,[21]]]],[[24,24],[[3,[21]]]],[[60,60],[[3,[21]]]],[[31,31],[[3,[21]]]],[[11,[16,[11]]],26],[[23,[79,[11,24,[76,[75]]]]],23],[52,51],[70,10],[[70,[79,[11,24,[76,[75]]]]],[[16,[23]]]],[[[16,[68]],[79,[11,24,[76,[75]]]]],[[16,[67]]]],0,0,0,0,0,[11,[[3,[17]]]],[[24,[79,[11,24,[76,[75]]]]],24],[[67,[79,[11,24,[76,[75]]]]],67],[69,23],[52,51],[62,51],[60,24],[68,67],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[70,10],[54,65],[[],39],[[],39],[[],39],[[],39],[[],39],[[],39],[[],39],[[],39],[[],39],[[],39],[[],39],[[],39],[[],39],[[],39],[[],39],[[],39],[[],39],[[],39],[[52,[16,[62]]],[[16,[52]]]],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],58],[[],58],[[],58],[[],58],[[],58],[[],58],[[],58],[[],58],[[],58],[[],58],[[],58],[[],58],[[],58],[[],58],[[],58],[[],58],[[],58],[[],58],[[],58],[[],58],[[],58],[[],58],[[],58],[[],58],0,0,0,0,[24,80],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[24,73,73]],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,[[]],[[]],[81,81],[[]],[[81,11,11],[[16,[62]]]],[[],81],[[]],[81,11],[81,50],[[]],[81,11],[[81,41],[[6,[[16,[51]],12]]]],[[]],[[],6],[[],6],[[],58],[[]],0,0,0,0,0,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[],82],[[],83],[[],84],[[],85],[[82,41],[[6,[23,[40,[30,86,39]]]]]],[[83,41],[[6,[24,[40,[30,86,39]]]]]],[[84,41],[[6,[67,[40,[30,86,39]]]]]],[[85,41],[[6,[[16,[51]],[40,[30,86,39]]]]]],[[],[[6,[[40,[30,86,39]]]]]],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],58],[[],58],[[],58],[[],58],[[]],[[]],[[]],[[]],0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,[[87,[2,[1]]],[[3,[1]]]],[[87,[2,[17]]],[[3,[17]]]],[48,[[48,[88]]]],[[[48,[89]]],[[48,[88]]]],[[[48,[90]]],[[48,[88]]]],[[[48,[91]]],[[48,[88]]]],[[[48,[92]]],[[48,[88]]]],[[[48,[93]]],[[48,[88]]]],[[[48,[94]]],[[48,[88]]]],[[[48,[95]]],[[48,[88]]]],[[[48,[96]]],[[48,[88]]]],[[[48,[97]]],[[48,[88]]]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],0,0,0,0,0,[95,11],[96,11],0,0,0,0,[[89,32],33],[[90,32],33],[[91,32],33],[[92,32],33],[[93,32],33],[[94,32],33],[[95,32],33],[[96,32],33],[[97,32],33],[[17,[98,[73]]]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[17,16],[[94,17],16],[[95,17],16],[[96,17],16],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[],28],[94,28],[95,28],[96,28],[[],28],[94,28],[95,28],[96,28],[[],28],[97,28],[17],[[7,17]],[[89,7,17]],[[90,7,17]],[[91,7,17]],[[92,7,17]],[[93,7,17]],[[94,7,17]],[[95,7,17]],[[96,7,17]],[[97,7,17]],[[5,11,[2,[24]]],[[6,[1,0]]]],[[5,11,[2,[24]]],[[6,[1,0]]]],[[5,11,[2,[24]]],[[6,[1,0]]]],[[],11],[87,11],[89,11],[90,11],[91,11],[92,11],[93,11],[94,11],[95,11],[96,11],[97,11],0,[11,89],[11,90],[11,91],[11,92],[11,93],[[],[[16,[11]]]],[[],[[16,[11]]]],[[],[[16,[11]]]],[[48,5]],[[[48,[89]],5]],[[[48,[90]],5]],[[[48,[91]],5]],[[[48,[92]],5]],[[[48,[93]],5]],[[[48,[94]],5]],[[[48,[95]],5]],[[[48,[96]],5]],[[],[[3,[17]]]],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],6],[[],58],[[],58],[[],58],[[],58],[[],58],[[],58],[[],58],[[],58],[[],58],[[],58],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],0,0],"c":[],"p":[[6,"ArcSort"],[15,"slice"],[4,"Option"],[3,"SimplePrimitive"],[3,"TypeInfo"],[4,"Result"],[3,"EGraph"],[3,"Primitive"],[8,"Into"],[3,"Rule"],[3,"Symbol"],[4,"Error"],[8,"Sort"],[3,"TermDag"],[4,"Term"],[3,"Vec"],[3,"Value"],[3,"RunReport"],[3,"ExtractReport"],[4,"CompilerPassStop"],[4,"Ordering"],[6,"IndexMap"],[4,"Action"],[4,"Expr"],[3,"Variant"],[3,"FunctionDecl"],[3,"SerializeConfig"],[15,"bool"],[4,"Literal"],[15,"usize"],[3,"Id"],[3,"Formatter"],[6,"Result"],[3,"NotFoundError"],[15,"f64"],[3,"OrderedFloat"],[15,"i64"],[8,"PrimitiveLike"],[3,"String"],[4,"ParseError"],[15,"str"],[8,"Hash"],[8,"Sized"],[8,"BuildHasher"],[15,"u64"],[8,"Send"],[8,"Sync"],[3,"Arc"],[8,"Hasher"],[6,"CommandId"],[4,"Command"],[3,"NormCommand"],[3,"Demand"],[3,"NormRunConfig"],[4,"NormSchedule"],[3,"EGraph"],[8,"Error"],[3,"TypeId"],[8,"IntoIterator"],[4,"NormExpr"],[3,"Metadata"],[4,"NCommand"],[4,"Schedule"],[3,"IdentSort"],[3,"RunConfig"],[3,"Schema"],[4,"Fact"],[4,"NormFact"],[4,"NormAction"],[3,"NormRule"],[3,"Rewrite"],[3,"Error"],[8,"FnMut"],[3,"NonZeroU32"],[3,"FxHasher"],[3,"BuildHasherDefault"],[3,"HashSet"],[8,"AsRef"],[3,"HashMap"],[8,"Iterator"],[3,"Desugar"],[3,"ActionParser"],[3,"ExprParser"],[3,"FactParser"],[3,"ProgramParser"],[3,"Token"],[3,"NotEqualPrimitive"],[8,"Any"],[3,"RationalSort"],[3,"StringSort"],[3,"UnitSort"],[3,"I64Sort"],[3,"F64Sort"],[3,"MapSort"],[3,"SetSort"],[3,"VecSort"],[3,"EqSort"],[3,"Box"],[13,"Simplify"],[13,"Output"],[13,"Extract"],[13,"Input"],[13,"SetOption"],[13,"Datatype"],[13,"Declare"],[13,"Rule"],[13,"Output"],[13,"Input"],[13,"SetOption"],[13,"NormRule"],[8,"__ToTriple"],[8,"FromSort"],[8,"IntoSort"]]}\ +}'); +if (typeof window !== 'undefined' && window.initSearch) {window.initSearch(searchIndex)}; +if (typeof exports !== 'undefined') {exports.searchIndex = searchIndex}; diff --git a/docs/settings.html b/docs/settings.html new file mode 100644 index 000000000..ddcff9a1b --- /dev/null +++ b/docs/settings.html @@ -0,0 +1 @@ +Rustdoc settings

Rustdoc settings

Back
\ No newline at end of file diff --git a/docs/source-files.js b/docs/source-files.js new file mode 100644 index 000000000..2c5bc9c41 --- /dev/null +++ b/docs/source-files.js @@ -0,0 +1,4 @@ +var sourcesIndex = JSON.parse('{\ +"egglog":["",[["ast",[],["desugar.rs","expr.rs","mod.rs"]],["function",[],["binary_search.rs","index.rs","mod.rs","table.rs"]],["sort",[],["f64.rs","i64.rs","macros.rs","map.rs","mod.rs","rational.rs","set.rs","string.rs","unit.rs","vec.rs"]]],["extract.rs","gj.rs","lib.rs","proofs.rs","serialize.rs","termdag.rs","typecheck.rs","typechecking.rs","unionfind.rs","util.rs","value.rs"]]\ +}'); +createSourceSidebar(); diff --git a/docs/src/egglog/ast/desugar.rs.html b/docs/src/egglog/ast/desugar.rs.html new file mode 100644 index 000000000..f59e334a4 --- /dev/null +++ b/docs/src/egglog/ast/desugar.rs.html @@ -0,0 +1,1601 @@ +desugar.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+390
+391
+392
+393
+394
+395
+396
+397
+398
+399
+400
+401
+402
+403
+404
+405
+406
+407
+408
+409
+410
+411
+412
+413
+414
+415
+416
+417
+418
+419
+420
+421
+422
+423
+424
+425
+426
+427
+428
+429
+430
+431
+432
+433
+434
+435
+436
+437
+438
+439
+440
+441
+442
+443
+444
+445
+446
+447
+448
+449
+450
+451
+452
+453
+454
+455
+456
+457
+458
+459
+460
+461
+462
+463
+464
+465
+466
+467
+468
+469
+470
+471
+472
+473
+474
+475
+476
+477
+478
+479
+480
+481
+482
+483
+484
+485
+486
+487
+488
+489
+490
+491
+492
+493
+494
+495
+496
+497
+498
+499
+500
+501
+502
+503
+504
+505
+506
+507
+508
+509
+510
+511
+512
+513
+514
+515
+516
+517
+518
+519
+520
+521
+522
+523
+524
+525
+526
+527
+528
+529
+530
+531
+532
+533
+534
+535
+536
+537
+538
+539
+540
+541
+542
+543
+544
+545
+546
+547
+548
+549
+550
+551
+552
+553
+554
+555
+556
+557
+558
+559
+560
+561
+562
+563
+564
+565
+566
+567
+568
+569
+570
+571
+572
+573
+574
+575
+576
+577
+578
+579
+580
+581
+582
+583
+584
+585
+586
+587
+588
+589
+590
+591
+592
+593
+594
+595
+596
+597
+598
+599
+600
+601
+602
+603
+604
+605
+606
+607
+608
+609
+610
+611
+612
+613
+614
+615
+616
+617
+618
+619
+620
+621
+622
+623
+624
+625
+626
+627
+628
+629
+630
+631
+632
+633
+634
+635
+636
+637
+638
+639
+640
+641
+642
+643
+644
+645
+646
+647
+648
+649
+650
+651
+652
+653
+654
+655
+656
+657
+658
+659
+660
+661
+662
+663
+664
+665
+666
+667
+668
+669
+670
+671
+672
+673
+674
+675
+676
+677
+678
+679
+680
+681
+682
+683
+684
+685
+686
+687
+688
+689
+690
+691
+692
+693
+694
+695
+696
+697
+698
+699
+700
+701
+702
+703
+704
+705
+706
+707
+708
+709
+710
+711
+712
+713
+714
+715
+716
+717
+718
+719
+720
+721
+722
+723
+724
+725
+726
+727
+728
+729
+730
+731
+732
+733
+734
+735
+736
+737
+738
+739
+740
+741
+742
+743
+744
+745
+746
+747
+748
+749
+750
+751
+752
+753
+754
+755
+756
+757
+758
+759
+760
+761
+762
+763
+764
+765
+766
+767
+768
+769
+770
+771
+772
+773
+774
+775
+776
+777
+778
+779
+780
+781
+782
+783
+784
+785
+786
+787
+788
+789
+790
+791
+792
+793
+794
+795
+796
+797
+798
+799
+800
+
use crate::*;
+
+fn desugar_datatype(name: Symbol, variants: Vec<Variant>) -> Vec<NCommand> {
+    vec![NCommand::Sort(name, None)]
+        .into_iter()
+        .chain(variants.into_iter().map(|variant| {
+            NCommand::Function(FunctionDecl {
+                name: variant.name,
+                schema: Schema {
+                    input: variant.types,
+                    output: name,
+                },
+                merge: None,
+                merge_action: vec![],
+                default: None,
+                cost: variant.cost,
+                unextractable: false,
+            })
+        }))
+        .collect()
+}
+
+fn desugar_rewrite(
+    ruleset: Symbol,
+    name: Symbol,
+    rewrite: &Rewrite,
+    desugar: &mut Desugar,
+) -> Vec<NCommand> {
+    let var = Symbol::from("rewrite_var__");
+    // make two rules- one to insert the rhs, and one to union
+    // this way, the union rule can only be fired once,
+    // which helps proofs not add too much info
+    vec![NCommand::NormRule {
+        ruleset,
+        name,
+        rule: flatten_rule(
+            Rule {
+                body: [Fact::Eq(vec![Expr::Var(var), rewrite.lhs.clone()])]
+                    .into_iter()
+                    .chain(rewrite.conditions.clone())
+                    .collect(),
+                head: vec![Action::Union(Expr::Var(var), rewrite.rhs.clone())],
+            },
+            desugar,
+        ),
+    }]
+}
+
+fn desugar_birewrite(
+    ruleset: Symbol,
+    name: Symbol,
+    rewrite: &Rewrite,
+    desugar: &mut Desugar,
+) -> Vec<NCommand> {
+    let rw2 = Rewrite {
+        lhs: rewrite.rhs.clone(),
+        rhs: rewrite.lhs.clone(),
+        conditions: rewrite.conditions.clone(),
+    };
+    desugar_rewrite(ruleset, format!("{}=>", name).into(), rewrite, desugar)
+        .into_iter()
+        .chain(desugar_rewrite(
+            ruleset,
+            format!("{}<=", name).into(),
+            &rw2,
+            desugar,
+        ))
+        .collect()
+}
+
+fn normalize_expr(
+    lhs_in: Symbol,
+    expr: &Expr,
+    desugar: &mut Desugar,
+    res: &mut Vec<NormFact>,
+    constraints: &mut Vec<(Symbol, Symbol)>,
+    bound: &mut HashSet<Symbol>,
+    cache: &mut HashMap<Expr, Symbol>,
+) {
+    let is_bound = |var, desugar: &Desugar, bound_variables: &HashSet<Symbol>| {
+        desugar.global_variables.contains(&var) || bound_variables.contains(&var)
+    };
+    if let Some(var) = cache.get(expr) {
+        if is_bound(lhs_in, desugar, bound) {
+            constraints.push((lhs_in, *var));
+        } else {
+            bound.insert(lhs_in);
+            res.push(NormFact::AssignVar(lhs_in, *var));
+        }
+        return;
+    }
+
+    if let Expr::Var(v) = expr {
+        if *v == lhs_in {
+            return;
+        }
+        if is_bound(lhs_in, desugar, bound) && is_bound(*v, desugar, bound) {
+            constraints.push((lhs_in, *v));
+        } else if is_bound(lhs_in, desugar, bound) {
+            bound.insert(*v);
+            res.push(NormFact::AssignVar(*v, lhs_in));
+        } else if is_bound(*v, desugar, bound) {
+            bound.insert(lhs_in);
+            res.push(NormFact::AssignVar(lhs_in, *v));
+        } else {
+            // TODO give proper error message and handle
+            // a wider variety of queries
+            panic!("Unbound variable {v}");
+        }
+        return;
+    }
+
+    let lhs = if !is_bound(lhs_in, desugar, bound) {
+        bound.insert(lhs_in);
+        lhs_in
+    } else {
+        let fresh = desugar.get_fresh();
+        constraints.push((fresh, lhs_in));
+        fresh
+    };
+
+    match expr {
+        Expr::Lit(l) => res.push(NormFact::AssignLit(lhs, l.clone())),
+        Expr::Var(_v) => {
+            panic!("handled above");
+        }
+        Expr::Call(f, children) => {
+            let is_compute = TypeInfo::default().is_primitive(*f);
+            let mut new_children = vec![];
+            for child in children {
+                match child {
+                    Expr::Var(v) => {
+                        if is_compute {
+                            if !is_bound(*v, desugar, bound) {
+                                panic!("Unbound variable {v} in primitive computation");
+                            }
+                            new_children.push(*v);
+                        } else if is_bound(*v, desugar, bound) {
+                            let fresh = desugar.get_fresh();
+                            new_children.push(fresh);
+                            constraints.push((fresh, *v));
+                        } else {
+                            bound.insert(*v);
+                            new_children.push(*v);
+                        }
+                    }
+                    _ => {
+                        let fresh = desugar.get_fresh();
+                        if !is_compute {
+                            bound.insert(fresh);
+                        }
+                        normalize_expr(fresh, child, desugar, res, constraints, bound, cache);
+                        new_children.push(fresh);
+                    }
+                }
+            }
+
+            if is_compute {
+                res.push(NormFact::Compute(lhs, NormExpr::Call(*f, new_children)));
+            } else {
+                res.push(NormFact::Assign(lhs, NormExpr::Call(*f, new_children)));
+            }
+        }
+    };
+    cache.insert(expr.clone(), lhs);
+}
+
+fn flatten_equalities(equalities: Vec<(Symbol, Expr)>, desugar: &mut Desugar) -> Vec<NormFact> {
+    let mut res = vec![];
+    let mut bound_variables: HashSet<Symbol> = Default::default();
+    let mut constraints: Vec<(Symbol, Symbol)> = Default::default();
+    let mut cache = Default::default();
+
+    for (lhs, rhs) in equalities {
+        normalize_expr(
+            lhs,
+            &rhs,
+            desugar,
+            &mut res,
+            &mut constraints,
+            &mut bound_variables,
+            &mut cache,
+        );
+    }
+
+    for (lhs, rhs) in constraints {
+        res.push(NormFact::ConstrainEq(lhs, rhs));
+    }
+
+    res
+}
+
+fn flatten_facts(facts: &Vec<Fact>, desugar: &mut Desugar) -> Vec<NormFact> {
+    let mut equalities = vec![];
+    for fact in facts {
+        match fact {
+            Fact::Eq(args) => {
+                assert!(args.len() == 2);
+                let lhs = &args[0];
+                let rhs = &args[1];
+                if let Expr::Var(v) = lhs {
+                    equalities.push((*v, rhs.clone()));
+                } else if let Expr::Var(v) = rhs {
+                    equalities.push((*v, lhs.clone()));
+                } else {
+                    let fresh = desugar.get_fresh();
+                    equalities.push((fresh, lhs.clone()));
+                    equalities.push((fresh, rhs.clone()));
+                }
+            }
+            Fact::Fact(expr) => {
+                // we can drop facts that are
+                // just a variable
+                if let Expr::Var(_v) = expr {
+                } else {
+                    equalities.push((desugar.get_fresh(), expr.clone()));
+                }
+            }
+        }
+    }
+
+    flatten_equalities(equalities, desugar)
+}
+
+fn flatten_actions(actions: &Vec<Action>, desugar: &mut Desugar) -> Vec<NormAction> {
+    let mut memo = Default::default();
+    let mut add_expr = |expr: Expr, res: &mut Vec<NormAction>| -> Symbol {
+        desugar.expr_to_flat_actions(&expr, res, &mut memo)
+    };
+
+    let mut res = vec![];
+
+    for action in actions {
+        match action {
+            Action::Let(symbol, expr) => {
+                let added = add_expr(expr.clone(), &mut res);
+                assert_ne!(*symbol, added);
+                res.push(NormAction::LetVar(*symbol, added));
+            }
+            Action::Set(symbol, exprs, rhs) => {
+                let set = NormAction::Set(
+                    NormExpr::Call(
+                        *symbol,
+                        exprs
+                            .clone()
+                            .into_iter()
+                            .map(|ex| add_expr(ex, &mut res))
+                            .collect(),
+                    ),
+                    add_expr(rhs.clone(), &mut res),
+                );
+                res.push(set);
+            }
+            Action::Extract(expr, variants) => {
+                let added = add_expr(expr.clone(), &mut res);
+                let added_variants = add_expr(variants.clone(), &mut res);
+                res.push(NormAction::Extract(added, added_variants));
+            }
+            Action::Delete(symbol, exprs) => {
+                let del = NormAction::Delete(NormExpr::Call(
+                    *symbol,
+                    exprs
+                        .clone()
+                        .into_iter()
+                        .map(|ex| add_expr(ex, &mut res))
+                        .collect(),
+                ));
+                res.push(del);
+            }
+            Action::Union(lhs, rhs) => {
+                let un = NormAction::Union(
+                    add_expr(lhs.clone(), &mut res),
+                    add_expr(rhs.clone(), &mut res),
+                );
+                res.push(un);
+            }
+            Action::Panic(msg) => {
+                res.push(NormAction::Panic(msg.clone()));
+            }
+            Action::Expr(expr) => {
+                add_expr(expr.clone(), &mut res);
+            }
+        };
+    }
+
+    res
+}
+
+fn give_unique_names(desugar: &mut Desugar, facts: Vec<NormFact>) -> Vec<NormFact> {
+    let mut name_used: HashSet<Symbol> = Default::default();
+    let mut constraints: Vec<NormFact> = Default::default();
+    let mut res = vec![];
+    for fact in facts {
+        let mut name_used_immediately: HashSet<Symbol> = Default::default();
+        let mut constraints_before = vec![];
+        let new_fact = fact.map_def_use(&mut |var, is_def| {
+            if is_def {
+                if name_used.insert(var) {
+                    name_used_immediately.insert(var);
+                    var
+                } else {
+                    let fresh = desugar.get_fresh();
+                    // typechecking BS- for primitives
+                    // we need to define variables before they are used
+                    if name_used_immediately.contains(&var) {
+                        constraints.push(NormFact::ConstrainEq(fresh, var));
+                    } else {
+                        constraints_before.push(NormFact::ConstrainEq(fresh, var));
+                    }
+                    fresh
+                }
+            } else {
+                var
+            }
+        });
+        res.extend(constraints_before);
+        res.push(new_fact);
+    }
+
+    res.extend(constraints);
+    res
+}
+
+fn flatten_rule(rule: Rule, desugar: &mut Desugar) -> NormRule {
+    let flat_facts = flatten_facts(&rule.body, desugar);
+    let with_unique_names = give_unique_names(desugar, flat_facts);
+
+    NormRule {
+        head: flatten_actions(&rule.head, desugar),
+        body: with_unique_names,
+    }
+}
+
+fn desugar_schedule(desugar: &mut Desugar, schedule: &Schedule) -> NormSchedule {
+    match schedule {
+        Schedule::Repeat(num, schedule) => {
+            let norm_schedule = desugar_schedule(desugar, schedule);
+            NormSchedule::Repeat(*num, Box::new(norm_schedule))
+        }
+        Schedule::Saturate(schedule) => {
+            let norm_schedule = desugar_schedule(desugar, schedule);
+            NormSchedule::Saturate(Box::new(norm_schedule))
+        }
+        Schedule::Run(run_config) => {
+            let norm_run_config = desugar_run_config(desugar, run_config);
+            NormSchedule::Run(norm_run_config)
+        }
+        Schedule::Sequence(schedules) => {
+            let norm_schedules = schedules
+                .iter()
+                .map(|schedule| desugar_schedule(desugar, schedule))
+                .collect();
+            NormSchedule::Sequence(norm_schedules)
+        }
+    }
+}
+
+fn desugar_run_config(desugar: &mut Desugar, run_config: &RunConfig) -> NormRunConfig {
+    let RunConfig { ruleset, until } = run_config;
+    NormRunConfig {
+        ruleset: *ruleset,
+        until: until.clone().map(|facts| flatten_facts(&facts, desugar)),
+    }
+}
+
+fn add_semi_naive_rule(desugar: &mut Desugar, rule: Rule) -> Option<Rule> {
+    let mut new_rule = rule;
+    // Whenever an Let(_, expr@Call(...)) or Set(_, expr@Call(...)) is present in action,
+    // an additional seminaive rule should be created.
+    // Moreover, for each such expr, expr and all variable definitions that it relies on should be moved to trigger.
+    let mut new_head_atoms = vec![];
+    let mut add_new_rule = false;
+
+    let mut var_set = HashSet::default();
+    for head_slice in new_rule.head.iter_mut().rev() {
+        match head_slice {
+            Action::Set(_, _, expr) => {
+                var_set.extend(expr.vars());
+                if let Expr::Call(_, _) = expr {
+                    add_new_rule = true;
+
+                    let fresh_symbol = desugar.get_fresh();
+                    let fresh_var = Expr::Var(fresh_symbol);
+                    let expr = std::mem::replace(expr, fresh_var.clone());
+                    new_head_atoms.push(Fact::Eq(vec![fresh_var, expr]));
+                };
+            }
+            Action::Let(symbol, expr) if var_set.contains(symbol) => {
+                var_set.extend(expr.vars());
+                if let Expr::Call(_, _) = expr {
+                    add_new_rule = true;
+
+                    let var = Expr::Var(*symbol);
+                    new_head_atoms.push(Fact::Eq(vec![var, expr.clone()]));
+                }
+            }
+            _ => (),
+        }
+    }
+
+    if add_new_rule {
+        new_rule.body.extend(new_head_atoms.into_iter().rev());
+        // remove all let action
+        new_rule
+            .head
+            .retain_mut(|action| !matches!(action, Action::Let(var, _) if var_set.contains(var)));
+        log::debug!("Added a semi-naive desugared rule:\n{}", new_rule);
+        Some(new_rule)
+    } else {
+        None
+    }
+}
+
+pub struct Desugar {
+    next_fresh: usize,
+    next_command_id: usize,
+    pub(crate) parser: ast::parse::ProgramParser,
+    // TODO fix getting fresh names using modules
+    pub(crate) number_underscores: usize,
+    pub(crate) global_variables: HashSet<Symbol>,
+}
+
+impl Default for Desugar {
+    fn default() -> Self {
+        Self {
+            next_fresh: Default::default(),
+            next_command_id: Default::default(),
+            // these come from lalrpop and don't have default impls
+            parser: ast::parse::ProgramParser::new(),
+            number_underscores: 3,
+            global_variables: Default::default(),
+        }
+    }
+}
+
+pub(crate) fn desugar_simplify(
+    desugar: &mut Desugar,
+    expr: &Expr,
+    schedule: &Schedule,
+) -> Vec<NCommand> {
+    let mut res = vec![NCommand::Push(1)];
+    let lhs = desugar.get_fresh();
+    res.extend(
+        flatten_actions(&vec![Action::Let(lhs, expr.clone())], desugar)
+            .into_iter()
+            .map(NCommand::NormAction),
+    );
+    res.push(NCommand::RunSchedule(desugar_schedule(desugar, schedule)));
+    res.extend(
+        desugar_command(
+            Command::Extract {
+                variants: 0,
+                fact: Fact::Fact(Expr::Var(lhs)),
+            },
+            desugar,
+            false,
+            false,
+        )
+        .unwrap()
+        .into_iter()
+        .map(|c| c.command),
+    );
+
+    res.push(NCommand::Pop(1));
+    res
+}
+
+pub(crate) fn desugar_calc(
+    desugar: &mut Desugar,
+    idents: Vec<IdentSort>,
+    exprs: Vec<Expr>,
+    seminaive_transform: bool,
+) -> Result<Vec<NCommand>, Error> {
+    let mut res = vec![];
+
+    // first, push all the idents
+    for IdentSort { ident, sort } in idents {
+        res.push(Command::Declare { name: ident, sort });
+    }
+
+    // now, for every pair of exprs we need to prove them equal
+    for expr1and2 in exprs.windows(2) {
+        let expr1 = &expr1and2[0];
+        let expr2 = &expr1and2[1];
+        res.push(Command::Push(1));
+
+        // add the two exprs
+        res.push(Command::Action(Action::Expr(expr1.clone())));
+        res.push(Command::Action(Action::Expr(expr2.clone())));
+
+        res.push(Command::RunSchedule(Schedule::Saturate(Box::new(
+            Schedule::Run(RunConfig {
+                ruleset: "".into(),
+                until: Some(vec![Fact::Eq(vec![expr1.clone(), expr2.clone()])]),
+            }),
+        ))));
+
+        res.push(Command::Check(vec![Fact::Eq(vec![
+            expr1.clone(),
+            expr2.clone(),
+        ])]));
+
+        res.push(Command::Pop(1));
+    }
+
+    desugar_commands(res, desugar, false, seminaive_transform)
+        .map(|cmds| cmds.into_iter().map(|cmd| cmd.command).collect())
+}
+
+pub(crate) fn rewrite_name(rewrite: &Rewrite) -> String {
+    rewrite.to_string().replace('\"', "'")
+}
+
+pub(crate) fn desugar_command(
+    command: Command,
+    desugar: &mut Desugar,
+    get_all_proofs: bool,
+    seminaive_transform: bool,
+) -> Result<Vec<NormCommand>, Error> {
+    let res = match command {
+        Command::SetOption { name, value } => {
+            vec![NCommand::SetOption { name, value }]
+        }
+        Command::Function(fdecl) => {
+            vec![NCommand::Function(fdecl)]
+        }
+        Command::Declare { name, sort } => desugar.declare(name, sort),
+        Command::Datatype { name, variants } => desugar_datatype(name, variants),
+        Command::Rewrite(ruleset, rewrite) => {
+            desugar_rewrite(ruleset, rewrite_name(&rewrite).into(), &rewrite, desugar)
+        }
+        Command::BiRewrite(ruleset, rewrite) => {
+            desugar_birewrite(ruleset, rewrite_name(&rewrite).into(), &rewrite, desugar)
+        }
+        Command::Include(file) => {
+            let s = std::fs::read_to_string(&file)
+                .unwrap_or_else(|_| panic!("Failed to read file {file}"));
+            return desugar_commands(
+                desugar.parse_program(&s)?,
+                desugar,
+                get_all_proofs,
+                seminaive_transform,
+            );
+        }
+        Command::Rule {
+            ruleset,
+            mut name,
+            rule,
+        } => {
+            if name == "".into() {
+                name = rule.to_string().replace('\"', "'").into();
+            }
+
+            let mut result = vec![NCommand::NormRule {
+                ruleset,
+                name,
+                rule: flatten_rule(rule.clone(), desugar),
+            }];
+
+            if seminaive_transform {
+                if let Some(new_rule) = add_semi_naive_rule(desugar, rule) {
+                    result.push(NCommand::NormRule {
+                        ruleset,
+                        name,
+                        rule: flatten_rule(new_rule, desugar),
+                    });
+                }
+            }
+
+            result
+        }
+        Command::Sort(sort, option) => vec![NCommand::Sort(sort, option)],
+        // TODO ignoring cost for now
+        Command::AddRuleset(name) => vec![NCommand::AddRuleset(name)],
+        Command::Action(action) => flatten_actions(&vec![action], desugar)
+            .into_iter()
+            .map(NCommand::NormAction)
+            .collect(),
+        Command::Simplify { expr, schedule } => desugar_simplify(desugar, &expr, &schedule),
+        Command::Calc(idents, exprs) => desugar_calc(desugar, idents, exprs, seminaive_transform)?,
+        Command::RunSchedule(sched) => {
+            vec![NCommand::RunSchedule(desugar_schedule(desugar, &sched))]
+        }
+        // TODO add variants to extract action
+        Command::Extract {
+            variants: _variants,
+            fact,
+        } => {
+            let fresh = desugar.get_fresh();
+            let fresh_ruleset = desugar.get_fresh();
+            let desugaring = if let Fact::Fact(Expr::Var(v)) = fact {
+                format!("(extract {v})")
+            } else {
+                format!(
+                    "(check {fact})
+                    (ruleset {fresh_ruleset})
+                    (rule ((= {fresh} {fact}))
+                          ((extract {fresh}))
+                          :ruleset {fresh_ruleset})
+                    (run {fresh_ruleset} 1)"
+                )
+            };
+
+            desugar
+                .desugar_program(
+                    desugar.parse_program(&desugaring).unwrap(),
+                    get_all_proofs,
+                    seminaive_transform,
+                )?
+                .into_iter()
+                .map(|cmd| cmd.command)
+                .collect()
+        }
+        Command::Check(facts) => {
+            let res = vec![NCommand::Check(flatten_facts(&facts, desugar))];
+
+            if get_all_proofs {
+                // TODO check proofs
+            }
+
+            res
+        }
+        Command::CheckProof => vec![NCommand::CheckProof],
+        Command::PrintTable(symbol, size) => vec![NCommand::PrintTable(symbol, size)],
+        Command::PrintSize(symbol) => vec![NCommand::PrintSize(symbol)],
+        Command::Output { file, exprs } => vec![NCommand::Output { file, exprs }],
+        Command::Push(num) => {
+            vec![NCommand::Push(num)]
+        }
+        Command::Pop(num) => {
+            vec![NCommand::Pop(num)]
+        }
+        Command::Fail(cmd) => {
+            let mut desugared = desugar_command(*cmd, desugar, false, seminaive_transform)?;
+
+            let last = desugared.pop().unwrap();
+            desugared.push(NormCommand {
+                metadata: last.metadata,
+                command: NCommand::Fail(Box::new(last.command)),
+            });
+            return Ok(desugared);
+        }
+        Command::Input { name, file } => {
+            vec![NCommand::Input { name, file }]
+        }
+    };
+
+    for cmd in &res {
+        if let NCommand::NormAction(action) = cmd {
+            action.map_def_use(&mut |var, is_def| {
+                if is_def {
+                    desugar.global_variables.insert(var);
+                }
+                var
+            });
+        }
+    }
+
+    Ok(res
+        .into_iter()
+        .map(|c| NormCommand {
+            metadata: Metadata {
+                id: desugar.get_new_id(),
+            },
+            command: c,
+        })
+        .collect())
+}
+
+pub(crate) fn desugar_commands(
+    program: Vec<Command>,
+    desugar: &mut Desugar,
+    get_all_proofs: bool,
+    seminaive_transform: bool,
+) -> Result<Vec<NormCommand>, Error> {
+    let mut res = vec![];
+    for command in program {
+        let desugared = desugar_command(command, desugar, get_all_proofs, seminaive_transform)?;
+        res.extend(desugared);
+    }
+    Ok(res)
+}
+
+impl Clone for Desugar {
+    fn clone(&self) -> Self {
+        Self {
+            next_fresh: self.next_fresh,
+            next_command_id: self.next_command_id,
+            parser: ast::parse::ProgramParser::new(),
+            number_underscores: self.number_underscores,
+            global_variables: self.global_variables.clone(),
+        }
+    }
+}
+
+impl Desugar {
+    pub fn merge_ruleset_name(&self) -> Symbol {
+        Symbol::from(format!(
+            "merge_ruleset{}",
+            "_".repeat(self.number_underscores)
+        ))
+    }
+
+    pub fn get_fresh(&mut self) -> Symbol {
+        self.next_fresh += 1;
+        format!(
+            "v{}{}",
+            self.next_fresh - 1,
+            "_".repeat(self.number_underscores)
+        )
+        .into()
+    }
+
+    pub fn get_new_id(&mut self) -> CommandId {
+        let res = self.next_command_id;
+        self.next_command_id += 1;
+        res
+    }
+
+    pub(crate) fn desugar_program(
+        &mut self,
+        program: Vec<Command>,
+        get_all_proofs: bool,
+        seminaive_transform: bool,
+    ) -> Result<Vec<NormCommand>, Error> {
+        let res = desugar_commands(program, self, get_all_proofs, seminaive_transform)?;
+        Ok(res)
+    }
+
+    fn expr_to_flat_actions(
+        &mut self,
+        expr: &Expr,
+        res: &mut Vec<NormAction>,
+        memo: &mut HashMap<Expr, Symbol>,
+    ) -> Symbol {
+        if let Some(existing) = memo.get(expr) {
+            return *existing;
+        }
+        let res = match expr {
+            Expr::Lit(l) => {
+                let assign = self.get_fresh();
+                res.push(NormAction::LetLit(assign, l.clone()));
+                assign
+            }
+            Expr::Var(v) => *v,
+            Expr::Call(f, children) => {
+                let assign = self.get_fresh();
+                let mut new_children = vec![];
+                for child in children {
+                    match child {
+                        Expr::Var(v) => {
+                            new_children.push(*v);
+                        }
+                        _ => {
+                            let child = self.expr_to_flat_actions(child, res, memo);
+                            new_children.push(child);
+                        }
+                    }
+                }
+                let result = NormExpr::Call(*f, new_children);
+                let result_expr = result.to_expr();
+                if let Some(existing) = memo.get(&result_expr) {
+                    *existing
+                } else {
+                    memo.insert(result_expr.clone(), assign);
+                    res.push(NormAction::Let(assign, result));
+                    assign
+                }
+            }
+        };
+        memo.insert(expr.clone(), res);
+        res
+    }
+
+    pub fn parse_program(&self, input: &str) -> Result<Vec<Command>, Error> {
+        Ok(self
+            .parser
+            .parse(input)
+            .map_err(|e| e.map_token(|tok| tok.to_string()))?)
+    }
+
+    pub fn declare(&mut self, name: Symbol, sort: Symbol) -> Vec<NCommand> {
+        let fresh = self.get_fresh();
+        vec![
+            NCommand::Function(FunctionDecl {
+                name: fresh,
+                schema: Schema {
+                    input: vec![],
+                    output: sort,
+                },
+                default: None,
+                merge: None,
+                merge_action: vec![],
+                cost: None,
+                unextractable: false,
+            }),
+            NCommand::NormAction(NormAction::Let(name, NormExpr::Call(fresh, vec![]))),
+        ]
+    }
+}
+
\ No newline at end of file diff --git a/docs/src/egglog/ast/expr.rs.html b/docs/src/egglog/ast/expr.rs.html new file mode 100644 index 000000000..654831b1a --- /dev/null +++ b/docs/src/egglog/ast/expr.rs.html @@ -0,0 +1,433 @@ +expr.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+
use crate::*;
+use ordered_float::OrderedFloat;
+
+use std::fmt::Display;
+
+#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Clone)]
+pub enum Literal {
+    Int(i64),
+    F64(OrderedFloat<f64>),
+    String(Symbol),
+    Unit,
+}
+
+macro_rules! impl_from {
+    ($ctor:ident($t:ty)) => {
+        impl From<Literal> for $t {
+            fn from(literal: Literal) -> Self {
+                match literal {
+                    Literal::$ctor(t) => t,
+                    #[allow(unreachable_patterns)]
+                    _ => panic!("Expected {}, got {literal}", stringify!($ctor)),
+                }
+            }
+        }
+
+        impl From<$t> for Literal {
+            fn from(t: $t) -> Self {
+                Literal::$ctor(t)
+            }
+        }
+    };
+}
+
+impl_from!(Int(i64));
+impl_from!(F64(OrderedFloat<f64>));
+impl_from!(String(Symbol));
+
+impl Display for Literal {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        match &self {
+            Literal::Int(i) => Display::fmt(i, f),
+            Literal::F64(n) => {
+                // need to display with decimal if there is none
+                let str = n.to_string();
+                if let Ok(_num) = str.parse::<i64>() {
+                    write!(f, "{}.0", str)
+                } else {
+                    write!(f, "{}", str)
+                }
+            }
+            Literal::String(s) => write!(f, "\"{}\"", s),
+            Literal::Unit => write!(f, "()"),
+        }
+    }
+}
+
+#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Clone)]
+pub enum Expr {
+    Lit(Literal),
+    Var(Symbol),
+    // TODO make this its own type
+    Call(Symbol, Vec<Self>),
+}
+
+#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Clone)]
+pub enum NormExpr {
+    Call(Symbol, Vec<Symbol>),
+}
+
+impl NormExpr {
+    pub fn to_expr(&self) -> Expr {
+        match self {
+            NormExpr::Call(op, args) => {
+                Expr::Call(*op, args.iter().map(|a| Expr::Var(*a)).collect())
+            }
+        }
+    }
+
+    pub(crate) fn map_def_use(
+        &self,
+        fvar: &mut impl FnMut(Symbol, bool) -> Symbol,
+        is_def: bool,
+    ) -> NormExpr {
+        match self {
+            NormExpr::Call(op, args) => {
+                let args = args.iter().map(|a| fvar(*a, is_def)).collect();
+                NormExpr::Call(*op, args)
+            }
+        }
+    }
+}
+
+impl Expr {
+    pub fn is_var(&self) -> bool {
+        matches!(self, Expr::Var(_))
+    }
+
+    pub fn call(op: impl Into<Symbol>, children: impl IntoIterator<Item = Self>) -> Self {
+        Self::Call(op.into(), children.into_iter().collect())
+    }
+
+    pub fn lit(lit: impl Into<Literal>) -> Self {
+        Self::Lit(lit.into())
+    }
+
+    pub fn get_var(&self) -> Option<Symbol> {
+        match self {
+            Expr::Var(v) => Some(*v),
+            _ => None,
+        }
+    }
+
+    fn children(&self) -> &[Self] {
+        match self {
+            Expr::Var(_) | Expr::Lit(_) => &[],
+            Expr::Call(_, children) => children,
+        }
+    }
+
+    pub fn ast_size(&self) -> usize {
+        let mut size = 0;
+        self.walk(&mut |_e| size += 1, &mut |_| {});
+        size
+    }
+
+    pub fn walk(&self, pre: &mut impl FnMut(&Self), post: &mut impl FnMut(&Self)) {
+        pre(self);
+        self.children()
+            .iter()
+            .for_each(|child| child.walk(pre, post));
+        post(self);
+    }
+
+    pub fn fold<Out>(&self, f: &mut impl FnMut(&Self, Vec<Out>) -> Out) -> Out {
+        let ts = self.children().iter().map(|child| child.fold(f)).collect();
+        f(self, ts)
+    }
+
+    pub fn map(&self, f: &mut impl FnMut(&Self) -> Self) -> Self {
+        match self {
+            Expr::Lit(_) => f(self),
+            Expr::Var(_) => f(self),
+            Expr::Call(op, children) => {
+                let children = children.iter().map(|c| c.map(f)).collect();
+                f(&Expr::Call(*op, children))
+            }
+        }
+    }
+
+    pub(crate) fn to_sexp(&self) -> Sexp {
+        let res = match self {
+            Expr::Lit(lit) => Sexp::String(lit.to_string()),
+            Expr::Var(v) => Sexp::String(v.to_string()),
+            Expr::Call(op, children) => Sexp::List(
+                vec![Sexp::String(op.to_string())]
+                    .into_iter()
+                    .chain(children.iter().map(|c| c.to_sexp()))
+                    .collect(),
+            ),
+        };
+        res
+    }
+
+    pub fn subst(&self, canon: &HashMap<Symbol, Expr>) -> Self {
+        match self {
+            Expr::Lit(_lit) => self.clone(),
+            Expr::Var(v) => canon.get(v).cloned().unwrap_or_else(|| self.clone()),
+            Expr::Call(op, children) => {
+                let children = children.iter().map(|c| c.subst(canon)).collect();
+                Expr::Call(*op, children)
+            }
+        }
+    }
+
+    pub fn vars(&self) -> impl Iterator<Item = Symbol> + '_ {
+        let iterator: Box<dyn Iterator<Item = Symbol>> = match self {
+            Expr::Lit(_) => Box::new(std::iter::empty()),
+            Expr::Var(v) => Box::new(std::iter::once(*v)),
+            Expr::Call(_, exprs) => Box::new(exprs.iter().flat_map(|e| e.vars())),
+        };
+        iterator
+    }
+}
+
+impl Display for NormExpr {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(f, "{}", self.to_expr())
+    }
+}
+
+impl Display for Expr {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(f, "{}", self.to_sexp())
+    }
+}
+
+// currently only used for testing, but no reason it couldn't be used elsewhere later
+#[cfg(test)]
+pub(crate) fn parse_expr(s: &str) -> Result<Expr, lalrpop_util::ParseError<usize, String, String>> {
+    let parser = ast::parse::ExprParser::new();
+    parser
+        .parse(s)
+        .map_err(|e| e.map_token(|tok| tok.to_string()))
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    #[test]
+    fn test_parser_display_roundtrip() {
+        let s = r#"(f (g a 3) 4.0 (H "hello"))"#;
+        let e = parse_expr(s).unwrap();
+        assert_eq!(format!("{}", e), s);
+    }
+}
+
\ No newline at end of file diff --git a/docs/src/egglog/ast/mod.rs.html b/docs/src/egglog/ast/mod.rs.html new file mode 100644 index 000000000..7a7f0522f --- /dev/null +++ b/docs/src/egglog/ast/mod.rs.html @@ -0,0 +1,2401 @@ +mod.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+390
+391
+392
+393
+394
+395
+396
+397
+398
+399
+400
+401
+402
+403
+404
+405
+406
+407
+408
+409
+410
+411
+412
+413
+414
+415
+416
+417
+418
+419
+420
+421
+422
+423
+424
+425
+426
+427
+428
+429
+430
+431
+432
+433
+434
+435
+436
+437
+438
+439
+440
+441
+442
+443
+444
+445
+446
+447
+448
+449
+450
+451
+452
+453
+454
+455
+456
+457
+458
+459
+460
+461
+462
+463
+464
+465
+466
+467
+468
+469
+470
+471
+472
+473
+474
+475
+476
+477
+478
+479
+480
+481
+482
+483
+484
+485
+486
+487
+488
+489
+490
+491
+492
+493
+494
+495
+496
+497
+498
+499
+500
+501
+502
+503
+504
+505
+506
+507
+508
+509
+510
+511
+512
+513
+514
+515
+516
+517
+518
+519
+520
+521
+522
+523
+524
+525
+526
+527
+528
+529
+530
+531
+532
+533
+534
+535
+536
+537
+538
+539
+540
+541
+542
+543
+544
+545
+546
+547
+548
+549
+550
+551
+552
+553
+554
+555
+556
+557
+558
+559
+560
+561
+562
+563
+564
+565
+566
+567
+568
+569
+570
+571
+572
+573
+574
+575
+576
+577
+578
+579
+580
+581
+582
+583
+584
+585
+586
+587
+588
+589
+590
+591
+592
+593
+594
+595
+596
+597
+598
+599
+600
+601
+602
+603
+604
+605
+606
+607
+608
+609
+610
+611
+612
+613
+614
+615
+616
+617
+618
+619
+620
+621
+622
+623
+624
+625
+626
+627
+628
+629
+630
+631
+632
+633
+634
+635
+636
+637
+638
+639
+640
+641
+642
+643
+644
+645
+646
+647
+648
+649
+650
+651
+652
+653
+654
+655
+656
+657
+658
+659
+660
+661
+662
+663
+664
+665
+666
+667
+668
+669
+670
+671
+672
+673
+674
+675
+676
+677
+678
+679
+680
+681
+682
+683
+684
+685
+686
+687
+688
+689
+690
+691
+692
+693
+694
+695
+696
+697
+698
+699
+700
+701
+702
+703
+704
+705
+706
+707
+708
+709
+710
+711
+712
+713
+714
+715
+716
+717
+718
+719
+720
+721
+722
+723
+724
+725
+726
+727
+728
+729
+730
+731
+732
+733
+734
+735
+736
+737
+738
+739
+740
+741
+742
+743
+744
+745
+746
+747
+748
+749
+750
+751
+752
+753
+754
+755
+756
+757
+758
+759
+760
+761
+762
+763
+764
+765
+766
+767
+768
+769
+770
+771
+772
+773
+774
+775
+776
+777
+778
+779
+780
+781
+782
+783
+784
+785
+786
+787
+788
+789
+790
+791
+792
+793
+794
+795
+796
+797
+798
+799
+800
+801
+802
+803
+804
+805
+806
+807
+808
+809
+810
+811
+812
+813
+814
+815
+816
+817
+818
+819
+820
+821
+822
+823
+824
+825
+826
+827
+828
+829
+830
+831
+832
+833
+834
+835
+836
+837
+838
+839
+840
+841
+842
+843
+844
+845
+846
+847
+848
+849
+850
+851
+852
+853
+854
+855
+856
+857
+858
+859
+860
+861
+862
+863
+864
+865
+866
+867
+868
+869
+870
+871
+872
+873
+874
+875
+876
+877
+878
+879
+880
+881
+882
+883
+884
+885
+886
+887
+888
+889
+890
+891
+892
+893
+894
+895
+896
+897
+898
+899
+900
+901
+902
+903
+904
+905
+906
+907
+908
+909
+910
+911
+912
+913
+914
+915
+916
+917
+918
+919
+920
+921
+922
+923
+924
+925
+926
+927
+928
+929
+930
+931
+932
+933
+934
+935
+936
+937
+938
+939
+940
+941
+942
+943
+944
+945
+946
+947
+948
+949
+950
+951
+952
+953
+954
+955
+956
+957
+958
+959
+960
+961
+962
+963
+964
+965
+966
+967
+968
+969
+970
+971
+972
+973
+974
+975
+976
+977
+978
+979
+980
+981
+982
+983
+984
+985
+986
+987
+988
+989
+990
+991
+992
+993
+994
+995
+996
+997
+998
+999
+1000
+1001
+1002
+1003
+1004
+1005
+1006
+1007
+1008
+1009
+1010
+1011
+1012
+1013
+1014
+1015
+1016
+1017
+1018
+1019
+1020
+1021
+1022
+1023
+1024
+1025
+1026
+1027
+1028
+1029
+1030
+1031
+1032
+1033
+1034
+1035
+1036
+1037
+1038
+1039
+1040
+1041
+1042
+1043
+1044
+1045
+1046
+1047
+1048
+1049
+1050
+1051
+1052
+1053
+1054
+1055
+1056
+1057
+1058
+1059
+1060
+1061
+1062
+1063
+1064
+1065
+1066
+1067
+1068
+1069
+1070
+1071
+1072
+1073
+1074
+1075
+1076
+1077
+1078
+1079
+1080
+1081
+1082
+1083
+1084
+1085
+1086
+1087
+1088
+1089
+1090
+1091
+1092
+1093
+1094
+1095
+1096
+1097
+1098
+1099
+1100
+1101
+1102
+1103
+1104
+1105
+1106
+1107
+1108
+1109
+1110
+1111
+1112
+1113
+1114
+1115
+1116
+1117
+1118
+1119
+1120
+1121
+1122
+1123
+1124
+1125
+1126
+1127
+1128
+1129
+1130
+1131
+1132
+1133
+1134
+1135
+1136
+1137
+1138
+1139
+1140
+1141
+1142
+1143
+1144
+1145
+1146
+1147
+1148
+1149
+1150
+1151
+1152
+1153
+1154
+1155
+1156
+1157
+1158
+1159
+1160
+1161
+1162
+1163
+1164
+1165
+1166
+1167
+1168
+1169
+1170
+1171
+1172
+1173
+1174
+1175
+1176
+1177
+1178
+1179
+1180
+1181
+1182
+1183
+1184
+1185
+1186
+1187
+1188
+1189
+1190
+1191
+1192
+1193
+1194
+1195
+1196
+1197
+1198
+1199
+1200
+
use std::fmt::Display;
+
+pub use symbol_table::GlobalSymbol as Symbol;
+
+// macro_rules! lalrpop_error {
+//     ($($x:tt)*) => { Err(::lalrpop_util::ParseError::User { error: format!($($x)*)}) }
+// }
+
+use lalrpop_util::lalrpop_mod;
+lalrpop_mod!(
+    #[allow(clippy::all)]
+    pub parse,
+    "/ast/parse.rs"
+);
+
+use crate::*;
+
+mod expr;
+pub use expr::*;
+pub mod desugar;
+
+#[derive(Clone, Copy, Hash, PartialEq, Eq, PartialOrd, Ord, Debug)]
+pub struct Id(usize);
+
+impl From<usize> for Id {
+    fn from(n: usize) -> Self {
+        Id(n)
+    }
+}
+
+impl From<Id> for usize {
+    fn from(id: Id) -> Self {
+        id.0
+    }
+}
+
+impl Display for Id {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(f, "id{}", self.0)
+    }
+}
+
+pub type CommandId = usize;
+
+// TODO put line numbers in metadata
+#[derive(Debug, Clone, Eq, PartialEq, Hash)]
+pub struct Metadata {
+    pub id: CommandId,
+}
+
+#[derive(Debug, Clone, Eq, PartialEq, Hash)]
+pub struct NormCommand {
+    pub metadata: Metadata,
+    pub command: NCommand,
+}
+
+impl NormCommand {
+    pub fn transforms_to(&self, others: Vec<NCommand>) -> Vec<NormCommand> {
+        others
+            .into_iter()
+            .map(|c| NormCommand {
+                metadata: self.metadata.clone(),
+                command: c,
+            })
+            .collect()
+    }
+
+    pub fn resugar(&self) -> Command {
+        match &self.command {
+            NCommand::NormRule {
+                name,
+                ruleset,
+                rule,
+            } => Command::Rule {
+                name: *name,
+                ruleset: *ruleset,
+                rule: rule.resugar(),
+            },
+            NCommand::Check(facts) => {
+                Command::Check(NormRule::resugar_facts(facts, &mut Default::default()))
+            }
+            _ => self.command.to_command(),
+        }
+    }
+}
+
+#[derive(Debug, Clone, Eq, PartialEq, Hash)]
+pub enum NCommand {
+    SetOption {
+        name: Symbol,
+        value: Expr,
+    },
+    Sort(Symbol, Option<(Symbol, Vec<Expr>)>),
+    Function(FunctionDecl),
+    AddRuleset(Symbol),
+    NormRule {
+        name: Symbol,
+        ruleset: Symbol,
+        rule: NormRule,
+    },
+    NormAction(NormAction),
+    RunSchedule(NormSchedule),
+    Check(Vec<NormFact>),
+    CheckProof,
+    PrintTable(Symbol, usize),
+    PrintSize(Symbol),
+    Output {
+        file: String,
+        exprs: Vec<Expr>,
+    },
+    Push(usize),
+    Pop(usize),
+    Fail(Box<NCommand>),
+    // TODO desugar
+    Input {
+        name: Symbol,
+        file: String,
+    },
+}
+
+impl NormCommand {
+    pub fn to_command(&self) -> Command {
+        self.command.to_command()
+    }
+}
+
+impl NCommand {
+    pub fn to_command(&self) -> Command {
+        match self {
+            NCommand::SetOption { name, value } => Command::SetOption {
+                name: *name,
+                value: value.clone(),
+            },
+            NCommand::Sort(name, params) => Command::Sort(*name, params.clone()),
+            NCommand::Function(f) => Command::Function(f.clone()),
+            NCommand::AddRuleset(name) => Command::AddRuleset(*name),
+            NCommand::NormRule {
+                name,
+                ruleset,
+                rule,
+            } => Command::Rule {
+                name: *name,
+                ruleset: *ruleset,
+                rule: rule.to_rule(),
+            },
+            NCommand::RunSchedule(schedule) => Command::RunSchedule(schedule.to_schedule()),
+            NCommand::NormAction(action) => Command::Action(action.to_action()),
+            NCommand::Check(facts) => {
+                Command::Check(facts.iter().map(|fact| fact.to_fact()).collect())
+            }
+            NCommand::CheckProof => Command::CheckProof,
+            NCommand::PrintTable(name, n) => Command::PrintTable(*name, *n),
+            NCommand::PrintSize(name) => Command::PrintSize(*name),
+            NCommand::Output { file, exprs } => Command::Output {
+                file: file.to_string(),
+                exprs: exprs.clone(),
+            },
+            NCommand::Push(n) => Command::Push(*n),
+            NCommand::Pop(n) => Command::Pop(*n),
+            NCommand::Fail(cmd) => Command::Fail(Box::new(cmd.to_command())),
+            NCommand::Input { name, file } => Command::Input {
+                name: *name,
+                file: file.clone(),
+            },
+        }
+    }
+
+    pub fn map_exprs(&self, f: &mut impl FnMut(&NormExpr) -> NormExpr) -> NCommand {
+        match self {
+            // Don't map over setoption
+            NCommand::SetOption { name, value } => NCommand::SetOption {
+                name: *name,
+                value: value.clone(),
+            },
+            NCommand::Sort(name, params) => NCommand::Sort(*name, params.clone()),
+            NCommand::Function(f) => NCommand::Function(f.clone()),
+            NCommand::AddRuleset(name) => NCommand::AddRuleset(*name),
+            NCommand::RunSchedule(schedule) => NCommand::RunSchedule(schedule.clone()),
+            NCommand::NormRule {
+                name,
+                ruleset,
+                rule,
+            } => NCommand::NormRule {
+                name: *name,
+                ruleset: *ruleset,
+                rule: rule.map_exprs(f),
+            },
+            NCommand::NormAction(action) => NCommand::NormAction(action.map_exprs(f)),
+            NCommand::Check(facts) => {
+                NCommand::Check(facts.iter().map(|fact| fact.map_exprs(f)).collect())
+            }
+            NCommand::CheckProof => NCommand::CheckProof,
+            NCommand::PrintTable(name, n) => NCommand::PrintTable(*name, *n),
+            NCommand::PrintSize(name) => NCommand::PrintSize(*name),
+            NCommand::Output { file, exprs } => NCommand::Output {
+                file: file.to_string(),
+                exprs: exprs.clone(),
+            },
+            NCommand::Push(n) => NCommand::Push(*n),
+            NCommand::Pop(n) => NCommand::Pop(*n),
+            NCommand::Fail(cmd) => NCommand::Fail(Box::new(cmd.map_exprs(f))),
+            NCommand::Input { name, file } => NCommand::Input {
+                name: *name,
+                file: file.clone(),
+            },
+        }
+    }
+}
+
+#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+pub enum Schedule {
+    Saturate(Box<Schedule>),
+    Repeat(usize, Box<Schedule>),
+    Run(RunConfig),
+    Sequence(Vec<Schedule>),
+}
+
+#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+pub enum NormSchedule {
+    Saturate(Box<NormSchedule>),
+    Repeat(usize, Box<NormSchedule>),
+    Run(NormRunConfig),
+    Sequence(Vec<NormSchedule>),
+}
+
+impl NormSchedule {
+    fn to_schedule(&self) -> Schedule {
+        match self {
+            NormSchedule::Saturate(sched) => Schedule::Saturate(Box::new(sched.to_schedule())),
+            NormSchedule::Repeat(size, sched) => {
+                Schedule::Repeat(*size, Box::new(sched.to_schedule()))
+            }
+            NormSchedule::Run(config) => Schedule::Run(config.to_run_config()),
+            NormSchedule::Sequence(scheds) => {
+                Schedule::Sequence(scheds.iter().map(|sched| sched.to_schedule()).collect())
+            }
+        }
+    }
+
+    pub fn map_run_commands(&self, f: &mut impl FnMut(&NormRunConfig) -> Schedule) -> Schedule {
+        match self {
+            NormSchedule::Run(config) => f(config),
+            NormSchedule::Saturate(sched) => {
+                Schedule::Saturate(Box::new(sched.map_run_commands(f)))
+            }
+            NormSchedule::Repeat(size, sched) => {
+                Schedule::Repeat(*size, Box::new(sched.map_run_commands(f)))
+            }
+            NormSchedule::Sequence(scheds) => Schedule::Sequence(
+                scheds
+                    .iter()
+                    .map(|sched| sched.map_run_commands(f))
+                    .collect(),
+            ),
+        }
+    }
+}
+
+trait ToSexp {
+    fn to_sexp(&self) -> Sexp;
+}
+
+impl ToSexp for str {
+    fn to_sexp(&self) -> Sexp {
+        Sexp::String(String::from(self))
+    }
+}
+
+impl ToSexp for Symbol {
+    fn to_sexp(&self) -> Sexp {
+        Sexp::String(self.to_string())
+    }
+}
+
+impl ToSexp for usize {
+    fn to_sexp(&self) -> Sexp {
+        Sexp::String(self.to_string())
+    }
+}
+
+impl ToSexp for Sexp {
+    fn to_sexp(&self) -> Sexp {
+        self.clone()
+    }
+}
+
+macro_rules! list {
+    ($($e:expr,)* ++ $tail:expr) => {{
+        let mut list: Vec<Sexp> = vec![$($e.to_sexp(),)*];
+        list.extend($tail.iter().map(|e| e.to_sexp()));
+        Sexp::List(list)
+    }};
+    ($($e:expr),*) => {{
+        let list: Vec<Sexp> = vec![ $($e.to_sexp(),)* ];
+        Sexp::List(list)
+    }};
+}
+
+impl ToSexp for Schedule {
+    fn to_sexp(&self) -> Sexp {
+        match self {
+            Schedule::Saturate(sched) => list!("saturate", sched),
+            Schedule::Repeat(size, sched) => list!("repeat", size, sched),
+            Schedule::Run(config) => config.to_sexp(),
+            Schedule::Sequence(scheds) => list!("seq", ++ scheds),
+        }
+    }
+}
+
+impl Display for Schedule {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(f, "{}", self.to_sexp())
+    }
+}
+
+impl Display for NormSchedule {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(f, "{}", self.to_schedule())
+    }
+}
+
+// TODO command before and after desugaring should be different
+#[derive(Debug, Clone)]
+pub enum Command {
+    SetOption {
+        name: Symbol,
+        value: Expr,
+    },
+    Datatype {
+        name: Symbol,
+        variants: Vec<Variant>,
+    },
+    Declare {
+        name: Symbol,
+        sort: Symbol,
+    },
+    Sort(Symbol, Option<(Symbol, Vec<Expr>)>),
+    Function(FunctionDecl),
+    AddRuleset(Symbol),
+    Rule {
+        name: Symbol,
+        ruleset: Symbol,
+        rule: Rule,
+    },
+    Rewrite(Symbol, Rewrite),
+    BiRewrite(Symbol, Rewrite),
+    Action(Action),
+    RunSchedule(Schedule),
+    Simplify {
+        expr: Expr,
+        schedule: Schedule,
+    },
+    Calc(Vec<IdentSort>, Vec<Expr>),
+    Extract {
+        variants: usize,
+        fact: Fact,
+    },
+    // TODO: this could just become an empty query
+    Check(Vec<Fact>),
+    CheckProof,
+    PrintTable(Symbol, usize),
+    PrintSize(Symbol),
+    Input {
+        name: Symbol,
+        file: String,
+    },
+    Output {
+        file: String,
+        exprs: Vec<Expr>,
+    },
+    Push(usize),
+    Pop(usize),
+    Fail(Box<Command>),
+    // TODO desugar include
+    Include(String),
+}
+
+impl ToSexp for Command {
+    fn to_sexp(&self) -> Sexp {
+        match self {
+            Command::SetOption { name, value } => list!("set-option", name, value),
+            Command::Rewrite(name, rewrite) => rewrite.to_sexp(*name, false),
+            Command::BiRewrite(name, rewrite) => rewrite.to_sexp(*name, true),
+            Command::Datatype { name, variants } => list!("datatype", name, ++ variants),
+            Command::Declare { name, sort } => list!("declare", name, sort),
+            Command::Action(a) => a.to_sexp(),
+            Command::Sort(name, None) => list!("sort", name),
+            Command::Sort(name, Some((name2, args))) => list!("sort", name, list!( name2, ++ args)),
+            Command::Function(f) => f.to_sexp(),
+            Command::AddRuleset(name) => list!("ruleset", name),
+            Command::Rule {
+                name,
+                ruleset,
+                rule,
+            } => rule.to_sexp(*ruleset, *name),
+            Command::RunSchedule(sched) => list!("run-schedule", sched),
+            Command::Calc(args, exprs) => list!("calc", list!(++ args), ++ exprs),
+            Command::Extract { variants, fact } => {
+                list!("query-extract", ":variants", variants, fact)
+            }
+            Command::Check(facts) => list!("check", ++ facts),
+            Command::CheckProof => list!("check-proof"),
+            Command::Push(n) => list!("push", n),
+            Command::Pop(n) => list!("pop", n),
+            Command::PrintTable(name, n) => list!("print-table", name, n),
+            Command::PrintSize(name) => list!("print-size", name),
+            Command::Input { name, file } => list!("input", name, format!("\"{}\"", file)),
+            Command::Output { file, exprs } => list!("output", format!("\"{}\"", file), ++ exprs),
+            Command::Fail(cmd) => list!("fail", cmd),
+            Command::Include(file) => list!("include", format!("\"{}\"", file)),
+            Command::Simplify { expr, schedule } => list!("simplify", schedule, expr),
+        }
+    }
+}
+
+impl Display for NormCommand {
+    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
+        write!(f, "{}", self.to_command())
+    }
+}
+
+impl Display for NCommand {
+    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
+        write!(f, "{}", self.to_command())
+    }
+}
+
+impl Display for Command {
+    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
+        match self {
+            Command::Rule {
+                ruleset,
+                name,
+                rule,
+            } => rule.fmt_with_ruleset(f, *ruleset, *name),
+            Command::Check(facts) => {
+                write!(f, "(check {})", ListDisplay(facts, "\n"))
+            }
+            _ => write!(f, "{}", self.to_sexp()),
+        }
+    }
+}
+
+#[derive(Clone, Debug, PartialEq, Eq, Hash)]
+pub struct IdentSort {
+    pub ident: Symbol,
+    pub sort: Symbol,
+}
+
+impl ToSexp for IdentSort {
+    fn to_sexp(&self) -> Sexp {
+        list!(self.ident, self.sort)
+    }
+}
+
+impl Display for IdentSort {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(f, "{}", self.to_sexp())
+    }
+}
+
+#[derive(Clone, Debug, PartialEq, Eq, Hash)]
+pub struct RunConfig {
+    pub ruleset: Symbol,
+    pub until: Option<Vec<Fact>>,
+}
+
+impl ToSexp for RunConfig {
+    fn to_sexp(&self) -> Sexp {
+        let mut res = vec![Sexp::String("run".into())];
+        if self.ruleset != "".into() {
+            res.push(Sexp::String(self.ruleset.to_string()));
+        }
+        if let Some(until) = &self.until {
+            res.push(Sexp::String(":until".into()));
+            res.extend(until.iter().map(|fact| fact.to_sexp()));
+        }
+
+        Sexp::List(res)
+    }
+}
+
+#[derive(Clone, Debug, PartialEq, Eq, Hash)]
+pub struct NormRunConfig {
+    pub ruleset: Symbol,
+    pub until: Option<Vec<NormFact>>,
+}
+
+impl NormRunConfig {
+    pub fn to_run_config(&self) -> RunConfig {
+        RunConfig {
+            ruleset: self.ruleset,
+            until: self
+                .until
+                .as_ref()
+                .map(|v| v.iter().map(|f| f.to_fact()).collect()),
+        }
+    }
+}
+
+#[derive(Clone, Debug, PartialEq, Eq, Hash)]
+pub struct FunctionDecl {
+    pub name: Symbol,
+    pub schema: Schema,
+    pub default: Option<Expr>,
+    // TODO we should desugar merge and merge action
+    pub merge: Option<Expr>,
+    pub merge_action: Vec<Action>,
+    pub cost: Option<usize>,
+    pub unextractable: bool,
+}
+
+#[derive(Clone, Debug, PartialEq, Eq, Hash)]
+pub struct Variant {
+    pub name: Symbol,
+    pub types: Vec<Symbol>,
+    pub cost: Option<usize>,
+}
+
+impl ToSexp for Variant {
+    fn to_sexp(&self) -> Sexp {
+        let mut res = vec![Sexp::String(self.name.to_string())];
+        if !self.types.is_empty() {
+            res.extend(self.types.iter().map(|s| Sexp::String(s.to_string())));
+        }
+        if let Some(cost) = self.cost {
+            res.push(Sexp::String(":cost".into()));
+            res.push(Sexp::String(cost.to_string()));
+        }
+        Sexp::List(res)
+    }
+}
+
+#[derive(Clone, Debug, PartialEq, Eq, Hash)]
+pub struct Schema {
+    pub input: Vec<Symbol>,
+    pub output: Symbol,
+}
+
+impl ToSexp for Schema {
+    fn to_sexp(&self) -> Sexp {
+        list!(list!(++ self.input), self.output)
+    }
+}
+
+impl Schema {
+    pub fn new(input: Vec<Symbol>, output: Symbol) -> Self {
+        Self { input, output }
+    }
+}
+
+impl FunctionDecl {
+    pub fn relation(name: Symbol, input: Vec<Symbol>) -> Self {
+        Self {
+            name,
+            schema: Schema {
+                input,
+                output: Symbol::from("Unit"),
+            },
+            merge: None,
+            merge_action: vec![],
+            default: None,
+            cost: None,
+            unextractable: false,
+        }
+    }
+}
+
+impl ToSexp for FunctionDecl {
+    fn to_sexp(&self) -> Sexp {
+        let mut res = vec![
+            Sexp::String("function".into()),
+            Sexp::String(self.name.to_string()),
+        ];
+
+        if let Sexp::List(contents) = self.schema.to_sexp() {
+            res.extend(contents);
+        } else {
+            unreachable!();
+        }
+
+        if let Some(cost) = self.cost {
+            res.extend(vec![
+                Sexp::String(":cost".into()),
+                Sexp::String(cost.to_string()),
+            ]);
+        }
+
+        if self.unextractable {
+            res.push(Sexp::String(":unextractable".into()));
+        }
+
+        if !self.merge_action.is_empty() {
+            res.push(Sexp::String(":on_merge".into()));
+            res.push(Sexp::List(
+                self.merge_action.iter().map(|a| a.to_sexp()).collect(),
+            ));
+        }
+
+        if let Some(merge) = &self.merge {
+            res.push(Sexp::String(":merge".into()));
+            res.push(merge.to_sexp());
+        }
+
+        if let Some(default) = &self.default {
+            res.push(Sexp::String(":default".into()));
+            res.push(default.to_sexp());
+        }
+
+        Sexp::List(res)
+    }
+}
+
+#[derive(Clone, Debug, PartialEq, Eq, Hash)]
+pub enum Fact {
+    /// Must be at least two things in an eq fact
+    Eq(Vec<Expr>),
+    Fact(Expr),
+}
+
+#[derive(Clone, Debug, PartialEq, Eq, Hash)]
+pub enum NormFact {
+    Assign(Symbol, NormExpr), // assign symbol to a tuple
+    AssignVar(Symbol, Symbol),
+    Compute(Symbol, NormExpr), // compute a primative
+    AssignLit(Symbol, Literal),
+    ConstrainEq(Symbol, Symbol),
+}
+
+impl NormFact {
+    pub fn to_fact(&self) -> Fact {
+        match self {
+            NormFact::Assign(symbol, expr) | NormFact::Compute(symbol, expr) => {
+                Fact::Eq(vec![Expr::Var(*symbol), expr.to_expr()])
+            }
+            NormFact::AssignVar(lhs, rhs) => Fact::Eq(vec![Expr::Var(*lhs), Expr::Var(*rhs)]),
+            NormFact::ConstrainEq(lhs, rhs) => Fact::Eq(vec![Expr::Var(*lhs), Expr::Var(*rhs)]),
+            NormFact::AssignLit(symbol, lit) => {
+                Fact::Eq(vec![Expr::Var(*symbol), Expr::Lit(lit.clone())])
+            }
+        }
+    }
+
+    pub fn map_exprs(&self, f: &mut impl FnMut(&NormExpr) -> NormExpr) -> NormFact {
+        match self {
+            NormFact::Assign(symbol, expr) | NormFact::Compute(symbol, expr) => {
+                NormFact::Assign(*symbol, f(expr))
+            }
+            NormFact::AssignVar(lhs, rhs) => NormFact::AssignVar(*lhs, *rhs),
+            NormFact::ConstrainEq(lhs, rhs) => NormFact::ConstrainEq(*lhs, *rhs),
+            NormFact::AssignLit(symbol, lit) => NormFact::AssignLit(*symbol, lit.clone()),
+        }
+    }
+
+    pub(crate) fn map_def_use(&self, fvar: &mut impl FnMut(Symbol, bool) -> Symbol) -> NormFact {
+        match self {
+            NormFact::Assign(symbol, expr) => {
+                NormFact::Assign(fvar(*symbol, true), expr.map_def_use(fvar, true))
+            }
+            NormFact::AssignVar(lhs, rhs) => {
+                NormFact::AssignVar(fvar(*lhs, true), fvar(*rhs, false))
+            }
+            NormFact::Compute(symbol, expr) => {
+                NormFact::Compute(fvar(*symbol, true), expr.map_def_use(fvar, false))
+            }
+            NormFact::AssignLit(symbol, lit) => {
+                NormFact::AssignLit(fvar(*symbol, true), lit.clone())
+            }
+            NormFact::ConstrainEq(lhs, rhs) => {
+                NormFact::ConstrainEq(fvar(*lhs, false), fvar(*rhs, false))
+            }
+        }
+    }
+}
+
+impl ToSexp for Fact {
+    fn to_sexp(&self) -> Sexp {
+        match self {
+            Fact::Eq(exprs) => list!("=", ++ exprs),
+            Fact::Fact(expr) => expr.to_sexp(),
+        }
+    }
+}
+
+impl Fact {
+    pub fn map_exprs(&self, f: &mut impl FnMut(&Expr) -> Expr) -> Fact {
+        match self {
+            Fact::Eq(exprs) => Fact::Eq(exprs.iter().map(f).collect()),
+            Fact::Fact(expr) => Fact::Fact(f(expr)),
+        }
+    }
+
+    pub fn subst(&self, subst: &HashMap<Symbol, Expr>) -> Fact {
+        self.map_exprs(&mut |e| e.subst(subst))
+    }
+}
+
+impl Display for NormFact {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(f, "{}", self.to_fact())
+    }
+}
+
+impl Display for Fact {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(f, "{}", self.to_sexp())
+    }
+}
+
+#[derive(Clone, Debug, PartialEq, Eq, Hash)]
+pub enum Action {
+    Let(Symbol, Expr),
+    Set(Symbol, Vec<Expr>, Expr),
+    Delete(Symbol, Vec<Expr>),
+    Union(Expr, Expr),
+    Extract(Expr, Expr),
+    Panic(String),
+    Expr(Expr),
+    // If(Expr, Action, Action),
+}
+
+#[derive(Clone, Debug, PartialEq, Eq, Hash)]
+pub enum NormAction {
+    Let(Symbol, NormExpr),
+    LetVar(Symbol, Symbol),
+    LetLit(Symbol, Literal),
+    Extract(Symbol, Symbol),
+    Set(NormExpr, Symbol),
+    Delete(NormExpr),
+    Union(Symbol, Symbol),
+    Panic(String),
+}
+
+impl NormAction {
+    pub fn to_action(&self) -> Action {
+        match self {
+            NormAction::Let(symbol, expr) => Action::Let(*symbol, expr.to_expr()),
+            NormAction::LetVar(symbol, other) => Action::Let(*symbol, Expr::Var(*other)),
+            NormAction::LetLit(symbol, lit) => Action::Let(*symbol, Expr::Lit(lit.clone())),
+            NormAction::Set(NormExpr::Call(head, body), other) => Action::Set(
+                *head,
+                body.iter().map(|s| Expr::Var(*s)).collect(),
+                Expr::Var(*other),
+            ),
+            NormAction::Extract(symbol, variants) => {
+                Action::Extract(Expr::Var(*symbol), Expr::Var(*variants))
+            }
+            NormAction::Delete(NormExpr::Call(symbol, args)) => {
+                Action::Delete(*symbol, args.iter().map(|s| Expr::Var(*s)).collect())
+            }
+            NormAction::Union(lhs, rhs) => Action::Union(Expr::Var(*lhs), Expr::Var(*rhs)),
+            NormAction::Panic(msg) => Action::Panic(msg.clone()),
+        }
+    }
+
+    pub fn map_exprs(&self, f: &mut impl FnMut(&NormExpr) -> NormExpr) -> NormAction {
+        match self {
+            NormAction::Let(symbol, expr) => NormAction::Let(*symbol, f(expr)),
+            NormAction::LetVar(symbol, other) => NormAction::LetVar(*symbol, *other),
+            NormAction::LetLit(symbol, lit) => NormAction::LetLit(*symbol, lit.clone()),
+            NormAction::Set(expr, other) => NormAction::Set(f(expr), *other),
+            NormAction::Extract(var, variants) => NormAction::Extract(*var, *variants),
+            NormAction::Delete(expr) => NormAction::Delete(f(expr)),
+            NormAction::Union(lhs, rhs) => NormAction::Union(*lhs, *rhs),
+            NormAction::Panic(msg) => NormAction::Panic(msg.clone()),
+        }
+    }
+
+    // fvar accepts a variable and if it is being defined (true) or used (false)
+    pub(crate) fn map_def_use(&self, fvar: &mut impl FnMut(Symbol, bool) -> Symbol) -> NormAction {
+        match self {
+            NormAction::Let(symbol, expr) => {
+                NormAction::Let(fvar(*symbol, true), expr.map_def_use(fvar, false))
+            }
+            NormAction::LetVar(symbol, other) => {
+                NormAction::LetVar(fvar(*symbol, true), fvar(*other, false))
+            }
+            NormAction::LetLit(symbol, lit) => NormAction::LetLit(fvar(*symbol, true), lit.clone()),
+            NormAction::Set(expr, other) => {
+                NormAction::Set(expr.map_def_use(fvar, false), fvar(*other, false))
+            }
+            NormAction::Extract(var, variants) => {
+                NormAction::Extract(fvar(*var, false), fvar(*variants, false))
+            }
+            NormAction::Delete(expr) => NormAction::Delete(expr.map_def_use(fvar, false)),
+            NormAction::Union(lhs, rhs) => NormAction::Union(fvar(*lhs, false), fvar(*rhs, false)),
+            NormAction::Panic(msg) => NormAction::Panic(msg.clone()),
+        }
+    }
+}
+
+impl ToSexp for Action {
+    fn to_sexp(&self) -> Sexp {
+        match self {
+            Action::Let(lhs, rhs) => list!("let", lhs, rhs),
+            Action::Set(lhs, args, rhs) => list!("set", list!(lhs, ++ args), rhs),
+            Action::Union(lhs, rhs) => list!("union", lhs, rhs),
+            Action::Delete(lhs, args) => list!("delete", list!(lhs, ++ args)),
+            Action::Extract(expr, variants) => list!("extract", expr, variants),
+            Action::Panic(msg) => list!("panic", format!("\"{}\"", msg.clone())),
+            Action::Expr(e) => e.to_sexp(),
+        }
+    }
+}
+
+impl Action {
+    pub fn map_exprs(&self, f: &mut impl FnMut(&Expr) -> Expr) -> Self {
+        match self {
+            Action::Let(lhs, rhs) => Action::Let(*lhs, f(rhs)),
+            Action::Set(lhs, args, rhs) => {
+                let right = f(rhs);
+                Action::Set(*lhs, args.iter().map(f).collect(), right)
+            }
+            Action::Delete(lhs, args) => Action::Delete(*lhs, args.iter().map(f).collect()),
+            Action::Union(lhs, rhs) => Action::Union(f(lhs), f(rhs)),
+            Action::Extract(expr, variants) => Action::Extract(f(expr), f(variants)),
+            Action::Panic(msg) => Action::Panic(msg.clone()),
+            Action::Expr(e) => Action::Expr(f(e)),
+        }
+    }
+
+    pub fn replace_canon(&self, canon: &HashMap<Symbol, Expr>) -> Self {
+        match self {
+            Action::Let(lhs, rhs) => Action::Let(*lhs, rhs.subst(canon)),
+            Action::Set(lhs, args, rhs) => Action::Set(
+                *lhs,
+                args.iter().map(|e| e.subst(canon)).collect(),
+                rhs.subst(canon),
+            ),
+            Action::Delete(lhs, args) => {
+                Action::Delete(*lhs, args.iter().map(|e| e.subst(canon)).collect())
+            }
+            Action::Union(lhs, rhs) => Action::Union(lhs.subst(canon), rhs.subst(canon)),
+            Action::Extract(expr, variants) => {
+                Action::Extract(expr.subst(canon), variants.subst(canon))
+            }
+            Action::Panic(msg) => Action::Panic(msg.clone()),
+            Action::Expr(e) => Action::Expr(e.subst(canon)),
+        }
+    }
+}
+
+impl Display for NormAction {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(f, "{}", self.to_action())
+    }
+}
+
+impl Display for Action {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(f, "{}", self.to_sexp())
+    }
+}
+
+#[derive(Clone, Debug)]
+pub struct Rule {
+    // pub query: Query,
+    // pub actions: Vec<Action>,
+    pub head: Vec<Action>,
+    pub body: Vec<Fact>,
+}
+
+#[derive(Clone, Debug, PartialEq, Eq, Hash)]
+pub struct NormRule {
+    pub head: Vec<NormAction>,
+    pub body: Vec<NormFact>,
+}
+
+impl NormRule {
+    pub fn to_rule(&self) -> Rule {
+        Rule {
+            head: self.head.iter().map(|a| a.to_action()).collect(),
+            body: self.body.iter().map(|f| f.to_fact()).collect(),
+        }
+    }
+
+    pub fn globals_used_in_matcher(facts: &Vec<NormFact>) -> HashSet<Symbol> {
+        let mut bound_vars = HashSet::<Symbol>::default();
+        for fact in facts {
+            fact.map_def_use(&mut |var, def| {
+                if def {
+                    bound_vars.insert(var);
+                }
+                var
+            });
+        }
+
+        let mut unbound_vars = HashSet::<Symbol>::default();
+        for fact in facts {
+            fact.map_def_use(&mut |var, def| {
+                if !def && !bound_vars.contains(&var) {
+                    unbound_vars.insert(var);
+                }
+                var
+            });
+        }
+        unbound_vars
+    }
+
+    // just get rid of all the equality constraints for now
+    pub fn resugar_facts(facts: &Vec<NormFact>, subst: &mut HashMap<Symbol, Expr>) -> Vec<Fact> {
+        let unbound = NormRule::globals_used_in_matcher(facts);
+        let mut unionfind = UnionFind::default();
+        let mut var_to_id = HashMap::<Symbol, Id>::default();
+        let mut id_to_var = HashMap::<Id, Symbol>::default();
+        let mut get_id = |var: Symbol, uf: &mut UnionFind| -> Id {
+            if let Some(id) = var_to_id.get(&var) {
+                *id
+            } else {
+                let id = uf.make_set();
+                var_to_id.insert(var, id);
+                id_to_var.insert(id, var);
+                id
+            }
+        };
+        for norm_fact in facts {
+            if let NormFact::ConstrainEq(v1, v2) = norm_fact {
+                let id1 = get_id(*v1, &mut unionfind);
+                let id2 = get_id(*v2, &mut unionfind);
+                unionfind.union_raw(id1, id2);
+            } else if let NormFact::AssignVar(v1, v2) = norm_fact {
+                let id1 = get_id(*v1, &mut unionfind);
+                let id2 = get_id(*v2, &mut unionfind);
+                unionfind.union_raw(id1, id2);
+            }
+        }
+
+        for (var, id) in &var_to_id {
+            let leader = id_to_var.get(&unionfind.find(*id)).unwrap();
+            if leader != var {
+                subst.insert(*var, Expr::Var(*leader));
+            }
+        }
+
+        let mut res = vec![];
+        for fact in facts {
+            match fact {
+                NormFact::ConstrainEq(..) => (),
+                NormFact::AssignVar(..) => (),
+                _ => res.push(fact.to_fact().subst(subst)),
+            }
+        }
+
+        // add back contraints on unbound variables
+        for var in unbound {
+            if let Some(id) = var_to_id.get(&var) {
+                let leader = id_to_var.get(&unionfind.find(*id)).unwrap();
+                if leader != &var {
+                    res.push(Fact::Eq(vec![Expr::Var(var), Expr::Var(*leader)]));
+                }
+            }
+        }
+
+        res
+    }
+
+    pub fn resugar_actions(&self, subst: &mut HashMap<Symbol, Expr>) -> Vec<Action> {
+        let mut used = HashSet::<Symbol>::default();
+        let mut head = Vec::<Action>::default();
+        for a in &self.head {
+            match a {
+                NormAction::Let(symbol, expr) => {
+                    let new_expr = expr.to_expr();
+                    new_expr.map(&mut |subexpr| {
+                        if let Expr::Var(v) = subexpr {
+                            used.insert(*v);
+                        }
+                        subexpr.clone()
+                    });
+                    let substituted = new_expr.subst(subst);
+
+                    // TODO sometimes re-arranging actions is bad
+                    if substituted.ast_size() > 1 {
+                        head.push(Action::Let(*symbol, substituted));
+                    } else {
+                        subst.insert(*symbol, substituted);
+                    }
+                }
+                NormAction::LetVar(symbol, other) => {
+                    let new_expr = subst.get(other).unwrap_or(&Expr::Var(*other)).clone();
+                    used.insert(*other);
+                    subst.insert(*symbol, new_expr);
+                }
+                NormAction::Extract(symbol, variants) => {
+                    let new_expr = subst.get(symbol).cloned().unwrap_or(Expr::Var(*symbol));
+                    used.insert(*symbol);
+                    let new_expr2 = subst.get(variants).cloned().unwrap_or(Expr::Var(*variants));
+                    used.insert(*variants);
+                    head.push(Action::Extract(new_expr, new_expr2));
+                }
+                NormAction::LetLit(symbol, lit) => {
+                    subst.insert(*symbol, Expr::Lit(lit.clone()));
+                }
+                NormAction::Set(expr, other) => {
+                    let new_expr = expr.to_expr();
+                    new_expr.map(&mut |subexpr| {
+                        if let Expr::Var(v) = subexpr {
+                            used.insert(*v);
+                        }
+                        subexpr.clone()
+                    });
+                    let other_expr = subst.get(other).unwrap_or(&Expr::Var(*other)).clone();
+                    used.insert(*other);
+                    let substituted = new_expr.subst(subst);
+                    match substituted {
+                        Expr::Call(op, children) => {
+                            head.push(Action::Set(op, children, other_expr));
+                        }
+                        _ => panic!("Expected call in set"),
+                    }
+                }
+                NormAction::Delete(expr) => {
+                    let new_expr = expr.to_expr();
+                    new_expr.map(&mut |subexpr| {
+                        if let Expr::Var(v) = subexpr {
+                            used.insert(*v);
+                        }
+                        subexpr.clone()
+                    });
+                    match new_expr.subst(subst) {
+                        Expr::Call(op, children) => {
+                            head.push(Action::Delete(op, children));
+                        }
+                        _ => panic!("Expected call in delete"),
+                    }
+                }
+                NormAction::Union(lhs, rhs) => {
+                    let new_lhs = subst.get(lhs).unwrap_or(&Expr::Var(*lhs)).clone();
+                    let new_rhs = subst.get(rhs).unwrap_or(&Expr::Var(*rhs)).clone();
+                    used.insert(*lhs);
+                    used.insert(*rhs);
+                    head.push(Action::Union(new_lhs, new_rhs));
+                }
+                NormAction::Panic(msg) => {
+                    head.push(Action::Panic(msg.clone()));
+                }
+            }
+        }
+
+        // unused substitutions need to be added
+        // to the action, since they have the side-effect
+        // of adding to the database
+        for (var, expr) in subst {
+            if !used.contains(var) {
+                match expr {
+                    Expr::Var(..) => (),
+                    Expr::Lit(..) => (),
+                    Expr::Call(..) => head.push(Action::Expr(expr.clone())),
+                };
+            }
+        }
+        head
+    }
+
+    pub fn resugar(&self) -> Rule {
+        let mut subst = HashMap::<Symbol, Expr>::default();
+
+        let facts_resugared = NormRule::resugar_facts(&self.body, &mut subst);
+
+        Rule {
+            head: self.resugar_actions(&mut subst),
+            body: facts_resugared,
+        }
+    }
+
+    pub fn map_exprs(&self, f: &mut impl FnMut(&NormExpr) -> NormExpr) -> Self {
+        NormRule {
+            head: self.head.iter().map(|a| a.map_exprs(f)).collect(),
+            body: self.body.iter().map(|fac| fac.map_exprs(f)).collect(),
+        }
+    }
+
+    pub fn map_def_use(&self, fvar: &mut impl FnMut(Symbol, bool) -> Symbol) -> Self {
+        NormRule {
+            head: self.head.iter().map(|a| a.map_def_use(fvar)).collect(),
+            body: self.body.iter().map(|fac| fac.map_def_use(fvar)).collect(),
+        }
+    }
+}
+
+impl Display for NormRule {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(f, "{}", self.to_rule())
+    }
+}
+
+impl Rule {
+    pub(crate) fn to_sexp(&self, ruleset: Symbol, name: Symbol) -> Sexp {
+        let mut res = vec![
+            Sexp::String("rule".into()),
+            Sexp::List(self.body.iter().map(|f| f.to_sexp()).collect()),
+            Sexp::List(self.head.iter().map(|a| a.to_sexp()).collect()),
+        ];
+        if ruleset != "".into() {
+            res.push(Sexp::String(":ruleset".into()));
+            res.push(Sexp::String(ruleset.to_string()));
+        }
+        if name != "".into() {
+            res.push(Sexp::String(":name".into()));
+            res.push(Sexp::String(format!("\"{}\"", name)));
+        }
+        Sexp::List(res)
+    }
+
+    pub fn map_exprs(&self, f: &mut impl FnMut(&Expr) -> Expr) -> Self {
+        Rule {
+            head: self.head.iter().map(|a| a.map_exprs(f)).collect(),
+            body: self.body.iter().map(|fact| fact.map_exprs(f)).collect(),
+        }
+    }
+
+    pub(crate) fn fmt_with_ruleset(
+        &self,
+        f: &mut std::fmt::Formatter<'_>,
+        ruleset: Symbol,
+        name: Symbol,
+    ) -> std::fmt::Result {
+        let indent = " ".repeat(7);
+        write!(f, "(rule (")?;
+        for (i, fact) in self.body.iter().enumerate() {
+            if i > 0 {
+                write!(f, "{}", indent)?;
+            }
+
+            if i != self.body.len() - 1 {
+                writeln!(f, "{}", fact)?;
+            } else {
+                write!(f, "{}", fact)?;
+            }
+        }
+        write!(f, ")\n      (")?;
+        for (i, action) in self.head.iter().enumerate() {
+            if i > 0 {
+                write!(f, "{}", indent)?;
+            }
+            if i != self.head.len() - 1 {
+                writeln!(f, "{}", action)?;
+            } else {
+                write!(f, "{}", action)?;
+            }
+        }
+        let ruleset = if ruleset != "".into() {
+            format!(":ruleset {}", ruleset)
+        } else {
+            "".into()
+        };
+        let name = if name != "".into() {
+            format!(":name \"{}\"", name)
+        } else {
+            "".into()
+        };
+        write!(f, ")\n{} {} {})", indent, ruleset, name)
+    }
+}
+
+impl Display for Rule {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        self.fmt_with_ruleset(f, "".into(), "".into())
+    }
+}
+
+#[derive(Clone, Debug)]
+pub struct Rewrite {
+    pub lhs: Expr,
+    pub rhs: Expr,
+    pub conditions: Vec<Fact>,
+}
+
+impl Rewrite {
+    pub(crate) fn to_sexp(&self, ruleset: Symbol, is_bidirectional: bool) -> Sexp {
+        let mut res = vec![
+            Sexp::String(if is_bidirectional {
+                "birewrite".into()
+            } else {
+                "rewrite".into()
+            }),
+            self.lhs.to_sexp(),
+            self.rhs.to_sexp(),
+        ];
+
+        if !self.conditions.is_empty() {
+            res.push(Sexp::String(":when".into()));
+            res.push(Sexp::List(
+                self.conditions.iter().map(|f| f.to_sexp()).collect(),
+            ));
+        }
+
+        if ruleset != "".into() {
+            res.push(Sexp::String(":ruleset".into()));
+            res.push(Sexp::String(ruleset.to_string()));
+        }
+        Sexp::List(res)
+    }
+}
+
+impl Display for Rewrite {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(f, "{}", self.to_sexp("".into(), false))
+    }
+}
+
\ No newline at end of file diff --git a/docs/src/egglog/extract.rs.html b/docs/src/egglog/extract.rs.html new file mode 100644 index 000000000..14894e5db --- /dev/null +++ b/docs/src/egglog/extract.rs.html @@ -0,0 +1,393 @@ +extract.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+
use hashbrown::hash_map::Entry;
+
+use crate::ast::Symbol;
+use crate::termdag::{Term, TermDag};
+use crate::util::HashMap;
+use crate::{ArcSort, EGraph, Function, Id, Value};
+
+pub type Cost = usize;
+
+#[derive(Debug)]
+pub(crate) struct Node<'a> {
+    sym: Symbol,
+    inputs: &'a [Value],
+}
+
+pub struct Extractor<'a> {
+    pub costs: HashMap<Id, (Cost, Term)>,
+    ctors: Vec<Symbol>,
+    egraph: &'a EGraph,
+}
+
+impl EGraph {
+    pub fn value_to_id(&self, value: Value) -> Option<(Symbol, Id)> {
+        if let Some(sort) = self.get_sort(&value) {
+            if sort.is_eq_sort() {
+                let id = Id::from(value.bits as usize);
+                return Some((sort.name(), self.find(id)));
+            }
+        }
+        None
+    }
+
+    pub fn extract(&self, value: Value, termdag: &mut TermDag, arcsort: &ArcSort) -> (Cost, Term) {
+        let extractor = Extractor::new(self, termdag);
+        extractor
+            .find_best(value, termdag, arcsort)
+            .unwrap_or_else(|| {
+                log::error!("No cost for {:?}", value);
+                for func in self.functions.values() {
+                    for (inputs, output) in func.nodes.iter() {
+                        if output.value == value {
+                            log::error!("Found unextractable function: {:?}", func.decl.name);
+                            log::error!("Inputs: {:?}", inputs);
+                            log::error!(
+                                "{:?}",
+                                inputs
+                                    .iter()
+                                    .map(|input| extractor.costs.get(&extractor.find(input)))
+                                    .collect::<Vec<_>>()
+                            );
+                        }
+                    }
+                }
+
+                panic!("No cost for {:?}", value)
+            })
+    }
+
+    pub fn extract_variants(
+        &mut self,
+        value: Value,
+        limit: usize,
+        termdag: &mut TermDag,
+    ) -> Vec<Term> {
+        let (tag, id) = self.value_to_id(value).unwrap();
+        let output_value = &Value::from_id(tag, id);
+        let ext = &Extractor::new(self, termdag);
+        ext.ctors
+            .iter()
+            .flat_map(|&sym| {
+                let func = &self.functions[&sym];
+                if !func.schema.output.is_eq_sort() {
+                    return vec![];
+                }
+                assert!(func.schema.output.is_eq_sort());
+
+                func.nodes
+                    .iter()
+                    .filter_map(|(inputs, output)| {
+                        (&output.value == output_value).then(|| {
+                            let node = Node { sym, inputs };
+                            ext.expr_from_node(&node, termdag).expect(
+                                "extract_variants should be called after extractor initialization",
+                            )
+                        })
+                    })
+                    .collect()
+            })
+            .take(limit)
+            .collect()
+    }
+}
+
+impl<'a> Extractor<'a> {
+    pub fn new(egraph: &'a EGraph, termdag: &mut TermDag) -> Self {
+        let mut extractor = Extractor {
+            costs: HashMap::default(),
+            egraph,
+            ctors: vec![],
+        };
+
+        // only consider "extractable" functions
+        extractor.ctors.extend(
+            egraph
+                .functions
+                .keys()
+                .filter(|func| !egraph.functions.get(*func).unwrap().decl.unextractable)
+                .cloned(),
+        );
+
+        log::debug!("Extracting from ctors: {:?}", extractor.ctors);
+        extractor.find_costs(termdag);
+        extractor
+    }
+
+    fn expr_from_node(&self, node: &Node, termdag: &mut TermDag) -> Option<Term> {
+        let mut children = vec![];
+        for value in node.inputs {
+            let arcsort = self.egraph.get_sort(value).unwrap();
+            children.push(self.find_best(*value, termdag, arcsort)?.1)
+        }
+
+        Some(termdag.app(node.sym, children))
+    }
+
+    pub fn find_best(
+        &self,
+        value: Value,
+        termdag: &mut TermDag,
+        sort: &ArcSort,
+    ) -> Option<(Cost, Term)> {
+        if sort.is_eq_sort() {
+            let id = self.find(&value);
+            let (cost, node) = self.costs.get(&id)?.clone();
+            Some((cost, node))
+        } else {
+            let (cost, node) = sort.extract_expr(self.egraph, value, self, termdag)?;
+            Some((cost, termdag.expr_to_term(&node)))
+        }
+    }
+
+    fn node_total_cost(
+        &mut self,
+        function: &Function,
+        children: &[Value],
+        termdag: &mut TermDag,
+    ) -> Option<(Vec<Term>, Cost)> {
+        let mut cost = function.decl.cost.unwrap_or(1);
+        let types = &function.schema.input;
+        let mut terms: Vec<Term> = vec![];
+        for (ty, value) in types.iter().zip(children) {
+            let (term_cost, term) = self.find_best(*value, termdag, ty)?;
+            terms.push(term.clone());
+            cost = cost.saturating_add(term_cost);
+        }
+        Some((terms, cost))
+    }
+
+    fn find(&self, value: &Value) -> Id {
+        self.egraph.find(Id::from(value.bits as usize))
+    }
+
+    fn find_costs(&mut self, termdag: &mut TermDag) {
+        let mut did_something = true;
+        while did_something {
+            did_something = false;
+
+            for sym in self.ctors.clone() {
+                let func = &self.egraph.functions[&sym];
+                if func.schema.output.is_eq_sort() {
+                    for (inputs, output) in func.nodes.iter() {
+                        if let Some((term_inputs, new_cost)) =
+                            self.node_total_cost(func, inputs, termdag)
+                        {
+                            let make_new_pair = || (new_cost, termdag.app(sym, term_inputs));
+
+                            let id = self.find(&output.value);
+                            match self.costs.entry(id) {
+                                Entry::Vacant(e) => {
+                                    did_something = true;
+                                    e.insert(make_new_pair());
+                                }
+                                Entry::Occupied(mut e) => {
+                                    if new_cost < e.get().0 {
+                                        did_something = true;
+                                        e.insert(make_new_pair());
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+}
+
\ No newline at end of file diff --git a/docs/src/egglog/function/binary_search.rs.html b/docs/src/egglog/function/binary_search.rs.html new file mode 100644 index 000000000..d3221bc4d --- /dev/null +++ b/docs/src/egglog/function/binary_search.rs.html @@ -0,0 +1,177 @@ +binary_search.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+
use std::cmp::Ordering;
+
+use super::table::Table;
+
+/// Binary search a [`Table`] for the smallest index with a timestamp greater
+/// than or equal to `target`.
+pub(crate) fn binary_search_table_by_key(data: &Table, target: u32) -> Option<usize> {
+    if data.is_empty() {
+        return None;
+    }
+    if data.max_ts() < target {
+        return None;
+    }
+    if data.min_ts().unwrap() > target {
+        return Some(0);
+    }
+    // adapted from std::slice::binary_search_by
+    let mut size = data.num_offsets();
+    let mut left = 0;
+    let mut right = size;
+    while left < right {
+        let mut mid = left + size / 2;
+        let cmp = data.get_timestamp(mid).unwrap().cmp(&target);
+
+        // The std implementation claims that if/else generates better code than match.
+        if cmp == Ordering::Less {
+            left = mid + 1;
+        } else if cmp == Ordering::Greater {
+            right = mid;
+        } else {
+            // We need to march back to the start of the matching elements. We
+            // could have jumped into the middle of a run.
+            //
+            // TODO: this makes the algorithm O(n); we can use a variant of
+            // gallop to get it back to log(n) if needed. See
+            // https://github.com/frankmcsherry/blog/blob/master/posts/2018-05-19.md
+            while mid > 0 {
+                let next_mid = mid - 1;
+                if data.get_timestamp(next_mid).unwrap() != target {
+                    break;
+                }
+                mid = next_mid;
+            }
+            return Some(mid);
+        }
+        size = right - left;
+    }
+    Some(left)
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+    use crate::Value;
+
+    fn make_value(bits: u32) -> Value {
+        Value {
+            tag: "testing".into(),
+            bits: bits as u64,
+        }
+    }
+
+    fn insert_to_map(table: &mut Table, i: u32, ts: u32) {
+        let v = make_value(i);
+        table.insert(&[v], v, ts);
+    }
+
+    #[test]
+    fn binary_search() {
+        let mut map = Table::default();
+        assert_eq!(binary_search_table_by_key(&map, 0), None);
+        insert_to_map(&mut map, 1, 1);
+        assert_eq!(binary_search_table_by_key(&map, 0), Some(0));
+        map.clear();
+        for i in 0..128 {
+            // have a run of 4 24s and then skip to 26
+            let v = if i == 50 || i == 51 { 24 } else { i / 2 };
+            insert_to_map(&mut map, i, v);
+        }
+
+        assert_eq!(binary_search_table_by_key(&map, 3), Some(6));
+        assert_eq!(binary_search_table_by_key(&map, 0), Some(0));
+        assert_eq!(binary_search_table_by_key(&map, 63), Some(126));
+        assert_eq!(binary_search_table_by_key(&map, 200), None);
+        assert_eq!(binary_search_table_by_key(&map, 24), Some(48));
+        assert_eq!(binary_search_table_by_key(&map, 25), Some(52));
+    }
+}
+
\ No newline at end of file diff --git a/docs/src/egglog/function/index.rs.html b/docs/src/egglog/function/index.rs.html new file mode 100644 index 000000000..af017c450 --- /dev/null +++ b/docs/src/egglog/function/index.rs.html @@ -0,0 +1,201 @@ +index.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+
//! Column-level indexes on values from a common sort.
+use smallvec::SmallVec;
+use symbol_table::GlobalSymbol;
+
+use crate::{unionfind::UnionFind, util::HashMap, Value};
+
+pub(crate) type Offset = u32;
+
+#[derive(Clone, Debug)]
+pub(crate) struct ColumnIndex {
+    sort: GlobalSymbol,
+    ids: HashMap<u64, SmallVec<[Offset; 8]>>,
+}
+
+impl ColumnIndex {
+    pub(crate) fn new(sort: GlobalSymbol) -> ColumnIndex {
+        ColumnIndex {
+            sort,
+            ids: Default::default(),
+        }
+    }
+
+    pub(crate) fn sort(&self) -> GlobalSymbol {
+        self.sort
+    }
+
+    pub(crate) fn add(&mut self, v: Value, i: usize) {
+        assert_eq!(v.tag, self.sort);
+        self.ids.entry(v.bits).or_default().push(i as Offset);
+    }
+
+    pub(crate) fn clear(&mut self) {
+        self.ids.clear()
+    }
+
+    pub(crate) fn len(&self) -> usize {
+        self.ids.len()
+    }
+
+    pub(crate) fn get(&self, v: &Value) -> Option<&[Offset]> {
+        self.get_indexes_for_bits(v.bits)
+    }
+
+    fn get_indexes_for_bits(&self, bits: u64) -> Option<&[Offset]> {
+        self.ids.get(&bits).map(|x| x.as_slice())
+    }
+
+    pub(crate) fn iter(&self) -> impl Iterator<Item = (Value, &[Offset])> + '_ {
+        self.ids.iter().map(|(bits, v)| {
+            (
+                Value {
+                    tag: self.sort,
+                    bits: *bits,
+                },
+                v.as_slice(),
+            )
+        })
+    }
+
+    pub(crate) fn to_canonicalize<'a>(
+        &'a self,
+        uf: &'a UnionFind,
+    ) -> impl Iterator<Item = usize> + '_ {
+        uf.dirty_ids(self.sort).flat_map(|x| {
+            self.get_indexes_for_bits(usize::from(x) as u64)
+                .unwrap_or(&[])
+                .iter()
+                .copied()
+                .map(|x| x as usize)
+        })
+    }
+}
+#[derive(Clone, Debug)]
+pub(crate) struct CompositeColumnIndex(SmallVec<[ColumnIndex; 2]>);
+
+impl CompositeColumnIndex {
+    pub(crate) fn new() -> CompositeColumnIndex {
+        CompositeColumnIndex(SmallVec::new())
+    }
+
+    pub(crate) fn add(&mut self, v: Value, i: usize) {
+        if let Some(index) = self.0.iter().position(|index| index.sort() == v.tag) {
+            (self.0)[index].add(v, i);
+        } else {
+            let mut index = ColumnIndex::new(v.tag);
+            index.add(v, i);
+            self.0.push(index);
+        }
+    }
+
+    pub(crate) fn clear(&mut self) {
+        for index in self.0.iter_mut() {
+            index.clear();
+        }
+    }
+
+    pub(crate) fn iter(&self) -> impl Iterator<Item = &ColumnIndex> {
+        self.0.iter()
+    }
+}
+
\ No newline at end of file diff --git a/docs/src/egglog/function/mod.rs.html b/docs/src/egglog/function/mod.rs.html new file mode 100644 index 000000000..64d3f8c17 --- /dev/null +++ b/docs/src/egglog/function/mod.rs.html @@ -0,0 +1,875 @@ +mod.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+390
+391
+392
+393
+394
+395
+396
+397
+398
+399
+400
+401
+402
+403
+404
+405
+406
+407
+408
+409
+410
+411
+412
+413
+414
+415
+416
+417
+418
+419
+420
+421
+422
+423
+424
+425
+426
+427
+428
+429
+430
+431
+432
+433
+434
+435
+436
+437
+
use std::mem;
+
+use crate::*;
+use index::*;
+use smallvec::SmallVec;
+
+mod binary_search;
+pub mod index;
+pub(crate) mod table;
+
+pub type ValueVec = SmallVec<[Value; 3]>;
+
+#[derive(Clone)]
+pub struct Function {
+    pub decl: FunctionDecl,
+    pub schema: ResolvedSchema,
+    pub merge: MergeAction,
+    pub(crate) nodes: table::Table,
+    sorts: HashSet<Symbol>,
+    pub(crate) indexes: Vec<Rc<ColumnIndex>>,
+    pub(crate) rebuild_indexes: Vec<Option<CompositeColumnIndex>>,
+    index_updated_through: usize,
+    updates: usize,
+    scratch: IndexSet<usize>,
+}
+
+#[derive(Clone)]
+pub struct MergeAction {
+    pub on_merge: Option<Rc<Program>>,
+    pub merge_vals: MergeFn,
+}
+
+#[derive(Clone)]
+pub enum MergeFn {
+    AssertEq,
+    Union,
+    // the rc is make sure it's cheaply clonable, since calling the merge fn
+    // requires a clone
+    Expr(Rc<Program>),
+}
+
+#[derive(Debug, Clone)]
+pub struct TupleOutput {
+    pub value: Value,
+    pub timestamp: u32,
+}
+
+#[derive(Clone, Debug)]
+pub struct ResolvedSchema {
+    pub input: Vec<ArcSort>,
+    pub output: ArcSort,
+}
+
+impl ResolvedSchema {
+    pub fn get_by_pos(&self, index: usize) -> Option<&ArcSort> {
+        if self.input.len() == index {
+            Some(&self.output)
+        } else {
+            self.input.get(index)
+        }
+    }
+}
+
+/// A non-Union merge discovered during rebuilding that has to be applied before
+/// resuming execution.
+pub(crate) type DeferredMerge = (ValueVec, Value, Value);
+
+impl Function {
+    pub fn new(egraph: &EGraph, decl: &FunctionDecl) -> Result<Self, Error> {
+        let mut input = Vec::with_capacity(decl.schema.input.len());
+        for s in &decl.schema.input {
+            input.push(match egraph.proof_state.type_info.sorts.get(s) {
+                Some(sort) => sort.clone(),
+                None => return Err(Error::TypeError(TypeError::Unbound(*s))),
+            })
+        }
+
+        let output = match egraph.proof_state.type_info.sorts.get(&decl.schema.output) {
+            Some(sort) => sort.clone(),
+            None => return Err(Error::TypeError(TypeError::Unbound(decl.schema.output))),
+        };
+
+        let merge_vals = if let Some(merge_expr) = &decl.merge {
+            let mut types = IndexMap::<Symbol, ArcSort>::default();
+            types.insert("old".into(), output.clone());
+            types.insert("new".into(), output.clone());
+            let (_, program) = egraph
+                .compile_expr(&types, merge_expr, Some(output.clone()))
+                .map_err(Error::TypeErrors)?;
+            MergeFn::Expr(Rc::new(program))
+        } else if output.is_eq_sort() {
+            MergeFn::Union
+        } else {
+            MergeFn::AssertEq
+        };
+
+        let on_merge = if decl.merge_action.is_empty() {
+            None
+        } else {
+            let mut types = IndexMap::<Symbol, ArcSort>::default();
+            types.insert("old".into(), output.clone());
+            types.insert("new".into(), output.clone());
+            let program = egraph
+                .compile_actions(&types, &decl.merge_action)
+                .map_err(Error::TypeErrors)?;
+            Some(Rc::new(program))
+        };
+
+        let indexes = Vec::from_iter(
+            input
+                .iter()
+                .chain(once(&output))
+                .map(|x| Rc::new(ColumnIndex::new(x.name()))),
+        );
+
+        let rebuild_indexes = Vec::from_iter(input.iter().chain(once(&output)).map(|x| {
+            if x.is_eq_container_sort() {
+                Some(CompositeColumnIndex::new())
+            } else {
+                None
+            }
+        }));
+
+        let sorts: HashSet<Symbol> = input
+            .iter()
+            .map(|x| x.name())
+            .chain(once(output.name()))
+            .collect();
+
+        Ok(Function {
+            decl: decl.clone(),
+            schema: ResolvedSchema { input, output },
+            nodes: Default::default(),
+            scratch: Default::default(),
+            sorts,
+            // TODO: build indexes for primitive sorts lazily
+            indexes,
+            rebuild_indexes,
+            index_updated_through: 0,
+            updates: 0,
+            merge: MergeAction {
+                on_merge,
+                merge_vals,
+            },
+            // TODO figure out merge and default here
+        })
+    }
+
+    pub fn get(&self, inputs: &[Value]) -> Option<Value> {
+        self.nodes.get(inputs).map(|output| output.value)
+    }
+
+    pub fn insert(&mut self, inputs: &[Value], value: Value, timestamp: u32) -> Option<Value> {
+        self.insert_internal(inputs, value, timestamp, true)
+    }
+    pub fn clear(&mut self) {
+        self.nodes.clear();
+        self.indexes
+            .iter_mut()
+            .for_each(|x| Rc::make_mut(x).clear());
+        self.rebuild_indexes.iter_mut().for_each(|x| {
+            if let Some(x) = x {
+                x.clear()
+            }
+        });
+        self.index_updated_through = 0;
+    }
+    pub fn insert_internal(
+        &mut self,
+        inputs: &[Value],
+        value: Value,
+        timestamp: u32,
+        // Clean out all stale entries if they account for a sufficiently large
+        // portion of the table after this entry is inserted.
+        maybe_rehash: bool,
+    ) -> Option<Value> {
+        if cfg!(debug_assertions) {
+            for (v, sort) in inputs
+                .iter()
+                .zip(self.schema.input.iter())
+                .chain(once((&value, &self.schema.output)))
+            {
+                assert_eq!(sort.name(), v.tag);
+            }
+        }
+        let res = self.nodes.insert(inputs, value, timestamp);
+        if maybe_rehash {
+            self.maybe_rehash();
+        }
+        res
+    }
+
+    /// Return a column index that contains (a superset of) the offsets for the
+    /// given column. This method can return nothing if the indexes available
+    /// contain too many irrelevant offsets.
+    pub(crate) fn column_index(
+        &self,
+        col: usize,
+        timestamps: &Range<u32>,
+    ) -> Option<Rc<ColumnIndex>> {
+        let range = self.nodes.transform_range(timestamps);
+        if range.end > self.index_updated_through {
+            return None;
+        }
+        let size = range.end.saturating_sub(range.start);
+        // If this represents >12.5% overhead, don't use the index
+        if (self.nodes.num_offsets() - size) > (size / 8) {
+            return None;
+        }
+        let target = &self.indexes[col];
+        Some(target.clone())
+    }
+
+    pub(crate) fn remove(&mut self, ks: &[Value], ts: u32) -> bool {
+        let res = self.nodes.remove(ks, ts);
+        self.maybe_rehash();
+        res
+    }
+
+    pub(crate) fn clear_updates(&mut self) -> usize {
+        mem::take(&mut self.updates)
+    }
+
+    fn build_indexes(&mut self, offsets: Range<usize>) {
+        for (col, (index, rebuild_index)) in self
+            .indexes
+            .iter_mut()
+            .zip(self.rebuild_indexes.iter_mut())
+            .enumerate()
+        {
+            let as_mut = Rc::make_mut(index);
+            if col == self.schema.input.len() {
+                for (slot, _, out) in self.nodes.iter_range(offsets.clone()) {
+                    as_mut.add(out.value, slot)
+                }
+            } else {
+                for (slot, inp, _) in self.nodes.iter_range(offsets.clone()) {
+                    as_mut.add(inp[col], slot)
+                }
+            }
+
+            // rebuild_index
+            if let Some(rebuild_index) = rebuild_index {
+                if col == self.schema.input.len() {
+                    for (slot, _, out) in self.nodes.iter_range(offsets.clone()) {
+                        self.schema.output.foreach_tracked_values(
+                            &out.value,
+                            Box::new(|value| rebuild_index.add(value, slot)),
+                        )
+                    }
+                } else {
+                    for (slot, inp, _) in self.nodes.iter_range(offsets.clone()) {
+                        self.schema.input[col].foreach_tracked_values(
+                            &inp[col],
+                            Box::new(|value| rebuild_index.add(value, slot)),
+                        )
+                    }
+                }
+            }
+        }
+    }
+
+    fn update_indexes(&mut self, through: usize) {
+        self.build_indexes(self.index_updated_through..through);
+        self.index_updated_through = self.index_updated_through.max(through);
+    }
+
+    fn maybe_rehash(&mut self) {
+        if !self.nodes.too_stale() {
+            return;
+        }
+
+        for index in &mut self.indexes {
+            // Everything works if we don't have a unique copy of the indexes,
+            // but we ought to be able to avoid this copy.
+            Rc::make_mut(index).clear();
+        }
+        for rebuild_index in self.rebuild_indexes.iter_mut().flatten() {
+            rebuild_index.clear();
+        }
+        self.nodes.rehash();
+        self.index_updated_through = 0;
+        if self.nodes.is_empty() {
+            return;
+        }
+        self.update_indexes(self.nodes.num_offsets());
+    }
+
+    pub(crate) fn iter_timestamp_range(
+        &self,
+        timestamps: &Range<u32>,
+    ) -> impl Iterator<Item = (usize, &[Value], &TupleOutput)> {
+        self.nodes.iter_timestamp_range(timestamps)
+    }
+
+    pub fn rebuild(
+        &mut self,
+        uf: &mut UnionFind,
+        timestamp: u32,
+    ) -> Result<(usize, Vec<DeferredMerge>), Error> {
+        // Make sure indexes are up to date.
+        self.update_indexes(self.nodes.num_offsets());
+        if self
+            .schema
+            .input
+            .iter()
+            .all(|s| !s.is_eq_sort() && !s.is_eq_container_sort())
+            && !self.schema.output.is_eq_sort()
+            && !self.schema.output.is_eq_container_sort()
+        {
+            return Ok((std::mem::take(&mut self.updates), Default::default()));
+        }
+        let mut deferred_merges = Vec::new();
+        let mut scratch = ValueVec::new();
+        let n_unions = uf.n_unions();
+
+        if uf.new_ids(|sort| self.sorts.contains(&sort)) > (self.nodes.num_offsets() / 2) {
+            // basic heuristic: if we displaced a large number of ids relative
+            // to the size of the table, then just rebuild everything.
+            for i in 0..self.nodes.num_offsets() {
+                self.rebuild_at(i, timestamp, uf, &mut scratch, &mut deferred_merges)?;
+            }
+        } else {
+            let mut to_canon = mem::take(&mut self.scratch);
+
+            to_canon.clear();
+
+            for (i, (ridx, idx)) in self
+                .rebuild_indexes
+                .iter()
+                .zip(self.indexes.iter())
+                .enumerate()
+            {
+                let sort = self.schema.get_by_pos(i).unwrap();
+                if !sort.is_eq_container_sort() && !sort.is_eq_sort() {
+                    // No need to canonicalize in this case
+                    continue;
+                }
+
+                // attempt to use the rebuilding index if it exists
+                if let Some(ridx) = ridx {
+                    debug_assert!(sort.is_eq_container_sort());
+                    to_canon.extend(ridx.iter().flat_map(|idx| idx.to_canonicalize(uf)))
+                } else {
+                    debug_assert!(sort.is_eq_sort());
+                    to_canon.extend(idx.to_canonicalize(uf))
+                }
+            }
+
+            for i in to_canon.iter().copied() {
+                self.rebuild_at(i, timestamp, uf, &mut scratch, &mut deferred_merges)?;
+            }
+            self.scratch = to_canon;
+        }
+        self.maybe_rehash();
+        Ok((
+            uf.n_unions() - n_unions + std::mem::take(&mut self.updates),
+            deferred_merges,
+        ))
+    }
+
+    fn rebuild_at(
+        &mut self,
+        i: usize,
+        timestamp: u32,
+        uf: &mut UnionFind,
+        scratch: &mut ValueVec,
+        deferred_merges: &mut Vec<(ValueVec, Value, Value)>,
+    ) -> Result<(), Error> {
+        let mut result: Result<(), Error> = Ok(());
+        let mut modified = false;
+        let (args, out) = if let Some(x) = self.nodes.get_index(i) {
+            x
+        } else {
+            // Entry is stale
+            return result;
+        };
+
+        let mut out_val = out.value;
+        scratch.clear();
+        scratch.extend(args.iter().copied());
+
+        for (val, ty) in scratch.iter_mut().zip(&self.schema.input) {
+            modified |= ty.canonicalize(val, uf);
+        }
+
+        modified |= self.schema.output.canonicalize(&mut out_val, uf);
+
+        if !modified {
+            return result;
+        }
+        let out_ty = &self.schema.output;
+        self.nodes.insert_and_merge(scratch, timestamp, |prev| {
+            if let Some(mut prev) = prev {
+                out_ty.canonicalize(&mut prev, uf);
+                let mut appended = false;
+                if self.merge.on_merge.is_some() && prev != out_val {
+                    deferred_merges.push((scratch.clone(), prev, out_val));
+                    appended = true;
+                }
+                match &self.merge.merge_vals {
+                    MergeFn::Union => {
+                        debug_assert!(self.schema.output.is_eq_sort());
+                        uf.union_values(prev, out_val, self.schema.output.name())
+                    }
+                    MergeFn::AssertEq => {
+                        if prev != out_val {
+                            result = Err(Error::MergeError(self.decl.name, prev, out_val));
+                        }
+                        prev
+                    }
+                    MergeFn::Expr(_) => {
+                        if !appended {
+                            deferred_merges.push((scratch.clone(), prev, out_val));
+                        }
+                        prev
+                    }
+                }
+            } else {
+                out_val
+            }
+        });
+        if let Some((inputs, _)) = self.nodes.get_index(i) {
+            if inputs != &scratch[..] {
+                scratch.clear();
+                scratch.extend_from_slice(inputs);
+                self.nodes.remove(scratch, timestamp);
+                scratch.clear();
+            }
+        }
+        result
+    }
+
+    pub(crate) fn get_size(&self, range: &Range<u32>) -> usize {
+        self.nodes.approximate_range_size(range)
+    }
+}
+
\ No newline at end of file diff --git a/docs/src/egglog/function/table.rs.html b/docs/src/egglog/function/table.rs.html new file mode 100644 index 000000000..348f8ac11 --- /dev/null +++ b/docs/src/egglog/function/table.rs.html @@ -0,0 +1,669 @@ +table.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+
//! A table type used to represent functions.
+//!
+//! Tables are essentially hash table mapping from vectors of values to values,
+//! but they make different trade-offs than standard HashMaps or IndexMaps:
+//!
+//! * Like indexmap, tables preserve insertion order and support lookups based on
+//! vector-like "offsets" in addition to table keys.
+//!
+//! * Unlike indexmap, these tables support constant-time removals that preserve
+//! insertion order. Removals merely mark entries as "stale."
+//!
+//! These features come at the cost of needing to periodically rehash the table.
+//! These rehashes must be done explicitly because they perturb the integer
+//! table offsets that are otherwise stable. We prefer explicit rehashes because
+//! column-level indexes use raw offsets into the table, and they need to be
+//! rebuilt when a rehash happens.
+//!
+//! The advantage of these features is that tables can be sorted by "timestamp,"
+//! making it efficient to iterate over subsets of a table matching a given
+//! timestamp range.
+//!
+//! Note on rehashing: We will eventually want to keep old/stale entries around
+//! to facilitate proofs/provenance. Early testing found that removing this in
+//! the "obvious" way (keeping 'vals' around, avoiding `mem::take()`s for stale
+//! entries, keeping stale entries out of `table` made some workloads very slow.
+//! It's likely that we will have to store these "on the side" or use some sort
+//! of persistent data-structure for the entire table.
+use std::{
+    hash::{BuildHasher, Hash, Hasher},
+    mem,
+    ops::Range,
+};
+
+use hashbrown::raw::RawTable;
+
+use super::binary_search::binary_search_table_by_key;
+use crate::{util::BuildHasher as BH, TupleOutput, Value, ValueVec};
+
+type Offset = usize;
+
+#[derive(Copy, Clone, PartialEq, Eq, Hash)]
+struct TableOffset {
+    // Hashes are stored inline in the table to avoid cache misses during
+    // probing, and to avoid `values` lookups entirely during insertions.
+    hash: u64,
+    off: Offset,
+}
+
+#[derive(Default, Clone)]
+pub(crate) struct Table {
+    max_ts: u32,
+    n_stale: usize,
+    table: RawTable<TableOffset>,
+    pub(crate) vals: Vec<(Input, TupleOutput)>,
+}
+
+/// Used for the RawTable probe sequence.
+macro_rules! search_for {
+    ($slf:expr, $hash:expr, $inp:expr) => {
+        |to| {
+            // Test that hashes match.
+            if to.hash != $hash {
+                return false;
+            }
+            // If the hash matches, the value should not be stale, and the data
+            // should match.
+            let inp = &$slf.vals[to.off as usize].0;
+            inp.live() && inp.data() == $inp
+        }
+    };
+}
+
+impl Table {
+    /// Clear the contents of the table.
+    pub(crate) fn clear(&mut self) {
+        self.max_ts = 0;
+        self.n_stale = 0;
+        self.table.clear();
+        self.vals.clear();
+    }
+
+    /// Indicates whether or not the table should be rehashed.
+    pub(crate) fn too_stale(&self) -> bool {
+        self.n_stale > (self.vals.len() / 2)
+    }
+
+    /// Rehashes the table, invalidating any offsets stored into the table.
+    pub(crate) fn rehash(&mut self) {
+        let mut src = 0usize;
+        let mut dst = 0usize;
+        self.table.clear();
+        self.vals.retain(|(inp, _)| {
+            if inp.live() {
+                let hash = hash_values(inp.data());
+                self.table
+                    .insert(hash, TableOffset { hash, off: dst }, |to| to.hash);
+                src += 1;
+                dst += 1;
+                true
+            } else {
+                src += 1;
+                false
+            }
+        });
+        self.n_stale = 0;
+    }
+
+    /// Get the entry in the table for the given values, if they are in the
+    /// table.
+    pub(crate) fn get(&self, inputs: &[Value]) -> Option<&TupleOutput> {
+        let hash = hash_values(inputs);
+        let TableOffset { off, .. } = self.table.get(hash, search_for!(self, hash, inputs))?;
+        debug_assert!(self.vals[*off].0.live());
+        Some(&self.vals[*off].1)
+    }
+
+    /// Insert the given data into the table at the given timestamp. Return the
+    /// previous value, if there was one.
+    pub(crate) fn insert(&mut self, inputs: &[Value], out: Value, ts: u32) -> Option<Value> {
+        let mut res = None;
+        self.insert_and_merge(inputs, ts, |prev| {
+            res = prev;
+            out
+        });
+        res
+    }
+
+    /// Insert the given data into the table at the given timestamp. Thismethod
+    /// allows for efficient 'merges', conditional on the previous value mapped
+    /// to by the given index.
+    ///
+    /// * `on_merge(None)` should return the value mapping to the given slot.
+    /// * `on_merge(Some(x))` can return a "merged" value (e.g. the union union
+    ///   of `x` and `on_merge(None)`).
+    pub(crate) fn insert_and_merge(
+        &mut self,
+        inputs: &[Value],
+        ts: u32,
+        on_merge: impl FnOnce(Option<Value>) -> Value,
+    ) {
+        assert!(ts >= self.max_ts);
+        self.max_ts = ts;
+        let hash = hash_values(inputs);
+        if let Some(TableOffset { off, .. }) =
+            self.table.get_mut(hash, search_for!(self, hash, inputs))
+        {
+            let (inp, prev) = &mut self.vals[*off];
+            let next = on_merge(Some(prev.value));
+            if next == prev.value {
+                return;
+            }
+            inp.stale_at = ts;
+            self.n_stale += 1;
+            let k = mem::take(&mut inp.data);
+            let new_offset = self.vals.len();
+            self.vals.push((
+                Input::new(k),
+                TupleOutput {
+                    value: next,
+                    timestamp: ts,
+                },
+            ));
+            *off = new_offset;
+            return;
+        }
+        let new_offset = self.vals.len();
+        self.vals.push((
+            Input::new(inputs.into()),
+            TupleOutput {
+                value: on_merge(None),
+                timestamp: ts,
+            },
+        ));
+        self.table.insert(
+            hash,
+            TableOffset {
+                hash,
+                off: new_offset,
+            },
+            |off| off.hash,
+        );
+    }
+
+    /// One more than the maximum (potentially) valid offset into the table.
+    pub(crate) fn num_offsets(&self) -> usize {
+        self.vals.len()
+    }
+
+    /// One more than the actual valid offset (not including stale) into the table.
+    pub(crate) fn len(&self) -> usize {
+        self.vals.len() - self.n_stale
+    }
+
+    /// Whether the table is completely empty, including stale entries.
+    pub(crate) fn is_empty(&self) -> bool {
+        self.num_offsets() == 0
+    }
+
+    /// The minimum timestamp stored by the table, if there is one.
+    pub(crate) fn min_ts(&self) -> Option<u32> {
+        Some(self.vals.first()?.1.timestamp)
+    }
+
+    /// An upper bound for all timestamps stored in the table.
+    pub(crate) fn max_ts(&self) -> u32 {
+        self.max_ts
+    }
+
+    /// Get the timestamp for the entry at index `i`.
+    pub(crate) fn get_timestamp(&self, i: usize) -> Option<u32> {
+        Some(self.vals.get(i)?.1.timestamp)
+    }
+
+    /// Remove the given mapping from the table, returns whether an entry was
+    /// removed.
+    pub(crate) fn remove(&mut self, inp: &[Value], ts: u32) -> bool {
+        let hash = hash_values(inp);
+        let entry = if let Some(entry) = self.table.remove_entry(hash, search_for!(self, hash, inp))
+        {
+            entry
+        } else {
+            return false;
+        };
+        self.vals[entry.off].0.stale_at = ts;
+        self.n_stale += 1;
+        true
+    }
+
+    /// Returns the entries at the given index if the entry is live and the index in bounds.
+    pub(crate) fn get_index(&self, i: usize) -> Option<(&[Value], &TupleOutput)> {
+        let (inp, out) = self.vals.get(i)?;
+        if !inp.live() {
+            return None;
+        }
+        Some((inp.data(), out))
+    }
+
+    /// Iterate over the live entries in the table, in insertion order.
+    pub(crate) fn iter(&self) -> impl Iterator<Item = (&[Value], &TupleOutput)> + '_ {
+        self.iter_range(0..self.num_offsets())
+            .map(|(_, y, z)| (y, z))
+    }
+
+    /// Iterate over the live entries in the offset range, passing back the
+    /// offset corresponding to each entry.
+    pub(crate) fn iter_range(
+        &self,
+        range: Range<usize>,
+    ) -> impl Iterator<Item = (usize, &[Value], &TupleOutput)> + '_ {
+        self.vals[range.clone()]
+            .iter()
+            .zip(range)
+            .filter_map(|((inp, out), i)| {
+                if inp.live() {
+                    Some((i, inp.data(), out))
+                } else {
+                    None
+                }
+            })
+    }
+
+    #[cfg(debug_assertions)]
+    pub(crate) fn assert_sorted(&self) {
+        assert!(self
+            .vals
+            .windows(2)
+            .all(|xs| xs[0].1.timestamp <= xs[1].1.timestamp))
+    }
+
+    /// Iterate over the live entries in the timestamp range, passing back their
+    /// offset into the table.
+    pub(crate) fn iter_timestamp_range(
+        &self,
+        range: &Range<u32>,
+    ) -> impl Iterator<Item = (usize, &[Value], &TupleOutput)> + '_ {
+        let indexes = self.transform_range(range);
+        self.iter_range(indexes)
+    }
+
+    /// Return the approximate number of entries in the table for the given
+    /// timestamp range.
+    pub(crate) fn approximate_range_size(&self, range: &Range<u32>) -> usize {
+        let indexes = self.transform_range(range);
+        indexes.end - indexes.start
+    }
+
+    /// Transform a range of timestamps to the corresponding range of indexes
+    /// into the table.
+    pub(crate) fn transform_range(&self, range: &Range<u32>) -> Range<usize> {
+        if let Some(start) = binary_search_table_by_key(self, range.start) {
+            if let Some(end) = binary_search_table_by_key(self, range.end) {
+                start..end
+            } else {
+                start..self.num_offsets()
+            }
+        } else {
+            0..0
+        }
+    }
+}
+
+pub(crate) fn hash_values(vs: &[Value]) -> u64 {
+    // Just hash the bits: all inputs to the same function should have matching
+    // column types.
+    let mut hasher = BH::default().build_hasher();
+    for v in vs {
+        v.bits.hash(&mut hasher);
+    }
+    hasher.finish()
+}
+
+#[derive(Debug, Clone, PartialEq, Eq)]
+pub(crate) struct Input {
+    pub(crate) data: ValueVec,
+    /// The timestamp at which the given input became "stale"
+    stale_at: u32,
+}
+
+impl Input {
+    fn new(data: ValueVec) -> Input {
+        Input {
+            data,
+            stale_at: u32::MAX,
+        }
+    }
+
+    fn data(&self) -> &[Value] {
+        self.data.as_slice()
+    }
+
+    pub(crate) fn live(&self) -> bool {
+        self.stale_at == u32::MAX
+    }
+}
+
\ No newline at end of file diff --git a/docs/src/egglog/gj.rs.html b/docs/src/egglog/gj.rs.html new file mode 100644 index 000000000..549093af1 --- /dev/null +++ b/docs/src/egglog/gj.rs.html @@ -0,0 +1,1897 @@ +gj.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+390
+391
+392
+393
+394
+395
+396
+397
+398
+399
+400
+401
+402
+403
+404
+405
+406
+407
+408
+409
+410
+411
+412
+413
+414
+415
+416
+417
+418
+419
+420
+421
+422
+423
+424
+425
+426
+427
+428
+429
+430
+431
+432
+433
+434
+435
+436
+437
+438
+439
+440
+441
+442
+443
+444
+445
+446
+447
+448
+449
+450
+451
+452
+453
+454
+455
+456
+457
+458
+459
+460
+461
+462
+463
+464
+465
+466
+467
+468
+469
+470
+471
+472
+473
+474
+475
+476
+477
+478
+479
+480
+481
+482
+483
+484
+485
+486
+487
+488
+489
+490
+491
+492
+493
+494
+495
+496
+497
+498
+499
+500
+501
+502
+503
+504
+505
+506
+507
+508
+509
+510
+511
+512
+513
+514
+515
+516
+517
+518
+519
+520
+521
+522
+523
+524
+525
+526
+527
+528
+529
+530
+531
+532
+533
+534
+535
+536
+537
+538
+539
+540
+541
+542
+543
+544
+545
+546
+547
+548
+549
+550
+551
+552
+553
+554
+555
+556
+557
+558
+559
+560
+561
+562
+563
+564
+565
+566
+567
+568
+569
+570
+571
+572
+573
+574
+575
+576
+577
+578
+579
+580
+581
+582
+583
+584
+585
+586
+587
+588
+589
+590
+591
+592
+593
+594
+595
+596
+597
+598
+599
+600
+601
+602
+603
+604
+605
+606
+607
+608
+609
+610
+611
+612
+613
+614
+615
+616
+617
+618
+619
+620
+621
+622
+623
+624
+625
+626
+627
+628
+629
+630
+631
+632
+633
+634
+635
+636
+637
+638
+639
+640
+641
+642
+643
+644
+645
+646
+647
+648
+649
+650
+651
+652
+653
+654
+655
+656
+657
+658
+659
+660
+661
+662
+663
+664
+665
+666
+667
+668
+669
+670
+671
+672
+673
+674
+675
+676
+677
+678
+679
+680
+681
+682
+683
+684
+685
+686
+687
+688
+689
+690
+691
+692
+693
+694
+695
+696
+697
+698
+699
+700
+701
+702
+703
+704
+705
+706
+707
+708
+709
+710
+711
+712
+713
+714
+715
+716
+717
+718
+719
+720
+721
+722
+723
+724
+725
+726
+727
+728
+729
+730
+731
+732
+733
+734
+735
+736
+737
+738
+739
+740
+741
+742
+743
+744
+745
+746
+747
+748
+749
+750
+751
+752
+753
+754
+755
+756
+757
+758
+759
+760
+761
+762
+763
+764
+765
+766
+767
+768
+769
+770
+771
+772
+773
+774
+775
+776
+777
+778
+779
+780
+781
+782
+783
+784
+785
+786
+787
+788
+789
+790
+791
+792
+793
+794
+795
+796
+797
+798
+799
+800
+801
+802
+803
+804
+805
+806
+807
+808
+809
+810
+811
+812
+813
+814
+815
+816
+817
+818
+819
+820
+821
+822
+823
+824
+825
+826
+827
+828
+829
+830
+831
+832
+833
+834
+835
+836
+837
+838
+839
+840
+841
+842
+843
+844
+845
+846
+847
+848
+849
+850
+851
+852
+853
+854
+855
+856
+857
+858
+859
+860
+861
+862
+863
+864
+865
+866
+867
+868
+869
+870
+871
+872
+873
+874
+875
+876
+877
+878
+879
+880
+881
+882
+883
+884
+885
+886
+887
+888
+889
+890
+891
+892
+893
+894
+895
+896
+897
+898
+899
+900
+901
+902
+903
+904
+905
+906
+907
+908
+909
+910
+911
+912
+913
+914
+915
+916
+917
+918
+919
+920
+921
+922
+923
+924
+925
+926
+927
+928
+929
+930
+931
+932
+933
+934
+935
+936
+937
+938
+939
+940
+941
+942
+943
+944
+945
+946
+947
+948
+
use hashbrown::hash_map::Entry as HEntry;
+use indexmap::map::Entry;
+use log::log_enabled;
+use smallvec::SmallVec;
+
+use crate::{
+    function::index::Offset,
+    typecheck::{Atom, AtomTerm, Query},
+    *,
+};
+use std::{
+    cell::UnsafeCell,
+    fmt::{self, Debug},
+    ops::Range,
+};
+
+#[derive(Clone)]
+enum Instr<'a> {
+    Intersect {
+        value_idx: usize,
+        variable_name: Symbol,
+        info: VarInfo2,
+        trie_accesses: Vec<(usize, TrieAccess<'a>)>,
+    },
+    ConstrainConstant {
+        index: usize,
+        val: Value,
+        trie_access: TrieAccess<'a>,
+    },
+    Call {
+        prim: Primitive,
+        args: Vec<AtomTerm>,
+        check: bool, // check or assign to output variable
+    },
+}
+
+// FIXME @mwillsey awful name, bad bad bad
+#[derive(Default, Debug, Clone)]
+struct VarInfo2 {
+    occurences: Vec<usize>,
+    intersected_on: usize,
+    size_guess: usize,
+}
+
+struct InputSizes<'a> {
+    cur_stage: usize,
+    // a map from from stage to vector of costs for each stage,
+    // where 'cost' is the largest relation being intersected
+    stage_sizes: &'a mut HashMap<usize, Vec<usize>>,
+}
+
+impl<'a> InputSizes<'a> {
+    fn add_measurement(&mut self, max_size: usize) {
+        self.stage_sizes
+            .entry(self.cur_stage)
+            .or_default()
+            .push(max_size);
+    }
+
+    fn next(&mut self) -> InputSizes {
+        InputSizes {
+            cur_stage: self.cur_stage + 1,
+            stage_sizes: self.stage_sizes,
+        }
+    }
+}
+
+type Result = std::result::Result<(), ()>;
+
+struct Program<'a>(Vec<Instr<'a>>);
+
+impl<'a> std::fmt::Display for Instr<'a> {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        match self {
+            Instr::Intersect {
+                value_idx,
+                trie_accesses,
+                variable_name,
+                info,
+            } => {
+                write!(
+                    f,
+                    " Intersect @ {value_idx} sg={sg:6} {variable_name:15}",
+                    sg = info.size_guess
+                )?;
+                for (trie_idx, a) in trie_accesses {
+                    write!(f, "  {}: {}", trie_idx, a)?;
+                }
+                writeln!(f)?
+            }
+            Instr::ConstrainConstant {
+                index,
+                val,
+                trie_access,
+            } => {
+                writeln!(f, " ConstrainConstant {index} {trie_access} = {val:?}")?;
+            }
+            Instr::Call { prim, args, check } => {
+                writeln!(f, " Call {:?} {:?} {:?}", prim, args, check)?;
+            }
+        }
+        Ok(())
+    }
+}
+
+impl<'a> std::fmt::Display for Program<'a> {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        for (i, instr) in self.0.iter().enumerate() {
+            write!(f, "{i:2}. {}", instr)?;
+        }
+        Ok(())
+    }
+}
+
+struct Context<'b> {
+    query: &'b CompiledQuery,
+    join_var_ordering: Vec<Symbol>,
+    tuple: Vec<Value>,
+    matches: usize,
+    egraph: &'b EGraph,
+}
+
+impl<'b> Context<'b> {
+    fn new(
+        egraph: &'b EGraph,
+        cq: &'b CompiledQuery,
+        timestamp_ranges: &[Range<u32>],
+    ) -> Option<(Self, Program<'b>, Vec<Option<usize>>)> {
+        let (program, join_var_ordering, intersections) =
+            egraph.compile_program(cq, timestamp_ranges)?;
+
+        let ctx = Context {
+            query: cq,
+            tuple: vec![Value::fake(); cq.vars.len()],
+            join_var_ordering,
+            matches: 0,
+            egraph,
+        };
+
+        Some((ctx, program, intersections))
+    }
+
+    fn eval<F>(
+        &mut self,
+        tries: &mut [&LazyTrie],
+        program: &[Instr],
+        mut stage: InputSizes,
+        f: &mut F,
+    ) -> Result
+    where
+        F: FnMut(&[Value]) -> Result,
+    {
+        let (instr, program) = match program.split_first() {
+            None => {
+                self.matches += 1;
+                return f(&self.tuple);
+            }
+            Some(pair) => pair,
+        };
+
+        match instr {
+            Instr::ConstrainConstant {
+                index,
+                val,
+                trie_access,
+            } => {
+                if let Some(next) = tries[*index].get(trie_access, *val) {
+                    let old = tries[*index];
+                    tries[*index] = next;
+                    self.eval(tries, program, stage.next(), f)?;
+                    tries[*index] = old;
+                }
+                Ok(())
+            }
+            Instr::Intersect {
+                value_idx,
+                trie_accesses,
+                ..
+            } => {
+                if let Some(x) = trie_accesses
+                    .iter()
+                    .map(|(atom, _)| tries[*atom].len())
+                    .max()
+                {
+                    stage.add_measurement(x);
+                }
+
+                match trie_accesses.as_slice() {
+                    [(j, access)] => tries[*j].for_each(access, |value, trie| {
+                        let old_trie = std::mem::replace(&mut tries[*j], trie);
+                        self.tuple[*value_idx] = value;
+                        self.eval(tries, program, stage.next(), f)?;
+                        tries[*j] = old_trie;
+                        Ok(())
+                    }),
+                    [a, b] => {
+                        let (a, b) = if tries[a.0].len() <= tries[b.0].len() {
+                            (a, b)
+                        } else {
+                            (b, a)
+                        };
+                        tries[a.0].for_each(&a.1, |value, ta| {
+                            if let Some(tb) = tries[b.0].get(&b.1, value) {
+                                let old_ta = std::mem::replace(&mut tries[a.0], ta);
+                                let old_tb = std::mem::replace(&mut tries[b.0], tb);
+                                self.tuple[*value_idx] = value;
+                                self.eval(tries, program, stage.next(), f)?;
+                                tries[a.0] = old_ta;
+                                tries[b.0] = old_tb;
+                            }
+                            Ok(())
+                        })
+                    }
+                    _ => {
+                        let (j_min, access_min) = trie_accesses
+                            .iter()
+                            .min_by_key(|(j, _a)| tries[*j].len())
+                            .unwrap();
+
+                        let mut new_tries = tries.to_vec();
+
+                        tries[*j_min].for_each(access_min, |value, min_trie| {
+                            new_tries[*j_min] = min_trie;
+                            for (j, access) in trie_accesses {
+                                if j != j_min {
+                                    if let Some(t) = tries[*j].get(access, value) {
+                                        new_tries[*j] = t;
+                                    } else {
+                                        return Ok(());
+                                    }
+                                }
+                            }
+
+                            // at this point, new_tries is ready to go
+                            self.tuple[*value_idx] = value;
+                            self.eval(&mut new_tries, program, stage.next(), f)
+                        })
+                    }
+                }
+            }
+            Instr::Call { prim, args, check } => {
+                let (out, args) = args.split_last().unwrap();
+                let mut values: Vec<Value> = vec![];
+                for arg in args {
+                    values.push(match arg {
+                        AtomTerm::Var(v) => {
+                            let i = self.query.vars.get_index_of(v).unwrap();
+                            self.tuple[i]
+                        }
+                        AtomTerm::Value(val) => *val,
+                        AtomTerm::Global(g) => self.egraph.global_bindings.get(g).unwrap().1,
+                    })
+                }
+
+                if let Some(res) = prim.apply(&values) {
+                    match out {
+                        AtomTerm::Var(v) => {
+                            let i = self.query.vars.get_index_of(v).unwrap();
+
+                            if *check {
+                                assert_ne!(self.tuple[i], Value::fake());
+                                if self.tuple[i] != res {
+                                    return Ok(());
+                                }
+                            }
+
+                            self.tuple[i] = res;
+                        }
+                        AtomTerm::Value(val) => {
+                            assert!(check);
+                            if val != &res {
+                                return Ok(());
+                            }
+                        }
+                        AtomTerm::Global(g) => {
+                            assert!(check);
+                            let (sort, val, _ts) = self.egraph.global_bindings.get(g).unwrap();
+                            assert!(sort.name() == res.tag);
+                            if val.bits != res.bits {
+                                return Ok(());
+                            }
+                        }
+                    }
+                    self.eval(tries, program, stage.next(), f)?;
+                }
+
+                Ok(())
+            }
+        }
+    }
+}
+
+#[derive(Clone)]
+enum Constraint {
+    Eq(usize, usize),
+    Const(usize, Value),
+}
+
+impl Constraint {
+    fn check(&self, tuple: &[Value], out: &TupleOutput) -> bool {
+        let get = |i: usize| {
+            if i < tuple.len() {
+                &tuple[i]
+            } else {
+                debug_assert_eq!(i, tuple.len());
+                &out.value
+            }
+        };
+        match self {
+            Constraint::Eq(i, j) => get(*i) == get(*j),
+            Constraint::Const(i, t) => get(*i) == t,
+        }
+    }
+}
+
+#[derive(Debug, Default, Clone)]
+pub struct VarInfo {
+    /// indexes into the `atoms` field of CompiledQuery
+    occurences: Vec<usize>,
+}
+
+#[derive(Debug, Clone)]
+pub struct CompiledQuery {
+    query: Query,
+    // Ordering is used for the tuple
+    // The GJ variable ordering is stored in the context
+    pub vars: IndexMap<Symbol, VarInfo>,
+}
+
+impl EGraph {
+    pub(crate) fn compile_gj_query(
+        &self,
+        query: Query,
+        types: &IndexMap<Symbol, ArcSort>,
+    ) -> CompiledQuery {
+        // NOTE: this vars order only used for ordering the tuple storing the resulting match
+        // It is not the GJ variable order.
+        let mut vars: IndexMap<Symbol, VarInfo> = Default::default();
+
+        for var in types.keys() {
+            vars.entry(*var).or_default();
+        }
+
+        for (i, atom) in query.atoms.iter().enumerate() {
+            for v in atom.vars() {
+                // only count grounded occurrences
+                vars.entry(v).or_default().occurences.push(i)
+            }
+        }
+
+        // make sure everyone has an entry in the vars table
+        for prim in &query.filters {
+            for v in prim.vars() {
+                vars.entry(v).or_default();
+            }
+        }
+
+        CompiledQuery { query, vars }
+    }
+
+    fn make_trie_access_for_column(
+        &self,
+        atom: &Atom<Symbol>,
+        column: usize,
+        timestamp_range: Range<u32>,
+    ) -> TrieAccess {
+        let function = &self.functions[&atom.head];
+
+        let mut constraints = vec![];
+        for (i, t) in atom.args.iter().enumerate() {
+            match t {
+                AtomTerm::Value(val) => constraints.push(Constraint::Const(i, *val)),
+                AtomTerm::Global(g) => {
+                    constraints.push(Constraint::Const(i, self.global_bindings.get(g).unwrap().1))
+                }
+                AtomTerm::Var(_v) => {
+                    if let Some(j) = atom.args[..i].iter().position(|t2| t == t2) {
+                        constraints.push(Constraint::Eq(j, i));
+                    }
+                }
+            }
+        }
+
+        TrieAccess {
+            function,
+            timestamp_range,
+            column,
+            constraints,
+        }
+    }
+
+    fn make_trie_access(
+        &self,
+        var: Symbol,
+        atom: &Atom<Symbol>,
+        timestamp_range: Range<u32>,
+    ) -> TrieAccess {
+        let column = atom
+            .args
+            .iter()
+            .position(|arg| arg == &AtomTerm::Var(var))
+            .unwrap();
+        self.make_trie_access_for_column(atom, column, timestamp_range)
+    }
+
+    fn compile_program(
+        &self,
+        query: &CompiledQuery,
+        timestamp_ranges: &[Range<u32>],
+    ) -> Option<(
+        Program,
+        Vec<Symbol>,        /* variable ordering */
+        Vec<Option<usize>>, /* the first column accessed per-atom */
+    )> {
+        let atoms = &query.query.atoms;
+        let mut vars: IndexMap<Symbol, VarInfo2> = Default::default();
+        let mut constants =
+            IndexMap::<usize /* atom */, Vec<(usize /* column */, Value)>>::default();
+
+        for (i, atom) in atoms.iter().enumerate() {
+            for (col, arg) in atom.args.iter().enumerate() {
+                match arg {
+                    AtomTerm::Var(var) => vars.entry(*var).or_default().occurences.push(i),
+                    AtomTerm::Value(val) => {
+                        constants.entry(i).or_default().push((col, *val));
+                    }
+                    AtomTerm::Global(g) => {
+                        let val = self.global_bindings.get(g).unwrap().1;
+                        constants.entry(i).or_default().push((col, val));
+                    }
+                }
+            }
+        }
+
+        for info in vars.values_mut() {
+            info.occurences.sort_unstable();
+            info.occurences.dedup();
+        }
+
+        let relation_sizes: Vec<usize> = atoms
+            .iter()
+            .zip(timestamp_ranges)
+            .map(|(atom, range)| self.functions[&atom.head].get_size(range))
+            .collect();
+
+        if relation_sizes.iter().any(|&s| s == 0) {
+            return None;
+        }
+
+        for (_v, info) in &mut vars {
+            assert!(!info.occurences.is_empty());
+            info.size_guess = info
+                .occurences
+                .iter()
+                .map(|&i| relation_sizes[i])
+                .min()
+                .unwrap();
+            // info.size_guess >>= info.occurences.len() - 1;
+        }
+
+        // here we are picking the variable ordering
+        let mut ordered_vars = IndexMap::default();
+        while !vars.is_empty() {
+            let mut var_cost = vars
+                .iter()
+                .map(|(v, info)| {
+                    let size = info.size_guess as isize;
+                    let cost = (info.occurences.len(), info.intersected_on, -size);
+                    (cost, v)
+                })
+                .collect::<Vec<_>>();
+            var_cost.sort();
+            var_cost.reverse();
+
+            log::debug!("Variable costs: {:?}", ListDebug(&var_cost, "\n"));
+
+            let var = *var_cost[0].1;
+            let info = vars.remove(&var).unwrap();
+            for &i in &info.occurences {
+                for v in atoms[i].vars() {
+                    if let Some(info) = vars.get_mut(&v) {
+                        info.intersected_on += 1;
+                    }
+                }
+            }
+
+            ordered_vars.insert(var, info);
+        }
+        vars = ordered_vars;
+
+        let mut initial_columns = vec![None; atoms.len()];
+        let const_instrs = constants.iter().flat_map(|(atom, consts)| {
+            let initial_col = &mut initial_columns[*atom];
+            if initial_col.is_none() {
+                *initial_col = Some(consts[0].0);
+            }
+            consts.iter().map(|(col, val)| {
+                let range = timestamp_ranges[*atom].clone();
+                let trie_access = self.make_trie_access_for_column(&atoms[*atom], *col, range);
+
+                Instr::ConstrainConstant {
+                    index: *atom,
+                    val: *val,
+                    trie_access,
+                }
+            })
+        });
+        let mut program: Vec<Instr> = const_instrs.collect();
+
+        let var_instrs = vars.iter().map(|(&v, info)| {
+            let value_idx = query.vars.get_index_of(&v).unwrap_or_else(|| {
+                panic!("variable {} not found in query", v);
+            });
+            Instr::Intersect {
+                value_idx,
+                variable_name: v,
+                info: info.clone(),
+                trie_accesses: info
+                    .occurences
+                    .iter()
+                    .map(|&atom_idx| {
+                        let atom = &atoms[atom_idx];
+                        let range = timestamp_ranges[atom_idx].clone();
+                        let access = self.make_trie_access(v, atom, range);
+                        let initial_col = &mut initial_columns[atom_idx];
+                        if initial_col.is_none() {
+                            *initial_col = Some(access.column);
+                        }
+                        (atom_idx, access)
+                    })
+                    .collect(),
+            }
+        });
+        program.extend(var_instrs);
+
+        // now we can try to add primitives
+        let mut extra = query.query.filters.clone();
+        while !extra.is_empty() {
+            let next = extra.iter().position(|p| {
+                assert!(!p.args.is_empty());
+                p.args[..p.args.len() - 1].iter().all(|a| match a {
+                    AtomTerm::Var(v) => vars.contains_key(v),
+                    AtomTerm::Value(_) => true,
+                    AtomTerm::Global(_) => true,
+                })
+            });
+
+            if let Some(i) = next {
+                let p = extra.remove(i);
+                let check = match p.args.last().unwrap() {
+                    AtomTerm::Var(v) => match vars.entry(*v) {
+                        Entry::Occupied(_) => true,
+                        Entry::Vacant(e) => {
+                            e.insert(Default::default());
+                            false
+                        }
+                    },
+                    AtomTerm::Value(_) => true,
+                    AtomTerm::Global(_) => true,
+                };
+                program.push(Instr::Call {
+                    prim: p.head.clone(),
+                    args: p.args.clone(),
+                    check,
+                });
+            } else {
+                panic!("cycle {:#?}", query)
+            }
+        }
+
+        let resulting_program = Program(program);
+        self.sanity_check_program(&resulting_program, query);
+
+        Some((
+            resulting_program,
+            vars.into_keys().collect(),
+            initial_columns,
+        ))
+    }
+
+    fn sanity_check_program(&self, program: &Program, query: &CompiledQuery) {
+        // sanity check the program
+        let mut tuple_valid = vec![false; query.vars.len()];
+        for instr in &program.0 {
+            match instr {
+                Instr::Intersect { value_idx, .. } => {
+                    assert!(!tuple_valid[*value_idx]);
+                    tuple_valid[*value_idx] = true;
+                }
+                Instr::ConstrainConstant { .. } => {}
+                Instr::Call { check, args, .. } => {
+                    let Some((last, args)) = args.split_last() else {
+                        continue
+                    };
+
+                    for a in args {
+                        if let AtomTerm::Var(v) = a {
+                            let i = query.vars.get_index_of(v).unwrap();
+                            assert!(tuple_valid[i]);
+                        }
+                    }
+
+                    match last {
+                        AtomTerm::Var(v) => {
+                            let i = query.vars.get_index_of(v).unwrap();
+                            assert_eq!(*check, tuple_valid[i], "{instr}");
+                            if !*check {
+                                tuple_valid[i] = true;
+                            }
+                        }
+                        AtomTerm::Value(_) => {
+                            assert!(*check);
+                        }
+                        AtomTerm::Global(_) => {
+                            assert!(*check);
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    pub(crate) fn run_query<F>(&self, cq: &CompiledQuery, timestamp: u32, mut f: F)
+    where
+        F: FnMut(&[Value]) -> Result,
+    {
+        let has_atoms = !cq.query.atoms.is_empty();
+
+        if has_atoms {
+            // check if any globals updated
+            let mut global_updated = false;
+            for atom in &cq.query.atoms {
+                for arg in &atom.args {
+                    if let AtomTerm::Global(g) = arg {
+                        if self.global_bindings.get(g).unwrap().2 > timestamp {
+                            global_updated = true;
+                        }
+                    }
+                }
+            }
+
+            let do_seminaive = self.seminaive && !global_updated;
+            // for the later atoms, we consider everything
+            let mut timestamp_ranges = vec![0..u32::MAX; cq.query.atoms.len()];
+            for (atom_i, atom) in cq.query.atoms.iter().enumerate() {
+                // this time, we only consider "new stuff" for this atom
+                if do_seminaive {
+                    timestamp_ranges[atom_i] = timestamp..u32::MAX;
+                }
+
+                // do the gj
+
+                if let Some((mut ctx, program, cols)) = Context::new(self, cq, &timestamp_ranges) {
+                    let start = Instant::now();
+                    log::debug!(
+                        "Query:\n{q}\nNew atom: {atom}\nTuple: {tuple}\nJoin order: {order}\nProgram\n{program}",
+                        q = cq.query,
+                        order = ListDisplay(&ctx.join_var_ordering, " "),
+                        tuple = ListDisplay(cq.vars.keys(), " "),
+                    );
+                    let mut tries = Vec::with_capacity(cq.query.atoms.len());
+                    for ((atom, ts), col) in cq
+                        .query
+                        .atoms
+                        .iter()
+                        .zip(timestamp_ranges.iter())
+                        .zip(cols.iter())
+                    {
+                        // tries.push(LazyTrie::default());
+                        if let Some(target) = col {
+                            if let Some(col) = self.functions[&atom.head].column_index(*target, ts)
+                            {
+                                tries.push(LazyTrie::from_column_index(col))
+                            } else {
+                                tries.push(LazyTrie::default());
+                            }
+                        } else {
+                            tries.push(LazyTrie::default());
+                        }
+                    }
+                    let mut trie_refs = tries.iter().collect::<Vec<_>>();
+                    let mut meausrements = HashMap::<usize, Vec<usize>>::default();
+                    let stages = InputSizes {
+                        stage_sizes: &mut meausrements,
+                        cur_stage: 0,
+                    };
+                    ctx.eval(&mut trie_refs, &program.0, stages, &mut f)
+                        .unwrap_or(());
+                    let mut sums = Vec::from_iter(
+                        meausrements
+                            .iter()
+                            .map(|(x, y)| (*x, y.iter().copied().sum::<usize>())),
+                    );
+                    sums.sort_by_key(|(i, _sum)| *i);
+                    if log_enabled!(log::Level::Debug) {
+                        for (i, sum) in sums {
+                            log::debug!("stage {i} total cost {sum}");
+                        }
+                    }
+                    let duration = start.elapsed();
+                    log::debug!("Matched {} times (took {:?})", ctx.matches, duration,);
+                    let iteration = self
+                        .ruleset_iteration
+                        .get::<Symbol>(&"".into())
+                        .unwrap_or(&0);
+                    if duration.as_millis() > 1000 {
+                        log::warn!(
+                            "Query took a long time at iter {iteration} : {:?}",
+                            duration
+                        );
+                    }
+                }
+
+                if !do_seminaive {
+                    break;
+                }
+
+                // now we can fix this atom to be "old stuff" only
+                // range is half-open; timestamp is excluded
+                timestamp_ranges[atom_i] = 0..timestamp;
+            }
+        } else if let Some((mut ctx, program, _)) = Context::new(self, cq, &[]) {
+            let mut meausrements = HashMap::<usize, Vec<usize>>::default();
+            let stages = InputSizes {
+                stage_sizes: &mut meausrements,
+                cur_stage: 0,
+            };
+            let tries = LazyTrie::make_initial_vec(cq.query.atoms.len());
+            let mut trie_refs = tries.iter().collect::<Vec<_>>();
+            ctx.eval(&mut trie_refs, &program.0, stages, &mut f)
+                .unwrap_or(());
+        }
+    }
+}
+
+struct LazyTrie(UnsafeCell<LazyTrieInner>);
+
+impl Debug for LazyTrie {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        Debug::fmt(unsafe { &*self.0.get() }, f)
+    }
+}
+
+type SparseMap = HashMap<Value, LazyTrie>;
+type RowIdx = u32;
+
+#[derive(Debug)]
+enum LazyTrieInner {
+    Borrowed {
+        index: Rc<ColumnIndex>,
+        map: SparseMap,
+    },
+    Delayed(SmallVec<[RowIdx; 4]>),
+    Sparse(SparseMap),
+}
+
+impl Default for LazyTrie {
+    fn default() -> Self {
+        LazyTrie(UnsafeCell::new(LazyTrieInner::Delayed(Default::default())))
+    }
+}
+
+impl LazyTrie {
+    fn make_initial_vec(n: usize) -> Vec<Self> {
+        (0..n).map(|_| LazyTrie::default()).collect()
+    }
+
+    fn len(&self) -> usize {
+        match unsafe { &*self.0.get() } {
+            LazyTrieInner::Delayed(v) => v.len(),
+            LazyTrieInner::Sparse(m) => m.len(),
+            LazyTrieInner::Borrowed { index, .. } => index.len(),
+        }
+    }
+    fn from_column_index(index: Rc<ColumnIndex>) -> LazyTrie {
+        LazyTrie(UnsafeCell::new(LazyTrieInner::Borrowed {
+            index,
+            map: Default::default(),
+        }))
+    }
+    fn from_indexes(ixs: impl Iterator<Item = usize>) -> Option<LazyTrie> {
+        let data = SmallVec::from_iter(ixs.map(|x| x as RowIdx));
+        if data.is_empty() {
+            return None;
+        }
+
+        Some(LazyTrie(UnsafeCell::new(LazyTrieInner::Delayed(data))))
+    }
+
+    unsafe fn force_mut(&self, access: &TrieAccess) -> *mut LazyTrieInner {
+        let this = &mut *self.0.get();
+        if let LazyTrieInner::Delayed(idxs) = this {
+            *this = access.make_trie_inner(idxs);
+        }
+        self.0.get()
+    }
+
+    fn force_borrowed(&self, access: &TrieAccess) -> &LazyTrieInner {
+        let this = unsafe { &mut *self.0.get() };
+        match this {
+            LazyTrieInner::Borrowed { index, .. } => {
+                let mut map = SparseMap::with_capacity_and_hasher(index.len(), Default::default());
+                map.extend(index.iter().filter_map(|(v, ixs)| {
+                    LazyTrie::from_indexes(access.filter_live(ixs)).map(|trie| (v, trie))
+                }));
+                *this = LazyTrieInner::Sparse(map);
+            }
+            LazyTrieInner::Delayed(idxs) => {
+                *this = access.make_trie_inner(idxs);
+            }
+            LazyTrieInner::Sparse(_) => {}
+        }
+        unsafe { &*self.0.get() }
+    }
+
+    fn for_each<'a>(
+        &'a self,
+        access: &TrieAccess,
+        mut f: impl FnMut(Value, &'a LazyTrie) -> Result,
+    ) -> Result {
+        // There is probably something cleaner to do here compared with the
+        // `force_borrowed` construct.
+        match self.force_borrowed(access) {
+            LazyTrieInner::Sparse(m) => {
+                for (k, v) in m {
+                    f(*k, v)?;
+                }
+                Ok(())
+            }
+            LazyTrieInner::Borrowed { .. } | LazyTrieInner::Delayed(_) => unreachable!(),
+        }
+    }
+
+    fn get(&self, access: &TrieAccess, value: Value) -> Option<&LazyTrie> {
+        match unsafe { &mut *self.force_mut(access) } {
+            LazyTrieInner::Sparse(m) => m.get(&value),
+            LazyTrieInner::Borrowed { index, map } => {
+                let ixs = index.get(&value)?;
+                match map.entry(value) {
+                    HEntry::Occupied(o) => Some(o.into_mut()),
+                    HEntry::Vacant(v) => {
+                        Some(v.insert(LazyTrie::from_indexes(access.filter_live(ixs))?))
+                    }
+                }
+            }
+            LazyTrieInner::Delayed(_) => unreachable!(),
+        }
+    }
+}
+
+#[derive(Clone)]
+struct TrieAccess<'a> {
+    function: &'a Function,
+    timestamp_range: Range<u32>,
+    column: usize,
+    constraints: Vec<Constraint>,
+}
+
+impl<'a> std::fmt::Display for TrieAccess<'a> {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(f, "{}.{}", self.function.decl.name, self.column)
+    }
+}
+
+impl<'a> TrieAccess<'a> {
+    fn filter_live<'b: 'a>(&'b self, ixs: &'b [Offset]) -> impl Iterator<Item = usize> + 'a {
+        ixs.iter().copied().filter_map(|ix| {
+            let ix = ix as usize;
+            let (inp, out) = self.function.nodes.get_index(ix)?;
+            if self.timestamp_range.contains(&out.timestamp)
+                && self.constraints.iter().all(|c| c.check(inp, out))
+            {
+                Some(ix)
+            } else {
+                None
+            }
+        })
+    }
+
+    #[cold]
+    fn make_trie_inner(&self, idxs: &[RowIdx]) -> LazyTrieInner {
+        let arity = self.function.schema.input.len();
+        let mut map = SparseMap::default();
+        let mut insert = |i: usize, tup: &[Value], out: &TupleOutput, val: Value| {
+            use hashbrown::hash_map::Entry;
+            if self.timestamp_range.contains(&out.timestamp)
+                && self.constraints.iter().all(|c| c.check(tup, out))
+            {
+                match map.entry(val) {
+                    Entry::Occupied(mut e) => {
+                        if let LazyTrieInner::Delayed(ref mut v) = e.get_mut().0.get_mut() {
+                            v.push(i as RowIdx)
+                        } else {
+                            unreachable!()
+                        }
+                    }
+                    Entry::Vacant(e) => {
+                        e.insert(LazyTrie(UnsafeCell::new(LazyTrieInner::Delayed(
+                            smallvec::smallvec![i as RowIdx,],
+                        ))));
+                    }
+                }
+            }
+        };
+
+        if idxs.is_empty() {
+            if self.column < arity {
+                for (i, tup, out) in self.function.iter_timestamp_range(&self.timestamp_range) {
+                    insert(i, tup, out, tup[self.column])
+                }
+            } else {
+                assert_eq!(self.column, arity);
+                for (i, tup, out) in self.function.iter_timestamp_range(&self.timestamp_range) {
+                    insert(i, tup, out, out.value);
+                }
+            };
+        } else if self.column < arity {
+            for idx in idxs {
+                let i = *idx as usize;
+                if let Some((tup, out)) = self.function.nodes.get_index(i) {
+                    insert(i, tup, out, tup[self.column])
+                }
+            }
+        } else {
+            assert_eq!(self.column, arity);
+            for idx in idxs {
+                let i = *idx as usize;
+                if let Some((tup, out)) = self.function.nodes.get_index(i) {
+                    insert(i, tup, out, out.value)
+                }
+            }
+        }
+
+        // // Density test
+        // if !map.is_empty() {
+        //     let min = map.keys().map(|v| v.bits).min().unwrap();
+        //     let max = map.keys().map(|v| v.bits).max().unwrap();
+        //     let len = map.len();
+        //     if max - min <= len as u64 * 2 {
+        //         println!("Trie is dense with len {len}!");
+        //     } else {
+        //         println!("Trie is not dense with len {len}!");
+        //     }
+        // }
+
+        LazyTrieInner::Sparse(map)
+    }
+}
+
\ No newline at end of file diff --git a/docs/src/egglog/home/runner/work/egglog/egglog/target/debug/build/egglog-063606befe46f23f/out/ast/parse.rs.html b/docs/src/egglog/home/runner/work/egglog/egglog/target/debug/build/egglog-063606befe46f23f/out/ast/parse.rs.html new file mode 100644 index 000000000..1395d215c --- /dev/null +++ b/docs/src/egglog/home/runner/work/egglog/egglog/target/debug/build/egglog-063606befe46f23f/out/ast/parse.rs.html @@ -0,0 +1,73601 @@ +parse.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+390
+391
+392
+393
+394
+395
+396
+397
+398
+399
+400
+401
+402
+403
+404
+405
+406
+407
+408
+409
+410
+411
+412
+413
+414
+415
+416
+417
+418
+419
+420
+421
+422
+423
+424
+425
+426
+427
+428
+429
+430
+431
+432
+433
+434
+435
+436
+437
+438
+439
+440
+441
+442
+443
+444
+445
+446
+447
+448
+449
+450
+451
+452
+453
+454
+455
+456
+457
+458
+459
+460
+461
+462
+463
+464
+465
+466
+467
+468
+469
+470
+471
+472
+473
+474
+475
+476
+477
+478
+479
+480
+481
+482
+483
+484
+485
+486
+487
+488
+489
+490
+491
+492
+493
+494
+495
+496
+497
+498
+499
+500
+501
+502
+503
+504
+505
+506
+507
+508
+509
+510
+511
+512
+513
+514
+515
+516
+517
+518
+519
+520
+521
+522
+523
+524
+525
+526
+527
+528
+529
+530
+531
+532
+533
+534
+535
+536
+537
+538
+539
+540
+541
+542
+543
+544
+545
+546
+547
+548
+549
+550
+551
+552
+553
+554
+555
+556
+557
+558
+559
+560
+561
+562
+563
+564
+565
+566
+567
+568
+569
+570
+571
+572
+573
+574
+575
+576
+577
+578
+579
+580
+581
+582
+583
+584
+585
+586
+587
+588
+589
+590
+591
+592
+593
+594
+595
+596
+597
+598
+599
+600
+601
+602
+603
+604
+605
+606
+607
+608
+609
+610
+611
+612
+613
+614
+615
+616
+617
+618
+619
+620
+621
+622
+623
+624
+625
+626
+627
+628
+629
+630
+631
+632
+633
+634
+635
+636
+637
+638
+639
+640
+641
+642
+643
+644
+645
+646
+647
+648
+649
+650
+651
+652
+653
+654
+655
+656
+657
+658
+659
+660
+661
+662
+663
+664
+665
+666
+667
+668
+669
+670
+671
+672
+673
+674
+675
+676
+677
+678
+679
+680
+681
+682
+683
+684
+685
+686
+687
+688
+689
+690
+691
+692
+693
+694
+695
+696
+697
+698
+699
+700
+701
+702
+703
+704
+705
+706
+707
+708
+709
+710
+711
+712
+713
+714
+715
+716
+717
+718
+719
+720
+721
+722
+723
+724
+725
+726
+727
+728
+729
+730
+731
+732
+733
+734
+735
+736
+737
+738
+739
+740
+741
+742
+743
+744
+745
+746
+747
+748
+749
+750
+751
+752
+753
+754
+755
+756
+757
+758
+759
+760
+761
+762
+763
+764
+765
+766
+767
+768
+769
+770
+771
+772
+773
+774
+775
+776
+777
+778
+779
+780
+781
+782
+783
+784
+785
+786
+787
+788
+789
+790
+791
+792
+793
+794
+795
+796
+797
+798
+799
+800
+801
+802
+803
+804
+805
+806
+807
+808
+809
+810
+811
+812
+813
+814
+815
+816
+817
+818
+819
+820
+821
+822
+823
+824
+825
+826
+827
+828
+829
+830
+831
+832
+833
+834
+835
+836
+837
+838
+839
+840
+841
+842
+843
+844
+845
+846
+847
+848
+849
+850
+851
+852
+853
+854
+855
+856
+857
+858
+859
+860
+861
+862
+863
+864
+865
+866
+867
+868
+869
+870
+871
+872
+873
+874
+875
+876
+877
+878
+879
+880
+881
+882
+883
+884
+885
+886
+887
+888
+889
+890
+891
+892
+893
+894
+895
+896
+897
+898
+899
+900
+901
+902
+903
+904
+905
+906
+907
+908
+909
+910
+911
+912
+913
+914
+915
+916
+917
+918
+919
+920
+921
+922
+923
+924
+925
+926
+927
+928
+929
+930
+931
+932
+933
+934
+935
+936
+937
+938
+939
+940
+941
+942
+943
+944
+945
+946
+947
+948
+949
+950
+951
+952
+953
+954
+955
+956
+957
+958
+959
+960
+961
+962
+963
+964
+965
+966
+967
+968
+969
+970
+971
+972
+973
+974
+975
+976
+977
+978
+979
+980
+981
+982
+983
+984
+985
+986
+987
+988
+989
+990
+991
+992
+993
+994
+995
+996
+997
+998
+999
+1000
+1001
+1002
+1003
+1004
+1005
+1006
+1007
+1008
+1009
+1010
+1011
+1012
+1013
+1014
+1015
+1016
+1017
+1018
+1019
+1020
+1021
+1022
+1023
+1024
+1025
+1026
+1027
+1028
+1029
+1030
+1031
+1032
+1033
+1034
+1035
+1036
+1037
+1038
+1039
+1040
+1041
+1042
+1043
+1044
+1045
+1046
+1047
+1048
+1049
+1050
+1051
+1052
+1053
+1054
+1055
+1056
+1057
+1058
+1059
+1060
+1061
+1062
+1063
+1064
+1065
+1066
+1067
+1068
+1069
+1070
+1071
+1072
+1073
+1074
+1075
+1076
+1077
+1078
+1079
+1080
+1081
+1082
+1083
+1084
+1085
+1086
+1087
+1088
+1089
+1090
+1091
+1092
+1093
+1094
+1095
+1096
+1097
+1098
+1099
+1100
+1101
+1102
+1103
+1104
+1105
+1106
+1107
+1108
+1109
+1110
+1111
+1112
+1113
+1114
+1115
+1116
+1117
+1118
+1119
+1120
+1121
+1122
+1123
+1124
+1125
+1126
+1127
+1128
+1129
+1130
+1131
+1132
+1133
+1134
+1135
+1136
+1137
+1138
+1139
+1140
+1141
+1142
+1143
+1144
+1145
+1146
+1147
+1148
+1149
+1150
+1151
+1152
+1153
+1154
+1155
+1156
+1157
+1158
+1159
+1160
+1161
+1162
+1163
+1164
+1165
+1166
+1167
+1168
+1169
+1170
+1171
+1172
+1173
+1174
+1175
+1176
+1177
+1178
+1179
+1180
+1181
+1182
+1183
+1184
+1185
+1186
+1187
+1188
+1189
+1190
+1191
+1192
+1193
+1194
+1195
+1196
+1197
+1198
+1199
+1200
+1201
+1202
+1203
+1204
+1205
+1206
+1207
+1208
+1209
+1210
+1211
+1212
+1213
+1214
+1215
+1216
+1217
+1218
+1219
+1220
+1221
+1222
+1223
+1224
+1225
+1226
+1227
+1228
+1229
+1230
+1231
+1232
+1233
+1234
+1235
+1236
+1237
+1238
+1239
+1240
+1241
+1242
+1243
+1244
+1245
+1246
+1247
+1248
+1249
+1250
+1251
+1252
+1253
+1254
+1255
+1256
+1257
+1258
+1259
+1260
+1261
+1262
+1263
+1264
+1265
+1266
+1267
+1268
+1269
+1270
+1271
+1272
+1273
+1274
+1275
+1276
+1277
+1278
+1279
+1280
+1281
+1282
+1283
+1284
+1285
+1286
+1287
+1288
+1289
+1290
+1291
+1292
+1293
+1294
+1295
+1296
+1297
+1298
+1299
+1300
+1301
+1302
+1303
+1304
+1305
+1306
+1307
+1308
+1309
+1310
+1311
+1312
+1313
+1314
+1315
+1316
+1317
+1318
+1319
+1320
+1321
+1322
+1323
+1324
+1325
+1326
+1327
+1328
+1329
+1330
+1331
+1332
+1333
+1334
+1335
+1336
+1337
+1338
+1339
+1340
+1341
+1342
+1343
+1344
+1345
+1346
+1347
+1348
+1349
+1350
+1351
+1352
+1353
+1354
+1355
+1356
+1357
+1358
+1359
+1360
+1361
+1362
+1363
+1364
+1365
+1366
+1367
+1368
+1369
+1370
+1371
+1372
+1373
+1374
+1375
+1376
+1377
+1378
+1379
+1380
+1381
+1382
+1383
+1384
+1385
+1386
+1387
+1388
+1389
+1390
+1391
+1392
+1393
+1394
+1395
+1396
+1397
+1398
+1399
+1400
+1401
+1402
+1403
+1404
+1405
+1406
+1407
+1408
+1409
+1410
+1411
+1412
+1413
+1414
+1415
+1416
+1417
+1418
+1419
+1420
+1421
+1422
+1423
+1424
+1425
+1426
+1427
+1428
+1429
+1430
+1431
+1432
+1433
+1434
+1435
+1436
+1437
+1438
+1439
+1440
+1441
+1442
+1443
+1444
+1445
+1446
+1447
+1448
+1449
+1450
+1451
+1452
+1453
+1454
+1455
+1456
+1457
+1458
+1459
+1460
+1461
+1462
+1463
+1464
+1465
+1466
+1467
+1468
+1469
+1470
+1471
+1472
+1473
+1474
+1475
+1476
+1477
+1478
+1479
+1480
+1481
+1482
+1483
+1484
+1485
+1486
+1487
+1488
+1489
+1490
+1491
+1492
+1493
+1494
+1495
+1496
+1497
+1498
+1499
+1500
+1501
+1502
+1503
+1504
+1505
+1506
+1507
+1508
+1509
+1510
+1511
+1512
+1513
+1514
+1515
+1516
+1517
+1518
+1519
+1520
+1521
+1522
+1523
+1524
+1525
+1526
+1527
+1528
+1529
+1530
+1531
+1532
+1533
+1534
+1535
+1536
+1537
+1538
+1539
+1540
+1541
+1542
+1543
+1544
+1545
+1546
+1547
+1548
+1549
+1550
+1551
+1552
+1553
+1554
+1555
+1556
+1557
+1558
+1559
+1560
+1561
+1562
+1563
+1564
+1565
+1566
+1567
+1568
+1569
+1570
+1571
+1572
+1573
+1574
+1575
+1576
+1577
+1578
+1579
+1580
+1581
+1582
+1583
+1584
+1585
+1586
+1587
+1588
+1589
+1590
+1591
+1592
+1593
+1594
+1595
+1596
+1597
+1598
+1599
+1600
+1601
+1602
+1603
+1604
+1605
+1606
+1607
+1608
+1609
+1610
+1611
+1612
+1613
+1614
+1615
+1616
+1617
+1618
+1619
+1620
+1621
+1622
+1623
+1624
+1625
+1626
+1627
+1628
+1629
+1630
+1631
+1632
+1633
+1634
+1635
+1636
+1637
+1638
+1639
+1640
+1641
+1642
+1643
+1644
+1645
+1646
+1647
+1648
+1649
+1650
+1651
+1652
+1653
+1654
+1655
+1656
+1657
+1658
+1659
+1660
+1661
+1662
+1663
+1664
+1665
+1666
+1667
+1668
+1669
+1670
+1671
+1672
+1673
+1674
+1675
+1676
+1677
+1678
+1679
+1680
+1681
+1682
+1683
+1684
+1685
+1686
+1687
+1688
+1689
+1690
+1691
+1692
+1693
+1694
+1695
+1696
+1697
+1698
+1699
+1700
+1701
+1702
+1703
+1704
+1705
+1706
+1707
+1708
+1709
+1710
+1711
+1712
+1713
+1714
+1715
+1716
+1717
+1718
+1719
+1720
+1721
+1722
+1723
+1724
+1725
+1726
+1727
+1728
+1729
+1730
+1731
+1732
+1733
+1734
+1735
+1736
+1737
+1738
+1739
+1740
+1741
+1742
+1743
+1744
+1745
+1746
+1747
+1748
+1749
+1750
+1751
+1752
+1753
+1754
+1755
+1756
+1757
+1758
+1759
+1760
+1761
+1762
+1763
+1764
+1765
+1766
+1767
+1768
+1769
+1770
+1771
+1772
+1773
+1774
+1775
+1776
+1777
+1778
+1779
+1780
+1781
+1782
+1783
+1784
+1785
+1786
+1787
+1788
+1789
+1790
+1791
+1792
+1793
+1794
+1795
+1796
+1797
+1798
+1799
+1800
+1801
+1802
+1803
+1804
+1805
+1806
+1807
+1808
+1809
+1810
+1811
+1812
+1813
+1814
+1815
+1816
+1817
+1818
+1819
+1820
+1821
+1822
+1823
+1824
+1825
+1826
+1827
+1828
+1829
+1830
+1831
+1832
+1833
+1834
+1835
+1836
+1837
+1838
+1839
+1840
+1841
+1842
+1843
+1844
+1845
+1846
+1847
+1848
+1849
+1850
+1851
+1852
+1853
+1854
+1855
+1856
+1857
+1858
+1859
+1860
+1861
+1862
+1863
+1864
+1865
+1866
+1867
+1868
+1869
+1870
+1871
+1872
+1873
+1874
+1875
+1876
+1877
+1878
+1879
+1880
+1881
+1882
+1883
+1884
+1885
+1886
+1887
+1888
+1889
+1890
+1891
+1892
+1893
+1894
+1895
+1896
+1897
+1898
+1899
+1900
+1901
+1902
+1903
+1904
+1905
+1906
+1907
+1908
+1909
+1910
+1911
+1912
+1913
+1914
+1915
+1916
+1917
+1918
+1919
+1920
+1921
+1922
+1923
+1924
+1925
+1926
+1927
+1928
+1929
+1930
+1931
+1932
+1933
+1934
+1935
+1936
+1937
+1938
+1939
+1940
+1941
+1942
+1943
+1944
+1945
+1946
+1947
+1948
+1949
+1950
+1951
+1952
+1953
+1954
+1955
+1956
+1957
+1958
+1959
+1960
+1961
+1962
+1963
+1964
+1965
+1966
+1967
+1968
+1969
+1970
+1971
+1972
+1973
+1974
+1975
+1976
+1977
+1978
+1979
+1980
+1981
+1982
+1983
+1984
+1985
+1986
+1987
+1988
+1989
+1990
+1991
+1992
+1993
+1994
+1995
+1996
+1997
+1998
+1999
+2000
+2001
+2002
+2003
+2004
+2005
+2006
+2007
+2008
+2009
+2010
+2011
+2012
+2013
+2014
+2015
+2016
+2017
+2018
+2019
+2020
+2021
+2022
+2023
+2024
+2025
+2026
+2027
+2028
+2029
+2030
+2031
+2032
+2033
+2034
+2035
+2036
+2037
+2038
+2039
+2040
+2041
+2042
+2043
+2044
+2045
+2046
+2047
+2048
+2049
+2050
+2051
+2052
+2053
+2054
+2055
+2056
+2057
+2058
+2059
+2060
+2061
+2062
+2063
+2064
+2065
+2066
+2067
+2068
+2069
+2070
+2071
+2072
+2073
+2074
+2075
+2076
+2077
+2078
+2079
+2080
+2081
+2082
+2083
+2084
+2085
+2086
+2087
+2088
+2089
+2090
+2091
+2092
+2093
+2094
+2095
+2096
+2097
+2098
+2099
+2100
+2101
+2102
+2103
+2104
+2105
+2106
+2107
+2108
+2109
+2110
+2111
+2112
+2113
+2114
+2115
+2116
+2117
+2118
+2119
+2120
+2121
+2122
+2123
+2124
+2125
+2126
+2127
+2128
+2129
+2130
+2131
+2132
+2133
+2134
+2135
+2136
+2137
+2138
+2139
+2140
+2141
+2142
+2143
+2144
+2145
+2146
+2147
+2148
+2149
+2150
+2151
+2152
+2153
+2154
+2155
+2156
+2157
+2158
+2159
+2160
+2161
+2162
+2163
+2164
+2165
+2166
+2167
+2168
+2169
+2170
+2171
+2172
+2173
+2174
+2175
+2176
+2177
+2178
+2179
+2180
+2181
+2182
+2183
+2184
+2185
+2186
+2187
+2188
+2189
+2190
+2191
+2192
+2193
+2194
+2195
+2196
+2197
+2198
+2199
+2200
+2201
+2202
+2203
+2204
+2205
+2206
+2207
+2208
+2209
+2210
+2211
+2212
+2213
+2214
+2215
+2216
+2217
+2218
+2219
+2220
+2221
+2222
+2223
+2224
+2225
+2226
+2227
+2228
+2229
+2230
+2231
+2232
+2233
+2234
+2235
+2236
+2237
+2238
+2239
+2240
+2241
+2242
+2243
+2244
+2245
+2246
+2247
+2248
+2249
+2250
+2251
+2252
+2253
+2254
+2255
+2256
+2257
+2258
+2259
+2260
+2261
+2262
+2263
+2264
+2265
+2266
+2267
+2268
+2269
+2270
+2271
+2272
+2273
+2274
+2275
+2276
+2277
+2278
+2279
+2280
+2281
+2282
+2283
+2284
+2285
+2286
+2287
+2288
+2289
+2290
+2291
+2292
+2293
+2294
+2295
+2296
+2297
+2298
+2299
+2300
+2301
+2302
+2303
+2304
+2305
+2306
+2307
+2308
+2309
+2310
+2311
+2312
+2313
+2314
+2315
+2316
+2317
+2318
+2319
+2320
+2321
+2322
+2323
+2324
+2325
+2326
+2327
+2328
+2329
+2330
+2331
+2332
+2333
+2334
+2335
+2336
+2337
+2338
+2339
+2340
+2341
+2342
+2343
+2344
+2345
+2346
+2347
+2348
+2349
+2350
+2351
+2352
+2353
+2354
+2355
+2356
+2357
+2358
+2359
+2360
+2361
+2362
+2363
+2364
+2365
+2366
+2367
+2368
+2369
+2370
+2371
+2372
+2373
+2374
+2375
+2376
+2377
+2378
+2379
+2380
+2381
+2382
+2383
+2384
+2385
+2386
+2387
+2388
+2389
+2390
+2391
+2392
+2393
+2394
+2395
+2396
+2397
+2398
+2399
+2400
+2401
+2402
+2403
+2404
+2405
+2406
+2407
+2408
+2409
+2410
+2411
+2412
+2413
+2414
+2415
+2416
+2417
+2418
+2419
+2420
+2421
+2422
+2423
+2424
+2425
+2426
+2427
+2428
+2429
+2430
+2431
+2432
+2433
+2434
+2435
+2436
+2437
+2438
+2439
+2440
+2441
+2442
+2443
+2444
+2445
+2446
+2447
+2448
+2449
+2450
+2451
+2452
+2453
+2454
+2455
+2456
+2457
+2458
+2459
+2460
+2461
+2462
+2463
+2464
+2465
+2466
+2467
+2468
+2469
+2470
+2471
+2472
+2473
+2474
+2475
+2476
+2477
+2478
+2479
+2480
+2481
+2482
+2483
+2484
+2485
+2486
+2487
+2488
+2489
+2490
+2491
+2492
+2493
+2494
+2495
+2496
+2497
+2498
+2499
+2500
+2501
+2502
+2503
+2504
+2505
+2506
+2507
+2508
+2509
+2510
+2511
+2512
+2513
+2514
+2515
+2516
+2517
+2518
+2519
+2520
+2521
+2522
+2523
+2524
+2525
+2526
+2527
+2528
+2529
+2530
+2531
+2532
+2533
+2534
+2535
+2536
+2537
+2538
+2539
+2540
+2541
+2542
+2543
+2544
+2545
+2546
+2547
+2548
+2549
+2550
+2551
+2552
+2553
+2554
+2555
+2556
+2557
+2558
+2559
+2560
+2561
+2562
+2563
+2564
+2565
+2566
+2567
+2568
+2569
+2570
+2571
+2572
+2573
+2574
+2575
+2576
+2577
+2578
+2579
+2580
+2581
+2582
+2583
+2584
+2585
+2586
+2587
+2588
+2589
+2590
+2591
+2592
+2593
+2594
+2595
+2596
+2597
+2598
+2599
+2600
+2601
+2602
+2603
+2604
+2605
+2606
+2607
+2608
+2609
+2610
+2611
+2612
+2613
+2614
+2615
+2616
+2617
+2618
+2619
+2620
+2621
+2622
+2623
+2624
+2625
+2626
+2627
+2628
+2629
+2630
+2631
+2632
+2633
+2634
+2635
+2636
+2637
+2638
+2639
+2640
+2641
+2642
+2643
+2644
+2645
+2646
+2647
+2648
+2649
+2650
+2651
+2652
+2653
+2654
+2655
+2656
+2657
+2658
+2659
+2660
+2661
+2662
+2663
+2664
+2665
+2666
+2667
+2668
+2669
+2670
+2671
+2672
+2673
+2674
+2675
+2676
+2677
+2678
+2679
+2680
+2681
+2682
+2683
+2684
+2685
+2686
+2687
+2688
+2689
+2690
+2691
+2692
+2693
+2694
+2695
+2696
+2697
+2698
+2699
+2700
+2701
+2702
+2703
+2704
+2705
+2706
+2707
+2708
+2709
+2710
+2711
+2712
+2713
+2714
+2715
+2716
+2717
+2718
+2719
+2720
+2721
+2722
+2723
+2724
+2725
+2726
+2727
+2728
+2729
+2730
+2731
+2732
+2733
+2734
+2735
+2736
+2737
+2738
+2739
+2740
+2741
+2742
+2743
+2744
+2745
+2746
+2747
+2748
+2749
+2750
+2751
+2752
+2753
+2754
+2755
+2756
+2757
+2758
+2759
+2760
+2761
+2762
+2763
+2764
+2765
+2766
+2767
+2768
+2769
+2770
+2771
+2772
+2773
+2774
+2775
+2776
+2777
+2778
+2779
+2780
+2781
+2782
+2783
+2784
+2785
+2786
+2787
+2788
+2789
+2790
+2791
+2792
+2793
+2794
+2795
+2796
+2797
+2798
+2799
+2800
+2801
+2802
+2803
+2804
+2805
+2806
+2807
+2808
+2809
+2810
+2811
+2812
+2813
+2814
+2815
+2816
+2817
+2818
+2819
+2820
+2821
+2822
+2823
+2824
+2825
+2826
+2827
+2828
+2829
+2830
+2831
+2832
+2833
+2834
+2835
+2836
+2837
+2838
+2839
+2840
+2841
+2842
+2843
+2844
+2845
+2846
+2847
+2848
+2849
+2850
+2851
+2852
+2853
+2854
+2855
+2856
+2857
+2858
+2859
+2860
+2861
+2862
+2863
+2864
+2865
+2866
+2867
+2868
+2869
+2870
+2871
+2872
+2873
+2874
+2875
+2876
+2877
+2878
+2879
+2880
+2881
+2882
+2883
+2884
+2885
+2886
+2887
+2888
+2889
+2890
+2891
+2892
+2893
+2894
+2895
+2896
+2897
+2898
+2899
+2900
+2901
+2902
+2903
+2904
+2905
+2906
+2907
+2908
+2909
+2910
+2911
+2912
+2913
+2914
+2915
+2916
+2917
+2918
+2919
+2920
+2921
+2922
+2923
+2924
+2925
+2926
+2927
+2928
+2929
+2930
+2931
+2932
+2933
+2934
+2935
+2936
+2937
+2938
+2939
+2940
+2941
+2942
+2943
+2944
+2945
+2946
+2947
+2948
+2949
+2950
+2951
+2952
+2953
+2954
+2955
+2956
+2957
+2958
+2959
+2960
+2961
+2962
+2963
+2964
+2965
+2966
+2967
+2968
+2969
+2970
+2971
+2972
+2973
+2974
+2975
+2976
+2977
+2978
+2979
+2980
+2981
+2982
+2983
+2984
+2985
+2986
+2987
+2988
+2989
+2990
+2991
+2992
+2993
+2994
+2995
+2996
+2997
+2998
+2999
+3000
+3001
+3002
+3003
+3004
+3005
+3006
+3007
+3008
+3009
+3010
+3011
+3012
+3013
+3014
+3015
+3016
+3017
+3018
+3019
+3020
+3021
+3022
+3023
+3024
+3025
+3026
+3027
+3028
+3029
+3030
+3031
+3032
+3033
+3034
+3035
+3036
+3037
+3038
+3039
+3040
+3041
+3042
+3043
+3044
+3045
+3046
+3047
+3048
+3049
+3050
+3051
+3052
+3053
+3054
+3055
+3056
+3057
+3058
+3059
+3060
+3061
+3062
+3063
+3064
+3065
+3066
+3067
+3068
+3069
+3070
+3071
+3072
+3073
+3074
+3075
+3076
+3077
+3078
+3079
+3080
+3081
+3082
+3083
+3084
+3085
+3086
+3087
+3088
+3089
+3090
+3091
+3092
+3093
+3094
+3095
+3096
+3097
+3098
+3099
+3100
+3101
+3102
+3103
+3104
+3105
+3106
+3107
+3108
+3109
+3110
+3111
+3112
+3113
+3114
+3115
+3116
+3117
+3118
+3119
+3120
+3121
+3122
+3123
+3124
+3125
+3126
+3127
+3128
+3129
+3130
+3131
+3132
+3133
+3134
+3135
+3136
+3137
+3138
+3139
+3140
+3141
+3142
+3143
+3144
+3145
+3146
+3147
+3148
+3149
+3150
+3151
+3152
+3153
+3154
+3155
+3156
+3157
+3158
+3159
+3160
+3161
+3162
+3163
+3164
+3165
+3166
+3167
+3168
+3169
+3170
+3171
+3172
+3173
+3174
+3175
+3176
+3177
+3178
+3179
+3180
+3181
+3182
+3183
+3184
+3185
+3186
+3187
+3188
+3189
+3190
+3191
+3192
+3193
+3194
+3195
+3196
+3197
+3198
+3199
+3200
+3201
+3202
+3203
+3204
+3205
+3206
+3207
+3208
+3209
+3210
+3211
+3212
+3213
+3214
+3215
+3216
+3217
+3218
+3219
+3220
+3221
+3222
+3223
+3224
+3225
+3226
+3227
+3228
+3229
+3230
+3231
+3232
+3233
+3234
+3235
+3236
+3237
+3238
+3239
+3240
+3241
+3242
+3243
+3244
+3245
+3246
+3247
+3248
+3249
+3250
+3251
+3252
+3253
+3254
+3255
+3256
+3257
+3258
+3259
+3260
+3261
+3262
+3263
+3264
+3265
+3266
+3267
+3268
+3269
+3270
+3271
+3272
+3273
+3274
+3275
+3276
+3277
+3278
+3279
+3280
+3281
+3282
+3283
+3284
+3285
+3286
+3287
+3288
+3289
+3290
+3291
+3292
+3293
+3294
+3295
+3296
+3297
+3298
+3299
+3300
+3301
+3302
+3303
+3304
+3305
+3306
+3307
+3308
+3309
+3310
+3311
+3312
+3313
+3314
+3315
+3316
+3317
+3318
+3319
+3320
+3321
+3322
+3323
+3324
+3325
+3326
+3327
+3328
+3329
+3330
+3331
+3332
+3333
+3334
+3335
+3336
+3337
+3338
+3339
+3340
+3341
+3342
+3343
+3344
+3345
+3346
+3347
+3348
+3349
+3350
+3351
+3352
+3353
+3354
+3355
+3356
+3357
+3358
+3359
+3360
+3361
+3362
+3363
+3364
+3365
+3366
+3367
+3368
+3369
+3370
+3371
+3372
+3373
+3374
+3375
+3376
+3377
+3378
+3379
+3380
+3381
+3382
+3383
+3384
+3385
+3386
+3387
+3388
+3389
+3390
+3391
+3392
+3393
+3394
+3395
+3396
+3397
+3398
+3399
+3400
+3401
+3402
+3403
+3404
+3405
+3406
+3407
+3408
+3409
+3410
+3411
+3412
+3413
+3414
+3415
+3416
+3417
+3418
+3419
+3420
+3421
+3422
+3423
+3424
+3425
+3426
+3427
+3428
+3429
+3430
+3431
+3432
+3433
+3434
+3435
+3436
+3437
+3438
+3439
+3440
+3441
+3442
+3443
+3444
+3445
+3446
+3447
+3448
+3449
+3450
+3451
+3452
+3453
+3454
+3455
+3456
+3457
+3458
+3459
+3460
+3461
+3462
+3463
+3464
+3465
+3466
+3467
+3468
+3469
+3470
+3471
+3472
+3473
+3474
+3475
+3476
+3477
+3478
+3479
+3480
+3481
+3482
+3483
+3484
+3485
+3486
+3487
+3488
+3489
+3490
+3491
+3492
+3493
+3494
+3495
+3496
+3497
+3498
+3499
+3500
+3501
+3502
+3503
+3504
+3505
+3506
+3507
+3508
+3509
+3510
+3511
+3512
+3513
+3514
+3515
+3516
+3517
+3518
+3519
+3520
+3521
+3522
+3523
+3524
+3525
+3526
+3527
+3528
+3529
+3530
+3531
+3532
+3533
+3534
+3535
+3536
+3537
+3538
+3539
+3540
+3541
+3542
+3543
+3544
+3545
+3546
+3547
+3548
+3549
+3550
+3551
+3552
+3553
+3554
+3555
+3556
+3557
+3558
+3559
+3560
+3561
+3562
+3563
+3564
+3565
+3566
+3567
+3568
+3569
+3570
+3571
+3572
+3573
+3574
+3575
+3576
+3577
+3578
+3579
+3580
+3581
+3582
+3583
+3584
+3585
+3586
+3587
+3588
+3589
+3590
+3591
+3592
+3593
+3594
+3595
+3596
+3597
+3598
+3599
+3600
+3601
+3602
+3603
+3604
+3605
+3606
+3607
+3608
+3609
+3610
+3611
+3612
+3613
+3614
+3615
+3616
+3617
+3618
+3619
+3620
+3621
+3622
+3623
+3624
+3625
+3626
+3627
+3628
+3629
+3630
+3631
+3632
+3633
+3634
+3635
+3636
+3637
+3638
+3639
+3640
+3641
+3642
+3643
+3644
+3645
+3646
+3647
+3648
+3649
+3650
+3651
+3652
+3653
+3654
+3655
+3656
+3657
+3658
+3659
+3660
+3661
+3662
+3663
+3664
+3665
+3666
+3667
+3668
+3669
+3670
+3671
+3672
+3673
+3674
+3675
+3676
+3677
+3678
+3679
+3680
+3681
+3682
+3683
+3684
+3685
+3686
+3687
+3688
+3689
+3690
+3691
+3692
+3693
+3694
+3695
+3696
+3697
+3698
+3699
+3700
+3701
+3702
+3703
+3704
+3705
+3706
+3707
+3708
+3709
+3710
+3711
+3712
+3713
+3714
+3715
+3716
+3717
+3718
+3719
+3720
+3721
+3722
+3723
+3724
+3725
+3726
+3727
+3728
+3729
+3730
+3731
+3732
+3733
+3734
+3735
+3736
+3737
+3738
+3739
+3740
+3741
+3742
+3743
+3744
+3745
+3746
+3747
+3748
+3749
+3750
+3751
+3752
+3753
+3754
+3755
+3756
+3757
+3758
+3759
+3760
+3761
+3762
+3763
+3764
+3765
+3766
+3767
+3768
+3769
+3770
+3771
+3772
+3773
+3774
+3775
+3776
+3777
+3778
+3779
+3780
+3781
+3782
+3783
+3784
+3785
+3786
+3787
+3788
+3789
+3790
+3791
+3792
+3793
+3794
+3795
+3796
+3797
+3798
+3799
+3800
+3801
+3802
+3803
+3804
+3805
+3806
+3807
+3808
+3809
+3810
+3811
+3812
+3813
+3814
+3815
+3816
+3817
+3818
+3819
+3820
+3821
+3822
+3823
+3824
+3825
+3826
+3827
+3828
+3829
+3830
+3831
+3832
+3833
+3834
+3835
+3836
+3837
+3838
+3839
+3840
+3841
+3842
+3843
+3844
+3845
+3846
+3847
+3848
+3849
+3850
+3851
+3852
+3853
+3854
+3855
+3856
+3857
+3858
+3859
+3860
+3861
+3862
+3863
+3864
+3865
+3866
+3867
+3868
+3869
+3870
+3871
+3872
+3873
+3874
+3875
+3876
+3877
+3878
+3879
+3880
+3881
+3882
+3883
+3884
+3885
+3886
+3887
+3888
+3889
+3890
+3891
+3892
+3893
+3894
+3895
+3896
+3897
+3898
+3899
+3900
+3901
+3902
+3903
+3904
+3905
+3906
+3907
+3908
+3909
+3910
+3911
+3912
+3913
+3914
+3915
+3916
+3917
+3918
+3919
+3920
+3921
+3922
+3923
+3924
+3925
+3926
+3927
+3928
+3929
+3930
+3931
+3932
+3933
+3934
+3935
+3936
+3937
+3938
+3939
+3940
+3941
+3942
+3943
+3944
+3945
+3946
+3947
+3948
+3949
+3950
+3951
+3952
+3953
+3954
+3955
+3956
+3957
+3958
+3959
+3960
+3961
+3962
+3963
+3964
+3965
+3966
+3967
+3968
+3969
+3970
+3971
+3972
+3973
+3974
+3975
+3976
+3977
+3978
+3979
+3980
+3981
+3982
+3983
+3984
+3985
+3986
+3987
+3988
+3989
+3990
+3991
+3992
+3993
+3994
+3995
+3996
+3997
+3998
+3999
+4000
+4001
+4002
+4003
+4004
+4005
+4006
+4007
+4008
+4009
+4010
+4011
+4012
+4013
+4014
+4015
+4016
+4017
+4018
+4019
+4020
+4021
+4022
+4023
+4024
+4025
+4026
+4027
+4028
+4029
+4030
+4031
+4032
+4033
+4034
+4035
+4036
+4037
+4038
+4039
+4040
+4041
+4042
+4043
+4044
+4045
+4046
+4047
+4048
+4049
+4050
+4051
+4052
+4053
+4054
+4055
+4056
+4057
+4058
+4059
+4060
+4061
+4062
+4063
+4064
+4065
+4066
+4067
+4068
+4069
+4070
+4071
+4072
+4073
+4074
+4075
+4076
+4077
+4078
+4079
+4080
+4081
+4082
+4083
+4084
+4085
+4086
+4087
+4088
+4089
+4090
+4091
+4092
+4093
+4094
+4095
+4096
+4097
+4098
+4099
+4100
+4101
+4102
+4103
+4104
+4105
+4106
+4107
+4108
+4109
+4110
+4111
+4112
+4113
+4114
+4115
+4116
+4117
+4118
+4119
+4120
+4121
+4122
+4123
+4124
+4125
+4126
+4127
+4128
+4129
+4130
+4131
+4132
+4133
+4134
+4135
+4136
+4137
+4138
+4139
+4140
+4141
+4142
+4143
+4144
+4145
+4146
+4147
+4148
+4149
+4150
+4151
+4152
+4153
+4154
+4155
+4156
+4157
+4158
+4159
+4160
+4161
+4162
+4163
+4164
+4165
+4166
+4167
+4168
+4169
+4170
+4171
+4172
+4173
+4174
+4175
+4176
+4177
+4178
+4179
+4180
+4181
+4182
+4183
+4184
+4185
+4186
+4187
+4188
+4189
+4190
+4191
+4192
+4193
+4194
+4195
+4196
+4197
+4198
+4199
+4200
+4201
+4202
+4203
+4204
+4205
+4206
+4207
+4208
+4209
+4210
+4211
+4212
+4213
+4214
+4215
+4216
+4217
+4218
+4219
+4220
+4221
+4222
+4223
+4224
+4225
+4226
+4227
+4228
+4229
+4230
+4231
+4232
+4233
+4234
+4235
+4236
+4237
+4238
+4239
+4240
+4241
+4242
+4243
+4244
+4245
+4246
+4247
+4248
+4249
+4250
+4251
+4252
+4253
+4254
+4255
+4256
+4257
+4258
+4259
+4260
+4261
+4262
+4263
+4264
+4265
+4266
+4267
+4268
+4269
+4270
+4271
+4272
+4273
+4274
+4275
+4276
+4277
+4278
+4279
+4280
+4281
+4282
+4283
+4284
+4285
+4286
+4287
+4288
+4289
+4290
+4291
+4292
+4293
+4294
+4295
+4296
+4297
+4298
+4299
+4300
+4301
+4302
+4303
+4304
+4305
+4306
+4307
+4308
+4309
+4310
+4311
+4312
+4313
+4314
+4315
+4316
+4317
+4318
+4319
+4320
+4321
+4322
+4323
+4324
+4325
+4326
+4327
+4328
+4329
+4330
+4331
+4332
+4333
+4334
+4335
+4336
+4337
+4338
+4339
+4340
+4341
+4342
+4343
+4344
+4345
+4346
+4347
+4348
+4349
+4350
+4351
+4352
+4353
+4354
+4355
+4356
+4357
+4358
+4359
+4360
+4361
+4362
+4363
+4364
+4365
+4366
+4367
+4368
+4369
+4370
+4371
+4372
+4373
+4374
+4375
+4376
+4377
+4378
+4379
+4380
+4381
+4382
+4383
+4384
+4385
+4386
+4387
+4388
+4389
+4390
+4391
+4392
+4393
+4394
+4395
+4396
+4397
+4398
+4399
+4400
+4401
+4402
+4403
+4404
+4405
+4406
+4407
+4408
+4409
+4410
+4411
+4412
+4413
+4414
+4415
+4416
+4417
+4418
+4419
+4420
+4421
+4422
+4423
+4424
+4425
+4426
+4427
+4428
+4429
+4430
+4431
+4432
+4433
+4434
+4435
+4436
+4437
+4438
+4439
+4440
+4441
+4442
+4443
+4444
+4445
+4446
+4447
+4448
+4449
+4450
+4451
+4452
+4453
+4454
+4455
+4456
+4457
+4458
+4459
+4460
+4461
+4462
+4463
+4464
+4465
+4466
+4467
+4468
+4469
+4470
+4471
+4472
+4473
+4474
+4475
+4476
+4477
+4478
+4479
+4480
+4481
+4482
+4483
+4484
+4485
+4486
+4487
+4488
+4489
+4490
+4491
+4492
+4493
+4494
+4495
+4496
+4497
+4498
+4499
+4500
+4501
+4502
+4503
+4504
+4505
+4506
+4507
+4508
+4509
+4510
+4511
+4512
+4513
+4514
+4515
+4516
+4517
+4518
+4519
+4520
+4521
+4522
+4523
+4524
+4525
+4526
+4527
+4528
+4529
+4530
+4531
+4532
+4533
+4534
+4535
+4536
+4537
+4538
+4539
+4540
+4541
+4542
+4543
+4544
+4545
+4546
+4547
+4548
+4549
+4550
+4551
+4552
+4553
+4554
+4555
+4556
+4557
+4558
+4559
+4560
+4561
+4562
+4563
+4564
+4565
+4566
+4567
+4568
+4569
+4570
+4571
+4572
+4573
+4574
+4575
+4576
+4577
+4578
+4579
+4580
+4581
+4582
+4583
+4584
+4585
+4586
+4587
+4588
+4589
+4590
+4591
+4592
+4593
+4594
+4595
+4596
+4597
+4598
+4599
+4600
+4601
+4602
+4603
+4604
+4605
+4606
+4607
+4608
+4609
+4610
+4611
+4612
+4613
+4614
+4615
+4616
+4617
+4618
+4619
+4620
+4621
+4622
+4623
+4624
+4625
+4626
+4627
+4628
+4629
+4630
+4631
+4632
+4633
+4634
+4635
+4636
+4637
+4638
+4639
+4640
+4641
+4642
+4643
+4644
+4645
+4646
+4647
+4648
+4649
+4650
+4651
+4652
+4653
+4654
+4655
+4656
+4657
+4658
+4659
+4660
+4661
+4662
+4663
+4664
+4665
+4666
+4667
+4668
+4669
+4670
+4671
+4672
+4673
+4674
+4675
+4676
+4677
+4678
+4679
+4680
+4681
+4682
+4683
+4684
+4685
+4686
+4687
+4688
+4689
+4690
+4691
+4692
+4693
+4694
+4695
+4696
+4697
+4698
+4699
+4700
+4701
+4702
+4703
+4704
+4705
+4706
+4707
+4708
+4709
+4710
+4711
+4712
+4713
+4714
+4715
+4716
+4717
+4718
+4719
+4720
+4721
+4722
+4723
+4724
+4725
+4726
+4727
+4728
+4729
+4730
+4731
+4732
+4733
+4734
+4735
+4736
+4737
+4738
+4739
+4740
+4741
+4742
+4743
+4744
+4745
+4746
+4747
+4748
+4749
+4750
+4751
+4752
+4753
+4754
+4755
+4756
+4757
+4758
+4759
+4760
+4761
+4762
+4763
+4764
+4765
+4766
+4767
+4768
+4769
+4770
+4771
+4772
+4773
+4774
+4775
+4776
+4777
+4778
+4779
+4780
+4781
+4782
+4783
+4784
+4785
+4786
+4787
+4788
+4789
+4790
+4791
+4792
+4793
+4794
+4795
+4796
+4797
+4798
+4799
+4800
+4801
+4802
+4803
+4804
+4805
+4806
+4807
+4808
+4809
+4810
+4811
+4812
+4813
+4814
+4815
+4816
+4817
+4818
+4819
+4820
+4821
+4822
+4823
+4824
+4825
+4826
+4827
+4828
+4829
+4830
+4831
+4832
+4833
+4834
+4835
+4836
+4837
+4838
+4839
+4840
+4841
+4842
+4843
+4844
+4845
+4846
+4847
+4848
+4849
+4850
+4851
+4852
+4853
+4854
+4855
+4856
+4857
+4858
+4859
+4860
+4861
+4862
+4863
+4864
+4865
+4866
+4867
+4868
+4869
+4870
+4871
+4872
+4873
+4874
+4875
+4876
+4877
+4878
+4879
+4880
+4881
+4882
+4883
+4884
+4885
+4886
+4887
+4888
+4889
+4890
+4891
+4892
+4893
+4894
+4895
+4896
+4897
+4898
+4899
+4900
+4901
+4902
+4903
+4904
+4905
+4906
+4907
+4908
+4909
+4910
+4911
+4912
+4913
+4914
+4915
+4916
+4917
+4918
+4919
+4920
+4921
+4922
+4923
+4924
+4925
+4926
+4927
+4928
+4929
+4930
+4931
+4932
+4933
+4934
+4935
+4936
+4937
+4938
+4939
+4940
+4941
+4942
+4943
+4944
+4945
+4946
+4947
+4948
+4949
+4950
+4951
+4952
+4953
+4954
+4955
+4956
+4957
+4958
+4959
+4960
+4961
+4962
+4963
+4964
+4965
+4966
+4967
+4968
+4969
+4970
+4971
+4972
+4973
+4974
+4975
+4976
+4977
+4978
+4979
+4980
+4981
+4982
+4983
+4984
+4985
+4986
+4987
+4988
+4989
+4990
+4991
+4992
+4993
+4994
+4995
+4996
+4997
+4998
+4999
+5000
+5001
+5002
+5003
+5004
+5005
+5006
+5007
+5008
+5009
+5010
+5011
+5012
+5013
+5014
+5015
+5016
+5017
+5018
+5019
+5020
+5021
+5022
+5023
+5024
+5025
+5026
+5027
+5028
+5029
+5030
+5031
+5032
+5033
+5034
+5035
+5036
+5037
+5038
+5039
+5040
+5041
+5042
+5043
+5044
+5045
+5046
+5047
+5048
+5049
+5050
+5051
+5052
+5053
+5054
+5055
+5056
+5057
+5058
+5059
+5060
+5061
+5062
+5063
+5064
+5065
+5066
+5067
+5068
+5069
+5070
+5071
+5072
+5073
+5074
+5075
+5076
+5077
+5078
+5079
+5080
+5081
+5082
+5083
+5084
+5085
+5086
+5087
+5088
+5089
+5090
+5091
+5092
+5093
+5094
+5095
+5096
+5097
+5098
+5099
+5100
+5101
+5102
+5103
+5104
+5105
+5106
+5107
+5108
+5109
+5110
+5111
+5112
+5113
+5114
+5115
+5116
+5117
+5118
+5119
+5120
+5121
+5122
+5123
+5124
+5125
+5126
+5127
+5128
+5129
+5130
+5131
+5132
+5133
+5134
+5135
+5136
+5137
+5138
+5139
+5140
+5141
+5142
+5143
+5144
+5145
+5146
+5147
+5148
+5149
+5150
+5151
+5152
+5153
+5154
+5155
+5156
+5157
+5158
+5159
+5160
+5161
+5162
+5163
+5164
+5165
+5166
+5167
+5168
+5169
+5170
+5171
+5172
+5173
+5174
+5175
+5176
+5177
+5178
+5179
+5180
+5181
+5182
+5183
+5184
+5185
+5186
+5187
+5188
+5189
+5190
+5191
+5192
+5193
+5194
+5195
+5196
+5197
+5198
+5199
+5200
+5201
+5202
+5203
+5204
+5205
+5206
+5207
+5208
+5209
+5210
+5211
+5212
+5213
+5214
+5215
+5216
+5217
+5218
+5219
+5220
+5221
+5222
+5223
+5224
+5225
+5226
+5227
+5228
+5229
+5230
+5231
+5232
+5233
+5234
+5235
+5236
+5237
+5238
+5239
+5240
+5241
+5242
+5243
+5244
+5245
+5246
+5247
+5248
+5249
+5250
+5251
+5252
+5253
+5254
+5255
+5256
+5257
+5258
+5259
+5260
+5261
+5262
+5263
+5264
+5265
+5266
+5267
+5268
+5269
+5270
+5271
+5272
+5273
+5274
+5275
+5276
+5277
+5278
+5279
+5280
+5281
+5282
+5283
+5284
+5285
+5286
+5287
+5288
+5289
+5290
+5291
+5292
+5293
+5294
+5295
+5296
+5297
+5298
+5299
+5300
+5301
+5302
+5303
+5304
+5305
+5306
+5307
+5308
+5309
+5310
+5311
+5312
+5313
+5314
+5315
+5316
+5317
+5318
+5319
+5320
+5321
+5322
+5323
+5324
+5325
+5326
+5327
+5328
+5329
+5330
+5331
+5332
+5333
+5334
+5335
+5336
+5337
+5338
+5339
+5340
+5341
+5342
+5343
+5344
+5345
+5346
+5347
+5348
+5349
+5350
+5351
+5352
+5353
+5354
+5355
+5356
+5357
+5358
+5359
+5360
+5361
+5362
+5363
+5364
+5365
+5366
+5367
+5368
+5369
+5370
+5371
+5372
+5373
+5374
+5375
+5376
+5377
+5378
+5379
+5380
+5381
+5382
+5383
+5384
+5385
+5386
+5387
+5388
+5389
+5390
+5391
+5392
+5393
+5394
+5395
+5396
+5397
+5398
+5399
+5400
+5401
+5402
+5403
+5404
+5405
+5406
+5407
+5408
+5409
+5410
+5411
+5412
+5413
+5414
+5415
+5416
+5417
+5418
+5419
+5420
+5421
+5422
+5423
+5424
+5425
+5426
+5427
+5428
+5429
+5430
+5431
+5432
+5433
+5434
+5435
+5436
+5437
+5438
+5439
+5440
+5441
+5442
+5443
+5444
+5445
+5446
+5447
+5448
+5449
+5450
+5451
+5452
+5453
+5454
+5455
+5456
+5457
+5458
+5459
+5460
+5461
+5462
+5463
+5464
+5465
+5466
+5467
+5468
+5469
+5470
+5471
+5472
+5473
+5474
+5475
+5476
+5477
+5478
+5479
+5480
+5481
+5482
+5483
+5484
+5485
+5486
+5487
+5488
+5489
+5490
+5491
+5492
+5493
+5494
+5495
+5496
+5497
+5498
+5499
+5500
+5501
+5502
+5503
+5504
+5505
+5506
+5507
+5508
+5509
+5510
+5511
+5512
+5513
+5514
+5515
+5516
+5517
+5518
+5519
+5520
+5521
+5522
+5523
+5524
+5525
+5526
+5527
+5528
+5529
+5530
+5531
+5532
+5533
+5534
+5535
+5536
+5537
+5538
+5539
+5540
+5541
+5542
+5543
+5544
+5545
+5546
+5547
+5548
+5549
+5550
+5551
+5552
+5553
+5554
+5555
+5556
+5557
+5558
+5559
+5560
+5561
+5562
+5563
+5564
+5565
+5566
+5567
+5568
+5569
+5570
+5571
+5572
+5573
+5574
+5575
+5576
+5577
+5578
+5579
+5580
+5581
+5582
+5583
+5584
+5585
+5586
+5587
+5588
+5589
+5590
+5591
+5592
+5593
+5594
+5595
+5596
+5597
+5598
+5599
+5600
+5601
+5602
+5603
+5604
+5605
+5606
+5607
+5608
+5609
+5610
+5611
+5612
+5613
+5614
+5615
+5616
+5617
+5618
+5619
+5620
+5621
+5622
+5623
+5624
+5625
+5626
+5627
+5628
+5629
+5630
+5631
+5632
+5633
+5634
+5635
+5636
+5637
+5638
+5639
+5640
+5641
+5642
+5643
+5644
+5645
+5646
+5647
+5648
+5649
+5650
+5651
+5652
+5653
+5654
+5655
+5656
+5657
+5658
+5659
+5660
+5661
+5662
+5663
+5664
+5665
+5666
+5667
+5668
+5669
+5670
+5671
+5672
+5673
+5674
+5675
+5676
+5677
+5678
+5679
+5680
+5681
+5682
+5683
+5684
+5685
+5686
+5687
+5688
+5689
+5690
+5691
+5692
+5693
+5694
+5695
+5696
+5697
+5698
+5699
+5700
+5701
+5702
+5703
+5704
+5705
+5706
+5707
+5708
+5709
+5710
+5711
+5712
+5713
+5714
+5715
+5716
+5717
+5718
+5719
+5720
+5721
+5722
+5723
+5724
+5725
+5726
+5727
+5728
+5729
+5730
+5731
+5732
+5733
+5734
+5735
+5736
+5737
+5738
+5739
+5740
+5741
+5742
+5743
+5744
+5745
+5746
+5747
+5748
+5749
+5750
+5751
+5752
+5753
+5754
+5755
+5756
+5757
+5758
+5759
+5760
+5761
+5762
+5763
+5764
+5765
+5766
+5767
+5768
+5769
+5770
+5771
+5772
+5773
+5774
+5775
+5776
+5777
+5778
+5779
+5780
+5781
+5782
+5783
+5784
+5785
+5786
+5787
+5788
+5789
+5790
+5791
+5792
+5793
+5794
+5795
+5796
+5797
+5798
+5799
+5800
+5801
+5802
+5803
+5804
+5805
+5806
+5807
+5808
+5809
+5810
+5811
+5812
+5813
+5814
+5815
+5816
+5817
+5818
+5819
+5820
+5821
+5822
+5823
+5824
+5825
+5826
+5827
+5828
+5829
+5830
+5831
+5832
+5833
+5834
+5835
+5836
+5837
+5838
+5839
+5840
+5841
+5842
+5843
+5844
+5845
+5846
+5847
+5848
+5849
+5850
+5851
+5852
+5853
+5854
+5855
+5856
+5857
+5858
+5859
+5860
+5861
+5862
+5863
+5864
+5865
+5866
+5867
+5868
+5869
+5870
+5871
+5872
+5873
+5874
+5875
+5876
+5877
+5878
+5879
+5880
+5881
+5882
+5883
+5884
+5885
+5886
+5887
+5888
+5889
+5890
+5891
+5892
+5893
+5894
+5895
+5896
+5897
+5898
+5899
+5900
+5901
+5902
+5903
+5904
+5905
+5906
+5907
+5908
+5909
+5910
+5911
+5912
+5913
+5914
+5915
+5916
+5917
+5918
+5919
+5920
+5921
+5922
+5923
+5924
+5925
+5926
+5927
+5928
+5929
+5930
+5931
+5932
+5933
+5934
+5935
+5936
+5937
+5938
+5939
+5940
+5941
+5942
+5943
+5944
+5945
+5946
+5947
+5948
+5949
+5950
+5951
+5952
+5953
+5954
+5955
+5956
+5957
+5958
+5959
+5960
+5961
+5962
+5963
+5964
+5965
+5966
+5967
+5968
+5969
+5970
+5971
+5972
+5973
+5974
+5975
+5976
+5977
+5978
+5979
+5980
+5981
+5982
+5983
+5984
+5985
+5986
+5987
+5988
+5989
+5990
+5991
+5992
+5993
+5994
+5995
+5996
+5997
+5998
+5999
+6000
+6001
+6002
+6003
+6004
+6005
+6006
+6007
+6008
+6009
+6010
+6011
+6012
+6013
+6014
+6015
+6016
+6017
+6018
+6019
+6020
+6021
+6022
+6023
+6024
+6025
+6026
+6027
+6028
+6029
+6030
+6031
+6032
+6033
+6034
+6035
+6036
+6037
+6038
+6039
+6040
+6041
+6042
+6043
+6044
+6045
+6046
+6047
+6048
+6049
+6050
+6051
+6052
+6053
+6054
+6055
+6056
+6057
+6058
+6059
+6060
+6061
+6062
+6063
+6064
+6065
+6066
+6067
+6068
+6069
+6070
+6071
+6072
+6073
+6074
+6075
+6076
+6077
+6078
+6079
+6080
+6081
+6082
+6083
+6084
+6085
+6086
+6087
+6088
+6089
+6090
+6091
+6092
+6093
+6094
+6095
+6096
+6097
+6098
+6099
+6100
+6101
+6102
+6103
+6104
+6105
+6106
+6107
+6108
+6109
+6110
+6111
+6112
+6113
+6114
+6115
+6116
+6117
+6118
+6119
+6120
+6121
+6122
+6123
+6124
+6125
+6126
+6127
+6128
+6129
+6130
+6131
+6132
+6133
+6134
+6135
+6136
+6137
+6138
+6139
+6140
+6141
+6142
+6143
+6144
+6145
+6146
+6147
+6148
+6149
+6150
+6151
+6152
+6153
+6154
+6155
+6156
+6157
+6158
+6159
+6160
+6161
+6162
+6163
+6164
+6165
+6166
+6167
+6168
+6169
+6170
+6171
+6172
+6173
+6174
+6175
+6176
+6177
+6178
+6179
+6180
+6181
+6182
+6183
+6184
+6185
+6186
+6187
+6188
+6189
+6190
+6191
+6192
+6193
+6194
+6195
+6196
+6197
+6198
+6199
+6200
+6201
+6202
+6203
+6204
+6205
+6206
+6207
+6208
+6209
+6210
+6211
+6212
+6213
+6214
+6215
+6216
+6217
+6218
+6219
+6220
+6221
+6222
+6223
+6224
+6225
+6226
+6227
+6228
+6229
+6230
+6231
+6232
+6233
+6234
+6235
+6236
+6237
+6238
+6239
+6240
+6241
+6242
+6243
+6244
+6245
+6246
+6247
+6248
+6249
+6250
+6251
+6252
+6253
+6254
+6255
+6256
+6257
+6258
+6259
+6260
+6261
+6262
+6263
+6264
+6265
+6266
+6267
+6268
+6269
+6270
+6271
+6272
+6273
+6274
+6275
+6276
+6277
+6278
+6279
+6280
+6281
+6282
+6283
+6284
+6285
+6286
+6287
+6288
+6289
+6290
+6291
+6292
+6293
+6294
+6295
+6296
+6297
+6298
+6299
+6300
+6301
+6302
+6303
+6304
+6305
+6306
+6307
+6308
+6309
+6310
+6311
+6312
+6313
+6314
+6315
+6316
+6317
+6318
+6319
+6320
+6321
+6322
+6323
+6324
+6325
+6326
+6327
+6328
+6329
+6330
+6331
+6332
+6333
+6334
+6335
+6336
+6337
+6338
+6339
+6340
+6341
+6342
+6343
+6344
+6345
+6346
+6347
+6348
+6349
+6350
+6351
+6352
+6353
+6354
+6355
+6356
+6357
+6358
+6359
+6360
+6361
+6362
+6363
+6364
+6365
+6366
+6367
+6368
+6369
+6370
+6371
+6372
+6373
+6374
+6375
+6376
+6377
+6378
+6379
+6380
+6381
+6382
+6383
+6384
+6385
+6386
+6387
+6388
+6389
+6390
+6391
+6392
+6393
+6394
+6395
+6396
+6397
+6398
+6399
+6400
+6401
+6402
+6403
+6404
+6405
+6406
+6407
+6408
+6409
+6410
+6411
+6412
+6413
+6414
+6415
+6416
+6417
+6418
+6419
+6420
+6421
+6422
+6423
+6424
+6425
+6426
+6427
+6428
+6429
+6430
+6431
+6432
+6433
+6434
+6435
+6436
+6437
+6438
+6439
+6440
+6441
+6442
+6443
+6444
+6445
+6446
+6447
+6448
+6449
+6450
+6451
+6452
+6453
+6454
+6455
+6456
+6457
+6458
+6459
+6460
+6461
+6462
+6463
+6464
+6465
+6466
+6467
+6468
+6469
+6470
+6471
+6472
+6473
+6474
+6475
+6476
+6477
+6478
+6479
+6480
+6481
+6482
+6483
+6484
+6485
+6486
+6487
+6488
+6489
+6490
+6491
+6492
+6493
+6494
+6495
+6496
+6497
+6498
+6499
+6500
+6501
+6502
+6503
+6504
+6505
+6506
+6507
+6508
+6509
+6510
+6511
+6512
+6513
+6514
+6515
+6516
+6517
+6518
+6519
+6520
+6521
+6522
+6523
+6524
+6525
+6526
+6527
+6528
+6529
+6530
+6531
+6532
+6533
+6534
+6535
+6536
+6537
+6538
+6539
+6540
+6541
+6542
+6543
+6544
+6545
+6546
+6547
+6548
+6549
+6550
+6551
+6552
+6553
+6554
+6555
+6556
+6557
+6558
+6559
+6560
+6561
+6562
+6563
+6564
+6565
+6566
+6567
+6568
+6569
+6570
+6571
+6572
+6573
+6574
+6575
+6576
+6577
+6578
+6579
+6580
+6581
+6582
+6583
+6584
+6585
+6586
+6587
+6588
+6589
+6590
+6591
+6592
+6593
+6594
+6595
+6596
+6597
+6598
+6599
+6600
+6601
+6602
+6603
+6604
+6605
+6606
+6607
+6608
+6609
+6610
+6611
+6612
+6613
+6614
+6615
+6616
+6617
+6618
+6619
+6620
+6621
+6622
+6623
+6624
+6625
+6626
+6627
+6628
+6629
+6630
+6631
+6632
+6633
+6634
+6635
+6636
+6637
+6638
+6639
+6640
+6641
+6642
+6643
+6644
+6645
+6646
+6647
+6648
+6649
+6650
+6651
+6652
+6653
+6654
+6655
+6656
+6657
+6658
+6659
+6660
+6661
+6662
+6663
+6664
+6665
+6666
+6667
+6668
+6669
+6670
+6671
+6672
+6673
+6674
+6675
+6676
+6677
+6678
+6679
+6680
+6681
+6682
+6683
+6684
+6685
+6686
+6687
+6688
+6689
+6690
+6691
+6692
+6693
+6694
+6695
+6696
+6697
+6698
+6699
+6700
+6701
+6702
+6703
+6704
+6705
+6706
+6707
+6708
+6709
+6710
+6711
+6712
+6713
+6714
+6715
+6716
+6717
+6718
+6719
+6720
+6721
+6722
+6723
+6724
+6725
+6726
+6727
+6728
+6729
+6730
+6731
+6732
+6733
+6734
+6735
+6736
+6737
+6738
+6739
+6740
+6741
+6742
+6743
+6744
+6745
+6746
+6747
+6748
+6749
+6750
+6751
+6752
+6753
+6754
+6755
+6756
+6757
+6758
+6759
+6760
+6761
+6762
+6763
+6764
+6765
+6766
+6767
+6768
+6769
+6770
+6771
+6772
+6773
+6774
+6775
+6776
+6777
+6778
+6779
+6780
+6781
+6782
+6783
+6784
+6785
+6786
+6787
+6788
+6789
+6790
+6791
+6792
+6793
+6794
+6795
+6796
+6797
+6798
+6799
+6800
+6801
+6802
+6803
+6804
+6805
+6806
+6807
+6808
+6809
+6810
+6811
+6812
+6813
+6814
+6815
+6816
+6817
+6818
+6819
+6820
+6821
+6822
+6823
+6824
+6825
+6826
+6827
+6828
+6829
+6830
+6831
+6832
+6833
+6834
+6835
+6836
+6837
+6838
+6839
+6840
+6841
+6842
+6843
+6844
+6845
+6846
+6847
+6848
+6849
+6850
+6851
+6852
+6853
+6854
+6855
+6856
+6857
+6858
+6859
+6860
+6861
+6862
+6863
+6864
+6865
+6866
+6867
+6868
+6869
+6870
+6871
+6872
+6873
+6874
+6875
+6876
+6877
+6878
+6879
+6880
+6881
+6882
+6883
+6884
+6885
+6886
+6887
+6888
+6889
+6890
+6891
+6892
+6893
+6894
+6895
+6896
+6897
+6898
+6899
+6900
+6901
+6902
+6903
+6904
+6905
+6906
+6907
+6908
+6909
+6910
+6911
+6912
+6913
+6914
+6915
+6916
+6917
+6918
+6919
+6920
+6921
+6922
+6923
+6924
+6925
+6926
+6927
+6928
+6929
+6930
+6931
+6932
+6933
+6934
+6935
+6936
+6937
+6938
+6939
+6940
+6941
+6942
+6943
+6944
+6945
+6946
+6947
+6948
+6949
+6950
+6951
+6952
+6953
+6954
+6955
+6956
+6957
+6958
+6959
+6960
+6961
+6962
+6963
+6964
+6965
+6966
+6967
+6968
+6969
+6970
+6971
+6972
+6973
+6974
+6975
+6976
+6977
+6978
+6979
+6980
+6981
+6982
+6983
+6984
+6985
+6986
+6987
+6988
+6989
+6990
+6991
+6992
+6993
+6994
+6995
+6996
+6997
+6998
+6999
+7000
+7001
+7002
+7003
+7004
+7005
+7006
+7007
+7008
+7009
+7010
+7011
+7012
+7013
+7014
+7015
+7016
+7017
+7018
+7019
+7020
+7021
+7022
+7023
+7024
+7025
+7026
+7027
+7028
+7029
+7030
+7031
+7032
+7033
+7034
+7035
+7036
+7037
+7038
+7039
+7040
+7041
+7042
+7043
+7044
+7045
+7046
+7047
+7048
+7049
+7050
+7051
+7052
+7053
+7054
+7055
+7056
+7057
+7058
+7059
+7060
+7061
+7062
+7063
+7064
+7065
+7066
+7067
+7068
+7069
+7070
+7071
+7072
+7073
+7074
+7075
+7076
+7077
+7078
+7079
+7080
+7081
+7082
+7083
+7084
+7085
+7086
+7087
+7088
+7089
+7090
+7091
+7092
+7093
+7094
+7095
+7096
+7097
+7098
+7099
+7100
+7101
+7102
+7103
+7104
+7105
+7106
+7107
+7108
+7109
+7110
+7111
+7112
+7113
+7114
+7115
+7116
+7117
+7118
+7119
+7120
+7121
+7122
+7123
+7124
+7125
+7126
+7127
+7128
+7129
+7130
+7131
+7132
+7133
+7134
+7135
+7136
+7137
+7138
+7139
+7140
+7141
+7142
+7143
+7144
+7145
+7146
+7147
+7148
+7149
+7150
+7151
+7152
+7153
+7154
+7155
+7156
+7157
+7158
+7159
+7160
+7161
+7162
+7163
+7164
+7165
+7166
+7167
+7168
+7169
+7170
+7171
+7172
+7173
+7174
+7175
+7176
+7177
+7178
+7179
+7180
+7181
+7182
+7183
+7184
+7185
+7186
+7187
+7188
+7189
+7190
+7191
+7192
+7193
+7194
+7195
+7196
+7197
+7198
+7199
+7200
+7201
+7202
+7203
+7204
+7205
+7206
+7207
+7208
+7209
+7210
+7211
+7212
+7213
+7214
+7215
+7216
+7217
+7218
+7219
+7220
+7221
+7222
+7223
+7224
+7225
+7226
+7227
+7228
+7229
+7230
+7231
+7232
+7233
+7234
+7235
+7236
+7237
+7238
+7239
+7240
+7241
+7242
+7243
+7244
+7245
+7246
+7247
+7248
+7249
+7250
+7251
+7252
+7253
+7254
+7255
+7256
+7257
+7258
+7259
+7260
+7261
+7262
+7263
+7264
+7265
+7266
+7267
+7268
+7269
+7270
+7271
+7272
+7273
+7274
+7275
+7276
+7277
+7278
+7279
+7280
+7281
+7282
+7283
+7284
+7285
+7286
+7287
+7288
+7289
+7290
+7291
+7292
+7293
+7294
+7295
+7296
+7297
+7298
+7299
+7300
+7301
+7302
+7303
+7304
+7305
+7306
+7307
+7308
+7309
+7310
+7311
+7312
+7313
+7314
+7315
+7316
+7317
+7318
+7319
+7320
+7321
+7322
+7323
+7324
+7325
+7326
+7327
+7328
+7329
+7330
+7331
+7332
+7333
+7334
+7335
+7336
+7337
+7338
+7339
+7340
+7341
+7342
+7343
+7344
+7345
+7346
+7347
+7348
+7349
+7350
+7351
+7352
+7353
+7354
+7355
+7356
+7357
+7358
+7359
+7360
+7361
+7362
+7363
+7364
+7365
+7366
+7367
+7368
+7369
+7370
+7371
+7372
+7373
+7374
+7375
+7376
+7377
+7378
+7379
+7380
+7381
+7382
+7383
+7384
+7385
+7386
+7387
+7388
+7389
+7390
+7391
+7392
+7393
+7394
+7395
+7396
+7397
+7398
+7399
+7400
+7401
+7402
+7403
+7404
+7405
+7406
+7407
+7408
+7409
+7410
+7411
+7412
+7413
+7414
+7415
+7416
+7417
+7418
+7419
+7420
+7421
+7422
+7423
+7424
+7425
+7426
+7427
+7428
+7429
+7430
+7431
+7432
+7433
+7434
+7435
+7436
+7437
+7438
+7439
+7440
+7441
+7442
+7443
+7444
+7445
+7446
+7447
+7448
+7449
+7450
+7451
+7452
+7453
+7454
+7455
+7456
+7457
+7458
+7459
+7460
+7461
+7462
+7463
+7464
+7465
+7466
+7467
+7468
+7469
+7470
+7471
+7472
+7473
+7474
+7475
+7476
+7477
+7478
+7479
+7480
+7481
+7482
+7483
+7484
+7485
+7486
+7487
+7488
+7489
+7490
+7491
+7492
+7493
+7494
+7495
+7496
+7497
+7498
+7499
+7500
+7501
+7502
+7503
+7504
+7505
+7506
+7507
+7508
+7509
+7510
+7511
+7512
+7513
+7514
+7515
+7516
+7517
+7518
+7519
+7520
+7521
+7522
+7523
+7524
+7525
+7526
+7527
+7528
+7529
+7530
+7531
+7532
+7533
+7534
+7535
+7536
+7537
+7538
+7539
+7540
+7541
+7542
+7543
+7544
+7545
+7546
+7547
+7548
+7549
+7550
+7551
+7552
+7553
+7554
+7555
+7556
+7557
+7558
+7559
+7560
+7561
+7562
+7563
+7564
+7565
+7566
+7567
+7568
+7569
+7570
+7571
+7572
+7573
+7574
+7575
+7576
+7577
+7578
+7579
+7580
+7581
+7582
+7583
+7584
+7585
+7586
+7587
+7588
+7589
+7590
+7591
+7592
+7593
+7594
+7595
+7596
+7597
+7598
+7599
+7600
+7601
+7602
+7603
+7604
+7605
+7606
+7607
+7608
+7609
+7610
+7611
+7612
+7613
+7614
+7615
+7616
+7617
+7618
+7619
+7620
+7621
+7622
+7623
+7624
+7625
+7626
+7627
+7628
+7629
+7630
+7631
+7632
+7633
+7634
+7635
+7636
+7637
+7638
+7639
+7640
+7641
+7642
+7643
+7644
+7645
+7646
+7647
+7648
+7649
+7650
+7651
+7652
+7653
+7654
+7655
+7656
+7657
+7658
+7659
+7660
+7661
+7662
+7663
+7664
+7665
+7666
+7667
+7668
+7669
+7670
+7671
+7672
+7673
+7674
+7675
+7676
+7677
+7678
+7679
+7680
+7681
+7682
+7683
+7684
+7685
+7686
+7687
+7688
+7689
+7690
+7691
+7692
+7693
+7694
+7695
+7696
+7697
+7698
+7699
+7700
+7701
+7702
+7703
+7704
+7705
+7706
+7707
+7708
+7709
+7710
+7711
+7712
+7713
+7714
+7715
+7716
+7717
+7718
+7719
+7720
+7721
+7722
+7723
+7724
+7725
+7726
+7727
+7728
+7729
+7730
+7731
+7732
+7733
+7734
+7735
+7736
+7737
+7738
+7739
+7740
+7741
+7742
+7743
+7744
+7745
+7746
+7747
+7748
+7749
+7750
+7751
+7752
+7753
+7754
+7755
+7756
+7757
+7758
+7759
+7760
+7761
+7762
+7763
+7764
+7765
+7766
+7767
+7768
+7769
+7770
+7771
+7772
+7773
+7774
+7775
+7776
+7777
+7778
+7779
+7780
+7781
+7782
+7783
+7784
+7785
+7786
+7787
+7788
+7789
+7790
+7791
+7792
+7793
+7794
+7795
+7796
+7797
+7798
+7799
+7800
+7801
+7802
+7803
+7804
+7805
+7806
+7807
+7808
+7809
+7810
+7811
+7812
+7813
+7814
+7815
+7816
+7817
+7818
+7819
+7820
+7821
+7822
+7823
+7824
+7825
+7826
+7827
+7828
+7829
+7830
+7831
+7832
+7833
+7834
+7835
+7836
+7837
+7838
+7839
+7840
+7841
+7842
+7843
+7844
+7845
+7846
+7847
+7848
+7849
+7850
+7851
+7852
+7853
+7854
+7855
+7856
+7857
+7858
+7859
+7860
+7861
+7862
+7863
+7864
+7865
+7866
+7867
+7868
+7869
+7870
+7871
+7872
+7873
+7874
+7875
+7876
+7877
+7878
+7879
+7880
+7881
+7882
+7883
+7884
+7885
+7886
+7887
+7888
+7889
+7890
+7891
+7892
+7893
+7894
+7895
+7896
+7897
+7898
+7899
+7900
+7901
+7902
+7903
+7904
+7905
+7906
+7907
+7908
+7909
+7910
+7911
+7912
+7913
+7914
+7915
+7916
+7917
+7918
+7919
+7920
+7921
+7922
+7923
+7924
+7925
+7926
+7927
+7928
+7929
+7930
+7931
+7932
+7933
+7934
+7935
+7936
+7937
+7938
+7939
+7940
+7941
+7942
+7943
+7944
+7945
+7946
+7947
+7948
+7949
+7950
+7951
+7952
+7953
+7954
+7955
+7956
+7957
+7958
+7959
+7960
+7961
+7962
+7963
+7964
+7965
+7966
+7967
+7968
+7969
+7970
+7971
+7972
+7973
+7974
+7975
+7976
+7977
+7978
+7979
+7980
+7981
+7982
+7983
+7984
+7985
+7986
+7987
+7988
+7989
+7990
+7991
+7992
+7993
+7994
+7995
+7996
+7997
+7998
+7999
+8000
+8001
+8002
+8003
+8004
+8005
+8006
+8007
+8008
+8009
+8010
+8011
+8012
+8013
+8014
+8015
+8016
+8017
+8018
+8019
+8020
+8021
+8022
+8023
+8024
+8025
+8026
+8027
+8028
+8029
+8030
+8031
+8032
+8033
+8034
+8035
+8036
+8037
+8038
+8039
+8040
+8041
+8042
+8043
+8044
+8045
+8046
+8047
+8048
+8049
+8050
+8051
+8052
+8053
+8054
+8055
+8056
+8057
+8058
+8059
+8060
+8061
+8062
+8063
+8064
+8065
+8066
+8067
+8068
+8069
+8070
+8071
+8072
+8073
+8074
+8075
+8076
+8077
+8078
+8079
+8080
+8081
+8082
+8083
+8084
+8085
+8086
+8087
+8088
+8089
+8090
+8091
+8092
+8093
+8094
+8095
+8096
+8097
+8098
+8099
+8100
+8101
+8102
+8103
+8104
+8105
+8106
+8107
+8108
+8109
+8110
+8111
+8112
+8113
+8114
+8115
+8116
+8117
+8118
+8119
+8120
+8121
+8122
+8123
+8124
+8125
+8126
+8127
+8128
+8129
+8130
+8131
+8132
+8133
+8134
+8135
+8136
+8137
+8138
+8139
+8140
+8141
+8142
+8143
+8144
+8145
+8146
+8147
+8148
+8149
+8150
+8151
+8152
+8153
+8154
+8155
+8156
+8157
+8158
+8159
+8160
+8161
+8162
+8163
+8164
+8165
+8166
+8167
+8168
+8169
+8170
+8171
+8172
+8173
+8174
+8175
+8176
+8177
+8178
+8179
+8180
+8181
+8182
+8183
+8184
+8185
+8186
+8187
+8188
+8189
+8190
+8191
+8192
+8193
+8194
+8195
+8196
+8197
+8198
+8199
+8200
+8201
+8202
+8203
+8204
+8205
+8206
+8207
+8208
+8209
+8210
+8211
+8212
+8213
+8214
+8215
+8216
+8217
+8218
+8219
+8220
+8221
+8222
+8223
+8224
+8225
+8226
+8227
+8228
+8229
+8230
+8231
+8232
+8233
+8234
+8235
+8236
+8237
+8238
+8239
+8240
+8241
+8242
+8243
+8244
+8245
+8246
+8247
+8248
+8249
+8250
+8251
+8252
+8253
+8254
+8255
+8256
+8257
+8258
+8259
+8260
+8261
+8262
+8263
+8264
+8265
+8266
+8267
+8268
+8269
+8270
+8271
+8272
+8273
+8274
+8275
+8276
+8277
+8278
+8279
+8280
+8281
+8282
+8283
+8284
+8285
+8286
+8287
+8288
+8289
+8290
+8291
+8292
+8293
+8294
+8295
+8296
+8297
+8298
+8299
+8300
+8301
+8302
+8303
+8304
+8305
+8306
+8307
+8308
+8309
+8310
+8311
+8312
+8313
+8314
+8315
+8316
+8317
+8318
+8319
+8320
+8321
+8322
+8323
+8324
+8325
+8326
+8327
+8328
+8329
+8330
+8331
+8332
+8333
+8334
+8335
+8336
+8337
+8338
+8339
+8340
+8341
+8342
+8343
+8344
+8345
+8346
+8347
+8348
+8349
+8350
+8351
+8352
+8353
+8354
+8355
+8356
+8357
+8358
+8359
+8360
+8361
+8362
+8363
+8364
+8365
+8366
+8367
+8368
+8369
+8370
+8371
+8372
+8373
+8374
+8375
+8376
+8377
+8378
+8379
+8380
+8381
+8382
+8383
+8384
+8385
+8386
+8387
+8388
+8389
+8390
+8391
+8392
+8393
+8394
+8395
+8396
+8397
+8398
+8399
+8400
+8401
+8402
+8403
+8404
+8405
+8406
+8407
+8408
+8409
+8410
+8411
+8412
+8413
+8414
+8415
+8416
+8417
+8418
+8419
+8420
+8421
+8422
+8423
+8424
+8425
+8426
+8427
+8428
+8429
+8430
+8431
+8432
+8433
+8434
+8435
+8436
+8437
+8438
+8439
+8440
+8441
+8442
+8443
+8444
+8445
+8446
+8447
+8448
+8449
+8450
+8451
+8452
+8453
+8454
+8455
+8456
+8457
+8458
+8459
+8460
+8461
+8462
+8463
+8464
+8465
+8466
+8467
+8468
+8469
+8470
+8471
+8472
+8473
+8474
+8475
+8476
+8477
+8478
+8479
+8480
+8481
+8482
+8483
+8484
+8485
+8486
+8487
+8488
+8489
+8490
+8491
+8492
+8493
+8494
+8495
+8496
+8497
+8498
+8499
+8500
+8501
+8502
+8503
+8504
+8505
+8506
+8507
+8508
+8509
+8510
+8511
+8512
+8513
+8514
+8515
+8516
+8517
+8518
+8519
+8520
+8521
+8522
+8523
+8524
+8525
+8526
+8527
+8528
+8529
+8530
+8531
+8532
+8533
+8534
+8535
+8536
+8537
+8538
+8539
+8540
+8541
+8542
+8543
+8544
+8545
+8546
+8547
+8548
+8549
+8550
+8551
+8552
+8553
+8554
+8555
+8556
+8557
+8558
+8559
+8560
+8561
+8562
+8563
+8564
+8565
+8566
+8567
+8568
+8569
+8570
+8571
+8572
+8573
+8574
+8575
+8576
+8577
+8578
+8579
+8580
+8581
+8582
+8583
+8584
+8585
+8586
+8587
+8588
+8589
+8590
+8591
+8592
+8593
+8594
+8595
+8596
+8597
+8598
+8599
+8600
+8601
+8602
+8603
+8604
+8605
+8606
+8607
+8608
+8609
+8610
+8611
+8612
+8613
+8614
+8615
+8616
+8617
+8618
+8619
+8620
+8621
+8622
+8623
+8624
+8625
+8626
+8627
+8628
+8629
+8630
+8631
+8632
+8633
+8634
+8635
+8636
+8637
+8638
+8639
+8640
+8641
+8642
+8643
+8644
+8645
+8646
+8647
+8648
+8649
+8650
+8651
+8652
+8653
+8654
+8655
+8656
+8657
+8658
+8659
+8660
+8661
+8662
+8663
+8664
+8665
+8666
+8667
+8668
+8669
+8670
+8671
+8672
+8673
+8674
+8675
+8676
+8677
+8678
+8679
+8680
+8681
+8682
+8683
+8684
+8685
+8686
+8687
+8688
+8689
+8690
+8691
+8692
+8693
+8694
+8695
+8696
+8697
+8698
+8699
+8700
+8701
+8702
+8703
+8704
+8705
+8706
+8707
+8708
+8709
+8710
+8711
+8712
+8713
+8714
+8715
+8716
+8717
+8718
+8719
+8720
+8721
+8722
+8723
+8724
+8725
+8726
+8727
+8728
+8729
+8730
+8731
+8732
+8733
+8734
+8735
+8736
+8737
+8738
+8739
+8740
+8741
+8742
+8743
+8744
+8745
+8746
+8747
+8748
+8749
+8750
+8751
+8752
+8753
+8754
+8755
+8756
+8757
+8758
+8759
+8760
+8761
+8762
+8763
+8764
+8765
+8766
+8767
+8768
+8769
+8770
+8771
+8772
+8773
+8774
+8775
+8776
+8777
+8778
+8779
+8780
+8781
+8782
+8783
+8784
+8785
+8786
+8787
+8788
+8789
+8790
+8791
+8792
+8793
+8794
+8795
+8796
+8797
+8798
+8799
+8800
+8801
+8802
+8803
+8804
+8805
+8806
+8807
+8808
+8809
+8810
+8811
+8812
+8813
+8814
+8815
+8816
+8817
+8818
+8819
+8820
+8821
+8822
+8823
+8824
+8825
+8826
+8827
+8828
+8829
+8830
+8831
+8832
+8833
+8834
+8835
+8836
+8837
+8838
+8839
+8840
+8841
+8842
+8843
+8844
+8845
+8846
+8847
+8848
+8849
+8850
+8851
+8852
+8853
+8854
+8855
+8856
+8857
+8858
+8859
+8860
+8861
+8862
+8863
+8864
+8865
+8866
+8867
+8868
+8869
+8870
+8871
+8872
+8873
+8874
+8875
+8876
+8877
+8878
+8879
+8880
+8881
+8882
+8883
+8884
+8885
+8886
+8887
+8888
+8889
+8890
+8891
+8892
+8893
+8894
+8895
+8896
+8897
+8898
+8899
+8900
+8901
+8902
+8903
+8904
+8905
+8906
+8907
+8908
+8909
+8910
+8911
+8912
+8913
+8914
+8915
+8916
+8917
+8918
+8919
+8920
+8921
+8922
+8923
+8924
+8925
+8926
+8927
+8928
+8929
+8930
+8931
+8932
+8933
+8934
+8935
+8936
+8937
+8938
+8939
+8940
+8941
+8942
+8943
+8944
+8945
+8946
+8947
+8948
+8949
+8950
+8951
+8952
+8953
+8954
+8955
+8956
+8957
+8958
+8959
+8960
+8961
+8962
+8963
+8964
+8965
+8966
+8967
+8968
+8969
+8970
+8971
+8972
+8973
+8974
+8975
+8976
+8977
+8978
+8979
+8980
+8981
+8982
+8983
+8984
+8985
+8986
+8987
+8988
+8989
+8990
+8991
+8992
+8993
+8994
+8995
+8996
+8997
+8998
+8999
+9000
+9001
+9002
+9003
+9004
+9005
+9006
+9007
+9008
+9009
+9010
+9011
+9012
+9013
+9014
+9015
+9016
+9017
+9018
+9019
+9020
+9021
+9022
+9023
+9024
+9025
+9026
+9027
+9028
+9029
+9030
+9031
+9032
+9033
+9034
+9035
+9036
+9037
+9038
+9039
+9040
+9041
+9042
+9043
+9044
+9045
+9046
+9047
+9048
+9049
+9050
+9051
+9052
+9053
+9054
+9055
+9056
+9057
+9058
+9059
+9060
+9061
+9062
+9063
+9064
+9065
+9066
+9067
+9068
+9069
+9070
+9071
+9072
+9073
+9074
+9075
+9076
+9077
+9078
+9079
+9080
+9081
+9082
+9083
+9084
+9085
+9086
+9087
+9088
+9089
+9090
+9091
+9092
+9093
+9094
+9095
+9096
+9097
+9098
+9099
+9100
+9101
+9102
+9103
+9104
+9105
+9106
+9107
+9108
+9109
+9110
+9111
+9112
+9113
+9114
+9115
+9116
+9117
+9118
+9119
+9120
+9121
+9122
+9123
+9124
+9125
+9126
+9127
+9128
+9129
+9130
+9131
+9132
+9133
+9134
+9135
+9136
+9137
+9138
+9139
+9140
+9141
+9142
+9143
+9144
+9145
+9146
+9147
+9148
+9149
+9150
+9151
+9152
+9153
+9154
+9155
+9156
+9157
+9158
+9159
+9160
+9161
+9162
+9163
+9164
+9165
+9166
+9167
+9168
+9169
+9170
+9171
+9172
+9173
+9174
+9175
+9176
+9177
+9178
+9179
+9180
+9181
+9182
+9183
+9184
+9185
+9186
+9187
+9188
+9189
+9190
+9191
+9192
+9193
+9194
+9195
+9196
+9197
+9198
+9199
+9200
+9201
+9202
+9203
+9204
+9205
+9206
+9207
+9208
+9209
+9210
+9211
+9212
+9213
+9214
+9215
+9216
+9217
+9218
+9219
+9220
+9221
+9222
+9223
+9224
+9225
+9226
+9227
+9228
+9229
+9230
+9231
+9232
+9233
+9234
+9235
+9236
+9237
+9238
+9239
+9240
+9241
+9242
+9243
+9244
+9245
+9246
+9247
+9248
+9249
+9250
+9251
+9252
+9253
+9254
+9255
+9256
+9257
+9258
+9259
+9260
+9261
+9262
+9263
+9264
+9265
+9266
+9267
+9268
+9269
+9270
+9271
+9272
+9273
+9274
+9275
+9276
+9277
+9278
+9279
+9280
+9281
+9282
+9283
+9284
+9285
+9286
+9287
+9288
+9289
+9290
+9291
+9292
+9293
+9294
+9295
+9296
+9297
+9298
+9299
+9300
+9301
+9302
+9303
+9304
+9305
+9306
+9307
+9308
+9309
+9310
+9311
+9312
+9313
+9314
+9315
+9316
+9317
+9318
+9319
+9320
+9321
+9322
+9323
+9324
+9325
+9326
+9327
+9328
+9329
+9330
+9331
+9332
+9333
+9334
+9335
+9336
+9337
+9338
+9339
+9340
+9341
+9342
+9343
+9344
+9345
+9346
+9347
+9348
+9349
+9350
+9351
+9352
+9353
+9354
+9355
+9356
+9357
+9358
+9359
+9360
+9361
+9362
+9363
+9364
+9365
+9366
+9367
+9368
+9369
+9370
+9371
+9372
+9373
+9374
+9375
+9376
+9377
+9378
+9379
+9380
+9381
+9382
+9383
+9384
+9385
+9386
+9387
+9388
+9389
+9390
+9391
+9392
+9393
+9394
+9395
+9396
+9397
+9398
+9399
+9400
+9401
+9402
+9403
+9404
+9405
+9406
+9407
+9408
+9409
+9410
+9411
+9412
+9413
+9414
+9415
+9416
+9417
+9418
+9419
+9420
+9421
+9422
+9423
+9424
+9425
+9426
+9427
+9428
+9429
+9430
+9431
+9432
+9433
+9434
+9435
+9436
+9437
+9438
+9439
+9440
+9441
+9442
+9443
+9444
+9445
+9446
+9447
+9448
+9449
+9450
+9451
+9452
+9453
+9454
+9455
+9456
+9457
+9458
+9459
+9460
+9461
+9462
+9463
+9464
+9465
+9466
+9467
+9468
+9469
+9470
+9471
+9472
+9473
+9474
+9475
+9476
+9477
+9478
+9479
+9480
+9481
+9482
+9483
+9484
+9485
+9486
+9487
+9488
+9489
+9490
+9491
+9492
+9493
+9494
+9495
+9496
+9497
+9498
+9499
+9500
+9501
+9502
+9503
+9504
+9505
+9506
+9507
+9508
+9509
+9510
+9511
+9512
+9513
+9514
+9515
+9516
+9517
+9518
+9519
+9520
+9521
+9522
+9523
+9524
+9525
+9526
+9527
+9528
+9529
+9530
+9531
+9532
+9533
+9534
+9535
+9536
+9537
+9538
+9539
+9540
+9541
+9542
+9543
+9544
+9545
+9546
+9547
+9548
+9549
+9550
+9551
+9552
+9553
+9554
+9555
+9556
+9557
+9558
+9559
+9560
+9561
+9562
+9563
+9564
+9565
+9566
+9567
+9568
+9569
+9570
+9571
+9572
+9573
+9574
+9575
+9576
+9577
+9578
+9579
+9580
+9581
+9582
+9583
+9584
+9585
+9586
+9587
+9588
+9589
+9590
+9591
+9592
+9593
+9594
+9595
+9596
+9597
+9598
+9599
+9600
+9601
+9602
+9603
+9604
+9605
+9606
+9607
+9608
+9609
+9610
+9611
+9612
+9613
+9614
+9615
+9616
+9617
+9618
+9619
+9620
+9621
+9622
+9623
+9624
+9625
+9626
+9627
+9628
+9629
+9630
+9631
+9632
+9633
+9634
+9635
+9636
+9637
+9638
+9639
+9640
+9641
+9642
+9643
+9644
+9645
+9646
+9647
+9648
+9649
+9650
+9651
+9652
+9653
+9654
+9655
+9656
+9657
+9658
+9659
+9660
+9661
+9662
+9663
+9664
+9665
+9666
+9667
+9668
+9669
+9670
+9671
+9672
+9673
+9674
+9675
+9676
+9677
+9678
+9679
+9680
+9681
+9682
+9683
+9684
+9685
+9686
+9687
+9688
+9689
+9690
+9691
+9692
+9693
+9694
+9695
+9696
+9697
+9698
+9699
+9700
+9701
+9702
+9703
+9704
+9705
+9706
+9707
+9708
+9709
+9710
+9711
+9712
+9713
+9714
+9715
+9716
+9717
+9718
+9719
+9720
+9721
+9722
+9723
+9724
+9725
+9726
+9727
+9728
+9729
+9730
+9731
+9732
+9733
+9734
+9735
+9736
+9737
+9738
+9739
+9740
+9741
+9742
+9743
+9744
+9745
+9746
+9747
+9748
+9749
+9750
+9751
+9752
+9753
+9754
+9755
+9756
+9757
+9758
+9759
+9760
+9761
+9762
+9763
+9764
+9765
+9766
+9767
+9768
+9769
+9770
+9771
+9772
+9773
+9774
+9775
+9776
+9777
+9778
+9779
+9780
+9781
+9782
+9783
+9784
+9785
+9786
+9787
+9788
+9789
+9790
+9791
+9792
+9793
+9794
+9795
+9796
+9797
+9798
+9799
+9800
+9801
+9802
+9803
+9804
+9805
+9806
+9807
+9808
+9809
+9810
+9811
+9812
+9813
+9814
+9815
+9816
+9817
+9818
+9819
+9820
+9821
+9822
+9823
+9824
+9825
+9826
+9827
+9828
+9829
+9830
+9831
+9832
+9833
+9834
+9835
+9836
+9837
+9838
+9839
+9840
+9841
+9842
+9843
+9844
+9845
+9846
+9847
+9848
+9849
+9850
+9851
+9852
+9853
+9854
+9855
+9856
+9857
+9858
+9859
+9860
+9861
+9862
+9863
+9864
+9865
+9866
+9867
+9868
+9869
+9870
+9871
+9872
+9873
+9874
+9875
+9876
+9877
+9878
+9879
+9880
+9881
+9882
+9883
+9884
+9885
+9886
+9887
+9888
+9889
+9890
+9891
+9892
+9893
+9894
+9895
+9896
+9897
+9898
+9899
+9900
+9901
+9902
+9903
+9904
+9905
+9906
+9907
+9908
+9909
+9910
+9911
+9912
+9913
+9914
+9915
+9916
+9917
+9918
+9919
+9920
+9921
+9922
+9923
+9924
+9925
+9926
+9927
+9928
+9929
+9930
+9931
+9932
+9933
+9934
+9935
+9936
+9937
+9938
+9939
+9940
+9941
+9942
+9943
+9944
+9945
+9946
+9947
+9948
+9949
+9950
+9951
+9952
+9953
+9954
+9955
+9956
+9957
+9958
+9959
+9960
+9961
+9962
+9963
+9964
+9965
+9966
+9967
+9968
+9969
+9970
+9971
+9972
+9973
+9974
+9975
+9976
+9977
+9978
+9979
+9980
+9981
+9982
+9983
+9984
+9985
+9986
+9987
+9988
+9989
+9990
+9991
+9992
+9993
+9994
+9995
+9996
+9997
+9998
+9999
+10000
+10001
+10002
+10003
+10004
+10005
+10006
+10007
+10008
+10009
+10010
+10011
+10012
+10013
+10014
+10015
+10016
+10017
+10018
+10019
+10020
+10021
+10022
+10023
+10024
+10025
+10026
+10027
+10028
+10029
+10030
+10031
+10032
+10033
+10034
+10035
+10036
+10037
+10038
+10039
+10040
+10041
+10042
+10043
+10044
+10045
+10046
+10047
+10048
+10049
+10050
+10051
+10052
+10053
+10054
+10055
+10056
+10057
+10058
+10059
+10060
+10061
+10062
+10063
+10064
+10065
+10066
+10067
+10068
+10069
+10070
+10071
+10072
+10073
+10074
+10075
+10076
+10077
+10078
+10079
+10080
+10081
+10082
+10083
+10084
+10085
+10086
+10087
+10088
+10089
+10090
+10091
+10092
+10093
+10094
+10095
+10096
+10097
+10098
+10099
+10100
+10101
+10102
+10103
+10104
+10105
+10106
+10107
+10108
+10109
+10110
+10111
+10112
+10113
+10114
+10115
+10116
+10117
+10118
+10119
+10120
+10121
+10122
+10123
+10124
+10125
+10126
+10127
+10128
+10129
+10130
+10131
+10132
+10133
+10134
+10135
+10136
+10137
+10138
+10139
+10140
+10141
+10142
+10143
+10144
+10145
+10146
+10147
+10148
+10149
+10150
+10151
+10152
+10153
+10154
+10155
+10156
+10157
+10158
+10159
+10160
+10161
+10162
+10163
+10164
+10165
+10166
+10167
+10168
+10169
+10170
+10171
+10172
+10173
+10174
+10175
+10176
+10177
+10178
+10179
+10180
+10181
+10182
+10183
+10184
+10185
+10186
+10187
+10188
+10189
+10190
+10191
+10192
+10193
+10194
+10195
+10196
+10197
+10198
+10199
+10200
+10201
+10202
+10203
+10204
+10205
+10206
+10207
+10208
+10209
+10210
+10211
+10212
+10213
+10214
+10215
+10216
+10217
+10218
+10219
+10220
+10221
+10222
+10223
+10224
+10225
+10226
+10227
+10228
+10229
+10230
+10231
+10232
+10233
+10234
+10235
+10236
+10237
+10238
+10239
+10240
+10241
+10242
+10243
+10244
+10245
+10246
+10247
+10248
+10249
+10250
+10251
+10252
+10253
+10254
+10255
+10256
+10257
+10258
+10259
+10260
+10261
+10262
+10263
+10264
+10265
+10266
+10267
+10268
+10269
+10270
+10271
+10272
+10273
+10274
+10275
+10276
+10277
+10278
+10279
+10280
+10281
+10282
+10283
+10284
+10285
+10286
+10287
+10288
+10289
+10290
+10291
+10292
+10293
+10294
+10295
+10296
+10297
+10298
+10299
+10300
+10301
+10302
+10303
+10304
+10305
+10306
+10307
+10308
+10309
+10310
+10311
+10312
+10313
+10314
+10315
+10316
+10317
+10318
+10319
+10320
+10321
+10322
+10323
+10324
+10325
+10326
+10327
+10328
+10329
+10330
+10331
+10332
+10333
+10334
+10335
+10336
+10337
+10338
+10339
+10340
+10341
+10342
+10343
+10344
+10345
+10346
+10347
+10348
+10349
+10350
+10351
+10352
+10353
+10354
+10355
+10356
+10357
+10358
+10359
+10360
+10361
+10362
+10363
+10364
+10365
+10366
+10367
+10368
+10369
+10370
+10371
+10372
+10373
+10374
+10375
+10376
+10377
+10378
+10379
+10380
+10381
+10382
+10383
+10384
+10385
+10386
+10387
+10388
+10389
+10390
+10391
+10392
+10393
+10394
+10395
+10396
+10397
+10398
+10399
+10400
+10401
+10402
+10403
+10404
+10405
+10406
+10407
+10408
+10409
+10410
+10411
+10412
+10413
+10414
+10415
+10416
+10417
+10418
+10419
+10420
+10421
+10422
+10423
+10424
+10425
+10426
+10427
+10428
+10429
+10430
+10431
+10432
+10433
+10434
+10435
+10436
+10437
+10438
+10439
+10440
+10441
+10442
+10443
+10444
+10445
+10446
+10447
+10448
+10449
+10450
+10451
+10452
+10453
+10454
+10455
+10456
+10457
+10458
+10459
+10460
+10461
+10462
+10463
+10464
+10465
+10466
+10467
+10468
+10469
+10470
+10471
+10472
+10473
+10474
+10475
+10476
+10477
+10478
+10479
+10480
+10481
+10482
+10483
+10484
+10485
+10486
+10487
+10488
+10489
+10490
+10491
+10492
+10493
+10494
+10495
+10496
+10497
+10498
+10499
+10500
+10501
+10502
+10503
+10504
+10505
+10506
+10507
+10508
+10509
+10510
+10511
+10512
+10513
+10514
+10515
+10516
+10517
+10518
+10519
+10520
+10521
+10522
+10523
+10524
+10525
+10526
+10527
+10528
+10529
+10530
+10531
+10532
+10533
+10534
+10535
+10536
+10537
+10538
+10539
+10540
+10541
+10542
+10543
+10544
+10545
+10546
+10547
+10548
+10549
+10550
+10551
+10552
+10553
+10554
+10555
+10556
+10557
+10558
+10559
+10560
+10561
+10562
+10563
+10564
+10565
+10566
+10567
+10568
+10569
+10570
+10571
+10572
+10573
+10574
+10575
+10576
+10577
+10578
+10579
+10580
+10581
+10582
+10583
+10584
+10585
+10586
+10587
+10588
+10589
+10590
+10591
+10592
+10593
+10594
+10595
+10596
+10597
+10598
+10599
+10600
+10601
+10602
+10603
+10604
+10605
+10606
+10607
+10608
+10609
+10610
+10611
+10612
+10613
+10614
+10615
+10616
+10617
+10618
+10619
+10620
+10621
+10622
+10623
+10624
+10625
+10626
+10627
+10628
+10629
+10630
+10631
+10632
+10633
+10634
+10635
+10636
+10637
+10638
+10639
+10640
+10641
+10642
+10643
+10644
+10645
+10646
+10647
+10648
+10649
+10650
+10651
+10652
+10653
+10654
+10655
+10656
+10657
+10658
+10659
+10660
+10661
+10662
+10663
+10664
+10665
+10666
+10667
+10668
+10669
+10670
+10671
+10672
+10673
+10674
+10675
+10676
+10677
+10678
+10679
+10680
+10681
+10682
+10683
+10684
+10685
+10686
+10687
+10688
+10689
+10690
+10691
+10692
+10693
+10694
+10695
+10696
+10697
+10698
+10699
+10700
+10701
+10702
+10703
+10704
+10705
+10706
+10707
+10708
+10709
+10710
+10711
+10712
+10713
+10714
+10715
+10716
+10717
+10718
+10719
+10720
+10721
+10722
+10723
+10724
+10725
+10726
+10727
+10728
+10729
+10730
+10731
+10732
+10733
+10734
+10735
+10736
+10737
+10738
+10739
+10740
+10741
+10742
+10743
+10744
+10745
+10746
+10747
+10748
+10749
+10750
+10751
+10752
+10753
+10754
+10755
+10756
+10757
+10758
+10759
+10760
+10761
+10762
+10763
+10764
+10765
+10766
+10767
+10768
+10769
+10770
+10771
+10772
+10773
+10774
+10775
+10776
+10777
+10778
+10779
+10780
+10781
+10782
+10783
+10784
+10785
+10786
+10787
+10788
+10789
+10790
+10791
+10792
+10793
+10794
+10795
+10796
+10797
+10798
+10799
+10800
+10801
+10802
+10803
+10804
+10805
+10806
+10807
+10808
+10809
+10810
+10811
+10812
+10813
+10814
+10815
+10816
+10817
+10818
+10819
+10820
+10821
+10822
+10823
+10824
+10825
+10826
+10827
+10828
+10829
+10830
+10831
+10832
+10833
+10834
+10835
+10836
+10837
+10838
+10839
+10840
+10841
+10842
+10843
+10844
+10845
+10846
+10847
+10848
+10849
+10850
+10851
+10852
+10853
+10854
+10855
+10856
+10857
+10858
+10859
+10860
+10861
+10862
+10863
+10864
+10865
+10866
+10867
+10868
+10869
+10870
+10871
+10872
+10873
+10874
+10875
+10876
+10877
+10878
+10879
+10880
+10881
+10882
+10883
+10884
+10885
+10886
+10887
+10888
+10889
+10890
+10891
+10892
+10893
+10894
+10895
+10896
+10897
+10898
+10899
+10900
+10901
+10902
+10903
+10904
+10905
+10906
+10907
+10908
+10909
+10910
+10911
+10912
+10913
+10914
+10915
+10916
+10917
+10918
+10919
+10920
+10921
+10922
+10923
+10924
+10925
+10926
+10927
+10928
+10929
+10930
+10931
+10932
+10933
+10934
+10935
+10936
+10937
+10938
+10939
+10940
+10941
+10942
+10943
+10944
+10945
+10946
+10947
+10948
+10949
+10950
+10951
+10952
+10953
+10954
+10955
+10956
+10957
+10958
+10959
+10960
+10961
+10962
+10963
+10964
+10965
+10966
+10967
+10968
+10969
+10970
+10971
+10972
+10973
+10974
+10975
+10976
+10977
+10978
+10979
+10980
+10981
+10982
+10983
+10984
+10985
+10986
+10987
+10988
+10989
+10990
+10991
+10992
+10993
+10994
+10995
+10996
+10997
+10998
+10999
+11000
+11001
+11002
+11003
+11004
+11005
+11006
+11007
+11008
+11009
+11010
+11011
+11012
+11013
+11014
+11015
+11016
+11017
+11018
+11019
+11020
+11021
+11022
+11023
+11024
+11025
+11026
+11027
+11028
+11029
+11030
+11031
+11032
+11033
+11034
+11035
+11036
+11037
+11038
+11039
+11040
+11041
+11042
+11043
+11044
+11045
+11046
+11047
+11048
+11049
+11050
+11051
+11052
+11053
+11054
+11055
+11056
+11057
+11058
+11059
+11060
+11061
+11062
+11063
+11064
+11065
+11066
+11067
+11068
+11069
+11070
+11071
+11072
+11073
+11074
+11075
+11076
+11077
+11078
+11079
+11080
+11081
+11082
+11083
+11084
+11085
+11086
+11087
+11088
+11089
+11090
+11091
+11092
+11093
+11094
+11095
+11096
+11097
+11098
+11099
+11100
+11101
+11102
+11103
+11104
+11105
+11106
+11107
+11108
+11109
+11110
+11111
+11112
+11113
+11114
+11115
+11116
+11117
+11118
+11119
+11120
+11121
+11122
+11123
+11124
+11125
+11126
+11127
+11128
+11129
+11130
+11131
+11132
+11133
+11134
+11135
+11136
+11137
+11138
+11139
+11140
+11141
+11142
+11143
+11144
+11145
+11146
+11147
+11148
+11149
+11150
+11151
+11152
+11153
+11154
+11155
+11156
+11157
+11158
+11159
+11160
+11161
+11162
+11163
+11164
+11165
+11166
+11167
+11168
+11169
+11170
+11171
+11172
+11173
+11174
+11175
+11176
+11177
+11178
+11179
+11180
+11181
+11182
+11183
+11184
+11185
+11186
+11187
+11188
+11189
+11190
+11191
+11192
+11193
+11194
+11195
+11196
+11197
+11198
+11199
+11200
+11201
+11202
+11203
+11204
+11205
+11206
+11207
+11208
+11209
+11210
+11211
+11212
+11213
+11214
+11215
+11216
+11217
+11218
+11219
+11220
+11221
+11222
+11223
+11224
+11225
+11226
+11227
+11228
+11229
+11230
+11231
+11232
+11233
+11234
+11235
+11236
+11237
+11238
+11239
+11240
+11241
+11242
+11243
+11244
+11245
+11246
+11247
+11248
+11249
+11250
+11251
+11252
+11253
+11254
+11255
+11256
+11257
+11258
+11259
+11260
+11261
+11262
+11263
+11264
+11265
+11266
+11267
+11268
+11269
+11270
+11271
+11272
+11273
+11274
+11275
+11276
+11277
+11278
+11279
+11280
+11281
+11282
+11283
+11284
+11285
+11286
+11287
+11288
+11289
+11290
+11291
+11292
+11293
+11294
+11295
+11296
+11297
+11298
+11299
+11300
+11301
+11302
+11303
+11304
+11305
+11306
+11307
+11308
+11309
+11310
+11311
+11312
+11313
+11314
+11315
+11316
+11317
+11318
+11319
+11320
+11321
+11322
+11323
+11324
+11325
+11326
+11327
+11328
+11329
+11330
+11331
+11332
+11333
+11334
+11335
+11336
+11337
+11338
+11339
+11340
+11341
+11342
+11343
+11344
+11345
+11346
+11347
+11348
+11349
+11350
+11351
+11352
+11353
+11354
+11355
+11356
+11357
+11358
+11359
+11360
+11361
+11362
+11363
+11364
+11365
+11366
+11367
+11368
+11369
+11370
+11371
+11372
+11373
+11374
+11375
+11376
+11377
+11378
+11379
+11380
+11381
+11382
+11383
+11384
+11385
+11386
+11387
+11388
+11389
+11390
+11391
+11392
+11393
+11394
+11395
+11396
+11397
+11398
+11399
+11400
+11401
+11402
+11403
+11404
+11405
+11406
+11407
+11408
+11409
+11410
+11411
+11412
+11413
+11414
+11415
+11416
+11417
+11418
+11419
+11420
+11421
+11422
+11423
+11424
+11425
+11426
+11427
+11428
+11429
+11430
+11431
+11432
+11433
+11434
+11435
+11436
+11437
+11438
+11439
+11440
+11441
+11442
+11443
+11444
+11445
+11446
+11447
+11448
+11449
+11450
+11451
+11452
+11453
+11454
+11455
+11456
+11457
+11458
+11459
+11460
+11461
+11462
+11463
+11464
+11465
+11466
+11467
+11468
+11469
+11470
+11471
+11472
+11473
+11474
+11475
+11476
+11477
+11478
+11479
+11480
+11481
+11482
+11483
+11484
+11485
+11486
+11487
+11488
+11489
+11490
+11491
+11492
+11493
+11494
+11495
+11496
+11497
+11498
+11499
+11500
+11501
+11502
+11503
+11504
+11505
+11506
+11507
+11508
+11509
+11510
+11511
+11512
+11513
+11514
+11515
+11516
+11517
+11518
+11519
+11520
+11521
+11522
+11523
+11524
+11525
+11526
+11527
+11528
+11529
+11530
+11531
+11532
+11533
+11534
+11535
+11536
+11537
+11538
+11539
+11540
+11541
+11542
+11543
+11544
+11545
+11546
+11547
+11548
+11549
+11550
+11551
+11552
+11553
+11554
+11555
+11556
+11557
+11558
+11559
+11560
+11561
+11562
+11563
+11564
+11565
+11566
+11567
+11568
+11569
+11570
+11571
+11572
+11573
+11574
+11575
+11576
+11577
+11578
+11579
+11580
+11581
+11582
+11583
+11584
+11585
+11586
+11587
+11588
+11589
+11590
+11591
+11592
+11593
+11594
+11595
+11596
+11597
+11598
+11599
+11600
+11601
+11602
+11603
+11604
+11605
+11606
+11607
+11608
+11609
+11610
+11611
+11612
+11613
+11614
+11615
+11616
+11617
+11618
+11619
+11620
+11621
+11622
+11623
+11624
+11625
+11626
+11627
+11628
+11629
+11630
+11631
+11632
+11633
+11634
+11635
+11636
+11637
+11638
+11639
+11640
+11641
+11642
+11643
+11644
+11645
+11646
+11647
+11648
+11649
+11650
+11651
+11652
+11653
+11654
+11655
+11656
+11657
+11658
+11659
+11660
+11661
+11662
+11663
+11664
+11665
+11666
+11667
+11668
+11669
+11670
+11671
+11672
+11673
+11674
+11675
+11676
+11677
+11678
+11679
+11680
+11681
+11682
+11683
+11684
+11685
+11686
+11687
+11688
+11689
+11690
+11691
+11692
+11693
+11694
+11695
+11696
+11697
+11698
+11699
+11700
+11701
+11702
+11703
+11704
+11705
+11706
+11707
+11708
+11709
+11710
+11711
+11712
+11713
+11714
+11715
+11716
+11717
+11718
+11719
+11720
+11721
+11722
+11723
+11724
+11725
+11726
+11727
+11728
+11729
+11730
+11731
+11732
+11733
+11734
+11735
+11736
+11737
+11738
+11739
+11740
+11741
+11742
+11743
+11744
+11745
+11746
+11747
+11748
+11749
+11750
+11751
+11752
+11753
+11754
+11755
+11756
+11757
+11758
+11759
+11760
+11761
+11762
+11763
+11764
+11765
+11766
+11767
+11768
+11769
+11770
+11771
+11772
+11773
+11774
+11775
+11776
+11777
+11778
+11779
+11780
+11781
+11782
+11783
+11784
+11785
+11786
+11787
+11788
+11789
+11790
+11791
+11792
+11793
+11794
+11795
+11796
+11797
+11798
+11799
+11800
+11801
+11802
+11803
+11804
+11805
+11806
+11807
+11808
+11809
+11810
+11811
+11812
+11813
+11814
+11815
+11816
+11817
+11818
+11819
+11820
+11821
+11822
+11823
+11824
+11825
+11826
+11827
+11828
+11829
+11830
+11831
+11832
+11833
+11834
+11835
+11836
+11837
+11838
+11839
+11840
+11841
+11842
+11843
+11844
+11845
+11846
+11847
+11848
+11849
+11850
+11851
+11852
+11853
+11854
+11855
+11856
+11857
+11858
+11859
+11860
+11861
+11862
+11863
+11864
+11865
+11866
+11867
+11868
+11869
+11870
+11871
+11872
+11873
+11874
+11875
+11876
+11877
+11878
+11879
+11880
+11881
+11882
+11883
+11884
+11885
+11886
+11887
+11888
+11889
+11890
+11891
+11892
+11893
+11894
+11895
+11896
+11897
+11898
+11899
+11900
+11901
+11902
+11903
+11904
+11905
+11906
+11907
+11908
+11909
+11910
+11911
+11912
+11913
+11914
+11915
+11916
+11917
+11918
+11919
+11920
+11921
+11922
+11923
+11924
+11925
+11926
+11927
+11928
+11929
+11930
+11931
+11932
+11933
+11934
+11935
+11936
+11937
+11938
+11939
+11940
+11941
+11942
+11943
+11944
+11945
+11946
+11947
+11948
+11949
+11950
+11951
+11952
+11953
+11954
+11955
+11956
+11957
+11958
+11959
+11960
+11961
+11962
+11963
+11964
+11965
+11966
+11967
+11968
+11969
+11970
+11971
+11972
+11973
+11974
+11975
+11976
+11977
+11978
+11979
+11980
+11981
+11982
+11983
+11984
+11985
+11986
+11987
+11988
+11989
+11990
+11991
+11992
+11993
+11994
+11995
+11996
+11997
+11998
+11999
+12000
+12001
+12002
+12003
+12004
+12005
+12006
+12007
+12008
+12009
+12010
+12011
+12012
+12013
+12014
+12015
+12016
+12017
+12018
+12019
+12020
+12021
+12022
+12023
+12024
+12025
+12026
+12027
+12028
+12029
+12030
+12031
+12032
+12033
+12034
+12035
+12036
+12037
+12038
+12039
+12040
+12041
+12042
+12043
+12044
+12045
+12046
+12047
+12048
+12049
+12050
+12051
+12052
+12053
+12054
+12055
+12056
+12057
+12058
+12059
+12060
+12061
+12062
+12063
+12064
+12065
+12066
+12067
+12068
+12069
+12070
+12071
+12072
+12073
+12074
+12075
+12076
+12077
+12078
+12079
+12080
+12081
+12082
+12083
+12084
+12085
+12086
+12087
+12088
+12089
+12090
+12091
+12092
+12093
+12094
+12095
+12096
+12097
+12098
+12099
+12100
+12101
+12102
+12103
+12104
+12105
+12106
+12107
+12108
+12109
+12110
+12111
+12112
+12113
+12114
+12115
+12116
+12117
+12118
+12119
+12120
+12121
+12122
+12123
+12124
+12125
+12126
+12127
+12128
+12129
+12130
+12131
+12132
+12133
+12134
+12135
+12136
+12137
+12138
+12139
+12140
+12141
+12142
+12143
+12144
+12145
+12146
+12147
+12148
+12149
+12150
+12151
+12152
+12153
+12154
+12155
+12156
+12157
+12158
+12159
+12160
+12161
+12162
+12163
+12164
+12165
+12166
+12167
+12168
+12169
+12170
+12171
+12172
+12173
+12174
+12175
+12176
+12177
+12178
+12179
+12180
+12181
+12182
+12183
+12184
+12185
+12186
+12187
+12188
+12189
+12190
+12191
+12192
+12193
+12194
+12195
+12196
+12197
+12198
+12199
+12200
+12201
+12202
+12203
+12204
+12205
+12206
+12207
+12208
+12209
+12210
+12211
+12212
+12213
+12214
+12215
+12216
+12217
+12218
+12219
+12220
+12221
+12222
+12223
+12224
+12225
+12226
+12227
+12228
+12229
+12230
+12231
+12232
+12233
+12234
+12235
+12236
+12237
+12238
+12239
+12240
+12241
+12242
+12243
+12244
+12245
+12246
+12247
+12248
+12249
+12250
+12251
+12252
+12253
+12254
+12255
+12256
+12257
+12258
+12259
+12260
+12261
+12262
+12263
+12264
+12265
+12266
+12267
+12268
+12269
+12270
+12271
+12272
+12273
+12274
+12275
+12276
+12277
+12278
+12279
+12280
+12281
+12282
+12283
+12284
+12285
+12286
+12287
+12288
+12289
+12290
+12291
+12292
+12293
+12294
+12295
+12296
+12297
+12298
+12299
+12300
+12301
+12302
+12303
+12304
+12305
+12306
+12307
+12308
+12309
+12310
+12311
+12312
+12313
+12314
+12315
+12316
+12317
+12318
+12319
+12320
+12321
+12322
+12323
+12324
+12325
+12326
+12327
+12328
+12329
+12330
+12331
+12332
+12333
+12334
+12335
+12336
+12337
+12338
+12339
+12340
+12341
+12342
+12343
+12344
+12345
+12346
+12347
+12348
+12349
+12350
+12351
+12352
+12353
+12354
+12355
+12356
+12357
+12358
+12359
+12360
+12361
+12362
+12363
+12364
+12365
+12366
+12367
+12368
+12369
+12370
+12371
+12372
+12373
+12374
+12375
+12376
+12377
+12378
+12379
+12380
+12381
+12382
+12383
+12384
+12385
+12386
+12387
+12388
+12389
+12390
+12391
+12392
+12393
+12394
+12395
+12396
+12397
+12398
+12399
+12400
+12401
+12402
+12403
+12404
+12405
+12406
+12407
+12408
+12409
+12410
+12411
+12412
+12413
+12414
+12415
+12416
+12417
+12418
+12419
+12420
+12421
+12422
+12423
+12424
+12425
+12426
+12427
+12428
+12429
+12430
+12431
+12432
+12433
+12434
+12435
+12436
+12437
+12438
+12439
+12440
+12441
+12442
+12443
+12444
+12445
+12446
+12447
+12448
+12449
+12450
+12451
+12452
+12453
+12454
+12455
+12456
+12457
+12458
+12459
+12460
+12461
+12462
+12463
+12464
+12465
+12466
+12467
+12468
+12469
+12470
+12471
+12472
+12473
+12474
+12475
+12476
+12477
+12478
+12479
+12480
+12481
+12482
+12483
+12484
+12485
+12486
+12487
+12488
+12489
+12490
+12491
+12492
+12493
+12494
+12495
+12496
+12497
+12498
+12499
+12500
+12501
+12502
+12503
+12504
+12505
+12506
+12507
+12508
+12509
+12510
+12511
+12512
+12513
+12514
+12515
+12516
+12517
+12518
+12519
+12520
+12521
+12522
+12523
+12524
+12525
+12526
+12527
+12528
+12529
+12530
+12531
+12532
+12533
+12534
+12535
+12536
+12537
+12538
+12539
+12540
+12541
+12542
+12543
+12544
+12545
+12546
+12547
+12548
+12549
+12550
+12551
+12552
+12553
+12554
+12555
+12556
+12557
+12558
+12559
+12560
+12561
+12562
+12563
+12564
+12565
+12566
+12567
+12568
+12569
+12570
+12571
+12572
+12573
+12574
+12575
+12576
+12577
+12578
+12579
+12580
+12581
+12582
+12583
+12584
+12585
+12586
+12587
+12588
+12589
+12590
+12591
+12592
+12593
+12594
+12595
+12596
+12597
+12598
+12599
+12600
+12601
+12602
+12603
+12604
+12605
+12606
+12607
+12608
+12609
+12610
+12611
+12612
+12613
+12614
+12615
+12616
+12617
+12618
+12619
+12620
+12621
+12622
+12623
+12624
+12625
+12626
+12627
+12628
+12629
+12630
+12631
+12632
+12633
+12634
+12635
+12636
+12637
+12638
+12639
+12640
+12641
+12642
+12643
+12644
+12645
+12646
+12647
+12648
+12649
+12650
+12651
+12652
+12653
+12654
+12655
+12656
+12657
+12658
+12659
+12660
+12661
+12662
+12663
+12664
+12665
+12666
+12667
+12668
+12669
+12670
+12671
+12672
+12673
+12674
+12675
+12676
+12677
+12678
+12679
+12680
+12681
+12682
+12683
+12684
+12685
+12686
+12687
+12688
+12689
+12690
+12691
+12692
+12693
+12694
+12695
+12696
+12697
+12698
+12699
+12700
+12701
+12702
+12703
+12704
+12705
+12706
+12707
+12708
+12709
+12710
+12711
+12712
+12713
+12714
+12715
+12716
+12717
+12718
+12719
+12720
+12721
+12722
+12723
+12724
+12725
+12726
+12727
+12728
+12729
+12730
+12731
+12732
+12733
+12734
+12735
+12736
+12737
+12738
+12739
+12740
+12741
+12742
+12743
+12744
+12745
+12746
+12747
+12748
+12749
+12750
+12751
+12752
+12753
+12754
+12755
+12756
+12757
+12758
+12759
+12760
+12761
+12762
+12763
+12764
+12765
+12766
+12767
+12768
+12769
+12770
+12771
+12772
+12773
+12774
+12775
+12776
+12777
+12778
+12779
+12780
+12781
+12782
+12783
+12784
+12785
+12786
+12787
+12788
+12789
+12790
+12791
+12792
+12793
+12794
+12795
+12796
+12797
+12798
+12799
+12800
+12801
+12802
+12803
+12804
+12805
+12806
+12807
+12808
+12809
+12810
+12811
+12812
+12813
+12814
+12815
+12816
+12817
+12818
+12819
+12820
+12821
+12822
+12823
+12824
+12825
+12826
+12827
+12828
+12829
+12830
+12831
+12832
+12833
+12834
+12835
+12836
+12837
+12838
+12839
+12840
+12841
+12842
+12843
+12844
+12845
+12846
+12847
+12848
+12849
+12850
+12851
+12852
+12853
+12854
+12855
+12856
+12857
+12858
+12859
+12860
+12861
+12862
+12863
+12864
+12865
+12866
+12867
+12868
+12869
+12870
+12871
+12872
+12873
+12874
+12875
+12876
+12877
+12878
+12879
+12880
+12881
+12882
+12883
+12884
+12885
+12886
+12887
+12888
+12889
+12890
+12891
+12892
+12893
+12894
+12895
+12896
+12897
+12898
+12899
+12900
+12901
+12902
+12903
+12904
+12905
+12906
+12907
+12908
+12909
+12910
+12911
+12912
+12913
+12914
+12915
+12916
+12917
+12918
+12919
+12920
+12921
+12922
+12923
+12924
+12925
+12926
+12927
+12928
+12929
+12930
+12931
+12932
+12933
+12934
+12935
+12936
+12937
+12938
+12939
+12940
+12941
+12942
+12943
+12944
+12945
+12946
+12947
+12948
+12949
+12950
+12951
+12952
+12953
+12954
+12955
+12956
+12957
+12958
+12959
+12960
+12961
+12962
+12963
+12964
+12965
+12966
+12967
+12968
+12969
+12970
+12971
+12972
+12973
+12974
+12975
+12976
+12977
+12978
+12979
+12980
+12981
+12982
+12983
+12984
+12985
+12986
+12987
+12988
+12989
+12990
+12991
+12992
+12993
+12994
+12995
+12996
+12997
+12998
+12999
+13000
+13001
+13002
+13003
+13004
+13005
+13006
+13007
+13008
+13009
+13010
+13011
+13012
+13013
+13014
+13015
+13016
+13017
+13018
+13019
+13020
+13021
+13022
+13023
+13024
+13025
+13026
+13027
+13028
+13029
+13030
+13031
+13032
+13033
+13034
+13035
+13036
+13037
+13038
+13039
+13040
+13041
+13042
+13043
+13044
+13045
+13046
+13047
+13048
+13049
+13050
+13051
+13052
+13053
+13054
+13055
+13056
+13057
+13058
+13059
+13060
+13061
+13062
+13063
+13064
+13065
+13066
+13067
+13068
+13069
+13070
+13071
+13072
+13073
+13074
+13075
+13076
+13077
+13078
+13079
+13080
+13081
+13082
+13083
+13084
+13085
+13086
+13087
+13088
+13089
+13090
+13091
+13092
+13093
+13094
+13095
+13096
+13097
+13098
+13099
+13100
+13101
+13102
+13103
+13104
+13105
+13106
+13107
+13108
+13109
+13110
+13111
+13112
+13113
+13114
+13115
+13116
+13117
+13118
+13119
+13120
+13121
+13122
+13123
+13124
+13125
+13126
+13127
+13128
+13129
+13130
+13131
+13132
+13133
+13134
+13135
+13136
+13137
+13138
+13139
+13140
+13141
+13142
+13143
+13144
+13145
+13146
+13147
+13148
+13149
+13150
+13151
+13152
+13153
+13154
+13155
+13156
+13157
+13158
+13159
+13160
+13161
+13162
+13163
+13164
+13165
+13166
+13167
+13168
+13169
+13170
+13171
+13172
+13173
+13174
+13175
+13176
+13177
+13178
+13179
+13180
+13181
+13182
+13183
+13184
+13185
+13186
+13187
+13188
+13189
+13190
+13191
+13192
+13193
+13194
+13195
+13196
+13197
+13198
+13199
+13200
+13201
+13202
+13203
+13204
+13205
+13206
+13207
+13208
+13209
+13210
+13211
+13212
+13213
+13214
+13215
+13216
+13217
+13218
+13219
+13220
+13221
+13222
+13223
+13224
+13225
+13226
+13227
+13228
+13229
+13230
+13231
+13232
+13233
+13234
+13235
+13236
+13237
+13238
+13239
+13240
+13241
+13242
+13243
+13244
+13245
+13246
+13247
+13248
+13249
+13250
+13251
+13252
+13253
+13254
+13255
+13256
+13257
+13258
+13259
+13260
+13261
+13262
+13263
+13264
+13265
+13266
+13267
+13268
+13269
+13270
+13271
+13272
+13273
+13274
+13275
+13276
+13277
+13278
+13279
+13280
+13281
+13282
+13283
+13284
+13285
+13286
+13287
+13288
+13289
+13290
+13291
+13292
+13293
+13294
+13295
+13296
+13297
+13298
+13299
+13300
+13301
+13302
+13303
+13304
+13305
+13306
+13307
+13308
+13309
+13310
+13311
+13312
+13313
+13314
+13315
+13316
+13317
+13318
+13319
+13320
+13321
+13322
+13323
+13324
+13325
+13326
+13327
+13328
+13329
+13330
+13331
+13332
+13333
+13334
+13335
+13336
+13337
+13338
+13339
+13340
+13341
+13342
+13343
+13344
+13345
+13346
+13347
+13348
+13349
+13350
+13351
+13352
+13353
+13354
+13355
+13356
+13357
+13358
+13359
+13360
+13361
+13362
+13363
+13364
+13365
+13366
+13367
+13368
+13369
+13370
+13371
+13372
+13373
+13374
+13375
+13376
+13377
+13378
+13379
+13380
+13381
+13382
+13383
+13384
+13385
+13386
+13387
+13388
+13389
+13390
+13391
+13392
+13393
+13394
+13395
+13396
+13397
+13398
+13399
+13400
+13401
+13402
+13403
+13404
+13405
+13406
+13407
+13408
+13409
+13410
+13411
+13412
+13413
+13414
+13415
+13416
+13417
+13418
+13419
+13420
+13421
+13422
+13423
+13424
+13425
+13426
+13427
+13428
+13429
+13430
+13431
+13432
+13433
+13434
+13435
+13436
+13437
+13438
+13439
+13440
+13441
+13442
+13443
+13444
+13445
+13446
+13447
+13448
+13449
+13450
+13451
+13452
+13453
+13454
+13455
+13456
+13457
+13458
+13459
+13460
+13461
+13462
+13463
+13464
+13465
+13466
+13467
+13468
+13469
+13470
+13471
+13472
+13473
+13474
+13475
+13476
+13477
+13478
+13479
+13480
+13481
+13482
+13483
+13484
+13485
+13486
+13487
+13488
+13489
+13490
+13491
+13492
+13493
+13494
+13495
+13496
+13497
+13498
+13499
+13500
+13501
+13502
+13503
+13504
+13505
+13506
+13507
+13508
+13509
+13510
+13511
+13512
+13513
+13514
+13515
+13516
+13517
+13518
+13519
+13520
+13521
+13522
+13523
+13524
+13525
+13526
+13527
+13528
+13529
+13530
+13531
+13532
+13533
+13534
+13535
+13536
+13537
+13538
+13539
+13540
+13541
+13542
+13543
+13544
+13545
+13546
+13547
+13548
+13549
+13550
+13551
+13552
+13553
+13554
+13555
+13556
+13557
+13558
+13559
+13560
+13561
+13562
+13563
+13564
+13565
+13566
+13567
+13568
+13569
+13570
+13571
+13572
+13573
+13574
+13575
+13576
+13577
+13578
+13579
+13580
+13581
+13582
+13583
+13584
+13585
+13586
+13587
+13588
+13589
+13590
+13591
+13592
+13593
+13594
+13595
+13596
+13597
+13598
+13599
+13600
+13601
+13602
+13603
+13604
+13605
+13606
+13607
+13608
+13609
+13610
+13611
+13612
+13613
+13614
+13615
+13616
+13617
+13618
+13619
+13620
+13621
+13622
+13623
+13624
+13625
+13626
+13627
+13628
+13629
+13630
+13631
+13632
+13633
+13634
+13635
+13636
+13637
+13638
+13639
+13640
+13641
+13642
+13643
+13644
+13645
+13646
+13647
+13648
+13649
+13650
+13651
+13652
+13653
+13654
+13655
+13656
+13657
+13658
+13659
+13660
+13661
+13662
+13663
+13664
+13665
+13666
+13667
+13668
+13669
+13670
+13671
+13672
+13673
+13674
+13675
+13676
+13677
+13678
+13679
+13680
+13681
+13682
+13683
+13684
+13685
+13686
+13687
+13688
+13689
+13690
+13691
+13692
+13693
+13694
+13695
+13696
+13697
+13698
+13699
+13700
+13701
+13702
+13703
+13704
+13705
+13706
+13707
+13708
+13709
+13710
+13711
+13712
+13713
+13714
+13715
+13716
+13717
+13718
+13719
+13720
+13721
+13722
+13723
+13724
+13725
+13726
+13727
+13728
+13729
+13730
+13731
+13732
+13733
+13734
+13735
+13736
+13737
+13738
+13739
+13740
+13741
+13742
+13743
+13744
+13745
+13746
+13747
+13748
+13749
+13750
+13751
+13752
+13753
+13754
+13755
+13756
+13757
+13758
+13759
+13760
+13761
+13762
+13763
+13764
+13765
+13766
+13767
+13768
+13769
+13770
+13771
+13772
+13773
+13774
+13775
+13776
+13777
+13778
+13779
+13780
+13781
+13782
+13783
+13784
+13785
+13786
+13787
+13788
+13789
+13790
+13791
+13792
+13793
+13794
+13795
+13796
+13797
+13798
+13799
+13800
+13801
+13802
+13803
+13804
+13805
+13806
+13807
+13808
+13809
+13810
+13811
+13812
+13813
+13814
+13815
+13816
+13817
+13818
+13819
+13820
+13821
+13822
+13823
+13824
+13825
+13826
+13827
+13828
+13829
+13830
+13831
+13832
+13833
+13834
+13835
+13836
+13837
+13838
+13839
+13840
+13841
+13842
+13843
+13844
+13845
+13846
+13847
+13848
+13849
+13850
+13851
+13852
+13853
+13854
+13855
+13856
+13857
+13858
+13859
+13860
+13861
+13862
+13863
+13864
+13865
+13866
+13867
+13868
+13869
+13870
+13871
+13872
+13873
+13874
+13875
+13876
+13877
+13878
+13879
+13880
+13881
+13882
+13883
+13884
+13885
+13886
+13887
+13888
+13889
+13890
+13891
+13892
+13893
+13894
+13895
+13896
+13897
+13898
+13899
+13900
+13901
+13902
+13903
+13904
+13905
+13906
+13907
+13908
+13909
+13910
+13911
+13912
+13913
+13914
+13915
+13916
+13917
+13918
+13919
+13920
+13921
+13922
+13923
+13924
+13925
+13926
+13927
+13928
+13929
+13930
+13931
+13932
+13933
+13934
+13935
+13936
+13937
+13938
+13939
+13940
+13941
+13942
+13943
+13944
+13945
+13946
+13947
+13948
+13949
+13950
+13951
+13952
+13953
+13954
+13955
+13956
+13957
+13958
+13959
+13960
+13961
+13962
+13963
+13964
+13965
+13966
+13967
+13968
+13969
+13970
+13971
+13972
+13973
+13974
+13975
+13976
+13977
+13978
+13979
+13980
+13981
+13982
+13983
+13984
+13985
+13986
+13987
+13988
+13989
+13990
+13991
+13992
+13993
+13994
+13995
+13996
+13997
+13998
+13999
+14000
+14001
+14002
+14003
+14004
+14005
+14006
+14007
+14008
+14009
+14010
+14011
+14012
+14013
+14014
+14015
+14016
+14017
+14018
+14019
+14020
+14021
+14022
+14023
+14024
+14025
+14026
+14027
+14028
+14029
+14030
+14031
+14032
+14033
+14034
+14035
+14036
+14037
+14038
+14039
+14040
+14041
+14042
+14043
+14044
+14045
+14046
+14047
+14048
+14049
+14050
+14051
+14052
+14053
+14054
+14055
+14056
+14057
+14058
+14059
+14060
+14061
+14062
+14063
+14064
+14065
+14066
+14067
+14068
+14069
+14070
+14071
+14072
+14073
+14074
+14075
+14076
+14077
+14078
+14079
+14080
+14081
+14082
+14083
+14084
+14085
+14086
+14087
+14088
+14089
+14090
+14091
+14092
+14093
+14094
+14095
+14096
+14097
+14098
+14099
+14100
+14101
+14102
+14103
+14104
+14105
+14106
+14107
+14108
+14109
+14110
+14111
+14112
+14113
+14114
+14115
+14116
+14117
+14118
+14119
+14120
+14121
+14122
+14123
+14124
+14125
+14126
+14127
+14128
+14129
+14130
+14131
+14132
+14133
+14134
+14135
+14136
+14137
+14138
+14139
+14140
+14141
+14142
+14143
+14144
+14145
+14146
+14147
+14148
+14149
+14150
+14151
+14152
+14153
+14154
+14155
+14156
+14157
+14158
+14159
+14160
+14161
+14162
+14163
+14164
+14165
+14166
+14167
+14168
+14169
+14170
+14171
+14172
+14173
+14174
+14175
+14176
+14177
+14178
+14179
+14180
+14181
+14182
+14183
+14184
+14185
+14186
+14187
+14188
+14189
+14190
+14191
+14192
+14193
+14194
+14195
+14196
+14197
+14198
+14199
+14200
+14201
+14202
+14203
+14204
+14205
+14206
+14207
+14208
+14209
+14210
+14211
+14212
+14213
+14214
+14215
+14216
+14217
+14218
+14219
+14220
+14221
+14222
+14223
+14224
+14225
+14226
+14227
+14228
+14229
+14230
+14231
+14232
+14233
+14234
+14235
+14236
+14237
+14238
+14239
+14240
+14241
+14242
+14243
+14244
+14245
+14246
+14247
+14248
+14249
+14250
+14251
+14252
+14253
+14254
+14255
+14256
+14257
+14258
+14259
+14260
+14261
+14262
+14263
+14264
+14265
+14266
+14267
+14268
+14269
+14270
+14271
+14272
+14273
+14274
+14275
+14276
+14277
+14278
+14279
+14280
+14281
+14282
+14283
+14284
+14285
+14286
+14287
+14288
+14289
+14290
+14291
+14292
+14293
+14294
+14295
+14296
+14297
+14298
+14299
+14300
+14301
+14302
+14303
+14304
+14305
+14306
+14307
+14308
+14309
+14310
+14311
+14312
+14313
+14314
+14315
+14316
+14317
+14318
+14319
+14320
+14321
+14322
+14323
+14324
+14325
+14326
+14327
+14328
+14329
+14330
+14331
+14332
+14333
+14334
+14335
+14336
+14337
+14338
+14339
+14340
+14341
+14342
+14343
+14344
+14345
+14346
+14347
+14348
+14349
+14350
+14351
+14352
+14353
+14354
+14355
+14356
+14357
+14358
+14359
+14360
+14361
+14362
+14363
+14364
+14365
+14366
+14367
+14368
+14369
+14370
+14371
+14372
+14373
+14374
+14375
+14376
+14377
+14378
+14379
+14380
+14381
+14382
+14383
+14384
+14385
+14386
+14387
+14388
+14389
+14390
+14391
+14392
+14393
+14394
+14395
+14396
+14397
+14398
+14399
+14400
+14401
+14402
+14403
+14404
+14405
+14406
+14407
+14408
+14409
+14410
+14411
+14412
+14413
+14414
+14415
+14416
+14417
+14418
+14419
+14420
+14421
+14422
+14423
+14424
+14425
+14426
+14427
+14428
+14429
+14430
+14431
+14432
+14433
+14434
+14435
+14436
+14437
+14438
+14439
+14440
+14441
+14442
+14443
+14444
+14445
+14446
+14447
+14448
+14449
+14450
+14451
+14452
+14453
+14454
+14455
+14456
+14457
+14458
+14459
+14460
+14461
+14462
+14463
+14464
+14465
+14466
+14467
+14468
+14469
+14470
+14471
+14472
+14473
+14474
+14475
+14476
+14477
+14478
+14479
+14480
+14481
+14482
+14483
+14484
+14485
+14486
+14487
+14488
+14489
+14490
+14491
+14492
+14493
+14494
+14495
+14496
+14497
+14498
+14499
+14500
+14501
+14502
+14503
+14504
+14505
+14506
+14507
+14508
+14509
+14510
+14511
+14512
+14513
+14514
+14515
+14516
+14517
+14518
+14519
+14520
+14521
+14522
+14523
+14524
+14525
+14526
+14527
+14528
+14529
+14530
+14531
+14532
+14533
+14534
+14535
+14536
+14537
+14538
+14539
+14540
+14541
+14542
+14543
+14544
+14545
+14546
+14547
+14548
+14549
+14550
+14551
+14552
+14553
+14554
+14555
+14556
+14557
+14558
+14559
+14560
+14561
+14562
+14563
+14564
+14565
+14566
+14567
+14568
+14569
+14570
+14571
+14572
+14573
+14574
+14575
+14576
+14577
+14578
+14579
+14580
+14581
+14582
+14583
+14584
+14585
+14586
+14587
+14588
+14589
+14590
+14591
+14592
+14593
+14594
+14595
+14596
+14597
+14598
+14599
+14600
+14601
+14602
+14603
+14604
+14605
+14606
+14607
+14608
+14609
+14610
+14611
+14612
+14613
+14614
+14615
+14616
+14617
+14618
+14619
+14620
+14621
+14622
+14623
+14624
+14625
+14626
+14627
+14628
+14629
+14630
+14631
+14632
+14633
+14634
+14635
+14636
+14637
+14638
+14639
+14640
+14641
+14642
+14643
+14644
+14645
+14646
+14647
+14648
+14649
+14650
+14651
+14652
+14653
+14654
+14655
+14656
+14657
+14658
+14659
+14660
+14661
+14662
+14663
+14664
+14665
+14666
+14667
+14668
+14669
+14670
+14671
+14672
+14673
+14674
+14675
+14676
+14677
+14678
+14679
+14680
+14681
+14682
+14683
+14684
+14685
+14686
+14687
+14688
+14689
+14690
+14691
+14692
+14693
+14694
+14695
+14696
+14697
+14698
+14699
+14700
+14701
+14702
+14703
+14704
+14705
+14706
+14707
+14708
+14709
+14710
+14711
+14712
+14713
+14714
+14715
+14716
+14717
+14718
+14719
+14720
+14721
+14722
+14723
+14724
+14725
+14726
+14727
+14728
+14729
+14730
+14731
+14732
+14733
+14734
+14735
+14736
+14737
+14738
+14739
+14740
+14741
+14742
+14743
+14744
+14745
+14746
+14747
+14748
+14749
+14750
+14751
+14752
+14753
+14754
+14755
+14756
+14757
+14758
+14759
+14760
+14761
+14762
+14763
+14764
+14765
+14766
+14767
+14768
+14769
+14770
+14771
+14772
+14773
+14774
+14775
+14776
+14777
+14778
+14779
+14780
+14781
+14782
+14783
+14784
+14785
+14786
+14787
+14788
+14789
+14790
+14791
+14792
+14793
+14794
+14795
+14796
+14797
+14798
+14799
+14800
+14801
+14802
+14803
+14804
+14805
+14806
+14807
+14808
+14809
+14810
+14811
+14812
+14813
+14814
+14815
+14816
+14817
+14818
+14819
+14820
+14821
+14822
+14823
+14824
+14825
+14826
+14827
+14828
+14829
+14830
+14831
+14832
+14833
+14834
+14835
+14836
+14837
+14838
+14839
+14840
+14841
+14842
+14843
+14844
+14845
+14846
+14847
+14848
+14849
+14850
+14851
+14852
+14853
+14854
+14855
+14856
+14857
+14858
+14859
+14860
+14861
+14862
+14863
+14864
+14865
+14866
+14867
+14868
+14869
+14870
+14871
+14872
+14873
+14874
+14875
+14876
+14877
+14878
+14879
+14880
+14881
+14882
+14883
+14884
+14885
+14886
+14887
+14888
+14889
+14890
+14891
+14892
+14893
+14894
+14895
+14896
+14897
+14898
+14899
+14900
+14901
+14902
+14903
+14904
+14905
+14906
+14907
+14908
+14909
+14910
+14911
+14912
+14913
+14914
+14915
+14916
+14917
+14918
+14919
+14920
+14921
+14922
+14923
+14924
+14925
+14926
+14927
+14928
+14929
+14930
+14931
+14932
+14933
+14934
+14935
+14936
+14937
+14938
+14939
+14940
+14941
+14942
+14943
+14944
+14945
+14946
+14947
+14948
+14949
+14950
+14951
+14952
+14953
+14954
+14955
+14956
+14957
+14958
+14959
+14960
+14961
+14962
+14963
+14964
+14965
+14966
+14967
+14968
+14969
+14970
+14971
+14972
+14973
+14974
+14975
+14976
+14977
+14978
+14979
+14980
+14981
+14982
+14983
+14984
+14985
+14986
+14987
+14988
+14989
+14990
+14991
+14992
+14993
+14994
+14995
+14996
+14997
+14998
+14999
+15000
+15001
+15002
+15003
+15004
+15005
+15006
+15007
+15008
+15009
+15010
+15011
+15012
+15013
+15014
+15015
+15016
+15017
+15018
+15019
+15020
+15021
+15022
+15023
+15024
+15025
+15026
+15027
+15028
+15029
+15030
+15031
+15032
+15033
+15034
+15035
+15036
+15037
+15038
+15039
+15040
+15041
+15042
+15043
+15044
+15045
+15046
+15047
+15048
+15049
+15050
+15051
+15052
+15053
+15054
+15055
+15056
+15057
+15058
+15059
+15060
+15061
+15062
+15063
+15064
+15065
+15066
+15067
+15068
+15069
+15070
+15071
+15072
+15073
+15074
+15075
+15076
+15077
+15078
+15079
+15080
+15081
+15082
+15083
+15084
+15085
+15086
+15087
+15088
+15089
+15090
+15091
+15092
+15093
+15094
+15095
+15096
+15097
+15098
+15099
+15100
+15101
+15102
+15103
+15104
+15105
+15106
+15107
+15108
+15109
+15110
+15111
+15112
+15113
+15114
+15115
+15116
+15117
+15118
+15119
+15120
+15121
+15122
+15123
+15124
+15125
+15126
+15127
+15128
+15129
+15130
+15131
+15132
+15133
+15134
+15135
+15136
+15137
+15138
+15139
+15140
+15141
+15142
+15143
+15144
+15145
+15146
+15147
+15148
+15149
+15150
+15151
+15152
+15153
+15154
+15155
+15156
+15157
+15158
+15159
+15160
+15161
+15162
+15163
+15164
+15165
+15166
+15167
+15168
+15169
+15170
+15171
+15172
+15173
+15174
+15175
+15176
+15177
+15178
+15179
+15180
+15181
+15182
+15183
+15184
+15185
+15186
+15187
+15188
+15189
+15190
+15191
+15192
+15193
+15194
+15195
+15196
+15197
+15198
+15199
+15200
+15201
+15202
+15203
+15204
+15205
+15206
+15207
+15208
+15209
+15210
+15211
+15212
+15213
+15214
+15215
+15216
+15217
+15218
+15219
+15220
+15221
+15222
+15223
+15224
+15225
+15226
+15227
+15228
+15229
+15230
+15231
+15232
+15233
+15234
+15235
+15236
+15237
+15238
+15239
+15240
+15241
+15242
+15243
+15244
+15245
+15246
+15247
+15248
+15249
+15250
+15251
+15252
+15253
+15254
+15255
+15256
+15257
+15258
+15259
+15260
+15261
+15262
+15263
+15264
+15265
+15266
+15267
+15268
+15269
+15270
+15271
+15272
+15273
+15274
+15275
+15276
+15277
+15278
+15279
+15280
+15281
+15282
+15283
+15284
+15285
+15286
+15287
+15288
+15289
+15290
+15291
+15292
+15293
+15294
+15295
+15296
+15297
+15298
+15299
+15300
+15301
+15302
+15303
+15304
+15305
+15306
+15307
+15308
+15309
+15310
+15311
+15312
+15313
+15314
+15315
+15316
+15317
+15318
+15319
+15320
+15321
+15322
+15323
+15324
+15325
+15326
+15327
+15328
+15329
+15330
+15331
+15332
+15333
+15334
+15335
+15336
+15337
+15338
+15339
+15340
+15341
+15342
+15343
+15344
+15345
+15346
+15347
+15348
+15349
+15350
+15351
+15352
+15353
+15354
+15355
+15356
+15357
+15358
+15359
+15360
+15361
+15362
+15363
+15364
+15365
+15366
+15367
+15368
+15369
+15370
+15371
+15372
+15373
+15374
+15375
+15376
+15377
+15378
+15379
+15380
+15381
+15382
+15383
+15384
+15385
+15386
+15387
+15388
+15389
+15390
+15391
+15392
+15393
+15394
+15395
+15396
+15397
+15398
+15399
+15400
+15401
+15402
+15403
+15404
+15405
+15406
+15407
+15408
+15409
+15410
+15411
+15412
+15413
+15414
+15415
+15416
+15417
+15418
+15419
+15420
+15421
+15422
+15423
+15424
+15425
+15426
+15427
+15428
+15429
+15430
+15431
+15432
+15433
+15434
+15435
+15436
+15437
+15438
+15439
+15440
+15441
+15442
+15443
+15444
+15445
+15446
+15447
+15448
+15449
+15450
+15451
+15452
+15453
+15454
+15455
+15456
+15457
+15458
+15459
+15460
+15461
+15462
+15463
+15464
+15465
+15466
+15467
+15468
+15469
+15470
+15471
+15472
+15473
+15474
+15475
+15476
+15477
+15478
+15479
+15480
+15481
+15482
+15483
+15484
+15485
+15486
+15487
+15488
+15489
+15490
+15491
+15492
+15493
+15494
+15495
+15496
+15497
+15498
+15499
+15500
+15501
+15502
+15503
+15504
+15505
+15506
+15507
+15508
+15509
+15510
+15511
+15512
+15513
+15514
+15515
+15516
+15517
+15518
+15519
+15520
+15521
+15522
+15523
+15524
+15525
+15526
+15527
+15528
+15529
+15530
+15531
+15532
+15533
+15534
+15535
+15536
+15537
+15538
+15539
+15540
+15541
+15542
+15543
+15544
+15545
+15546
+15547
+15548
+15549
+15550
+15551
+15552
+15553
+15554
+15555
+15556
+15557
+15558
+15559
+15560
+15561
+15562
+15563
+15564
+15565
+15566
+15567
+15568
+15569
+15570
+15571
+15572
+15573
+15574
+15575
+15576
+15577
+15578
+15579
+15580
+15581
+15582
+15583
+15584
+15585
+15586
+15587
+15588
+15589
+15590
+15591
+15592
+15593
+15594
+15595
+15596
+15597
+15598
+15599
+15600
+15601
+15602
+15603
+15604
+15605
+15606
+15607
+15608
+15609
+15610
+15611
+15612
+15613
+15614
+15615
+15616
+15617
+15618
+15619
+15620
+15621
+15622
+15623
+15624
+15625
+15626
+15627
+15628
+15629
+15630
+15631
+15632
+15633
+15634
+15635
+15636
+15637
+15638
+15639
+15640
+15641
+15642
+15643
+15644
+15645
+15646
+15647
+15648
+15649
+15650
+15651
+15652
+15653
+15654
+15655
+15656
+15657
+15658
+15659
+15660
+15661
+15662
+15663
+15664
+15665
+15666
+15667
+15668
+15669
+15670
+15671
+15672
+15673
+15674
+15675
+15676
+15677
+15678
+15679
+15680
+15681
+15682
+15683
+15684
+15685
+15686
+15687
+15688
+15689
+15690
+15691
+15692
+15693
+15694
+15695
+15696
+15697
+15698
+15699
+15700
+15701
+15702
+15703
+15704
+15705
+15706
+15707
+15708
+15709
+15710
+15711
+15712
+15713
+15714
+15715
+15716
+15717
+15718
+15719
+15720
+15721
+15722
+15723
+15724
+15725
+15726
+15727
+15728
+15729
+15730
+15731
+15732
+15733
+15734
+15735
+15736
+15737
+15738
+15739
+15740
+15741
+15742
+15743
+15744
+15745
+15746
+15747
+15748
+15749
+15750
+15751
+15752
+15753
+15754
+15755
+15756
+15757
+15758
+15759
+15760
+15761
+15762
+15763
+15764
+15765
+15766
+15767
+15768
+15769
+15770
+15771
+15772
+15773
+15774
+15775
+15776
+15777
+15778
+15779
+15780
+15781
+15782
+15783
+15784
+15785
+15786
+15787
+15788
+15789
+15790
+15791
+15792
+15793
+15794
+15795
+15796
+15797
+15798
+15799
+15800
+15801
+15802
+15803
+15804
+15805
+15806
+15807
+15808
+15809
+15810
+15811
+15812
+15813
+15814
+15815
+15816
+15817
+15818
+15819
+15820
+15821
+15822
+15823
+15824
+15825
+15826
+15827
+15828
+15829
+15830
+15831
+15832
+15833
+15834
+15835
+15836
+15837
+15838
+15839
+15840
+15841
+15842
+15843
+15844
+15845
+15846
+15847
+15848
+15849
+15850
+15851
+15852
+15853
+15854
+15855
+15856
+15857
+15858
+15859
+15860
+15861
+15862
+15863
+15864
+15865
+15866
+15867
+15868
+15869
+15870
+15871
+15872
+15873
+15874
+15875
+15876
+15877
+15878
+15879
+15880
+15881
+15882
+15883
+15884
+15885
+15886
+15887
+15888
+15889
+15890
+15891
+15892
+15893
+15894
+15895
+15896
+15897
+15898
+15899
+15900
+15901
+15902
+15903
+15904
+15905
+15906
+15907
+15908
+15909
+15910
+15911
+15912
+15913
+15914
+15915
+15916
+15917
+15918
+15919
+15920
+15921
+15922
+15923
+15924
+15925
+15926
+15927
+15928
+15929
+15930
+15931
+15932
+15933
+15934
+15935
+15936
+15937
+15938
+15939
+15940
+15941
+15942
+15943
+15944
+15945
+15946
+15947
+15948
+15949
+15950
+15951
+15952
+15953
+15954
+15955
+15956
+15957
+15958
+15959
+15960
+15961
+15962
+15963
+15964
+15965
+15966
+15967
+15968
+15969
+15970
+15971
+15972
+15973
+15974
+15975
+15976
+15977
+15978
+15979
+15980
+15981
+15982
+15983
+15984
+15985
+15986
+15987
+15988
+15989
+15990
+15991
+15992
+15993
+15994
+15995
+15996
+15997
+15998
+15999
+16000
+16001
+16002
+16003
+16004
+16005
+16006
+16007
+16008
+16009
+16010
+16011
+16012
+16013
+16014
+16015
+16016
+16017
+16018
+16019
+16020
+16021
+16022
+16023
+16024
+16025
+16026
+16027
+16028
+16029
+16030
+16031
+16032
+16033
+16034
+16035
+16036
+16037
+16038
+16039
+16040
+16041
+16042
+16043
+16044
+16045
+16046
+16047
+16048
+16049
+16050
+16051
+16052
+16053
+16054
+16055
+16056
+16057
+16058
+16059
+16060
+16061
+16062
+16063
+16064
+16065
+16066
+16067
+16068
+16069
+16070
+16071
+16072
+16073
+16074
+16075
+16076
+16077
+16078
+16079
+16080
+16081
+16082
+16083
+16084
+16085
+16086
+16087
+16088
+16089
+16090
+16091
+16092
+16093
+16094
+16095
+16096
+16097
+16098
+16099
+16100
+16101
+16102
+16103
+16104
+16105
+16106
+16107
+16108
+16109
+16110
+16111
+16112
+16113
+16114
+16115
+16116
+16117
+16118
+16119
+16120
+16121
+16122
+16123
+16124
+16125
+16126
+16127
+16128
+16129
+16130
+16131
+16132
+16133
+16134
+16135
+16136
+16137
+16138
+16139
+16140
+16141
+16142
+16143
+16144
+16145
+16146
+16147
+16148
+16149
+16150
+16151
+16152
+16153
+16154
+16155
+16156
+16157
+16158
+16159
+16160
+16161
+16162
+16163
+16164
+16165
+16166
+16167
+16168
+16169
+16170
+16171
+16172
+16173
+16174
+16175
+16176
+16177
+16178
+16179
+16180
+16181
+16182
+16183
+16184
+16185
+16186
+16187
+16188
+16189
+16190
+16191
+16192
+16193
+16194
+16195
+16196
+16197
+16198
+16199
+16200
+16201
+16202
+16203
+16204
+16205
+16206
+16207
+16208
+16209
+16210
+16211
+16212
+16213
+16214
+16215
+16216
+16217
+16218
+16219
+16220
+16221
+16222
+16223
+16224
+16225
+16226
+16227
+16228
+16229
+16230
+16231
+16232
+16233
+16234
+16235
+16236
+16237
+16238
+16239
+16240
+16241
+16242
+16243
+16244
+16245
+16246
+16247
+16248
+16249
+16250
+16251
+16252
+16253
+16254
+16255
+16256
+16257
+16258
+16259
+16260
+16261
+16262
+16263
+16264
+16265
+16266
+16267
+16268
+16269
+16270
+16271
+16272
+16273
+16274
+16275
+16276
+16277
+16278
+16279
+16280
+16281
+16282
+16283
+16284
+16285
+16286
+16287
+16288
+16289
+16290
+16291
+16292
+16293
+16294
+16295
+16296
+16297
+16298
+16299
+16300
+16301
+16302
+16303
+16304
+16305
+16306
+16307
+16308
+16309
+16310
+16311
+16312
+16313
+16314
+16315
+16316
+16317
+16318
+16319
+16320
+16321
+16322
+16323
+16324
+16325
+16326
+16327
+16328
+16329
+16330
+16331
+16332
+16333
+16334
+16335
+16336
+16337
+16338
+16339
+16340
+16341
+16342
+16343
+16344
+16345
+16346
+16347
+16348
+16349
+16350
+16351
+16352
+16353
+16354
+16355
+16356
+16357
+16358
+16359
+16360
+16361
+16362
+16363
+16364
+16365
+16366
+16367
+16368
+16369
+16370
+16371
+16372
+16373
+16374
+16375
+16376
+16377
+16378
+16379
+16380
+16381
+16382
+16383
+16384
+16385
+16386
+16387
+16388
+16389
+16390
+16391
+16392
+16393
+16394
+16395
+16396
+16397
+16398
+16399
+16400
+16401
+16402
+16403
+16404
+16405
+16406
+16407
+16408
+16409
+16410
+16411
+16412
+16413
+16414
+16415
+16416
+16417
+16418
+16419
+16420
+16421
+16422
+16423
+16424
+16425
+16426
+16427
+16428
+16429
+16430
+16431
+16432
+16433
+16434
+16435
+16436
+16437
+16438
+16439
+16440
+16441
+16442
+16443
+16444
+16445
+16446
+16447
+16448
+16449
+16450
+16451
+16452
+16453
+16454
+16455
+16456
+16457
+16458
+16459
+16460
+16461
+16462
+16463
+16464
+16465
+16466
+16467
+16468
+16469
+16470
+16471
+16472
+16473
+16474
+16475
+16476
+16477
+16478
+16479
+16480
+16481
+16482
+16483
+16484
+16485
+16486
+16487
+16488
+16489
+16490
+16491
+16492
+16493
+16494
+16495
+16496
+16497
+16498
+16499
+16500
+16501
+16502
+16503
+16504
+16505
+16506
+16507
+16508
+16509
+16510
+16511
+16512
+16513
+16514
+16515
+16516
+16517
+16518
+16519
+16520
+16521
+16522
+16523
+16524
+16525
+16526
+16527
+16528
+16529
+16530
+16531
+16532
+16533
+16534
+16535
+16536
+16537
+16538
+16539
+16540
+16541
+16542
+16543
+16544
+16545
+16546
+16547
+16548
+16549
+16550
+16551
+16552
+16553
+16554
+16555
+16556
+16557
+16558
+16559
+16560
+16561
+16562
+16563
+16564
+16565
+16566
+16567
+16568
+16569
+16570
+16571
+16572
+16573
+16574
+16575
+16576
+16577
+16578
+16579
+16580
+16581
+16582
+16583
+16584
+16585
+16586
+16587
+16588
+16589
+16590
+16591
+16592
+16593
+16594
+16595
+16596
+16597
+16598
+16599
+16600
+16601
+16602
+16603
+16604
+16605
+16606
+16607
+16608
+16609
+16610
+16611
+16612
+16613
+16614
+16615
+16616
+16617
+16618
+16619
+16620
+16621
+16622
+16623
+16624
+16625
+16626
+16627
+16628
+16629
+16630
+16631
+16632
+16633
+16634
+16635
+16636
+16637
+16638
+16639
+16640
+16641
+16642
+16643
+16644
+16645
+16646
+16647
+16648
+16649
+16650
+16651
+16652
+16653
+16654
+16655
+16656
+16657
+16658
+16659
+16660
+16661
+16662
+16663
+16664
+16665
+16666
+16667
+16668
+16669
+16670
+16671
+16672
+16673
+16674
+16675
+16676
+16677
+16678
+16679
+16680
+16681
+16682
+16683
+16684
+16685
+16686
+16687
+16688
+16689
+16690
+16691
+16692
+16693
+16694
+16695
+16696
+16697
+16698
+16699
+16700
+16701
+16702
+16703
+16704
+16705
+16706
+16707
+16708
+16709
+16710
+16711
+16712
+16713
+16714
+16715
+16716
+16717
+16718
+16719
+16720
+16721
+16722
+16723
+16724
+16725
+16726
+16727
+16728
+16729
+16730
+16731
+16732
+16733
+16734
+16735
+16736
+16737
+16738
+16739
+16740
+16741
+16742
+16743
+16744
+16745
+16746
+16747
+16748
+16749
+16750
+16751
+16752
+16753
+16754
+16755
+16756
+16757
+16758
+16759
+16760
+16761
+16762
+16763
+16764
+16765
+16766
+16767
+16768
+16769
+16770
+16771
+16772
+16773
+16774
+16775
+16776
+16777
+16778
+16779
+16780
+16781
+16782
+16783
+16784
+16785
+16786
+16787
+16788
+16789
+16790
+16791
+16792
+16793
+16794
+16795
+16796
+16797
+16798
+16799
+16800
+16801
+16802
+16803
+16804
+16805
+16806
+16807
+16808
+16809
+16810
+16811
+16812
+16813
+16814
+16815
+16816
+16817
+16818
+16819
+16820
+16821
+16822
+16823
+16824
+16825
+16826
+16827
+16828
+16829
+16830
+16831
+16832
+16833
+16834
+16835
+16836
+16837
+16838
+16839
+16840
+16841
+16842
+16843
+16844
+16845
+16846
+16847
+16848
+16849
+16850
+16851
+16852
+16853
+16854
+16855
+16856
+16857
+16858
+16859
+16860
+16861
+16862
+16863
+16864
+16865
+16866
+16867
+16868
+16869
+16870
+16871
+16872
+16873
+16874
+16875
+16876
+16877
+16878
+16879
+16880
+16881
+16882
+16883
+16884
+16885
+16886
+16887
+16888
+16889
+16890
+16891
+16892
+16893
+16894
+16895
+16896
+16897
+16898
+16899
+16900
+16901
+16902
+16903
+16904
+16905
+16906
+16907
+16908
+16909
+16910
+16911
+16912
+16913
+16914
+16915
+16916
+16917
+16918
+16919
+16920
+16921
+16922
+16923
+16924
+16925
+16926
+16927
+16928
+16929
+16930
+16931
+16932
+16933
+16934
+16935
+16936
+16937
+16938
+16939
+16940
+16941
+16942
+16943
+16944
+16945
+16946
+16947
+16948
+16949
+16950
+16951
+16952
+16953
+16954
+16955
+16956
+16957
+16958
+16959
+16960
+16961
+16962
+16963
+16964
+16965
+16966
+16967
+16968
+16969
+16970
+16971
+16972
+16973
+16974
+16975
+16976
+16977
+16978
+16979
+16980
+16981
+16982
+16983
+16984
+16985
+16986
+16987
+16988
+16989
+16990
+16991
+16992
+16993
+16994
+16995
+16996
+16997
+16998
+16999
+17000
+17001
+17002
+17003
+17004
+17005
+17006
+17007
+17008
+17009
+17010
+17011
+17012
+17013
+17014
+17015
+17016
+17017
+17018
+17019
+17020
+17021
+17022
+17023
+17024
+17025
+17026
+17027
+17028
+17029
+17030
+17031
+17032
+17033
+17034
+17035
+17036
+17037
+17038
+17039
+17040
+17041
+17042
+17043
+17044
+17045
+17046
+17047
+17048
+17049
+17050
+17051
+17052
+17053
+17054
+17055
+17056
+17057
+17058
+17059
+17060
+17061
+17062
+17063
+17064
+17065
+17066
+17067
+17068
+17069
+17070
+17071
+17072
+17073
+17074
+17075
+17076
+17077
+17078
+17079
+17080
+17081
+17082
+17083
+17084
+17085
+17086
+17087
+17088
+17089
+17090
+17091
+17092
+17093
+17094
+17095
+17096
+17097
+17098
+17099
+17100
+17101
+17102
+17103
+17104
+17105
+17106
+17107
+17108
+17109
+17110
+17111
+17112
+17113
+17114
+17115
+17116
+17117
+17118
+17119
+17120
+17121
+17122
+17123
+17124
+17125
+17126
+17127
+17128
+17129
+17130
+17131
+17132
+17133
+17134
+17135
+17136
+17137
+17138
+17139
+17140
+17141
+17142
+17143
+17144
+17145
+17146
+17147
+17148
+17149
+17150
+17151
+17152
+17153
+17154
+17155
+17156
+17157
+17158
+17159
+17160
+17161
+17162
+17163
+17164
+17165
+17166
+17167
+17168
+17169
+17170
+17171
+17172
+17173
+17174
+17175
+17176
+17177
+17178
+17179
+17180
+17181
+17182
+17183
+17184
+17185
+17186
+17187
+17188
+17189
+17190
+17191
+17192
+17193
+17194
+17195
+17196
+17197
+17198
+17199
+17200
+17201
+17202
+17203
+17204
+17205
+17206
+17207
+17208
+17209
+17210
+17211
+17212
+17213
+17214
+17215
+17216
+17217
+17218
+17219
+17220
+17221
+17222
+17223
+17224
+17225
+17226
+17227
+17228
+17229
+17230
+17231
+17232
+17233
+17234
+17235
+17236
+17237
+17238
+17239
+17240
+17241
+17242
+17243
+17244
+17245
+17246
+17247
+17248
+17249
+17250
+17251
+17252
+17253
+17254
+17255
+17256
+17257
+17258
+17259
+17260
+17261
+17262
+17263
+17264
+17265
+17266
+17267
+17268
+17269
+17270
+17271
+17272
+17273
+17274
+17275
+17276
+17277
+17278
+17279
+17280
+17281
+17282
+17283
+17284
+17285
+17286
+17287
+17288
+17289
+17290
+17291
+17292
+17293
+17294
+17295
+17296
+17297
+17298
+17299
+17300
+17301
+17302
+17303
+17304
+17305
+17306
+17307
+17308
+17309
+17310
+17311
+17312
+17313
+17314
+17315
+17316
+17317
+17318
+17319
+17320
+17321
+17322
+17323
+17324
+17325
+17326
+17327
+17328
+17329
+17330
+17331
+17332
+17333
+17334
+17335
+17336
+17337
+17338
+17339
+17340
+17341
+17342
+17343
+17344
+17345
+17346
+17347
+17348
+17349
+17350
+17351
+17352
+17353
+17354
+17355
+17356
+17357
+17358
+17359
+17360
+17361
+17362
+17363
+17364
+17365
+17366
+17367
+17368
+17369
+17370
+17371
+17372
+17373
+17374
+17375
+17376
+17377
+17378
+17379
+17380
+17381
+17382
+17383
+17384
+17385
+17386
+17387
+17388
+17389
+17390
+17391
+17392
+17393
+17394
+17395
+17396
+17397
+17398
+17399
+17400
+17401
+17402
+17403
+17404
+17405
+17406
+17407
+17408
+17409
+17410
+17411
+17412
+17413
+17414
+17415
+17416
+17417
+17418
+17419
+17420
+17421
+17422
+17423
+17424
+17425
+17426
+17427
+17428
+17429
+17430
+17431
+17432
+17433
+17434
+17435
+17436
+17437
+17438
+17439
+17440
+17441
+17442
+17443
+17444
+17445
+17446
+17447
+17448
+17449
+17450
+17451
+17452
+17453
+17454
+17455
+17456
+17457
+17458
+17459
+17460
+17461
+17462
+17463
+17464
+17465
+17466
+17467
+17468
+17469
+17470
+17471
+17472
+17473
+17474
+17475
+17476
+17477
+17478
+17479
+17480
+17481
+17482
+17483
+17484
+17485
+17486
+17487
+17488
+17489
+17490
+17491
+17492
+17493
+17494
+17495
+17496
+17497
+17498
+17499
+17500
+17501
+17502
+17503
+17504
+17505
+17506
+17507
+17508
+17509
+17510
+17511
+17512
+17513
+17514
+17515
+17516
+17517
+17518
+17519
+17520
+17521
+17522
+17523
+17524
+17525
+17526
+17527
+17528
+17529
+17530
+17531
+17532
+17533
+17534
+17535
+17536
+17537
+17538
+17539
+17540
+17541
+17542
+17543
+17544
+17545
+17546
+17547
+17548
+17549
+17550
+17551
+17552
+17553
+17554
+17555
+17556
+17557
+17558
+17559
+17560
+17561
+17562
+17563
+17564
+17565
+17566
+17567
+17568
+17569
+17570
+17571
+17572
+17573
+17574
+17575
+17576
+17577
+17578
+17579
+17580
+17581
+17582
+17583
+17584
+17585
+17586
+17587
+17588
+17589
+17590
+17591
+17592
+17593
+17594
+17595
+17596
+17597
+17598
+17599
+17600
+17601
+17602
+17603
+17604
+17605
+17606
+17607
+17608
+17609
+17610
+17611
+17612
+17613
+17614
+17615
+17616
+17617
+17618
+17619
+17620
+17621
+17622
+17623
+17624
+17625
+17626
+17627
+17628
+17629
+17630
+17631
+17632
+17633
+17634
+17635
+17636
+17637
+17638
+17639
+17640
+17641
+17642
+17643
+17644
+17645
+17646
+17647
+17648
+17649
+17650
+17651
+17652
+17653
+17654
+17655
+17656
+17657
+17658
+17659
+17660
+17661
+17662
+17663
+17664
+17665
+17666
+17667
+17668
+17669
+17670
+17671
+17672
+17673
+17674
+17675
+17676
+17677
+17678
+17679
+17680
+17681
+17682
+17683
+17684
+17685
+17686
+17687
+17688
+17689
+17690
+17691
+17692
+17693
+17694
+17695
+17696
+17697
+17698
+17699
+17700
+17701
+17702
+17703
+17704
+17705
+17706
+17707
+17708
+17709
+17710
+17711
+17712
+17713
+17714
+17715
+17716
+17717
+17718
+17719
+17720
+17721
+17722
+17723
+17724
+17725
+17726
+17727
+17728
+17729
+17730
+17731
+17732
+17733
+17734
+17735
+17736
+17737
+17738
+17739
+17740
+17741
+17742
+17743
+17744
+17745
+17746
+17747
+17748
+17749
+17750
+17751
+17752
+17753
+17754
+17755
+17756
+17757
+17758
+17759
+17760
+17761
+17762
+17763
+17764
+17765
+17766
+17767
+17768
+17769
+17770
+17771
+17772
+17773
+17774
+17775
+17776
+17777
+17778
+17779
+17780
+17781
+17782
+17783
+17784
+17785
+17786
+17787
+17788
+17789
+17790
+17791
+17792
+17793
+17794
+17795
+17796
+17797
+17798
+17799
+17800
+17801
+17802
+17803
+17804
+17805
+17806
+17807
+17808
+17809
+17810
+17811
+17812
+17813
+17814
+17815
+17816
+17817
+17818
+17819
+17820
+17821
+17822
+17823
+17824
+17825
+17826
+17827
+17828
+17829
+17830
+17831
+17832
+17833
+17834
+17835
+17836
+17837
+17838
+17839
+17840
+17841
+17842
+17843
+17844
+17845
+17846
+17847
+17848
+17849
+17850
+17851
+17852
+17853
+17854
+17855
+17856
+17857
+17858
+17859
+17860
+17861
+17862
+17863
+17864
+17865
+17866
+17867
+17868
+17869
+17870
+17871
+17872
+17873
+17874
+17875
+17876
+17877
+17878
+17879
+17880
+17881
+17882
+17883
+17884
+17885
+17886
+17887
+17888
+17889
+17890
+17891
+17892
+17893
+17894
+17895
+17896
+17897
+17898
+17899
+17900
+17901
+17902
+17903
+17904
+17905
+17906
+17907
+17908
+17909
+17910
+17911
+17912
+17913
+17914
+17915
+17916
+17917
+17918
+17919
+17920
+17921
+17922
+17923
+17924
+17925
+17926
+17927
+17928
+17929
+17930
+17931
+17932
+17933
+17934
+17935
+17936
+17937
+17938
+17939
+17940
+17941
+17942
+17943
+17944
+17945
+17946
+17947
+17948
+17949
+17950
+17951
+17952
+17953
+17954
+17955
+17956
+17957
+17958
+17959
+17960
+17961
+17962
+17963
+17964
+17965
+17966
+17967
+17968
+17969
+17970
+17971
+17972
+17973
+17974
+17975
+17976
+17977
+17978
+17979
+17980
+17981
+17982
+17983
+17984
+17985
+17986
+17987
+17988
+17989
+17990
+17991
+17992
+17993
+17994
+17995
+17996
+17997
+17998
+17999
+18000
+18001
+18002
+18003
+18004
+18005
+18006
+18007
+18008
+18009
+18010
+18011
+18012
+18013
+18014
+18015
+18016
+18017
+18018
+18019
+18020
+18021
+18022
+18023
+18024
+18025
+18026
+18027
+18028
+18029
+18030
+18031
+18032
+18033
+18034
+18035
+18036
+18037
+18038
+18039
+18040
+18041
+18042
+18043
+18044
+18045
+18046
+18047
+18048
+18049
+18050
+18051
+18052
+18053
+18054
+18055
+18056
+18057
+18058
+18059
+18060
+18061
+18062
+18063
+18064
+18065
+18066
+18067
+18068
+18069
+18070
+18071
+18072
+18073
+18074
+18075
+18076
+18077
+18078
+18079
+18080
+18081
+18082
+18083
+18084
+18085
+18086
+18087
+18088
+18089
+18090
+18091
+18092
+18093
+18094
+18095
+18096
+18097
+18098
+18099
+18100
+18101
+18102
+18103
+18104
+18105
+18106
+18107
+18108
+18109
+18110
+18111
+18112
+18113
+18114
+18115
+18116
+18117
+18118
+18119
+18120
+18121
+18122
+18123
+18124
+18125
+18126
+18127
+18128
+18129
+18130
+18131
+18132
+18133
+18134
+18135
+18136
+18137
+18138
+18139
+18140
+18141
+18142
+18143
+18144
+18145
+18146
+18147
+18148
+18149
+18150
+18151
+18152
+18153
+18154
+18155
+18156
+18157
+18158
+18159
+18160
+18161
+18162
+18163
+18164
+18165
+18166
+18167
+18168
+18169
+18170
+18171
+18172
+18173
+18174
+18175
+18176
+18177
+18178
+18179
+18180
+18181
+18182
+18183
+18184
+18185
+18186
+18187
+18188
+18189
+18190
+18191
+18192
+18193
+18194
+18195
+18196
+18197
+18198
+18199
+18200
+18201
+18202
+18203
+18204
+18205
+18206
+18207
+18208
+18209
+18210
+18211
+18212
+18213
+18214
+18215
+18216
+18217
+18218
+18219
+18220
+18221
+18222
+18223
+18224
+18225
+18226
+18227
+18228
+18229
+18230
+18231
+18232
+18233
+18234
+18235
+18236
+18237
+18238
+18239
+18240
+18241
+18242
+18243
+18244
+18245
+18246
+18247
+18248
+18249
+18250
+18251
+18252
+18253
+18254
+18255
+18256
+18257
+18258
+18259
+18260
+18261
+18262
+18263
+18264
+18265
+18266
+18267
+18268
+18269
+18270
+18271
+18272
+18273
+18274
+18275
+18276
+18277
+18278
+18279
+18280
+18281
+18282
+18283
+18284
+18285
+18286
+18287
+18288
+18289
+18290
+18291
+18292
+18293
+18294
+18295
+18296
+18297
+18298
+18299
+18300
+18301
+18302
+18303
+18304
+18305
+18306
+18307
+18308
+18309
+18310
+18311
+18312
+18313
+18314
+18315
+18316
+18317
+18318
+18319
+18320
+18321
+18322
+18323
+18324
+18325
+18326
+18327
+18328
+18329
+18330
+18331
+18332
+18333
+18334
+18335
+18336
+18337
+18338
+18339
+18340
+18341
+18342
+18343
+18344
+18345
+18346
+18347
+18348
+18349
+18350
+18351
+18352
+18353
+18354
+18355
+18356
+18357
+18358
+18359
+18360
+18361
+18362
+18363
+18364
+18365
+18366
+18367
+18368
+18369
+18370
+18371
+18372
+18373
+18374
+18375
+18376
+18377
+18378
+18379
+18380
+18381
+18382
+18383
+18384
+18385
+18386
+18387
+18388
+18389
+18390
+18391
+18392
+18393
+18394
+18395
+18396
+18397
+18398
+18399
+18400
+18401
+18402
+18403
+18404
+18405
+18406
+18407
+18408
+18409
+18410
+18411
+18412
+18413
+18414
+18415
+18416
+18417
+18418
+18419
+18420
+18421
+18422
+18423
+18424
+18425
+18426
+18427
+18428
+18429
+18430
+18431
+18432
+18433
+18434
+18435
+18436
+18437
+18438
+18439
+18440
+18441
+18442
+18443
+18444
+18445
+18446
+18447
+18448
+18449
+18450
+18451
+18452
+18453
+18454
+18455
+18456
+18457
+18458
+18459
+18460
+18461
+18462
+18463
+18464
+18465
+18466
+18467
+18468
+18469
+18470
+18471
+18472
+18473
+18474
+18475
+18476
+18477
+18478
+18479
+18480
+18481
+18482
+18483
+18484
+18485
+18486
+18487
+18488
+18489
+18490
+18491
+18492
+18493
+18494
+18495
+18496
+18497
+18498
+18499
+18500
+18501
+18502
+18503
+18504
+18505
+18506
+18507
+18508
+18509
+18510
+18511
+18512
+18513
+18514
+18515
+18516
+18517
+18518
+18519
+18520
+18521
+18522
+18523
+18524
+18525
+18526
+18527
+18528
+18529
+18530
+18531
+18532
+18533
+18534
+18535
+18536
+18537
+18538
+18539
+18540
+18541
+18542
+18543
+18544
+18545
+18546
+18547
+18548
+18549
+18550
+18551
+18552
+18553
+18554
+18555
+18556
+18557
+18558
+18559
+18560
+18561
+18562
+18563
+18564
+18565
+18566
+18567
+18568
+18569
+18570
+18571
+18572
+18573
+18574
+18575
+18576
+18577
+18578
+18579
+18580
+18581
+18582
+18583
+18584
+18585
+18586
+18587
+18588
+18589
+18590
+18591
+18592
+18593
+18594
+18595
+18596
+18597
+18598
+18599
+18600
+18601
+18602
+18603
+18604
+18605
+18606
+18607
+18608
+18609
+18610
+18611
+18612
+18613
+18614
+18615
+18616
+18617
+18618
+18619
+18620
+18621
+18622
+18623
+18624
+18625
+18626
+18627
+18628
+18629
+18630
+18631
+18632
+18633
+18634
+18635
+18636
+18637
+18638
+18639
+18640
+18641
+18642
+18643
+18644
+18645
+18646
+18647
+18648
+18649
+18650
+18651
+18652
+18653
+18654
+18655
+18656
+18657
+18658
+18659
+18660
+18661
+18662
+18663
+18664
+18665
+18666
+18667
+18668
+18669
+18670
+18671
+18672
+18673
+18674
+18675
+18676
+18677
+18678
+18679
+18680
+18681
+18682
+18683
+18684
+18685
+18686
+18687
+18688
+18689
+18690
+18691
+18692
+18693
+18694
+18695
+18696
+18697
+18698
+18699
+18700
+18701
+18702
+18703
+18704
+18705
+18706
+18707
+18708
+18709
+18710
+18711
+18712
+18713
+18714
+18715
+18716
+18717
+18718
+18719
+18720
+18721
+18722
+18723
+18724
+18725
+18726
+18727
+18728
+18729
+18730
+18731
+18732
+18733
+18734
+18735
+18736
+18737
+18738
+18739
+18740
+18741
+18742
+18743
+18744
+18745
+18746
+18747
+18748
+18749
+18750
+18751
+18752
+18753
+18754
+18755
+18756
+18757
+18758
+18759
+18760
+18761
+18762
+18763
+18764
+18765
+18766
+18767
+18768
+18769
+18770
+18771
+18772
+18773
+18774
+18775
+18776
+18777
+18778
+18779
+18780
+18781
+18782
+18783
+18784
+18785
+18786
+18787
+18788
+18789
+18790
+18791
+18792
+18793
+18794
+18795
+18796
+18797
+18798
+18799
+18800
+18801
+18802
+18803
+18804
+18805
+18806
+18807
+18808
+18809
+18810
+18811
+18812
+18813
+18814
+18815
+18816
+18817
+18818
+18819
+18820
+18821
+18822
+18823
+18824
+18825
+18826
+18827
+18828
+18829
+18830
+18831
+18832
+18833
+18834
+18835
+18836
+18837
+18838
+18839
+18840
+18841
+18842
+18843
+18844
+18845
+18846
+18847
+18848
+18849
+18850
+18851
+18852
+18853
+18854
+18855
+18856
+18857
+18858
+18859
+18860
+18861
+18862
+18863
+18864
+18865
+18866
+18867
+18868
+18869
+18870
+18871
+18872
+18873
+18874
+18875
+18876
+18877
+18878
+18879
+18880
+18881
+18882
+18883
+18884
+18885
+18886
+18887
+18888
+18889
+18890
+18891
+18892
+18893
+18894
+18895
+18896
+18897
+18898
+18899
+18900
+18901
+18902
+18903
+18904
+18905
+18906
+18907
+18908
+18909
+18910
+18911
+18912
+18913
+18914
+18915
+18916
+18917
+18918
+18919
+18920
+18921
+18922
+18923
+18924
+18925
+18926
+18927
+18928
+18929
+18930
+18931
+18932
+18933
+18934
+18935
+18936
+18937
+18938
+18939
+18940
+18941
+18942
+18943
+18944
+18945
+18946
+18947
+18948
+18949
+18950
+18951
+18952
+18953
+18954
+18955
+18956
+18957
+18958
+18959
+18960
+18961
+18962
+18963
+18964
+18965
+18966
+18967
+18968
+18969
+18970
+18971
+18972
+18973
+18974
+18975
+18976
+18977
+18978
+18979
+18980
+18981
+18982
+18983
+18984
+18985
+18986
+18987
+18988
+18989
+18990
+18991
+18992
+18993
+18994
+18995
+18996
+18997
+18998
+18999
+19000
+19001
+19002
+19003
+19004
+19005
+19006
+19007
+19008
+19009
+19010
+19011
+19012
+19013
+19014
+19015
+19016
+19017
+19018
+19019
+19020
+19021
+19022
+19023
+19024
+19025
+19026
+19027
+19028
+19029
+19030
+19031
+19032
+19033
+19034
+19035
+19036
+19037
+19038
+19039
+19040
+19041
+19042
+19043
+19044
+19045
+19046
+19047
+19048
+19049
+19050
+19051
+19052
+19053
+19054
+19055
+19056
+19057
+19058
+19059
+19060
+19061
+19062
+19063
+19064
+19065
+19066
+19067
+19068
+19069
+19070
+19071
+19072
+19073
+19074
+19075
+19076
+19077
+19078
+19079
+19080
+19081
+19082
+19083
+19084
+19085
+19086
+19087
+19088
+19089
+19090
+19091
+19092
+19093
+19094
+19095
+19096
+19097
+19098
+19099
+19100
+19101
+19102
+19103
+19104
+19105
+19106
+19107
+19108
+19109
+19110
+19111
+19112
+19113
+19114
+19115
+19116
+19117
+19118
+19119
+19120
+19121
+19122
+19123
+19124
+19125
+19126
+19127
+19128
+19129
+19130
+19131
+19132
+19133
+19134
+19135
+19136
+19137
+19138
+19139
+19140
+19141
+19142
+19143
+19144
+19145
+19146
+19147
+19148
+19149
+19150
+19151
+19152
+19153
+19154
+19155
+19156
+19157
+19158
+19159
+19160
+19161
+19162
+19163
+19164
+19165
+19166
+19167
+19168
+19169
+19170
+19171
+19172
+19173
+19174
+19175
+19176
+19177
+19178
+19179
+19180
+19181
+19182
+19183
+19184
+19185
+19186
+19187
+19188
+19189
+19190
+19191
+19192
+19193
+19194
+19195
+19196
+19197
+19198
+19199
+19200
+19201
+19202
+19203
+19204
+19205
+19206
+19207
+19208
+19209
+19210
+19211
+19212
+19213
+19214
+19215
+19216
+19217
+19218
+19219
+19220
+19221
+19222
+19223
+19224
+19225
+19226
+19227
+19228
+19229
+19230
+19231
+19232
+19233
+19234
+19235
+19236
+19237
+19238
+19239
+19240
+19241
+19242
+19243
+19244
+19245
+19246
+19247
+19248
+19249
+19250
+19251
+19252
+19253
+19254
+19255
+19256
+19257
+19258
+19259
+19260
+19261
+19262
+19263
+19264
+19265
+19266
+19267
+19268
+19269
+19270
+19271
+19272
+19273
+19274
+19275
+19276
+19277
+19278
+19279
+19280
+19281
+19282
+19283
+19284
+19285
+19286
+19287
+19288
+19289
+19290
+19291
+19292
+19293
+19294
+19295
+19296
+19297
+19298
+19299
+19300
+19301
+19302
+19303
+19304
+19305
+19306
+19307
+19308
+19309
+19310
+19311
+19312
+19313
+19314
+19315
+19316
+19317
+19318
+19319
+19320
+19321
+19322
+19323
+19324
+19325
+19326
+19327
+19328
+19329
+19330
+19331
+19332
+19333
+19334
+19335
+19336
+19337
+19338
+19339
+19340
+19341
+19342
+19343
+19344
+19345
+19346
+19347
+19348
+19349
+19350
+19351
+19352
+19353
+19354
+19355
+19356
+19357
+19358
+19359
+19360
+19361
+19362
+19363
+19364
+19365
+19366
+19367
+19368
+19369
+19370
+19371
+19372
+19373
+19374
+19375
+19376
+19377
+19378
+19379
+19380
+19381
+19382
+19383
+19384
+19385
+19386
+19387
+19388
+19389
+19390
+19391
+19392
+19393
+19394
+19395
+19396
+19397
+19398
+19399
+19400
+19401
+19402
+19403
+19404
+19405
+19406
+19407
+19408
+19409
+19410
+19411
+19412
+19413
+19414
+19415
+19416
+19417
+19418
+19419
+19420
+19421
+19422
+19423
+19424
+19425
+19426
+19427
+19428
+19429
+19430
+19431
+19432
+19433
+19434
+19435
+19436
+19437
+19438
+19439
+19440
+19441
+19442
+19443
+19444
+19445
+19446
+19447
+19448
+19449
+19450
+19451
+19452
+19453
+19454
+19455
+19456
+19457
+19458
+19459
+19460
+19461
+19462
+19463
+19464
+19465
+19466
+19467
+19468
+19469
+19470
+19471
+19472
+19473
+19474
+19475
+19476
+19477
+19478
+19479
+19480
+19481
+19482
+19483
+19484
+19485
+19486
+19487
+19488
+19489
+19490
+19491
+19492
+19493
+19494
+19495
+19496
+19497
+19498
+19499
+19500
+19501
+19502
+19503
+19504
+19505
+19506
+19507
+19508
+19509
+19510
+19511
+19512
+19513
+19514
+19515
+19516
+19517
+19518
+19519
+19520
+19521
+19522
+19523
+19524
+19525
+19526
+19527
+19528
+19529
+19530
+19531
+19532
+19533
+19534
+19535
+19536
+19537
+19538
+19539
+19540
+19541
+19542
+19543
+19544
+19545
+19546
+19547
+19548
+19549
+19550
+19551
+19552
+19553
+19554
+19555
+19556
+19557
+19558
+19559
+19560
+19561
+19562
+19563
+19564
+19565
+19566
+19567
+19568
+19569
+19570
+19571
+19572
+19573
+19574
+19575
+19576
+19577
+19578
+19579
+19580
+19581
+19582
+19583
+19584
+19585
+19586
+19587
+19588
+19589
+19590
+19591
+19592
+19593
+19594
+19595
+19596
+19597
+19598
+19599
+19600
+19601
+19602
+19603
+19604
+19605
+19606
+19607
+19608
+19609
+19610
+19611
+19612
+19613
+19614
+19615
+19616
+19617
+19618
+19619
+19620
+19621
+19622
+19623
+19624
+19625
+19626
+19627
+19628
+19629
+19630
+19631
+19632
+19633
+19634
+19635
+19636
+19637
+19638
+19639
+19640
+19641
+19642
+19643
+19644
+19645
+19646
+19647
+19648
+19649
+19650
+19651
+19652
+19653
+19654
+19655
+19656
+19657
+19658
+19659
+19660
+19661
+19662
+19663
+19664
+19665
+19666
+19667
+19668
+19669
+19670
+19671
+19672
+19673
+19674
+19675
+19676
+19677
+19678
+19679
+19680
+19681
+19682
+19683
+19684
+19685
+19686
+19687
+19688
+19689
+19690
+19691
+19692
+19693
+19694
+19695
+19696
+19697
+19698
+19699
+19700
+19701
+19702
+19703
+19704
+19705
+19706
+19707
+19708
+19709
+19710
+19711
+19712
+19713
+19714
+19715
+19716
+19717
+19718
+19719
+19720
+19721
+19722
+19723
+19724
+19725
+19726
+19727
+19728
+19729
+19730
+19731
+19732
+19733
+19734
+19735
+19736
+19737
+19738
+19739
+19740
+19741
+19742
+19743
+19744
+19745
+19746
+19747
+19748
+19749
+19750
+19751
+19752
+19753
+19754
+19755
+19756
+19757
+19758
+19759
+19760
+19761
+19762
+19763
+19764
+19765
+19766
+19767
+19768
+19769
+19770
+19771
+19772
+19773
+19774
+19775
+19776
+19777
+19778
+19779
+19780
+19781
+19782
+19783
+19784
+19785
+19786
+19787
+19788
+19789
+19790
+19791
+19792
+19793
+19794
+19795
+19796
+19797
+19798
+19799
+19800
+19801
+19802
+19803
+19804
+19805
+19806
+19807
+19808
+19809
+19810
+19811
+19812
+19813
+19814
+19815
+19816
+19817
+19818
+19819
+19820
+19821
+19822
+19823
+19824
+19825
+19826
+19827
+19828
+19829
+19830
+19831
+19832
+19833
+19834
+19835
+19836
+19837
+19838
+19839
+19840
+19841
+19842
+19843
+19844
+19845
+19846
+19847
+19848
+19849
+19850
+19851
+19852
+19853
+19854
+19855
+19856
+19857
+19858
+19859
+19860
+19861
+19862
+19863
+19864
+19865
+19866
+19867
+19868
+19869
+19870
+19871
+19872
+19873
+19874
+19875
+19876
+19877
+19878
+19879
+19880
+19881
+19882
+19883
+19884
+19885
+19886
+19887
+19888
+19889
+19890
+19891
+19892
+19893
+19894
+19895
+19896
+19897
+19898
+19899
+19900
+19901
+19902
+19903
+19904
+19905
+19906
+19907
+19908
+19909
+19910
+19911
+19912
+19913
+19914
+19915
+19916
+19917
+19918
+19919
+19920
+19921
+19922
+19923
+19924
+19925
+19926
+19927
+19928
+19929
+19930
+19931
+19932
+19933
+19934
+19935
+19936
+19937
+19938
+19939
+19940
+19941
+19942
+19943
+19944
+19945
+19946
+19947
+19948
+19949
+19950
+19951
+19952
+19953
+19954
+19955
+19956
+19957
+19958
+19959
+19960
+19961
+19962
+19963
+19964
+19965
+19966
+19967
+19968
+19969
+19970
+19971
+19972
+19973
+19974
+19975
+19976
+19977
+19978
+19979
+19980
+19981
+19982
+19983
+19984
+19985
+19986
+19987
+19988
+19989
+19990
+19991
+19992
+19993
+19994
+19995
+19996
+19997
+19998
+19999
+20000
+20001
+20002
+20003
+20004
+20005
+20006
+20007
+20008
+20009
+20010
+20011
+20012
+20013
+20014
+20015
+20016
+20017
+20018
+20019
+20020
+20021
+20022
+20023
+20024
+20025
+20026
+20027
+20028
+20029
+20030
+20031
+20032
+20033
+20034
+20035
+20036
+20037
+20038
+20039
+20040
+20041
+20042
+20043
+20044
+20045
+20046
+20047
+20048
+20049
+20050
+20051
+20052
+20053
+20054
+20055
+20056
+20057
+20058
+20059
+20060
+20061
+20062
+20063
+20064
+20065
+20066
+20067
+20068
+20069
+20070
+20071
+20072
+20073
+20074
+20075
+20076
+20077
+20078
+20079
+20080
+20081
+20082
+20083
+20084
+20085
+20086
+20087
+20088
+20089
+20090
+20091
+20092
+20093
+20094
+20095
+20096
+20097
+20098
+20099
+20100
+20101
+20102
+20103
+20104
+20105
+20106
+20107
+20108
+20109
+20110
+20111
+20112
+20113
+20114
+20115
+20116
+20117
+20118
+20119
+20120
+20121
+20122
+20123
+20124
+20125
+20126
+20127
+20128
+20129
+20130
+20131
+20132
+20133
+20134
+20135
+20136
+20137
+20138
+20139
+20140
+20141
+20142
+20143
+20144
+20145
+20146
+20147
+20148
+20149
+20150
+20151
+20152
+20153
+20154
+20155
+20156
+20157
+20158
+20159
+20160
+20161
+20162
+20163
+20164
+20165
+20166
+20167
+20168
+20169
+20170
+20171
+20172
+20173
+20174
+20175
+20176
+20177
+20178
+20179
+20180
+20181
+20182
+20183
+20184
+20185
+20186
+20187
+20188
+20189
+20190
+20191
+20192
+20193
+20194
+20195
+20196
+20197
+20198
+20199
+20200
+20201
+20202
+20203
+20204
+20205
+20206
+20207
+20208
+20209
+20210
+20211
+20212
+20213
+20214
+20215
+20216
+20217
+20218
+20219
+20220
+20221
+20222
+20223
+20224
+20225
+20226
+20227
+20228
+20229
+20230
+20231
+20232
+20233
+20234
+20235
+20236
+20237
+20238
+20239
+20240
+20241
+20242
+20243
+20244
+20245
+20246
+20247
+20248
+20249
+20250
+20251
+20252
+20253
+20254
+20255
+20256
+20257
+20258
+20259
+20260
+20261
+20262
+20263
+20264
+20265
+20266
+20267
+20268
+20269
+20270
+20271
+20272
+20273
+20274
+20275
+20276
+20277
+20278
+20279
+20280
+20281
+20282
+20283
+20284
+20285
+20286
+20287
+20288
+20289
+20290
+20291
+20292
+20293
+20294
+20295
+20296
+20297
+20298
+20299
+20300
+20301
+20302
+20303
+20304
+20305
+20306
+20307
+20308
+20309
+20310
+20311
+20312
+20313
+20314
+20315
+20316
+20317
+20318
+20319
+20320
+20321
+20322
+20323
+20324
+20325
+20326
+20327
+20328
+20329
+20330
+20331
+20332
+20333
+20334
+20335
+20336
+20337
+20338
+20339
+20340
+20341
+20342
+20343
+20344
+20345
+20346
+20347
+20348
+20349
+20350
+20351
+20352
+20353
+20354
+20355
+20356
+20357
+20358
+20359
+20360
+20361
+20362
+20363
+20364
+20365
+20366
+20367
+20368
+20369
+20370
+20371
+20372
+20373
+20374
+20375
+20376
+20377
+20378
+20379
+20380
+20381
+20382
+20383
+20384
+20385
+20386
+20387
+20388
+20389
+20390
+20391
+20392
+20393
+20394
+20395
+20396
+20397
+20398
+20399
+20400
+20401
+20402
+20403
+20404
+20405
+20406
+20407
+20408
+20409
+20410
+20411
+20412
+20413
+20414
+20415
+20416
+20417
+20418
+20419
+20420
+20421
+20422
+20423
+20424
+20425
+20426
+20427
+20428
+20429
+20430
+20431
+20432
+20433
+20434
+20435
+20436
+20437
+20438
+20439
+20440
+20441
+20442
+20443
+20444
+20445
+20446
+20447
+20448
+20449
+20450
+20451
+20452
+20453
+20454
+20455
+20456
+20457
+20458
+20459
+20460
+20461
+20462
+20463
+20464
+20465
+20466
+20467
+20468
+20469
+20470
+20471
+20472
+20473
+20474
+20475
+20476
+20477
+20478
+20479
+20480
+20481
+20482
+20483
+20484
+20485
+20486
+20487
+20488
+20489
+20490
+20491
+20492
+20493
+20494
+20495
+20496
+20497
+20498
+20499
+20500
+20501
+20502
+20503
+20504
+20505
+20506
+20507
+20508
+20509
+20510
+20511
+20512
+20513
+20514
+20515
+20516
+20517
+20518
+20519
+20520
+20521
+20522
+20523
+20524
+20525
+20526
+20527
+20528
+20529
+20530
+20531
+20532
+20533
+20534
+20535
+20536
+20537
+20538
+20539
+20540
+20541
+20542
+20543
+20544
+20545
+20546
+20547
+20548
+20549
+20550
+20551
+20552
+20553
+20554
+20555
+20556
+20557
+20558
+20559
+20560
+20561
+20562
+20563
+20564
+20565
+20566
+20567
+20568
+20569
+20570
+20571
+20572
+20573
+20574
+20575
+20576
+20577
+20578
+20579
+20580
+20581
+20582
+20583
+20584
+20585
+20586
+20587
+20588
+20589
+20590
+20591
+20592
+20593
+20594
+20595
+20596
+20597
+20598
+20599
+20600
+20601
+20602
+20603
+20604
+20605
+20606
+20607
+20608
+20609
+20610
+20611
+20612
+20613
+20614
+20615
+20616
+20617
+20618
+20619
+20620
+20621
+20622
+20623
+20624
+20625
+20626
+20627
+20628
+20629
+20630
+20631
+20632
+20633
+20634
+20635
+20636
+20637
+20638
+20639
+20640
+20641
+20642
+20643
+20644
+20645
+20646
+20647
+20648
+20649
+20650
+20651
+20652
+20653
+20654
+20655
+20656
+20657
+20658
+20659
+20660
+20661
+20662
+20663
+20664
+20665
+20666
+20667
+20668
+20669
+20670
+20671
+20672
+20673
+20674
+20675
+20676
+20677
+20678
+20679
+20680
+20681
+20682
+20683
+20684
+20685
+20686
+20687
+20688
+20689
+20690
+20691
+20692
+20693
+20694
+20695
+20696
+20697
+20698
+20699
+20700
+20701
+20702
+20703
+20704
+20705
+20706
+20707
+20708
+20709
+20710
+20711
+20712
+20713
+20714
+20715
+20716
+20717
+20718
+20719
+20720
+20721
+20722
+20723
+20724
+20725
+20726
+20727
+20728
+20729
+20730
+20731
+20732
+20733
+20734
+20735
+20736
+20737
+20738
+20739
+20740
+20741
+20742
+20743
+20744
+20745
+20746
+20747
+20748
+20749
+20750
+20751
+20752
+20753
+20754
+20755
+20756
+20757
+20758
+20759
+20760
+20761
+20762
+20763
+20764
+20765
+20766
+20767
+20768
+20769
+20770
+20771
+20772
+20773
+20774
+20775
+20776
+20777
+20778
+20779
+20780
+20781
+20782
+20783
+20784
+20785
+20786
+20787
+20788
+20789
+20790
+20791
+20792
+20793
+20794
+20795
+20796
+20797
+20798
+20799
+20800
+20801
+20802
+20803
+20804
+20805
+20806
+20807
+20808
+20809
+20810
+20811
+20812
+20813
+20814
+20815
+20816
+20817
+20818
+20819
+20820
+20821
+20822
+20823
+20824
+20825
+20826
+20827
+20828
+20829
+20830
+20831
+20832
+20833
+20834
+20835
+20836
+20837
+20838
+20839
+20840
+20841
+20842
+20843
+20844
+20845
+20846
+20847
+20848
+20849
+20850
+20851
+20852
+20853
+20854
+20855
+20856
+20857
+20858
+20859
+20860
+20861
+20862
+20863
+20864
+20865
+20866
+20867
+20868
+20869
+20870
+20871
+20872
+20873
+20874
+20875
+20876
+20877
+20878
+20879
+20880
+20881
+20882
+20883
+20884
+20885
+20886
+20887
+20888
+20889
+20890
+20891
+20892
+20893
+20894
+20895
+20896
+20897
+20898
+20899
+20900
+20901
+20902
+20903
+20904
+20905
+20906
+20907
+20908
+20909
+20910
+20911
+20912
+20913
+20914
+20915
+20916
+20917
+20918
+20919
+20920
+20921
+20922
+20923
+20924
+20925
+20926
+20927
+20928
+20929
+20930
+20931
+20932
+20933
+20934
+20935
+20936
+20937
+20938
+20939
+20940
+20941
+20942
+20943
+20944
+20945
+20946
+20947
+20948
+20949
+20950
+20951
+20952
+20953
+20954
+20955
+20956
+20957
+20958
+20959
+20960
+20961
+20962
+20963
+20964
+20965
+20966
+20967
+20968
+20969
+20970
+20971
+20972
+20973
+20974
+20975
+20976
+20977
+20978
+20979
+20980
+20981
+20982
+20983
+20984
+20985
+20986
+20987
+20988
+20989
+20990
+20991
+20992
+20993
+20994
+20995
+20996
+20997
+20998
+20999
+21000
+21001
+21002
+21003
+21004
+21005
+21006
+21007
+21008
+21009
+21010
+21011
+21012
+21013
+21014
+21015
+21016
+21017
+21018
+21019
+21020
+21021
+21022
+21023
+21024
+21025
+21026
+21027
+21028
+21029
+21030
+21031
+21032
+21033
+21034
+21035
+21036
+21037
+21038
+21039
+21040
+21041
+21042
+21043
+21044
+21045
+21046
+21047
+21048
+21049
+21050
+21051
+21052
+21053
+21054
+21055
+21056
+21057
+21058
+21059
+21060
+21061
+21062
+21063
+21064
+21065
+21066
+21067
+21068
+21069
+21070
+21071
+21072
+21073
+21074
+21075
+21076
+21077
+21078
+21079
+21080
+21081
+21082
+21083
+21084
+21085
+21086
+21087
+21088
+21089
+21090
+21091
+21092
+21093
+21094
+21095
+21096
+21097
+21098
+21099
+21100
+21101
+21102
+21103
+21104
+21105
+21106
+21107
+21108
+21109
+21110
+21111
+21112
+21113
+21114
+21115
+21116
+21117
+21118
+21119
+21120
+21121
+21122
+21123
+21124
+21125
+21126
+21127
+21128
+21129
+21130
+21131
+21132
+21133
+21134
+21135
+21136
+21137
+21138
+21139
+21140
+21141
+21142
+21143
+21144
+21145
+21146
+21147
+21148
+21149
+21150
+21151
+21152
+21153
+21154
+21155
+21156
+21157
+21158
+21159
+21160
+21161
+21162
+21163
+21164
+21165
+21166
+21167
+21168
+21169
+21170
+21171
+21172
+21173
+21174
+21175
+21176
+21177
+21178
+21179
+21180
+21181
+21182
+21183
+21184
+21185
+21186
+21187
+21188
+21189
+21190
+21191
+21192
+21193
+21194
+21195
+21196
+21197
+21198
+21199
+21200
+21201
+21202
+21203
+21204
+21205
+21206
+21207
+21208
+21209
+21210
+21211
+21212
+21213
+21214
+21215
+21216
+21217
+21218
+21219
+21220
+21221
+21222
+21223
+21224
+21225
+21226
+21227
+21228
+21229
+21230
+21231
+21232
+21233
+21234
+21235
+21236
+21237
+21238
+21239
+21240
+21241
+21242
+21243
+21244
+21245
+21246
+21247
+21248
+21249
+21250
+21251
+21252
+21253
+21254
+21255
+21256
+21257
+21258
+21259
+21260
+21261
+21262
+21263
+21264
+21265
+21266
+21267
+21268
+21269
+21270
+21271
+21272
+21273
+21274
+21275
+21276
+21277
+21278
+21279
+21280
+21281
+21282
+21283
+21284
+21285
+21286
+21287
+21288
+21289
+21290
+21291
+21292
+21293
+21294
+21295
+21296
+21297
+21298
+21299
+21300
+21301
+21302
+21303
+21304
+21305
+21306
+21307
+21308
+21309
+21310
+21311
+21312
+21313
+21314
+21315
+21316
+21317
+21318
+21319
+21320
+21321
+21322
+21323
+21324
+21325
+21326
+21327
+21328
+21329
+21330
+21331
+21332
+21333
+21334
+21335
+21336
+21337
+21338
+21339
+21340
+21341
+21342
+21343
+21344
+21345
+21346
+21347
+21348
+21349
+21350
+21351
+21352
+21353
+21354
+21355
+21356
+21357
+21358
+21359
+21360
+21361
+21362
+21363
+21364
+21365
+21366
+21367
+21368
+21369
+21370
+21371
+21372
+21373
+21374
+21375
+21376
+21377
+21378
+21379
+21380
+21381
+21382
+21383
+21384
+21385
+21386
+21387
+21388
+21389
+21390
+21391
+21392
+21393
+21394
+21395
+21396
+21397
+21398
+21399
+21400
+21401
+21402
+21403
+21404
+21405
+21406
+21407
+21408
+21409
+21410
+21411
+21412
+21413
+21414
+21415
+21416
+21417
+21418
+21419
+21420
+21421
+21422
+21423
+21424
+21425
+21426
+21427
+21428
+21429
+21430
+21431
+21432
+21433
+21434
+21435
+21436
+21437
+21438
+21439
+21440
+21441
+21442
+21443
+21444
+21445
+21446
+21447
+21448
+21449
+21450
+21451
+21452
+21453
+21454
+21455
+21456
+21457
+21458
+21459
+21460
+21461
+21462
+21463
+21464
+21465
+21466
+21467
+21468
+21469
+21470
+21471
+21472
+21473
+21474
+21475
+21476
+21477
+21478
+21479
+21480
+21481
+21482
+21483
+21484
+21485
+21486
+21487
+21488
+21489
+21490
+21491
+21492
+21493
+21494
+21495
+21496
+21497
+21498
+21499
+21500
+21501
+21502
+21503
+21504
+21505
+21506
+21507
+21508
+21509
+21510
+21511
+21512
+21513
+21514
+21515
+21516
+21517
+21518
+21519
+21520
+21521
+21522
+21523
+21524
+21525
+21526
+21527
+21528
+21529
+21530
+21531
+21532
+21533
+21534
+21535
+21536
+21537
+21538
+21539
+21540
+21541
+21542
+21543
+21544
+21545
+21546
+21547
+21548
+21549
+21550
+21551
+21552
+21553
+21554
+21555
+21556
+21557
+21558
+21559
+21560
+21561
+21562
+21563
+21564
+21565
+21566
+21567
+21568
+21569
+21570
+21571
+21572
+21573
+21574
+21575
+21576
+21577
+21578
+21579
+21580
+21581
+21582
+21583
+21584
+21585
+21586
+21587
+21588
+21589
+21590
+21591
+21592
+21593
+21594
+21595
+21596
+21597
+21598
+21599
+21600
+21601
+21602
+21603
+21604
+21605
+21606
+21607
+21608
+21609
+21610
+21611
+21612
+21613
+21614
+21615
+21616
+21617
+21618
+21619
+21620
+21621
+21622
+21623
+21624
+21625
+21626
+21627
+21628
+21629
+21630
+21631
+21632
+21633
+21634
+21635
+21636
+21637
+21638
+21639
+21640
+21641
+21642
+21643
+21644
+21645
+21646
+21647
+21648
+21649
+21650
+21651
+21652
+21653
+21654
+21655
+21656
+21657
+21658
+21659
+21660
+21661
+21662
+21663
+21664
+21665
+21666
+21667
+21668
+21669
+21670
+21671
+21672
+21673
+21674
+21675
+21676
+21677
+21678
+21679
+21680
+21681
+21682
+21683
+21684
+21685
+21686
+21687
+21688
+21689
+21690
+21691
+21692
+21693
+21694
+21695
+21696
+21697
+21698
+21699
+21700
+21701
+21702
+21703
+21704
+21705
+21706
+21707
+21708
+21709
+21710
+21711
+21712
+21713
+21714
+21715
+21716
+21717
+21718
+21719
+21720
+21721
+21722
+21723
+21724
+21725
+21726
+21727
+21728
+21729
+21730
+21731
+21732
+21733
+21734
+21735
+21736
+21737
+21738
+21739
+21740
+21741
+21742
+21743
+21744
+21745
+21746
+21747
+21748
+21749
+21750
+21751
+21752
+21753
+21754
+21755
+21756
+21757
+21758
+21759
+21760
+21761
+21762
+21763
+21764
+21765
+21766
+21767
+21768
+21769
+21770
+21771
+21772
+21773
+21774
+21775
+21776
+21777
+21778
+21779
+21780
+21781
+21782
+21783
+21784
+21785
+21786
+21787
+21788
+21789
+21790
+21791
+21792
+21793
+21794
+21795
+21796
+21797
+21798
+21799
+21800
+21801
+21802
+21803
+21804
+21805
+21806
+21807
+21808
+21809
+21810
+21811
+21812
+21813
+21814
+21815
+21816
+21817
+21818
+21819
+21820
+21821
+21822
+21823
+21824
+21825
+21826
+21827
+21828
+21829
+21830
+21831
+21832
+21833
+21834
+21835
+21836
+21837
+21838
+21839
+21840
+21841
+21842
+21843
+21844
+21845
+21846
+21847
+21848
+21849
+21850
+21851
+21852
+21853
+21854
+21855
+21856
+21857
+21858
+21859
+21860
+21861
+21862
+21863
+21864
+21865
+21866
+21867
+21868
+21869
+21870
+21871
+21872
+21873
+21874
+21875
+21876
+21877
+21878
+21879
+21880
+21881
+21882
+21883
+21884
+21885
+21886
+21887
+21888
+21889
+21890
+21891
+21892
+21893
+21894
+21895
+21896
+21897
+21898
+21899
+21900
+21901
+21902
+21903
+21904
+21905
+21906
+21907
+21908
+21909
+21910
+21911
+21912
+21913
+21914
+21915
+21916
+21917
+21918
+21919
+21920
+21921
+21922
+21923
+21924
+21925
+21926
+21927
+21928
+21929
+21930
+21931
+21932
+21933
+21934
+21935
+21936
+21937
+21938
+21939
+21940
+21941
+21942
+21943
+21944
+21945
+21946
+21947
+21948
+21949
+21950
+21951
+21952
+21953
+21954
+21955
+21956
+21957
+21958
+21959
+21960
+21961
+21962
+21963
+21964
+21965
+21966
+21967
+21968
+21969
+21970
+21971
+21972
+21973
+21974
+21975
+21976
+21977
+21978
+21979
+21980
+21981
+21982
+21983
+21984
+21985
+21986
+21987
+21988
+21989
+21990
+21991
+21992
+21993
+21994
+21995
+21996
+21997
+21998
+21999
+22000
+22001
+22002
+22003
+22004
+22005
+22006
+22007
+22008
+22009
+22010
+22011
+22012
+22013
+22014
+22015
+22016
+22017
+22018
+22019
+22020
+22021
+22022
+22023
+22024
+22025
+22026
+22027
+22028
+22029
+22030
+22031
+22032
+22033
+22034
+22035
+22036
+22037
+22038
+22039
+22040
+22041
+22042
+22043
+22044
+22045
+22046
+22047
+22048
+22049
+22050
+22051
+22052
+22053
+22054
+22055
+22056
+22057
+22058
+22059
+22060
+22061
+22062
+22063
+22064
+22065
+22066
+22067
+22068
+22069
+22070
+22071
+22072
+22073
+22074
+22075
+22076
+22077
+22078
+22079
+22080
+22081
+22082
+22083
+22084
+22085
+22086
+22087
+22088
+22089
+22090
+22091
+22092
+22093
+22094
+22095
+22096
+22097
+22098
+22099
+22100
+22101
+22102
+22103
+22104
+22105
+22106
+22107
+22108
+22109
+22110
+22111
+22112
+22113
+22114
+22115
+22116
+22117
+22118
+22119
+22120
+22121
+22122
+22123
+22124
+22125
+22126
+22127
+22128
+22129
+22130
+22131
+22132
+22133
+22134
+22135
+22136
+22137
+22138
+22139
+22140
+22141
+22142
+22143
+22144
+22145
+22146
+22147
+22148
+22149
+22150
+22151
+22152
+22153
+22154
+22155
+22156
+22157
+22158
+22159
+22160
+22161
+22162
+22163
+22164
+22165
+22166
+22167
+22168
+22169
+22170
+22171
+22172
+22173
+22174
+22175
+22176
+22177
+22178
+22179
+22180
+22181
+22182
+22183
+22184
+22185
+22186
+22187
+22188
+22189
+22190
+22191
+22192
+22193
+22194
+22195
+22196
+22197
+22198
+22199
+22200
+22201
+22202
+22203
+22204
+22205
+22206
+22207
+22208
+22209
+22210
+22211
+22212
+22213
+22214
+22215
+22216
+22217
+22218
+22219
+22220
+22221
+22222
+22223
+22224
+22225
+22226
+22227
+22228
+22229
+22230
+22231
+22232
+22233
+22234
+22235
+22236
+22237
+22238
+22239
+22240
+22241
+22242
+22243
+22244
+22245
+22246
+22247
+22248
+22249
+22250
+22251
+22252
+22253
+22254
+22255
+22256
+22257
+22258
+22259
+22260
+22261
+22262
+22263
+22264
+22265
+22266
+22267
+22268
+22269
+22270
+22271
+22272
+22273
+22274
+22275
+22276
+22277
+22278
+22279
+22280
+22281
+22282
+22283
+22284
+22285
+22286
+22287
+22288
+22289
+22290
+22291
+22292
+22293
+22294
+22295
+22296
+22297
+22298
+22299
+22300
+22301
+22302
+22303
+22304
+22305
+22306
+22307
+22308
+22309
+22310
+22311
+22312
+22313
+22314
+22315
+22316
+22317
+22318
+22319
+22320
+22321
+22322
+22323
+22324
+22325
+22326
+22327
+22328
+22329
+22330
+22331
+22332
+22333
+22334
+22335
+22336
+22337
+22338
+22339
+22340
+22341
+22342
+22343
+22344
+22345
+22346
+22347
+22348
+22349
+22350
+22351
+22352
+22353
+22354
+22355
+22356
+22357
+22358
+22359
+22360
+22361
+22362
+22363
+22364
+22365
+22366
+22367
+22368
+22369
+22370
+22371
+22372
+22373
+22374
+22375
+22376
+22377
+22378
+22379
+22380
+22381
+22382
+22383
+22384
+22385
+22386
+22387
+22388
+22389
+22390
+22391
+22392
+22393
+22394
+22395
+22396
+22397
+22398
+22399
+22400
+22401
+22402
+22403
+22404
+22405
+22406
+22407
+22408
+22409
+22410
+22411
+22412
+22413
+22414
+22415
+22416
+22417
+22418
+22419
+22420
+22421
+22422
+22423
+22424
+22425
+22426
+22427
+22428
+22429
+22430
+22431
+22432
+22433
+22434
+22435
+22436
+22437
+22438
+22439
+22440
+22441
+22442
+22443
+22444
+22445
+22446
+22447
+22448
+22449
+22450
+22451
+22452
+22453
+22454
+22455
+22456
+22457
+22458
+22459
+22460
+22461
+22462
+22463
+22464
+22465
+22466
+22467
+22468
+22469
+22470
+22471
+22472
+22473
+22474
+22475
+22476
+22477
+22478
+22479
+22480
+22481
+22482
+22483
+22484
+22485
+22486
+22487
+22488
+22489
+22490
+22491
+22492
+22493
+22494
+22495
+22496
+22497
+22498
+22499
+22500
+22501
+22502
+22503
+22504
+22505
+22506
+22507
+22508
+22509
+22510
+22511
+22512
+22513
+22514
+22515
+22516
+22517
+22518
+22519
+22520
+22521
+22522
+22523
+22524
+22525
+22526
+22527
+22528
+22529
+22530
+22531
+22532
+22533
+22534
+22535
+22536
+22537
+22538
+22539
+22540
+22541
+22542
+22543
+22544
+22545
+22546
+22547
+22548
+22549
+22550
+22551
+22552
+22553
+22554
+22555
+22556
+22557
+22558
+22559
+22560
+22561
+22562
+22563
+22564
+22565
+22566
+22567
+22568
+22569
+22570
+22571
+22572
+22573
+22574
+22575
+22576
+22577
+22578
+22579
+22580
+22581
+22582
+22583
+22584
+22585
+22586
+22587
+22588
+22589
+22590
+22591
+22592
+22593
+22594
+22595
+22596
+22597
+22598
+22599
+22600
+22601
+22602
+22603
+22604
+22605
+22606
+22607
+22608
+22609
+22610
+22611
+22612
+22613
+22614
+22615
+22616
+22617
+22618
+22619
+22620
+22621
+22622
+22623
+22624
+22625
+22626
+22627
+22628
+22629
+22630
+22631
+22632
+22633
+22634
+22635
+22636
+22637
+22638
+22639
+22640
+22641
+22642
+22643
+22644
+22645
+22646
+22647
+22648
+22649
+22650
+22651
+22652
+22653
+22654
+22655
+22656
+22657
+22658
+22659
+22660
+22661
+22662
+22663
+22664
+22665
+22666
+22667
+22668
+22669
+22670
+22671
+22672
+22673
+22674
+22675
+22676
+22677
+22678
+22679
+22680
+22681
+22682
+22683
+22684
+22685
+22686
+22687
+22688
+22689
+22690
+22691
+22692
+22693
+22694
+22695
+22696
+22697
+22698
+22699
+22700
+22701
+22702
+22703
+22704
+22705
+22706
+22707
+22708
+22709
+22710
+22711
+22712
+22713
+22714
+22715
+22716
+22717
+22718
+22719
+22720
+22721
+22722
+22723
+22724
+22725
+22726
+22727
+22728
+22729
+22730
+22731
+22732
+22733
+22734
+22735
+22736
+22737
+22738
+22739
+22740
+22741
+22742
+22743
+22744
+22745
+22746
+22747
+22748
+22749
+22750
+22751
+22752
+22753
+22754
+22755
+22756
+22757
+22758
+22759
+22760
+22761
+22762
+22763
+22764
+22765
+22766
+22767
+22768
+22769
+22770
+22771
+22772
+22773
+22774
+22775
+22776
+22777
+22778
+22779
+22780
+22781
+22782
+22783
+22784
+22785
+22786
+22787
+22788
+22789
+22790
+22791
+22792
+22793
+22794
+22795
+22796
+22797
+22798
+22799
+22800
+22801
+22802
+22803
+22804
+22805
+22806
+22807
+22808
+22809
+22810
+22811
+22812
+22813
+22814
+22815
+22816
+22817
+22818
+22819
+22820
+22821
+22822
+22823
+22824
+22825
+22826
+22827
+22828
+22829
+22830
+22831
+22832
+22833
+22834
+22835
+22836
+22837
+22838
+22839
+22840
+22841
+22842
+22843
+22844
+22845
+22846
+22847
+22848
+22849
+22850
+22851
+22852
+22853
+22854
+22855
+22856
+22857
+22858
+22859
+22860
+22861
+22862
+22863
+22864
+22865
+22866
+22867
+22868
+22869
+22870
+22871
+22872
+22873
+22874
+22875
+22876
+22877
+22878
+22879
+22880
+22881
+22882
+22883
+22884
+22885
+22886
+22887
+22888
+22889
+22890
+22891
+22892
+22893
+22894
+22895
+22896
+22897
+22898
+22899
+22900
+22901
+22902
+22903
+22904
+22905
+22906
+22907
+22908
+22909
+22910
+22911
+22912
+22913
+22914
+22915
+22916
+22917
+22918
+22919
+22920
+22921
+22922
+22923
+22924
+22925
+22926
+22927
+22928
+22929
+22930
+22931
+22932
+22933
+22934
+22935
+22936
+22937
+22938
+22939
+22940
+22941
+22942
+22943
+22944
+22945
+22946
+22947
+22948
+22949
+22950
+22951
+22952
+22953
+22954
+22955
+22956
+22957
+22958
+22959
+22960
+22961
+22962
+22963
+22964
+22965
+22966
+22967
+22968
+22969
+22970
+22971
+22972
+22973
+22974
+22975
+22976
+22977
+22978
+22979
+22980
+22981
+22982
+22983
+22984
+22985
+22986
+22987
+22988
+22989
+22990
+22991
+22992
+22993
+22994
+22995
+22996
+22997
+22998
+22999
+23000
+23001
+23002
+23003
+23004
+23005
+23006
+23007
+23008
+23009
+23010
+23011
+23012
+23013
+23014
+23015
+23016
+23017
+23018
+23019
+23020
+23021
+23022
+23023
+23024
+23025
+23026
+23027
+23028
+23029
+23030
+23031
+23032
+23033
+23034
+23035
+23036
+23037
+23038
+23039
+23040
+23041
+23042
+23043
+23044
+23045
+23046
+23047
+23048
+23049
+23050
+23051
+23052
+23053
+23054
+23055
+23056
+23057
+23058
+23059
+23060
+23061
+23062
+23063
+23064
+23065
+23066
+23067
+23068
+23069
+23070
+23071
+23072
+23073
+23074
+23075
+23076
+23077
+23078
+23079
+23080
+23081
+23082
+23083
+23084
+23085
+23086
+23087
+23088
+23089
+23090
+23091
+23092
+23093
+23094
+23095
+23096
+23097
+23098
+23099
+23100
+23101
+23102
+23103
+23104
+23105
+23106
+23107
+23108
+23109
+23110
+23111
+23112
+23113
+23114
+23115
+23116
+23117
+23118
+23119
+23120
+23121
+23122
+23123
+23124
+23125
+23126
+23127
+23128
+23129
+23130
+23131
+23132
+23133
+23134
+23135
+23136
+23137
+23138
+23139
+23140
+23141
+23142
+23143
+23144
+23145
+23146
+23147
+23148
+23149
+23150
+23151
+23152
+23153
+23154
+23155
+23156
+23157
+23158
+23159
+23160
+23161
+23162
+23163
+23164
+23165
+23166
+23167
+23168
+23169
+23170
+23171
+23172
+23173
+23174
+23175
+23176
+23177
+23178
+23179
+23180
+23181
+23182
+23183
+23184
+23185
+23186
+23187
+23188
+23189
+23190
+23191
+23192
+23193
+23194
+23195
+23196
+23197
+23198
+23199
+23200
+23201
+23202
+23203
+23204
+23205
+23206
+23207
+23208
+23209
+23210
+23211
+23212
+23213
+23214
+23215
+23216
+23217
+23218
+23219
+23220
+23221
+23222
+23223
+23224
+23225
+23226
+23227
+23228
+23229
+23230
+23231
+23232
+23233
+23234
+23235
+23236
+23237
+23238
+23239
+23240
+23241
+23242
+23243
+23244
+23245
+23246
+23247
+23248
+23249
+23250
+23251
+23252
+23253
+23254
+23255
+23256
+23257
+23258
+23259
+23260
+23261
+23262
+23263
+23264
+23265
+23266
+23267
+23268
+23269
+23270
+23271
+23272
+23273
+23274
+23275
+23276
+23277
+23278
+23279
+23280
+23281
+23282
+23283
+23284
+23285
+23286
+23287
+23288
+23289
+23290
+23291
+23292
+23293
+23294
+23295
+23296
+23297
+23298
+23299
+23300
+23301
+23302
+23303
+23304
+23305
+23306
+23307
+23308
+23309
+23310
+23311
+23312
+23313
+23314
+23315
+23316
+23317
+23318
+23319
+23320
+23321
+23322
+23323
+23324
+23325
+23326
+23327
+23328
+23329
+23330
+23331
+23332
+23333
+23334
+23335
+23336
+23337
+23338
+23339
+23340
+23341
+23342
+23343
+23344
+23345
+23346
+23347
+23348
+23349
+23350
+23351
+23352
+23353
+23354
+23355
+23356
+23357
+23358
+23359
+23360
+23361
+23362
+23363
+23364
+23365
+23366
+23367
+23368
+23369
+23370
+23371
+23372
+23373
+23374
+23375
+23376
+23377
+23378
+23379
+23380
+23381
+23382
+23383
+23384
+23385
+23386
+23387
+23388
+23389
+23390
+23391
+23392
+23393
+23394
+23395
+23396
+23397
+23398
+23399
+23400
+23401
+23402
+23403
+23404
+23405
+23406
+23407
+23408
+23409
+23410
+23411
+23412
+23413
+23414
+23415
+23416
+23417
+23418
+23419
+23420
+23421
+23422
+23423
+23424
+23425
+23426
+23427
+23428
+23429
+23430
+23431
+23432
+23433
+23434
+23435
+23436
+23437
+23438
+23439
+23440
+23441
+23442
+23443
+23444
+23445
+23446
+23447
+23448
+23449
+23450
+23451
+23452
+23453
+23454
+23455
+23456
+23457
+23458
+23459
+23460
+23461
+23462
+23463
+23464
+23465
+23466
+23467
+23468
+23469
+23470
+23471
+23472
+23473
+23474
+23475
+23476
+23477
+23478
+23479
+23480
+23481
+23482
+23483
+23484
+23485
+23486
+23487
+23488
+23489
+23490
+23491
+23492
+23493
+23494
+23495
+23496
+23497
+23498
+23499
+23500
+23501
+23502
+23503
+23504
+23505
+23506
+23507
+23508
+23509
+23510
+23511
+23512
+23513
+23514
+23515
+23516
+23517
+23518
+23519
+23520
+23521
+23522
+23523
+23524
+23525
+23526
+23527
+23528
+23529
+23530
+23531
+23532
+23533
+23534
+23535
+23536
+23537
+23538
+23539
+23540
+23541
+23542
+23543
+23544
+23545
+23546
+23547
+23548
+23549
+23550
+23551
+23552
+23553
+23554
+23555
+23556
+23557
+23558
+23559
+23560
+23561
+23562
+23563
+23564
+23565
+23566
+23567
+23568
+23569
+23570
+23571
+23572
+23573
+23574
+23575
+23576
+23577
+23578
+23579
+23580
+23581
+23582
+23583
+23584
+23585
+23586
+23587
+23588
+23589
+23590
+23591
+23592
+23593
+23594
+23595
+23596
+23597
+23598
+23599
+23600
+23601
+23602
+23603
+23604
+23605
+23606
+23607
+23608
+23609
+23610
+23611
+23612
+23613
+23614
+23615
+23616
+23617
+23618
+23619
+23620
+23621
+23622
+23623
+23624
+23625
+23626
+23627
+23628
+23629
+23630
+23631
+23632
+23633
+23634
+23635
+23636
+23637
+23638
+23639
+23640
+23641
+23642
+23643
+23644
+23645
+23646
+23647
+23648
+23649
+23650
+23651
+23652
+23653
+23654
+23655
+23656
+23657
+23658
+23659
+23660
+23661
+23662
+23663
+23664
+23665
+23666
+23667
+23668
+23669
+23670
+23671
+23672
+23673
+23674
+23675
+23676
+23677
+23678
+23679
+23680
+23681
+23682
+23683
+23684
+23685
+23686
+23687
+23688
+23689
+23690
+23691
+23692
+23693
+23694
+23695
+23696
+23697
+23698
+23699
+23700
+23701
+23702
+23703
+23704
+23705
+23706
+23707
+23708
+23709
+23710
+23711
+23712
+23713
+23714
+23715
+23716
+23717
+23718
+23719
+23720
+23721
+23722
+23723
+23724
+23725
+23726
+23727
+23728
+23729
+23730
+23731
+23732
+23733
+23734
+23735
+23736
+23737
+23738
+23739
+23740
+23741
+23742
+23743
+23744
+23745
+23746
+23747
+23748
+23749
+23750
+23751
+23752
+23753
+23754
+23755
+23756
+23757
+23758
+23759
+23760
+23761
+23762
+23763
+23764
+23765
+23766
+23767
+23768
+23769
+23770
+23771
+23772
+23773
+23774
+23775
+23776
+23777
+23778
+23779
+23780
+23781
+23782
+23783
+23784
+23785
+23786
+23787
+23788
+23789
+23790
+23791
+23792
+23793
+23794
+23795
+23796
+23797
+23798
+23799
+23800
+23801
+23802
+23803
+23804
+23805
+23806
+23807
+23808
+23809
+23810
+23811
+23812
+23813
+23814
+23815
+23816
+23817
+23818
+23819
+23820
+23821
+23822
+23823
+23824
+23825
+23826
+23827
+23828
+23829
+23830
+23831
+23832
+23833
+23834
+23835
+23836
+23837
+23838
+23839
+23840
+23841
+23842
+23843
+23844
+23845
+23846
+23847
+23848
+23849
+23850
+23851
+23852
+23853
+23854
+23855
+23856
+23857
+23858
+23859
+23860
+23861
+23862
+23863
+23864
+23865
+23866
+23867
+23868
+23869
+23870
+23871
+23872
+23873
+23874
+23875
+23876
+23877
+23878
+23879
+23880
+23881
+23882
+23883
+23884
+23885
+23886
+23887
+23888
+23889
+23890
+23891
+23892
+23893
+23894
+23895
+23896
+23897
+23898
+23899
+23900
+23901
+23902
+23903
+23904
+23905
+23906
+23907
+23908
+23909
+23910
+23911
+23912
+23913
+23914
+23915
+23916
+23917
+23918
+23919
+23920
+23921
+23922
+23923
+23924
+23925
+23926
+23927
+23928
+23929
+23930
+23931
+23932
+23933
+23934
+23935
+23936
+23937
+23938
+23939
+23940
+23941
+23942
+23943
+23944
+23945
+23946
+23947
+23948
+23949
+23950
+23951
+23952
+23953
+23954
+23955
+23956
+23957
+23958
+23959
+23960
+23961
+23962
+23963
+23964
+23965
+23966
+23967
+23968
+23969
+23970
+23971
+23972
+23973
+23974
+23975
+23976
+23977
+23978
+23979
+23980
+23981
+23982
+23983
+23984
+23985
+23986
+23987
+23988
+23989
+23990
+23991
+23992
+23993
+23994
+23995
+23996
+23997
+23998
+23999
+24000
+24001
+24002
+24003
+24004
+24005
+24006
+24007
+24008
+24009
+24010
+24011
+24012
+24013
+24014
+24015
+24016
+24017
+24018
+24019
+24020
+24021
+24022
+24023
+24024
+24025
+24026
+24027
+24028
+24029
+24030
+24031
+24032
+24033
+24034
+24035
+24036
+24037
+24038
+24039
+24040
+24041
+24042
+24043
+24044
+24045
+24046
+24047
+24048
+24049
+24050
+24051
+24052
+24053
+24054
+24055
+24056
+24057
+24058
+24059
+24060
+24061
+24062
+24063
+24064
+24065
+24066
+24067
+24068
+24069
+24070
+24071
+24072
+24073
+24074
+24075
+24076
+24077
+24078
+24079
+24080
+24081
+24082
+24083
+24084
+24085
+24086
+24087
+24088
+24089
+24090
+24091
+24092
+24093
+24094
+24095
+24096
+24097
+24098
+24099
+24100
+24101
+24102
+24103
+24104
+24105
+24106
+24107
+24108
+24109
+24110
+24111
+24112
+24113
+24114
+24115
+24116
+24117
+24118
+24119
+24120
+24121
+24122
+24123
+24124
+24125
+24126
+24127
+24128
+24129
+24130
+24131
+24132
+24133
+24134
+24135
+24136
+24137
+24138
+24139
+24140
+24141
+24142
+24143
+24144
+24145
+24146
+24147
+24148
+24149
+24150
+24151
+24152
+24153
+24154
+24155
+24156
+24157
+24158
+24159
+24160
+24161
+24162
+24163
+24164
+24165
+24166
+24167
+24168
+24169
+24170
+24171
+24172
+24173
+24174
+24175
+24176
+24177
+24178
+24179
+24180
+24181
+24182
+24183
+24184
+24185
+24186
+24187
+24188
+24189
+24190
+24191
+24192
+24193
+24194
+24195
+24196
+24197
+24198
+24199
+24200
+24201
+24202
+24203
+24204
+24205
+24206
+24207
+24208
+24209
+24210
+24211
+24212
+24213
+24214
+24215
+24216
+24217
+24218
+24219
+24220
+24221
+24222
+24223
+24224
+24225
+24226
+24227
+24228
+24229
+24230
+24231
+24232
+24233
+24234
+24235
+24236
+24237
+24238
+24239
+24240
+24241
+24242
+24243
+24244
+24245
+24246
+24247
+24248
+24249
+24250
+24251
+24252
+24253
+24254
+24255
+24256
+24257
+24258
+24259
+24260
+24261
+24262
+24263
+24264
+24265
+24266
+24267
+24268
+24269
+24270
+24271
+24272
+24273
+24274
+24275
+24276
+24277
+24278
+24279
+24280
+24281
+24282
+24283
+24284
+24285
+24286
+24287
+24288
+24289
+24290
+24291
+24292
+24293
+24294
+24295
+24296
+24297
+24298
+24299
+24300
+24301
+24302
+24303
+24304
+24305
+24306
+24307
+24308
+24309
+24310
+24311
+24312
+24313
+24314
+24315
+24316
+24317
+24318
+24319
+24320
+24321
+24322
+24323
+24324
+24325
+24326
+24327
+24328
+24329
+24330
+24331
+24332
+24333
+24334
+24335
+24336
+24337
+24338
+24339
+24340
+24341
+24342
+24343
+24344
+24345
+24346
+24347
+24348
+24349
+24350
+24351
+24352
+24353
+24354
+24355
+24356
+24357
+24358
+24359
+24360
+24361
+24362
+24363
+24364
+24365
+24366
+24367
+24368
+24369
+24370
+24371
+24372
+24373
+24374
+24375
+24376
+24377
+24378
+24379
+24380
+24381
+24382
+24383
+24384
+24385
+24386
+24387
+24388
+24389
+24390
+24391
+24392
+24393
+24394
+24395
+24396
+24397
+24398
+24399
+24400
+24401
+24402
+24403
+24404
+24405
+24406
+24407
+24408
+24409
+24410
+24411
+24412
+24413
+24414
+24415
+24416
+24417
+24418
+24419
+24420
+24421
+24422
+24423
+24424
+24425
+24426
+24427
+24428
+24429
+24430
+24431
+24432
+24433
+24434
+24435
+24436
+24437
+24438
+24439
+24440
+24441
+24442
+24443
+24444
+24445
+24446
+24447
+24448
+24449
+24450
+24451
+24452
+24453
+24454
+24455
+24456
+24457
+24458
+24459
+24460
+24461
+24462
+24463
+24464
+24465
+24466
+24467
+24468
+24469
+24470
+24471
+24472
+24473
+24474
+24475
+24476
+24477
+24478
+24479
+24480
+24481
+24482
+24483
+24484
+24485
+24486
+24487
+24488
+24489
+24490
+24491
+24492
+24493
+24494
+24495
+24496
+24497
+24498
+24499
+24500
+24501
+24502
+24503
+24504
+24505
+24506
+24507
+24508
+24509
+24510
+24511
+24512
+24513
+24514
+24515
+24516
+24517
+24518
+24519
+24520
+24521
+24522
+24523
+24524
+24525
+24526
+24527
+24528
+24529
+24530
+24531
+24532
+24533
+24534
+24535
+24536
+24537
+24538
+24539
+24540
+24541
+24542
+24543
+24544
+24545
+24546
+24547
+24548
+24549
+24550
+24551
+24552
+24553
+24554
+24555
+24556
+24557
+24558
+24559
+24560
+24561
+24562
+24563
+24564
+24565
+24566
+24567
+24568
+24569
+24570
+24571
+24572
+24573
+24574
+24575
+24576
+24577
+24578
+24579
+24580
+24581
+24582
+24583
+24584
+24585
+24586
+24587
+24588
+24589
+24590
+24591
+24592
+24593
+24594
+24595
+24596
+24597
+24598
+24599
+24600
+24601
+24602
+24603
+24604
+24605
+24606
+24607
+24608
+24609
+24610
+24611
+24612
+24613
+24614
+24615
+24616
+24617
+24618
+24619
+24620
+24621
+24622
+24623
+24624
+24625
+24626
+24627
+24628
+24629
+24630
+24631
+24632
+24633
+24634
+24635
+24636
+24637
+24638
+24639
+24640
+24641
+24642
+24643
+24644
+24645
+24646
+24647
+24648
+24649
+24650
+24651
+24652
+24653
+24654
+24655
+24656
+24657
+24658
+24659
+24660
+24661
+24662
+24663
+24664
+24665
+24666
+24667
+24668
+24669
+24670
+24671
+24672
+24673
+24674
+24675
+24676
+24677
+24678
+24679
+24680
+24681
+24682
+24683
+24684
+24685
+24686
+24687
+24688
+24689
+24690
+24691
+24692
+24693
+24694
+24695
+24696
+24697
+24698
+24699
+24700
+24701
+24702
+24703
+24704
+24705
+24706
+24707
+24708
+24709
+24710
+24711
+24712
+24713
+24714
+24715
+24716
+24717
+24718
+24719
+24720
+24721
+24722
+24723
+24724
+24725
+24726
+24727
+24728
+24729
+24730
+24731
+24732
+24733
+24734
+24735
+24736
+24737
+24738
+24739
+24740
+24741
+24742
+24743
+24744
+24745
+24746
+24747
+24748
+24749
+24750
+24751
+24752
+24753
+24754
+24755
+24756
+24757
+24758
+24759
+24760
+24761
+24762
+24763
+24764
+24765
+24766
+24767
+24768
+24769
+24770
+24771
+24772
+24773
+24774
+24775
+24776
+24777
+24778
+24779
+24780
+24781
+24782
+24783
+24784
+24785
+24786
+24787
+24788
+24789
+24790
+24791
+24792
+24793
+24794
+24795
+24796
+24797
+24798
+24799
+24800
+24801
+24802
+24803
+24804
+24805
+24806
+24807
+24808
+24809
+24810
+24811
+24812
+24813
+24814
+24815
+24816
+24817
+24818
+24819
+24820
+24821
+24822
+24823
+24824
+24825
+24826
+24827
+24828
+24829
+24830
+24831
+24832
+24833
+24834
+24835
+24836
+24837
+24838
+24839
+24840
+24841
+24842
+24843
+24844
+24845
+24846
+24847
+24848
+24849
+24850
+24851
+24852
+24853
+24854
+24855
+24856
+24857
+24858
+24859
+24860
+24861
+24862
+24863
+24864
+24865
+24866
+24867
+24868
+24869
+24870
+24871
+24872
+24873
+24874
+24875
+24876
+24877
+24878
+24879
+24880
+24881
+24882
+24883
+24884
+24885
+24886
+24887
+24888
+24889
+24890
+24891
+24892
+24893
+24894
+24895
+24896
+24897
+24898
+24899
+24900
+24901
+24902
+24903
+24904
+24905
+24906
+24907
+24908
+24909
+24910
+24911
+24912
+24913
+24914
+24915
+24916
+24917
+24918
+24919
+24920
+24921
+24922
+24923
+24924
+24925
+24926
+24927
+24928
+24929
+24930
+24931
+24932
+24933
+24934
+24935
+24936
+24937
+24938
+24939
+24940
+24941
+24942
+24943
+24944
+24945
+24946
+24947
+24948
+24949
+24950
+24951
+24952
+24953
+24954
+24955
+24956
+24957
+24958
+24959
+24960
+24961
+24962
+24963
+24964
+24965
+24966
+24967
+24968
+24969
+24970
+24971
+24972
+24973
+24974
+24975
+24976
+24977
+24978
+24979
+24980
+24981
+24982
+24983
+24984
+24985
+24986
+24987
+24988
+24989
+24990
+24991
+24992
+24993
+24994
+24995
+24996
+24997
+24998
+24999
+25000
+25001
+25002
+25003
+25004
+25005
+25006
+25007
+25008
+25009
+25010
+25011
+25012
+25013
+25014
+25015
+25016
+25017
+25018
+25019
+25020
+25021
+25022
+25023
+25024
+25025
+25026
+25027
+25028
+25029
+25030
+25031
+25032
+25033
+25034
+25035
+25036
+25037
+25038
+25039
+25040
+25041
+25042
+25043
+25044
+25045
+25046
+25047
+25048
+25049
+25050
+25051
+25052
+25053
+25054
+25055
+25056
+25057
+25058
+25059
+25060
+25061
+25062
+25063
+25064
+25065
+25066
+25067
+25068
+25069
+25070
+25071
+25072
+25073
+25074
+25075
+25076
+25077
+25078
+25079
+25080
+25081
+25082
+25083
+25084
+25085
+25086
+25087
+25088
+25089
+25090
+25091
+25092
+25093
+25094
+25095
+25096
+25097
+25098
+25099
+25100
+25101
+25102
+25103
+25104
+25105
+25106
+25107
+25108
+25109
+25110
+25111
+25112
+25113
+25114
+25115
+25116
+25117
+25118
+25119
+25120
+25121
+25122
+25123
+25124
+25125
+25126
+25127
+25128
+25129
+25130
+25131
+25132
+25133
+25134
+25135
+25136
+25137
+25138
+25139
+25140
+25141
+25142
+25143
+25144
+25145
+25146
+25147
+25148
+25149
+25150
+25151
+25152
+25153
+25154
+25155
+25156
+25157
+25158
+25159
+25160
+25161
+25162
+25163
+25164
+25165
+25166
+25167
+25168
+25169
+25170
+25171
+25172
+25173
+25174
+25175
+25176
+25177
+25178
+25179
+25180
+25181
+25182
+25183
+25184
+25185
+25186
+25187
+25188
+25189
+25190
+25191
+25192
+25193
+25194
+25195
+25196
+25197
+25198
+25199
+25200
+25201
+25202
+25203
+25204
+25205
+25206
+25207
+25208
+25209
+25210
+25211
+25212
+25213
+25214
+25215
+25216
+25217
+25218
+25219
+25220
+25221
+25222
+25223
+25224
+25225
+25226
+25227
+25228
+25229
+25230
+25231
+25232
+25233
+25234
+25235
+25236
+25237
+25238
+25239
+25240
+25241
+25242
+25243
+25244
+25245
+25246
+25247
+25248
+25249
+25250
+25251
+25252
+25253
+25254
+25255
+25256
+25257
+25258
+25259
+25260
+25261
+25262
+25263
+25264
+25265
+25266
+25267
+25268
+25269
+25270
+25271
+25272
+25273
+25274
+25275
+25276
+25277
+25278
+25279
+25280
+25281
+25282
+25283
+25284
+25285
+25286
+25287
+25288
+25289
+25290
+25291
+25292
+25293
+25294
+25295
+25296
+25297
+25298
+25299
+25300
+25301
+25302
+25303
+25304
+25305
+25306
+25307
+25308
+25309
+25310
+25311
+25312
+25313
+25314
+25315
+25316
+25317
+25318
+25319
+25320
+25321
+25322
+25323
+25324
+25325
+25326
+25327
+25328
+25329
+25330
+25331
+25332
+25333
+25334
+25335
+25336
+25337
+25338
+25339
+25340
+25341
+25342
+25343
+25344
+25345
+25346
+25347
+25348
+25349
+25350
+25351
+25352
+25353
+25354
+25355
+25356
+25357
+25358
+25359
+25360
+25361
+25362
+25363
+25364
+25365
+25366
+25367
+25368
+25369
+25370
+25371
+25372
+25373
+25374
+25375
+25376
+25377
+25378
+25379
+25380
+25381
+25382
+25383
+25384
+25385
+25386
+25387
+25388
+25389
+25390
+25391
+25392
+25393
+25394
+25395
+25396
+25397
+25398
+25399
+25400
+25401
+25402
+25403
+25404
+25405
+25406
+25407
+25408
+25409
+25410
+25411
+25412
+25413
+25414
+25415
+25416
+25417
+25418
+25419
+25420
+25421
+25422
+25423
+25424
+25425
+25426
+25427
+25428
+25429
+25430
+25431
+25432
+25433
+25434
+25435
+25436
+25437
+25438
+25439
+25440
+25441
+25442
+25443
+25444
+25445
+25446
+25447
+25448
+25449
+25450
+25451
+25452
+25453
+25454
+25455
+25456
+25457
+25458
+25459
+25460
+25461
+25462
+25463
+25464
+25465
+25466
+25467
+25468
+25469
+25470
+25471
+25472
+25473
+25474
+25475
+25476
+25477
+25478
+25479
+25480
+25481
+25482
+25483
+25484
+25485
+25486
+25487
+25488
+25489
+25490
+25491
+25492
+25493
+25494
+25495
+25496
+25497
+25498
+25499
+25500
+25501
+25502
+25503
+25504
+25505
+25506
+25507
+25508
+25509
+25510
+25511
+25512
+25513
+25514
+25515
+25516
+25517
+25518
+25519
+25520
+25521
+25522
+25523
+25524
+25525
+25526
+25527
+25528
+25529
+25530
+25531
+25532
+25533
+25534
+25535
+25536
+25537
+25538
+25539
+25540
+25541
+25542
+25543
+25544
+25545
+25546
+25547
+25548
+25549
+25550
+25551
+25552
+25553
+25554
+25555
+25556
+25557
+25558
+25559
+25560
+25561
+25562
+25563
+25564
+25565
+25566
+25567
+25568
+25569
+25570
+25571
+25572
+25573
+25574
+25575
+25576
+25577
+25578
+25579
+25580
+25581
+25582
+25583
+25584
+25585
+25586
+25587
+25588
+25589
+25590
+25591
+25592
+25593
+25594
+25595
+25596
+25597
+25598
+25599
+25600
+25601
+25602
+25603
+25604
+25605
+25606
+25607
+25608
+25609
+25610
+25611
+25612
+25613
+25614
+25615
+25616
+25617
+25618
+25619
+25620
+25621
+25622
+25623
+25624
+25625
+25626
+25627
+25628
+25629
+25630
+25631
+25632
+25633
+25634
+25635
+25636
+25637
+25638
+25639
+25640
+25641
+25642
+25643
+25644
+25645
+25646
+25647
+25648
+25649
+25650
+25651
+25652
+25653
+25654
+25655
+25656
+25657
+25658
+25659
+25660
+25661
+25662
+25663
+25664
+25665
+25666
+25667
+25668
+25669
+25670
+25671
+25672
+25673
+25674
+25675
+25676
+25677
+25678
+25679
+25680
+25681
+25682
+25683
+25684
+25685
+25686
+25687
+25688
+25689
+25690
+25691
+25692
+25693
+25694
+25695
+25696
+25697
+25698
+25699
+25700
+25701
+25702
+25703
+25704
+25705
+25706
+25707
+25708
+25709
+25710
+25711
+25712
+25713
+25714
+25715
+25716
+25717
+25718
+25719
+25720
+25721
+25722
+25723
+25724
+25725
+25726
+25727
+25728
+25729
+25730
+25731
+25732
+25733
+25734
+25735
+25736
+25737
+25738
+25739
+25740
+25741
+25742
+25743
+25744
+25745
+25746
+25747
+25748
+25749
+25750
+25751
+25752
+25753
+25754
+25755
+25756
+25757
+25758
+25759
+25760
+25761
+25762
+25763
+25764
+25765
+25766
+25767
+25768
+25769
+25770
+25771
+25772
+25773
+25774
+25775
+25776
+25777
+25778
+25779
+25780
+25781
+25782
+25783
+25784
+25785
+25786
+25787
+25788
+25789
+25790
+25791
+25792
+25793
+25794
+25795
+25796
+25797
+25798
+25799
+25800
+25801
+25802
+25803
+25804
+25805
+25806
+25807
+25808
+25809
+25810
+25811
+25812
+25813
+25814
+25815
+25816
+25817
+25818
+25819
+25820
+25821
+25822
+25823
+25824
+25825
+25826
+25827
+25828
+25829
+25830
+25831
+25832
+25833
+25834
+25835
+25836
+25837
+25838
+25839
+25840
+25841
+25842
+25843
+25844
+25845
+25846
+25847
+25848
+25849
+25850
+25851
+25852
+25853
+25854
+25855
+25856
+25857
+25858
+25859
+25860
+25861
+25862
+25863
+25864
+25865
+25866
+25867
+25868
+25869
+25870
+25871
+25872
+25873
+25874
+25875
+25876
+25877
+25878
+25879
+25880
+25881
+25882
+25883
+25884
+25885
+25886
+25887
+25888
+25889
+25890
+25891
+25892
+25893
+25894
+25895
+25896
+25897
+25898
+25899
+25900
+25901
+25902
+25903
+25904
+25905
+25906
+25907
+25908
+25909
+25910
+25911
+25912
+25913
+25914
+25915
+25916
+25917
+25918
+25919
+25920
+25921
+25922
+25923
+25924
+25925
+25926
+25927
+25928
+25929
+25930
+25931
+25932
+25933
+25934
+25935
+25936
+25937
+25938
+25939
+25940
+25941
+25942
+25943
+25944
+25945
+25946
+25947
+25948
+25949
+25950
+25951
+25952
+25953
+25954
+25955
+25956
+25957
+25958
+25959
+25960
+25961
+25962
+25963
+25964
+25965
+25966
+25967
+25968
+25969
+25970
+25971
+25972
+25973
+25974
+25975
+25976
+25977
+25978
+25979
+25980
+25981
+25982
+25983
+25984
+25985
+25986
+25987
+25988
+25989
+25990
+25991
+25992
+25993
+25994
+25995
+25996
+25997
+25998
+25999
+26000
+26001
+26002
+26003
+26004
+26005
+26006
+26007
+26008
+26009
+26010
+26011
+26012
+26013
+26014
+26015
+26016
+26017
+26018
+26019
+26020
+26021
+26022
+26023
+26024
+26025
+26026
+26027
+26028
+26029
+26030
+26031
+26032
+26033
+26034
+26035
+26036
+26037
+26038
+26039
+26040
+26041
+26042
+26043
+26044
+26045
+26046
+26047
+26048
+26049
+26050
+26051
+26052
+26053
+26054
+26055
+26056
+26057
+26058
+26059
+26060
+26061
+26062
+26063
+26064
+26065
+26066
+26067
+26068
+26069
+26070
+26071
+26072
+26073
+26074
+26075
+26076
+26077
+26078
+26079
+26080
+26081
+26082
+26083
+26084
+26085
+26086
+26087
+26088
+26089
+26090
+26091
+26092
+26093
+26094
+26095
+26096
+26097
+26098
+26099
+26100
+26101
+26102
+26103
+26104
+26105
+26106
+26107
+26108
+26109
+26110
+26111
+26112
+26113
+26114
+26115
+26116
+26117
+26118
+26119
+26120
+26121
+26122
+26123
+26124
+26125
+26126
+26127
+26128
+26129
+26130
+26131
+26132
+26133
+26134
+26135
+26136
+26137
+26138
+26139
+26140
+26141
+26142
+26143
+26144
+26145
+26146
+26147
+26148
+26149
+26150
+26151
+26152
+26153
+26154
+26155
+26156
+26157
+26158
+26159
+26160
+26161
+26162
+26163
+26164
+26165
+26166
+26167
+26168
+26169
+26170
+26171
+26172
+26173
+26174
+26175
+26176
+26177
+26178
+26179
+26180
+26181
+26182
+26183
+26184
+26185
+26186
+26187
+26188
+26189
+26190
+26191
+26192
+26193
+26194
+26195
+26196
+26197
+26198
+26199
+26200
+26201
+26202
+26203
+26204
+26205
+26206
+26207
+26208
+26209
+26210
+26211
+26212
+26213
+26214
+26215
+26216
+26217
+26218
+26219
+26220
+26221
+26222
+26223
+26224
+26225
+26226
+26227
+26228
+26229
+26230
+26231
+26232
+26233
+26234
+26235
+26236
+26237
+26238
+26239
+26240
+26241
+26242
+26243
+26244
+26245
+26246
+26247
+26248
+26249
+26250
+26251
+26252
+26253
+26254
+26255
+26256
+26257
+26258
+26259
+26260
+26261
+26262
+26263
+26264
+26265
+26266
+26267
+26268
+26269
+26270
+26271
+26272
+26273
+26274
+26275
+26276
+26277
+26278
+26279
+26280
+26281
+26282
+26283
+26284
+26285
+26286
+26287
+26288
+26289
+26290
+26291
+26292
+26293
+26294
+26295
+26296
+26297
+26298
+26299
+26300
+26301
+26302
+26303
+26304
+26305
+26306
+26307
+26308
+26309
+26310
+26311
+26312
+26313
+26314
+26315
+26316
+26317
+26318
+26319
+26320
+26321
+26322
+26323
+26324
+26325
+26326
+26327
+26328
+26329
+26330
+26331
+26332
+26333
+26334
+26335
+26336
+26337
+26338
+26339
+26340
+26341
+26342
+26343
+26344
+26345
+26346
+26347
+26348
+26349
+26350
+26351
+26352
+26353
+26354
+26355
+26356
+26357
+26358
+26359
+26360
+26361
+26362
+26363
+26364
+26365
+26366
+26367
+26368
+26369
+26370
+26371
+26372
+26373
+26374
+26375
+26376
+26377
+26378
+26379
+26380
+26381
+26382
+26383
+26384
+26385
+26386
+26387
+26388
+26389
+26390
+26391
+26392
+26393
+26394
+26395
+26396
+26397
+26398
+26399
+26400
+26401
+26402
+26403
+26404
+26405
+26406
+26407
+26408
+26409
+26410
+26411
+26412
+26413
+26414
+26415
+26416
+26417
+26418
+26419
+26420
+26421
+26422
+26423
+26424
+26425
+26426
+26427
+26428
+26429
+26430
+26431
+26432
+26433
+26434
+26435
+26436
+26437
+26438
+26439
+26440
+26441
+26442
+26443
+26444
+26445
+26446
+26447
+26448
+26449
+26450
+26451
+26452
+26453
+26454
+26455
+26456
+26457
+26458
+26459
+26460
+26461
+26462
+26463
+26464
+26465
+26466
+26467
+26468
+26469
+26470
+26471
+26472
+26473
+26474
+26475
+26476
+26477
+26478
+26479
+26480
+26481
+26482
+26483
+26484
+26485
+26486
+26487
+26488
+26489
+26490
+26491
+26492
+26493
+26494
+26495
+26496
+26497
+26498
+26499
+26500
+26501
+26502
+26503
+26504
+26505
+26506
+26507
+26508
+26509
+26510
+26511
+26512
+26513
+26514
+26515
+26516
+26517
+26518
+26519
+26520
+26521
+26522
+26523
+26524
+26525
+26526
+26527
+26528
+26529
+26530
+26531
+26532
+26533
+26534
+26535
+26536
+26537
+26538
+26539
+26540
+26541
+26542
+26543
+26544
+26545
+26546
+26547
+26548
+26549
+26550
+26551
+26552
+26553
+26554
+26555
+26556
+26557
+26558
+26559
+26560
+26561
+26562
+26563
+26564
+26565
+26566
+26567
+26568
+26569
+26570
+26571
+26572
+26573
+26574
+26575
+26576
+26577
+26578
+26579
+26580
+26581
+26582
+26583
+26584
+26585
+26586
+26587
+26588
+26589
+26590
+26591
+26592
+26593
+26594
+26595
+26596
+26597
+26598
+26599
+26600
+26601
+26602
+26603
+26604
+26605
+26606
+26607
+26608
+26609
+26610
+26611
+26612
+26613
+26614
+26615
+26616
+26617
+26618
+26619
+26620
+26621
+26622
+26623
+26624
+26625
+26626
+26627
+26628
+26629
+26630
+26631
+26632
+26633
+26634
+26635
+26636
+26637
+26638
+26639
+26640
+26641
+26642
+26643
+26644
+26645
+26646
+26647
+26648
+26649
+26650
+26651
+26652
+26653
+26654
+26655
+26656
+26657
+26658
+26659
+26660
+26661
+26662
+26663
+26664
+26665
+26666
+26667
+26668
+26669
+26670
+26671
+26672
+26673
+26674
+26675
+26676
+26677
+26678
+26679
+26680
+26681
+26682
+26683
+26684
+26685
+26686
+26687
+26688
+26689
+26690
+26691
+26692
+26693
+26694
+26695
+26696
+26697
+26698
+26699
+26700
+26701
+26702
+26703
+26704
+26705
+26706
+26707
+26708
+26709
+26710
+26711
+26712
+26713
+26714
+26715
+26716
+26717
+26718
+26719
+26720
+26721
+26722
+26723
+26724
+26725
+26726
+26727
+26728
+26729
+26730
+26731
+26732
+26733
+26734
+26735
+26736
+26737
+26738
+26739
+26740
+26741
+26742
+26743
+26744
+26745
+26746
+26747
+26748
+26749
+26750
+26751
+26752
+26753
+26754
+26755
+26756
+26757
+26758
+26759
+26760
+26761
+26762
+26763
+26764
+26765
+26766
+26767
+26768
+26769
+26770
+26771
+26772
+26773
+26774
+26775
+26776
+26777
+26778
+26779
+26780
+26781
+26782
+26783
+26784
+26785
+26786
+26787
+26788
+26789
+26790
+26791
+26792
+26793
+26794
+26795
+26796
+26797
+26798
+26799
+26800
+26801
+26802
+26803
+26804
+26805
+26806
+26807
+26808
+26809
+26810
+26811
+26812
+26813
+26814
+26815
+26816
+26817
+26818
+26819
+26820
+26821
+26822
+26823
+26824
+26825
+26826
+26827
+26828
+26829
+26830
+26831
+26832
+26833
+26834
+26835
+26836
+26837
+26838
+26839
+26840
+26841
+26842
+26843
+26844
+26845
+26846
+26847
+26848
+26849
+26850
+26851
+26852
+26853
+26854
+26855
+26856
+26857
+26858
+26859
+26860
+26861
+26862
+26863
+26864
+26865
+26866
+26867
+26868
+26869
+26870
+26871
+26872
+26873
+26874
+26875
+26876
+26877
+26878
+26879
+26880
+26881
+26882
+26883
+26884
+26885
+26886
+26887
+26888
+26889
+26890
+26891
+26892
+26893
+26894
+26895
+26896
+26897
+26898
+26899
+26900
+26901
+26902
+26903
+26904
+26905
+26906
+26907
+26908
+26909
+26910
+26911
+26912
+26913
+26914
+26915
+26916
+26917
+26918
+26919
+26920
+26921
+26922
+26923
+26924
+26925
+26926
+26927
+26928
+26929
+26930
+26931
+26932
+26933
+26934
+26935
+26936
+26937
+26938
+26939
+26940
+26941
+26942
+26943
+26944
+26945
+26946
+26947
+26948
+26949
+26950
+26951
+26952
+26953
+26954
+26955
+26956
+26957
+26958
+26959
+26960
+26961
+26962
+26963
+26964
+26965
+26966
+26967
+26968
+26969
+26970
+26971
+26972
+26973
+26974
+26975
+26976
+26977
+26978
+26979
+26980
+26981
+26982
+26983
+26984
+26985
+26986
+26987
+26988
+26989
+26990
+26991
+26992
+26993
+26994
+26995
+26996
+26997
+26998
+26999
+27000
+27001
+27002
+27003
+27004
+27005
+27006
+27007
+27008
+27009
+27010
+27011
+27012
+27013
+27014
+27015
+27016
+27017
+27018
+27019
+27020
+27021
+27022
+27023
+27024
+27025
+27026
+27027
+27028
+27029
+27030
+27031
+27032
+27033
+27034
+27035
+27036
+27037
+27038
+27039
+27040
+27041
+27042
+27043
+27044
+27045
+27046
+27047
+27048
+27049
+27050
+27051
+27052
+27053
+27054
+27055
+27056
+27057
+27058
+27059
+27060
+27061
+27062
+27063
+27064
+27065
+27066
+27067
+27068
+27069
+27070
+27071
+27072
+27073
+27074
+27075
+27076
+27077
+27078
+27079
+27080
+27081
+27082
+27083
+27084
+27085
+27086
+27087
+27088
+27089
+27090
+27091
+27092
+27093
+27094
+27095
+27096
+27097
+27098
+27099
+27100
+27101
+27102
+27103
+27104
+27105
+27106
+27107
+27108
+27109
+27110
+27111
+27112
+27113
+27114
+27115
+27116
+27117
+27118
+27119
+27120
+27121
+27122
+27123
+27124
+27125
+27126
+27127
+27128
+27129
+27130
+27131
+27132
+27133
+27134
+27135
+27136
+27137
+27138
+27139
+27140
+27141
+27142
+27143
+27144
+27145
+27146
+27147
+27148
+27149
+27150
+27151
+27152
+27153
+27154
+27155
+27156
+27157
+27158
+27159
+27160
+27161
+27162
+27163
+27164
+27165
+27166
+27167
+27168
+27169
+27170
+27171
+27172
+27173
+27174
+27175
+27176
+27177
+27178
+27179
+27180
+27181
+27182
+27183
+27184
+27185
+27186
+27187
+27188
+27189
+27190
+27191
+27192
+27193
+27194
+27195
+27196
+27197
+27198
+27199
+27200
+27201
+27202
+27203
+27204
+27205
+27206
+27207
+27208
+27209
+27210
+27211
+27212
+27213
+27214
+27215
+27216
+27217
+27218
+27219
+27220
+27221
+27222
+27223
+27224
+27225
+27226
+27227
+27228
+27229
+27230
+27231
+27232
+27233
+27234
+27235
+27236
+27237
+27238
+27239
+27240
+27241
+27242
+27243
+27244
+27245
+27246
+27247
+27248
+27249
+27250
+27251
+27252
+27253
+27254
+27255
+27256
+27257
+27258
+27259
+27260
+27261
+27262
+27263
+27264
+27265
+27266
+27267
+27268
+27269
+27270
+27271
+27272
+27273
+27274
+27275
+27276
+27277
+27278
+27279
+27280
+27281
+27282
+27283
+27284
+27285
+27286
+27287
+27288
+27289
+27290
+27291
+27292
+27293
+27294
+27295
+27296
+27297
+27298
+27299
+27300
+27301
+27302
+27303
+27304
+27305
+27306
+27307
+27308
+27309
+27310
+27311
+27312
+27313
+27314
+27315
+27316
+27317
+27318
+27319
+27320
+27321
+27322
+27323
+27324
+27325
+27326
+27327
+27328
+27329
+27330
+27331
+27332
+27333
+27334
+27335
+27336
+27337
+27338
+27339
+27340
+27341
+27342
+27343
+27344
+27345
+27346
+27347
+27348
+27349
+27350
+27351
+27352
+27353
+27354
+27355
+27356
+27357
+27358
+27359
+27360
+27361
+27362
+27363
+27364
+27365
+27366
+27367
+27368
+27369
+27370
+27371
+27372
+27373
+27374
+27375
+27376
+27377
+27378
+27379
+27380
+27381
+27382
+27383
+27384
+27385
+27386
+27387
+27388
+27389
+27390
+27391
+27392
+27393
+27394
+27395
+27396
+27397
+27398
+27399
+27400
+27401
+27402
+27403
+27404
+27405
+27406
+27407
+27408
+27409
+27410
+27411
+27412
+27413
+27414
+27415
+27416
+27417
+27418
+27419
+27420
+27421
+27422
+27423
+27424
+27425
+27426
+27427
+27428
+27429
+27430
+27431
+27432
+27433
+27434
+27435
+27436
+27437
+27438
+27439
+27440
+27441
+27442
+27443
+27444
+27445
+27446
+27447
+27448
+27449
+27450
+27451
+27452
+27453
+27454
+27455
+27456
+27457
+27458
+27459
+27460
+27461
+27462
+27463
+27464
+27465
+27466
+27467
+27468
+27469
+27470
+27471
+27472
+27473
+27474
+27475
+27476
+27477
+27478
+27479
+27480
+27481
+27482
+27483
+27484
+27485
+27486
+27487
+27488
+27489
+27490
+27491
+27492
+27493
+27494
+27495
+27496
+27497
+27498
+27499
+27500
+27501
+27502
+27503
+27504
+27505
+27506
+27507
+27508
+27509
+27510
+27511
+27512
+27513
+27514
+27515
+27516
+27517
+27518
+27519
+27520
+27521
+27522
+27523
+27524
+27525
+27526
+27527
+27528
+27529
+27530
+27531
+27532
+27533
+27534
+27535
+27536
+27537
+27538
+27539
+27540
+27541
+27542
+27543
+27544
+27545
+27546
+27547
+27548
+27549
+27550
+27551
+27552
+27553
+27554
+27555
+27556
+27557
+27558
+27559
+27560
+27561
+27562
+27563
+27564
+27565
+27566
+27567
+27568
+27569
+27570
+27571
+27572
+27573
+27574
+27575
+27576
+27577
+27578
+27579
+27580
+27581
+27582
+27583
+27584
+27585
+27586
+27587
+27588
+27589
+27590
+27591
+27592
+27593
+27594
+27595
+27596
+27597
+27598
+27599
+27600
+27601
+27602
+27603
+27604
+27605
+27606
+27607
+27608
+27609
+27610
+27611
+27612
+27613
+27614
+27615
+27616
+27617
+27618
+27619
+27620
+27621
+27622
+27623
+27624
+27625
+27626
+27627
+27628
+27629
+27630
+27631
+27632
+27633
+27634
+27635
+27636
+27637
+27638
+27639
+27640
+27641
+27642
+27643
+27644
+27645
+27646
+27647
+27648
+27649
+27650
+27651
+27652
+27653
+27654
+27655
+27656
+27657
+27658
+27659
+27660
+27661
+27662
+27663
+27664
+27665
+27666
+27667
+27668
+27669
+27670
+27671
+27672
+27673
+27674
+27675
+27676
+27677
+27678
+27679
+27680
+27681
+27682
+27683
+27684
+27685
+27686
+27687
+27688
+27689
+27690
+27691
+27692
+27693
+27694
+27695
+27696
+27697
+27698
+27699
+27700
+27701
+27702
+27703
+27704
+27705
+27706
+27707
+27708
+27709
+27710
+27711
+27712
+27713
+27714
+27715
+27716
+27717
+27718
+27719
+27720
+27721
+27722
+27723
+27724
+27725
+27726
+27727
+27728
+27729
+27730
+27731
+27732
+27733
+27734
+27735
+27736
+27737
+27738
+27739
+27740
+27741
+27742
+27743
+27744
+27745
+27746
+27747
+27748
+27749
+27750
+27751
+27752
+27753
+27754
+27755
+27756
+27757
+27758
+27759
+27760
+27761
+27762
+27763
+27764
+27765
+27766
+27767
+27768
+27769
+27770
+27771
+27772
+27773
+27774
+27775
+27776
+27777
+27778
+27779
+27780
+27781
+27782
+27783
+27784
+27785
+27786
+27787
+27788
+27789
+27790
+27791
+27792
+27793
+27794
+27795
+27796
+27797
+27798
+27799
+27800
+27801
+27802
+27803
+27804
+27805
+27806
+27807
+27808
+27809
+27810
+27811
+27812
+27813
+27814
+27815
+27816
+27817
+27818
+27819
+27820
+27821
+27822
+27823
+27824
+27825
+27826
+27827
+27828
+27829
+27830
+27831
+27832
+27833
+27834
+27835
+27836
+27837
+27838
+27839
+27840
+27841
+27842
+27843
+27844
+27845
+27846
+27847
+27848
+27849
+27850
+27851
+27852
+27853
+27854
+27855
+27856
+27857
+27858
+27859
+27860
+27861
+27862
+27863
+27864
+27865
+27866
+27867
+27868
+27869
+27870
+27871
+27872
+27873
+27874
+27875
+27876
+27877
+27878
+27879
+27880
+27881
+27882
+27883
+27884
+27885
+27886
+27887
+27888
+27889
+27890
+27891
+27892
+27893
+27894
+27895
+27896
+27897
+27898
+27899
+27900
+27901
+27902
+27903
+27904
+27905
+27906
+27907
+27908
+27909
+27910
+27911
+27912
+27913
+27914
+27915
+27916
+27917
+27918
+27919
+27920
+27921
+27922
+27923
+27924
+27925
+27926
+27927
+27928
+27929
+27930
+27931
+27932
+27933
+27934
+27935
+27936
+27937
+27938
+27939
+27940
+27941
+27942
+27943
+27944
+27945
+27946
+27947
+27948
+27949
+27950
+27951
+27952
+27953
+27954
+27955
+27956
+27957
+27958
+27959
+27960
+27961
+27962
+27963
+27964
+27965
+27966
+27967
+27968
+27969
+27970
+27971
+27972
+27973
+27974
+27975
+27976
+27977
+27978
+27979
+27980
+27981
+27982
+27983
+27984
+27985
+27986
+27987
+27988
+27989
+27990
+27991
+27992
+27993
+27994
+27995
+27996
+27997
+27998
+27999
+28000
+28001
+28002
+28003
+28004
+28005
+28006
+28007
+28008
+28009
+28010
+28011
+28012
+28013
+28014
+28015
+28016
+28017
+28018
+28019
+28020
+28021
+28022
+28023
+28024
+28025
+28026
+28027
+28028
+28029
+28030
+28031
+28032
+28033
+28034
+28035
+28036
+28037
+28038
+28039
+28040
+28041
+28042
+28043
+28044
+28045
+28046
+28047
+28048
+28049
+28050
+28051
+28052
+28053
+28054
+28055
+28056
+28057
+28058
+28059
+28060
+28061
+28062
+28063
+28064
+28065
+28066
+28067
+28068
+28069
+28070
+28071
+28072
+28073
+28074
+28075
+28076
+28077
+28078
+28079
+28080
+28081
+28082
+28083
+28084
+28085
+28086
+28087
+28088
+28089
+28090
+28091
+28092
+28093
+28094
+28095
+28096
+28097
+28098
+28099
+28100
+28101
+28102
+28103
+28104
+28105
+28106
+28107
+28108
+28109
+28110
+28111
+28112
+28113
+28114
+28115
+28116
+28117
+28118
+28119
+28120
+28121
+28122
+28123
+28124
+28125
+28126
+28127
+28128
+28129
+28130
+28131
+28132
+28133
+28134
+28135
+28136
+28137
+28138
+28139
+28140
+28141
+28142
+28143
+28144
+28145
+28146
+28147
+28148
+28149
+28150
+28151
+28152
+28153
+28154
+28155
+28156
+28157
+28158
+28159
+28160
+28161
+28162
+28163
+28164
+28165
+28166
+28167
+28168
+28169
+28170
+28171
+28172
+28173
+28174
+28175
+28176
+28177
+28178
+28179
+28180
+28181
+28182
+28183
+28184
+28185
+28186
+28187
+28188
+28189
+28190
+28191
+28192
+28193
+28194
+28195
+28196
+28197
+28198
+28199
+28200
+28201
+28202
+28203
+28204
+28205
+28206
+28207
+28208
+28209
+28210
+28211
+28212
+28213
+28214
+28215
+28216
+28217
+28218
+28219
+28220
+28221
+28222
+28223
+28224
+28225
+28226
+28227
+28228
+28229
+28230
+28231
+28232
+28233
+28234
+28235
+28236
+28237
+28238
+28239
+28240
+28241
+28242
+28243
+28244
+28245
+28246
+28247
+28248
+28249
+28250
+28251
+28252
+28253
+28254
+28255
+28256
+28257
+28258
+28259
+28260
+28261
+28262
+28263
+28264
+28265
+28266
+28267
+28268
+28269
+28270
+28271
+28272
+28273
+28274
+28275
+28276
+28277
+28278
+28279
+28280
+28281
+28282
+28283
+28284
+28285
+28286
+28287
+28288
+28289
+28290
+28291
+28292
+28293
+28294
+28295
+28296
+28297
+28298
+28299
+28300
+28301
+28302
+28303
+28304
+28305
+28306
+28307
+28308
+28309
+28310
+28311
+28312
+28313
+28314
+28315
+28316
+28317
+28318
+28319
+28320
+28321
+28322
+28323
+28324
+28325
+28326
+28327
+28328
+28329
+28330
+28331
+28332
+28333
+28334
+28335
+28336
+28337
+28338
+28339
+28340
+28341
+28342
+28343
+28344
+28345
+28346
+28347
+28348
+28349
+28350
+28351
+28352
+28353
+28354
+28355
+28356
+28357
+28358
+28359
+28360
+28361
+28362
+28363
+28364
+28365
+28366
+28367
+28368
+28369
+28370
+28371
+28372
+28373
+28374
+28375
+28376
+28377
+28378
+28379
+28380
+28381
+28382
+28383
+28384
+28385
+28386
+28387
+28388
+28389
+28390
+28391
+28392
+28393
+28394
+28395
+28396
+28397
+28398
+28399
+28400
+28401
+28402
+28403
+28404
+28405
+28406
+28407
+28408
+28409
+28410
+28411
+28412
+28413
+28414
+28415
+28416
+28417
+28418
+28419
+28420
+28421
+28422
+28423
+28424
+28425
+28426
+28427
+28428
+28429
+28430
+28431
+28432
+28433
+28434
+28435
+28436
+28437
+28438
+28439
+28440
+28441
+28442
+28443
+28444
+28445
+28446
+28447
+28448
+28449
+28450
+28451
+28452
+28453
+28454
+28455
+28456
+28457
+28458
+28459
+28460
+28461
+28462
+28463
+28464
+28465
+28466
+28467
+28468
+28469
+28470
+28471
+28472
+28473
+28474
+28475
+28476
+28477
+28478
+28479
+28480
+28481
+28482
+28483
+28484
+28485
+28486
+28487
+28488
+28489
+28490
+28491
+28492
+28493
+28494
+28495
+28496
+28497
+28498
+28499
+28500
+28501
+28502
+28503
+28504
+28505
+28506
+28507
+28508
+28509
+28510
+28511
+28512
+28513
+28514
+28515
+28516
+28517
+28518
+28519
+28520
+28521
+28522
+28523
+28524
+28525
+28526
+28527
+28528
+28529
+28530
+28531
+28532
+28533
+28534
+28535
+28536
+28537
+28538
+28539
+28540
+28541
+28542
+28543
+28544
+28545
+28546
+28547
+28548
+28549
+28550
+28551
+28552
+28553
+28554
+28555
+28556
+28557
+28558
+28559
+28560
+28561
+28562
+28563
+28564
+28565
+28566
+28567
+28568
+28569
+28570
+28571
+28572
+28573
+28574
+28575
+28576
+28577
+28578
+28579
+28580
+28581
+28582
+28583
+28584
+28585
+28586
+28587
+28588
+28589
+28590
+28591
+28592
+28593
+28594
+28595
+28596
+28597
+28598
+28599
+28600
+28601
+28602
+28603
+28604
+28605
+28606
+28607
+28608
+28609
+28610
+28611
+28612
+28613
+28614
+28615
+28616
+28617
+28618
+28619
+28620
+28621
+28622
+28623
+28624
+28625
+28626
+28627
+28628
+28629
+28630
+28631
+28632
+28633
+28634
+28635
+28636
+28637
+28638
+28639
+28640
+28641
+28642
+28643
+28644
+28645
+28646
+28647
+28648
+28649
+28650
+28651
+28652
+28653
+28654
+28655
+28656
+28657
+28658
+28659
+28660
+28661
+28662
+28663
+28664
+28665
+28666
+28667
+28668
+28669
+28670
+28671
+28672
+28673
+28674
+28675
+28676
+28677
+28678
+28679
+28680
+28681
+28682
+28683
+28684
+28685
+28686
+28687
+28688
+28689
+28690
+28691
+28692
+28693
+28694
+28695
+28696
+28697
+28698
+28699
+28700
+28701
+28702
+28703
+28704
+28705
+28706
+28707
+28708
+28709
+28710
+28711
+28712
+28713
+28714
+28715
+28716
+28717
+28718
+28719
+28720
+28721
+28722
+28723
+28724
+28725
+28726
+28727
+28728
+28729
+28730
+28731
+28732
+28733
+28734
+28735
+28736
+28737
+28738
+28739
+28740
+28741
+28742
+28743
+28744
+28745
+28746
+28747
+28748
+28749
+28750
+28751
+28752
+28753
+28754
+28755
+28756
+28757
+28758
+28759
+28760
+28761
+28762
+28763
+28764
+28765
+28766
+28767
+28768
+28769
+28770
+28771
+28772
+28773
+28774
+28775
+28776
+28777
+28778
+28779
+28780
+28781
+28782
+28783
+28784
+28785
+28786
+28787
+28788
+28789
+28790
+28791
+28792
+28793
+28794
+28795
+28796
+28797
+28798
+28799
+28800
+28801
+28802
+28803
+28804
+28805
+28806
+28807
+28808
+28809
+28810
+28811
+28812
+28813
+28814
+28815
+28816
+28817
+28818
+28819
+28820
+28821
+28822
+28823
+28824
+28825
+28826
+28827
+28828
+28829
+28830
+28831
+28832
+28833
+28834
+28835
+28836
+28837
+28838
+28839
+28840
+28841
+28842
+28843
+28844
+28845
+28846
+28847
+28848
+28849
+28850
+28851
+28852
+28853
+28854
+28855
+28856
+28857
+28858
+28859
+28860
+28861
+28862
+28863
+28864
+28865
+28866
+28867
+28868
+28869
+28870
+28871
+28872
+28873
+28874
+28875
+28876
+28877
+28878
+28879
+28880
+28881
+28882
+28883
+28884
+28885
+28886
+28887
+28888
+28889
+28890
+28891
+28892
+28893
+28894
+28895
+28896
+28897
+28898
+28899
+28900
+28901
+28902
+28903
+28904
+28905
+28906
+28907
+28908
+28909
+28910
+28911
+28912
+28913
+28914
+28915
+28916
+28917
+28918
+28919
+28920
+28921
+28922
+28923
+28924
+28925
+28926
+28927
+28928
+28929
+28930
+28931
+28932
+28933
+28934
+28935
+28936
+28937
+28938
+28939
+28940
+28941
+28942
+28943
+28944
+28945
+28946
+28947
+28948
+28949
+28950
+28951
+28952
+28953
+28954
+28955
+28956
+28957
+28958
+28959
+28960
+28961
+28962
+28963
+28964
+28965
+28966
+28967
+28968
+28969
+28970
+28971
+28972
+28973
+28974
+28975
+28976
+28977
+28978
+28979
+28980
+28981
+28982
+28983
+28984
+28985
+28986
+28987
+28988
+28989
+28990
+28991
+28992
+28993
+28994
+28995
+28996
+28997
+28998
+28999
+29000
+29001
+29002
+29003
+29004
+29005
+29006
+29007
+29008
+29009
+29010
+29011
+29012
+29013
+29014
+29015
+29016
+29017
+29018
+29019
+29020
+29021
+29022
+29023
+29024
+29025
+29026
+29027
+29028
+29029
+29030
+29031
+29032
+29033
+29034
+29035
+29036
+29037
+29038
+29039
+29040
+29041
+29042
+29043
+29044
+29045
+29046
+29047
+29048
+29049
+29050
+29051
+29052
+29053
+29054
+29055
+29056
+29057
+29058
+29059
+29060
+29061
+29062
+29063
+29064
+29065
+29066
+29067
+29068
+29069
+29070
+29071
+29072
+29073
+29074
+29075
+29076
+29077
+29078
+29079
+29080
+29081
+29082
+29083
+29084
+29085
+29086
+29087
+29088
+29089
+29090
+29091
+29092
+29093
+29094
+29095
+29096
+29097
+29098
+29099
+29100
+29101
+29102
+29103
+29104
+29105
+29106
+29107
+29108
+29109
+29110
+29111
+29112
+29113
+29114
+29115
+29116
+29117
+29118
+29119
+29120
+29121
+29122
+29123
+29124
+29125
+29126
+29127
+29128
+29129
+29130
+29131
+29132
+29133
+29134
+29135
+29136
+29137
+29138
+29139
+29140
+29141
+29142
+29143
+29144
+29145
+29146
+29147
+29148
+29149
+29150
+29151
+29152
+29153
+29154
+29155
+29156
+29157
+29158
+29159
+29160
+29161
+29162
+29163
+29164
+29165
+29166
+29167
+29168
+29169
+29170
+29171
+29172
+29173
+29174
+29175
+29176
+29177
+29178
+29179
+29180
+29181
+29182
+29183
+29184
+29185
+29186
+29187
+29188
+29189
+29190
+29191
+29192
+29193
+29194
+29195
+29196
+29197
+29198
+29199
+29200
+29201
+29202
+29203
+29204
+29205
+29206
+29207
+29208
+29209
+29210
+29211
+29212
+29213
+29214
+29215
+29216
+29217
+29218
+29219
+29220
+29221
+29222
+29223
+29224
+29225
+29226
+29227
+29228
+29229
+29230
+29231
+29232
+29233
+29234
+29235
+29236
+29237
+29238
+29239
+29240
+29241
+29242
+29243
+29244
+29245
+29246
+29247
+29248
+29249
+29250
+29251
+29252
+29253
+29254
+29255
+29256
+29257
+29258
+29259
+29260
+29261
+29262
+29263
+29264
+29265
+29266
+29267
+29268
+29269
+29270
+29271
+29272
+29273
+29274
+29275
+29276
+29277
+29278
+29279
+29280
+29281
+29282
+29283
+29284
+29285
+29286
+29287
+29288
+29289
+29290
+29291
+29292
+29293
+29294
+29295
+29296
+29297
+29298
+29299
+29300
+29301
+29302
+29303
+29304
+29305
+29306
+29307
+29308
+29309
+29310
+29311
+29312
+29313
+29314
+29315
+29316
+29317
+29318
+29319
+29320
+29321
+29322
+29323
+29324
+29325
+29326
+29327
+29328
+29329
+29330
+29331
+29332
+29333
+29334
+29335
+29336
+29337
+29338
+29339
+29340
+29341
+29342
+29343
+29344
+29345
+29346
+29347
+29348
+29349
+29350
+29351
+29352
+29353
+29354
+29355
+29356
+29357
+29358
+29359
+29360
+29361
+29362
+29363
+29364
+29365
+29366
+29367
+29368
+29369
+29370
+29371
+29372
+29373
+29374
+29375
+29376
+29377
+29378
+29379
+29380
+29381
+29382
+29383
+29384
+29385
+29386
+29387
+29388
+29389
+29390
+29391
+29392
+29393
+29394
+29395
+29396
+29397
+29398
+29399
+29400
+29401
+29402
+29403
+29404
+29405
+29406
+29407
+29408
+29409
+29410
+29411
+29412
+29413
+29414
+29415
+29416
+29417
+29418
+29419
+29420
+29421
+29422
+29423
+29424
+29425
+29426
+29427
+29428
+29429
+29430
+29431
+29432
+29433
+29434
+29435
+29436
+29437
+29438
+29439
+29440
+29441
+29442
+29443
+29444
+29445
+29446
+29447
+29448
+29449
+29450
+29451
+29452
+29453
+29454
+29455
+29456
+29457
+29458
+29459
+29460
+29461
+29462
+29463
+29464
+29465
+29466
+29467
+29468
+29469
+29470
+29471
+29472
+29473
+29474
+29475
+29476
+29477
+29478
+29479
+29480
+29481
+29482
+29483
+29484
+29485
+29486
+29487
+29488
+29489
+29490
+29491
+29492
+29493
+29494
+29495
+29496
+29497
+29498
+29499
+29500
+29501
+29502
+29503
+29504
+29505
+29506
+29507
+29508
+29509
+29510
+29511
+29512
+29513
+29514
+29515
+29516
+29517
+29518
+29519
+29520
+29521
+29522
+29523
+29524
+29525
+29526
+29527
+29528
+29529
+29530
+29531
+29532
+29533
+29534
+29535
+29536
+29537
+29538
+29539
+29540
+29541
+29542
+29543
+29544
+29545
+29546
+29547
+29548
+29549
+29550
+29551
+29552
+29553
+29554
+29555
+29556
+29557
+29558
+29559
+29560
+29561
+29562
+29563
+29564
+29565
+29566
+29567
+29568
+29569
+29570
+29571
+29572
+29573
+29574
+29575
+29576
+29577
+29578
+29579
+29580
+29581
+29582
+29583
+29584
+29585
+29586
+29587
+29588
+29589
+29590
+29591
+29592
+29593
+29594
+29595
+29596
+29597
+29598
+29599
+29600
+29601
+29602
+29603
+29604
+29605
+29606
+29607
+29608
+29609
+29610
+29611
+29612
+29613
+29614
+29615
+29616
+29617
+29618
+29619
+29620
+29621
+29622
+29623
+29624
+29625
+29626
+29627
+29628
+29629
+29630
+29631
+29632
+29633
+29634
+29635
+29636
+29637
+29638
+29639
+29640
+29641
+29642
+29643
+29644
+29645
+29646
+29647
+29648
+29649
+29650
+29651
+29652
+29653
+29654
+29655
+29656
+29657
+29658
+29659
+29660
+29661
+29662
+29663
+29664
+29665
+29666
+29667
+29668
+29669
+29670
+29671
+29672
+29673
+29674
+29675
+29676
+29677
+29678
+29679
+29680
+29681
+29682
+29683
+29684
+29685
+29686
+29687
+29688
+29689
+29690
+29691
+29692
+29693
+29694
+29695
+29696
+29697
+29698
+29699
+29700
+29701
+29702
+29703
+29704
+29705
+29706
+29707
+29708
+29709
+29710
+29711
+29712
+29713
+29714
+29715
+29716
+29717
+29718
+29719
+29720
+29721
+29722
+29723
+29724
+29725
+29726
+29727
+29728
+29729
+29730
+29731
+29732
+29733
+29734
+29735
+29736
+29737
+29738
+29739
+29740
+29741
+29742
+29743
+29744
+29745
+29746
+29747
+29748
+29749
+29750
+29751
+29752
+29753
+29754
+29755
+29756
+29757
+29758
+29759
+29760
+29761
+29762
+29763
+29764
+29765
+29766
+29767
+29768
+29769
+29770
+29771
+29772
+29773
+29774
+29775
+29776
+29777
+29778
+29779
+29780
+29781
+29782
+29783
+29784
+29785
+29786
+29787
+29788
+29789
+29790
+29791
+29792
+29793
+29794
+29795
+29796
+29797
+29798
+29799
+29800
+29801
+29802
+29803
+29804
+29805
+29806
+29807
+29808
+29809
+29810
+29811
+29812
+29813
+29814
+29815
+29816
+29817
+29818
+29819
+29820
+29821
+29822
+29823
+29824
+29825
+29826
+29827
+29828
+29829
+29830
+29831
+29832
+29833
+29834
+29835
+29836
+29837
+29838
+29839
+29840
+29841
+29842
+29843
+29844
+29845
+29846
+29847
+29848
+29849
+29850
+29851
+29852
+29853
+29854
+29855
+29856
+29857
+29858
+29859
+29860
+29861
+29862
+29863
+29864
+29865
+29866
+29867
+29868
+29869
+29870
+29871
+29872
+29873
+29874
+29875
+29876
+29877
+29878
+29879
+29880
+29881
+29882
+29883
+29884
+29885
+29886
+29887
+29888
+29889
+29890
+29891
+29892
+29893
+29894
+29895
+29896
+29897
+29898
+29899
+29900
+29901
+29902
+29903
+29904
+29905
+29906
+29907
+29908
+29909
+29910
+29911
+29912
+29913
+29914
+29915
+29916
+29917
+29918
+29919
+29920
+29921
+29922
+29923
+29924
+29925
+29926
+29927
+29928
+29929
+29930
+29931
+29932
+29933
+29934
+29935
+29936
+29937
+29938
+29939
+29940
+29941
+29942
+29943
+29944
+29945
+29946
+29947
+29948
+29949
+29950
+29951
+29952
+29953
+29954
+29955
+29956
+29957
+29958
+29959
+29960
+29961
+29962
+29963
+29964
+29965
+29966
+29967
+29968
+29969
+29970
+29971
+29972
+29973
+29974
+29975
+29976
+29977
+29978
+29979
+29980
+29981
+29982
+29983
+29984
+29985
+29986
+29987
+29988
+29989
+29990
+29991
+29992
+29993
+29994
+29995
+29996
+29997
+29998
+29999
+30000
+30001
+30002
+30003
+30004
+30005
+30006
+30007
+30008
+30009
+30010
+30011
+30012
+30013
+30014
+30015
+30016
+30017
+30018
+30019
+30020
+30021
+30022
+30023
+30024
+30025
+30026
+30027
+30028
+30029
+30030
+30031
+30032
+30033
+30034
+30035
+30036
+30037
+30038
+30039
+30040
+30041
+30042
+30043
+30044
+30045
+30046
+30047
+30048
+30049
+30050
+30051
+30052
+30053
+30054
+30055
+30056
+30057
+30058
+30059
+30060
+30061
+30062
+30063
+30064
+30065
+30066
+30067
+30068
+30069
+30070
+30071
+30072
+30073
+30074
+30075
+30076
+30077
+30078
+30079
+30080
+30081
+30082
+30083
+30084
+30085
+30086
+30087
+30088
+30089
+30090
+30091
+30092
+30093
+30094
+30095
+30096
+30097
+30098
+30099
+30100
+30101
+30102
+30103
+30104
+30105
+30106
+30107
+30108
+30109
+30110
+30111
+30112
+30113
+30114
+30115
+30116
+30117
+30118
+30119
+30120
+30121
+30122
+30123
+30124
+30125
+30126
+30127
+30128
+30129
+30130
+30131
+30132
+30133
+30134
+30135
+30136
+30137
+30138
+30139
+30140
+30141
+30142
+30143
+30144
+30145
+30146
+30147
+30148
+30149
+30150
+30151
+30152
+30153
+30154
+30155
+30156
+30157
+30158
+30159
+30160
+30161
+30162
+30163
+30164
+30165
+30166
+30167
+30168
+30169
+30170
+30171
+30172
+30173
+30174
+30175
+30176
+30177
+30178
+30179
+30180
+30181
+30182
+30183
+30184
+30185
+30186
+30187
+30188
+30189
+30190
+30191
+30192
+30193
+30194
+30195
+30196
+30197
+30198
+30199
+30200
+30201
+30202
+30203
+30204
+30205
+30206
+30207
+30208
+30209
+30210
+30211
+30212
+30213
+30214
+30215
+30216
+30217
+30218
+30219
+30220
+30221
+30222
+30223
+30224
+30225
+30226
+30227
+30228
+30229
+30230
+30231
+30232
+30233
+30234
+30235
+30236
+30237
+30238
+30239
+30240
+30241
+30242
+30243
+30244
+30245
+30246
+30247
+30248
+30249
+30250
+30251
+30252
+30253
+30254
+30255
+30256
+30257
+30258
+30259
+30260
+30261
+30262
+30263
+30264
+30265
+30266
+30267
+30268
+30269
+30270
+30271
+30272
+30273
+30274
+30275
+30276
+30277
+30278
+30279
+30280
+30281
+30282
+30283
+30284
+30285
+30286
+30287
+30288
+30289
+30290
+30291
+30292
+30293
+30294
+30295
+30296
+30297
+30298
+30299
+30300
+30301
+30302
+30303
+30304
+30305
+30306
+30307
+30308
+30309
+30310
+30311
+30312
+30313
+30314
+30315
+30316
+30317
+30318
+30319
+30320
+30321
+30322
+30323
+30324
+30325
+30326
+30327
+30328
+30329
+30330
+30331
+30332
+30333
+30334
+30335
+30336
+30337
+30338
+30339
+30340
+30341
+30342
+30343
+30344
+30345
+30346
+30347
+30348
+30349
+30350
+30351
+30352
+30353
+30354
+30355
+30356
+30357
+30358
+30359
+30360
+30361
+30362
+30363
+30364
+30365
+30366
+30367
+30368
+30369
+30370
+30371
+30372
+30373
+30374
+30375
+30376
+30377
+30378
+30379
+30380
+30381
+30382
+30383
+30384
+30385
+30386
+30387
+30388
+30389
+30390
+30391
+30392
+30393
+30394
+30395
+30396
+30397
+30398
+30399
+30400
+30401
+30402
+30403
+30404
+30405
+30406
+30407
+30408
+30409
+30410
+30411
+30412
+30413
+30414
+30415
+30416
+30417
+30418
+30419
+30420
+30421
+30422
+30423
+30424
+30425
+30426
+30427
+30428
+30429
+30430
+30431
+30432
+30433
+30434
+30435
+30436
+30437
+30438
+30439
+30440
+30441
+30442
+30443
+30444
+30445
+30446
+30447
+30448
+30449
+30450
+30451
+30452
+30453
+30454
+30455
+30456
+30457
+30458
+30459
+30460
+30461
+30462
+30463
+30464
+30465
+30466
+30467
+30468
+30469
+30470
+30471
+30472
+30473
+30474
+30475
+30476
+30477
+30478
+30479
+30480
+30481
+30482
+30483
+30484
+30485
+30486
+30487
+30488
+30489
+30490
+30491
+30492
+30493
+30494
+30495
+30496
+30497
+30498
+30499
+30500
+30501
+30502
+30503
+30504
+30505
+30506
+30507
+30508
+30509
+30510
+30511
+30512
+30513
+30514
+30515
+30516
+30517
+30518
+30519
+30520
+30521
+30522
+30523
+30524
+30525
+30526
+30527
+30528
+30529
+30530
+30531
+30532
+30533
+30534
+30535
+30536
+30537
+30538
+30539
+30540
+30541
+30542
+30543
+30544
+30545
+30546
+30547
+30548
+30549
+30550
+30551
+30552
+30553
+30554
+30555
+30556
+30557
+30558
+30559
+30560
+30561
+30562
+30563
+30564
+30565
+30566
+30567
+30568
+30569
+30570
+30571
+30572
+30573
+30574
+30575
+30576
+30577
+30578
+30579
+30580
+30581
+30582
+30583
+30584
+30585
+30586
+30587
+30588
+30589
+30590
+30591
+30592
+30593
+30594
+30595
+30596
+30597
+30598
+30599
+30600
+30601
+30602
+30603
+30604
+30605
+30606
+30607
+30608
+30609
+30610
+30611
+30612
+30613
+30614
+30615
+30616
+30617
+30618
+30619
+30620
+30621
+30622
+30623
+30624
+30625
+30626
+30627
+30628
+30629
+30630
+30631
+30632
+30633
+30634
+30635
+30636
+30637
+30638
+30639
+30640
+30641
+30642
+30643
+30644
+30645
+30646
+30647
+30648
+30649
+30650
+30651
+30652
+30653
+30654
+30655
+30656
+30657
+30658
+30659
+30660
+30661
+30662
+30663
+30664
+30665
+30666
+30667
+30668
+30669
+30670
+30671
+30672
+30673
+30674
+30675
+30676
+30677
+30678
+30679
+30680
+30681
+30682
+30683
+30684
+30685
+30686
+30687
+30688
+30689
+30690
+30691
+30692
+30693
+30694
+30695
+30696
+30697
+30698
+30699
+30700
+30701
+30702
+30703
+30704
+30705
+30706
+30707
+30708
+30709
+30710
+30711
+30712
+30713
+30714
+30715
+30716
+30717
+30718
+30719
+30720
+30721
+30722
+30723
+30724
+30725
+30726
+30727
+30728
+30729
+30730
+30731
+30732
+30733
+30734
+30735
+30736
+30737
+30738
+30739
+30740
+30741
+30742
+30743
+30744
+30745
+30746
+30747
+30748
+30749
+30750
+30751
+30752
+30753
+30754
+30755
+30756
+30757
+30758
+30759
+30760
+30761
+30762
+30763
+30764
+30765
+30766
+30767
+30768
+30769
+30770
+30771
+30772
+30773
+30774
+30775
+30776
+30777
+30778
+30779
+30780
+30781
+30782
+30783
+30784
+30785
+30786
+30787
+30788
+30789
+30790
+30791
+30792
+30793
+30794
+30795
+30796
+30797
+30798
+30799
+30800
+30801
+30802
+30803
+30804
+30805
+30806
+30807
+30808
+30809
+30810
+30811
+30812
+30813
+30814
+30815
+30816
+30817
+30818
+30819
+30820
+30821
+30822
+30823
+30824
+30825
+30826
+30827
+30828
+30829
+30830
+30831
+30832
+30833
+30834
+30835
+30836
+30837
+30838
+30839
+30840
+30841
+30842
+30843
+30844
+30845
+30846
+30847
+30848
+30849
+30850
+30851
+30852
+30853
+30854
+30855
+30856
+30857
+30858
+30859
+30860
+30861
+30862
+30863
+30864
+30865
+30866
+30867
+30868
+30869
+30870
+30871
+30872
+30873
+30874
+30875
+30876
+30877
+30878
+30879
+30880
+30881
+30882
+30883
+30884
+30885
+30886
+30887
+30888
+30889
+30890
+30891
+30892
+30893
+30894
+30895
+30896
+30897
+30898
+30899
+30900
+30901
+30902
+30903
+30904
+30905
+30906
+30907
+30908
+30909
+30910
+30911
+30912
+30913
+30914
+30915
+30916
+30917
+30918
+30919
+30920
+30921
+30922
+30923
+30924
+30925
+30926
+30927
+30928
+30929
+30930
+30931
+30932
+30933
+30934
+30935
+30936
+30937
+30938
+30939
+30940
+30941
+30942
+30943
+30944
+30945
+30946
+30947
+30948
+30949
+30950
+30951
+30952
+30953
+30954
+30955
+30956
+30957
+30958
+30959
+30960
+30961
+30962
+30963
+30964
+30965
+30966
+30967
+30968
+30969
+30970
+30971
+30972
+30973
+30974
+30975
+30976
+30977
+30978
+30979
+30980
+30981
+30982
+30983
+30984
+30985
+30986
+30987
+30988
+30989
+30990
+30991
+30992
+30993
+30994
+30995
+30996
+30997
+30998
+30999
+31000
+31001
+31002
+31003
+31004
+31005
+31006
+31007
+31008
+31009
+31010
+31011
+31012
+31013
+31014
+31015
+31016
+31017
+31018
+31019
+31020
+31021
+31022
+31023
+31024
+31025
+31026
+31027
+31028
+31029
+31030
+31031
+31032
+31033
+31034
+31035
+31036
+31037
+31038
+31039
+31040
+31041
+31042
+31043
+31044
+31045
+31046
+31047
+31048
+31049
+31050
+31051
+31052
+31053
+31054
+31055
+31056
+31057
+31058
+31059
+31060
+31061
+31062
+31063
+31064
+31065
+31066
+31067
+31068
+31069
+31070
+31071
+31072
+31073
+31074
+31075
+31076
+31077
+31078
+31079
+31080
+31081
+31082
+31083
+31084
+31085
+31086
+31087
+31088
+31089
+31090
+31091
+31092
+31093
+31094
+31095
+31096
+31097
+31098
+31099
+31100
+31101
+31102
+31103
+31104
+31105
+31106
+31107
+31108
+31109
+31110
+31111
+31112
+31113
+31114
+31115
+31116
+31117
+31118
+31119
+31120
+31121
+31122
+31123
+31124
+31125
+31126
+31127
+31128
+31129
+31130
+31131
+31132
+31133
+31134
+31135
+31136
+31137
+31138
+31139
+31140
+31141
+31142
+31143
+31144
+31145
+31146
+31147
+31148
+31149
+31150
+31151
+31152
+31153
+31154
+31155
+31156
+31157
+31158
+31159
+31160
+31161
+31162
+31163
+31164
+31165
+31166
+31167
+31168
+31169
+31170
+31171
+31172
+31173
+31174
+31175
+31176
+31177
+31178
+31179
+31180
+31181
+31182
+31183
+31184
+31185
+31186
+31187
+31188
+31189
+31190
+31191
+31192
+31193
+31194
+31195
+31196
+31197
+31198
+31199
+31200
+31201
+31202
+31203
+31204
+31205
+31206
+31207
+31208
+31209
+31210
+31211
+31212
+31213
+31214
+31215
+31216
+31217
+31218
+31219
+31220
+31221
+31222
+31223
+31224
+31225
+31226
+31227
+31228
+31229
+31230
+31231
+31232
+31233
+31234
+31235
+31236
+31237
+31238
+31239
+31240
+31241
+31242
+31243
+31244
+31245
+31246
+31247
+31248
+31249
+31250
+31251
+31252
+31253
+31254
+31255
+31256
+31257
+31258
+31259
+31260
+31261
+31262
+31263
+31264
+31265
+31266
+31267
+31268
+31269
+31270
+31271
+31272
+31273
+31274
+31275
+31276
+31277
+31278
+31279
+31280
+31281
+31282
+31283
+31284
+31285
+31286
+31287
+31288
+31289
+31290
+31291
+31292
+31293
+31294
+31295
+31296
+31297
+31298
+31299
+31300
+31301
+31302
+31303
+31304
+31305
+31306
+31307
+31308
+31309
+31310
+31311
+31312
+31313
+31314
+31315
+31316
+31317
+31318
+31319
+31320
+31321
+31322
+31323
+31324
+31325
+31326
+31327
+31328
+31329
+31330
+31331
+31332
+31333
+31334
+31335
+31336
+31337
+31338
+31339
+31340
+31341
+31342
+31343
+31344
+31345
+31346
+31347
+31348
+31349
+31350
+31351
+31352
+31353
+31354
+31355
+31356
+31357
+31358
+31359
+31360
+31361
+31362
+31363
+31364
+31365
+31366
+31367
+31368
+31369
+31370
+31371
+31372
+31373
+31374
+31375
+31376
+31377
+31378
+31379
+31380
+31381
+31382
+31383
+31384
+31385
+31386
+31387
+31388
+31389
+31390
+31391
+31392
+31393
+31394
+31395
+31396
+31397
+31398
+31399
+31400
+31401
+31402
+31403
+31404
+31405
+31406
+31407
+31408
+31409
+31410
+31411
+31412
+31413
+31414
+31415
+31416
+31417
+31418
+31419
+31420
+31421
+31422
+31423
+31424
+31425
+31426
+31427
+31428
+31429
+31430
+31431
+31432
+31433
+31434
+31435
+31436
+31437
+31438
+31439
+31440
+31441
+31442
+31443
+31444
+31445
+31446
+31447
+31448
+31449
+31450
+31451
+31452
+31453
+31454
+31455
+31456
+31457
+31458
+31459
+31460
+31461
+31462
+31463
+31464
+31465
+31466
+31467
+31468
+31469
+31470
+31471
+31472
+31473
+31474
+31475
+31476
+31477
+31478
+31479
+31480
+31481
+31482
+31483
+31484
+31485
+31486
+31487
+31488
+31489
+31490
+31491
+31492
+31493
+31494
+31495
+31496
+31497
+31498
+31499
+31500
+31501
+31502
+31503
+31504
+31505
+31506
+31507
+31508
+31509
+31510
+31511
+31512
+31513
+31514
+31515
+31516
+31517
+31518
+31519
+31520
+31521
+31522
+31523
+31524
+31525
+31526
+31527
+31528
+31529
+31530
+31531
+31532
+31533
+31534
+31535
+31536
+31537
+31538
+31539
+31540
+31541
+31542
+31543
+31544
+31545
+31546
+31547
+31548
+31549
+31550
+31551
+31552
+31553
+31554
+31555
+31556
+31557
+31558
+31559
+31560
+31561
+31562
+31563
+31564
+31565
+31566
+31567
+31568
+31569
+31570
+31571
+31572
+31573
+31574
+31575
+31576
+31577
+31578
+31579
+31580
+31581
+31582
+31583
+31584
+31585
+31586
+31587
+31588
+31589
+31590
+31591
+31592
+31593
+31594
+31595
+31596
+31597
+31598
+31599
+31600
+31601
+31602
+31603
+31604
+31605
+31606
+31607
+31608
+31609
+31610
+31611
+31612
+31613
+31614
+31615
+31616
+31617
+31618
+31619
+31620
+31621
+31622
+31623
+31624
+31625
+31626
+31627
+31628
+31629
+31630
+31631
+31632
+31633
+31634
+31635
+31636
+31637
+31638
+31639
+31640
+31641
+31642
+31643
+31644
+31645
+31646
+31647
+31648
+31649
+31650
+31651
+31652
+31653
+31654
+31655
+31656
+31657
+31658
+31659
+31660
+31661
+31662
+31663
+31664
+31665
+31666
+31667
+31668
+31669
+31670
+31671
+31672
+31673
+31674
+31675
+31676
+31677
+31678
+31679
+31680
+31681
+31682
+31683
+31684
+31685
+31686
+31687
+31688
+31689
+31690
+31691
+31692
+31693
+31694
+31695
+31696
+31697
+31698
+31699
+31700
+31701
+31702
+31703
+31704
+31705
+31706
+31707
+31708
+31709
+31710
+31711
+31712
+31713
+31714
+31715
+31716
+31717
+31718
+31719
+31720
+31721
+31722
+31723
+31724
+31725
+31726
+31727
+31728
+31729
+31730
+31731
+31732
+31733
+31734
+31735
+31736
+31737
+31738
+31739
+31740
+31741
+31742
+31743
+31744
+31745
+31746
+31747
+31748
+31749
+31750
+31751
+31752
+31753
+31754
+31755
+31756
+31757
+31758
+31759
+31760
+31761
+31762
+31763
+31764
+31765
+31766
+31767
+31768
+31769
+31770
+31771
+31772
+31773
+31774
+31775
+31776
+31777
+31778
+31779
+31780
+31781
+31782
+31783
+31784
+31785
+31786
+31787
+31788
+31789
+31790
+31791
+31792
+31793
+31794
+31795
+31796
+31797
+31798
+31799
+31800
+31801
+31802
+31803
+31804
+31805
+31806
+31807
+31808
+31809
+31810
+31811
+31812
+31813
+31814
+31815
+31816
+31817
+31818
+31819
+31820
+31821
+31822
+31823
+31824
+31825
+31826
+31827
+31828
+31829
+31830
+31831
+31832
+31833
+31834
+31835
+31836
+31837
+31838
+31839
+31840
+31841
+31842
+31843
+31844
+31845
+31846
+31847
+31848
+31849
+31850
+31851
+31852
+31853
+31854
+31855
+31856
+31857
+31858
+31859
+31860
+31861
+31862
+31863
+31864
+31865
+31866
+31867
+31868
+31869
+31870
+31871
+31872
+31873
+31874
+31875
+31876
+31877
+31878
+31879
+31880
+31881
+31882
+31883
+31884
+31885
+31886
+31887
+31888
+31889
+31890
+31891
+31892
+31893
+31894
+31895
+31896
+31897
+31898
+31899
+31900
+31901
+31902
+31903
+31904
+31905
+31906
+31907
+31908
+31909
+31910
+31911
+31912
+31913
+31914
+31915
+31916
+31917
+31918
+31919
+31920
+31921
+31922
+31923
+31924
+31925
+31926
+31927
+31928
+31929
+31930
+31931
+31932
+31933
+31934
+31935
+31936
+31937
+31938
+31939
+31940
+31941
+31942
+31943
+31944
+31945
+31946
+31947
+31948
+31949
+31950
+31951
+31952
+31953
+31954
+31955
+31956
+31957
+31958
+31959
+31960
+31961
+31962
+31963
+31964
+31965
+31966
+31967
+31968
+31969
+31970
+31971
+31972
+31973
+31974
+31975
+31976
+31977
+31978
+31979
+31980
+31981
+31982
+31983
+31984
+31985
+31986
+31987
+31988
+31989
+31990
+31991
+31992
+31993
+31994
+31995
+31996
+31997
+31998
+31999
+32000
+32001
+32002
+32003
+32004
+32005
+32006
+32007
+32008
+32009
+32010
+32011
+32012
+32013
+32014
+32015
+32016
+32017
+32018
+32019
+32020
+32021
+32022
+32023
+32024
+32025
+32026
+32027
+32028
+32029
+32030
+32031
+32032
+32033
+32034
+32035
+32036
+32037
+32038
+32039
+32040
+32041
+32042
+32043
+32044
+32045
+32046
+32047
+32048
+32049
+32050
+32051
+32052
+32053
+32054
+32055
+32056
+32057
+32058
+32059
+32060
+32061
+32062
+32063
+32064
+32065
+32066
+32067
+32068
+32069
+32070
+32071
+32072
+32073
+32074
+32075
+32076
+32077
+32078
+32079
+32080
+32081
+32082
+32083
+32084
+32085
+32086
+32087
+32088
+32089
+32090
+32091
+32092
+32093
+32094
+32095
+32096
+32097
+32098
+32099
+32100
+32101
+32102
+32103
+32104
+32105
+32106
+32107
+32108
+32109
+32110
+32111
+32112
+32113
+32114
+32115
+32116
+32117
+32118
+32119
+32120
+32121
+32122
+32123
+32124
+32125
+32126
+32127
+32128
+32129
+32130
+32131
+32132
+32133
+32134
+32135
+32136
+32137
+32138
+32139
+32140
+32141
+32142
+32143
+32144
+32145
+32146
+32147
+32148
+32149
+32150
+32151
+32152
+32153
+32154
+32155
+32156
+32157
+32158
+32159
+32160
+32161
+32162
+32163
+32164
+32165
+32166
+32167
+32168
+32169
+32170
+32171
+32172
+32173
+32174
+32175
+32176
+32177
+32178
+32179
+32180
+32181
+32182
+32183
+32184
+32185
+32186
+32187
+32188
+32189
+32190
+32191
+32192
+32193
+32194
+32195
+32196
+32197
+32198
+32199
+32200
+32201
+32202
+32203
+32204
+32205
+32206
+32207
+32208
+32209
+32210
+32211
+32212
+32213
+32214
+32215
+32216
+32217
+32218
+32219
+32220
+32221
+32222
+32223
+32224
+32225
+32226
+32227
+32228
+32229
+32230
+32231
+32232
+32233
+32234
+32235
+32236
+32237
+32238
+32239
+32240
+32241
+32242
+32243
+32244
+32245
+32246
+32247
+32248
+32249
+32250
+32251
+32252
+32253
+32254
+32255
+32256
+32257
+32258
+32259
+32260
+32261
+32262
+32263
+32264
+32265
+32266
+32267
+32268
+32269
+32270
+32271
+32272
+32273
+32274
+32275
+32276
+32277
+32278
+32279
+32280
+32281
+32282
+32283
+32284
+32285
+32286
+32287
+32288
+32289
+32290
+32291
+32292
+32293
+32294
+32295
+32296
+32297
+32298
+32299
+32300
+32301
+32302
+32303
+32304
+32305
+32306
+32307
+32308
+32309
+32310
+32311
+32312
+32313
+32314
+32315
+32316
+32317
+32318
+32319
+32320
+32321
+32322
+32323
+32324
+32325
+32326
+32327
+32328
+32329
+32330
+32331
+32332
+32333
+32334
+32335
+32336
+32337
+32338
+32339
+32340
+32341
+32342
+32343
+32344
+32345
+32346
+32347
+32348
+32349
+32350
+32351
+32352
+32353
+32354
+32355
+32356
+32357
+32358
+32359
+32360
+32361
+32362
+32363
+32364
+32365
+32366
+32367
+32368
+32369
+32370
+32371
+32372
+32373
+32374
+32375
+32376
+32377
+32378
+32379
+32380
+32381
+32382
+32383
+32384
+32385
+32386
+32387
+32388
+32389
+32390
+32391
+32392
+32393
+32394
+32395
+32396
+32397
+32398
+32399
+32400
+32401
+32402
+32403
+32404
+32405
+32406
+32407
+32408
+32409
+32410
+32411
+32412
+32413
+32414
+32415
+32416
+32417
+32418
+32419
+32420
+32421
+32422
+32423
+32424
+32425
+32426
+32427
+32428
+32429
+32430
+32431
+32432
+32433
+32434
+32435
+32436
+32437
+32438
+32439
+32440
+32441
+32442
+32443
+32444
+32445
+32446
+32447
+32448
+32449
+32450
+32451
+32452
+32453
+32454
+32455
+32456
+32457
+32458
+32459
+32460
+32461
+32462
+32463
+32464
+32465
+32466
+32467
+32468
+32469
+32470
+32471
+32472
+32473
+32474
+32475
+32476
+32477
+32478
+32479
+32480
+32481
+32482
+32483
+32484
+32485
+32486
+32487
+32488
+32489
+32490
+32491
+32492
+32493
+32494
+32495
+32496
+32497
+32498
+32499
+32500
+32501
+32502
+32503
+32504
+32505
+32506
+32507
+32508
+32509
+32510
+32511
+32512
+32513
+32514
+32515
+32516
+32517
+32518
+32519
+32520
+32521
+32522
+32523
+32524
+32525
+32526
+32527
+32528
+32529
+32530
+32531
+32532
+32533
+32534
+32535
+32536
+32537
+32538
+32539
+32540
+32541
+32542
+32543
+32544
+32545
+32546
+32547
+32548
+32549
+32550
+32551
+32552
+32553
+32554
+32555
+32556
+32557
+32558
+32559
+32560
+32561
+32562
+32563
+32564
+32565
+32566
+32567
+32568
+32569
+32570
+32571
+32572
+32573
+32574
+32575
+32576
+32577
+32578
+32579
+32580
+32581
+32582
+32583
+32584
+32585
+32586
+32587
+32588
+32589
+32590
+32591
+32592
+32593
+32594
+32595
+32596
+32597
+32598
+32599
+32600
+32601
+32602
+32603
+32604
+32605
+32606
+32607
+32608
+32609
+32610
+32611
+32612
+32613
+32614
+32615
+32616
+32617
+32618
+32619
+32620
+32621
+32622
+32623
+32624
+32625
+32626
+32627
+32628
+32629
+32630
+32631
+32632
+32633
+32634
+32635
+32636
+32637
+32638
+32639
+32640
+32641
+32642
+32643
+32644
+32645
+32646
+32647
+32648
+32649
+32650
+32651
+32652
+32653
+32654
+32655
+32656
+32657
+32658
+32659
+32660
+32661
+32662
+32663
+32664
+32665
+32666
+32667
+32668
+32669
+32670
+32671
+32672
+32673
+32674
+32675
+32676
+32677
+32678
+32679
+32680
+32681
+32682
+32683
+32684
+32685
+32686
+32687
+32688
+32689
+32690
+32691
+32692
+32693
+32694
+32695
+32696
+32697
+32698
+32699
+32700
+32701
+32702
+32703
+32704
+32705
+32706
+32707
+32708
+32709
+32710
+32711
+32712
+32713
+32714
+32715
+32716
+32717
+32718
+32719
+32720
+32721
+32722
+32723
+32724
+32725
+32726
+32727
+32728
+32729
+32730
+32731
+32732
+32733
+32734
+32735
+32736
+32737
+32738
+32739
+32740
+32741
+32742
+32743
+32744
+32745
+32746
+32747
+32748
+32749
+32750
+32751
+32752
+32753
+32754
+32755
+32756
+32757
+32758
+32759
+32760
+32761
+32762
+32763
+32764
+32765
+32766
+32767
+32768
+32769
+32770
+32771
+32772
+32773
+32774
+32775
+32776
+32777
+32778
+32779
+32780
+32781
+32782
+32783
+32784
+32785
+32786
+32787
+32788
+32789
+32790
+32791
+32792
+32793
+32794
+32795
+32796
+32797
+32798
+32799
+32800
+32801
+32802
+32803
+32804
+32805
+32806
+32807
+32808
+32809
+32810
+32811
+32812
+32813
+32814
+32815
+32816
+32817
+32818
+32819
+32820
+32821
+32822
+32823
+32824
+32825
+32826
+32827
+32828
+32829
+32830
+32831
+32832
+32833
+32834
+32835
+32836
+32837
+32838
+32839
+32840
+32841
+32842
+32843
+32844
+32845
+32846
+32847
+32848
+32849
+32850
+32851
+32852
+32853
+32854
+32855
+32856
+32857
+32858
+32859
+32860
+32861
+32862
+32863
+32864
+32865
+32866
+32867
+32868
+32869
+32870
+32871
+32872
+32873
+32874
+32875
+32876
+32877
+32878
+32879
+32880
+32881
+32882
+32883
+32884
+32885
+32886
+32887
+32888
+32889
+32890
+32891
+32892
+32893
+32894
+32895
+32896
+32897
+32898
+32899
+32900
+32901
+32902
+32903
+32904
+32905
+32906
+32907
+32908
+32909
+32910
+32911
+32912
+32913
+32914
+32915
+32916
+32917
+32918
+32919
+32920
+32921
+32922
+32923
+32924
+32925
+32926
+32927
+32928
+32929
+32930
+32931
+32932
+32933
+32934
+32935
+32936
+32937
+32938
+32939
+32940
+32941
+32942
+32943
+32944
+32945
+32946
+32947
+32948
+32949
+32950
+32951
+32952
+32953
+32954
+32955
+32956
+32957
+32958
+32959
+32960
+32961
+32962
+32963
+32964
+32965
+32966
+32967
+32968
+32969
+32970
+32971
+32972
+32973
+32974
+32975
+32976
+32977
+32978
+32979
+32980
+32981
+32982
+32983
+32984
+32985
+32986
+32987
+32988
+32989
+32990
+32991
+32992
+32993
+32994
+32995
+32996
+32997
+32998
+32999
+33000
+33001
+33002
+33003
+33004
+33005
+33006
+33007
+33008
+33009
+33010
+33011
+33012
+33013
+33014
+33015
+33016
+33017
+33018
+33019
+33020
+33021
+33022
+33023
+33024
+33025
+33026
+33027
+33028
+33029
+33030
+33031
+33032
+33033
+33034
+33035
+33036
+33037
+33038
+33039
+33040
+33041
+33042
+33043
+33044
+33045
+33046
+33047
+33048
+33049
+33050
+33051
+33052
+33053
+33054
+33055
+33056
+33057
+33058
+33059
+33060
+33061
+33062
+33063
+33064
+33065
+33066
+33067
+33068
+33069
+33070
+33071
+33072
+33073
+33074
+33075
+33076
+33077
+33078
+33079
+33080
+33081
+33082
+33083
+33084
+33085
+33086
+33087
+33088
+33089
+33090
+33091
+33092
+33093
+33094
+33095
+33096
+33097
+33098
+33099
+33100
+33101
+33102
+33103
+33104
+33105
+33106
+33107
+33108
+33109
+33110
+33111
+33112
+33113
+33114
+33115
+33116
+33117
+33118
+33119
+33120
+33121
+33122
+33123
+33124
+33125
+33126
+33127
+33128
+33129
+33130
+33131
+33132
+33133
+33134
+33135
+33136
+33137
+33138
+33139
+33140
+33141
+33142
+33143
+33144
+33145
+33146
+33147
+33148
+33149
+33150
+33151
+33152
+33153
+33154
+33155
+33156
+33157
+33158
+33159
+33160
+33161
+33162
+33163
+33164
+33165
+33166
+33167
+33168
+33169
+33170
+33171
+33172
+33173
+33174
+33175
+33176
+33177
+33178
+33179
+33180
+33181
+33182
+33183
+33184
+33185
+33186
+33187
+33188
+33189
+33190
+33191
+33192
+33193
+33194
+33195
+33196
+33197
+33198
+33199
+33200
+33201
+33202
+33203
+33204
+33205
+33206
+33207
+33208
+33209
+33210
+33211
+33212
+33213
+33214
+33215
+33216
+33217
+33218
+33219
+33220
+33221
+33222
+33223
+33224
+33225
+33226
+33227
+33228
+33229
+33230
+33231
+33232
+33233
+33234
+33235
+33236
+33237
+33238
+33239
+33240
+33241
+33242
+33243
+33244
+33245
+33246
+33247
+33248
+33249
+33250
+33251
+33252
+33253
+33254
+33255
+33256
+33257
+33258
+33259
+33260
+33261
+33262
+33263
+33264
+33265
+33266
+33267
+33268
+33269
+33270
+33271
+33272
+33273
+33274
+33275
+33276
+33277
+33278
+33279
+33280
+33281
+33282
+33283
+33284
+33285
+33286
+33287
+33288
+33289
+33290
+33291
+33292
+33293
+33294
+33295
+33296
+33297
+33298
+33299
+33300
+33301
+33302
+33303
+33304
+33305
+33306
+33307
+33308
+33309
+33310
+33311
+33312
+33313
+33314
+33315
+33316
+33317
+33318
+33319
+33320
+33321
+33322
+33323
+33324
+33325
+33326
+33327
+33328
+33329
+33330
+33331
+33332
+33333
+33334
+33335
+33336
+33337
+33338
+33339
+33340
+33341
+33342
+33343
+33344
+33345
+33346
+33347
+33348
+33349
+33350
+33351
+33352
+33353
+33354
+33355
+33356
+33357
+33358
+33359
+33360
+33361
+33362
+33363
+33364
+33365
+33366
+33367
+33368
+33369
+33370
+33371
+33372
+33373
+33374
+33375
+33376
+33377
+33378
+33379
+33380
+33381
+33382
+33383
+33384
+33385
+33386
+33387
+33388
+33389
+33390
+33391
+33392
+33393
+33394
+33395
+33396
+33397
+33398
+33399
+33400
+33401
+33402
+33403
+33404
+33405
+33406
+33407
+33408
+33409
+33410
+33411
+33412
+33413
+33414
+33415
+33416
+33417
+33418
+33419
+33420
+33421
+33422
+33423
+33424
+33425
+33426
+33427
+33428
+33429
+33430
+33431
+33432
+33433
+33434
+33435
+33436
+33437
+33438
+33439
+33440
+33441
+33442
+33443
+33444
+33445
+33446
+33447
+33448
+33449
+33450
+33451
+33452
+33453
+33454
+33455
+33456
+33457
+33458
+33459
+33460
+33461
+33462
+33463
+33464
+33465
+33466
+33467
+33468
+33469
+33470
+33471
+33472
+33473
+33474
+33475
+33476
+33477
+33478
+33479
+33480
+33481
+33482
+33483
+33484
+33485
+33486
+33487
+33488
+33489
+33490
+33491
+33492
+33493
+33494
+33495
+33496
+33497
+33498
+33499
+33500
+33501
+33502
+33503
+33504
+33505
+33506
+33507
+33508
+33509
+33510
+33511
+33512
+33513
+33514
+33515
+33516
+33517
+33518
+33519
+33520
+33521
+33522
+33523
+33524
+33525
+33526
+33527
+33528
+33529
+33530
+33531
+33532
+33533
+33534
+33535
+33536
+33537
+33538
+33539
+33540
+33541
+33542
+33543
+33544
+33545
+33546
+33547
+33548
+33549
+33550
+33551
+33552
+33553
+33554
+33555
+33556
+33557
+33558
+33559
+33560
+33561
+33562
+33563
+33564
+33565
+33566
+33567
+33568
+33569
+33570
+33571
+33572
+33573
+33574
+33575
+33576
+33577
+33578
+33579
+33580
+33581
+33582
+33583
+33584
+33585
+33586
+33587
+33588
+33589
+33590
+33591
+33592
+33593
+33594
+33595
+33596
+33597
+33598
+33599
+33600
+33601
+33602
+33603
+33604
+33605
+33606
+33607
+33608
+33609
+33610
+33611
+33612
+33613
+33614
+33615
+33616
+33617
+33618
+33619
+33620
+33621
+33622
+33623
+33624
+33625
+33626
+33627
+33628
+33629
+33630
+33631
+33632
+33633
+33634
+33635
+33636
+33637
+33638
+33639
+33640
+33641
+33642
+33643
+33644
+33645
+33646
+33647
+33648
+33649
+33650
+33651
+33652
+33653
+33654
+33655
+33656
+33657
+33658
+33659
+33660
+33661
+33662
+33663
+33664
+33665
+33666
+33667
+33668
+33669
+33670
+33671
+33672
+33673
+33674
+33675
+33676
+33677
+33678
+33679
+33680
+33681
+33682
+33683
+33684
+33685
+33686
+33687
+33688
+33689
+33690
+33691
+33692
+33693
+33694
+33695
+33696
+33697
+33698
+33699
+33700
+33701
+33702
+33703
+33704
+33705
+33706
+33707
+33708
+33709
+33710
+33711
+33712
+33713
+33714
+33715
+33716
+33717
+33718
+33719
+33720
+33721
+33722
+33723
+33724
+33725
+33726
+33727
+33728
+33729
+33730
+33731
+33732
+33733
+33734
+33735
+33736
+33737
+33738
+33739
+33740
+33741
+33742
+33743
+33744
+33745
+33746
+33747
+33748
+33749
+33750
+33751
+33752
+33753
+33754
+33755
+33756
+33757
+33758
+33759
+33760
+33761
+33762
+33763
+33764
+33765
+33766
+33767
+33768
+33769
+33770
+33771
+33772
+33773
+33774
+33775
+33776
+33777
+33778
+33779
+33780
+33781
+33782
+33783
+33784
+33785
+33786
+33787
+33788
+33789
+33790
+33791
+33792
+33793
+33794
+33795
+33796
+33797
+33798
+33799
+33800
+33801
+33802
+33803
+33804
+33805
+33806
+33807
+33808
+33809
+33810
+33811
+33812
+33813
+33814
+33815
+33816
+33817
+33818
+33819
+33820
+33821
+33822
+33823
+33824
+33825
+33826
+33827
+33828
+33829
+33830
+33831
+33832
+33833
+33834
+33835
+33836
+33837
+33838
+33839
+33840
+33841
+33842
+33843
+33844
+33845
+33846
+33847
+33848
+33849
+33850
+33851
+33852
+33853
+33854
+33855
+33856
+33857
+33858
+33859
+33860
+33861
+33862
+33863
+33864
+33865
+33866
+33867
+33868
+33869
+33870
+33871
+33872
+33873
+33874
+33875
+33876
+33877
+33878
+33879
+33880
+33881
+33882
+33883
+33884
+33885
+33886
+33887
+33888
+33889
+33890
+33891
+33892
+33893
+33894
+33895
+33896
+33897
+33898
+33899
+33900
+33901
+33902
+33903
+33904
+33905
+33906
+33907
+33908
+33909
+33910
+33911
+33912
+33913
+33914
+33915
+33916
+33917
+33918
+33919
+33920
+33921
+33922
+33923
+33924
+33925
+33926
+33927
+33928
+33929
+33930
+33931
+33932
+33933
+33934
+33935
+33936
+33937
+33938
+33939
+33940
+33941
+33942
+33943
+33944
+33945
+33946
+33947
+33948
+33949
+33950
+33951
+33952
+33953
+33954
+33955
+33956
+33957
+33958
+33959
+33960
+33961
+33962
+33963
+33964
+33965
+33966
+33967
+33968
+33969
+33970
+33971
+33972
+33973
+33974
+33975
+33976
+33977
+33978
+33979
+33980
+33981
+33982
+33983
+33984
+33985
+33986
+33987
+33988
+33989
+33990
+33991
+33992
+33993
+33994
+33995
+33996
+33997
+33998
+33999
+34000
+34001
+34002
+34003
+34004
+34005
+34006
+34007
+34008
+34009
+34010
+34011
+34012
+34013
+34014
+34015
+34016
+34017
+34018
+34019
+34020
+34021
+34022
+34023
+34024
+34025
+34026
+34027
+34028
+34029
+34030
+34031
+34032
+34033
+34034
+34035
+34036
+34037
+34038
+34039
+34040
+34041
+34042
+34043
+34044
+34045
+34046
+34047
+34048
+34049
+34050
+34051
+34052
+34053
+34054
+34055
+34056
+34057
+34058
+34059
+34060
+34061
+34062
+34063
+34064
+34065
+34066
+34067
+34068
+34069
+34070
+34071
+34072
+34073
+34074
+34075
+34076
+34077
+34078
+34079
+34080
+34081
+34082
+34083
+34084
+34085
+34086
+34087
+34088
+34089
+34090
+34091
+34092
+34093
+34094
+34095
+34096
+34097
+34098
+34099
+34100
+34101
+34102
+34103
+34104
+34105
+34106
+34107
+34108
+34109
+34110
+34111
+34112
+34113
+34114
+34115
+34116
+34117
+34118
+34119
+34120
+34121
+34122
+34123
+34124
+34125
+34126
+34127
+34128
+34129
+34130
+34131
+34132
+34133
+34134
+34135
+34136
+34137
+34138
+34139
+34140
+34141
+34142
+34143
+34144
+34145
+34146
+34147
+34148
+34149
+34150
+34151
+34152
+34153
+34154
+34155
+34156
+34157
+34158
+34159
+34160
+34161
+34162
+34163
+34164
+34165
+34166
+34167
+34168
+34169
+34170
+34171
+34172
+34173
+34174
+34175
+34176
+34177
+34178
+34179
+34180
+34181
+34182
+34183
+34184
+34185
+34186
+34187
+34188
+34189
+34190
+34191
+34192
+34193
+34194
+34195
+34196
+34197
+34198
+34199
+34200
+34201
+34202
+34203
+34204
+34205
+34206
+34207
+34208
+34209
+34210
+34211
+34212
+34213
+34214
+34215
+34216
+34217
+34218
+34219
+34220
+34221
+34222
+34223
+34224
+34225
+34226
+34227
+34228
+34229
+34230
+34231
+34232
+34233
+34234
+34235
+34236
+34237
+34238
+34239
+34240
+34241
+34242
+34243
+34244
+34245
+34246
+34247
+34248
+34249
+34250
+34251
+34252
+34253
+34254
+34255
+34256
+34257
+34258
+34259
+34260
+34261
+34262
+34263
+34264
+34265
+34266
+34267
+34268
+34269
+34270
+34271
+34272
+34273
+34274
+34275
+34276
+34277
+34278
+34279
+34280
+34281
+34282
+34283
+34284
+34285
+34286
+34287
+34288
+34289
+34290
+34291
+34292
+34293
+34294
+34295
+34296
+34297
+34298
+34299
+34300
+34301
+34302
+34303
+34304
+34305
+34306
+34307
+34308
+34309
+34310
+34311
+34312
+34313
+34314
+34315
+34316
+34317
+34318
+34319
+34320
+34321
+34322
+34323
+34324
+34325
+34326
+34327
+34328
+34329
+34330
+34331
+34332
+34333
+34334
+34335
+34336
+34337
+34338
+34339
+34340
+34341
+34342
+34343
+34344
+34345
+34346
+34347
+34348
+34349
+34350
+34351
+34352
+34353
+34354
+34355
+34356
+34357
+34358
+34359
+34360
+34361
+34362
+34363
+34364
+34365
+34366
+34367
+34368
+34369
+34370
+34371
+34372
+34373
+34374
+34375
+34376
+34377
+34378
+34379
+34380
+34381
+34382
+34383
+34384
+34385
+34386
+34387
+34388
+34389
+34390
+34391
+34392
+34393
+34394
+34395
+34396
+34397
+34398
+34399
+34400
+34401
+34402
+34403
+34404
+34405
+34406
+34407
+34408
+34409
+34410
+34411
+34412
+34413
+34414
+34415
+34416
+34417
+34418
+34419
+34420
+34421
+34422
+34423
+34424
+34425
+34426
+34427
+34428
+34429
+34430
+34431
+34432
+34433
+34434
+34435
+34436
+34437
+34438
+34439
+34440
+34441
+34442
+34443
+34444
+34445
+34446
+34447
+34448
+34449
+34450
+34451
+34452
+34453
+34454
+34455
+34456
+34457
+34458
+34459
+34460
+34461
+34462
+34463
+34464
+34465
+34466
+34467
+34468
+34469
+34470
+34471
+34472
+34473
+34474
+34475
+34476
+34477
+34478
+34479
+34480
+34481
+34482
+34483
+34484
+34485
+34486
+34487
+34488
+34489
+34490
+34491
+34492
+34493
+34494
+34495
+34496
+34497
+34498
+34499
+34500
+34501
+34502
+34503
+34504
+34505
+34506
+34507
+34508
+34509
+34510
+34511
+34512
+34513
+34514
+34515
+34516
+34517
+34518
+34519
+34520
+34521
+34522
+34523
+34524
+34525
+34526
+34527
+34528
+34529
+34530
+34531
+34532
+34533
+34534
+34535
+34536
+34537
+34538
+34539
+34540
+34541
+34542
+34543
+34544
+34545
+34546
+34547
+34548
+34549
+34550
+34551
+34552
+34553
+34554
+34555
+34556
+34557
+34558
+34559
+34560
+34561
+34562
+34563
+34564
+34565
+34566
+34567
+34568
+34569
+34570
+34571
+34572
+34573
+34574
+34575
+34576
+34577
+34578
+34579
+34580
+34581
+34582
+34583
+34584
+34585
+34586
+34587
+34588
+34589
+34590
+34591
+34592
+34593
+34594
+34595
+34596
+34597
+34598
+34599
+34600
+34601
+34602
+34603
+34604
+34605
+34606
+34607
+34608
+34609
+34610
+34611
+34612
+34613
+34614
+34615
+34616
+34617
+34618
+34619
+34620
+34621
+34622
+34623
+34624
+34625
+34626
+34627
+34628
+34629
+34630
+34631
+34632
+34633
+34634
+34635
+34636
+34637
+34638
+34639
+34640
+34641
+34642
+34643
+34644
+34645
+34646
+34647
+34648
+34649
+34650
+34651
+34652
+34653
+34654
+34655
+34656
+34657
+34658
+34659
+34660
+34661
+34662
+34663
+34664
+34665
+34666
+34667
+34668
+34669
+34670
+34671
+34672
+34673
+34674
+34675
+34676
+34677
+34678
+34679
+34680
+34681
+34682
+34683
+34684
+34685
+34686
+34687
+34688
+34689
+34690
+34691
+34692
+34693
+34694
+34695
+34696
+34697
+34698
+34699
+34700
+34701
+34702
+34703
+34704
+34705
+34706
+34707
+34708
+34709
+34710
+34711
+34712
+34713
+34714
+34715
+34716
+34717
+34718
+34719
+34720
+34721
+34722
+34723
+34724
+34725
+34726
+34727
+34728
+34729
+34730
+34731
+34732
+34733
+34734
+34735
+34736
+34737
+34738
+34739
+34740
+34741
+34742
+34743
+34744
+34745
+34746
+34747
+34748
+34749
+34750
+34751
+34752
+34753
+34754
+34755
+34756
+34757
+34758
+34759
+34760
+34761
+34762
+34763
+34764
+34765
+34766
+34767
+34768
+34769
+34770
+34771
+34772
+34773
+34774
+34775
+34776
+34777
+34778
+34779
+34780
+34781
+34782
+34783
+34784
+34785
+34786
+34787
+34788
+34789
+34790
+34791
+34792
+34793
+34794
+34795
+34796
+34797
+34798
+34799
+34800
+34801
+34802
+34803
+34804
+34805
+34806
+34807
+34808
+34809
+34810
+34811
+34812
+34813
+34814
+34815
+34816
+34817
+34818
+34819
+34820
+34821
+34822
+34823
+34824
+34825
+34826
+34827
+34828
+34829
+34830
+34831
+34832
+34833
+34834
+34835
+34836
+34837
+34838
+34839
+34840
+34841
+34842
+34843
+34844
+34845
+34846
+34847
+34848
+34849
+34850
+34851
+34852
+34853
+34854
+34855
+34856
+34857
+34858
+34859
+34860
+34861
+34862
+34863
+34864
+34865
+34866
+34867
+34868
+34869
+34870
+34871
+34872
+34873
+34874
+34875
+34876
+34877
+34878
+34879
+34880
+34881
+34882
+34883
+34884
+34885
+34886
+34887
+34888
+34889
+34890
+34891
+34892
+34893
+34894
+34895
+34896
+34897
+34898
+34899
+34900
+34901
+34902
+34903
+34904
+34905
+34906
+34907
+34908
+34909
+34910
+34911
+34912
+34913
+34914
+34915
+34916
+34917
+34918
+34919
+34920
+34921
+34922
+34923
+34924
+34925
+34926
+34927
+34928
+34929
+34930
+34931
+34932
+34933
+34934
+34935
+34936
+34937
+34938
+34939
+34940
+34941
+34942
+34943
+34944
+34945
+34946
+34947
+34948
+34949
+34950
+34951
+34952
+34953
+34954
+34955
+34956
+34957
+34958
+34959
+34960
+34961
+34962
+34963
+34964
+34965
+34966
+34967
+34968
+34969
+34970
+34971
+34972
+34973
+34974
+34975
+34976
+34977
+34978
+34979
+34980
+34981
+34982
+34983
+34984
+34985
+34986
+34987
+34988
+34989
+34990
+34991
+34992
+34993
+34994
+34995
+34996
+34997
+34998
+34999
+35000
+35001
+35002
+35003
+35004
+35005
+35006
+35007
+35008
+35009
+35010
+35011
+35012
+35013
+35014
+35015
+35016
+35017
+35018
+35019
+35020
+35021
+35022
+35023
+35024
+35025
+35026
+35027
+35028
+35029
+35030
+35031
+35032
+35033
+35034
+35035
+35036
+35037
+35038
+35039
+35040
+35041
+35042
+35043
+35044
+35045
+35046
+35047
+35048
+35049
+35050
+35051
+35052
+35053
+35054
+35055
+35056
+35057
+35058
+35059
+35060
+35061
+35062
+35063
+35064
+35065
+35066
+35067
+35068
+35069
+35070
+35071
+35072
+35073
+35074
+35075
+35076
+35077
+35078
+35079
+35080
+35081
+35082
+35083
+35084
+35085
+35086
+35087
+35088
+35089
+35090
+35091
+35092
+35093
+35094
+35095
+35096
+35097
+35098
+35099
+35100
+35101
+35102
+35103
+35104
+35105
+35106
+35107
+35108
+35109
+35110
+35111
+35112
+35113
+35114
+35115
+35116
+35117
+35118
+35119
+35120
+35121
+35122
+35123
+35124
+35125
+35126
+35127
+35128
+35129
+35130
+35131
+35132
+35133
+35134
+35135
+35136
+35137
+35138
+35139
+35140
+35141
+35142
+35143
+35144
+35145
+35146
+35147
+35148
+35149
+35150
+35151
+35152
+35153
+35154
+35155
+35156
+35157
+35158
+35159
+35160
+35161
+35162
+35163
+35164
+35165
+35166
+35167
+35168
+35169
+35170
+35171
+35172
+35173
+35174
+35175
+35176
+35177
+35178
+35179
+35180
+35181
+35182
+35183
+35184
+35185
+35186
+35187
+35188
+35189
+35190
+35191
+35192
+35193
+35194
+35195
+35196
+35197
+35198
+35199
+35200
+35201
+35202
+35203
+35204
+35205
+35206
+35207
+35208
+35209
+35210
+35211
+35212
+35213
+35214
+35215
+35216
+35217
+35218
+35219
+35220
+35221
+35222
+35223
+35224
+35225
+35226
+35227
+35228
+35229
+35230
+35231
+35232
+35233
+35234
+35235
+35236
+35237
+35238
+35239
+35240
+35241
+35242
+35243
+35244
+35245
+35246
+35247
+35248
+35249
+35250
+35251
+35252
+35253
+35254
+35255
+35256
+35257
+35258
+35259
+35260
+35261
+35262
+35263
+35264
+35265
+35266
+35267
+35268
+35269
+35270
+35271
+35272
+35273
+35274
+35275
+35276
+35277
+35278
+35279
+35280
+35281
+35282
+35283
+35284
+35285
+35286
+35287
+35288
+35289
+35290
+35291
+35292
+35293
+35294
+35295
+35296
+35297
+35298
+35299
+35300
+35301
+35302
+35303
+35304
+35305
+35306
+35307
+35308
+35309
+35310
+35311
+35312
+35313
+35314
+35315
+35316
+35317
+35318
+35319
+35320
+35321
+35322
+35323
+35324
+35325
+35326
+35327
+35328
+35329
+35330
+35331
+35332
+35333
+35334
+35335
+35336
+35337
+35338
+35339
+35340
+35341
+35342
+35343
+35344
+35345
+35346
+35347
+35348
+35349
+35350
+35351
+35352
+35353
+35354
+35355
+35356
+35357
+35358
+35359
+35360
+35361
+35362
+35363
+35364
+35365
+35366
+35367
+35368
+35369
+35370
+35371
+35372
+35373
+35374
+35375
+35376
+35377
+35378
+35379
+35380
+35381
+35382
+35383
+35384
+35385
+35386
+35387
+35388
+35389
+35390
+35391
+35392
+35393
+35394
+35395
+35396
+35397
+35398
+35399
+35400
+35401
+35402
+35403
+35404
+35405
+35406
+35407
+35408
+35409
+35410
+35411
+35412
+35413
+35414
+35415
+35416
+35417
+35418
+35419
+35420
+35421
+35422
+35423
+35424
+35425
+35426
+35427
+35428
+35429
+35430
+35431
+35432
+35433
+35434
+35435
+35436
+35437
+35438
+35439
+35440
+35441
+35442
+35443
+35444
+35445
+35446
+35447
+35448
+35449
+35450
+35451
+35452
+35453
+35454
+35455
+35456
+35457
+35458
+35459
+35460
+35461
+35462
+35463
+35464
+35465
+35466
+35467
+35468
+35469
+35470
+35471
+35472
+35473
+35474
+35475
+35476
+35477
+35478
+35479
+35480
+35481
+35482
+35483
+35484
+35485
+35486
+35487
+35488
+35489
+35490
+35491
+35492
+35493
+35494
+35495
+35496
+35497
+35498
+35499
+35500
+35501
+35502
+35503
+35504
+35505
+35506
+35507
+35508
+35509
+35510
+35511
+35512
+35513
+35514
+35515
+35516
+35517
+35518
+35519
+35520
+35521
+35522
+35523
+35524
+35525
+35526
+35527
+35528
+35529
+35530
+35531
+35532
+35533
+35534
+35535
+35536
+35537
+35538
+35539
+35540
+35541
+35542
+35543
+35544
+35545
+35546
+35547
+35548
+35549
+35550
+35551
+35552
+35553
+35554
+35555
+35556
+35557
+35558
+35559
+35560
+35561
+35562
+35563
+35564
+35565
+35566
+35567
+35568
+35569
+35570
+35571
+35572
+35573
+35574
+35575
+35576
+35577
+35578
+35579
+35580
+35581
+35582
+35583
+35584
+35585
+35586
+35587
+35588
+35589
+35590
+35591
+35592
+35593
+35594
+35595
+35596
+35597
+35598
+35599
+35600
+35601
+35602
+35603
+35604
+35605
+35606
+35607
+35608
+35609
+35610
+35611
+35612
+35613
+35614
+35615
+35616
+35617
+35618
+35619
+35620
+35621
+35622
+35623
+35624
+35625
+35626
+35627
+35628
+35629
+35630
+35631
+35632
+35633
+35634
+35635
+35636
+35637
+35638
+35639
+35640
+35641
+35642
+35643
+35644
+35645
+35646
+35647
+35648
+35649
+35650
+35651
+35652
+35653
+35654
+35655
+35656
+35657
+35658
+35659
+35660
+35661
+35662
+35663
+35664
+35665
+35666
+35667
+35668
+35669
+35670
+35671
+35672
+35673
+35674
+35675
+35676
+35677
+35678
+35679
+35680
+35681
+35682
+35683
+35684
+35685
+35686
+35687
+35688
+35689
+35690
+35691
+35692
+35693
+35694
+35695
+35696
+35697
+35698
+35699
+35700
+35701
+35702
+35703
+35704
+35705
+35706
+35707
+35708
+35709
+35710
+35711
+35712
+35713
+35714
+35715
+35716
+35717
+35718
+35719
+35720
+35721
+35722
+35723
+35724
+35725
+35726
+35727
+35728
+35729
+35730
+35731
+35732
+35733
+35734
+35735
+35736
+35737
+35738
+35739
+35740
+35741
+35742
+35743
+35744
+35745
+35746
+35747
+35748
+35749
+35750
+35751
+35752
+35753
+35754
+35755
+35756
+35757
+35758
+35759
+35760
+35761
+35762
+35763
+35764
+35765
+35766
+35767
+35768
+35769
+35770
+35771
+35772
+35773
+35774
+35775
+35776
+35777
+35778
+35779
+35780
+35781
+35782
+35783
+35784
+35785
+35786
+35787
+35788
+35789
+35790
+35791
+35792
+35793
+35794
+35795
+35796
+35797
+35798
+35799
+35800
+35801
+35802
+35803
+35804
+35805
+35806
+35807
+35808
+35809
+35810
+35811
+35812
+35813
+35814
+35815
+35816
+35817
+35818
+35819
+35820
+35821
+35822
+35823
+35824
+35825
+35826
+35827
+35828
+35829
+35830
+35831
+35832
+35833
+35834
+35835
+35836
+35837
+35838
+35839
+35840
+35841
+35842
+35843
+35844
+35845
+35846
+35847
+35848
+35849
+35850
+35851
+35852
+35853
+35854
+35855
+35856
+35857
+35858
+35859
+35860
+35861
+35862
+35863
+35864
+35865
+35866
+35867
+35868
+35869
+35870
+35871
+35872
+35873
+35874
+35875
+35876
+35877
+35878
+35879
+35880
+35881
+35882
+35883
+35884
+35885
+35886
+35887
+35888
+35889
+35890
+35891
+35892
+35893
+35894
+35895
+35896
+35897
+35898
+35899
+35900
+35901
+35902
+35903
+35904
+35905
+35906
+35907
+35908
+35909
+35910
+35911
+35912
+35913
+35914
+35915
+35916
+35917
+35918
+35919
+35920
+35921
+35922
+35923
+35924
+35925
+35926
+35927
+35928
+35929
+35930
+35931
+35932
+35933
+35934
+35935
+35936
+35937
+35938
+35939
+35940
+35941
+35942
+35943
+35944
+35945
+35946
+35947
+35948
+35949
+35950
+35951
+35952
+35953
+35954
+35955
+35956
+35957
+35958
+35959
+35960
+35961
+35962
+35963
+35964
+35965
+35966
+35967
+35968
+35969
+35970
+35971
+35972
+35973
+35974
+35975
+35976
+35977
+35978
+35979
+35980
+35981
+35982
+35983
+35984
+35985
+35986
+35987
+35988
+35989
+35990
+35991
+35992
+35993
+35994
+35995
+35996
+35997
+35998
+35999
+36000
+36001
+36002
+36003
+36004
+36005
+36006
+36007
+36008
+36009
+36010
+36011
+36012
+36013
+36014
+36015
+36016
+36017
+36018
+36019
+36020
+36021
+36022
+36023
+36024
+36025
+36026
+36027
+36028
+36029
+36030
+36031
+36032
+36033
+36034
+36035
+36036
+36037
+36038
+36039
+36040
+36041
+36042
+36043
+36044
+36045
+36046
+36047
+36048
+36049
+36050
+36051
+36052
+36053
+36054
+36055
+36056
+36057
+36058
+36059
+36060
+36061
+36062
+36063
+36064
+36065
+36066
+36067
+36068
+36069
+36070
+36071
+36072
+36073
+36074
+36075
+36076
+36077
+36078
+36079
+36080
+36081
+36082
+36083
+36084
+36085
+36086
+36087
+36088
+36089
+36090
+36091
+36092
+36093
+36094
+36095
+36096
+36097
+36098
+36099
+36100
+36101
+36102
+36103
+36104
+36105
+36106
+36107
+36108
+36109
+36110
+36111
+36112
+36113
+36114
+36115
+36116
+36117
+36118
+36119
+36120
+36121
+36122
+36123
+36124
+36125
+36126
+36127
+36128
+36129
+36130
+36131
+36132
+36133
+36134
+36135
+36136
+36137
+36138
+36139
+36140
+36141
+36142
+36143
+36144
+36145
+36146
+36147
+36148
+36149
+36150
+36151
+36152
+36153
+36154
+36155
+36156
+36157
+36158
+36159
+36160
+36161
+36162
+36163
+36164
+36165
+36166
+36167
+36168
+36169
+36170
+36171
+36172
+36173
+36174
+36175
+36176
+36177
+36178
+36179
+36180
+36181
+36182
+36183
+36184
+36185
+36186
+36187
+36188
+36189
+36190
+36191
+36192
+36193
+36194
+36195
+36196
+36197
+36198
+36199
+36200
+36201
+36202
+36203
+36204
+36205
+36206
+36207
+36208
+36209
+36210
+36211
+36212
+36213
+36214
+36215
+36216
+36217
+36218
+36219
+36220
+36221
+36222
+36223
+36224
+36225
+36226
+36227
+36228
+36229
+36230
+36231
+36232
+36233
+36234
+36235
+36236
+36237
+36238
+36239
+36240
+36241
+36242
+36243
+36244
+36245
+36246
+36247
+36248
+36249
+36250
+36251
+36252
+36253
+36254
+36255
+36256
+36257
+36258
+36259
+36260
+36261
+36262
+36263
+36264
+36265
+36266
+36267
+36268
+36269
+36270
+36271
+36272
+36273
+36274
+36275
+36276
+36277
+36278
+36279
+36280
+36281
+36282
+36283
+36284
+36285
+36286
+36287
+36288
+36289
+36290
+36291
+36292
+36293
+36294
+36295
+36296
+36297
+36298
+36299
+36300
+36301
+36302
+36303
+36304
+36305
+36306
+36307
+36308
+36309
+36310
+36311
+36312
+36313
+36314
+36315
+36316
+36317
+36318
+36319
+36320
+36321
+36322
+36323
+36324
+36325
+36326
+36327
+36328
+36329
+36330
+36331
+36332
+36333
+36334
+36335
+36336
+36337
+36338
+36339
+36340
+36341
+36342
+36343
+36344
+36345
+36346
+36347
+36348
+36349
+36350
+36351
+36352
+36353
+36354
+36355
+36356
+36357
+36358
+36359
+36360
+36361
+36362
+36363
+36364
+36365
+36366
+36367
+36368
+36369
+36370
+36371
+36372
+36373
+36374
+36375
+36376
+36377
+36378
+36379
+36380
+36381
+36382
+36383
+36384
+36385
+36386
+36387
+36388
+36389
+36390
+36391
+36392
+36393
+36394
+36395
+36396
+36397
+36398
+36399
+36400
+36401
+36402
+36403
+36404
+36405
+36406
+36407
+36408
+36409
+36410
+36411
+36412
+36413
+36414
+36415
+36416
+36417
+36418
+36419
+36420
+36421
+36422
+36423
+36424
+36425
+36426
+36427
+36428
+36429
+36430
+36431
+36432
+36433
+36434
+36435
+36436
+36437
+36438
+36439
+36440
+36441
+36442
+36443
+36444
+36445
+36446
+36447
+36448
+36449
+36450
+36451
+36452
+36453
+36454
+36455
+36456
+36457
+36458
+36459
+36460
+36461
+36462
+36463
+36464
+36465
+36466
+36467
+36468
+36469
+36470
+36471
+36472
+36473
+36474
+36475
+36476
+36477
+36478
+36479
+36480
+36481
+36482
+36483
+36484
+36485
+36486
+36487
+36488
+36489
+36490
+36491
+36492
+36493
+36494
+36495
+36496
+36497
+36498
+36499
+36500
+36501
+36502
+36503
+36504
+36505
+36506
+36507
+36508
+36509
+36510
+36511
+36512
+36513
+36514
+36515
+36516
+36517
+36518
+36519
+36520
+36521
+36522
+36523
+36524
+36525
+36526
+36527
+36528
+36529
+36530
+36531
+36532
+36533
+36534
+36535
+36536
+36537
+36538
+36539
+36540
+36541
+36542
+36543
+36544
+36545
+36546
+36547
+36548
+36549
+36550
+36551
+36552
+36553
+36554
+36555
+36556
+36557
+36558
+36559
+36560
+36561
+36562
+36563
+36564
+36565
+36566
+36567
+36568
+36569
+36570
+36571
+36572
+36573
+36574
+36575
+36576
+36577
+36578
+36579
+36580
+36581
+36582
+36583
+36584
+36585
+36586
+36587
+36588
+36589
+36590
+36591
+36592
+36593
+36594
+36595
+36596
+36597
+36598
+36599
+36600
+36601
+36602
+36603
+36604
+36605
+36606
+36607
+36608
+36609
+36610
+36611
+36612
+36613
+36614
+36615
+36616
+36617
+36618
+36619
+36620
+36621
+36622
+36623
+36624
+36625
+36626
+36627
+36628
+36629
+36630
+36631
+36632
+36633
+36634
+36635
+36636
+36637
+36638
+36639
+36640
+36641
+36642
+36643
+36644
+36645
+36646
+36647
+36648
+36649
+36650
+36651
+36652
+36653
+36654
+36655
+36656
+36657
+36658
+36659
+36660
+36661
+36662
+36663
+36664
+36665
+36666
+36667
+36668
+36669
+36670
+36671
+36672
+36673
+36674
+36675
+36676
+36677
+36678
+36679
+36680
+36681
+36682
+36683
+36684
+36685
+36686
+36687
+36688
+36689
+36690
+36691
+36692
+36693
+36694
+36695
+36696
+36697
+36698
+36699
+36700
+36701
+36702
+36703
+36704
+36705
+36706
+36707
+36708
+36709
+36710
+36711
+36712
+36713
+36714
+36715
+36716
+36717
+36718
+36719
+36720
+36721
+36722
+36723
+36724
+36725
+36726
+36727
+36728
+36729
+36730
+36731
+36732
+36733
+36734
+36735
+36736
+36737
+36738
+36739
+36740
+36741
+36742
+36743
+36744
+36745
+36746
+36747
+36748
+36749
+36750
+36751
+36752
+36753
+36754
+36755
+36756
+36757
+36758
+36759
+36760
+36761
+36762
+36763
+36764
+36765
+36766
+36767
+36768
+36769
+36770
+36771
+36772
+36773
+36774
+36775
+36776
+36777
+36778
+36779
+36780
+36781
+36782
+36783
+36784
+36785
+36786
+36787
+36788
+36789
+36790
+36791
+36792
+36793
+36794
+36795
+36796
+36797
+36798
+36799
+36800
+
// auto-generated: "lalrpop 0.20.0"
+// sha3: d61fd9a5d17987d20331206bc748cb5518fef921a3c944d1e6890738cbbc32bf
+use crate::ast::*;
+use crate::Symbol;
+use crate::Schedule;
+use ordered_float::OrderedFloat;
+#[allow(unused_extern_crates)]
+extern crate lalrpop_util as __lalrpop_util;
+#[allow(unused_imports)]
+use self::__lalrpop_util::state_machine as __state_machine;
+extern crate core;
+extern crate alloc;
+
+#[rustfmt::skip]
+#[allow(non_snake_case, non_camel_case_types, unused_mut, unused_variables, unused_imports, unused_parens, clippy::all)]
+mod __parse__Action {
+
+    use crate::ast::*;
+    use crate::Symbol;
+    use crate::Schedule;
+    use ordered_float::OrderedFloat;
+    #[allow(unused_extern_crates)]
+    extern crate lalrpop_util as __lalrpop_util;
+    #[allow(unused_imports)]
+    use self::__lalrpop_util::state_machine as __state_machine;
+    extern crate core;
+    extern crate alloc;
+    use self::__lalrpop_util::lexer::Token;
+    #[allow(dead_code)]
+    pub(crate) enum __Symbol<'input>
+     {
+        Variant0(&'input str),
+        Variant1(Expr),
+        Variant2(core::option::Option<Expr>),
+        Variant3(String),
+        Variant4(core::option::Option<String>),
+        Variant5(Vec<Action>),
+        Variant6(core::option::Option<Vec<Action>>),
+        Variant7(Symbol),
+        Variant8(core::option::Option<Symbol>),
+        Variant9(core::option::Option<&'input str>),
+        Variant10(alloc::vec::Vec<Fact>),
+        Variant11(core::option::Option<alloc::vec::Vec<Fact>>),
+        Variant12(usize),
+        Variant13(core::option::Option<usize>),
+        Variant14(Vec<Fact>),
+        Variant15(core::option::Option<Vec<Fact>>),
+        Variant16(Command),
+        Variant17(alloc::vec::Vec<Command>),
+        Variant18(alloc::vec::Vec<Expr>),
+        Variant19(Fact),
+        Variant20(alloc::vec::Vec<Symbol>),
+        Variant21(Variant),
+        Variant22(alloc::vec::Vec<Variant>),
+        Variant23(Action),
+        Variant24(alloc::vec::Vec<Action>),
+        Variant25(Option<usize>),
+        Variant26(Vec<Expr>),
+        Variant27(OrderedFloat<f64>),
+        Variant28(IdentSort),
+        Variant29(alloc::vec::Vec<IdentSort>),
+        Variant30(()),
+        Variant31(Vec<Symbol>),
+        Variant32(Literal),
+        Variant33(i64),
+        Variant34(Vec<Command>),
+        Variant35(Schedule),
+        Variant36(alloc::vec::Vec<Schedule>),
+        Variant37(Schema),
+    }
+    const __ACTION: &[i16] = &[
+        // State 0
+        34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 1
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 0, 0, 0, 0, 0, 6, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 9, 0, 36, 0, 0,
+        // State 2
+        34, 46, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 35, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 36, 52, 53,
+        // State 3
+        34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 4
+        34, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 36, 52, 53,
+        // State 5
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0,
+        // State 6
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 0, 0, 0,
+        // State 7
+        34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 8
+        34, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 36, 52, 53,
+        // State 9
+        34, 46, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 35, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 36, 52, 53,
+        // State 10
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0,
+        // State 11
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0,
+        // State 12
+        34, 46, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 35, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 36, 52, 53,
+        // State 13
+        34, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 36, 52, 53,
+        // State 14
+        0, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 15
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0,
+        // State 16
+        34, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 36, 52, 53,
+        // State 17
+        34, 46, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 35, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 36, 52, 53,
+        // State 18
+        0, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 19
+        0, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 20
+        34, 46, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 35, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 36, 52, 53,
+        // State 21
+        0, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 22
+        34, 46, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 35, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 36, 52, 53,
+        // State 23
+        0, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 24
+        34, 46, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 35, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 36, 52, 53,
+        // State 25
+        34, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 36, 52, 53,
+        // State 26
+        0, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 27
+        34, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 35, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 36, 52, 53,
+        // State 28
+        0, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 29
+        0, 46, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 30
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 31
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 32
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 33
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -157, -157, 0, 0, 0, 0, 0, -157, 0, -157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -157, 0, 0, 0, -157, 0, -157, 0, 0,
+        // State 34
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -158, -158, 0, 0, 0, 0, 0, -158, 0, -158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -158, 0, 0, 0, -158, 0, -158, 0, 0,
+        // State 35
+        -151, -151, -151, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -151, -151, -151, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -151, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -151, -151, -151, -151,
+        // State 36
+        -134, -134, -134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -134, -134, -134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -134, -134, -134, -134,
+        // State 37
+        -38, -38, -38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -38, -38, -38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -38, -38, -38, -38,
+        // State 38
+        -166, -166, -166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -166, -166, -166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -166, -166, -166, -166,
+        // State 39
+        -133, -133, -133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -133, -133, -133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -133, -133, -133, -133,
+        // State 40
+        -132, -132, -132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -132, -132, -132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -132, -132, -132, -132,
+        // State 41
+        -165, -165, -165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -165, -165, -165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -165, -165, -165, -165,
+        // State 42
+        -61, -61, -61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -61, -61, -61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -61, -61, -61, -61,
+        // State 43
+        -202, -202, -202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -202, -202, -202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -202, -202, -202, -202,
+        // State 44
+        -167, -167, -167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -167, -167, -167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -167, -167, -167, -167,
+        // State 45
+        -181, -181, -181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -181, -181, -181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -181, -181, -181, -181,
+        // State 46
+        -144, -144, -144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -144, -144, -144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -144, -144, -144, -144,
+        // State 47
+        -141, -141, -141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -141, -141, -141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -141, -141, -141, -141,
+        // State 48
+        -182, -182, -182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -182, -182, -182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -182, -182, -182, -182,
+        // State 49
+        -143, -143, -143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -143, -143, -143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -143, -143, -143, -143,
+        // State 50
+        -201, -201, -201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -201, -201, -201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -201, -201, -201, -201,
+        // State 51
+        -178, -178, -178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -178, -178, -178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -178, -178, -178, -178,
+        // State 52
+        -142, -142, -142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -142, -142, -142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -142, -142, -142, -142,
+        // State 53
+        -39, -39, -39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -39, -39, -39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -39, -39, -39, -39,
+        // State 54
+        -62, -62, -62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -62, -62, -62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -62, -62, -62, -62,
+        // State 55
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 56
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 57
+        -137, -137, -137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -137, -137, -137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -137, -137, -137, -137,
+        // State 58
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 59
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 60
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 61
+        -138, -138, -138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -138, -138, -138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -138, -138, -138, -138,
+        // State 62
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 63
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 64
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 65
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    ];
+    fn __action(state: i16, integer: usize) -> i16 {
+        __ACTION[(state as usize) * 57 + integer]
+    }
+    const __EOF_ACTION: &[i16] = &[
+        // State 0
+        0,
+        // State 1
+        0,
+        // State 2
+        0,
+        // State 3
+        0,
+        // State 4
+        0,
+        // State 5
+        0,
+        // State 6
+        0,
+        // State 7
+        0,
+        // State 8
+        0,
+        // State 9
+        0,
+        // State 10
+        0,
+        // State 11
+        0,
+        // State 12
+        0,
+        // State 13
+        0,
+        // State 14
+        0,
+        // State 15
+        0,
+        // State 16
+        0,
+        // State 17
+        0,
+        // State 18
+        0,
+        // State 19
+        0,
+        // State 20
+        0,
+        // State 21
+        0,
+        // State 22
+        0,
+        // State 23
+        0,
+        // State 24
+        0,
+        // State 25
+        0,
+        // State 26
+        0,
+        // State 27
+        0,
+        // State 28
+        0,
+        // State 29
+        0,
+        // State 30
+        -213,
+        // State 31
+        -177,
+        // State 32
+        -56,
+        // State 33
+        0,
+        // State 34
+        0,
+        // State 35
+        0,
+        // State 36
+        0,
+        // State 37
+        0,
+        // State 38
+        0,
+        // State 39
+        0,
+        // State 40
+        0,
+        // State 41
+        0,
+        // State 42
+        -61,
+        // State 43
+        0,
+        // State 44
+        0,
+        // State 45
+        -181,
+        // State 46
+        0,
+        // State 47
+        0,
+        // State 48
+        -182,
+        // State 49
+        0,
+        // State 50
+        0,
+        // State 51
+        0,
+        // State 52
+        0,
+        // State 53
+        0,
+        // State 54
+        -62,
+        // State 55
+        -175,
+        // State 56
+        -174,
+        // State 57
+        0,
+        // State 58
+        -176,
+        // State 59
+        -55,
+        // State 60
+        -173,
+        // State 61
+        0,
+        // State 62
+        -171,
+        // State 63
+        -172,
+        // State 64
+        -169,
+        // State 65
+        -170,
+    ];
+    fn __goto(state: i16, nt: usize) -> i16 {
+        match nt {
+            23 => 9,
+            33 => 30,
+            36 => match state {
+                0 => 31,
+                _ => 36,
+            },
+            39 => match state {
+                4 => 12,
+                8 => 16,
+                12 => 18,
+                13 => 19,
+                16 => 21,
+                25 => 28,
+                27 => 29,
+                2 => 37,
+                9 => 53,
+                22 | 24 => 61,
+                _ => 57,
+            },
+            41 => match state {
+                20 => 24,
+                _ => 22,
+            },
+            43 => 38,
+            47 => match state {
+                1 | 10 => 2,
+                5 => 13,
+                11 => 17,
+                15 => 20,
+                _ => 39,
+            },
+            51 => match state {
+                0 => 1,
+                3 => 11,
+                7 => 15,
+                _ => 10,
+            },
+            55 => 40,
+            57 => 32,
+            58 => 41,
+            60 => match state {
+                20 => 25,
+                22 => 26,
+                24 => 27,
+                2 => 42,
+                9 => 54,
+                12 => 55,
+                14 => 56,
+                18 => 58,
+                19 => 59,
+                21 => 60,
+                23 => 62,
+                26 => 63,
+                28 => 64,
+                29 => 65,
+                _ => 23,
+            },
+            65 => match state {
+                6 => 14,
+                _ => 43,
+            },
+            66 => 44,
+            _ => 0,
+        }
+    }
+    const __TERMINAL: &[&str] = &[
+        r###""(""###,
+        r###"")""###,
+        r###""-inf""###,
+        r###"":cost""###,
+        r###"":default""###,
+        r###"":merge""###,
+        r###"":name""###,
+        r###"":on_merge""###,
+        r###"":ruleset""###,
+        r###"":unextractable""###,
+        r###"":until""###,
+        r###"":variants""###,
+        r###"":when""###,
+        r###""=""###,
+        r###""NaN""###,
+        r###""[""###,
+        r###""]""###,
+        r###""add-ruleset""###,
+        r###""birewrite""###,
+        r###""calc""###,
+        r###""check""###,
+        r###""check-proof""###,
+        r###""datatype""###,
+        r###""declare""###,
+        r###""delete""###,
+        r###""extract""###,
+        r###""fail""###,
+        r###""function""###,
+        r###""include""###,
+        r###""inf""###,
+        r###""input""###,
+        r###""let""###,
+        r###""output""###,
+        r###""panic""###,
+        r###""pop""###,
+        r###""print-size""###,
+        r###""print-table""###,
+        r###""push""###,
+        r###""query-extract""###,
+        r###""relation""###,
+        r###""repeat""###,
+        r###""rewrite""###,
+        r###""rule""###,
+        r###""ruleset""###,
+        r###""run""###,
+        r###""run-schedule""###,
+        r###""saturate""###,
+        r###""seq""###,
+        r###""set""###,
+        r###""set-option""###,
+        r###""simplify""###,
+        r###""sort""###,
+        r###""union""###,
+        r###"r#"(\"[^\"]*\")+"#"###,
+        r###"r#"(([[:alpha:]][\\w-]*)|([-+*/?!=<>&|^/%_]))+"#"###,
+        r###"r#"(-)?[0-9]+"#"###,
+        r###"r#"(-)?[0-9]+\\.[0-9]+(e(\\+)?(-)?[0-9]+)?"#"###,
+    ];
+    fn __expected_tokens(__state: i16) -> alloc::vec::Vec<alloc::string::String> {
+        __TERMINAL.iter().enumerate().filter_map(|(index, terminal)| {
+            let next_state = __action(__state, index);
+            if next_state == 0 {
+                None
+            } else {
+                Some(alloc::string::ToString::to_string(terminal))
+            }
+        }).collect()
+    }
+    fn __expected_tokens_from_states<
+        'input,
+    >(
+        __states: &[i16],
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> alloc::vec::Vec<alloc::string::String>
+    {
+        __TERMINAL.iter().enumerate().filter_map(|(index, terminal)| {
+            if __accepts(None, __states, Some(index), core::marker::PhantomData::<(&())>) {
+                Some(alloc::string::ToString::to_string(terminal))
+            } else {
+                None
+            }
+        }).collect()
+    }
+    pub(crate) struct __StateMachine<'input>
+    where 
+    {
+        input: &'input str,
+        __phantom: core::marker::PhantomData<(&'input ())>,
+    }
+    impl<'input> __state_machine::ParserDefinition for __StateMachine<'input>
+    where 
+    {
+        type Location = usize;
+        type Error = String;
+        type Token = Token<'input>;
+        type TokenIndex = usize;
+        type Symbol = __Symbol<'input>;
+        type Success = Action;
+        type StateIndex = i16;
+        type Action = i16;
+        type ReduceIndex = i16;
+        type NonterminalIndex = usize;
+
+        #[inline]
+        fn start_location(&self) -> Self::Location {
+              Default::default()
+        }
+
+        #[inline]
+        fn start_state(&self) -> Self::StateIndex {
+              0
+        }
+
+        #[inline]
+        fn token_to_index(&self, token: &Self::Token) -> Option<usize> {
+            __token_to_integer(token, core::marker::PhantomData::<(&())>)
+        }
+
+        #[inline]
+        fn action(&self, state: i16, integer: usize) -> i16 {
+            __action(state, integer)
+        }
+
+        #[inline]
+        fn error_action(&self, state: i16) -> i16 {
+            __action(state, 57 - 1)
+        }
+
+        #[inline]
+        fn eof_action(&self, state: i16) -> i16 {
+            __EOF_ACTION[state as usize]
+        }
+
+        #[inline]
+        fn goto(&self, state: i16, nt: usize) -> i16 {
+            __goto(state, nt)
+        }
+
+        fn token_to_symbol(&self, token_index: usize, token: Self::Token) -> Self::Symbol {
+            __token_to_symbol(token_index, token, core::marker::PhantomData::<(&())>)
+        }
+
+        fn expected_tokens(&self, state: i16) -> alloc::vec::Vec<alloc::string::String> {
+            __expected_tokens(state)
+        }
+
+        fn expected_tokens_from_states(&self, states: &[i16]) -> alloc::vec::Vec<alloc::string::String> {
+            __expected_tokens_from_states(states, core::marker::PhantomData::<(&())>)
+        }
+
+        #[inline]
+        fn uses_error_recovery(&self) -> bool {
+            false
+        }
+
+        #[inline]
+        fn error_recovery_symbol(
+            &self,
+            recovery: __state_machine::ErrorRecovery<Self>,
+        ) -> Self::Symbol {
+            panic!("error recovery not enabled for this grammar")
+        }
+
+        fn reduce(
+            &mut self,
+            action: i16,
+            start_location: Option<&Self::Location>,
+            states: &mut alloc::vec::Vec<i16>,
+            symbols: &mut alloc::vec::Vec<__state_machine::SymbolTriple<Self>>,
+        ) -> Option<__state_machine::ParseResult<Self>> {
+            __reduce(
+                self.input,
+                action,
+                start_location,
+                states,
+                symbols,
+                core::marker::PhantomData::<(&())>,
+            )
+        }
+
+        fn simulate_reduce(&self, action: i16) -> __state_machine::SimulatedReduce<Self> {
+            __simulate_reduce(action, core::marker::PhantomData::<(&())>)
+        }
+    }
+    fn __token_to_integer<
+        'input,
+    >(
+        __token: &Token<'input>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> Option<usize>
+    {
+        match *__token {
+            Token(4, _) if true => Some(0),
+            Token(5, _) if true => Some(1),
+            Token(6, _) if true => Some(2),
+            Token(7, _) if true => Some(3),
+            Token(8, _) if true => Some(4),
+            Token(9, _) if true => Some(5),
+            Token(10, _) if true => Some(6),
+            Token(11, _) if true => Some(7),
+            Token(12, _) if true => Some(8),
+            Token(13, _) if true => Some(9),
+            Token(14, _) if true => Some(10),
+            Token(15, _) if true => Some(11),
+            Token(16, _) if true => Some(12),
+            Token(17, _) if true => Some(13),
+            Token(18, _) if true => Some(14),
+            Token(19, _) if true => Some(15),
+            Token(20, _) if true => Some(16),
+            Token(21, _) if true => Some(17),
+            Token(22, _) if true => Some(18),
+            Token(23, _) if true => Some(19),
+            Token(24, _) if true => Some(20),
+            Token(25, _) if true => Some(21),
+            Token(26, _) if true => Some(22),
+            Token(27, _) if true => Some(23),
+            Token(28, _) if true => Some(24),
+            Token(29, _) if true => Some(25),
+            Token(30, _) if true => Some(26),
+            Token(31, _) if true => Some(27),
+            Token(32, _) if true => Some(28),
+            Token(33, _) if true => Some(29),
+            Token(34, _) if true => Some(30),
+            Token(35, _) if true => Some(31),
+            Token(36, _) if true => Some(32),
+            Token(37, _) if true => Some(33),
+            Token(38, _) if true => Some(34),
+            Token(39, _) if true => Some(35),
+            Token(40, _) if true => Some(36),
+            Token(41, _) if true => Some(37),
+            Token(42, _) if true => Some(38),
+            Token(43, _) if true => Some(39),
+            Token(44, _) if true => Some(40),
+            Token(45, _) if true => Some(41),
+            Token(46, _) if true => Some(42),
+            Token(47, _) if true => Some(43),
+            Token(48, _) if true => Some(44),
+            Token(49, _) if true => Some(45),
+            Token(50, _) if true => Some(46),
+            Token(51, _) if true => Some(47),
+            Token(52, _) if true => Some(48),
+            Token(53, _) if true => Some(49),
+            Token(54, _) if true => Some(50),
+            Token(55, _) if true => Some(51),
+            Token(56, _) if true => Some(52),
+            Token(0, _) if true => Some(53),
+            Token(1, _) if true => Some(54),
+            Token(2, _) if true => Some(55),
+            Token(3, _) if true => Some(56),
+            _ => None,
+        }
+    }
+    fn __token_to_symbol<
+        'input,
+    >(
+        __token_index: usize,
+        __token: Token<'input>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> __Symbol<'input>
+    {
+        match __token_index {
+            0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 => match __token {
+                Token(4, __tok0) | Token(5, __tok0) | Token(6, __tok0) | Token(7, __tok0) | Token(8, __tok0) | Token(9, __tok0) | Token(10, __tok0) | Token(11, __tok0) | Token(12, __tok0) | Token(13, __tok0) | Token(14, __tok0) | Token(15, __tok0) | Token(16, __tok0) | Token(17, __tok0) | Token(18, __tok0) | Token(19, __tok0) | Token(20, __tok0) | Token(21, __tok0) | Token(22, __tok0) | Token(23, __tok0) | Token(24, __tok0) | Token(25, __tok0) | Token(26, __tok0) | Token(27, __tok0) | Token(28, __tok0) | Token(29, __tok0) | Token(30, __tok0) | Token(31, __tok0) | Token(32, __tok0) | Token(33, __tok0) | Token(34, __tok0) | Token(35, __tok0) | Token(36, __tok0) | Token(37, __tok0) | Token(38, __tok0) | Token(39, __tok0) | Token(40, __tok0) | Token(41, __tok0) | Token(42, __tok0) | Token(43, __tok0) | Token(44, __tok0) | Token(45, __tok0) | Token(46, __tok0) | Token(47, __tok0) | Token(48, __tok0) | Token(49, __tok0) | Token(50, __tok0) | Token(51, __tok0) | Token(52, __tok0) | Token(53, __tok0) | Token(54, __tok0) | Token(55, __tok0) | Token(56, __tok0) | Token(0, __tok0) | Token(1, __tok0) | Token(2, __tok0) | Token(3, __tok0) if true => __Symbol::Variant0(__tok0),
+                _ => unreachable!(),
+            },
+            _ => unreachable!(),
+        }
+    }
+    fn __simulate_reduce<
+        'input,
+    >(
+        __reduce_index: i16,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> __state_machine::SimulatedReduce<__StateMachine<'input>>
+    {
+        match __reduce_index {
+            0 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 0,
+                }
+            }
+            1 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 1,
+                }
+            }
+            2 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 1,
+                }
+            }
+            3 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 2,
+                }
+            }
+            4 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 3,
+                }
+            }
+            5 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 3,
+                }
+            }
+            6 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 4,
+                }
+            }
+            7 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 5,
+                }
+            }
+            8 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 5,
+                }
+            }
+            9 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 6,
+                }
+            }
+            10 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 7,
+                }
+            }
+            11 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 7,
+                }
+            }
+            12 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 8,
+                }
+            }
+            13 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 9,
+                }
+            }
+            14 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 9,
+                }
+            }
+            15 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 10,
+                }
+            }
+            16 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 11,
+                }
+            }
+            17 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 11,
+                }
+            }
+            18 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 12,
+                }
+            }
+            19 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 12,
+                }
+            }
+            20 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 13,
+                }
+            }
+            21 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 13,
+                }
+            }
+            22 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 13,
+                }
+            }
+            23 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 14,
+                }
+            }
+            24 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 15,
+                }
+            }
+            25 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 15,
+                }
+            }
+            26 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 16,
+                }
+            }
+            27 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 17,
+                }
+            }
+            28 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 17,
+                }
+            }
+            29 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 18,
+                }
+            }
+            30 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 19,
+                }
+            }
+            31 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 19,
+                }
+            }
+            32 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 20,
+                }
+            }
+            33 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 20,
+                }
+            }
+            34 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 21,
+                }
+            }
+            35 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 22,
+                }
+            }
+            36 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 22,
+                }
+            }
+            37 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 23,
+                }
+            }
+            38 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 23,
+                }
+            }
+            39 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 24,
+                }
+            }
+            40 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 25,
+                }
+            }
+            41 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 25,
+                }
+            }
+            42 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 26,
+                }
+            }
+            43 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 26,
+                }
+            }
+            44 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 27,
+                }
+            }
+            45 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 28,
+                }
+            }
+            46 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 28,
+                }
+            }
+            47 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 29,
+                }
+            }
+            48 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 29,
+                }
+            }
+            49 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 30,
+                }
+            }
+            50 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 31,
+                }
+            }
+            51 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 31,
+                }
+            }
+            52 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 32,
+                }
+            }
+            53 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 32,
+                }
+            }
+            54 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 33,
+                }
+            }
+            55 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 33,
+                }
+            }
+            56 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 34,
+                }
+            }
+            57 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 34,
+                }
+            }
+            58 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 35,
+                }
+            }
+            59 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 35,
+                }
+            }
+            60 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 3,
+                    nonterminal_produced: 36,
+                }
+            }
+            61 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 36,
+                }
+            }
+            62 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 37,
+                }
+            }
+            63 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 37,
+                }
+            }
+            64 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 37,
+                }
+            }
+            65 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 7,
+                    nonterminal_produced: 37,
+                }
+            }
+            66 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 8,
+                    nonterminal_produced: 37,
+                }
+            }
+            67 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 37,
+                }
+            }
+            68 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 13,
+                    nonterminal_produced: 37,
+                }
+            }
+            69 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 12,
+                    nonterminal_produced: 37,
+                }
+            }
+            70 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 11,
+                    nonterminal_produced: 37,
+                }
+            }
+            71 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 10,
+                    nonterminal_produced: 37,
+                }
+            }
+            72 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 11,
+                    nonterminal_produced: 37,
+                }
+            }
+            73 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 10,
+                    nonterminal_produced: 37,
+                }
+            }
+            74 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 9,
+                    nonterminal_produced: 37,
+                }
+            }
+            75 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 8,
+                    nonterminal_produced: 37,
+                }
+            }
+            76 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 11,
+                    nonterminal_produced: 37,
+                }
+            }
+            77 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 10,
+                    nonterminal_produced: 37,
+                }
+            }
+            78 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 9,
+                    nonterminal_produced: 37,
+                }
+            }
+            79 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 8,
+                    nonterminal_produced: 37,
+                }
+            }
+            80 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 9,
+                    nonterminal_produced: 37,
+                }
+            }
+            81 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 8,
+                    nonterminal_produced: 37,
+                }
+            }
+            82 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 7,
+                    nonterminal_produced: 37,
+                }
+            }
+            83 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 6,
+                    nonterminal_produced: 37,
+                }
+            }
+            84 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 37,
+                }
+            }
+            85 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 37,
+                }
+            }
+            86 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 37,
+                }
+            }
+            87 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 9,
+                    nonterminal_produced: 37,
+                }
+            }
+            88 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 7,
+                    nonterminal_produced: 37,
+                }
+            }
+            89 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 7,
+                    nonterminal_produced: 37,
+                }
+            }
+            90 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 37,
+                }
+            }
+            91 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 9,
+                    nonterminal_produced: 37,
+                }
+            }
+            92 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 7,
+                    nonterminal_produced: 37,
+                }
+            }
+            93 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 7,
+                    nonterminal_produced: 37,
+                }
+            }
+            94 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 37,
+                }
+            }
+            95 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 9,
+                    nonterminal_produced: 37,
+                }
+            }
+            96 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 7,
+                    nonterminal_produced: 37,
+                }
+            }
+            97 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 7,
+                    nonterminal_produced: 37,
+                }
+            }
+            98 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 37,
+                }
+            }
+            99 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 37,
+                }
+            }
+            100 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 37,
+                }
+            }
+            101 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 37,
+                }
+            }
+            102 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 6,
+                    nonterminal_produced: 37,
+                }
+            }
+            103 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 37,
+                }
+            }
+            104 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 6,
+                    nonterminal_produced: 37,
+                }
+            }
+            105 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 7,
+                    nonterminal_produced: 37,
+                }
+            }
+            106 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 37,
+                }
+            }
+            107 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 37,
+                }
+            }
+            108 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 37,
+                }
+            }
+            109 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 6,
+                    nonterminal_produced: 37,
+                }
+            }
+            110 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 7,
+                    nonterminal_produced: 37,
+                }
+            }
+            111 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 6,
+                    nonterminal_produced: 37,
+                }
+            }
+            112 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 37,
+                }
+            }
+            113 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 3,
+                    nonterminal_produced: 37,
+                }
+            }
+            114 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 37,
+                }
+            }
+            115 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 3,
+                    nonterminal_produced: 37,
+                }
+            }
+            116 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 3,
+                    nonterminal_produced: 37,
+                }
+            }
+            117 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 37,
+                }
+            }
+            118 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 37,
+                }
+            }
+            119 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 3,
+                    nonterminal_produced: 37,
+                }
+            }
+            120 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 37,
+                }
+            }
+            121 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 3,
+                    nonterminal_produced: 37,
+                }
+            }
+            122 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 37,
+                }
+            }
+            123 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 37,
+                }
+            }
+            124 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 37,
+                }
+            }
+            125 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 37,
+                }
+            }
+            126 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 37,
+                }
+            }
+            127 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 37,
+                }
+            }
+            128 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 37,
+                }
+            }
+            129 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 38,
+                }
+            }
+            130 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 38,
+                }
+            }
+            131 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 39,
+                }
+            }
+            132 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 39,
+                }
+            }
+            133 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 39,
+                }
+            }
+            134 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 40,
+                }
+            }
+            135 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 40,
+                }
+            }
+            136 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 41,
+                }
+            }
+            137 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 41,
+                }
+            }
+            138 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 42,
+                }
+            }
+            139 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 3,
+                    nonterminal_produced: 42,
+                }
+            }
+            140 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 43,
+                }
+            }
+            141 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 43,
+                }
+            }
+            142 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 43,
+                }
+            }
+            143 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 43,
+                }
+            }
+            144 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 44,
+                }
+            }
+            145 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 44,
+                }
+            }
+            146 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 45,
+                }
+            }
+            147 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 45,
+                }
+            }
+            148 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 46,
+                }
+            }
+            149 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 46,
+                }
+            }
+            150 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 47,
+                }
+            }
+            151 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 48,
+                }
+            }
+            152 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 49,
+                }
+            }
+            153 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 49,
+                }
+            }
+            154 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 50,
+                }
+            }
+            155 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 50,
+                }
+            }
+            156 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 51,
+                }
+            }
+            157 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 51,
+                }
+            }
+            158 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 52,
+                }
+            }
+            159 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 3,
+                    nonterminal_produced: 52,
+                }
+            }
+            160 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 53,
+                }
+            }
+            161 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 3,
+                    nonterminal_produced: 53,
+                }
+            }
+            162 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 54,
+                }
+            }
+            163 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 3,
+                    nonterminal_produced: 54,
+                }
+            }
+            164 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 55,
+                }
+            }
+            165 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 55,
+                }
+            }
+            166 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 55,
+                }
+            }
+            167 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 3,
+                    nonterminal_produced: 56,
+                }
+            }
+            168 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 7,
+                    nonterminal_produced: 57,
+                }
+            }
+            169 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 8,
+                    nonterminal_produced: 57,
+                }
+            }
+            170 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 6,
+                    nonterminal_produced: 57,
+                }
+            }
+            171 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 7,
+                    nonterminal_produced: 57,
+                }
+            }
+            172 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 57,
+                }
+            }
+            173 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 57,
+                }
+            }
+            174 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 57,
+                }
+            }
+            175 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 57,
+                }
+            }
+            176 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 57,
+                }
+            }
+            177 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 58,
+                }
+            }
+            178 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 59,
+                }
+            }
+            179 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 59,
+                }
+            }
+            180 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 60,
+                }
+            }
+            181 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 60,
+                }
+            }
+            182 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 3,
+                    nonterminal_produced: 61,
+                }
+            }
+            183 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 61,
+                }
+            }
+            184 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 3,
+                    nonterminal_produced: 61,
+                }
+            }
+            185 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 61,
+                }
+            }
+            186 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 61,
+                }
+            }
+            187 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 61,
+                }
+            }
+            188 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 61,
+                }
+            }
+            189 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 61,
+                }
+            }
+            190 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 3,
+                    nonterminal_produced: 61,
+                }
+            }
+            191 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 61,
+                }
+            }
+            192 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 6,
+                    nonterminal_produced: 61,
+                }
+            }
+            193 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 61,
+                }
+            }
+            194 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 61,
+                }
+            }
+            195 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 62,
+                }
+            }
+            196 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 62,
+                }
+            }
+            197 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 63,
+                }
+            }
+            198 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 63,
+                }
+            }
+            199 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 64,
+                }
+            }
+            200 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 65,
+                }
+            }
+            201 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 66,
+                }
+            }
+            202 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 67,
+                }
+            }
+            203 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 68,
+                }
+            }
+            204 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 68,
+                }
+            }
+            205 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 69,
+                }
+            }
+            206 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 69,
+                }
+            }
+            207 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 70,
+                }
+            }
+            208 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 71,
+                }
+            }
+            209 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 71,
+                }
+            }
+            210 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 72,
+                }
+            }
+            211 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 72,
+                }
+            }
+            212 => __state_machine::SimulatedReduce::Accept,
+            213 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 74,
+                }
+            }
+            214 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 75,
+                }
+            }
+            215 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 76,
+                }
+            }
+            _ => panic!("invalid reduction index {}", __reduce_index)
+        }
+    }
+    pub struct ActionParser {
+        builder: __lalrpop_util::lexer::MatcherBuilder,
+        _priv: (),
+    }
+
+    impl ActionParser {
+        pub fn new() -> ActionParser {
+            let __builder = super::__intern_token::new_builder();
+            ActionParser {
+                builder: __builder,
+                _priv: (),
+            }
+        }
+
+        #[allow(dead_code)]
+        pub fn parse<
+            'input,
+        >(
+            &self,
+            input: &'input str,
+        ) -> Result<Action, __lalrpop_util::ParseError<usize, Token<'input>, String>>
+        {
+            let mut __tokens = self.builder.matcher(input);
+            __state_machine::Parser::drive(
+                __StateMachine {
+                    input,
+                    __phantom: core::marker::PhantomData::<(&())>,
+                },
+                __tokens,
+            )
+        }
+    }
+    fn __accepts<
+        'input,
+    >(
+        __error_state: Option<i16>,
+        __states: &[i16],
+        __opt_integer: Option<usize>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> bool
+    {
+        let mut __states = __states.to_vec();
+        __states.extend(__error_state);
+        loop {
+            let mut __states_len = __states.len();
+            let __top = __states[__states_len - 1];
+            let __action = match __opt_integer {
+                None => __EOF_ACTION[__top as usize],
+                Some(__integer) => __action(__top, __integer),
+            };
+            if __action == 0 { return false; }
+            if __action > 0 { return true; }
+            let (__to_pop, __nt) = match __simulate_reduce(-(__action + 1), core::marker::PhantomData::<(&())>) {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop, nonterminal_produced
+                } => (states_to_pop, nonterminal_produced),
+                __state_machine::SimulatedReduce::Accept => return true,
+            };
+            __states_len -= __to_pop;
+            __states.truncate(__states_len);
+            let __top = __states[__states_len - 1];
+            let __next_state = __goto(__top, __nt);
+            __states.push(__next_state);
+        }
+    }
+    pub(crate) fn __reduce<
+        'input,
+    >(
+        input: &'input str,
+        __action: i16,
+        __lookahead_start: Option<&usize>,
+        __states: &mut alloc::vec::Vec<i16>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> Option<Result<Action,__lalrpop_util::ParseError<usize, Token<'input>, String>>>
+    {
+        let (__pop_states, __nonterminal) = match __action {
+            0 => {
+                __reduce0(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            1 => {
+                __reduce1(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            2 => {
+                __reduce2(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            3 => {
+                __reduce3(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            4 => {
+                __reduce4(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            5 => {
+                __reduce5(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            6 => {
+                __reduce6(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            7 => {
+                __reduce7(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            8 => {
+                __reduce8(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            9 => {
+                __reduce9(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            10 => {
+                __reduce10(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            11 => {
+                __reduce11(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            12 => {
+                __reduce12(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            13 => {
+                __reduce13(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            14 => {
+                __reduce14(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            15 => {
+                __reduce15(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            16 => {
+                __reduce16(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            17 => {
+                __reduce17(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            18 => {
+                __reduce18(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            19 => {
+                __reduce19(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            20 => {
+                __reduce20(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            21 => {
+                __reduce21(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            22 => {
+                __reduce22(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            23 => {
+                __reduce23(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            24 => {
+                __reduce24(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            25 => {
+                __reduce25(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            26 => {
+                __reduce26(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            27 => {
+                __reduce27(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            28 => {
+                __reduce28(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            29 => {
+                __reduce29(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            30 => {
+                __reduce30(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            31 => {
+                __reduce31(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            32 => {
+                __reduce32(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            33 => {
+                __reduce33(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            34 => {
+                __reduce34(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            35 => {
+                __reduce35(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            36 => {
+                __reduce36(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            37 => {
+                __reduce37(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            38 => {
+                __reduce38(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            39 => {
+                __reduce39(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            40 => {
+                __reduce40(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            41 => {
+                __reduce41(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            42 => {
+                __reduce42(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            43 => {
+                __reduce43(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            44 => {
+                __reduce44(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            45 => {
+                __reduce45(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            46 => {
+                __reduce46(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            47 => {
+                __reduce47(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            48 => {
+                __reduce48(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            49 => {
+                __reduce49(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            50 => {
+                __reduce50(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            51 => {
+                __reduce51(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            52 => {
+                __reduce52(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            53 => {
+                __reduce53(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            54 => {
+                __reduce54(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            55 => {
+                __reduce55(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            56 => {
+                __reduce56(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            57 => {
+                __reduce57(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            58 => {
+                __reduce58(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            59 => {
+                __reduce59(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            60 => {
+                __reduce60(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            61 => {
+                __reduce61(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            62 => {
+                __reduce62(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            63 => {
+                __reduce63(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            64 => {
+                __reduce64(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            65 => {
+                __reduce65(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            66 => {
+                __reduce66(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            67 => {
+                __reduce67(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            68 => {
+                __reduce68(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            69 => {
+                __reduce69(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            70 => {
+                __reduce70(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            71 => {
+                __reduce71(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            72 => {
+                __reduce72(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            73 => {
+                __reduce73(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            74 => {
+                __reduce74(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            75 => {
+                __reduce75(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            76 => {
+                __reduce76(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            77 => {
+                __reduce77(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            78 => {
+                __reduce78(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            79 => {
+                __reduce79(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            80 => {
+                __reduce80(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            81 => {
+                __reduce81(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            82 => {
+                __reduce82(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            83 => {
+                __reduce83(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            84 => {
+                __reduce84(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            85 => {
+                __reduce85(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            86 => {
+                __reduce86(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            87 => {
+                __reduce87(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            88 => {
+                __reduce88(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            89 => {
+                __reduce89(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            90 => {
+                __reduce90(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            91 => {
+                __reduce91(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            92 => {
+                __reduce92(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            93 => {
+                __reduce93(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            94 => {
+                __reduce94(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            95 => {
+                __reduce95(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            96 => {
+                __reduce96(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            97 => {
+                __reduce97(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            98 => {
+                __reduce98(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            99 => {
+                __reduce99(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            100 => {
+                __reduce100(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            101 => {
+                __reduce101(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            102 => {
+                __reduce102(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            103 => {
+                __reduce103(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            104 => {
+                __reduce104(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            105 => {
+                __reduce105(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            106 => {
+                __reduce106(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            107 => {
+                __reduce107(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            108 => {
+                __reduce108(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            109 => {
+                __reduce109(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            110 => {
+                __reduce110(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            111 => {
+                __reduce111(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            112 => {
+                __reduce112(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            113 => {
+                __reduce113(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            114 => {
+                __reduce114(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            115 => {
+                __reduce115(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            116 => {
+                __reduce116(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            117 => {
+                __reduce117(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            118 => {
+                __reduce118(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            119 => {
+                __reduce119(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            120 => {
+                __reduce120(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            121 => {
+                __reduce121(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            122 => {
+                __reduce122(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            123 => {
+                __reduce123(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            124 => {
+                __reduce124(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            125 => {
+                __reduce125(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            126 => {
+                __reduce126(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            127 => {
+                __reduce127(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            128 => {
+                __reduce128(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            129 => {
+                __reduce129(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            130 => {
+                __reduce130(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            131 => {
+                __reduce131(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            132 => {
+                __reduce132(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            133 => {
+                __reduce133(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            134 => {
+                __reduce134(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            135 => {
+                __reduce135(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            136 => {
+                __reduce136(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            137 => {
+                __reduce137(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            138 => {
+                __reduce138(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            139 => {
+                __reduce139(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            140 => {
+                __reduce140(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            141 => {
+                __reduce141(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            142 => {
+                __reduce142(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            143 => {
+                __reduce143(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            144 => {
+                __reduce144(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            145 => {
+                __reduce145(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            146 => {
+                __reduce146(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            147 => {
+                __reduce147(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            148 => {
+                __reduce148(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            149 => {
+                __reduce149(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            150 => {
+                __reduce150(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            151 => {
+                __reduce151(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            152 => {
+                __reduce152(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            153 => {
+                __reduce153(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            154 => {
+                __reduce154(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            155 => {
+                __reduce155(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            156 => {
+                __reduce156(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            157 => {
+                __reduce157(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            158 => {
+                __reduce158(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            159 => {
+                __reduce159(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            160 => {
+                __reduce160(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            161 => {
+                __reduce161(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            162 => {
+                __reduce162(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            163 => {
+                __reduce163(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            164 => {
+                __reduce164(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            165 => {
+                __reduce165(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            166 => {
+                __reduce166(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            167 => {
+                __reduce167(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            168 => {
+                __reduce168(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            169 => {
+                __reduce169(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            170 => {
+                __reduce170(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            171 => {
+                __reduce171(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            172 => {
+                __reduce172(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            173 => {
+                __reduce173(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            174 => {
+                __reduce174(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            175 => {
+                __reduce175(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            176 => {
+                __reduce176(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            177 => {
+                __reduce177(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            178 => {
+                __reduce178(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            179 => {
+                __reduce179(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            180 => {
+                __reduce180(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            181 => {
+                __reduce181(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            182 => {
+                __reduce182(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            183 => {
+                __reduce183(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            184 => {
+                __reduce184(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            185 => {
+                __reduce185(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            186 => {
+                __reduce186(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            187 => {
+                __reduce187(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            188 => {
+                __reduce188(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            189 => {
+                __reduce189(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            190 => {
+                __reduce190(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            191 => {
+                __reduce191(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            192 => {
+                __reduce192(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            193 => {
+                __reduce193(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            194 => {
+                __reduce194(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            195 => {
+                __reduce195(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            196 => {
+                __reduce196(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            197 => {
+                __reduce197(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            198 => {
+                __reduce198(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            199 => {
+                __reduce199(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            200 => {
+                __reduce200(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            201 => {
+                __reduce201(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            202 => {
+                __reduce202(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            203 => {
+                __reduce203(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            204 => {
+                __reduce204(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            205 => {
+                __reduce205(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            206 => {
+                __reduce206(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            207 => {
+                __reduce207(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            208 => {
+                __reduce208(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            209 => {
+                __reduce209(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            210 => {
+                __reduce210(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            211 => {
+                __reduce211(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            212 => {
+                // __Action = Action => ActionFn(1);
+                let __sym0 = __pop_Variant23(__symbols);
+                let __start = __sym0.0;
+                let __end = __sym0.2;
+                let __nt = super::__action1::<>(input, __sym0);
+                return Some(Ok(__nt));
+            }
+            213 => {
+                __reduce213(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            214 => {
+                __reduce214(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            215 => {
+                __reduce215(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            _ => panic!("invalid action code {}", __action)
+        };
+        let __states_len = __states.len();
+        __states.truncate(__states_len - __pop_states);
+        let __state = *__states.last().unwrap();
+        let __next_state = __goto(__state, __nonterminal);
+        __states.push(__next_state);
+        None
+    }
+    #[inline(never)]
+    fn __symbol_type_mismatch() -> ! {
+        panic!("symbol type mismatch")
+    }
+    fn __pop_Variant30<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, (), usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant30(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant23<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, Action, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant23(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant16<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, Command, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant16(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant1<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, Expr, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant1(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant19<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, Fact, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant19(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant28<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, IdentSort, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant28(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant32<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, Literal, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant32(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant25<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, Option<usize>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant25(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant27<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, OrderedFloat<f64>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant27(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant35<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, Schedule, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant35(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant37<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, Schema, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant37(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant3<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, String, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant3(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant7<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, Symbol, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant7(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant21<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, Variant, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant21(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant5<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, Vec<Action>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant5(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant34<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, Vec<Command>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant34(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant26<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, Vec<Expr>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant26(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant14<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, Vec<Fact>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant14(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant31<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, Vec<Symbol>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant31(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant24<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, alloc::vec::Vec<Action>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant24(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant17<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, alloc::vec::Vec<Command>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant17(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant18<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, alloc::vec::Vec<Expr>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant18(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant10<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, alloc::vec::Vec<Fact>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant10(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant29<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, alloc::vec::Vec<IdentSort>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant29(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant36<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, alloc::vec::Vec<Schedule>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant36(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant20<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, alloc::vec::Vec<Symbol>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant20(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant22<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, alloc::vec::Vec<Variant>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant22(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant2<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, core::option::Option<Expr>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant2(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant4<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, core::option::Option<String>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant4(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant8<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, core::option::Option<Symbol>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant8(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant6<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, core::option::Option<Vec<Action>>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant6(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant15<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, core::option::Option<Vec<Fact>>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant15(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant11<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, core::option::Option<alloc::vec::Vec<Fact>>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant11(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant13<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, core::option::Option<usize>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant13(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant9<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, core::option::Option<&'input str>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant9(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant33<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, i64, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant33(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant12<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, usize, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant12(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant0<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, &'input str, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant0(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    pub(crate) fn __reduce0<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":default" <Expr>) = ":default", Expr => ActionFn(115);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant1(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action115::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant1(__nt), __end));
+        (2, 0)
+    }
+    pub(crate) fn __reduce1<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":default" <Expr>)? = ":default", Expr => ActionFn(161);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant1(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action161::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant2(__nt), __end));
+        (2, 1)
+    }
+    pub(crate) fn __reduce2<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":default" <Expr>)? =  => ActionFn(114);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action114::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant2(__nt), __end));
+        (0, 1)
+    }
+    pub(crate) fn __reduce3<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":merge" <Expr>) = ":merge", Expr => ActionFn(118);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant1(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action118::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant1(__nt), __end));
+        (2, 2)
+    }
+    pub(crate) fn __reduce4<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":merge" <Expr>)? = ":merge", Expr => ActionFn(164);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant1(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action164::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant2(__nt), __end));
+        (2, 3)
+    }
+    pub(crate) fn __reduce5<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":merge" <Expr>)? =  => ActionFn(117);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action117::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant2(__nt), __end));
+        (0, 3)
+    }
+    pub(crate) fn __reduce6<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":name" <String>) = ":name", String => ActionFn(107);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant3(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action107::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant3(__nt), __end));
+        (2, 4)
+    }
+    pub(crate) fn __reduce7<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":name" <String>)? = ":name", String => ActionFn(169);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant3(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action169::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant4(__nt), __end));
+        (2, 5)
+    }
+    pub(crate) fn __reduce8<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":name" <String>)? =  => ActionFn(106);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action106::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant4(__nt), __end));
+        (0, 5)
+    }
+    pub(crate) fn __reduce9<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":on_merge" <List<Action>>) = ":on_merge", List<Action> => ActionFn(121);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant5(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action121::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant5(__nt), __end));
+        (2, 6)
+    }
+    pub(crate) fn __reduce10<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":on_merge" <List<Action>>)? = ":on_merge", List<Action> => ActionFn(172);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant5(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action172::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant6(__nt), __end));
+        (2, 7)
+    }
+    pub(crate) fn __reduce11<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":on_merge" <List<Action>>)? =  => ActionFn(120);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action120::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant6(__nt), __end));
+        (0, 7)
+    }
+    pub(crate) fn __reduce12<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":ruleset" <Ident>) = ":ruleset", Ident => ActionFn(110);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant7(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action110::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant7(__nt), __end));
+        (2, 8)
+    }
+    pub(crate) fn __reduce13<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":ruleset" <Ident>)? = ":ruleset", Ident => ActionFn(181);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant7(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action181::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant8(__nt), __end));
+        (2, 9)
+    }
+    pub(crate) fn __reduce14<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":ruleset" <Ident>)? =  => ActionFn(109);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action109::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant8(__nt), __end));
+        (0, 9)
+    }
+    pub(crate) fn __reduce15<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":unextractable") = ":unextractable" => ActionFn(125);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action125::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant0(__nt), __end));
+        (1, 10)
+    }
+    pub(crate) fn __reduce16<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":unextractable")? = ":unextractable" => ActionFn(190);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action190::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant9(__nt), __end));
+        (1, 11)
+    }
+    pub(crate) fn __reduce17<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":unextractable")? =  => ActionFn(124);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action124::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant9(__nt), __end));
+        (0, 11)
+    }
+    pub(crate) fn __reduce18<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":until" <(Fact)*>) = ":until" => ActionFn(207);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action207::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant10(__nt), __end));
+        (1, 12)
+    }
+    pub(crate) fn __reduce19<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":until" <(Fact)*>) = ":until", (Fact)+ => ActionFn(208);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant10(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action208::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant10(__nt), __end));
+        (2, 12)
+    }
+    pub(crate) fn __reduce20<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":until" <(Fact)*>)? = ":until" => ActionFn(211);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action211::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant11(__nt), __end));
+        (1, 13)
+    }
+    pub(crate) fn __reduce21<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":until" <(Fact)*>)? = ":until", (Fact)+ => ActionFn(212);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant10(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action212::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant11(__nt), __end));
+        (2, 13)
+    }
+    pub(crate) fn __reduce22<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":until" <(Fact)*>)? =  => ActionFn(97);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action97::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant11(__nt), __end));
+        (0, 13)
+    }
+    pub(crate) fn __reduce23<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":variants" <UNum>) = ":variants", UNum => ActionFn(91);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant12(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action91::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant12(__nt), __end));
+        (2, 14)
+    }
+    pub(crate) fn __reduce24<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":variants" <UNum>)? = ":variants", UNum => ActionFn(225);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant12(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action225::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant13(__nt), __end));
+        (2, 15)
+    }
+    pub(crate) fn __reduce25<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":variants" <UNum>)? =  => ActionFn(90);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action90::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant13(__nt), __end));
+        (0, 15)
+    }
+    pub(crate) fn __reduce26<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":when" <List<Fact>>) = ":when", List<Fact> => ActionFn(104);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant14(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action104::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant14(__nt), __end));
+        (2, 16)
+    }
+    pub(crate) fn __reduce27<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":when" <List<Fact>>)? = ":when", List<Fact> => ActionFn(228);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant14(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action228::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant15(__nt), __end));
+        (2, 17)
+    }
+    pub(crate) fn __reduce28<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":when" <List<Fact>>)? =  => ActionFn(103);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action103::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant15(__nt), __end));
+        (0, 17)
+    }
+    pub(crate) fn __reduce29<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Command) = Command => ActionFn(134);
+        let __sym0 = __pop_Variant16(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action134::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (1, 18)
+    }
+    pub(crate) fn __reduce30<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Command)* =  => ActionFn(132);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action132::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant17(__nt), __end));
+        (0, 19)
+    }
+    pub(crate) fn __reduce31<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Command)* = (Command)+ => ActionFn(133);
+        let __sym0 = __pop_Variant17(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action133::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant17(__nt), __end));
+        (1, 19)
+    }
+    pub(crate) fn __reduce32<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Command)+ = Command => ActionFn(237);
+        let __sym0 = __pop_Variant16(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action237::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant17(__nt), __end));
+        (1, 20)
+    }
+    pub(crate) fn __reduce33<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Command)+ = (Command)+, Command => ActionFn(238);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant16(__symbols);
+        let __sym0 = __pop_Variant17(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action238::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant17(__nt), __end));
+        (2, 20)
+    }
+    pub(crate) fn __reduce34<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Expr) = Expr => ActionFn(128);
+        let __sym0 = __pop_Variant1(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action128::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant1(__nt), __end));
+        (1, 21)
+    }
+    pub(crate) fn __reduce35<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Expr)* =  => ActionFn(126);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action126::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant18(__nt), __end));
+        (0, 22)
+    }
+    pub(crate) fn __reduce36<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Expr)* = (Expr)+ => ActionFn(127);
+        let __sym0 = __pop_Variant18(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action127::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant18(__nt), __end));
+        (1, 22)
+    }
+    pub(crate) fn __reduce37<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Expr)+ = Expr => ActionFn(241);
+        let __sym0 = __pop_Variant1(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action241::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant18(__nt), __end));
+        (1, 23)
+    }
+    pub(crate) fn __reduce38<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Expr)+ = (Expr)+, Expr => ActionFn(242);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant1(__symbols);
+        let __sym0 = __pop_Variant18(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action242::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant18(__nt), __end));
+        (2, 23)
+    }
+    pub(crate) fn __reduce39<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Fact) = Fact => ActionFn(101);
+        let __sym0 = __pop_Variant19(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action101::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant19(__nt), __end));
+        (1, 24)
+    }
+    pub(crate) fn __reduce40<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Fact)* =  => ActionFn(99);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action99::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant10(__nt), __end));
+        (0, 25)
+    }
+    pub(crate) fn __reduce41<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Fact)* = (Fact)+ => ActionFn(100);
+        let __sym0 = __pop_Variant10(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action100::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant10(__nt), __end));
+        (1, 25)
+    }
+    pub(crate) fn __reduce42<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Fact)+ = Fact => ActionFn(249);
+        let __sym0 = __pop_Variant19(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action249::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant10(__nt), __end));
+        (1, 26)
+    }
+    pub(crate) fn __reduce43<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Fact)+ = (Fact)+, Fact => ActionFn(250);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant19(__symbols);
+        let __sym0 = __pop_Variant10(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action250::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant10(__nt), __end));
+        (2, 26)
+    }
+    pub(crate) fn __reduce44<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Type) = Type => ActionFn(82);
+        let __sym0 = __pop_Variant7(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action82::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant7(__nt), __end));
+        (1, 27)
+    }
+    pub(crate) fn __reduce45<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Type)* =  => ActionFn(80);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action80::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant20(__nt), __end));
+        (0, 28)
+    }
+    pub(crate) fn __reduce46<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Type)* = (Type)+ => ActionFn(81);
+        let __sym0 = __pop_Variant20(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action81::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant20(__nt), __end));
+        (1, 28)
+    }
+    pub(crate) fn __reduce47<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Type)+ = Type => ActionFn(251);
+        let __sym0 = __pop_Variant7(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action251::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant20(__nt), __end));
+        (1, 29)
+    }
+    pub(crate) fn __reduce48<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Type)+ = (Type)+, Type => ActionFn(252);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant7(__symbols);
+        let __sym0 = __pop_Variant20(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action252::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant20(__nt), __end));
+        (2, 29)
+    }
+    pub(crate) fn __reduce49<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Variant) = Variant => ActionFn(131);
+        let __sym0 = __pop_Variant21(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action131::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant21(__nt), __end));
+        (1, 30)
+    }
+    pub(crate) fn __reduce50<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Variant)* =  => ActionFn(129);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action129::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant22(__nt), __end));
+        (0, 31)
+    }
+    pub(crate) fn __reduce51<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Variant)* = (Variant)+ => ActionFn(130);
+        let __sym0 = __pop_Variant22(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action130::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant22(__nt), __end));
+        (1, 31)
+    }
+    pub(crate) fn __reduce52<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Variant)+ = Variant => ActionFn(255);
+        let __sym0 = __pop_Variant21(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action255::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant22(__nt), __end));
+        (1, 32)
+    }
+    pub(crate) fn __reduce53<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Variant)+ = (Variant)+, Variant => ActionFn(256);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant21(__symbols);
+        let __sym0 = __pop_Variant22(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action256::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant22(__nt), __end));
+        (2, 32)
+    }
+    pub(crate) fn __reduce54<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Action = LParen, "let", Ident, Expr, RParen => ActionFn(54);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant1(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action54::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant23(__nt), __end));
+        (5, 33)
+    }
+    pub(crate) fn __reduce55<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Action = NonLetAction => ActionFn(55);
+        let __sym0 = __pop_Variant23(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action55::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant23(__nt), __end));
+        (1, 33)
+    }
+    pub(crate) fn __reduce56<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Action* =  => ActionFn(141);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action141::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant24(__nt), __end));
+        (0, 34)
+    }
+    pub(crate) fn __reduce57<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Action* = Action+ => ActionFn(142);
+        let __sym0 = __pop_Variant24(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action142::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant24(__nt), __end));
+        (1, 34)
+    }
+    pub(crate) fn __reduce58<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Action+ = Action => ActionFn(159);
+        let __sym0 = __pop_Variant23(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action159::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant24(__nt), __end));
+        (1, 35)
+    }
+    pub(crate) fn __reduce59<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Action+ = Action+, Action => ActionFn(160);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant23(__symbols);
+        let __sym0 = __pop_Variant24(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action160::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant24(__nt), __end));
+        (2, 35)
+    }
+    pub(crate) fn __reduce60<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // CallExpr = LParen, Ident, RParen => ActionFn(243);
+        assert!(__symbols.len() >= 3);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant7(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym2.2;
+        let __nt = super::__action243::<>(input, __sym0, __sym1, __sym2);
+        __symbols.push((__start, __Symbol::Variant1(__nt), __end));
+        (3, 36)
+    }
+    pub(crate) fn __reduce61<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // CallExpr = LParen, Ident, (Expr)+, RParen => ActionFn(244);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant18(__symbols);
+        let __sym1 = __pop_Variant7(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action244::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant1(__nt), __end));
+        (4, 36)
+    }
+    pub(crate) fn __reduce62<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "set-option", Ident, Expr, RParen => ActionFn(9);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant1(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action9::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (5, 37)
+    }
+    pub(crate) fn __reduce63<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "datatype", Ident, RParen => ActionFn(257);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action257::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (4, 37)
+    }
+    pub(crate) fn __reduce64<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "datatype", Ident, (Variant)+, RParen => ActionFn(258);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant22(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action258::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (5, 37)
+    }
+    pub(crate) fn __reduce65<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "sort", Ident, LParen, Ident, RParen, RParen => ActionFn(245);
+        assert!(__symbols.len() >= 7);
+        let __sym6 = __pop_Variant30(__symbols);
+        let __sym5 = __pop_Variant30(__symbols);
+        let __sym4 = __pop_Variant7(__symbols);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym6.2;
+        let __nt = super::__action245::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (7, 37)
+    }
+    pub(crate) fn __reduce66<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "sort", Ident, LParen, Ident, (Expr)+, RParen, RParen => ActionFn(246);
+        assert!(__symbols.len() >= 8);
+        let __sym7 = __pop_Variant30(__symbols);
+        let __sym6 = __pop_Variant30(__symbols);
+        let __sym5 = __pop_Variant18(__symbols);
+        let __sym4 = __pop_Variant7(__symbols);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym7.2;
+        let __nt = super::__action246::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (8, 37)
+    }
+    pub(crate) fn __reduce67<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "sort", Ident, RParen => ActionFn(12);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action12::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (4, 37)
+    }
+    pub(crate) fn __reduce68<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "function", Ident, Schema, Cost, ":unextractable", ":on_merge", List<Action>, ":merge", Expr, ":default", Expr, RParen => ActionFn(191);
+        assert!(__symbols.len() >= 13);
+        let __sym12 = __pop_Variant30(__symbols);
+        let __sym11 = __pop_Variant1(__symbols);
+        let __sym10 = __pop_Variant0(__symbols);
+        let __sym9 = __pop_Variant1(__symbols);
+        let __sym8 = __pop_Variant0(__symbols);
+        let __sym7 = __pop_Variant5(__symbols);
+        let __sym6 = __pop_Variant0(__symbols);
+        let __sym5 = __pop_Variant0(__symbols);
+        let __sym4 = __pop_Variant25(__symbols);
+        let __sym3 = __pop_Variant37(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym12.2;
+        let __nt = super::__action191::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9, __sym10, __sym11, __sym12);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (13, 37)
+    }
+    pub(crate) fn __reduce69<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "function", Ident, Schema, Cost, ":on_merge", List<Action>, ":merge", Expr, ":default", Expr, RParen => ActionFn(192);
+        assert!(__symbols.len() >= 12);
+        let __sym11 = __pop_Variant30(__symbols);
+        let __sym10 = __pop_Variant1(__symbols);
+        let __sym9 = __pop_Variant0(__symbols);
+        let __sym8 = __pop_Variant1(__symbols);
+        let __sym7 = __pop_Variant0(__symbols);
+        let __sym6 = __pop_Variant5(__symbols);
+        let __sym5 = __pop_Variant0(__symbols);
+        let __sym4 = __pop_Variant25(__symbols);
+        let __sym3 = __pop_Variant37(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym11.2;
+        let __nt = super::__action192::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9, __sym10, __sym11);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (12, 37)
+    }
+    pub(crate) fn __reduce70<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "function", Ident, Schema, Cost, ":unextractable", ":merge", Expr, ":default", Expr, RParen => ActionFn(193);
+        assert!(__symbols.len() >= 11);
+        let __sym10 = __pop_Variant30(__symbols);
+        let __sym9 = __pop_Variant1(__symbols);
+        let __sym8 = __pop_Variant0(__symbols);
+        let __sym7 = __pop_Variant1(__symbols);
+        let __sym6 = __pop_Variant0(__symbols);
+        let __sym5 = __pop_Variant0(__symbols);
+        let __sym4 = __pop_Variant25(__symbols);
+        let __sym3 = __pop_Variant37(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym10.2;
+        let __nt = super::__action193::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9, __sym10);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (11, 37)
+    }
+    pub(crate) fn __reduce71<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "function", Ident, Schema, Cost, ":merge", Expr, ":default", Expr, RParen => ActionFn(194);
+        assert!(__symbols.len() >= 10);
+        let __sym9 = __pop_Variant30(__symbols);
+        let __sym8 = __pop_Variant1(__symbols);
+        let __sym7 = __pop_Variant0(__symbols);
+        let __sym6 = __pop_Variant1(__symbols);
+        let __sym5 = __pop_Variant0(__symbols);
+        let __sym4 = __pop_Variant25(__symbols);
+        let __sym3 = __pop_Variant37(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym9.2;
+        let __nt = super::__action194::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (10, 37)
+    }
+    pub(crate) fn __reduce72<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "function", Ident, Schema, Cost, ":unextractable", ":on_merge", List<Action>, ":default", Expr, RParen => ActionFn(195);
+        assert!(__symbols.len() >= 11);
+        let __sym10 = __pop_Variant30(__symbols);
+        let __sym9 = __pop_Variant1(__symbols);
+        let __sym8 = __pop_Variant0(__symbols);
+        let __sym7 = __pop_Variant5(__symbols);
+        let __sym6 = __pop_Variant0(__symbols);
+        let __sym5 = __pop_Variant0(__symbols);
+        let __sym4 = __pop_Variant25(__symbols);
+        let __sym3 = __pop_Variant37(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym10.2;
+        let __nt = super::__action195::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9, __sym10);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (11, 37)
+    }
+    pub(crate) fn __reduce73<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "function", Ident, Schema, Cost, ":on_merge", List<Action>, ":default", Expr, RParen => ActionFn(196);
+        assert!(__symbols.len() >= 10);
+        let __sym9 = __pop_Variant30(__symbols);
+        let __sym8 = __pop_Variant1(__symbols);
+        let __sym7 = __pop_Variant0(__symbols);
+        let __sym6 = __pop_Variant5(__symbols);
+        let __sym5 = __pop_Variant0(__symbols);
+        let __sym4 = __pop_Variant25(__symbols);
+        let __sym3 = __pop_Variant37(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym9.2;
+        let __nt = super::__action196::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (10, 37)
+    }
+    pub(crate) fn __reduce74<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "function", Ident, Schema, Cost, ":unextractable", ":default", Expr, RParen => ActionFn(197);
+        assert!(__symbols.len() >= 9);
+        let __sym8 = __pop_Variant30(__symbols);
+        let __sym7 = __pop_Variant1(__symbols);
+        let __sym6 = __pop_Variant0(__symbols);
+        let __sym5 = __pop_Variant0(__symbols);
+        let __sym4 = __pop_Variant25(__symbols);
+        let __sym3 = __pop_Variant37(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym8.2;
+        let __nt = super::__action197::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (9, 37)
+    }
+    pub(crate) fn __reduce75<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "function", Ident, Schema, Cost, ":default", Expr, RParen => ActionFn(198);
+        assert!(__symbols.len() >= 8);
+        let __sym7 = __pop_Variant30(__symbols);
+        let __sym6 = __pop_Variant1(__symbols);
+        let __sym5 = __pop_Variant0(__symbols);
+        let __sym4 = __pop_Variant25(__symbols);
+        let __sym3 = __pop_Variant37(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym7.2;
+        let __nt = super::__action198::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (8, 37)
+    }
+    pub(crate) fn __reduce76<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "function", Ident, Schema, Cost, ":unextractable", ":on_merge", List<Action>, ":merge", Expr, RParen => ActionFn(199);
+        assert!(__symbols.len() >= 11);
+        let __sym10 = __pop_Variant30(__symbols);
+        let __sym9 = __pop_Variant1(__symbols);
+        let __sym8 = __pop_Variant0(__symbols);
+        let __sym7 = __pop_Variant5(__symbols);
+        let __sym6 = __pop_Variant0(__symbols);
+        let __sym5 = __pop_Variant0(__symbols);
+        let __sym4 = __pop_Variant25(__symbols);
+        let __sym3 = __pop_Variant37(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym10.2;
+        let __nt = super::__action199::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9, __sym10);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (11, 37)
+    }
+    pub(crate) fn __reduce77<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "function", Ident, Schema, Cost, ":on_merge", List<Action>, ":merge", Expr, RParen => ActionFn(200);
+        assert!(__symbols.len() >= 10);
+        let __sym9 = __pop_Variant30(__symbols);
+        let __sym8 = __pop_Variant1(__symbols);
+        let __sym7 = __pop_Variant0(__symbols);
+        let __sym6 = __pop_Variant5(__symbols);
+        let __sym5 = __pop_Variant0(__symbols);
+        let __sym4 = __pop_Variant25(__symbols);
+        let __sym3 = __pop_Variant37(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym9.2;
+        let __nt = super::__action200::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (10, 37)
+    }
+    pub(crate) fn __reduce78<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "function", Ident, Schema, Cost, ":unextractable", ":merge", Expr, RParen => ActionFn(201);
+        assert!(__symbols.len() >= 9);
+        let __sym8 = __pop_Variant30(__symbols);
+        let __sym7 = __pop_Variant1(__symbols);
+        let __sym6 = __pop_Variant0(__symbols);
+        let __sym5 = __pop_Variant0(__symbols);
+        let __sym4 = __pop_Variant25(__symbols);
+        let __sym3 = __pop_Variant37(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym8.2;
+        let __nt = super::__action201::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (9, 37)
+    }
+    pub(crate) fn __reduce79<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "function", Ident, Schema, Cost, ":merge", Expr, RParen => ActionFn(202);
+        assert!(__symbols.len() >= 8);
+        let __sym7 = __pop_Variant30(__symbols);
+        let __sym6 = __pop_Variant1(__symbols);
+        let __sym5 = __pop_Variant0(__symbols);
+        let __sym4 = __pop_Variant25(__symbols);
+        let __sym3 = __pop_Variant37(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym7.2;
+        let __nt = super::__action202::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (8, 37)
+    }
+    pub(crate) fn __reduce80<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "function", Ident, Schema, Cost, ":unextractable", ":on_merge", List<Action>, RParen => ActionFn(203);
+        assert!(__symbols.len() >= 9);
+        let __sym8 = __pop_Variant30(__symbols);
+        let __sym7 = __pop_Variant5(__symbols);
+        let __sym6 = __pop_Variant0(__symbols);
+        let __sym5 = __pop_Variant0(__symbols);
+        let __sym4 = __pop_Variant25(__symbols);
+        let __sym3 = __pop_Variant37(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym8.2;
+        let __nt = super::__action203::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (9, 37)
+    }
+    pub(crate) fn __reduce81<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "function", Ident, Schema, Cost, ":on_merge", List<Action>, RParen => ActionFn(204);
+        assert!(__symbols.len() >= 8);
+        let __sym7 = __pop_Variant30(__symbols);
+        let __sym6 = __pop_Variant5(__symbols);
+        let __sym5 = __pop_Variant0(__symbols);
+        let __sym4 = __pop_Variant25(__symbols);
+        let __sym3 = __pop_Variant37(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym7.2;
+        let __nt = super::__action204::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (8, 37)
+    }
+    pub(crate) fn __reduce82<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "function", Ident, Schema, Cost, ":unextractable", RParen => ActionFn(205);
+        assert!(__symbols.len() >= 7);
+        let __sym6 = __pop_Variant30(__symbols);
+        let __sym5 = __pop_Variant0(__symbols);
+        let __sym4 = __pop_Variant25(__symbols);
+        let __sym3 = __pop_Variant37(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym6.2;
+        let __nt = super::__action205::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (7, 37)
+    }
+    pub(crate) fn __reduce83<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "function", Ident, Schema, Cost, RParen => ActionFn(206);
+        assert!(__symbols.len() >= 6);
+        let __sym5 = __pop_Variant30(__symbols);
+        let __sym4 = __pop_Variant25(__symbols);
+        let __sym3 = __pop_Variant37(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym5.2;
+        let __nt = super::__action206::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (6, 37)
+    }
+    pub(crate) fn __reduce84<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "declare", Ident, Ident, RParen => ActionFn(14);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant7(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action14::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (5, 37)
+    }
+    pub(crate) fn __reduce85<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "relation", Ident, List<Type>, RParen => ActionFn(15);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant31(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action15::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (5, 37)
+    }
+    pub(crate) fn __reduce86<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "ruleset", Ident, RParen => ActionFn(16);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action16::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (4, 37)
+    }
+    pub(crate) fn __reduce87<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "rule", List<Fact>, List<Action>, ":ruleset", Ident, ":name", String, RParen => ActionFn(182);
+        assert!(__symbols.len() >= 9);
+        let __sym8 = __pop_Variant30(__symbols);
+        let __sym7 = __pop_Variant3(__symbols);
+        let __sym6 = __pop_Variant0(__symbols);
+        let __sym5 = __pop_Variant7(__symbols);
+        let __sym4 = __pop_Variant0(__symbols);
+        let __sym3 = __pop_Variant5(__symbols);
+        let __sym2 = __pop_Variant14(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym8.2;
+        let __nt = super::__action182::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (9, 37)
+    }
+    pub(crate) fn __reduce88<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "rule", List<Fact>, List<Action>, ":name", String, RParen => ActionFn(183);
+        assert!(__symbols.len() >= 7);
+        let __sym6 = __pop_Variant30(__symbols);
+        let __sym5 = __pop_Variant3(__symbols);
+        let __sym4 = __pop_Variant0(__symbols);
+        let __sym3 = __pop_Variant5(__symbols);
+        let __sym2 = __pop_Variant14(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym6.2;
+        let __nt = super::__action183::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (7, 37)
+    }
+    pub(crate) fn __reduce89<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "rule", List<Fact>, List<Action>, ":ruleset", Ident, RParen => ActionFn(184);
+        assert!(__symbols.len() >= 7);
+        let __sym6 = __pop_Variant30(__symbols);
+        let __sym5 = __pop_Variant7(__symbols);
+        let __sym4 = __pop_Variant0(__symbols);
+        let __sym3 = __pop_Variant5(__symbols);
+        let __sym2 = __pop_Variant14(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym6.2;
+        let __nt = super::__action184::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (7, 37)
+    }
+    pub(crate) fn __reduce90<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "rule", List<Fact>, List<Action>, RParen => ActionFn(185);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant5(__symbols);
+        let __sym2 = __pop_Variant14(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action185::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (5, 37)
+    }
+    pub(crate) fn __reduce91<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "rewrite", Expr, Expr, ":when", List<Fact>, ":ruleset", Ident, RParen => ActionFn(229);
+        assert!(__symbols.len() >= 9);
+        let __sym8 = __pop_Variant30(__symbols);
+        let __sym7 = __pop_Variant7(__symbols);
+        let __sym6 = __pop_Variant0(__symbols);
+        let __sym5 = __pop_Variant14(__symbols);
+        let __sym4 = __pop_Variant0(__symbols);
+        let __sym3 = __pop_Variant1(__symbols);
+        let __sym2 = __pop_Variant1(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym8.2;
+        let __nt = super::__action229::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (9, 37)
+    }
+    pub(crate) fn __reduce92<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "rewrite", Expr, Expr, ":ruleset", Ident, RParen => ActionFn(230);
+        assert!(__symbols.len() >= 7);
+        let __sym6 = __pop_Variant30(__symbols);
+        let __sym5 = __pop_Variant7(__symbols);
+        let __sym4 = __pop_Variant0(__symbols);
+        let __sym3 = __pop_Variant1(__symbols);
+        let __sym2 = __pop_Variant1(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym6.2;
+        let __nt = super::__action230::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (7, 37)
+    }
+    pub(crate) fn __reduce93<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "rewrite", Expr, Expr, ":when", List<Fact>, RParen => ActionFn(231);
+        assert!(__symbols.len() >= 7);
+        let __sym6 = __pop_Variant30(__symbols);
+        let __sym5 = __pop_Variant14(__symbols);
+        let __sym4 = __pop_Variant0(__symbols);
+        let __sym3 = __pop_Variant1(__symbols);
+        let __sym2 = __pop_Variant1(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym6.2;
+        let __nt = super::__action231::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (7, 37)
+    }
+    pub(crate) fn __reduce94<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "rewrite", Expr, Expr, RParen => ActionFn(232);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant1(__symbols);
+        let __sym2 = __pop_Variant1(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action232::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (5, 37)
+    }
+    pub(crate) fn __reduce95<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "birewrite", Expr, Expr, ":when", List<Fact>, ":ruleset", Ident, RParen => ActionFn(233);
+        assert!(__symbols.len() >= 9);
+        let __sym8 = __pop_Variant30(__symbols);
+        let __sym7 = __pop_Variant7(__symbols);
+        let __sym6 = __pop_Variant0(__symbols);
+        let __sym5 = __pop_Variant14(__symbols);
+        let __sym4 = __pop_Variant0(__symbols);
+        let __sym3 = __pop_Variant1(__symbols);
+        let __sym2 = __pop_Variant1(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym8.2;
+        let __nt = super::__action233::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (9, 37)
+    }
+    pub(crate) fn __reduce96<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "birewrite", Expr, Expr, ":ruleset", Ident, RParen => ActionFn(234);
+        assert!(__symbols.len() >= 7);
+        let __sym6 = __pop_Variant30(__symbols);
+        let __sym5 = __pop_Variant7(__symbols);
+        let __sym4 = __pop_Variant0(__symbols);
+        let __sym3 = __pop_Variant1(__symbols);
+        let __sym2 = __pop_Variant1(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym6.2;
+        let __nt = super::__action234::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (7, 37)
+    }
+    pub(crate) fn __reduce97<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "birewrite", Expr, Expr, ":when", List<Fact>, RParen => ActionFn(235);
+        assert!(__symbols.len() >= 7);
+        let __sym6 = __pop_Variant30(__symbols);
+        let __sym5 = __pop_Variant14(__symbols);
+        let __sym4 = __pop_Variant0(__symbols);
+        let __sym3 = __pop_Variant1(__symbols);
+        let __sym2 = __pop_Variant1(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym6.2;
+        let __nt = super::__action235::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (7, 37)
+    }
+    pub(crate) fn __reduce98<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "birewrite", Expr, Expr, RParen => ActionFn(236);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant1(__symbols);
+        let __sym2 = __pop_Variant1(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action236::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (5, 37)
+    }
+    pub(crate) fn __reduce99<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "let", Ident, Expr, RParen => ActionFn(20);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant1(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action20::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (5, 37)
+    }
+    pub(crate) fn __reduce100<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = NonLetAction => ActionFn(21);
+        let __sym0 = __pop_Variant23(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action21::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (1, 37)
+    }
+    pub(crate) fn __reduce101<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "run", UNum, ":until", RParen => ActionFn(213);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant0(__symbols);
+        let __sym2 = __pop_Variant12(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action213::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (5, 37)
+    }
+    pub(crate) fn __reduce102<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "run", UNum, ":until", (Fact)+, RParen => ActionFn(214);
+        assert!(__symbols.len() >= 6);
+        let __sym5 = __pop_Variant30(__symbols);
+        let __sym4 = __pop_Variant10(__symbols);
+        let __sym3 = __pop_Variant0(__symbols);
+        let __sym2 = __pop_Variant12(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym5.2;
+        let __nt = super::__action214::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (6, 37)
+    }
+    pub(crate) fn __reduce103<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "run", UNum, RParen => ActionFn(215);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant12(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action215::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (4, 37)
+    }
+    pub(crate) fn __reduce104<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "run", Ident, UNum, ":until", RParen => ActionFn(216);
+        assert!(__symbols.len() >= 6);
+        let __sym5 = __pop_Variant30(__symbols);
+        let __sym4 = __pop_Variant0(__symbols);
+        let __sym3 = __pop_Variant12(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym5.2;
+        let __nt = super::__action216::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (6, 37)
+    }
+    pub(crate) fn __reduce105<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "run", Ident, UNum, ":until", (Fact)+, RParen => ActionFn(217);
+        assert!(__symbols.len() >= 7);
+        let __sym6 = __pop_Variant30(__symbols);
+        let __sym5 = __pop_Variant10(__symbols);
+        let __sym4 = __pop_Variant0(__symbols);
+        let __sym3 = __pop_Variant12(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym6.2;
+        let __nt = super::__action217::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (7, 37)
+    }
+    pub(crate) fn __reduce106<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "run", Ident, UNum, RParen => ActionFn(218);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant12(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action218::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (5, 37)
+    }
+    pub(crate) fn __reduce107<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "simplify", Schedule, Expr, RParen => ActionFn(24);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant1(__symbols);
+        let __sym2 = __pop_Variant35(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action24::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (5, 37)
+    }
+    pub(crate) fn __reduce108<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "add-ruleset", Ident, RParen => ActionFn(25);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action25::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (4, 37)
+    }
+    pub(crate) fn __reduce109<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "calc", LParen, RParen, Expr+, RParen => ActionFn(267);
+        assert!(__symbols.len() >= 6);
+        let __sym5 = __pop_Variant30(__symbols);
+        let __sym4 = __pop_Variant18(__symbols);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym5.2;
+        let __nt = super::__action267::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (6, 37)
+    }
+    pub(crate) fn __reduce110<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "calc", LParen, IdentSort+, RParen, Expr+, RParen => ActionFn(268);
+        assert!(__symbols.len() >= 7);
+        let __sym6 = __pop_Variant30(__symbols);
+        let __sym5 = __pop_Variant18(__symbols);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant29(__symbols);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym6.2;
+        let __nt = super::__action268::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (7, 37)
+    }
+    pub(crate) fn __reduce111<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "query-extract", ":variants", UNum, Fact, RParen => ActionFn(226);
+        assert!(__symbols.len() >= 6);
+        let __sym5 = __pop_Variant30(__symbols);
+        let __sym4 = __pop_Variant19(__symbols);
+        let __sym3 = __pop_Variant12(__symbols);
+        let __sym2 = __pop_Variant0(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym5.2;
+        let __nt = super::__action226::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (6, 37)
+    }
+    pub(crate) fn __reduce112<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "query-extract", Fact, RParen => ActionFn(227);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant19(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action227::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (4, 37)
+    }
+    pub(crate) fn __reduce113<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "check", RParen => ActionFn(209);
+        assert!(__symbols.len() >= 3);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym2.2;
+        let __nt = super::__action209::<>(input, __sym0, __sym1, __sym2);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (3, 37)
+    }
+    pub(crate) fn __reduce114<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "check", (Fact)+, RParen => ActionFn(210);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant10(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action210::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (4, 37)
+    }
+    pub(crate) fn __reduce115<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "check-proof", RParen => ActionFn(29);
+        assert!(__symbols.len() >= 3);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym2.2;
+        let __nt = super::__action29::<>(input, __sym0, __sym1, __sym2);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (3, 37)
+    }
+    pub(crate) fn __reduce116<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "run-schedule", RParen => ActionFn(269);
+        assert!(__symbols.len() >= 3);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym2.2;
+        let __nt = super::__action269::<>(input, __sym0, __sym1, __sym2);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (3, 37)
+    }
+    pub(crate) fn __reduce117<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "run-schedule", Schedule+, RParen => ActionFn(270);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant36(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action270::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (4, 37)
+    }
+    pub(crate) fn __reduce118<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "push", UNum, RParen => ActionFn(279);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant12(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action279::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (4, 37)
+    }
+    pub(crate) fn __reduce119<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "push", RParen => ActionFn(280);
+        assert!(__symbols.len() >= 3);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym2.2;
+        let __nt = super::__action280::<>(input, __sym0, __sym1, __sym2);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (3, 37)
+    }
+    pub(crate) fn __reduce120<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "pop", UNum, RParen => ActionFn(281);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant12(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action281::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (4, 37)
+    }
+    pub(crate) fn __reduce121<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "pop", RParen => ActionFn(282);
+        assert!(__symbols.len() >= 3);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym2.2;
+        let __nt = super::__action282::<>(input, __sym0, __sym1, __sym2);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (3, 37)
+    }
+    pub(crate) fn __reduce122<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "print-table", Ident, UNum, RParen => ActionFn(283);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant12(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action283::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (5, 37)
+    }
+    pub(crate) fn __reduce123<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "print-table", Ident, RParen => ActionFn(284);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action284::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (4, 37)
+    }
+    pub(crate) fn __reduce124<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "print-size", Ident, RParen => ActionFn(34);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action34::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (4, 37)
+    }
+    pub(crate) fn __reduce125<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "input", Ident, String, RParen => ActionFn(35);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant3(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action35::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (5, 37)
+    }
+    pub(crate) fn __reduce126<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "output", String, Expr+, RParen => ActionFn(36);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant18(__symbols);
+        let __sym2 = __pop_Variant3(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action36::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (5, 37)
+    }
+    pub(crate) fn __reduce127<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "fail", Command, RParen => ActionFn(37);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant16(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action37::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (4, 37)
+    }
+    pub(crate) fn __reduce128<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "include", String, RParen => ActionFn(38);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant3(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action38::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (4, 37)
+    }
+    pub(crate) fn __reduce129<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Cost = ":cost", UNum => ActionFn(45);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant12(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action45::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant25(__nt), __end));
+        (2, 38)
+    }
+    pub(crate) fn __reduce130<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Cost =  => ActionFn(46);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action46::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant25(__nt), __end));
+        (0, 38)
+    }
+    pub(crate) fn __reduce131<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Expr = Literal => ActionFn(60);
+        let __sym0 = __pop_Variant32(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action60::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant1(__nt), __end));
+        (1, 39)
+    }
+    pub(crate) fn __reduce132<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Expr = Ident => ActionFn(61);
+        let __sym0 = __pop_Variant7(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action61::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant1(__nt), __end));
+        (1, 39)
+    }
+    pub(crate) fn __reduce133<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Expr = CallExpr => ActionFn(62);
+        let __sym0 = __pop_Variant1(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action62::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant1(__nt), __end));
+        (1, 39)
+    }
+    pub(crate) fn __reduce134<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Expr* =  => ActionFn(83);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action83::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant18(__nt), __end));
+        (0, 40)
+    }
+    pub(crate) fn __reduce135<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Expr* = Expr+ => ActionFn(84);
+        let __sym0 = __pop_Variant18(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action84::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant18(__nt), __end));
+        (1, 40)
+    }
+    pub(crate) fn __reduce136<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Expr+ = Expr => ActionFn(92);
+        let __sym0 = __pop_Variant1(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action92::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant18(__nt), __end));
+        (1, 41)
+    }
+    pub(crate) fn __reduce137<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Expr+ = Expr+, Expr => ActionFn(93);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant1(__symbols);
+        let __sym0 = __pop_Variant18(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action93::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant18(__nt), __end));
+        (2, 41)
+    }
+    pub(crate) fn __reduce138<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // ExprList = LParen, RParen => ActionFn(247);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant30(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action247::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant26(__nt), __end));
+        (2, 42)
+    }
+    pub(crate) fn __reduce139<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // ExprList = LParen, (Expr)+, RParen => ActionFn(248);
+        assert!(__symbols.len() >= 3);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant18(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym2.2;
+        let __nt = super::__action248::<>(input, __sym0, __sym1, __sym2);
+        __symbols.push((__start, __Symbol::Variant26(__nt), __end));
+        (3, 42)
+    }
+    pub(crate) fn __reduce140<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // F64 = "NaN" => ActionFn(73);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action73::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant27(__nt), __end));
+        (1, 43)
+    }
+    pub(crate) fn __reduce141<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // F64 = r#"(-)?[0-9]+\\.[0-9]+(e(\\+)?(-)?[0-9]+)?"# => ActionFn(74);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action74::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant27(__nt), __end));
+        (1, 43)
+    }
+    pub(crate) fn __reduce142<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // F64 = "inf" => ActionFn(75);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action75::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant27(__nt), __end));
+        (1, 43)
+    }
+    pub(crate) fn __reduce143<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // F64 = "-inf" => ActionFn(76);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action76::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant27(__nt), __end));
+        (1, 43)
+    }
+    pub(crate) fn __reduce144<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Fact = LParen, "=", Expr+, Expr, RParen => ActionFn(57);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant1(__symbols);
+        let __sym2 = __pop_Variant18(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action57::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant19(__nt), __end));
+        (5, 44)
+    }
+    pub(crate) fn __reduce145<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Fact = Expr => ActionFn(58);
+        let __sym0 = __pop_Variant1(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action58::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant19(__nt), __end));
+        (1, 44)
+    }
+    pub(crate) fn __reduce146<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Fact* =  => ActionFn(145);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action145::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant10(__nt), __end));
+        (0, 45)
+    }
+    pub(crate) fn __reduce147<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Fact* = Fact+ => ActionFn(146);
+        let __sym0 = __pop_Variant10(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action146::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant10(__nt), __end));
+        (1, 45)
+    }
+    pub(crate) fn __reduce148<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Fact+ = Fact => ActionFn(155);
+        let __sym0 = __pop_Variant19(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action155::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant10(__nt), __end));
+        (1, 46)
+    }
+    pub(crate) fn __reduce149<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Fact+ = Fact+, Fact => ActionFn(156);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant19(__symbols);
+        let __sym0 = __pop_Variant10(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action156::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant10(__nt), __end));
+        (2, 46)
+    }
+    pub(crate) fn __reduce150<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Ident = r#"(([[:alpha:]][\\w-]*)|([-+*/?!=<>&|^/%_]))+"# => ActionFn(77);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action77::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant7(__nt), __end));
+        (1, 47)
+    }
+    pub(crate) fn __reduce151<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // IdentSort = LParen, Ident, Type, RParen => ActionFn(70);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant7(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action70::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant28(__nt), __end));
+        (4, 48)
+    }
+    pub(crate) fn __reduce152<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // IdentSort* =  => ActionFn(94);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action94::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant29(__nt), __end));
+        (0, 49)
+    }
+    pub(crate) fn __reduce153<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // IdentSort* = IdentSort+ => ActionFn(95);
+        let __sym0 = __pop_Variant29(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action95::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant29(__nt), __end));
+        (1, 49)
+    }
+    pub(crate) fn __reduce154<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // IdentSort+ = IdentSort => ActionFn(149);
+        let __sym0 = __pop_Variant28(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action149::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant29(__nt), __end));
+        (1, 50)
+    }
+    pub(crate) fn __reduce155<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // IdentSort+ = IdentSort+, IdentSort => ActionFn(150);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant28(__symbols);
+        let __sym0 = __pop_Variant29(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action150::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant29(__nt), __end));
+        (2, 50)
+    }
+    pub(crate) fn __reduce156<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // LParen = "(" => ActionFn(5);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action5::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant30(__nt), __end));
+        (1, 51)
+    }
+    pub(crate) fn __reduce157<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // LParen = "[" => ActionFn(6);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action6::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant30(__nt), __end));
+        (1, 51)
+    }
+    pub(crate) fn __reduce158<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // List<Action> = LParen, RParen => ActionFn(259);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant30(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action259::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant5(__nt), __end));
+        (2, 52)
+    }
+    pub(crate) fn __reduce159<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // List<Action> = LParen, Action+, RParen => ActionFn(260);
+        assert!(__symbols.len() >= 3);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant24(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym2.2;
+        let __nt = super::__action260::<>(input, __sym0, __sym1, __sym2);
+        __symbols.push((__start, __Symbol::Variant5(__nt), __end));
+        (3, 52)
+    }
+    pub(crate) fn __reduce160<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // List<Fact> = LParen, RParen => ActionFn(265);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant30(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action265::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant14(__nt), __end));
+        (2, 53)
+    }
+    pub(crate) fn __reduce161<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // List<Fact> = LParen, Fact+, RParen => ActionFn(266);
+        assert!(__symbols.len() >= 3);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant10(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym2.2;
+        let __nt = super::__action266::<>(input, __sym0, __sym1, __sym2);
+        __symbols.push((__start, __Symbol::Variant14(__nt), __end));
+        (3, 53)
+    }
+    pub(crate) fn __reduce162<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // List<Type> = LParen, RParen => ActionFn(277);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant30(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action277::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant31(__nt), __end));
+        (2, 54)
+    }
+    pub(crate) fn __reduce163<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // List<Type> = LParen, Type+, RParen => ActionFn(278);
+        assert!(__symbols.len() >= 3);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant20(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym2.2;
+        let __nt = super::__action278::<>(input, __sym0, __sym1, __sym2);
+        __symbols.push((__start, __Symbol::Variant31(__nt), __end));
+        (3, 54)
+    }
+    pub(crate) fn __reduce164<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Literal = Num => ActionFn(63);
+        let __sym0 = __pop_Variant33(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action63::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant32(__nt), __end));
+        (1, 55)
+    }
+    pub(crate) fn __reduce165<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Literal = F64 => ActionFn(64);
+        let __sym0 = __pop_Variant27(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action64::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant32(__nt), __end));
+        (1, 55)
+    }
+    pub(crate) fn __reduce166<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Literal = SymString => ActionFn(65);
+        let __sym0 = __pop_Variant7(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action65::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant32(__nt), __end));
+        (1, 55)
+    }
+    pub(crate) fn __reduce167<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Name = "[", Ident, "]" => ActionFn(56);
+        assert!(__symbols.len() >= 3);
+        let __sym2 = __pop_Variant0(__symbols);
+        let __sym1 = __pop_Variant7(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym2.2;
+        let __nt = super::__action56::<>(input, __sym0, __sym1, __sym2);
+        __symbols.push((__start, __Symbol::Variant7(__nt), __end));
+        (3, 56)
+    }
+    pub(crate) fn __reduce168<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // NonLetAction = LParen, "set", LParen, Ident, RParen, Expr, RParen => ActionFn(261);
+        assert!(__symbols.len() >= 7);
+        let __sym6 = __pop_Variant30(__symbols);
+        let __sym5 = __pop_Variant1(__symbols);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant7(__symbols);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym6.2;
+        let __nt = super::__action261::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6);
+        __symbols.push((__start, __Symbol::Variant23(__nt), __end));
+        (7, 57)
+    }
+    pub(crate) fn __reduce169<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // NonLetAction = LParen, "set", LParen, Ident, Expr+, RParen, Expr, RParen => ActionFn(262);
+        assert!(__symbols.len() >= 8);
+        let __sym7 = __pop_Variant30(__symbols);
+        let __sym6 = __pop_Variant1(__symbols);
+        let __sym5 = __pop_Variant30(__symbols);
+        let __sym4 = __pop_Variant18(__symbols);
+        let __sym3 = __pop_Variant7(__symbols);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym7.2;
+        let __nt = super::__action262::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7);
+        __symbols.push((__start, __Symbol::Variant23(__nt), __end));
+        (8, 57)
+    }
+    pub(crate) fn __reduce170<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // NonLetAction = LParen, "delete", LParen, Ident, RParen, RParen => ActionFn(263);
+        assert!(__symbols.len() >= 6);
+        let __sym5 = __pop_Variant30(__symbols);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant7(__symbols);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym5.2;
+        let __nt = super::__action263::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5);
+        __symbols.push((__start, __Symbol::Variant23(__nt), __end));
+        (6, 57)
+    }
+    pub(crate) fn __reduce171<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // NonLetAction = LParen, "delete", LParen, Ident, Expr+, RParen, RParen => ActionFn(264);
+        assert!(__symbols.len() >= 7);
+        let __sym6 = __pop_Variant30(__symbols);
+        let __sym5 = __pop_Variant30(__symbols);
+        let __sym4 = __pop_Variant18(__symbols);
+        let __sym3 = __pop_Variant7(__symbols);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym6.2;
+        let __nt = super::__action264::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6);
+        __symbols.push((__start, __Symbol::Variant23(__nt), __end));
+        (7, 57)
+    }
+    pub(crate) fn __reduce172<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // NonLetAction = LParen, "union", Expr, Expr, RParen => ActionFn(49);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant1(__symbols);
+        let __sym2 = __pop_Variant1(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action49::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant23(__nt), __end));
+        (5, 57)
+    }
+    pub(crate) fn __reduce173<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // NonLetAction = LParen, "panic", String, RParen => ActionFn(50);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant3(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action50::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant23(__nt), __end));
+        (4, 57)
+    }
+    pub(crate) fn __reduce174<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // NonLetAction = LParen, "extract", Expr, RParen => ActionFn(51);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant1(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action51::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant23(__nt), __end));
+        (4, 57)
+    }
+    pub(crate) fn __reduce175<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // NonLetAction = LParen, "extract", Expr, Expr, RParen => ActionFn(52);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant1(__symbols);
+        let __sym2 = __pop_Variant1(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action52::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant23(__nt), __end));
+        (5, 57)
+    }
+    pub(crate) fn __reduce176<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // NonLetAction = CallExpr => ActionFn(53);
+        let __sym0 = __pop_Variant1(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action53::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant23(__nt), __end));
+        (1, 57)
+    }
+    pub(crate) fn __reduce177<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Num = r#"(-)?[0-9]+"# => ActionFn(71);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action71::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant33(__nt), __end));
+        (1, 58)
+    }
+    pub(crate) fn __reduce178<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Program =  => ActionFn(239);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action239::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant34(__nt), __end));
+        (0, 59)
+    }
+    pub(crate) fn __reduce179<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Program = (Command)+ => ActionFn(240);
+        let __sym0 = __pop_Variant17(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action240::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant34(__nt), __end));
+        (1, 59)
+    }
+    pub(crate) fn __reduce180<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // RParen = ")" => ActionFn(7);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action7::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant30(__nt), __end));
+        (1, 60)
+    }
+    pub(crate) fn __reduce181<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // RParen = "]" => ActionFn(8);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action8::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant30(__nt), __end));
+        (1, 60)
+    }
+    pub(crate) fn __reduce182<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Schedule = LParen, "saturate", RParen => ActionFn(271);
+        assert!(__symbols.len() >= 3);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym2.2;
+        let __nt = super::__action271::<>(input, __sym0, __sym1, __sym2);
+        __symbols.push((__start, __Symbol::Variant35(__nt), __end));
+        (3, 61)
+    }
+    pub(crate) fn __reduce183<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Schedule = LParen, "saturate", Schedule+, RParen => ActionFn(272);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant36(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action272::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant35(__nt), __end));
+        (4, 61)
+    }
+    pub(crate) fn __reduce184<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Schedule = LParen, "seq", RParen => ActionFn(273);
+        assert!(__symbols.len() >= 3);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym2.2;
+        let __nt = super::__action273::<>(input, __sym0, __sym1, __sym2);
+        __symbols.push((__start, __Symbol::Variant35(__nt), __end));
+        (3, 61)
+    }
+    pub(crate) fn __reduce185<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Schedule = LParen, "seq", Schedule+, RParen => ActionFn(274);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant36(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action274::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant35(__nt), __end));
+        (4, 61)
+    }
+    pub(crate) fn __reduce186<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Schedule = LParen, "repeat", UNum, RParen => ActionFn(275);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant12(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action275::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant35(__nt), __end));
+        (4, 61)
+    }
+    pub(crate) fn __reduce187<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Schedule = LParen, "repeat", UNum, Schedule+, RParen => ActionFn(276);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant36(__symbols);
+        let __sym2 = __pop_Variant12(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action276::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant35(__nt), __end));
+        (5, 61)
+    }
+    pub(crate) fn __reduce188<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Schedule = LParen, "run", ":until", RParen => ActionFn(219);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant0(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action219::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant35(__nt), __end));
+        (4, 61)
+    }
+    pub(crate) fn __reduce189<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Schedule = LParen, "run", ":until", (Fact)+, RParen => ActionFn(220);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant10(__symbols);
+        let __sym2 = __pop_Variant0(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action220::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant35(__nt), __end));
+        (5, 61)
+    }
+    pub(crate) fn __reduce190<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Schedule = LParen, "run", RParen => ActionFn(221);
+        assert!(__symbols.len() >= 3);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym2.2;
+        let __nt = super::__action221::<>(input, __sym0, __sym1, __sym2);
+        __symbols.push((__start, __Symbol::Variant35(__nt), __end));
+        (3, 61)
+    }
+    pub(crate) fn __reduce191<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Schedule = LParen, "run", Ident, ":until", RParen => ActionFn(222);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant0(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action222::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant35(__nt), __end));
+        (5, 61)
+    }
+    pub(crate) fn __reduce192<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Schedule = LParen, "run", Ident, ":until", (Fact)+, RParen => ActionFn(223);
+        assert!(__symbols.len() >= 6);
+        let __sym5 = __pop_Variant30(__symbols);
+        let __sym4 = __pop_Variant10(__symbols);
+        let __sym3 = __pop_Variant0(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym5.2;
+        let __nt = super::__action223::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5);
+        __symbols.push((__start, __Symbol::Variant35(__nt), __end));
+        (6, 61)
+    }
+    pub(crate) fn __reduce193<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Schedule = LParen, "run", Ident, RParen => ActionFn(224);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action224::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant35(__nt), __end));
+        (4, 61)
+    }
+    pub(crate) fn __reduce194<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Schedule = Ident => ActionFn(44);
+        let __sym0 = __pop_Variant7(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action44::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant35(__nt), __end));
+        (1, 61)
+    }
+    pub(crate) fn __reduce195<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Schedule* =  => ActionFn(87);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action87::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant36(__nt), __end));
+        (0, 62)
+    }
+    pub(crate) fn __reduce196<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Schedule* = Schedule+ => ActionFn(88);
+        let __sym0 = __pop_Variant36(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action88::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant36(__nt), __end));
+        (1, 62)
+    }
+    pub(crate) fn __reduce197<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Schedule+ = Schedule => ActionFn(151);
+        let __sym0 = __pop_Variant35(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action151::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant36(__nt), __end));
+        (1, 63)
+    }
+    pub(crate) fn __reduce198<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Schedule+ = Schedule+, Schedule => ActionFn(152);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant35(__symbols);
+        let __sym0 = __pop_Variant36(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action152::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant36(__nt), __end));
+        (2, 63)
+    }
+    pub(crate) fn __reduce199<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Schema = List<Type>, Type => ActionFn(59);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant7(__symbols);
+        let __sym0 = __pop_Variant31(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action59::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant37(__nt), __end));
+        (2, 64)
+    }
+    pub(crate) fn __reduce200<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // String = r#"(\"[^\"]*\")+"# => ActionFn(79);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action79::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant3(__nt), __end));
+        (1, 65)
+    }
+    pub(crate) fn __reduce201<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // SymString = String => ActionFn(78);
+        let __sym0 = __pop_Variant3(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action78::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant7(__nt), __end));
+        (1, 66)
+    }
+    pub(crate) fn __reduce202<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Type = Ident => ActionFn(69);
+        let __sym0 = __pop_Variant7(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action69::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant7(__nt), __end));
+        (1, 67)
+    }
+    pub(crate) fn __reduce203<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Type* =  => ActionFn(143);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action143::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant20(__nt), __end));
+        (0, 68)
+    }
+    pub(crate) fn __reduce204<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Type* = Type+ => ActionFn(144);
+        let __sym0 = __pop_Variant20(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action144::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant20(__nt), __end));
+        (1, 68)
+    }
+    pub(crate) fn __reduce205<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Type+ = Type => ActionFn(157);
+        let __sym0 = __pop_Variant7(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action157::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant20(__nt), __end));
+        (1, 69)
+    }
+    pub(crate) fn __reduce206<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Type+ = Type+, Type => ActionFn(158);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant7(__symbols);
+        let __sym0 = __pop_Variant20(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action158::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant20(__nt), __end));
+        (2, 69)
+    }
+    pub(crate) fn __reduce207<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // UNum = Num => ActionFn(72);
+        let __sym0 = __pop_Variant33(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action72::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant12(__nt), __end));
+        (1, 70)
+    }
+    pub(crate) fn __reduce208<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // UNum? = UNum => ActionFn(85);
+        let __sym0 = __pop_Variant12(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action85::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant13(__nt), __end));
+        (1, 71)
+    }
+    pub(crate) fn __reduce209<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // UNum? =  => ActionFn(86);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action86::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant13(__nt), __end));
+        (0, 71)
+    }
+    pub(crate) fn __reduce210<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Variant = LParen, Ident, Cost, RParen => ActionFn(253);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant25(__symbols);
+        let __sym1 = __pop_Variant7(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action253::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant21(__nt), __end));
+        (4, 72)
+    }
+    pub(crate) fn __reduce211<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Variant = LParen, Ident, (Type)+, Cost, RParen => ActionFn(254);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant25(__symbols);
+        let __sym2 = __pop_Variant20(__symbols);
+        let __sym1 = __pop_Variant7(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action254::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant21(__nt), __end));
+        (5, 72)
+    }
+    pub(crate) fn __reduce213<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // __Expr = Expr => ActionFn(3);
+        let __sym0 = __pop_Variant1(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action3::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant1(__nt), __end));
+        (1, 74)
+    }
+    pub(crate) fn __reduce214<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // __Fact = Fact => ActionFn(2);
+        let __sym0 = __pop_Variant19(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action2::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant19(__nt), __end));
+        (1, 75)
+    }
+    pub(crate) fn __reduce215<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // __Program = Program => ActionFn(0);
+        let __sym0 = __pop_Variant34(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action0::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant34(__nt), __end));
+        (1, 76)
+    }
+}
+pub use self::__parse__Action::ActionParser;
+
+#[rustfmt::skip]
+#[allow(non_snake_case, non_camel_case_types, unused_mut, unused_variables, unused_imports, unused_parens, clippy::all)]
+mod __parse__Expr {
+
+    use crate::ast::*;
+    use crate::Symbol;
+    use crate::Schedule;
+    use ordered_float::OrderedFloat;
+    #[allow(unused_extern_crates)]
+    extern crate lalrpop_util as __lalrpop_util;
+    #[allow(unused_imports)]
+    use self::__lalrpop_util::state_machine as __state_machine;
+    extern crate core;
+    extern crate alloc;
+    use self::__lalrpop_util::lexer::Token;
+    #[allow(dead_code)]
+    pub(crate) enum __Symbol<'input>
+     {
+        Variant0(&'input str),
+        Variant1(Expr),
+        Variant2(core::option::Option<Expr>),
+        Variant3(String),
+        Variant4(core::option::Option<String>),
+        Variant5(Vec<Action>),
+        Variant6(core::option::Option<Vec<Action>>),
+        Variant7(Symbol),
+        Variant8(core::option::Option<Symbol>),
+        Variant9(core::option::Option<&'input str>),
+        Variant10(alloc::vec::Vec<Fact>),
+        Variant11(core::option::Option<alloc::vec::Vec<Fact>>),
+        Variant12(usize),
+        Variant13(core::option::Option<usize>),
+        Variant14(Vec<Fact>),
+        Variant15(core::option::Option<Vec<Fact>>),
+        Variant16(Command),
+        Variant17(alloc::vec::Vec<Command>),
+        Variant18(alloc::vec::Vec<Expr>),
+        Variant19(Fact),
+        Variant20(alloc::vec::Vec<Symbol>),
+        Variant21(Variant),
+        Variant22(alloc::vec::Vec<Variant>),
+        Variant23(Action),
+        Variant24(alloc::vec::Vec<Action>),
+        Variant25(Option<usize>),
+        Variant26(Vec<Expr>),
+        Variant27(OrderedFloat<f64>),
+        Variant28(IdentSort),
+        Variant29(alloc::vec::Vec<IdentSort>),
+        Variant30(()),
+        Variant31(Vec<Symbol>),
+        Variant32(Literal),
+        Variant33(i64),
+        Variant34(Vec<Command>),
+        Variant35(Schedule),
+        Variant36(alloc::vec::Vec<Schedule>),
+        Variant37(Schema),
+    }
+    const __ACTION: &[i16] = &[
+        // State 0
+        13, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 19, 20, 21,
+        // State 1
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0,
+        // State 2
+        13, 24, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 16, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 19, 20, 21,
+        // State 3
+        13, 24, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 16, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 19, 20, 21,
+        // State 4
+        -134, -134, -134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -134, -134, -134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -134, -134, -134, -134,
+        // State 5
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 6
+        -166, -166, -166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -166, -166, -166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -166, -166, -166, -166,
+        // State 7
+        -133, -133, -133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -133, -133, -133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -133, -133, -133, -133,
+        // State 8
+        -132, -132, -132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -132, -132, -132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -132, -132, -132, -132,
+        // State 9
+        -165, -165, -165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -165, -165, -165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -165, -165, -165, -165,
+        // State 10
+        -202, -202, -202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -202, -202, -202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -202, -202, -202, -202,
+        // State 11
+        -167, -167, -167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -167, -167, -167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -167, -167, -167, -167,
+        // State 12
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -157, 0, 0,
+        // State 13
+        -144, -144, -144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -144, -144, -144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -144, -144, -144, -144,
+        // State 14
+        -141, -141, -141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -141, -141, -141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -141, -141, -141, -141,
+        // State 15
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -158, 0, 0,
+        // State 16
+        -143, -143, -143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -143, -143, -143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -143, -143, -143, -143,
+        // State 17
+        -201, -201, -201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -201, -201, -201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -201, -201, -201, -201,
+        // State 18
+        -151, -151, -151, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -151, -151, -151, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -151, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -151, -151, -151, -151,
+        // State 19
+        -178, -178, -178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -178, -178, -178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -178, -178, -178, -178,
+        // State 20
+        -142, -142, -142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -142, -142, -142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -142, -142, -142, -142,
+        // State 21
+        -38, -38, -38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -38, -38, -38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -38, -38, -38, -38,
+        // State 22
+        -61, -61, -61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -61, -61, -61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -61, -61, -61, -61,
+        // State 23
+        -181, -181, -181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -181, -181, -181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -181, -181, -181, -181,
+        // State 24
+        -182, -182, -182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -182, -182, -182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -182, -182, -182, -182,
+        // State 25
+        -39, -39, -39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -39, -39, -39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -39, -39, -39, -39,
+        // State 26
+        -62, -62, -62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -62, -62, -62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -62, -62, -62, -62,
+    ];
+    fn __action(state: i16, integer: usize) -> i16 {
+        __ACTION[(state as usize) * 57 + integer]
+    }
+    const __EOF_ACTION: &[i16] = &[
+        // State 0
+        0,
+        // State 1
+        0,
+        // State 2
+        0,
+        // State 3
+        0,
+        // State 4
+        -134,
+        // State 5
+        -214,
+        // State 6
+        -166,
+        // State 7
+        -133,
+        // State 8
+        -132,
+        // State 9
+        -165,
+        // State 10
+        -202,
+        // State 11
+        -167,
+        // State 12
+        0,
+        // State 13
+        -144,
+        // State 14
+        -141,
+        // State 15
+        0,
+        // State 16
+        -143,
+        // State 17
+        -201,
+        // State 18
+        -151,
+        // State 19
+        -178,
+        // State 20
+        -142,
+        // State 21
+        0,
+        // State 22
+        -61,
+        // State 23
+        -181,
+        // State 24
+        -182,
+        // State 25
+        0,
+        // State 26
+        -62,
+    ];
+    fn __goto(state: i16, nt: usize) -> i16 {
+        match nt {
+            23 => 3,
+            36 => 4,
+            39 => match state {
+                2 => 21,
+                3 => 25,
+                _ => 5,
+            },
+            43 => 6,
+            47 => match state {
+                1 => 2,
+                _ => 7,
+            },
+            51 => 1,
+            55 => 8,
+            58 => 9,
+            60 => match state {
+                3 => 26,
+                _ => 22,
+            },
+            65 => 10,
+            66 => 11,
+            _ => 0,
+        }
+    }
+    const __TERMINAL: &[&str] = &[
+        r###""(""###,
+        r###"")""###,
+        r###""-inf""###,
+        r###"":cost""###,
+        r###"":default""###,
+        r###"":merge""###,
+        r###"":name""###,
+        r###"":on_merge""###,
+        r###"":ruleset""###,
+        r###"":unextractable""###,
+        r###"":until""###,
+        r###"":variants""###,
+        r###"":when""###,
+        r###""=""###,
+        r###""NaN""###,
+        r###""[""###,
+        r###""]""###,
+        r###""add-ruleset""###,
+        r###""birewrite""###,
+        r###""calc""###,
+        r###""check""###,
+        r###""check-proof""###,
+        r###""datatype""###,
+        r###""declare""###,
+        r###""delete""###,
+        r###""extract""###,
+        r###""fail""###,
+        r###""function""###,
+        r###""include""###,
+        r###""inf""###,
+        r###""input""###,
+        r###""let""###,
+        r###""output""###,
+        r###""panic""###,
+        r###""pop""###,
+        r###""print-size""###,
+        r###""print-table""###,
+        r###""push""###,
+        r###""query-extract""###,
+        r###""relation""###,
+        r###""repeat""###,
+        r###""rewrite""###,
+        r###""rule""###,
+        r###""ruleset""###,
+        r###""run""###,
+        r###""run-schedule""###,
+        r###""saturate""###,
+        r###""seq""###,
+        r###""set""###,
+        r###""set-option""###,
+        r###""simplify""###,
+        r###""sort""###,
+        r###""union""###,
+        r###"r#"(\"[^\"]*\")+"#"###,
+        r###"r#"(([[:alpha:]][\\w-]*)|([-+*/?!=<>&|^/%_]))+"#"###,
+        r###"r#"(-)?[0-9]+"#"###,
+        r###"r#"(-)?[0-9]+\\.[0-9]+(e(\\+)?(-)?[0-9]+)?"#"###,
+    ];
+    fn __expected_tokens(__state: i16) -> alloc::vec::Vec<alloc::string::String> {
+        __TERMINAL.iter().enumerate().filter_map(|(index, terminal)| {
+            let next_state = __action(__state, index);
+            if next_state == 0 {
+                None
+            } else {
+                Some(alloc::string::ToString::to_string(terminal))
+            }
+        }).collect()
+    }
+    fn __expected_tokens_from_states<
+        'input,
+    >(
+        __states: &[i16],
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> alloc::vec::Vec<alloc::string::String>
+    {
+        __TERMINAL.iter().enumerate().filter_map(|(index, terminal)| {
+            if __accepts(None, __states, Some(index), core::marker::PhantomData::<(&())>) {
+                Some(alloc::string::ToString::to_string(terminal))
+            } else {
+                None
+            }
+        }).collect()
+    }
+    pub(crate) struct __StateMachine<'input>
+    where 
+    {
+        input: &'input str,
+        __phantom: core::marker::PhantomData<(&'input ())>,
+    }
+    impl<'input> __state_machine::ParserDefinition for __StateMachine<'input>
+    where 
+    {
+        type Location = usize;
+        type Error = String;
+        type Token = Token<'input>;
+        type TokenIndex = usize;
+        type Symbol = __Symbol<'input>;
+        type Success = Expr;
+        type StateIndex = i16;
+        type Action = i16;
+        type ReduceIndex = i16;
+        type NonterminalIndex = usize;
+
+        #[inline]
+        fn start_location(&self) -> Self::Location {
+              Default::default()
+        }
+
+        #[inline]
+        fn start_state(&self) -> Self::StateIndex {
+              0
+        }
+
+        #[inline]
+        fn token_to_index(&self, token: &Self::Token) -> Option<usize> {
+            __token_to_integer(token, core::marker::PhantomData::<(&())>)
+        }
+
+        #[inline]
+        fn action(&self, state: i16, integer: usize) -> i16 {
+            __action(state, integer)
+        }
+
+        #[inline]
+        fn error_action(&self, state: i16) -> i16 {
+            __action(state, 57 - 1)
+        }
+
+        #[inline]
+        fn eof_action(&self, state: i16) -> i16 {
+            __EOF_ACTION[state as usize]
+        }
+
+        #[inline]
+        fn goto(&self, state: i16, nt: usize) -> i16 {
+            __goto(state, nt)
+        }
+
+        fn token_to_symbol(&self, token_index: usize, token: Self::Token) -> Self::Symbol {
+            __token_to_symbol(token_index, token, core::marker::PhantomData::<(&())>)
+        }
+
+        fn expected_tokens(&self, state: i16) -> alloc::vec::Vec<alloc::string::String> {
+            __expected_tokens(state)
+        }
+
+        fn expected_tokens_from_states(&self, states: &[i16]) -> alloc::vec::Vec<alloc::string::String> {
+            __expected_tokens_from_states(states, core::marker::PhantomData::<(&())>)
+        }
+
+        #[inline]
+        fn uses_error_recovery(&self) -> bool {
+            false
+        }
+
+        #[inline]
+        fn error_recovery_symbol(
+            &self,
+            recovery: __state_machine::ErrorRecovery<Self>,
+        ) -> Self::Symbol {
+            panic!("error recovery not enabled for this grammar")
+        }
+
+        fn reduce(
+            &mut self,
+            action: i16,
+            start_location: Option<&Self::Location>,
+            states: &mut alloc::vec::Vec<i16>,
+            symbols: &mut alloc::vec::Vec<__state_machine::SymbolTriple<Self>>,
+        ) -> Option<__state_machine::ParseResult<Self>> {
+            __reduce(
+                self.input,
+                action,
+                start_location,
+                states,
+                symbols,
+                core::marker::PhantomData::<(&())>,
+            )
+        }
+
+        fn simulate_reduce(&self, action: i16) -> __state_machine::SimulatedReduce<Self> {
+            __simulate_reduce(action, core::marker::PhantomData::<(&())>)
+        }
+    }
+    fn __token_to_integer<
+        'input,
+    >(
+        __token: &Token<'input>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> Option<usize>
+    {
+        match *__token {
+            Token(4, _) if true => Some(0),
+            Token(5, _) if true => Some(1),
+            Token(6, _) if true => Some(2),
+            Token(7, _) if true => Some(3),
+            Token(8, _) if true => Some(4),
+            Token(9, _) if true => Some(5),
+            Token(10, _) if true => Some(6),
+            Token(11, _) if true => Some(7),
+            Token(12, _) if true => Some(8),
+            Token(13, _) if true => Some(9),
+            Token(14, _) if true => Some(10),
+            Token(15, _) if true => Some(11),
+            Token(16, _) if true => Some(12),
+            Token(17, _) if true => Some(13),
+            Token(18, _) if true => Some(14),
+            Token(19, _) if true => Some(15),
+            Token(20, _) if true => Some(16),
+            Token(21, _) if true => Some(17),
+            Token(22, _) if true => Some(18),
+            Token(23, _) if true => Some(19),
+            Token(24, _) if true => Some(20),
+            Token(25, _) if true => Some(21),
+            Token(26, _) if true => Some(22),
+            Token(27, _) if true => Some(23),
+            Token(28, _) if true => Some(24),
+            Token(29, _) if true => Some(25),
+            Token(30, _) if true => Some(26),
+            Token(31, _) if true => Some(27),
+            Token(32, _) if true => Some(28),
+            Token(33, _) if true => Some(29),
+            Token(34, _) if true => Some(30),
+            Token(35, _) if true => Some(31),
+            Token(36, _) if true => Some(32),
+            Token(37, _) if true => Some(33),
+            Token(38, _) if true => Some(34),
+            Token(39, _) if true => Some(35),
+            Token(40, _) if true => Some(36),
+            Token(41, _) if true => Some(37),
+            Token(42, _) if true => Some(38),
+            Token(43, _) if true => Some(39),
+            Token(44, _) if true => Some(40),
+            Token(45, _) if true => Some(41),
+            Token(46, _) if true => Some(42),
+            Token(47, _) if true => Some(43),
+            Token(48, _) if true => Some(44),
+            Token(49, _) if true => Some(45),
+            Token(50, _) if true => Some(46),
+            Token(51, _) if true => Some(47),
+            Token(52, _) if true => Some(48),
+            Token(53, _) if true => Some(49),
+            Token(54, _) if true => Some(50),
+            Token(55, _) if true => Some(51),
+            Token(56, _) if true => Some(52),
+            Token(0, _) if true => Some(53),
+            Token(1, _) if true => Some(54),
+            Token(2, _) if true => Some(55),
+            Token(3, _) if true => Some(56),
+            _ => None,
+        }
+    }
+    fn __token_to_symbol<
+        'input,
+    >(
+        __token_index: usize,
+        __token: Token<'input>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> __Symbol<'input>
+    {
+        match __token_index {
+            0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 => match __token {
+                Token(4, __tok0) | Token(5, __tok0) | Token(6, __tok0) | Token(7, __tok0) | Token(8, __tok0) | Token(9, __tok0) | Token(10, __tok0) | Token(11, __tok0) | Token(12, __tok0) | Token(13, __tok0) | Token(14, __tok0) | Token(15, __tok0) | Token(16, __tok0) | Token(17, __tok0) | Token(18, __tok0) | Token(19, __tok0) | Token(20, __tok0) | Token(21, __tok0) | Token(22, __tok0) | Token(23, __tok0) | Token(24, __tok0) | Token(25, __tok0) | Token(26, __tok0) | Token(27, __tok0) | Token(28, __tok0) | Token(29, __tok0) | Token(30, __tok0) | Token(31, __tok0) | Token(32, __tok0) | Token(33, __tok0) | Token(34, __tok0) | Token(35, __tok0) | Token(36, __tok0) | Token(37, __tok0) | Token(38, __tok0) | Token(39, __tok0) | Token(40, __tok0) | Token(41, __tok0) | Token(42, __tok0) | Token(43, __tok0) | Token(44, __tok0) | Token(45, __tok0) | Token(46, __tok0) | Token(47, __tok0) | Token(48, __tok0) | Token(49, __tok0) | Token(50, __tok0) | Token(51, __tok0) | Token(52, __tok0) | Token(53, __tok0) | Token(54, __tok0) | Token(55, __tok0) | Token(56, __tok0) | Token(0, __tok0) | Token(1, __tok0) | Token(2, __tok0) | Token(3, __tok0) if true => __Symbol::Variant0(__tok0),
+                _ => unreachable!(),
+            },
+            _ => unreachable!(),
+        }
+    }
+    fn __simulate_reduce<
+        'input,
+    >(
+        __reduce_index: i16,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> __state_machine::SimulatedReduce<__StateMachine<'input>>
+    {
+        match __reduce_index {
+            0 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 0,
+                }
+            }
+            1 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 1,
+                }
+            }
+            2 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 1,
+                }
+            }
+            3 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 2,
+                }
+            }
+            4 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 3,
+                }
+            }
+            5 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 3,
+                }
+            }
+            6 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 4,
+                }
+            }
+            7 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 5,
+                }
+            }
+            8 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 5,
+                }
+            }
+            9 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 6,
+                }
+            }
+            10 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 7,
+                }
+            }
+            11 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 7,
+                }
+            }
+            12 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 8,
+                }
+            }
+            13 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 9,
+                }
+            }
+            14 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 9,
+                }
+            }
+            15 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 10,
+                }
+            }
+            16 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 11,
+                }
+            }
+            17 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 11,
+                }
+            }
+            18 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 12,
+                }
+            }
+            19 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 12,
+                }
+            }
+            20 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 13,
+                }
+            }
+            21 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 13,
+                }
+            }
+            22 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 13,
+                }
+            }
+            23 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 14,
+                }
+            }
+            24 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 15,
+                }
+            }
+            25 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 15,
+                }
+            }
+            26 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 16,
+                }
+            }
+            27 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 17,
+                }
+            }
+            28 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 17,
+                }
+            }
+            29 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 18,
+                }
+            }
+            30 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 19,
+                }
+            }
+            31 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 19,
+                }
+            }
+            32 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 20,
+                }
+            }
+            33 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 20,
+                }
+            }
+            34 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 21,
+                }
+            }
+            35 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 22,
+                }
+            }
+            36 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 22,
+                }
+            }
+            37 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 23,
+                }
+            }
+            38 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 23,
+                }
+            }
+            39 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 24,
+                }
+            }
+            40 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 25,
+                }
+            }
+            41 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 25,
+                }
+            }
+            42 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 26,
+                }
+            }
+            43 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 26,
+                }
+            }
+            44 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 27,
+                }
+            }
+            45 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 28,
+                }
+            }
+            46 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 28,
+                }
+            }
+            47 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 29,
+                }
+            }
+            48 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 29,
+                }
+            }
+            49 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 30,
+                }
+            }
+            50 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 31,
+                }
+            }
+            51 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 31,
+                }
+            }
+            52 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 32,
+                }
+            }
+            53 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 32,
+                }
+            }
+            54 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 33,
+                }
+            }
+            55 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 33,
+                }
+            }
+            56 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 34,
+                }
+            }
+            57 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 34,
+                }
+            }
+            58 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 35,
+                }
+            }
+            59 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 35,
+                }
+            }
+            60 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 3,
+                    nonterminal_produced: 36,
+                }
+            }
+            61 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 36,
+                }
+            }
+            62 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 37,
+                }
+            }
+            63 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 37,
+                }
+            }
+            64 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 37,
+                }
+            }
+            65 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 7,
+                    nonterminal_produced: 37,
+                }
+            }
+            66 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 8,
+                    nonterminal_produced: 37,
+                }
+            }
+            67 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 37,
+                }
+            }
+            68 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 13,
+                    nonterminal_produced: 37,
+                }
+            }
+            69 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 12,
+                    nonterminal_produced: 37,
+                }
+            }
+            70 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 11,
+                    nonterminal_produced: 37,
+                }
+            }
+            71 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 10,
+                    nonterminal_produced: 37,
+                }
+            }
+            72 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 11,
+                    nonterminal_produced: 37,
+                }
+            }
+            73 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 10,
+                    nonterminal_produced: 37,
+                }
+            }
+            74 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 9,
+                    nonterminal_produced: 37,
+                }
+            }
+            75 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 8,
+                    nonterminal_produced: 37,
+                }
+            }
+            76 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 11,
+                    nonterminal_produced: 37,
+                }
+            }
+            77 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 10,
+                    nonterminal_produced: 37,
+                }
+            }
+            78 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 9,
+                    nonterminal_produced: 37,
+                }
+            }
+            79 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 8,
+                    nonterminal_produced: 37,
+                }
+            }
+            80 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 9,
+                    nonterminal_produced: 37,
+                }
+            }
+            81 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 8,
+                    nonterminal_produced: 37,
+                }
+            }
+            82 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 7,
+                    nonterminal_produced: 37,
+                }
+            }
+            83 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 6,
+                    nonterminal_produced: 37,
+                }
+            }
+            84 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 37,
+                }
+            }
+            85 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 37,
+                }
+            }
+            86 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 37,
+                }
+            }
+            87 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 9,
+                    nonterminal_produced: 37,
+                }
+            }
+            88 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 7,
+                    nonterminal_produced: 37,
+                }
+            }
+            89 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 7,
+                    nonterminal_produced: 37,
+                }
+            }
+            90 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 37,
+                }
+            }
+            91 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 9,
+                    nonterminal_produced: 37,
+                }
+            }
+            92 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 7,
+                    nonterminal_produced: 37,
+                }
+            }
+            93 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 7,
+                    nonterminal_produced: 37,
+                }
+            }
+            94 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 37,
+                }
+            }
+            95 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 9,
+                    nonterminal_produced: 37,
+                }
+            }
+            96 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 7,
+                    nonterminal_produced: 37,
+                }
+            }
+            97 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 7,
+                    nonterminal_produced: 37,
+                }
+            }
+            98 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 37,
+                }
+            }
+            99 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 37,
+                }
+            }
+            100 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 37,
+                }
+            }
+            101 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 37,
+                }
+            }
+            102 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 6,
+                    nonterminal_produced: 37,
+                }
+            }
+            103 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 37,
+                }
+            }
+            104 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 6,
+                    nonterminal_produced: 37,
+                }
+            }
+            105 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 7,
+                    nonterminal_produced: 37,
+                }
+            }
+            106 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 37,
+                }
+            }
+            107 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 37,
+                }
+            }
+            108 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 37,
+                }
+            }
+            109 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 6,
+                    nonterminal_produced: 37,
+                }
+            }
+            110 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 7,
+                    nonterminal_produced: 37,
+                }
+            }
+            111 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 6,
+                    nonterminal_produced: 37,
+                }
+            }
+            112 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 37,
+                }
+            }
+            113 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 3,
+                    nonterminal_produced: 37,
+                }
+            }
+            114 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 37,
+                }
+            }
+            115 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 3,
+                    nonterminal_produced: 37,
+                }
+            }
+            116 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 3,
+                    nonterminal_produced: 37,
+                }
+            }
+            117 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 37,
+                }
+            }
+            118 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 37,
+                }
+            }
+            119 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 3,
+                    nonterminal_produced: 37,
+                }
+            }
+            120 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 37,
+                }
+            }
+            121 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 3,
+                    nonterminal_produced: 37,
+                }
+            }
+            122 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 37,
+                }
+            }
+            123 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 37,
+                }
+            }
+            124 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 37,
+                }
+            }
+            125 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 37,
+                }
+            }
+            126 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 37,
+                }
+            }
+            127 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 37,
+                }
+            }
+            128 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 37,
+                }
+            }
+            129 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 38,
+                }
+            }
+            130 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 38,
+                }
+            }
+            131 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 39,
+                }
+            }
+            132 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 39,
+                }
+            }
+            133 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 39,
+                }
+            }
+            134 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 40,
+                }
+            }
+            135 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 40,
+                }
+            }
+            136 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 41,
+                }
+            }
+            137 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 41,
+                }
+            }
+            138 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 42,
+                }
+            }
+            139 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 3,
+                    nonterminal_produced: 42,
+                }
+            }
+            140 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 43,
+                }
+            }
+            141 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 43,
+                }
+            }
+            142 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 43,
+                }
+            }
+            143 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 43,
+                }
+            }
+            144 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 44,
+                }
+            }
+            145 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 44,
+                }
+            }
+            146 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 45,
+                }
+            }
+            147 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 45,
+                }
+            }
+            148 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 46,
+                }
+            }
+            149 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 46,
+                }
+            }
+            150 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 47,
+                }
+            }
+            151 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 48,
+                }
+            }
+            152 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 49,
+                }
+            }
+            153 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 49,
+                }
+            }
+            154 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 50,
+                }
+            }
+            155 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 50,
+                }
+            }
+            156 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 51,
+                }
+            }
+            157 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 51,
+                }
+            }
+            158 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 52,
+                }
+            }
+            159 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 3,
+                    nonterminal_produced: 52,
+                }
+            }
+            160 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 53,
+                }
+            }
+            161 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 3,
+                    nonterminal_produced: 53,
+                }
+            }
+            162 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 54,
+                }
+            }
+            163 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 3,
+                    nonterminal_produced: 54,
+                }
+            }
+            164 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 55,
+                }
+            }
+            165 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 55,
+                }
+            }
+            166 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 55,
+                }
+            }
+            167 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 3,
+                    nonterminal_produced: 56,
+                }
+            }
+            168 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 7,
+                    nonterminal_produced: 57,
+                }
+            }
+            169 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 8,
+                    nonterminal_produced: 57,
+                }
+            }
+            170 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 6,
+                    nonterminal_produced: 57,
+                }
+            }
+            171 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 7,
+                    nonterminal_produced: 57,
+                }
+            }
+            172 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 57,
+                }
+            }
+            173 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 57,
+                }
+            }
+            174 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 57,
+                }
+            }
+            175 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 57,
+                }
+            }
+            176 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 57,
+                }
+            }
+            177 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 58,
+                }
+            }
+            178 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 59,
+                }
+            }
+            179 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 59,
+                }
+            }
+            180 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 60,
+                }
+            }
+            181 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 60,
+                }
+            }
+            182 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 3,
+                    nonterminal_produced: 61,
+                }
+            }
+            183 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 61,
+                }
+            }
+            184 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 3,
+                    nonterminal_produced: 61,
+                }
+            }
+            185 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 61,
+                }
+            }
+            186 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 61,
+                }
+            }
+            187 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 61,
+                }
+            }
+            188 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 61,
+                }
+            }
+            189 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 61,
+                }
+            }
+            190 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 3,
+                    nonterminal_produced: 61,
+                }
+            }
+            191 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 61,
+                }
+            }
+            192 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 6,
+                    nonterminal_produced: 61,
+                }
+            }
+            193 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 61,
+                }
+            }
+            194 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 61,
+                }
+            }
+            195 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 62,
+                }
+            }
+            196 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 62,
+                }
+            }
+            197 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 63,
+                }
+            }
+            198 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 63,
+                }
+            }
+            199 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 64,
+                }
+            }
+            200 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 65,
+                }
+            }
+            201 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 66,
+                }
+            }
+            202 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 67,
+                }
+            }
+            203 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 68,
+                }
+            }
+            204 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 68,
+                }
+            }
+            205 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 69,
+                }
+            }
+            206 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 69,
+                }
+            }
+            207 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 70,
+                }
+            }
+            208 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 71,
+                }
+            }
+            209 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 71,
+                }
+            }
+            210 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 72,
+                }
+            }
+            211 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 72,
+                }
+            }
+            212 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 73,
+                }
+            }
+            213 => __state_machine::SimulatedReduce::Accept,
+            214 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 75,
+                }
+            }
+            215 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 76,
+                }
+            }
+            _ => panic!("invalid reduction index {}", __reduce_index)
+        }
+    }
+    pub struct ExprParser {
+        builder: __lalrpop_util::lexer::MatcherBuilder,
+        _priv: (),
+    }
+
+    impl ExprParser {
+        pub fn new() -> ExprParser {
+            let __builder = super::__intern_token::new_builder();
+            ExprParser {
+                builder: __builder,
+                _priv: (),
+            }
+        }
+
+        #[allow(dead_code)]
+        pub fn parse<
+            'input,
+        >(
+            &self,
+            input: &'input str,
+        ) -> Result<Expr, __lalrpop_util::ParseError<usize, Token<'input>, String>>
+        {
+            let mut __tokens = self.builder.matcher(input);
+            __state_machine::Parser::drive(
+                __StateMachine {
+                    input,
+                    __phantom: core::marker::PhantomData::<(&())>,
+                },
+                __tokens,
+            )
+        }
+    }
+    fn __accepts<
+        'input,
+    >(
+        __error_state: Option<i16>,
+        __states: &[i16],
+        __opt_integer: Option<usize>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> bool
+    {
+        let mut __states = __states.to_vec();
+        __states.extend(__error_state);
+        loop {
+            let mut __states_len = __states.len();
+            let __top = __states[__states_len - 1];
+            let __action = match __opt_integer {
+                None => __EOF_ACTION[__top as usize],
+                Some(__integer) => __action(__top, __integer),
+            };
+            if __action == 0 { return false; }
+            if __action > 0 { return true; }
+            let (__to_pop, __nt) = match __simulate_reduce(-(__action + 1), core::marker::PhantomData::<(&())>) {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop, nonterminal_produced
+                } => (states_to_pop, nonterminal_produced),
+                __state_machine::SimulatedReduce::Accept => return true,
+            };
+            __states_len -= __to_pop;
+            __states.truncate(__states_len);
+            let __top = __states[__states_len - 1];
+            let __next_state = __goto(__top, __nt);
+            __states.push(__next_state);
+        }
+    }
+    pub(crate) fn __reduce<
+        'input,
+    >(
+        input: &'input str,
+        __action: i16,
+        __lookahead_start: Option<&usize>,
+        __states: &mut alloc::vec::Vec<i16>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> Option<Result<Expr,__lalrpop_util::ParseError<usize, Token<'input>, String>>>
+    {
+        let (__pop_states, __nonterminal) = match __action {
+            0 => {
+                __reduce0(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            1 => {
+                __reduce1(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            2 => {
+                __reduce2(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            3 => {
+                __reduce3(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            4 => {
+                __reduce4(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            5 => {
+                __reduce5(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            6 => {
+                __reduce6(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            7 => {
+                __reduce7(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            8 => {
+                __reduce8(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            9 => {
+                __reduce9(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            10 => {
+                __reduce10(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            11 => {
+                __reduce11(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            12 => {
+                __reduce12(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            13 => {
+                __reduce13(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            14 => {
+                __reduce14(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            15 => {
+                __reduce15(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            16 => {
+                __reduce16(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            17 => {
+                __reduce17(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            18 => {
+                __reduce18(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            19 => {
+                __reduce19(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            20 => {
+                __reduce20(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            21 => {
+                __reduce21(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            22 => {
+                __reduce22(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            23 => {
+                __reduce23(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            24 => {
+                __reduce24(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            25 => {
+                __reduce25(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            26 => {
+                __reduce26(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            27 => {
+                __reduce27(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            28 => {
+                __reduce28(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            29 => {
+                __reduce29(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            30 => {
+                __reduce30(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            31 => {
+                __reduce31(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            32 => {
+                __reduce32(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            33 => {
+                __reduce33(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            34 => {
+                __reduce34(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            35 => {
+                __reduce35(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            36 => {
+                __reduce36(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            37 => {
+                __reduce37(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            38 => {
+                __reduce38(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            39 => {
+                __reduce39(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            40 => {
+                __reduce40(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            41 => {
+                __reduce41(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            42 => {
+                __reduce42(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            43 => {
+                __reduce43(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            44 => {
+                __reduce44(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            45 => {
+                __reduce45(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            46 => {
+                __reduce46(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            47 => {
+                __reduce47(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            48 => {
+                __reduce48(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            49 => {
+                __reduce49(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            50 => {
+                __reduce50(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            51 => {
+                __reduce51(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            52 => {
+                __reduce52(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            53 => {
+                __reduce53(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            54 => {
+                __reduce54(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            55 => {
+                __reduce55(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            56 => {
+                __reduce56(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            57 => {
+                __reduce57(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            58 => {
+                __reduce58(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            59 => {
+                __reduce59(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            60 => {
+                __reduce60(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            61 => {
+                __reduce61(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            62 => {
+                __reduce62(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            63 => {
+                __reduce63(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            64 => {
+                __reduce64(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            65 => {
+                __reduce65(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            66 => {
+                __reduce66(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            67 => {
+                __reduce67(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            68 => {
+                __reduce68(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            69 => {
+                __reduce69(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            70 => {
+                __reduce70(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            71 => {
+                __reduce71(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            72 => {
+                __reduce72(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            73 => {
+                __reduce73(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            74 => {
+                __reduce74(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            75 => {
+                __reduce75(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            76 => {
+                __reduce76(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            77 => {
+                __reduce77(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            78 => {
+                __reduce78(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            79 => {
+                __reduce79(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            80 => {
+                __reduce80(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            81 => {
+                __reduce81(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            82 => {
+                __reduce82(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            83 => {
+                __reduce83(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            84 => {
+                __reduce84(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            85 => {
+                __reduce85(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            86 => {
+                __reduce86(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            87 => {
+                __reduce87(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            88 => {
+                __reduce88(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            89 => {
+                __reduce89(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            90 => {
+                __reduce90(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            91 => {
+                __reduce91(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            92 => {
+                __reduce92(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            93 => {
+                __reduce93(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            94 => {
+                __reduce94(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            95 => {
+                __reduce95(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            96 => {
+                __reduce96(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            97 => {
+                __reduce97(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            98 => {
+                __reduce98(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            99 => {
+                __reduce99(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            100 => {
+                __reduce100(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            101 => {
+                __reduce101(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            102 => {
+                __reduce102(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            103 => {
+                __reduce103(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            104 => {
+                __reduce104(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            105 => {
+                __reduce105(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            106 => {
+                __reduce106(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            107 => {
+                __reduce107(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            108 => {
+                __reduce108(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            109 => {
+                __reduce109(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            110 => {
+                __reduce110(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            111 => {
+                __reduce111(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            112 => {
+                __reduce112(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            113 => {
+                __reduce113(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            114 => {
+                __reduce114(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            115 => {
+                __reduce115(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            116 => {
+                __reduce116(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            117 => {
+                __reduce117(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            118 => {
+                __reduce118(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            119 => {
+                __reduce119(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            120 => {
+                __reduce120(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            121 => {
+                __reduce121(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            122 => {
+                __reduce122(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            123 => {
+                __reduce123(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            124 => {
+                __reduce124(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            125 => {
+                __reduce125(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            126 => {
+                __reduce126(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            127 => {
+                __reduce127(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            128 => {
+                __reduce128(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            129 => {
+                __reduce129(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            130 => {
+                __reduce130(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            131 => {
+                __reduce131(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            132 => {
+                __reduce132(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            133 => {
+                __reduce133(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            134 => {
+                __reduce134(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            135 => {
+                __reduce135(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            136 => {
+                __reduce136(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            137 => {
+                __reduce137(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            138 => {
+                __reduce138(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            139 => {
+                __reduce139(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            140 => {
+                __reduce140(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            141 => {
+                __reduce141(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            142 => {
+                __reduce142(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            143 => {
+                __reduce143(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            144 => {
+                __reduce144(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            145 => {
+                __reduce145(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            146 => {
+                __reduce146(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            147 => {
+                __reduce147(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            148 => {
+                __reduce148(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            149 => {
+                __reduce149(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            150 => {
+                __reduce150(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            151 => {
+                __reduce151(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            152 => {
+                __reduce152(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            153 => {
+                __reduce153(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            154 => {
+                __reduce154(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            155 => {
+                __reduce155(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            156 => {
+                __reduce156(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            157 => {
+                __reduce157(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            158 => {
+                __reduce158(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            159 => {
+                __reduce159(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            160 => {
+                __reduce160(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            161 => {
+                __reduce161(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            162 => {
+                __reduce162(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            163 => {
+                __reduce163(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            164 => {
+                __reduce164(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            165 => {
+                __reduce165(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            166 => {
+                __reduce166(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            167 => {
+                __reduce167(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            168 => {
+                __reduce168(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            169 => {
+                __reduce169(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            170 => {
+                __reduce170(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            171 => {
+                __reduce171(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            172 => {
+                __reduce172(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            173 => {
+                __reduce173(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            174 => {
+                __reduce174(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            175 => {
+                __reduce175(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            176 => {
+                __reduce176(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            177 => {
+                __reduce177(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            178 => {
+                __reduce178(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            179 => {
+                __reduce179(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            180 => {
+                __reduce180(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            181 => {
+                __reduce181(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            182 => {
+                __reduce182(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            183 => {
+                __reduce183(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            184 => {
+                __reduce184(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            185 => {
+                __reduce185(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            186 => {
+                __reduce186(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            187 => {
+                __reduce187(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            188 => {
+                __reduce188(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            189 => {
+                __reduce189(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            190 => {
+                __reduce190(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            191 => {
+                __reduce191(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            192 => {
+                __reduce192(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            193 => {
+                __reduce193(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            194 => {
+                __reduce194(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            195 => {
+                __reduce195(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            196 => {
+                __reduce196(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            197 => {
+                __reduce197(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            198 => {
+                __reduce198(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            199 => {
+                __reduce199(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            200 => {
+                __reduce200(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            201 => {
+                __reduce201(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            202 => {
+                __reduce202(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            203 => {
+                __reduce203(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            204 => {
+                __reduce204(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            205 => {
+                __reduce205(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            206 => {
+                __reduce206(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            207 => {
+                __reduce207(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            208 => {
+                __reduce208(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            209 => {
+                __reduce209(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            210 => {
+                __reduce210(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            211 => {
+                __reduce211(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            212 => {
+                __reduce212(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            213 => {
+                // __Expr = Expr => ActionFn(3);
+                let __sym0 = __pop_Variant1(__symbols);
+                let __start = __sym0.0;
+                let __end = __sym0.2;
+                let __nt = super::__action3::<>(input, __sym0);
+                return Some(Ok(__nt));
+            }
+            214 => {
+                __reduce214(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            215 => {
+                __reduce215(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            _ => panic!("invalid action code {}", __action)
+        };
+        let __states_len = __states.len();
+        __states.truncate(__states_len - __pop_states);
+        let __state = *__states.last().unwrap();
+        let __next_state = __goto(__state, __nonterminal);
+        __states.push(__next_state);
+        None
+    }
+    #[inline(never)]
+    fn __symbol_type_mismatch() -> ! {
+        panic!("symbol type mismatch")
+    }
+    fn __pop_Variant30<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, (), usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant30(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant23<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, Action, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant23(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant16<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, Command, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant16(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant1<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, Expr, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant1(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant19<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, Fact, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant19(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant28<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, IdentSort, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant28(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant32<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, Literal, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant32(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant25<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, Option<usize>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant25(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant27<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, OrderedFloat<f64>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant27(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant35<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, Schedule, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant35(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant37<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, Schema, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant37(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant3<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, String, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant3(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant7<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, Symbol, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant7(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant21<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, Variant, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant21(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant5<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, Vec<Action>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant5(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant34<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, Vec<Command>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant34(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant26<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, Vec<Expr>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant26(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant14<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, Vec<Fact>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant14(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant31<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, Vec<Symbol>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant31(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant24<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, alloc::vec::Vec<Action>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant24(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant17<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, alloc::vec::Vec<Command>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant17(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant18<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, alloc::vec::Vec<Expr>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant18(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant10<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, alloc::vec::Vec<Fact>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant10(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant29<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, alloc::vec::Vec<IdentSort>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant29(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant36<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, alloc::vec::Vec<Schedule>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant36(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant20<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, alloc::vec::Vec<Symbol>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant20(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant22<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, alloc::vec::Vec<Variant>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant22(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant2<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, core::option::Option<Expr>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant2(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant4<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, core::option::Option<String>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant4(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant8<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, core::option::Option<Symbol>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant8(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant6<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, core::option::Option<Vec<Action>>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant6(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant15<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, core::option::Option<Vec<Fact>>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant15(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant11<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, core::option::Option<alloc::vec::Vec<Fact>>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant11(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant13<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, core::option::Option<usize>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant13(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant9<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, core::option::Option<&'input str>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant9(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant33<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, i64, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant33(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant12<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, usize, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant12(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant0<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, &'input str, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant0(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    pub(crate) fn __reduce0<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":default" <Expr>) = ":default", Expr => ActionFn(115);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant1(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action115::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant1(__nt), __end));
+        (2, 0)
+    }
+    pub(crate) fn __reduce1<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":default" <Expr>)? = ":default", Expr => ActionFn(161);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant1(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action161::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant2(__nt), __end));
+        (2, 1)
+    }
+    pub(crate) fn __reduce2<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":default" <Expr>)? =  => ActionFn(114);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action114::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant2(__nt), __end));
+        (0, 1)
+    }
+    pub(crate) fn __reduce3<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":merge" <Expr>) = ":merge", Expr => ActionFn(118);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant1(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action118::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant1(__nt), __end));
+        (2, 2)
+    }
+    pub(crate) fn __reduce4<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":merge" <Expr>)? = ":merge", Expr => ActionFn(164);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant1(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action164::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant2(__nt), __end));
+        (2, 3)
+    }
+    pub(crate) fn __reduce5<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":merge" <Expr>)? =  => ActionFn(117);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action117::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant2(__nt), __end));
+        (0, 3)
+    }
+    pub(crate) fn __reduce6<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":name" <String>) = ":name", String => ActionFn(107);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant3(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action107::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant3(__nt), __end));
+        (2, 4)
+    }
+    pub(crate) fn __reduce7<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":name" <String>)? = ":name", String => ActionFn(169);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant3(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action169::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant4(__nt), __end));
+        (2, 5)
+    }
+    pub(crate) fn __reduce8<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":name" <String>)? =  => ActionFn(106);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action106::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant4(__nt), __end));
+        (0, 5)
+    }
+    pub(crate) fn __reduce9<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":on_merge" <List<Action>>) = ":on_merge", List<Action> => ActionFn(121);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant5(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action121::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant5(__nt), __end));
+        (2, 6)
+    }
+    pub(crate) fn __reduce10<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":on_merge" <List<Action>>)? = ":on_merge", List<Action> => ActionFn(172);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant5(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action172::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant6(__nt), __end));
+        (2, 7)
+    }
+    pub(crate) fn __reduce11<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":on_merge" <List<Action>>)? =  => ActionFn(120);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action120::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant6(__nt), __end));
+        (0, 7)
+    }
+    pub(crate) fn __reduce12<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":ruleset" <Ident>) = ":ruleset", Ident => ActionFn(110);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant7(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action110::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant7(__nt), __end));
+        (2, 8)
+    }
+    pub(crate) fn __reduce13<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":ruleset" <Ident>)? = ":ruleset", Ident => ActionFn(181);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant7(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action181::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant8(__nt), __end));
+        (2, 9)
+    }
+    pub(crate) fn __reduce14<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":ruleset" <Ident>)? =  => ActionFn(109);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action109::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant8(__nt), __end));
+        (0, 9)
+    }
+    pub(crate) fn __reduce15<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":unextractable") = ":unextractable" => ActionFn(125);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action125::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant0(__nt), __end));
+        (1, 10)
+    }
+    pub(crate) fn __reduce16<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":unextractable")? = ":unextractable" => ActionFn(190);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action190::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant9(__nt), __end));
+        (1, 11)
+    }
+    pub(crate) fn __reduce17<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":unextractable")? =  => ActionFn(124);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action124::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant9(__nt), __end));
+        (0, 11)
+    }
+    pub(crate) fn __reduce18<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":until" <(Fact)*>) = ":until" => ActionFn(207);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action207::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant10(__nt), __end));
+        (1, 12)
+    }
+    pub(crate) fn __reduce19<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":until" <(Fact)*>) = ":until", (Fact)+ => ActionFn(208);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant10(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action208::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant10(__nt), __end));
+        (2, 12)
+    }
+    pub(crate) fn __reduce20<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":until" <(Fact)*>)? = ":until" => ActionFn(211);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action211::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant11(__nt), __end));
+        (1, 13)
+    }
+    pub(crate) fn __reduce21<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":until" <(Fact)*>)? = ":until", (Fact)+ => ActionFn(212);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant10(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action212::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant11(__nt), __end));
+        (2, 13)
+    }
+    pub(crate) fn __reduce22<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":until" <(Fact)*>)? =  => ActionFn(97);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action97::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant11(__nt), __end));
+        (0, 13)
+    }
+    pub(crate) fn __reduce23<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":variants" <UNum>) = ":variants", UNum => ActionFn(91);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant12(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action91::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant12(__nt), __end));
+        (2, 14)
+    }
+    pub(crate) fn __reduce24<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":variants" <UNum>)? = ":variants", UNum => ActionFn(225);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant12(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action225::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant13(__nt), __end));
+        (2, 15)
+    }
+    pub(crate) fn __reduce25<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":variants" <UNum>)? =  => ActionFn(90);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action90::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant13(__nt), __end));
+        (0, 15)
+    }
+    pub(crate) fn __reduce26<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":when" <List<Fact>>) = ":when", List<Fact> => ActionFn(104);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant14(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action104::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant14(__nt), __end));
+        (2, 16)
+    }
+    pub(crate) fn __reduce27<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":when" <List<Fact>>)? = ":when", List<Fact> => ActionFn(228);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant14(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action228::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant15(__nt), __end));
+        (2, 17)
+    }
+    pub(crate) fn __reduce28<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":when" <List<Fact>>)? =  => ActionFn(103);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action103::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant15(__nt), __end));
+        (0, 17)
+    }
+    pub(crate) fn __reduce29<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Command) = Command => ActionFn(134);
+        let __sym0 = __pop_Variant16(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action134::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (1, 18)
+    }
+    pub(crate) fn __reduce30<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Command)* =  => ActionFn(132);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action132::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant17(__nt), __end));
+        (0, 19)
+    }
+    pub(crate) fn __reduce31<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Command)* = (Command)+ => ActionFn(133);
+        let __sym0 = __pop_Variant17(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action133::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant17(__nt), __end));
+        (1, 19)
+    }
+    pub(crate) fn __reduce32<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Command)+ = Command => ActionFn(237);
+        let __sym0 = __pop_Variant16(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action237::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant17(__nt), __end));
+        (1, 20)
+    }
+    pub(crate) fn __reduce33<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Command)+ = (Command)+, Command => ActionFn(238);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant16(__symbols);
+        let __sym0 = __pop_Variant17(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action238::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant17(__nt), __end));
+        (2, 20)
+    }
+    pub(crate) fn __reduce34<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Expr) = Expr => ActionFn(128);
+        let __sym0 = __pop_Variant1(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action128::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant1(__nt), __end));
+        (1, 21)
+    }
+    pub(crate) fn __reduce35<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Expr)* =  => ActionFn(126);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action126::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant18(__nt), __end));
+        (0, 22)
+    }
+    pub(crate) fn __reduce36<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Expr)* = (Expr)+ => ActionFn(127);
+        let __sym0 = __pop_Variant18(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action127::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant18(__nt), __end));
+        (1, 22)
+    }
+    pub(crate) fn __reduce37<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Expr)+ = Expr => ActionFn(241);
+        let __sym0 = __pop_Variant1(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action241::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant18(__nt), __end));
+        (1, 23)
+    }
+    pub(crate) fn __reduce38<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Expr)+ = (Expr)+, Expr => ActionFn(242);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant1(__symbols);
+        let __sym0 = __pop_Variant18(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action242::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant18(__nt), __end));
+        (2, 23)
+    }
+    pub(crate) fn __reduce39<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Fact) = Fact => ActionFn(101);
+        let __sym0 = __pop_Variant19(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action101::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant19(__nt), __end));
+        (1, 24)
+    }
+    pub(crate) fn __reduce40<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Fact)* =  => ActionFn(99);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action99::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant10(__nt), __end));
+        (0, 25)
+    }
+    pub(crate) fn __reduce41<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Fact)* = (Fact)+ => ActionFn(100);
+        let __sym0 = __pop_Variant10(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action100::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant10(__nt), __end));
+        (1, 25)
+    }
+    pub(crate) fn __reduce42<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Fact)+ = Fact => ActionFn(249);
+        let __sym0 = __pop_Variant19(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action249::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant10(__nt), __end));
+        (1, 26)
+    }
+    pub(crate) fn __reduce43<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Fact)+ = (Fact)+, Fact => ActionFn(250);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant19(__symbols);
+        let __sym0 = __pop_Variant10(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action250::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant10(__nt), __end));
+        (2, 26)
+    }
+    pub(crate) fn __reduce44<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Type) = Type => ActionFn(82);
+        let __sym0 = __pop_Variant7(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action82::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant7(__nt), __end));
+        (1, 27)
+    }
+    pub(crate) fn __reduce45<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Type)* =  => ActionFn(80);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action80::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant20(__nt), __end));
+        (0, 28)
+    }
+    pub(crate) fn __reduce46<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Type)* = (Type)+ => ActionFn(81);
+        let __sym0 = __pop_Variant20(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action81::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant20(__nt), __end));
+        (1, 28)
+    }
+    pub(crate) fn __reduce47<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Type)+ = Type => ActionFn(251);
+        let __sym0 = __pop_Variant7(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action251::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant20(__nt), __end));
+        (1, 29)
+    }
+    pub(crate) fn __reduce48<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Type)+ = (Type)+, Type => ActionFn(252);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant7(__symbols);
+        let __sym0 = __pop_Variant20(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action252::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant20(__nt), __end));
+        (2, 29)
+    }
+    pub(crate) fn __reduce49<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Variant) = Variant => ActionFn(131);
+        let __sym0 = __pop_Variant21(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action131::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant21(__nt), __end));
+        (1, 30)
+    }
+    pub(crate) fn __reduce50<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Variant)* =  => ActionFn(129);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action129::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant22(__nt), __end));
+        (0, 31)
+    }
+    pub(crate) fn __reduce51<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Variant)* = (Variant)+ => ActionFn(130);
+        let __sym0 = __pop_Variant22(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action130::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant22(__nt), __end));
+        (1, 31)
+    }
+    pub(crate) fn __reduce52<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Variant)+ = Variant => ActionFn(255);
+        let __sym0 = __pop_Variant21(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action255::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant22(__nt), __end));
+        (1, 32)
+    }
+    pub(crate) fn __reduce53<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Variant)+ = (Variant)+, Variant => ActionFn(256);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant21(__symbols);
+        let __sym0 = __pop_Variant22(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action256::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant22(__nt), __end));
+        (2, 32)
+    }
+    pub(crate) fn __reduce54<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Action = LParen, "let", Ident, Expr, RParen => ActionFn(54);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant1(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action54::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant23(__nt), __end));
+        (5, 33)
+    }
+    pub(crate) fn __reduce55<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Action = NonLetAction => ActionFn(55);
+        let __sym0 = __pop_Variant23(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action55::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant23(__nt), __end));
+        (1, 33)
+    }
+    pub(crate) fn __reduce56<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Action* =  => ActionFn(141);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action141::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant24(__nt), __end));
+        (0, 34)
+    }
+    pub(crate) fn __reduce57<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Action* = Action+ => ActionFn(142);
+        let __sym0 = __pop_Variant24(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action142::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant24(__nt), __end));
+        (1, 34)
+    }
+    pub(crate) fn __reduce58<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Action+ = Action => ActionFn(159);
+        let __sym0 = __pop_Variant23(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action159::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant24(__nt), __end));
+        (1, 35)
+    }
+    pub(crate) fn __reduce59<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Action+ = Action+, Action => ActionFn(160);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant23(__symbols);
+        let __sym0 = __pop_Variant24(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action160::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant24(__nt), __end));
+        (2, 35)
+    }
+    pub(crate) fn __reduce60<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // CallExpr = LParen, Ident, RParen => ActionFn(243);
+        assert!(__symbols.len() >= 3);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant7(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym2.2;
+        let __nt = super::__action243::<>(input, __sym0, __sym1, __sym2);
+        __symbols.push((__start, __Symbol::Variant1(__nt), __end));
+        (3, 36)
+    }
+    pub(crate) fn __reduce61<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // CallExpr = LParen, Ident, (Expr)+, RParen => ActionFn(244);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant18(__symbols);
+        let __sym1 = __pop_Variant7(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action244::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant1(__nt), __end));
+        (4, 36)
+    }
+    pub(crate) fn __reduce62<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "set-option", Ident, Expr, RParen => ActionFn(9);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant1(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action9::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (5, 37)
+    }
+    pub(crate) fn __reduce63<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "datatype", Ident, RParen => ActionFn(257);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action257::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (4, 37)
+    }
+    pub(crate) fn __reduce64<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "datatype", Ident, (Variant)+, RParen => ActionFn(258);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant22(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action258::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (5, 37)
+    }
+    pub(crate) fn __reduce65<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "sort", Ident, LParen, Ident, RParen, RParen => ActionFn(245);
+        assert!(__symbols.len() >= 7);
+        let __sym6 = __pop_Variant30(__symbols);
+        let __sym5 = __pop_Variant30(__symbols);
+        let __sym4 = __pop_Variant7(__symbols);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym6.2;
+        let __nt = super::__action245::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (7, 37)
+    }
+    pub(crate) fn __reduce66<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "sort", Ident, LParen, Ident, (Expr)+, RParen, RParen => ActionFn(246);
+        assert!(__symbols.len() >= 8);
+        let __sym7 = __pop_Variant30(__symbols);
+        let __sym6 = __pop_Variant30(__symbols);
+        let __sym5 = __pop_Variant18(__symbols);
+        let __sym4 = __pop_Variant7(__symbols);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym7.2;
+        let __nt = super::__action246::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (8, 37)
+    }
+    pub(crate) fn __reduce67<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "sort", Ident, RParen => ActionFn(12);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action12::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (4, 37)
+    }
+    pub(crate) fn __reduce68<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "function", Ident, Schema, Cost, ":unextractable", ":on_merge", List<Action>, ":merge", Expr, ":default", Expr, RParen => ActionFn(191);
+        assert!(__symbols.len() >= 13);
+        let __sym12 = __pop_Variant30(__symbols);
+        let __sym11 = __pop_Variant1(__symbols);
+        let __sym10 = __pop_Variant0(__symbols);
+        let __sym9 = __pop_Variant1(__symbols);
+        let __sym8 = __pop_Variant0(__symbols);
+        let __sym7 = __pop_Variant5(__symbols);
+        let __sym6 = __pop_Variant0(__symbols);
+        let __sym5 = __pop_Variant0(__symbols);
+        let __sym4 = __pop_Variant25(__symbols);
+        let __sym3 = __pop_Variant37(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym12.2;
+        let __nt = super::__action191::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9, __sym10, __sym11, __sym12);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (13, 37)
+    }
+    pub(crate) fn __reduce69<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "function", Ident, Schema, Cost, ":on_merge", List<Action>, ":merge", Expr, ":default", Expr, RParen => ActionFn(192);
+        assert!(__symbols.len() >= 12);
+        let __sym11 = __pop_Variant30(__symbols);
+        let __sym10 = __pop_Variant1(__symbols);
+        let __sym9 = __pop_Variant0(__symbols);
+        let __sym8 = __pop_Variant1(__symbols);
+        let __sym7 = __pop_Variant0(__symbols);
+        let __sym6 = __pop_Variant5(__symbols);
+        let __sym5 = __pop_Variant0(__symbols);
+        let __sym4 = __pop_Variant25(__symbols);
+        let __sym3 = __pop_Variant37(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym11.2;
+        let __nt = super::__action192::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9, __sym10, __sym11);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (12, 37)
+    }
+    pub(crate) fn __reduce70<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "function", Ident, Schema, Cost, ":unextractable", ":merge", Expr, ":default", Expr, RParen => ActionFn(193);
+        assert!(__symbols.len() >= 11);
+        let __sym10 = __pop_Variant30(__symbols);
+        let __sym9 = __pop_Variant1(__symbols);
+        let __sym8 = __pop_Variant0(__symbols);
+        let __sym7 = __pop_Variant1(__symbols);
+        let __sym6 = __pop_Variant0(__symbols);
+        let __sym5 = __pop_Variant0(__symbols);
+        let __sym4 = __pop_Variant25(__symbols);
+        let __sym3 = __pop_Variant37(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym10.2;
+        let __nt = super::__action193::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9, __sym10);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (11, 37)
+    }
+    pub(crate) fn __reduce71<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "function", Ident, Schema, Cost, ":merge", Expr, ":default", Expr, RParen => ActionFn(194);
+        assert!(__symbols.len() >= 10);
+        let __sym9 = __pop_Variant30(__symbols);
+        let __sym8 = __pop_Variant1(__symbols);
+        let __sym7 = __pop_Variant0(__symbols);
+        let __sym6 = __pop_Variant1(__symbols);
+        let __sym5 = __pop_Variant0(__symbols);
+        let __sym4 = __pop_Variant25(__symbols);
+        let __sym3 = __pop_Variant37(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym9.2;
+        let __nt = super::__action194::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (10, 37)
+    }
+    pub(crate) fn __reduce72<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "function", Ident, Schema, Cost, ":unextractable", ":on_merge", List<Action>, ":default", Expr, RParen => ActionFn(195);
+        assert!(__symbols.len() >= 11);
+        let __sym10 = __pop_Variant30(__symbols);
+        let __sym9 = __pop_Variant1(__symbols);
+        let __sym8 = __pop_Variant0(__symbols);
+        let __sym7 = __pop_Variant5(__symbols);
+        let __sym6 = __pop_Variant0(__symbols);
+        let __sym5 = __pop_Variant0(__symbols);
+        let __sym4 = __pop_Variant25(__symbols);
+        let __sym3 = __pop_Variant37(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym10.2;
+        let __nt = super::__action195::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9, __sym10);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (11, 37)
+    }
+    pub(crate) fn __reduce73<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "function", Ident, Schema, Cost, ":on_merge", List<Action>, ":default", Expr, RParen => ActionFn(196);
+        assert!(__symbols.len() >= 10);
+        let __sym9 = __pop_Variant30(__symbols);
+        let __sym8 = __pop_Variant1(__symbols);
+        let __sym7 = __pop_Variant0(__symbols);
+        let __sym6 = __pop_Variant5(__symbols);
+        let __sym5 = __pop_Variant0(__symbols);
+        let __sym4 = __pop_Variant25(__symbols);
+        let __sym3 = __pop_Variant37(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym9.2;
+        let __nt = super::__action196::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (10, 37)
+    }
+    pub(crate) fn __reduce74<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "function", Ident, Schema, Cost, ":unextractable", ":default", Expr, RParen => ActionFn(197);
+        assert!(__symbols.len() >= 9);
+        let __sym8 = __pop_Variant30(__symbols);
+        let __sym7 = __pop_Variant1(__symbols);
+        let __sym6 = __pop_Variant0(__symbols);
+        let __sym5 = __pop_Variant0(__symbols);
+        let __sym4 = __pop_Variant25(__symbols);
+        let __sym3 = __pop_Variant37(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym8.2;
+        let __nt = super::__action197::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (9, 37)
+    }
+    pub(crate) fn __reduce75<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "function", Ident, Schema, Cost, ":default", Expr, RParen => ActionFn(198);
+        assert!(__symbols.len() >= 8);
+        let __sym7 = __pop_Variant30(__symbols);
+        let __sym6 = __pop_Variant1(__symbols);
+        let __sym5 = __pop_Variant0(__symbols);
+        let __sym4 = __pop_Variant25(__symbols);
+        let __sym3 = __pop_Variant37(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym7.2;
+        let __nt = super::__action198::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (8, 37)
+    }
+    pub(crate) fn __reduce76<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "function", Ident, Schema, Cost, ":unextractable", ":on_merge", List<Action>, ":merge", Expr, RParen => ActionFn(199);
+        assert!(__symbols.len() >= 11);
+        let __sym10 = __pop_Variant30(__symbols);
+        let __sym9 = __pop_Variant1(__symbols);
+        let __sym8 = __pop_Variant0(__symbols);
+        let __sym7 = __pop_Variant5(__symbols);
+        let __sym6 = __pop_Variant0(__symbols);
+        let __sym5 = __pop_Variant0(__symbols);
+        let __sym4 = __pop_Variant25(__symbols);
+        let __sym3 = __pop_Variant37(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym10.2;
+        let __nt = super::__action199::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9, __sym10);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (11, 37)
+    }
+    pub(crate) fn __reduce77<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "function", Ident, Schema, Cost, ":on_merge", List<Action>, ":merge", Expr, RParen => ActionFn(200);
+        assert!(__symbols.len() >= 10);
+        let __sym9 = __pop_Variant30(__symbols);
+        let __sym8 = __pop_Variant1(__symbols);
+        let __sym7 = __pop_Variant0(__symbols);
+        let __sym6 = __pop_Variant5(__symbols);
+        let __sym5 = __pop_Variant0(__symbols);
+        let __sym4 = __pop_Variant25(__symbols);
+        let __sym3 = __pop_Variant37(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym9.2;
+        let __nt = super::__action200::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (10, 37)
+    }
+    pub(crate) fn __reduce78<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "function", Ident, Schema, Cost, ":unextractable", ":merge", Expr, RParen => ActionFn(201);
+        assert!(__symbols.len() >= 9);
+        let __sym8 = __pop_Variant30(__symbols);
+        let __sym7 = __pop_Variant1(__symbols);
+        let __sym6 = __pop_Variant0(__symbols);
+        let __sym5 = __pop_Variant0(__symbols);
+        let __sym4 = __pop_Variant25(__symbols);
+        let __sym3 = __pop_Variant37(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym8.2;
+        let __nt = super::__action201::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (9, 37)
+    }
+    pub(crate) fn __reduce79<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "function", Ident, Schema, Cost, ":merge", Expr, RParen => ActionFn(202);
+        assert!(__symbols.len() >= 8);
+        let __sym7 = __pop_Variant30(__symbols);
+        let __sym6 = __pop_Variant1(__symbols);
+        let __sym5 = __pop_Variant0(__symbols);
+        let __sym4 = __pop_Variant25(__symbols);
+        let __sym3 = __pop_Variant37(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym7.2;
+        let __nt = super::__action202::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (8, 37)
+    }
+    pub(crate) fn __reduce80<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "function", Ident, Schema, Cost, ":unextractable", ":on_merge", List<Action>, RParen => ActionFn(203);
+        assert!(__symbols.len() >= 9);
+        let __sym8 = __pop_Variant30(__symbols);
+        let __sym7 = __pop_Variant5(__symbols);
+        let __sym6 = __pop_Variant0(__symbols);
+        let __sym5 = __pop_Variant0(__symbols);
+        let __sym4 = __pop_Variant25(__symbols);
+        let __sym3 = __pop_Variant37(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym8.2;
+        let __nt = super::__action203::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (9, 37)
+    }
+    pub(crate) fn __reduce81<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "function", Ident, Schema, Cost, ":on_merge", List<Action>, RParen => ActionFn(204);
+        assert!(__symbols.len() >= 8);
+        let __sym7 = __pop_Variant30(__symbols);
+        let __sym6 = __pop_Variant5(__symbols);
+        let __sym5 = __pop_Variant0(__symbols);
+        let __sym4 = __pop_Variant25(__symbols);
+        let __sym3 = __pop_Variant37(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym7.2;
+        let __nt = super::__action204::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (8, 37)
+    }
+    pub(crate) fn __reduce82<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "function", Ident, Schema, Cost, ":unextractable", RParen => ActionFn(205);
+        assert!(__symbols.len() >= 7);
+        let __sym6 = __pop_Variant30(__symbols);
+        let __sym5 = __pop_Variant0(__symbols);
+        let __sym4 = __pop_Variant25(__symbols);
+        let __sym3 = __pop_Variant37(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym6.2;
+        let __nt = super::__action205::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (7, 37)
+    }
+    pub(crate) fn __reduce83<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "function", Ident, Schema, Cost, RParen => ActionFn(206);
+        assert!(__symbols.len() >= 6);
+        let __sym5 = __pop_Variant30(__symbols);
+        let __sym4 = __pop_Variant25(__symbols);
+        let __sym3 = __pop_Variant37(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym5.2;
+        let __nt = super::__action206::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (6, 37)
+    }
+    pub(crate) fn __reduce84<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "declare", Ident, Ident, RParen => ActionFn(14);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant7(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action14::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (5, 37)
+    }
+    pub(crate) fn __reduce85<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "relation", Ident, List<Type>, RParen => ActionFn(15);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant31(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action15::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (5, 37)
+    }
+    pub(crate) fn __reduce86<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "ruleset", Ident, RParen => ActionFn(16);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action16::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (4, 37)
+    }
+    pub(crate) fn __reduce87<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "rule", List<Fact>, List<Action>, ":ruleset", Ident, ":name", String, RParen => ActionFn(182);
+        assert!(__symbols.len() >= 9);
+        let __sym8 = __pop_Variant30(__symbols);
+        let __sym7 = __pop_Variant3(__symbols);
+        let __sym6 = __pop_Variant0(__symbols);
+        let __sym5 = __pop_Variant7(__symbols);
+        let __sym4 = __pop_Variant0(__symbols);
+        let __sym3 = __pop_Variant5(__symbols);
+        let __sym2 = __pop_Variant14(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym8.2;
+        let __nt = super::__action182::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (9, 37)
+    }
+    pub(crate) fn __reduce88<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "rule", List<Fact>, List<Action>, ":name", String, RParen => ActionFn(183);
+        assert!(__symbols.len() >= 7);
+        let __sym6 = __pop_Variant30(__symbols);
+        let __sym5 = __pop_Variant3(__symbols);
+        let __sym4 = __pop_Variant0(__symbols);
+        let __sym3 = __pop_Variant5(__symbols);
+        let __sym2 = __pop_Variant14(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym6.2;
+        let __nt = super::__action183::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (7, 37)
+    }
+    pub(crate) fn __reduce89<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "rule", List<Fact>, List<Action>, ":ruleset", Ident, RParen => ActionFn(184);
+        assert!(__symbols.len() >= 7);
+        let __sym6 = __pop_Variant30(__symbols);
+        let __sym5 = __pop_Variant7(__symbols);
+        let __sym4 = __pop_Variant0(__symbols);
+        let __sym3 = __pop_Variant5(__symbols);
+        let __sym2 = __pop_Variant14(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym6.2;
+        let __nt = super::__action184::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (7, 37)
+    }
+    pub(crate) fn __reduce90<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "rule", List<Fact>, List<Action>, RParen => ActionFn(185);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant5(__symbols);
+        let __sym2 = __pop_Variant14(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action185::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (5, 37)
+    }
+    pub(crate) fn __reduce91<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "rewrite", Expr, Expr, ":when", List<Fact>, ":ruleset", Ident, RParen => ActionFn(229);
+        assert!(__symbols.len() >= 9);
+        let __sym8 = __pop_Variant30(__symbols);
+        let __sym7 = __pop_Variant7(__symbols);
+        let __sym6 = __pop_Variant0(__symbols);
+        let __sym5 = __pop_Variant14(__symbols);
+        let __sym4 = __pop_Variant0(__symbols);
+        let __sym3 = __pop_Variant1(__symbols);
+        let __sym2 = __pop_Variant1(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym8.2;
+        let __nt = super::__action229::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (9, 37)
+    }
+    pub(crate) fn __reduce92<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "rewrite", Expr, Expr, ":ruleset", Ident, RParen => ActionFn(230);
+        assert!(__symbols.len() >= 7);
+        let __sym6 = __pop_Variant30(__symbols);
+        let __sym5 = __pop_Variant7(__symbols);
+        let __sym4 = __pop_Variant0(__symbols);
+        let __sym3 = __pop_Variant1(__symbols);
+        let __sym2 = __pop_Variant1(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym6.2;
+        let __nt = super::__action230::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (7, 37)
+    }
+    pub(crate) fn __reduce93<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "rewrite", Expr, Expr, ":when", List<Fact>, RParen => ActionFn(231);
+        assert!(__symbols.len() >= 7);
+        let __sym6 = __pop_Variant30(__symbols);
+        let __sym5 = __pop_Variant14(__symbols);
+        let __sym4 = __pop_Variant0(__symbols);
+        let __sym3 = __pop_Variant1(__symbols);
+        let __sym2 = __pop_Variant1(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym6.2;
+        let __nt = super::__action231::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (7, 37)
+    }
+    pub(crate) fn __reduce94<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "rewrite", Expr, Expr, RParen => ActionFn(232);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant1(__symbols);
+        let __sym2 = __pop_Variant1(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action232::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (5, 37)
+    }
+    pub(crate) fn __reduce95<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "birewrite", Expr, Expr, ":when", List<Fact>, ":ruleset", Ident, RParen => ActionFn(233);
+        assert!(__symbols.len() >= 9);
+        let __sym8 = __pop_Variant30(__symbols);
+        let __sym7 = __pop_Variant7(__symbols);
+        let __sym6 = __pop_Variant0(__symbols);
+        let __sym5 = __pop_Variant14(__symbols);
+        let __sym4 = __pop_Variant0(__symbols);
+        let __sym3 = __pop_Variant1(__symbols);
+        let __sym2 = __pop_Variant1(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym8.2;
+        let __nt = super::__action233::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (9, 37)
+    }
+    pub(crate) fn __reduce96<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "birewrite", Expr, Expr, ":ruleset", Ident, RParen => ActionFn(234);
+        assert!(__symbols.len() >= 7);
+        let __sym6 = __pop_Variant30(__symbols);
+        let __sym5 = __pop_Variant7(__symbols);
+        let __sym4 = __pop_Variant0(__symbols);
+        let __sym3 = __pop_Variant1(__symbols);
+        let __sym2 = __pop_Variant1(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym6.2;
+        let __nt = super::__action234::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (7, 37)
+    }
+    pub(crate) fn __reduce97<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "birewrite", Expr, Expr, ":when", List<Fact>, RParen => ActionFn(235);
+        assert!(__symbols.len() >= 7);
+        let __sym6 = __pop_Variant30(__symbols);
+        let __sym5 = __pop_Variant14(__symbols);
+        let __sym4 = __pop_Variant0(__symbols);
+        let __sym3 = __pop_Variant1(__symbols);
+        let __sym2 = __pop_Variant1(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym6.2;
+        let __nt = super::__action235::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (7, 37)
+    }
+    pub(crate) fn __reduce98<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "birewrite", Expr, Expr, RParen => ActionFn(236);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant1(__symbols);
+        let __sym2 = __pop_Variant1(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action236::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (5, 37)
+    }
+    pub(crate) fn __reduce99<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "let", Ident, Expr, RParen => ActionFn(20);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant1(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action20::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (5, 37)
+    }
+    pub(crate) fn __reduce100<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = NonLetAction => ActionFn(21);
+        let __sym0 = __pop_Variant23(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action21::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (1, 37)
+    }
+    pub(crate) fn __reduce101<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "run", UNum, ":until", RParen => ActionFn(213);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant0(__symbols);
+        let __sym2 = __pop_Variant12(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action213::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (5, 37)
+    }
+    pub(crate) fn __reduce102<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "run", UNum, ":until", (Fact)+, RParen => ActionFn(214);
+        assert!(__symbols.len() >= 6);
+        let __sym5 = __pop_Variant30(__symbols);
+        let __sym4 = __pop_Variant10(__symbols);
+        let __sym3 = __pop_Variant0(__symbols);
+        let __sym2 = __pop_Variant12(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym5.2;
+        let __nt = super::__action214::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (6, 37)
+    }
+    pub(crate) fn __reduce103<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "run", UNum, RParen => ActionFn(215);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant12(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action215::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (4, 37)
+    }
+    pub(crate) fn __reduce104<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "run", Ident, UNum, ":until", RParen => ActionFn(216);
+        assert!(__symbols.len() >= 6);
+        let __sym5 = __pop_Variant30(__symbols);
+        let __sym4 = __pop_Variant0(__symbols);
+        let __sym3 = __pop_Variant12(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym5.2;
+        let __nt = super::__action216::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (6, 37)
+    }
+    pub(crate) fn __reduce105<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "run", Ident, UNum, ":until", (Fact)+, RParen => ActionFn(217);
+        assert!(__symbols.len() >= 7);
+        let __sym6 = __pop_Variant30(__symbols);
+        let __sym5 = __pop_Variant10(__symbols);
+        let __sym4 = __pop_Variant0(__symbols);
+        let __sym3 = __pop_Variant12(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym6.2;
+        let __nt = super::__action217::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (7, 37)
+    }
+    pub(crate) fn __reduce106<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "run", Ident, UNum, RParen => ActionFn(218);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant12(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action218::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (5, 37)
+    }
+    pub(crate) fn __reduce107<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "simplify", Schedule, Expr, RParen => ActionFn(24);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant1(__symbols);
+        let __sym2 = __pop_Variant35(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action24::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (5, 37)
+    }
+    pub(crate) fn __reduce108<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "add-ruleset", Ident, RParen => ActionFn(25);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action25::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (4, 37)
+    }
+    pub(crate) fn __reduce109<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "calc", LParen, RParen, Expr+, RParen => ActionFn(267);
+        assert!(__symbols.len() >= 6);
+        let __sym5 = __pop_Variant30(__symbols);
+        let __sym4 = __pop_Variant18(__symbols);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym5.2;
+        let __nt = super::__action267::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (6, 37)
+    }
+    pub(crate) fn __reduce110<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "calc", LParen, IdentSort+, RParen, Expr+, RParen => ActionFn(268);
+        assert!(__symbols.len() >= 7);
+        let __sym6 = __pop_Variant30(__symbols);
+        let __sym5 = __pop_Variant18(__symbols);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant29(__symbols);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym6.2;
+        let __nt = super::__action268::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (7, 37)
+    }
+    pub(crate) fn __reduce111<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "query-extract", ":variants", UNum, Fact, RParen => ActionFn(226);
+        assert!(__symbols.len() >= 6);
+        let __sym5 = __pop_Variant30(__symbols);
+        let __sym4 = __pop_Variant19(__symbols);
+        let __sym3 = __pop_Variant12(__symbols);
+        let __sym2 = __pop_Variant0(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym5.2;
+        let __nt = super::__action226::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (6, 37)
+    }
+    pub(crate) fn __reduce112<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "query-extract", Fact, RParen => ActionFn(227);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant19(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action227::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (4, 37)
+    }
+    pub(crate) fn __reduce113<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "check", RParen => ActionFn(209);
+        assert!(__symbols.len() >= 3);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym2.2;
+        let __nt = super::__action209::<>(input, __sym0, __sym1, __sym2);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (3, 37)
+    }
+    pub(crate) fn __reduce114<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "check", (Fact)+, RParen => ActionFn(210);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant10(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action210::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (4, 37)
+    }
+    pub(crate) fn __reduce115<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "check-proof", RParen => ActionFn(29);
+        assert!(__symbols.len() >= 3);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym2.2;
+        let __nt = super::__action29::<>(input, __sym0, __sym1, __sym2);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (3, 37)
+    }
+    pub(crate) fn __reduce116<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "run-schedule", RParen => ActionFn(269);
+        assert!(__symbols.len() >= 3);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym2.2;
+        let __nt = super::__action269::<>(input, __sym0, __sym1, __sym2);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (3, 37)
+    }
+    pub(crate) fn __reduce117<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "run-schedule", Schedule+, RParen => ActionFn(270);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant36(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action270::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (4, 37)
+    }
+    pub(crate) fn __reduce118<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "push", UNum, RParen => ActionFn(279);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant12(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action279::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (4, 37)
+    }
+    pub(crate) fn __reduce119<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "push", RParen => ActionFn(280);
+        assert!(__symbols.len() >= 3);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym2.2;
+        let __nt = super::__action280::<>(input, __sym0, __sym1, __sym2);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (3, 37)
+    }
+    pub(crate) fn __reduce120<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "pop", UNum, RParen => ActionFn(281);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant12(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action281::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (4, 37)
+    }
+    pub(crate) fn __reduce121<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "pop", RParen => ActionFn(282);
+        assert!(__symbols.len() >= 3);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym2.2;
+        let __nt = super::__action282::<>(input, __sym0, __sym1, __sym2);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (3, 37)
+    }
+    pub(crate) fn __reduce122<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "print-table", Ident, UNum, RParen => ActionFn(283);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant12(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action283::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (5, 37)
+    }
+    pub(crate) fn __reduce123<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "print-table", Ident, RParen => ActionFn(284);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action284::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (4, 37)
+    }
+    pub(crate) fn __reduce124<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "print-size", Ident, RParen => ActionFn(34);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action34::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (4, 37)
+    }
+    pub(crate) fn __reduce125<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "input", Ident, String, RParen => ActionFn(35);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant3(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action35::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (5, 37)
+    }
+    pub(crate) fn __reduce126<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "output", String, Expr+, RParen => ActionFn(36);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant18(__symbols);
+        let __sym2 = __pop_Variant3(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action36::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (5, 37)
+    }
+    pub(crate) fn __reduce127<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "fail", Command, RParen => ActionFn(37);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant16(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action37::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (4, 37)
+    }
+    pub(crate) fn __reduce128<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "include", String, RParen => ActionFn(38);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant3(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action38::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (4, 37)
+    }
+    pub(crate) fn __reduce129<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Cost = ":cost", UNum => ActionFn(45);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant12(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action45::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant25(__nt), __end));
+        (2, 38)
+    }
+    pub(crate) fn __reduce130<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Cost =  => ActionFn(46);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action46::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant25(__nt), __end));
+        (0, 38)
+    }
+    pub(crate) fn __reduce131<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Expr = Literal => ActionFn(60);
+        let __sym0 = __pop_Variant32(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action60::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant1(__nt), __end));
+        (1, 39)
+    }
+    pub(crate) fn __reduce132<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Expr = Ident => ActionFn(61);
+        let __sym0 = __pop_Variant7(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action61::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant1(__nt), __end));
+        (1, 39)
+    }
+    pub(crate) fn __reduce133<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Expr = CallExpr => ActionFn(62);
+        let __sym0 = __pop_Variant1(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action62::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant1(__nt), __end));
+        (1, 39)
+    }
+    pub(crate) fn __reduce134<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Expr* =  => ActionFn(83);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action83::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant18(__nt), __end));
+        (0, 40)
+    }
+    pub(crate) fn __reduce135<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Expr* = Expr+ => ActionFn(84);
+        let __sym0 = __pop_Variant18(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action84::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant18(__nt), __end));
+        (1, 40)
+    }
+    pub(crate) fn __reduce136<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Expr+ = Expr => ActionFn(92);
+        let __sym0 = __pop_Variant1(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action92::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant18(__nt), __end));
+        (1, 41)
+    }
+    pub(crate) fn __reduce137<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Expr+ = Expr+, Expr => ActionFn(93);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant1(__symbols);
+        let __sym0 = __pop_Variant18(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action93::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant18(__nt), __end));
+        (2, 41)
+    }
+    pub(crate) fn __reduce138<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // ExprList = LParen, RParen => ActionFn(247);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant30(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action247::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant26(__nt), __end));
+        (2, 42)
+    }
+    pub(crate) fn __reduce139<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // ExprList = LParen, (Expr)+, RParen => ActionFn(248);
+        assert!(__symbols.len() >= 3);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant18(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym2.2;
+        let __nt = super::__action248::<>(input, __sym0, __sym1, __sym2);
+        __symbols.push((__start, __Symbol::Variant26(__nt), __end));
+        (3, 42)
+    }
+    pub(crate) fn __reduce140<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // F64 = "NaN" => ActionFn(73);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action73::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant27(__nt), __end));
+        (1, 43)
+    }
+    pub(crate) fn __reduce141<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // F64 = r#"(-)?[0-9]+\\.[0-9]+(e(\\+)?(-)?[0-9]+)?"# => ActionFn(74);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action74::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant27(__nt), __end));
+        (1, 43)
+    }
+    pub(crate) fn __reduce142<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // F64 = "inf" => ActionFn(75);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action75::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant27(__nt), __end));
+        (1, 43)
+    }
+    pub(crate) fn __reduce143<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // F64 = "-inf" => ActionFn(76);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action76::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant27(__nt), __end));
+        (1, 43)
+    }
+    pub(crate) fn __reduce144<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Fact = LParen, "=", Expr+, Expr, RParen => ActionFn(57);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant1(__symbols);
+        let __sym2 = __pop_Variant18(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action57::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant19(__nt), __end));
+        (5, 44)
+    }
+    pub(crate) fn __reduce145<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Fact = Expr => ActionFn(58);
+        let __sym0 = __pop_Variant1(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action58::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant19(__nt), __end));
+        (1, 44)
+    }
+    pub(crate) fn __reduce146<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Fact* =  => ActionFn(145);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action145::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant10(__nt), __end));
+        (0, 45)
+    }
+    pub(crate) fn __reduce147<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Fact* = Fact+ => ActionFn(146);
+        let __sym0 = __pop_Variant10(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action146::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant10(__nt), __end));
+        (1, 45)
+    }
+    pub(crate) fn __reduce148<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Fact+ = Fact => ActionFn(155);
+        let __sym0 = __pop_Variant19(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action155::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant10(__nt), __end));
+        (1, 46)
+    }
+    pub(crate) fn __reduce149<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Fact+ = Fact+, Fact => ActionFn(156);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant19(__symbols);
+        let __sym0 = __pop_Variant10(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action156::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant10(__nt), __end));
+        (2, 46)
+    }
+    pub(crate) fn __reduce150<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Ident = r#"(([[:alpha:]][\\w-]*)|([-+*/?!=<>&|^/%_]))+"# => ActionFn(77);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action77::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant7(__nt), __end));
+        (1, 47)
+    }
+    pub(crate) fn __reduce151<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // IdentSort = LParen, Ident, Type, RParen => ActionFn(70);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant7(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action70::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant28(__nt), __end));
+        (4, 48)
+    }
+    pub(crate) fn __reduce152<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // IdentSort* =  => ActionFn(94);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action94::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant29(__nt), __end));
+        (0, 49)
+    }
+    pub(crate) fn __reduce153<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // IdentSort* = IdentSort+ => ActionFn(95);
+        let __sym0 = __pop_Variant29(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action95::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant29(__nt), __end));
+        (1, 49)
+    }
+    pub(crate) fn __reduce154<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // IdentSort+ = IdentSort => ActionFn(149);
+        let __sym0 = __pop_Variant28(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action149::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant29(__nt), __end));
+        (1, 50)
+    }
+    pub(crate) fn __reduce155<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // IdentSort+ = IdentSort+, IdentSort => ActionFn(150);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant28(__symbols);
+        let __sym0 = __pop_Variant29(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action150::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant29(__nt), __end));
+        (2, 50)
+    }
+    pub(crate) fn __reduce156<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // LParen = "(" => ActionFn(5);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action5::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant30(__nt), __end));
+        (1, 51)
+    }
+    pub(crate) fn __reduce157<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // LParen = "[" => ActionFn(6);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action6::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant30(__nt), __end));
+        (1, 51)
+    }
+    pub(crate) fn __reduce158<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // List<Action> = LParen, RParen => ActionFn(259);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant30(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action259::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant5(__nt), __end));
+        (2, 52)
+    }
+    pub(crate) fn __reduce159<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // List<Action> = LParen, Action+, RParen => ActionFn(260);
+        assert!(__symbols.len() >= 3);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant24(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym2.2;
+        let __nt = super::__action260::<>(input, __sym0, __sym1, __sym2);
+        __symbols.push((__start, __Symbol::Variant5(__nt), __end));
+        (3, 52)
+    }
+    pub(crate) fn __reduce160<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // List<Fact> = LParen, RParen => ActionFn(265);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant30(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action265::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant14(__nt), __end));
+        (2, 53)
+    }
+    pub(crate) fn __reduce161<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // List<Fact> = LParen, Fact+, RParen => ActionFn(266);
+        assert!(__symbols.len() >= 3);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant10(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym2.2;
+        let __nt = super::__action266::<>(input, __sym0, __sym1, __sym2);
+        __symbols.push((__start, __Symbol::Variant14(__nt), __end));
+        (3, 53)
+    }
+    pub(crate) fn __reduce162<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // List<Type> = LParen, RParen => ActionFn(277);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant30(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action277::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant31(__nt), __end));
+        (2, 54)
+    }
+    pub(crate) fn __reduce163<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // List<Type> = LParen, Type+, RParen => ActionFn(278);
+        assert!(__symbols.len() >= 3);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant20(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym2.2;
+        let __nt = super::__action278::<>(input, __sym0, __sym1, __sym2);
+        __symbols.push((__start, __Symbol::Variant31(__nt), __end));
+        (3, 54)
+    }
+    pub(crate) fn __reduce164<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Literal = Num => ActionFn(63);
+        let __sym0 = __pop_Variant33(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action63::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant32(__nt), __end));
+        (1, 55)
+    }
+    pub(crate) fn __reduce165<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Literal = F64 => ActionFn(64);
+        let __sym0 = __pop_Variant27(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action64::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant32(__nt), __end));
+        (1, 55)
+    }
+    pub(crate) fn __reduce166<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Literal = SymString => ActionFn(65);
+        let __sym0 = __pop_Variant7(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action65::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant32(__nt), __end));
+        (1, 55)
+    }
+    pub(crate) fn __reduce167<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Name = "[", Ident, "]" => ActionFn(56);
+        assert!(__symbols.len() >= 3);
+        let __sym2 = __pop_Variant0(__symbols);
+        let __sym1 = __pop_Variant7(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym2.2;
+        let __nt = super::__action56::<>(input, __sym0, __sym1, __sym2);
+        __symbols.push((__start, __Symbol::Variant7(__nt), __end));
+        (3, 56)
+    }
+    pub(crate) fn __reduce168<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // NonLetAction = LParen, "set", LParen, Ident, RParen, Expr, RParen => ActionFn(261);
+        assert!(__symbols.len() >= 7);
+        let __sym6 = __pop_Variant30(__symbols);
+        let __sym5 = __pop_Variant1(__symbols);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant7(__symbols);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym6.2;
+        let __nt = super::__action261::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6);
+        __symbols.push((__start, __Symbol::Variant23(__nt), __end));
+        (7, 57)
+    }
+    pub(crate) fn __reduce169<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // NonLetAction = LParen, "set", LParen, Ident, Expr+, RParen, Expr, RParen => ActionFn(262);
+        assert!(__symbols.len() >= 8);
+        let __sym7 = __pop_Variant30(__symbols);
+        let __sym6 = __pop_Variant1(__symbols);
+        let __sym5 = __pop_Variant30(__symbols);
+        let __sym4 = __pop_Variant18(__symbols);
+        let __sym3 = __pop_Variant7(__symbols);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym7.2;
+        let __nt = super::__action262::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7);
+        __symbols.push((__start, __Symbol::Variant23(__nt), __end));
+        (8, 57)
+    }
+    pub(crate) fn __reduce170<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // NonLetAction = LParen, "delete", LParen, Ident, RParen, RParen => ActionFn(263);
+        assert!(__symbols.len() >= 6);
+        let __sym5 = __pop_Variant30(__symbols);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant7(__symbols);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym5.2;
+        let __nt = super::__action263::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5);
+        __symbols.push((__start, __Symbol::Variant23(__nt), __end));
+        (6, 57)
+    }
+    pub(crate) fn __reduce171<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // NonLetAction = LParen, "delete", LParen, Ident, Expr+, RParen, RParen => ActionFn(264);
+        assert!(__symbols.len() >= 7);
+        let __sym6 = __pop_Variant30(__symbols);
+        let __sym5 = __pop_Variant30(__symbols);
+        let __sym4 = __pop_Variant18(__symbols);
+        let __sym3 = __pop_Variant7(__symbols);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym6.2;
+        let __nt = super::__action264::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6);
+        __symbols.push((__start, __Symbol::Variant23(__nt), __end));
+        (7, 57)
+    }
+    pub(crate) fn __reduce172<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // NonLetAction = LParen, "union", Expr, Expr, RParen => ActionFn(49);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant1(__symbols);
+        let __sym2 = __pop_Variant1(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action49::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant23(__nt), __end));
+        (5, 57)
+    }
+    pub(crate) fn __reduce173<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // NonLetAction = LParen, "panic", String, RParen => ActionFn(50);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant3(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action50::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant23(__nt), __end));
+        (4, 57)
+    }
+    pub(crate) fn __reduce174<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // NonLetAction = LParen, "extract", Expr, RParen => ActionFn(51);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant1(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action51::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant23(__nt), __end));
+        (4, 57)
+    }
+    pub(crate) fn __reduce175<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // NonLetAction = LParen, "extract", Expr, Expr, RParen => ActionFn(52);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant1(__symbols);
+        let __sym2 = __pop_Variant1(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action52::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant23(__nt), __end));
+        (5, 57)
+    }
+    pub(crate) fn __reduce176<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // NonLetAction = CallExpr => ActionFn(53);
+        let __sym0 = __pop_Variant1(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action53::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant23(__nt), __end));
+        (1, 57)
+    }
+    pub(crate) fn __reduce177<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Num = r#"(-)?[0-9]+"# => ActionFn(71);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action71::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant33(__nt), __end));
+        (1, 58)
+    }
+    pub(crate) fn __reduce178<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Program =  => ActionFn(239);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action239::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant34(__nt), __end));
+        (0, 59)
+    }
+    pub(crate) fn __reduce179<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Program = (Command)+ => ActionFn(240);
+        let __sym0 = __pop_Variant17(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action240::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant34(__nt), __end));
+        (1, 59)
+    }
+    pub(crate) fn __reduce180<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // RParen = ")" => ActionFn(7);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action7::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant30(__nt), __end));
+        (1, 60)
+    }
+    pub(crate) fn __reduce181<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // RParen = "]" => ActionFn(8);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action8::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant30(__nt), __end));
+        (1, 60)
+    }
+    pub(crate) fn __reduce182<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Schedule = LParen, "saturate", RParen => ActionFn(271);
+        assert!(__symbols.len() >= 3);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym2.2;
+        let __nt = super::__action271::<>(input, __sym0, __sym1, __sym2);
+        __symbols.push((__start, __Symbol::Variant35(__nt), __end));
+        (3, 61)
+    }
+    pub(crate) fn __reduce183<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Schedule = LParen, "saturate", Schedule+, RParen => ActionFn(272);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant36(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action272::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant35(__nt), __end));
+        (4, 61)
+    }
+    pub(crate) fn __reduce184<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Schedule = LParen, "seq", RParen => ActionFn(273);
+        assert!(__symbols.len() >= 3);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym2.2;
+        let __nt = super::__action273::<>(input, __sym0, __sym1, __sym2);
+        __symbols.push((__start, __Symbol::Variant35(__nt), __end));
+        (3, 61)
+    }
+    pub(crate) fn __reduce185<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Schedule = LParen, "seq", Schedule+, RParen => ActionFn(274);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant36(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action274::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant35(__nt), __end));
+        (4, 61)
+    }
+    pub(crate) fn __reduce186<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Schedule = LParen, "repeat", UNum, RParen => ActionFn(275);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant12(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action275::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant35(__nt), __end));
+        (4, 61)
+    }
+    pub(crate) fn __reduce187<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Schedule = LParen, "repeat", UNum, Schedule+, RParen => ActionFn(276);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant36(__symbols);
+        let __sym2 = __pop_Variant12(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action276::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant35(__nt), __end));
+        (5, 61)
+    }
+    pub(crate) fn __reduce188<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Schedule = LParen, "run", ":until", RParen => ActionFn(219);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant0(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action219::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant35(__nt), __end));
+        (4, 61)
+    }
+    pub(crate) fn __reduce189<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Schedule = LParen, "run", ":until", (Fact)+, RParen => ActionFn(220);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant10(__symbols);
+        let __sym2 = __pop_Variant0(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action220::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant35(__nt), __end));
+        (5, 61)
+    }
+    pub(crate) fn __reduce190<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Schedule = LParen, "run", RParen => ActionFn(221);
+        assert!(__symbols.len() >= 3);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym2.2;
+        let __nt = super::__action221::<>(input, __sym0, __sym1, __sym2);
+        __symbols.push((__start, __Symbol::Variant35(__nt), __end));
+        (3, 61)
+    }
+    pub(crate) fn __reduce191<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Schedule = LParen, "run", Ident, ":until", RParen => ActionFn(222);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant0(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action222::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant35(__nt), __end));
+        (5, 61)
+    }
+    pub(crate) fn __reduce192<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Schedule = LParen, "run", Ident, ":until", (Fact)+, RParen => ActionFn(223);
+        assert!(__symbols.len() >= 6);
+        let __sym5 = __pop_Variant30(__symbols);
+        let __sym4 = __pop_Variant10(__symbols);
+        let __sym3 = __pop_Variant0(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym5.2;
+        let __nt = super::__action223::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5);
+        __symbols.push((__start, __Symbol::Variant35(__nt), __end));
+        (6, 61)
+    }
+    pub(crate) fn __reduce193<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Schedule = LParen, "run", Ident, RParen => ActionFn(224);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action224::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant35(__nt), __end));
+        (4, 61)
+    }
+    pub(crate) fn __reduce194<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Schedule = Ident => ActionFn(44);
+        let __sym0 = __pop_Variant7(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action44::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant35(__nt), __end));
+        (1, 61)
+    }
+    pub(crate) fn __reduce195<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Schedule* =  => ActionFn(87);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action87::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant36(__nt), __end));
+        (0, 62)
+    }
+    pub(crate) fn __reduce196<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Schedule* = Schedule+ => ActionFn(88);
+        let __sym0 = __pop_Variant36(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action88::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant36(__nt), __end));
+        (1, 62)
+    }
+    pub(crate) fn __reduce197<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Schedule+ = Schedule => ActionFn(151);
+        let __sym0 = __pop_Variant35(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action151::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant36(__nt), __end));
+        (1, 63)
+    }
+    pub(crate) fn __reduce198<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Schedule+ = Schedule+, Schedule => ActionFn(152);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant35(__symbols);
+        let __sym0 = __pop_Variant36(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action152::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant36(__nt), __end));
+        (2, 63)
+    }
+    pub(crate) fn __reduce199<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Schema = List<Type>, Type => ActionFn(59);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant7(__symbols);
+        let __sym0 = __pop_Variant31(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action59::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant37(__nt), __end));
+        (2, 64)
+    }
+    pub(crate) fn __reduce200<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // String = r#"(\"[^\"]*\")+"# => ActionFn(79);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action79::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant3(__nt), __end));
+        (1, 65)
+    }
+    pub(crate) fn __reduce201<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // SymString = String => ActionFn(78);
+        let __sym0 = __pop_Variant3(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action78::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant7(__nt), __end));
+        (1, 66)
+    }
+    pub(crate) fn __reduce202<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Type = Ident => ActionFn(69);
+        let __sym0 = __pop_Variant7(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action69::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant7(__nt), __end));
+        (1, 67)
+    }
+    pub(crate) fn __reduce203<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Type* =  => ActionFn(143);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action143::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant20(__nt), __end));
+        (0, 68)
+    }
+    pub(crate) fn __reduce204<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Type* = Type+ => ActionFn(144);
+        let __sym0 = __pop_Variant20(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action144::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant20(__nt), __end));
+        (1, 68)
+    }
+    pub(crate) fn __reduce205<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Type+ = Type => ActionFn(157);
+        let __sym0 = __pop_Variant7(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action157::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant20(__nt), __end));
+        (1, 69)
+    }
+    pub(crate) fn __reduce206<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Type+ = Type+, Type => ActionFn(158);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant7(__symbols);
+        let __sym0 = __pop_Variant20(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action158::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant20(__nt), __end));
+        (2, 69)
+    }
+    pub(crate) fn __reduce207<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // UNum = Num => ActionFn(72);
+        let __sym0 = __pop_Variant33(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action72::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant12(__nt), __end));
+        (1, 70)
+    }
+    pub(crate) fn __reduce208<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // UNum? = UNum => ActionFn(85);
+        let __sym0 = __pop_Variant12(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action85::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant13(__nt), __end));
+        (1, 71)
+    }
+    pub(crate) fn __reduce209<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // UNum? =  => ActionFn(86);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action86::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant13(__nt), __end));
+        (0, 71)
+    }
+    pub(crate) fn __reduce210<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Variant = LParen, Ident, Cost, RParen => ActionFn(253);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant25(__symbols);
+        let __sym1 = __pop_Variant7(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action253::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant21(__nt), __end));
+        (4, 72)
+    }
+    pub(crate) fn __reduce211<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Variant = LParen, Ident, (Type)+, Cost, RParen => ActionFn(254);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant25(__symbols);
+        let __sym2 = __pop_Variant20(__symbols);
+        let __sym1 = __pop_Variant7(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action254::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant21(__nt), __end));
+        (5, 72)
+    }
+    pub(crate) fn __reduce212<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // __Action = Action => ActionFn(1);
+        let __sym0 = __pop_Variant23(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action1::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant23(__nt), __end));
+        (1, 73)
+    }
+    pub(crate) fn __reduce214<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // __Fact = Fact => ActionFn(2);
+        let __sym0 = __pop_Variant19(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action2::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant19(__nt), __end));
+        (1, 75)
+    }
+    pub(crate) fn __reduce215<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // __Program = Program => ActionFn(0);
+        let __sym0 = __pop_Variant34(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action0::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant34(__nt), __end));
+        (1, 76)
+    }
+}
+pub use self::__parse__Expr::ExprParser;
+
+#[rustfmt::skip]
+#[allow(non_snake_case, non_camel_case_types, unused_mut, unused_variables, unused_imports, unused_parens, clippy::all)]
+mod __parse__Fact {
+
+    use crate::ast::*;
+    use crate::Symbol;
+    use crate::Schedule;
+    use ordered_float::OrderedFloat;
+    #[allow(unused_extern_crates)]
+    extern crate lalrpop_util as __lalrpop_util;
+    #[allow(unused_imports)]
+    use self::__lalrpop_util::state_machine as __state_machine;
+    extern crate core;
+    extern crate alloc;
+    use self::__lalrpop_util::lexer::Token;
+    #[allow(dead_code)]
+    pub(crate) enum __Symbol<'input>
+     {
+        Variant0(&'input str),
+        Variant1(Expr),
+        Variant2(core::option::Option<Expr>),
+        Variant3(String),
+        Variant4(core::option::Option<String>),
+        Variant5(Vec<Action>),
+        Variant6(core::option::Option<Vec<Action>>),
+        Variant7(Symbol),
+        Variant8(core::option::Option<Symbol>),
+        Variant9(core::option::Option<&'input str>),
+        Variant10(alloc::vec::Vec<Fact>),
+        Variant11(core::option::Option<alloc::vec::Vec<Fact>>),
+        Variant12(usize),
+        Variant13(core::option::Option<usize>),
+        Variant14(Vec<Fact>),
+        Variant15(core::option::Option<Vec<Fact>>),
+        Variant16(Command),
+        Variant17(alloc::vec::Vec<Command>),
+        Variant18(alloc::vec::Vec<Expr>),
+        Variant19(Fact),
+        Variant20(alloc::vec::Vec<Symbol>),
+        Variant21(Variant),
+        Variant22(alloc::vec::Vec<Variant>),
+        Variant23(Action),
+        Variant24(alloc::vec::Vec<Action>),
+        Variant25(Option<usize>),
+        Variant26(Vec<Expr>),
+        Variant27(OrderedFloat<f64>),
+        Variant28(IdentSort),
+        Variant29(alloc::vec::Vec<IdentSort>),
+        Variant30(()),
+        Variant31(Vec<Symbol>),
+        Variant32(Literal),
+        Variant33(i64),
+        Variant34(Vec<Command>),
+        Variant35(Schedule),
+        Variant36(alloc::vec::Vec<Schedule>),
+        Variant37(Schema),
+    }
+    const __ACTION: &[i16] = &[
+        // State 0
+        18, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 24, 25, 26,
+        // State 1
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0,
+        // State 2
+        18, 29, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 24, 25, 26,
+        // State 3
+        18, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 24, 25, 26,
+        // State 4
+        18, 29, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 24, 25, 26,
+        // State 5
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0,
+        // State 6
+        18, 0, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 24, 25, 26,
+        // State 7
+        -138, 29, -138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -138, -138, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -138, -138, -138, -138,
+        // State 8
+        -134, -134, -134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -134, -134, -134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -134, -134, -134, -134,
+        // State 9
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 10
+        -166, -166, -166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -166, -166, -166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -166, -166, -166, -166,
+        // State 11
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 12
+        -133, -133, -133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -133, -133, -133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -133, -133, -133, -133,
+        // State 13
+        -132, -132, -132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -132, -132, -132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -132, -132, -132, -132,
+        // State 14
+        -165, -165, -165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -165, -165, -165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -165, -165, -165, -165,
+        // State 15
+        -202, -202, -202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -202, -202, -202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -202, -202, -202, -202,
+        // State 16
+        -167, -167, -167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -167, -167, -167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -167, -167, -167, -167,
+        // State 17
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -157, 0, 0,
+        // State 18
+        -144, -144, -144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -144, -144, -144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -144, -144, -144, -144,
+        // State 19
+        -141, -141, -141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -141, -141, -141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -141, -141, -141, -141,
+        // State 20
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -158, 0, 0,
+        // State 21
+        -143, -143, -143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -143, -143, -143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -143, -143, -143, -143,
+        // State 22
+        -201, -201, -201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -201, -201, -201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -201, -201, -201, -201,
+        // State 23
+        -151, -151, -151, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -151, -151, -151, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -151, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -151, -151, -151, -151,
+        // State 24
+        -178, -178, -178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -178, -178, -178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -178, -178, -178, -178,
+        // State 25
+        -142, -142, -142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -142, -142, -142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -142, -142, -142, -142,
+        // State 26
+        -38, -38, -38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -38, -38, -38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -38, -38, -38, -38,
+        // State 27
+        -61, -61, -61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -61, -61, -61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -61, -61, -61, -61,
+        // State 28
+        -181, -181, -181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -181, -181, -181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -181, -181, -181, -181,
+        // State 29
+        -182, -182, -182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -182, -182, -182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -182, -182, -182, -182,
+        // State 30
+        -137, 0, -137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -137, -137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -137, -137, -137, -137,
+        // State 31
+        -39, -39, -39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -39, -39, -39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -39, -39, -39, -39,
+        // State 32
+        -62, -62, -62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -62, -62, -62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -62, -62, -62, -62,
+        // State 33
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    ];
+    fn __action(state: i16, integer: usize) -> i16 {
+        __ACTION[(state as usize) * 57 + integer]
+    }
+    const __EOF_ACTION: &[i16] = &[
+        // State 0
+        0,
+        // State 1
+        0,
+        // State 2
+        0,
+        // State 3
+        0,
+        // State 4
+        0,
+        // State 5
+        0,
+        // State 6
+        0,
+        // State 7
+        0,
+        // State 8
+        -134,
+        // State 9
+        -146,
+        // State 10
+        -166,
+        // State 11
+        -215,
+        // State 12
+        -133,
+        // State 13
+        -132,
+        // State 14
+        -165,
+        // State 15
+        -202,
+        // State 16
+        -167,
+        // State 17
+        0,
+        // State 18
+        -144,
+        // State 19
+        -141,
+        // State 20
+        0,
+        // State 21
+        -143,
+        // State 22
+        -201,
+        // State 23
+        -151,
+        // State 24
+        -178,
+        // State 25
+        -142,
+        // State 26
+        0,
+        // State 27
+        -61,
+        // State 28
+        -181,
+        // State 29
+        -182,
+        // State 30
+        0,
+        // State 31
+        0,
+        // State 32
+        -62,
+        // State 33
+        -145,
+    ];
+    fn __goto(state: i16, nt: usize) -> i16 {
+        match nt {
+            23 => 4,
+            36 => 8,
+            39 => match state {
+                0 => 9,
+                2 => 26,
+                3 => 30,
+                4 => 31,
+                _ => 7,
+            },
+            41 => 6,
+            43 => 10,
+            44 => 11,
+            47 => match state {
+                1 | 5 => 2,
+                _ => 12,
+            },
+            51 => match state {
+                0 => 1,
+                _ => 5,
+            },
+            55 => 13,
+            58 => 14,
+            60 => match state {
+                4 => 32,
+                7 => 33,
+                _ => 27,
+            },
+            65 => 15,
+            66 => 16,
+            _ => 0,
+        }
+    }
+    const __TERMINAL: &[&str] = &[
+        r###""(""###,
+        r###"")""###,
+        r###""-inf""###,
+        r###"":cost""###,
+        r###"":default""###,
+        r###"":merge""###,
+        r###"":name""###,
+        r###"":on_merge""###,
+        r###"":ruleset""###,
+        r###"":unextractable""###,
+        r###"":until""###,
+        r###"":variants""###,
+        r###"":when""###,
+        r###""=""###,
+        r###""NaN""###,
+        r###""[""###,
+        r###""]""###,
+        r###""add-ruleset""###,
+        r###""birewrite""###,
+        r###""calc""###,
+        r###""check""###,
+        r###""check-proof""###,
+        r###""datatype""###,
+        r###""declare""###,
+        r###""delete""###,
+        r###""extract""###,
+        r###""fail""###,
+        r###""function""###,
+        r###""include""###,
+        r###""inf""###,
+        r###""input""###,
+        r###""let""###,
+        r###""output""###,
+        r###""panic""###,
+        r###""pop""###,
+        r###""print-size""###,
+        r###""print-table""###,
+        r###""push""###,
+        r###""query-extract""###,
+        r###""relation""###,
+        r###""repeat""###,
+        r###""rewrite""###,
+        r###""rule""###,
+        r###""ruleset""###,
+        r###""run""###,
+        r###""run-schedule""###,
+        r###""saturate""###,
+        r###""seq""###,
+        r###""set""###,
+        r###""set-option""###,
+        r###""simplify""###,
+        r###""sort""###,
+        r###""union""###,
+        r###"r#"(\"[^\"]*\")+"#"###,
+        r###"r#"(([[:alpha:]][\\w-]*)|([-+*/?!=<>&|^/%_]))+"#"###,
+        r###"r#"(-)?[0-9]+"#"###,
+        r###"r#"(-)?[0-9]+\\.[0-9]+(e(\\+)?(-)?[0-9]+)?"#"###,
+    ];
+    fn __expected_tokens(__state: i16) -> alloc::vec::Vec<alloc::string::String> {
+        __TERMINAL.iter().enumerate().filter_map(|(index, terminal)| {
+            let next_state = __action(__state, index);
+            if next_state == 0 {
+                None
+            } else {
+                Some(alloc::string::ToString::to_string(terminal))
+            }
+        }).collect()
+    }
+    fn __expected_tokens_from_states<
+        'input,
+    >(
+        __states: &[i16],
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> alloc::vec::Vec<alloc::string::String>
+    {
+        __TERMINAL.iter().enumerate().filter_map(|(index, terminal)| {
+            if __accepts(None, __states, Some(index), core::marker::PhantomData::<(&())>) {
+                Some(alloc::string::ToString::to_string(terminal))
+            } else {
+                None
+            }
+        }).collect()
+    }
+    pub(crate) struct __StateMachine<'input>
+    where 
+    {
+        input: &'input str,
+        __phantom: core::marker::PhantomData<(&'input ())>,
+    }
+    impl<'input> __state_machine::ParserDefinition for __StateMachine<'input>
+    where 
+    {
+        type Location = usize;
+        type Error = String;
+        type Token = Token<'input>;
+        type TokenIndex = usize;
+        type Symbol = __Symbol<'input>;
+        type Success = Fact;
+        type StateIndex = i16;
+        type Action = i16;
+        type ReduceIndex = i16;
+        type NonterminalIndex = usize;
+
+        #[inline]
+        fn start_location(&self) -> Self::Location {
+              Default::default()
+        }
+
+        #[inline]
+        fn start_state(&self) -> Self::StateIndex {
+              0
+        }
+
+        #[inline]
+        fn token_to_index(&self, token: &Self::Token) -> Option<usize> {
+            __token_to_integer(token, core::marker::PhantomData::<(&())>)
+        }
+
+        #[inline]
+        fn action(&self, state: i16, integer: usize) -> i16 {
+            __action(state, integer)
+        }
+
+        #[inline]
+        fn error_action(&self, state: i16) -> i16 {
+            __action(state, 57 - 1)
+        }
+
+        #[inline]
+        fn eof_action(&self, state: i16) -> i16 {
+            __EOF_ACTION[state as usize]
+        }
+
+        #[inline]
+        fn goto(&self, state: i16, nt: usize) -> i16 {
+            __goto(state, nt)
+        }
+
+        fn token_to_symbol(&self, token_index: usize, token: Self::Token) -> Self::Symbol {
+            __token_to_symbol(token_index, token, core::marker::PhantomData::<(&())>)
+        }
+
+        fn expected_tokens(&self, state: i16) -> alloc::vec::Vec<alloc::string::String> {
+            __expected_tokens(state)
+        }
+
+        fn expected_tokens_from_states(&self, states: &[i16]) -> alloc::vec::Vec<alloc::string::String> {
+            __expected_tokens_from_states(states, core::marker::PhantomData::<(&())>)
+        }
+
+        #[inline]
+        fn uses_error_recovery(&self) -> bool {
+            false
+        }
+
+        #[inline]
+        fn error_recovery_symbol(
+            &self,
+            recovery: __state_machine::ErrorRecovery<Self>,
+        ) -> Self::Symbol {
+            panic!("error recovery not enabled for this grammar")
+        }
+
+        fn reduce(
+            &mut self,
+            action: i16,
+            start_location: Option<&Self::Location>,
+            states: &mut alloc::vec::Vec<i16>,
+            symbols: &mut alloc::vec::Vec<__state_machine::SymbolTriple<Self>>,
+        ) -> Option<__state_machine::ParseResult<Self>> {
+            __reduce(
+                self.input,
+                action,
+                start_location,
+                states,
+                symbols,
+                core::marker::PhantomData::<(&())>,
+            )
+        }
+
+        fn simulate_reduce(&self, action: i16) -> __state_machine::SimulatedReduce<Self> {
+            __simulate_reduce(action, core::marker::PhantomData::<(&())>)
+        }
+    }
+    fn __token_to_integer<
+        'input,
+    >(
+        __token: &Token<'input>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> Option<usize>
+    {
+        match *__token {
+            Token(4, _) if true => Some(0),
+            Token(5, _) if true => Some(1),
+            Token(6, _) if true => Some(2),
+            Token(7, _) if true => Some(3),
+            Token(8, _) if true => Some(4),
+            Token(9, _) if true => Some(5),
+            Token(10, _) if true => Some(6),
+            Token(11, _) if true => Some(7),
+            Token(12, _) if true => Some(8),
+            Token(13, _) if true => Some(9),
+            Token(14, _) if true => Some(10),
+            Token(15, _) if true => Some(11),
+            Token(16, _) if true => Some(12),
+            Token(17, _) if true => Some(13),
+            Token(18, _) if true => Some(14),
+            Token(19, _) if true => Some(15),
+            Token(20, _) if true => Some(16),
+            Token(21, _) if true => Some(17),
+            Token(22, _) if true => Some(18),
+            Token(23, _) if true => Some(19),
+            Token(24, _) if true => Some(20),
+            Token(25, _) if true => Some(21),
+            Token(26, _) if true => Some(22),
+            Token(27, _) if true => Some(23),
+            Token(28, _) if true => Some(24),
+            Token(29, _) if true => Some(25),
+            Token(30, _) if true => Some(26),
+            Token(31, _) if true => Some(27),
+            Token(32, _) if true => Some(28),
+            Token(33, _) if true => Some(29),
+            Token(34, _) if true => Some(30),
+            Token(35, _) if true => Some(31),
+            Token(36, _) if true => Some(32),
+            Token(37, _) if true => Some(33),
+            Token(38, _) if true => Some(34),
+            Token(39, _) if true => Some(35),
+            Token(40, _) if true => Some(36),
+            Token(41, _) if true => Some(37),
+            Token(42, _) if true => Some(38),
+            Token(43, _) if true => Some(39),
+            Token(44, _) if true => Some(40),
+            Token(45, _) if true => Some(41),
+            Token(46, _) if true => Some(42),
+            Token(47, _) if true => Some(43),
+            Token(48, _) if true => Some(44),
+            Token(49, _) if true => Some(45),
+            Token(50, _) if true => Some(46),
+            Token(51, _) if true => Some(47),
+            Token(52, _) if true => Some(48),
+            Token(53, _) if true => Some(49),
+            Token(54, _) if true => Some(50),
+            Token(55, _) if true => Some(51),
+            Token(56, _) if true => Some(52),
+            Token(0, _) if true => Some(53),
+            Token(1, _) if true => Some(54),
+            Token(2, _) if true => Some(55),
+            Token(3, _) if true => Some(56),
+            _ => None,
+        }
+    }
+    fn __token_to_symbol<
+        'input,
+    >(
+        __token_index: usize,
+        __token: Token<'input>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> __Symbol<'input>
+    {
+        match __token_index {
+            0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 => match __token {
+                Token(4, __tok0) | Token(5, __tok0) | Token(6, __tok0) | Token(7, __tok0) | Token(8, __tok0) | Token(9, __tok0) | Token(10, __tok0) | Token(11, __tok0) | Token(12, __tok0) | Token(13, __tok0) | Token(14, __tok0) | Token(15, __tok0) | Token(16, __tok0) | Token(17, __tok0) | Token(18, __tok0) | Token(19, __tok0) | Token(20, __tok0) | Token(21, __tok0) | Token(22, __tok0) | Token(23, __tok0) | Token(24, __tok0) | Token(25, __tok0) | Token(26, __tok0) | Token(27, __tok0) | Token(28, __tok0) | Token(29, __tok0) | Token(30, __tok0) | Token(31, __tok0) | Token(32, __tok0) | Token(33, __tok0) | Token(34, __tok0) | Token(35, __tok0) | Token(36, __tok0) | Token(37, __tok0) | Token(38, __tok0) | Token(39, __tok0) | Token(40, __tok0) | Token(41, __tok0) | Token(42, __tok0) | Token(43, __tok0) | Token(44, __tok0) | Token(45, __tok0) | Token(46, __tok0) | Token(47, __tok0) | Token(48, __tok0) | Token(49, __tok0) | Token(50, __tok0) | Token(51, __tok0) | Token(52, __tok0) | Token(53, __tok0) | Token(54, __tok0) | Token(55, __tok0) | Token(56, __tok0) | Token(0, __tok0) | Token(1, __tok0) | Token(2, __tok0) | Token(3, __tok0) if true => __Symbol::Variant0(__tok0),
+                _ => unreachable!(),
+            },
+            _ => unreachable!(),
+        }
+    }
+    fn __simulate_reduce<
+        'input,
+    >(
+        __reduce_index: i16,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> __state_machine::SimulatedReduce<__StateMachine<'input>>
+    {
+        match __reduce_index {
+            0 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 0,
+                }
+            }
+            1 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 1,
+                }
+            }
+            2 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 1,
+                }
+            }
+            3 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 2,
+                }
+            }
+            4 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 3,
+                }
+            }
+            5 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 3,
+                }
+            }
+            6 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 4,
+                }
+            }
+            7 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 5,
+                }
+            }
+            8 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 5,
+                }
+            }
+            9 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 6,
+                }
+            }
+            10 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 7,
+                }
+            }
+            11 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 7,
+                }
+            }
+            12 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 8,
+                }
+            }
+            13 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 9,
+                }
+            }
+            14 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 9,
+                }
+            }
+            15 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 10,
+                }
+            }
+            16 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 11,
+                }
+            }
+            17 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 11,
+                }
+            }
+            18 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 12,
+                }
+            }
+            19 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 12,
+                }
+            }
+            20 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 13,
+                }
+            }
+            21 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 13,
+                }
+            }
+            22 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 13,
+                }
+            }
+            23 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 14,
+                }
+            }
+            24 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 15,
+                }
+            }
+            25 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 15,
+                }
+            }
+            26 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 16,
+                }
+            }
+            27 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 17,
+                }
+            }
+            28 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 17,
+                }
+            }
+            29 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 18,
+                }
+            }
+            30 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 19,
+                }
+            }
+            31 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 19,
+                }
+            }
+            32 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 20,
+                }
+            }
+            33 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 20,
+                }
+            }
+            34 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 21,
+                }
+            }
+            35 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 22,
+                }
+            }
+            36 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 22,
+                }
+            }
+            37 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 23,
+                }
+            }
+            38 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 23,
+                }
+            }
+            39 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 24,
+                }
+            }
+            40 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 25,
+                }
+            }
+            41 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 25,
+                }
+            }
+            42 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 26,
+                }
+            }
+            43 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 26,
+                }
+            }
+            44 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 27,
+                }
+            }
+            45 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 28,
+                }
+            }
+            46 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 28,
+                }
+            }
+            47 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 29,
+                }
+            }
+            48 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 29,
+                }
+            }
+            49 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 30,
+                }
+            }
+            50 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 31,
+                }
+            }
+            51 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 31,
+                }
+            }
+            52 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 32,
+                }
+            }
+            53 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 32,
+                }
+            }
+            54 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 33,
+                }
+            }
+            55 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 33,
+                }
+            }
+            56 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 34,
+                }
+            }
+            57 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 34,
+                }
+            }
+            58 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 35,
+                }
+            }
+            59 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 35,
+                }
+            }
+            60 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 3,
+                    nonterminal_produced: 36,
+                }
+            }
+            61 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 36,
+                }
+            }
+            62 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 37,
+                }
+            }
+            63 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 37,
+                }
+            }
+            64 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 37,
+                }
+            }
+            65 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 7,
+                    nonterminal_produced: 37,
+                }
+            }
+            66 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 8,
+                    nonterminal_produced: 37,
+                }
+            }
+            67 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 37,
+                }
+            }
+            68 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 13,
+                    nonterminal_produced: 37,
+                }
+            }
+            69 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 12,
+                    nonterminal_produced: 37,
+                }
+            }
+            70 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 11,
+                    nonterminal_produced: 37,
+                }
+            }
+            71 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 10,
+                    nonterminal_produced: 37,
+                }
+            }
+            72 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 11,
+                    nonterminal_produced: 37,
+                }
+            }
+            73 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 10,
+                    nonterminal_produced: 37,
+                }
+            }
+            74 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 9,
+                    nonterminal_produced: 37,
+                }
+            }
+            75 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 8,
+                    nonterminal_produced: 37,
+                }
+            }
+            76 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 11,
+                    nonterminal_produced: 37,
+                }
+            }
+            77 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 10,
+                    nonterminal_produced: 37,
+                }
+            }
+            78 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 9,
+                    nonterminal_produced: 37,
+                }
+            }
+            79 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 8,
+                    nonterminal_produced: 37,
+                }
+            }
+            80 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 9,
+                    nonterminal_produced: 37,
+                }
+            }
+            81 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 8,
+                    nonterminal_produced: 37,
+                }
+            }
+            82 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 7,
+                    nonterminal_produced: 37,
+                }
+            }
+            83 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 6,
+                    nonterminal_produced: 37,
+                }
+            }
+            84 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 37,
+                }
+            }
+            85 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 37,
+                }
+            }
+            86 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 37,
+                }
+            }
+            87 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 9,
+                    nonterminal_produced: 37,
+                }
+            }
+            88 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 7,
+                    nonterminal_produced: 37,
+                }
+            }
+            89 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 7,
+                    nonterminal_produced: 37,
+                }
+            }
+            90 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 37,
+                }
+            }
+            91 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 9,
+                    nonterminal_produced: 37,
+                }
+            }
+            92 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 7,
+                    nonterminal_produced: 37,
+                }
+            }
+            93 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 7,
+                    nonterminal_produced: 37,
+                }
+            }
+            94 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 37,
+                }
+            }
+            95 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 9,
+                    nonterminal_produced: 37,
+                }
+            }
+            96 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 7,
+                    nonterminal_produced: 37,
+                }
+            }
+            97 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 7,
+                    nonterminal_produced: 37,
+                }
+            }
+            98 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 37,
+                }
+            }
+            99 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 37,
+                }
+            }
+            100 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 37,
+                }
+            }
+            101 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 37,
+                }
+            }
+            102 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 6,
+                    nonterminal_produced: 37,
+                }
+            }
+            103 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 37,
+                }
+            }
+            104 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 6,
+                    nonterminal_produced: 37,
+                }
+            }
+            105 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 7,
+                    nonterminal_produced: 37,
+                }
+            }
+            106 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 37,
+                }
+            }
+            107 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 37,
+                }
+            }
+            108 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 37,
+                }
+            }
+            109 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 6,
+                    nonterminal_produced: 37,
+                }
+            }
+            110 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 7,
+                    nonterminal_produced: 37,
+                }
+            }
+            111 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 6,
+                    nonterminal_produced: 37,
+                }
+            }
+            112 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 37,
+                }
+            }
+            113 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 3,
+                    nonterminal_produced: 37,
+                }
+            }
+            114 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 37,
+                }
+            }
+            115 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 3,
+                    nonterminal_produced: 37,
+                }
+            }
+            116 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 3,
+                    nonterminal_produced: 37,
+                }
+            }
+            117 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 37,
+                }
+            }
+            118 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 37,
+                }
+            }
+            119 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 3,
+                    nonterminal_produced: 37,
+                }
+            }
+            120 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 37,
+                }
+            }
+            121 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 3,
+                    nonterminal_produced: 37,
+                }
+            }
+            122 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 37,
+                }
+            }
+            123 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 37,
+                }
+            }
+            124 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 37,
+                }
+            }
+            125 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 37,
+                }
+            }
+            126 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 37,
+                }
+            }
+            127 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 37,
+                }
+            }
+            128 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 37,
+                }
+            }
+            129 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 38,
+                }
+            }
+            130 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 38,
+                }
+            }
+            131 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 39,
+                }
+            }
+            132 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 39,
+                }
+            }
+            133 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 39,
+                }
+            }
+            134 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 40,
+                }
+            }
+            135 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 40,
+                }
+            }
+            136 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 41,
+                }
+            }
+            137 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 41,
+                }
+            }
+            138 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 42,
+                }
+            }
+            139 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 3,
+                    nonterminal_produced: 42,
+                }
+            }
+            140 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 43,
+                }
+            }
+            141 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 43,
+                }
+            }
+            142 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 43,
+                }
+            }
+            143 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 43,
+                }
+            }
+            144 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 44,
+                }
+            }
+            145 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 44,
+                }
+            }
+            146 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 45,
+                }
+            }
+            147 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 45,
+                }
+            }
+            148 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 46,
+                }
+            }
+            149 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 46,
+                }
+            }
+            150 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 47,
+                }
+            }
+            151 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 48,
+                }
+            }
+            152 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 49,
+                }
+            }
+            153 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 49,
+                }
+            }
+            154 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 50,
+                }
+            }
+            155 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 50,
+                }
+            }
+            156 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 51,
+                }
+            }
+            157 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 51,
+                }
+            }
+            158 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 52,
+                }
+            }
+            159 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 3,
+                    nonterminal_produced: 52,
+                }
+            }
+            160 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 53,
+                }
+            }
+            161 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 3,
+                    nonterminal_produced: 53,
+                }
+            }
+            162 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 54,
+                }
+            }
+            163 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 3,
+                    nonterminal_produced: 54,
+                }
+            }
+            164 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 55,
+                }
+            }
+            165 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 55,
+                }
+            }
+            166 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 55,
+                }
+            }
+            167 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 3,
+                    nonterminal_produced: 56,
+                }
+            }
+            168 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 7,
+                    nonterminal_produced: 57,
+                }
+            }
+            169 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 8,
+                    nonterminal_produced: 57,
+                }
+            }
+            170 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 6,
+                    nonterminal_produced: 57,
+                }
+            }
+            171 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 7,
+                    nonterminal_produced: 57,
+                }
+            }
+            172 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 57,
+                }
+            }
+            173 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 57,
+                }
+            }
+            174 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 57,
+                }
+            }
+            175 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 57,
+                }
+            }
+            176 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 57,
+                }
+            }
+            177 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 58,
+                }
+            }
+            178 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 59,
+                }
+            }
+            179 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 59,
+                }
+            }
+            180 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 60,
+                }
+            }
+            181 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 60,
+                }
+            }
+            182 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 3,
+                    nonterminal_produced: 61,
+                }
+            }
+            183 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 61,
+                }
+            }
+            184 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 3,
+                    nonterminal_produced: 61,
+                }
+            }
+            185 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 61,
+                }
+            }
+            186 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 61,
+                }
+            }
+            187 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 61,
+                }
+            }
+            188 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 61,
+                }
+            }
+            189 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 61,
+                }
+            }
+            190 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 3,
+                    nonterminal_produced: 61,
+                }
+            }
+            191 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 61,
+                }
+            }
+            192 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 6,
+                    nonterminal_produced: 61,
+                }
+            }
+            193 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 61,
+                }
+            }
+            194 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 61,
+                }
+            }
+            195 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 62,
+                }
+            }
+            196 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 62,
+                }
+            }
+            197 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 63,
+                }
+            }
+            198 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 63,
+                }
+            }
+            199 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 64,
+                }
+            }
+            200 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 65,
+                }
+            }
+            201 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 66,
+                }
+            }
+            202 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 67,
+                }
+            }
+            203 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 68,
+                }
+            }
+            204 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 68,
+                }
+            }
+            205 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 69,
+                }
+            }
+            206 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 69,
+                }
+            }
+            207 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 70,
+                }
+            }
+            208 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 71,
+                }
+            }
+            209 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 71,
+                }
+            }
+            210 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 72,
+                }
+            }
+            211 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 72,
+                }
+            }
+            212 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 73,
+                }
+            }
+            213 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 74,
+                }
+            }
+            214 => __state_machine::SimulatedReduce::Accept,
+            215 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 76,
+                }
+            }
+            _ => panic!("invalid reduction index {}", __reduce_index)
+        }
+    }
+    pub struct FactParser {
+        builder: __lalrpop_util::lexer::MatcherBuilder,
+        _priv: (),
+    }
+
+    impl FactParser {
+        pub fn new() -> FactParser {
+            let __builder = super::__intern_token::new_builder();
+            FactParser {
+                builder: __builder,
+                _priv: (),
+            }
+        }
+
+        #[allow(dead_code)]
+        pub fn parse<
+            'input,
+        >(
+            &self,
+            input: &'input str,
+        ) -> Result<Fact, __lalrpop_util::ParseError<usize, Token<'input>, String>>
+        {
+            let mut __tokens = self.builder.matcher(input);
+            __state_machine::Parser::drive(
+                __StateMachine {
+                    input,
+                    __phantom: core::marker::PhantomData::<(&())>,
+                },
+                __tokens,
+            )
+        }
+    }
+    fn __accepts<
+        'input,
+    >(
+        __error_state: Option<i16>,
+        __states: &[i16],
+        __opt_integer: Option<usize>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> bool
+    {
+        let mut __states = __states.to_vec();
+        __states.extend(__error_state);
+        loop {
+            let mut __states_len = __states.len();
+            let __top = __states[__states_len - 1];
+            let __action = match __opt_integer {
+                None => __EOF_ACTION[__top as usize],
+                Some(__integer) => __action(__top, __integer),
+            };
+            if __action == 0 { return false; }
+            if __action > 0 { return true; }
+            let (__to_pop, __nt) = match __simulate_reduce(-(__action + 1), core::marker::PhantomData::<(&())>) {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop, nonterminal_produced
+                } => (states_to_pop, nonterminal_produced),
+                __state_machine::SimulatedReduce::Accept => return true,
+            };
+            __states_len -= __to_pop;
+            __states.truncate(__states_len);
+            let __top = __states[__states_len - 1];
+            let __next_state = __goto(__top, __nt);
+            __states.push(__next_state);
+        }
+    }
+    pub(crate) fn __reduce<
+        'input,
+    >(
+        input: &'input str,
+        __action: i16,
+        __lookahead_start: Option<&usize>,
+        __states: &mut alloc::vec::Vec<i16>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> Option<Result<Fact,__lalrpop_util::ParseError<usize, Token<'input>, String>>>
+    {
+        let (__pop_states, __nonterminal) = match __action {
+            0 => {
+                __reduce0(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            1 => {
+                __reduce1(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            2 => {
+                __reduce2(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            3 => {
+                __reduce3(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            4 => {
+                __reduce4(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            5 => {
+                __reduce5(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            6 => {
+                __reduce6(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            7 => {
+                __reduce7(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            8 => {
+                __reduce8(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            9 => {
+                __reduce9(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            10 => {
+                __reduce10(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            11 => {
+                __reduce11(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            12 => {
+                __reduce12(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            13 => {
+                __reduce13(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            14 => {
+                __reduce14(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            15 => {
+                __reduce15(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            16 => {
+                __reduce16(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            17 => {
+                __reduce17(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            18 => {
+                __reduce18(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            19 => {
+                __reduce19(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            20 => {
+                __reduce20(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            21 => {
+                __reduce21(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            22 => {
+                __reduce22(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            23 => {
+                __reduce23(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            24 => {
+                __reduce24(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            25 => {
+                __reduce25(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            26 => {
+                __reduce26(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            27 => {
+                __reduce27(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            28 => {
+                __reduce28(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            29 => {
+                __reduce29(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            30 => {
+                __reduce30(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            31 => {
+                __reduce31(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            32 => {
+                __reduce32(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            33 => {
+                __reduce33(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            34 => {
+                __reduce34(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            35 => {
+                __reduce35(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            36 => {
+                __reduce36(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            37 => {
+                __reduce37(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            38 => {
+                __reduce38(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            39 => {
+                __reduce39(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            40 => {
+                __reduce40(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            41 => {
+                __reduce41(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            42 => {
+                __reduce42(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            43 => {
+                __reduce43(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            44 => {
+                __reduce44(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            45 => {
+                __reduce45(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            46 => {
+                __reduce46(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            47 => {
+                __reduce47(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            48 => {
+                __reduce48(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            49 => {
+                __reduce49(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            50 => {
+                __reduce50(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            51 => {
+                __reduce51(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            52 => {
+                __reduce52(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            53 => {
+                __reduce53(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            54 => {
+                __reduce54(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            55 => {
+                __reduce55(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            56 => {
+                __reduce56(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            57 => {
+                __reduce57(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            58 => {
+                __reduce58(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            59 => {
+                __reduce59(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            60 => {
+                __reduce60(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            61 => {
+                __reduce61(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            62 => {
+                __reduce62(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            63 => {
+                __reduce63(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            64 => {
+                __reduce64(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            65 => {
+                __reduce65(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            66 => {
+                __reduce66(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            67 => {
+                __reduce67(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            68 => {
+                __reduce68(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            69 => {
+                __reduce69(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            70 => {
+                __reduce70(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            71 => {
+                __reduce71(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            72 => {
+                __reduce72(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            73 => {
+                __reduce73(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            74 => {
+                __reduce74(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            75 => {
+                __reduce75(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            76 => {
+                __reduce76(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            77 => {
+                __reduce77(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            78 => {
+                __reduce78(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            79 => {
+                __reduce79(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            80 => {
+                __reduce80(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            81 => {
+                __reduce81(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            82 => {
+                __reduce82(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            83 => {
+                __reduce83(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            84 => {
+                __reduce84(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            85 => {
+                __reduce85(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            86 => {
+                __reduce86(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            87 => {
+                __reduce87(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            88 => {
+                __reduce88(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            89 => {
+                __reduce89(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            90 => {
+                __reduce90(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            91 => {
+                __reduce91(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            92 => {
+                __reduce92(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            93 => {
+                __reduce93(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            94 => {
+                __reduce94(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            95 => {
+                __reduce95(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            96 => {
+                __reduce96(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            97 => {
+                __reduce97(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            98 => {
+                __reduce98(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            99 => {
+                __reduce99(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            100 => {
+                __reduce100(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            101 => {
+                __reduce101(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            102 => {
+                __reduce102(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            103 => {
+                __reduce103(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            104 => {
+                __reduce104(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            105 => {
+                __reduce105(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            106 => {
+                __reduce106(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            107 => {
+                __reduce107(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            108 => {
+                __reduce108(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            109 => {
+                __reduce109(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            110 => {
+                __reduce110(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            111 => {
+                __reduce111(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            112 => {
+                __reduce112(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            113 => {
+                __reduce113(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            114 => {
+                __reduce114(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            115 => {
+                __reduce115(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            116 => {
+                __reduce116(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            117 => {
+                __reduce117(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            118 => {
+                __reduce118(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            119 => {
+                __reduce119(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            120 => {
+                __reduce120(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            121 => {
+                __reduce121(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            122 => {
+                __reduce122(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            123 => {
+                __reduce123(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            124 => {
+                __reduce124(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            125 => {
+                __reduce125(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            126 => {
+                __reduce126(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            127 => {
+                __reduce127(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            128 => {
+                __reduce128(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            129 => {
+                __reduce129(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            130 => {
+                __reduce130(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            131 => {
+                __reduce131(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            132 => {
+                __reduce132(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            133 => {
+                __reduce133(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            134 => {
+                __reduce134(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            135 => {
+                __reduce135(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            136 => {
+                __reduce136(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            137 => {
+                __reduce137(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            138 => {
+                __reduce138(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            139 => {
+                __reduce139(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            140 => {
+                __reduce140(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            141 => {
+                __reduce141(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            142 => {
+                __reduce142(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            143 => {
+                __reduce143(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            144 => {
+                __reduce144(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            145 => {
+                __reduce145(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            146 => {
+                __reduce146(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            147 => {
+                __reduce147(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            148 => {
+                __reduce148(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            149 => {
+                __reduce149(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            150 => {
+                __reduce150(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            151 => {
+                __reduce151(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            152 => {
+                __reduce152(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            153 => {
+                __reduce153(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            154 => {
+                __reduce154(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            155 => {
+                __reduce155(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            156 => {
+                __reduce156(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            157 => {
+                __reduce157(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            158 => {
+                __reduce158(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            159 => {
+                __reduce159(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            160 => {
+                __reduce160(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            161 => {
+                __reduce161(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            162 => {
+                __reduce162(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            163 => {
+                __reduce163(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            164 => {
+                __reduce164(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            165 => {
+                __reduce165(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            166 => {
+                __reduce166(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            167 => {
+                __reduce167(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            168 => {
+                __reduce168(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            169 => {
+                __reduce169(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            170 => {
+                __reduce170(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            171 => {
+                __reduce171(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            172 => {
+                __reduce172(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            173 => {
+                __reduce173(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            174 => {
+                __reduce174(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            175 => {
+                __reduce175(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            176 => {
+                __reduce176(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            177 => {
+                __reduce177(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            178 => {
+                __reduce178(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            179 => {
+                __reduce179(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            180 => {
+                __reduce180(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            181 => {
+                __reduce181(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            182 => {
+                __reduce182(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            183 => {
+                __reduce183(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            184 => {
+                __reduce184(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            185 => {
+                __reduce185(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            186 => {
+                __reduce186(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            187 => {
+                __reduce187(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            188 => {
+                __reduce188(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            189 => {
+                __reduce189(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            190 => {
+                __reduce190(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            191 => {
+                __reduce191(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            192 => {
+                __reduce192(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            193 => {
+                __reduce193(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            194 => {
+                __reduce194(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            195 => {
+                __reduce195(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            196 => {
+                __reduce196(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            197 => {
+                __reduce197(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            198 => {
+                __reduce198(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            199 => {
+                __reduce199(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            200 => {
+                __reduce200(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            201 => {
+                __reduce201(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            202 => {
+                __reduce202(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            203 => {
+                __reduce203(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            204 => {
+                __reduce204(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            205 => {
+                __reduce205(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            206 => {
+                __reduce206(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            207 => {
+                __reduce207(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            208 => {
+                __reduce208(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            209 => {
+                __reduce209(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            210 => {
+                __reduce210(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            211 => {
+                __reduce211(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            212 => {
+                __reduce212(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            213 => {
+                __reduce213(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            214 => {
+                // __Fact = Fact => ActionFn(2);
+                let __sym0 = __pop_Variant19(__symbols);
+                let __start = __sym0.0;
+                let __end = __sym0.2;
+                let __nt = super::__action2::<>(input, __sym0);
+                return Some(Ok(__nt));
+            }
+            215 => {
+                __reduce215(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            _ => panic!("invalid action code {}", __action)
+        };
+        let __states_len = __states.len();
+        __states.truncate(__states_len - __pop_states);
+        let __state = *__states.last().unwrap();
+        let __next_state = __goto(__state, __nonterminal);
+        __states.push(__next_state);
+        None
+    }
+    #[inline(never)]
+    fn __symbol_type_mismatch() -> ! {
+        panic!("symbol type mismatch")
+    }
+    fn __pop_Variant30<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, (), usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant30(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant23<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, Action, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant23(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant16<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, Command, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant16(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant1<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, Expr, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant1(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant19<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, Fact, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant19(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant28<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, IdentSort, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant28(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant32<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, Literal, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant32(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant25<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, Option<usize>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant25(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant27<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, OrderedFloat<f64>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant27(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant35<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, Schedule, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant35(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant37<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, Schema, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant37(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant3<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, String, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant3(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant7<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, Symbol, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant7(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant21<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, Variant, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant21(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant5<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, Vec<Action>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant5(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant34<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, Vec<Command>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant34(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant26<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, Vec<Expr>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant26(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant14<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, Vec<Fact>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant14(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant31<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, Vec<Symbol>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant31(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant24<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, alloc::vec::Vec<Action>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant24(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant17<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, alloc::vec::Vec<Command>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant17(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant18<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, alloc::vec::Vec<Expr>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant18(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant10<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, alloc::vec::Vec<Fact>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant10(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant29<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, alloc::vec::Vec<IdentSort>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant29(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant36<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, alloc::vec::Vec<Schedule>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant36(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant20<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, alloc::vec::Vec<Symbol>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant20(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant22<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, alloc::vec::Vec<Variant>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant22(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant2<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, core::option::Option<Expr>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant2(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant4<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, core::option::Option<String>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant4(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant8<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, core::option::Option<Symbol>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant8(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant6<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, core::option::Option<Vec<Action>>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant6(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant15<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, core::option::Option<Vec<Fact>>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant15(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant11<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, core::option::Option<alloc::vec::Vec<Fact>>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant11(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant13<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, core::option::Option<usize>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant13(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant9<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, core::option::Option<&'input str>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant9(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant33<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, i64, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant33(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant12<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, usize, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant12(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant0<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, &'input str, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant0(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    pub(crate) fn __reduce0<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":default" <Expr>) = ":default", Expr => ActionFn(115);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant1(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action115::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant1(__nt), __end));
+        (2, 0)
+    }
+    pub(crate) fn __reduce1<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":default" <Expr>)? = ":default", Expr => ActionFn(161);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant1(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action161::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant2(__nt), __end));
+        (2, 1)
+    }
+    pub(crate) fn __reduce2<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":default" <Expr>)? =  => ActionFn(114);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action114::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant2(__nt), __end));
+        (0, 1)
+    }
+    pub(crate) fn __reduce3<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":merge" <Expr>) = ":merge", Expr => ActionFn(118);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant1(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action118::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant1(__nt), __end));
+        (2, 2)
+    }
+    pub(crate) fn __reduce4<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":merge" <Expr>)? = ":merge", Expr => ActionFn(164);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant1(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action164::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant2(__nt), __end));
+        (2, 3)
+    }
+    pub(crate) fn __reduce5<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":merge" <Expr>)? =  => ActionFn(117);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action117::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant2(__nt), __end));
+        (0, 3)
+    }
+    pub(crate) fn __reduce6<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":name" <String>) = ":name", String => ActionFn(107);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant3(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action107::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant3(__nt), __end));
+        (2, 4)
+    }
+    pub(crate) fn __reduce7<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":name" <String>)? = ":name", String => ActionFn(169);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant3(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action169::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant4(__nt), __end));
+        (2, 5)
+    }
+    pub(crate) fn __reduce8<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":name" <String>)? =  => ActionFn(106);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action106::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant4(__nt), __end));
+        (0, 5)
+    }
+    pub(crate) fn __reduce9<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":on_merge" <List<Action>>) = ":on_merge", List<Action> => ActionFn(121);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant5(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action121::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant5(__nt), __end));
+        (2, 6)
+    }
+    pub(crate) fn __reduce10<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":on_merge" <List<Action>>)? = ":on_merge", List<Action> => ActionFn(172);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant5(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action172::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant6(__nt), __end));
+        (2, 7)
+    }
+    pub(crate) fn __reduce11<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":on_merge" <List<Action>>)? =  => ActionFn(120);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action120::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant6(__nt), __end));
+        (0, 7)
+    }
+    pub(crate) fn __reduce12<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":ruleset" <Ident>) = ":ruleset", Ident => ActionFn(110);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant7(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action110::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant7(__nt), __end));
+        (2, 8)
+    }
+    pub(crate) fn __reduce13<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":ruleset" <Ident>)? = ":ruleset", Ident => ActionFn(181);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant7(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action181::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant8(__nt), __end));
+        (2, 9)
+    }
+    pub(crate) fn __reduce14<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":ruleset" <Ident>)? =  => ActionFn(109);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action109::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant8(__nt), __end));
+        (0, 9)
+    }
+    pub(crate) fn __reduce15<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":unextractable") = ":unextractable" => ActionFn(125);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action125::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant0(__nt), __end));
+        (1, 10)
+    }
+    pub(crate) fn __reduce16<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":unextractable")? = ":unextractable" => ActionFn(190);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action190::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant9(__nt), __end));
+        (1, 11)
+    }
+    pub(crate) fn __reduce17<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":unextractable")? =  => ActionFn(124);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action124::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant9(__nt), __end));
+        (0, 11)
+    }
+    pub(crate) fn __reduce18<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":until" <(Fact)*>) = ":until" => ActionFn(207);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action207::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant10(__nt), __end));
+        (1, 12)
+    }
+    pub(crate) fn __reduce19<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":until" <(Fact)*>) = ":until", (Fact)+ => ActionFn(208);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant10(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action208::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant10(__nt), __end));
+        (2, 12)
+    }
+    pub(crate) fn __reduce20<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":until" <(Fact)*>)? = ":until" => ActionFn(211);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action211::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant11(__nt), __end));
+        (1, 13)
+    }
+    pub(crate) fn __reduce21<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":until" <(Fact)*>)? = ":until", (Fact)+ => ActionFn(212);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant10(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action212::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant11(__nt), __end));
+        (2, 13)
+    }
+    pub(crate) fn __reduce22<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":until" <(Fact)*>)? =  => ActionFn(97);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action97::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant11(__nt), __end));
+        (0, 13)
+    }
+    pub(crate) fn __reduce23<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":variants" <UNum>) = ":variants", UNum => ActionFn(91);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant12(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action91::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant12(__nt), __end));
+        (2, 14)
+    }
+    pub(crate) fn __reduce24<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":variants" <UNum>)? = ":variants", UNum => ActionFn(225);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant12(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action225::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant13(__nt), __end));
+        (2, 15)
+    }
+    pub(crate) fn __reduce25<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":variants" <UNum>)? =  => ActionFn(90);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action90::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant13(__nt), __end));
+        (0, 15)
+    }
+    pub(crate) fn __reduce26<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":when" <List<Fact>>) = ":when", List<Fact> => ActionFn(104);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant14(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action104::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant14(__nt), __end));
+        (2, 16)
+    }
+    pub(crate) fn __reduce27<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":when" <List<Fact>>)? = ":when", List<Fact> => ActionFn(228);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant14(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action228::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant15(__nt), __end));
+        (2, 17)
+    }
+    pub(crate) fn __reduce28<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":when" <List<Fact>>)? =  => ActionFn(103);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action103::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant15(__nt), __end));
+        (0, 17)
+    }
+    pub(crate) fn __reduce29<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Command) = Command => ActionFn(134);
+        let __sym0 = __pop_Variant16(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action134::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (1, 18)
+    }
+    pub(crate) fn __reduce30<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Command)* =  => ActionFn(132);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action132::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant17(__nt), __end));
+        (0, 19)
+    }
+    pub(crate) fn __reduce31<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Command)* = (Command)+ => ActionFn(133);
+        let __sym0 = __pop_Variant17(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action133::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant17(__nt), __end));
+        (1, 19)
+    }
+    pub(crate) fn __reduce32<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Command)+ = Command => ActionFn(237);
+        let __sym0 = __pop_Variant16(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action237::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant17(__nt), __end));
+        (1, 20)
+    }
+    pub(crate) fn __reduce33<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Command)+ = (Command)+, Command => ActionFn(238);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant16(__symbols);
+        let __sym0 = __pop_Variant17(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action238::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant17(__nt), __end));
+        (2, 20)
+    }
+    pub(crate) fn __reduce34<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Expr) = Expr => ActionFn(128);
+        let __sym0 = __pop_Variant1(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action128::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant1(__nt), __end));
+        (1, 21)
+    }
+    pub(crate) fn __reduce35<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Expr)* =  => ActionFn(126);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action126::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant18(__nt), __end));
+        (0, 22)
+    }
+    pub(crate) fn __reduce36<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Expr)* = (Expr)+ => ActionFn(127);
+        let __sym0 = __pop_Variant18(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action127::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant18(__nt), __end));
+        (1, 22)
+    }
+    pub(crate) fn __reduce37<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Expr)+ = Expr => ActionFn(241);
+        let __sym0 = __pop_Variant1(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action241::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant18(__nt), __end));
+        (1, 23)
+    }
+    pub(crate) fn __reduce38<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Expr)+ = (Expr)+, Expr => ActionFn(242);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant1(__symbols);
+        let __sym0 = __pop_Variant18(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action242::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant18(__nt), __end));
+        (2, 23)
+    }
+    pub(crate) fn __reduce39<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Fact) = Fact => ActionFn(101);
+        let __sym0 = __pop_Variant19(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action101::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant19(__nt), __end));
+        (1, 24)
+    }
+    pub(crate) fn __reduce40<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Fact)* =  => ActionFn(99);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action99::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant10(__nt), __end));
+        (0, 25)
+    }
+    pub(crate) fn __reduce41<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Fact)* = (Fact)+ => ActionFn(100);
+        let __sym0 = __pop_Variant10(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action100::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant10(__nt), __end));
+        (1, 25)
+    }
+    pub(crate) fn __reduce42<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Fact)+ = Fact => ActionFn(249);
+        let __sym0 = __pop_Variant19(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action249::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant10(__nt), __end));
+        (1, 26)
+    }
+    pub(crate) fn __reduce43<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Fact)+ = (Fact)+, Fact => ActionFn(250);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant19(__symbols);
+        let __sym0 = __pop_Variant10(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action250::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant10(__nt), __end));
+        (2, 26)
+    }
+    pub(crate) fn __reduce44<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Type) = Type => ActionFn(82);
+        let __sym0 = __pop_Variant7(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action82::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant7(__nt), __end));
+        (1, 27)
+    }
+    pub(crate) fn __reduce45<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Type)* =  => ActionFn(80);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action80::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant20(__nt), __end));
+        (0, 28)
+    }
+    pub(crate) fn __reduce46<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Type)* = (Type)+ => ActionFn(81);
+        let __sym0 = __pop_Variant20(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action81::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant20(__nt), __end));
+        (1, 28)
+    }
+    pub(crate) fn __reduce47<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Type)+ = Type => ActionFn(251);
+        let __sym0 = __pop_Variant7(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action251::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant20(__nt), __end));
+        (1, 29)
+    }
+    pub(crate) fn __reduce48<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Type)+ = (Type)+, Type => ActionFn(252);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant7(__symbols);
+        let __sym0 = __pop_Variant20(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action252::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant20(__nt), __end));
+        (2, 29)
+    }
+    pub(crate) fn __reduce49<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Variant) = Variant => ActionFn(131);
+        let __sym0 = __pop_Variant21(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action131::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant21(__nt), __end));
+        (1, 30)
+    }
+    pub(crate) fn __reduce50<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Variant)* =  => ActionFn(129);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action129::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant22(__nt), __end));
+        (0, 31)
+    }
+    pub(crate) fn __reduce51<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Variant)* = (Variant)+ => ActionFn(130);
+        let __sym0 = __pop_Variant22(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action130::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant22(__nt), __end));
+        (1, 31)
+    }
+    pub(crate) fn __reduce52<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Variant)+ = Variant => ActionFn(255);
+        let __sym0 = __pop_Variant21(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action255::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant22(__nt), __end));
+        (1, 32)
+    }
+    pub(crate) fn __reduce53<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Variant)+ = (Variant)+, Variant => ActionFn(256);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant21(__symbols);
+        let __sym0 = __pop_Variant22(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action256::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant22(__nt), __end));
+        (2, 32)
+    }
+    pub(crate) fn __reduce54<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Action = LParen, "let", Ident, Expr, RParen => ActionFn(54);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant1(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action54::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant23(__nt), __end));
+        (5, 33)
+    }
+    pub(crate) fn __reduce55<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Action = NonLetAction => ActionFn(55);
+        let __sym0 = __pop_Variant23(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action55::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant23(__nt), __end));
+        (1, 33)
+    }
+    pub(crate) fn __reduce56<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Action* =  => ActionFn(141);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action141::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant24(__nt), __end));
+        (0, 34)
+    }
+    pub(crate) fn __reduce57<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Action* = Action+ => ActionFn(142);
+        let __sym0 = __pop_Variant24(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action142::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant24(__nt), __end));
+        (1, 34)
+    }
+    pub(crate) fn __reduce58<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Action+ = Action => ActionFn(159);
+        let __sym0 = __pop_Variant23(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action159::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant24(__nt), __end));
+        (1, 35)
+    }
+    pub(crate) fn __reduce59<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Action+ = Action+, Action => ActionFn(160);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant23(__symbols);
+        let __sym0 = __pop_Variant24(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action160::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant24(__nt), __end));
+        (2, 35)
+    }
+    pub(crate) fn __reduce60<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // CallExpr = LParen, Ident, RParen => ActionFn(243);
+        assert!(__symbols.len() >= 3);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant7(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym2.2;
+        let __nt = super::__action243::<>(input, __sym0, __sym1, __sym2);
+        __symbols.push((__start, __Symbol::Variant1(__nt), __end));
+        (3, 36)
+    }
+    pub(crate) fn __reduce61<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // CallExpr = LParen, Ident, (Expr)+, RParen => ActionFn(244);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant18(__symbols);
+        let __sym1 = __pop_Variant7(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action244::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant1(__nt), __end));
+        (4, 36)
+    }
+    pub(crate) fn __reduce62<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "set-option", Ident, Expr, RParen => ActionFn(9);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant1(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action9::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (5, 37)
+    }
+    pub(crate) fn __reduce63<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "datatype", Ident, RParen => ActionFn(257);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action257::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (4, 37)
+    }
+    pub(crate) fn __reduce64<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "datatype", Ident, (Variant)+, RParen => ActionFn(258);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant22(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action258::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (5, 37)
+    }
+    pub(crate) fn __reduce65<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "sort", Ident, LParen, Ident, RParen, RParen => ActionFn(245);
+        assert!(__symbols.len() >= 7);
+        let __sym6 = __pop_Variant30(__symbols);
+        let __sym5 = __pop_Variant30(__symbols);
+        let __sym4 = __pop_Variant7(__symbols);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym6.2;
+        let __nt = super::__action245::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (7, 37)
+    }
+    pub(crate) fn __reduce66<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "sort", Ident, LParen, Ident, (Expr)+, RParen, RParen => ActionFn(246);
+        assert!(__symbols.len() >= 8);
+        let __sym7 = __pop_Variant30(__symbols);
+        let __sym6 = __pop_Variant30(__symbols);
+        let __sym5 = __pop_Variant18(__symbols);
+        let __sym4 = __pop_Variant7(__symbols);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym7.2;
+        let __nt = super::__action246::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (8, 37)
+    }
+    pub(crate) fn __reduce67<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "sort", Ident, RParen => ActionFn(12);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action12::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (4, 37)
+    }
+    pub(crate) fn __reduce68<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "function", Ident, Schema, Cost, ":unextractable", ":on_merge", List<Action>, ":merge", Expr, ":default", Expr, RParen => ActionFn(191);
+        assert!(__symbols.len() >= 13);
+        let __sym12 = __pop_Variant30(__symbols);
+        let __sym11 = __pop_Variant1(__symbols);
+        let __sym10 = __pop_Variant0(__symbols);
+        let __sym9 = __pop_Variant1(__symbols);
+        let __sym8 = __pop_Variant0(__symbols);
+        let __sym7 = __pop_Variant5(__symbols);
+        let __sym6 = __pop_Variant0(__symbols);
+        let __sym5 = __pop_Variant0(__symbols);
+        let __sym4 = __pop_Variant25(__symbols);
+        let __sym3 = __pop_Variant37(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym12.2;
+        let __nt = super::__action191::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9, __sym10, __sym11, __sym12);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (13, 37)
+    }
+    pub(crate) fn __reduce69<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "function", Ident, Schema, Cost, ":on_merge", List<Action>, ":merge", Expr, ":default", Expr, RParen => ActionFn(192);
+        assert!(__symbols.len() >= 12);
+        let __sym11 = __pop_Variant30(__symbols);
+        let __sym10 = __pop_Variant1(__symbols);
+        let __sym9 = __pop_Variant0(__symbols);
+        let __sym8 = __pop_Variant1(__symbols);
+        let __sym7 = __pop_Variant0(__symbols);
+        let __sym6 = __pop_Variant5(__symbols);
+        let __sym5 = __pop_Variant0(__symbols);
+        let __sym4 = __pop_Variant25(__symbols);
+        let __sym3 = __pop_Variant37(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym11.2;
+        let __nt = super::__action192::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9, __sym10, __sym11);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (12, 37)
+    }
+    pub(crate) fn __reduce70<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "function", Ident, Schema, Cost, ":unextractable", ":merge", Expr, ":default", Expr, RParen => ActionFn(193);
+        assert!(__symbols.len() >= 11);
+        let __sym10 = __pop_Variant30(__symbols);
+        let __sym9 = __pop_Variant1(__symbols);
+        let __sym8 = __pop_Variant0(__symbols);
+        let __sym7 = __pop_Variant1(__symbols);
+        let __sym6 = __pop_Variant0(__symbols);
+        let __sym5 = __pop_Variant0(__symbols);
+        let __sym4 = __pop_Variant25(__symbols);
+        let __sym3 = __pop_Variant37(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym10.2;
+        let __nt = super::__action193::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9, __sym10);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (11, 37)
+    }
+    pub(crate) fn __reduce71<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "function", Ident, Schema, Cost, ":merge", Expr, ":default", Expr, RParen => ActionFn(194);
+        assert!(__symbols.len() >= 10);
+        let __sym9 = __pop_Variant30(__symbols);
+        let __sym8 = __pop_Variant1(__symbols);
+        let __sym7 = __pop_Variant0(__symbols);
+        let __sym6 = __pop_Variant1(__symbols);
+        let __sym5 = __pop_Variant0(__symbols);
+        let __sym4 = __pop_Variant25(__symbols);
+        let __sym3 = __pop_Variant37(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym9.2;
+        let __nt = super::__action194::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (10, 37)
+    }
+    pub(crate) fn __reduce72<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "function", Ident, Schema, Cost, ":unextractable", ":on_merge", List<Action>, ":default", Expr, RParen => ActionFn(195);
+        assert!(__symbols.len() >= 11);
+        let __sym10 = __pop_Variant30(__symbols);
+        let __sym9 = __pop_Variant1(__symbols);
+        let __sym8 = __pop_Variant0(__symbols);
+        let __sym7 = __pop_Variant5(__symbols);
+        let __sym6 = __pop_Variant0(__symbols);
+        let __sym5 = __pop_Variant0(__symbols);
+        let __sym4 = __pop_Variant25(__symbols);
+        let __sym3 = __pop_Variant37(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym10.2;
+        let __nt = super::__action195::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9, __sym10);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (11, 37)
+    }
+    pub(crate) fn __reduce73<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "function", Ident, Schema, Cost, ":on_merge", List<Action>, ":default", Expr, RParen => ActionFn(196);
+        assert!(__symbols.len() >= 10);
+        let __sym9 = __pop_Variant30(__symbols);
+        let __sym8 = __pop_Variant1(__symbols);
+        let __sym7 = __pop_Variant0(__symbols);
+        let __sym6 = __pop_Variant5(__symbols);
+        let __sym5 = __pop_Variant0(__symbols);
+        let __sym4 = __pop_Variant25(__symbols);
+        let __sym3 = __pop_Variant37(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym9.2;
+        let __nt = super::__action196::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (10, 37)
+    }
+    pub(crate) fn __reduce74<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "function", Ident, Schema, Cost, ":unextractable", ":default", Expr, RParen => ActionFn(197);
+        assert!(__symbols.len() >= 9);
+        let __sym8 = __pop_Variant30(__symbols);
+        let __sym7 = __pop_Variant1(__symbols);
+        let __sym6 = __pop_Variant0(__symbols);
+        let __sym5 = __pop_Variant0(__symbols);
+        let __sym4 = __pop_Variant25(__symbols);
+        let __sym3 = __pop_Variant37(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym8.2;
+        let __nt = super::__action197::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (9, 37)
+    }
+    pub(crate) fn __reduce75<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "function", Ident, Schema, Cost, ":default", Expr, RParen => ActionFn(198);
+        assert!(__symbols.len() >= 8);
+        let __sym7 = __pop_Variant30(__symbols);
+        let __sym6 = __pop_Variant1(__symbols);
+        let __sym5 = __pop_Variant0(__symbols);
+        let __sym4 = __pop_Variant25(__symbols);
+        let __sym3 = __pop_Variant37(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym7.2;
+        let __nt = super::__action198::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (8, 37)
+    }
+    pub(crate) fn __reduce76<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "function", Ident, Schema, Cost, ":unextractable", ":on_merge", List<Action>, ":merge", Expr, RParen => ActionFn(199);
+        assert!(__symbols.len() >= 11);
+        let __sym10 = __pop_Variant30(__symbols);
+        let __sym9 = __pop_Variant1(__symbols);
+        let __sym8 = __pop_Variant0(__symbols);
+        let __sym7 = __pop_Variant5(__symbols);
+        let __sym6 = __pop_Variant0(__symbols);
+        let __sym5 = __pop_Variant0(__symbols);
+        let __sym4 = __pop_Variant25(__symbols);
+        let __sym3 = __pop_Variant37(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym10.2;
+        let __nt = super::__action199::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9, __sym10);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (11, 37)
+    }
+    pub(crate) fn __reduce77<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "function", Ident, Schema, Cost, ":on_merge", List<Action>, ":merge", Expr, RParen => ActionFn(200);
+        assert!(__symbols.len() >= 10);
+        let __sym9 = __pop_Variant30(__symbols);
+        let __sym8 = __pop_Variant1(__symbols);
+        let __sym7 = __pop_Variant0(__symbols);
+        let __sym6 = __pop_Variant5(__symbols);
+        let __sym5 = __pop_Variant0(__symbols);
+        let __sym4 = __pop_Variant25(__symbols);
+        let __sym3 = __pop_Variant37(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym9.2;
+        let __nt = super::__action200::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (10, 37)
+    }
+    pub(crate) fn __reduce78<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "function", Ident, Schema, Cost, ":unextractable", ":merge", Expr, RParen => ActionFn(201);
+        assert!(__symbols.len() >= 9);
+        let __sym8 = __pop_Variant30(__symbols);
+        let __sym7 = __pop_Variant1(__symbols);
+        let __sym6 = __pop_Variant0(__symbols);
+        let __sym5 = __pop_Variant0(__symbols);
+        let __sym4 = __pop_Variant25(__symbols);
+        let __sym3 = __pop_Variant37(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym8.2;
+        let __nt = super::__action201::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (9, 37)
+    }
+    pub(crate) fn __reduce79<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "function", Ident, Schema, Cost, ":merge", Expr, RParen => ActionFn(202);
+        assert!(__symbols.len() >= 8);
+        let __sym7 = __pop_Variant30(__symbols);
+        let __sym6 = __pop_Variant1(__symbols);
+        let __sym5 = __pop_Variant0(__symbols);
+        let __sym4 = __pop_Variant25(__symbols);
+        let __sym3 = __pop_Variant37(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym7.2;
+        let __nt = super::__action202::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (8, 37)
+    }
+    pub(crate) fn __reduce80<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "function", Ident, Schema, Cost, ":unextractable", ":on_merge", List<Action>, RParen => ActionFn(203);
+        assert!(__symbols.len() >= 9);
+        let __sym8 = __pop_Variant30(__symbols);
+        let __sym7 = __pop_Variant5(__symbols);
+        let __sym6 = __pop_Variant0(__symbols);
+        let __sym5 = __pop_Variant0(__symbols);
+        let __sym4 = __pop_Variant25(__symbols);
+        let __sym3 = __pop_Variant37(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym8.2;
+        let __nt = super::__action203::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (9, 37)
+    }
+    pub(crate) fn __reduce81<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "function", Ident, Schema, Cost, ":on_merge", List<Action>, RParen => ActionFn(204);
+        assert!(__symbols.len() >= 8);
+        let __sym7 = __pop_Variant30(__symbols);
+        let __sym6 = __pop_Variant5(__symbols);
+        let __sym5 = __pop_Variant0(__symbols);
+        let __sym4 = __pop_Variant25(__symbols);
+        let __sym3 = __pop_Variant37(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym7.2;
+        let __nt = super::__action204::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (8, 37)
+    }
+    pub(crate) fn __reduce82<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "function", Ident, Schema, Cost, ":unextractable", RParen => ActionFn(205);
+        assert!(__symbols.len() >= 7);
+        let __sym6 = __pop_Variant30(__symbols);
+        let __sym5 = __pop_Variant0(__symbols);
+        let __sym4 = __pop_Variant25(__symbols);
+        let __sym3 = __pop_Variant37(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym6.2;
+        let __nt = super::__action205::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (7, 37)
+    }
+    pub(crate) fn __reduce83<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "function", Ident, Schema, Cost, RParen => ActionFn(206);
+        assert!(__symbols.len() >= 6);
+        let __sym5 = __pop_Variant30(__symbols);
+        let __sym4 = __pop_Variant25(__symbols);
+        let __sym3 = __pop_Variant37(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym5.2;
+        let __nt = super::__action206::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (6, 37)
+    }
+    pub(crate) fn __reduce84<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "declare", Ident, Ident, RParen => ActionFn(14);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant7(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action14::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (5, 37)
+    }
+    pub(crate) fn __reduce85<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "relation", Ident, List<Type>, RParen => ActionFn(15);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant31(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action15::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (5, 37)
+    }
+    pub(crate) fn __reduce86<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "ruleset", Ident, RParen => ActionFn(16);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action16::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (4, 37)
+    }
+    pub(crate) fn __reduce87<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "rule", List<Fact>, List<Action>, ":ruleset", Ident, ":name", String, RParen => ActionFn(182);
+        assert!(__symbols.len() >= 9);
+        let __sym8 = __pop_Variant30(__symbols);
+        let __sym7 = __pop_Variant3(__symbols);
+        let __sym6 = __pop_Variant0(__symbols);
+        let __sym5 = __pop_Variant7(__symbols);
+        let __sym4 = __pop_Variant0(__symbols);
+        let __sym3 = __pop_Variant5(__symbols);
+        let __sym2 = __pop_Variant14(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym8.2;
+        let __nt = super::__action182::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (9, 37)
+    }
+    pub(crate) fn __reduce88<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "rule", List<Fact>, List<Action>, ":name", String, RParen => ActionFn(183);
+        assert!(__symbols.len() >= 7);
+        let __sym6 = __pop_Variant30(__symbols);
+        let __sym5 = __pop_Variant3(__symbols);
+        let __sym4 = __pop_Variant0(__symbols);
+        let __sym3 = __pop_Variant5(__symbols);
+        let __sym2 = __pop_Variant14(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym6.2;
+        let __nt = super::__action183::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (7, 37)
+    }
+    pub(crate) fn __reduce89<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "rule", List<Fact>, List<Action>, ":ruleset", Ident, RParen => ActionFn(184);
+        assert!(__symbols.len() >= 7);
+        let __sym6 = __pop_Variant30(__symbols);
+        let __sym5 = __pop_Variant7(__symbols);
+        let __sym4 = __pop_Variant0(__symbols);
+        let __sym3 = __pop_Variant5(__symbols);
+        let __sym2 = __pop_Variant14(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym6.2;
+        let __nt = super::__action184::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (7, 37)
+    }
+    pub(crate) fn __reduce90<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "rule", List<Fact>, List<Action>, RParen => ActionFn(185);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant5(__symbols);
+        let __sym2 = __pop_Variant14(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action185::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (5, 37)
+    }
+    pub(crate) fn __reduce91<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "rewrite", Expr, Expr, ":when", List<Fact>, ":ruleset", Ident, RParen => ActionFn(229);
+        assert!(__symbols.len() >= 9);
+        let __sym8 = __pop_Variant30(__symbols);
+        let __sym7 = __pop_Variant7(__symbols);
+        let __sym6 = __pop_Variant0(__symbols);
+        let __sym5 = __pop_Variant14(__symbols);
+        let __sym4 = __pop_Variant0(__symbols);
+        let __sym3 = __pop_Variant1(__symbols);
+        let __sym2 = __pop_Variant1(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym8.2;
+        let __nt = super::__action229::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (9, 37)
+    }
+    pub(crate) fn __reduce92<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "rewrite", Expr, Expr, ":ruleset", Ident, RParen => ActionFn(230);
+        assert!(__symbols.len() >= 7);
+        let __sym6 = __pop_Variant30(__symbols);
+        let __sym5 = __pop_Variant7(__symbols);
+        let __sym4 = __pop_Variant0(__symbols);
+        let __sym3 = __pop_Variant1(__symbols);
+        let __sym2 = __pop_Variant1(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym6.2;
+        let __nt = super::__action230::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (7, 37)
+    }
+    pub(crate) fn __reduce93<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "rewrite", Expr, Expr, ":when", List<Fact>, RParen => ActionFn(231);
+        assert!(__symbols.len() >= 7);
+        let __sym6 = __pop_Variant30(__symbols);
+        let __sym5 = __pop_Variant14(__symbols);
+        let __sym4 = __pop_Variant0(__symbols);
+        let __sym3 = __pop_Variant1(__symbols);
+        let __sym2 = __pop_Variant1(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym6.2;
+        let __nt = super::__action231::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (7, 37)
+    }
+    pub(crate) fn __reduce94<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "rewrite", Expr, Expr, RParen => ActionFn(232);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant1(__symbols);
+        let __sym2 = __pop_Variant1(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action232::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (5, 37)
+    }
+    pub(crate) fn __reduce95<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "birewrite", Expr, Expr, ":when", List<Fact>, ":ruleset", Ident, RParen => ActionFn(233);
+        assert!(__symbols.len() >= 9);
+        let __sym8 = __pop_Variant30(__symbols);
+        let __sym7 = __pop_Variant7(__symbols);
+        let __sym6 = __pop_Variant0(__symbols);
+        let __sym5 = __pop_Variant14(__symbols);
+        let __sym4 = __pop_Variant0(__symbols);
+        let __sym3 = __pop_Variant1(__symbols);
+        let __sym2 = __pop_Variant1(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym8.2;
+        let __nt = super::__action233::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (9, 37)
+    }
+    pub(crate) fn __reduce96<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "birewrite", Expr, Expr, ":ruleset", Ident, RParen => ActionFn(234);
+        assert!(__symbols.len() >= 7);
+        let __sym6 = __pop_Variant30(__symbols);
+        let __sym5 = __pop_Variant7(__symbols);
+        let __sym4 = __pop_Variant0(__symbols);
+        let __sym3 = __pop_Variant1(__symbols);
+        let __sym2 = __pop_Variant1(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym6.2;
+        let __nt = super::__action234::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (7, 37)
+    }
+    pub(crate) fn __reduce97<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "birewrite", Expr, Expr, ":when", List<Fact>, RParen => ActionFn(235);
+        assert!(__symbols.len() >= 7);
+        let __sym6 = __pop_Variant30(__symbols);
+        let __sym5 = __pop_Variant14(__symbols);
+        let __sym4 = __pop_Variant0(__symbols);
+        let __sym3 = __pop_Variant1(__symbols);
+        let __sym2 = __pop_Variant1(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym6.2;
+        let __nt = super::__action235::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (7, 37)
+    }
+    pub(crate) fn __reduce98<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "birewrite", Expr, Expr, RParen => ActionFn(236);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant1(__symbols);
+        let __sym2 = __pop_Variant1(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action236::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (5, 37)
+    }
+    pub(crate) fn __reduce99<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "let", Ident, Expr, RParen => ActionFn(20);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant1(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action20::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (5, 37)
+    }
+    pub(crate) fn __reduce100<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = NonLetAction => ActionFn(21);
+        let __sym0 = __pop_Variant23(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action21::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (1, 37)
+    }
+    pub(crate) fn __reduce101<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "run", UNum, ":until", RParen => ActionFn(213);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant0(__symbols);
+        let __sym2 = __pop_Variant12(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action213::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (5, 37)
+    }
+    pub(crate) fn __reduce102<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "run", UNum, ":until", (Fact)+, RParen => ActionFn(214);
+        assert!(__symbols.len() >= 6);
+        let __sym5 = __pop_Variant30(__symbols);
+        let __sym4 = __pop_Variant10(__symbols);
+        let __sym3 = __pop_Variant0(__symbols);
+        let __sym2 = __pop_Variant12(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym5.2;
+        let __nt = super::__action214::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (6, 37)
+    }
+    pub(crate) fn __reduce103<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "run", UNum, RParen => ActionFn(215);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant12(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action215::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (4, 37)
+    }
+    pub(crate) fn __reduce104<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "run", Ident, UNum, ":until", RParen => ActionFn(216);
+        assert!(__symbols.len() >= 6);
+        let __sym5 = __pop_Variant30(__symbols);
+        let __sym4 = __pop_Variant0(__symbols);
+        let __sym3 = __pop_Variant12(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym5.2;
+        let __nt = super::__action216::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (6, 37)
+    }
+    pub(crate) fn __reduce105<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "run", Ident, UNum, ":until", (Fact)+, RParen => ActionFn(217);
+        assert!(__symbols.len() >= 7);
+        let __sym6 = __pop_Variant30(__symbols);
+        let __sym5 = __pop_Variant10(__symbols);
+        let __sym4 = __pop_Variant0(__symbols);
+        let __sym3 = __pop_Variant12(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym6.2;
+        let __nt = super::__action217::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (7, 37)
+    }
+    pub(crate) fn __reduce106<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "run", Ident, UNum, RParen => ActionFn(218);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant12(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action218::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (5, 37)
+    }
+    pub(crate) fn __reduce107<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "simplify", Schedule, Expr, RParen => ActionFn(24);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant1(__symbols);
+        let __sym2 = __pop_Variant35(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action24::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (5, 37)
+    }
+    pub(crate) fn __reduce108<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "add-ruleset", Ident, RParen => ActionFn(25);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action25::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (4, 37)
+    }
+    pub(crate) fn __reduce109<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "calc", LParen, RParen, Expr+, RParen => ActionFn(267);
+        assert!(__symbols.len() >= 6);
+        let __sym5 = __pop_Variant30(__symbols);
+        let __sym4 = __pop_Variant18(__symbols);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym5.2;
+        let __nt = super::__action267::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (6, 37)
+    }
+    pub(crate) fn __reduce110<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "calc", LParen, IdentSort+, RParen, Expr+, RParen => ActionFn(268);
+        assert!(__symbols.len() >= 7);
+        let __sym6 = __pop_Variant30(__symbols);
+        let __sym5 = __pop_Variant18(__symbols);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant29(__symbols);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym6.2;
+        let __nt = super::__action268::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (7, 37)
+    }
+    pub(crate) fn __reduce111<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "query-extract", ":variants", UNum, Fact, RParen => ActionFn(226);
+        assert!(__symbols.len() >= 6);
+        let __sym5 = __pop_Variant30(__symbols);
+        let __sym4 = __pop_Variant19(__symbols);
+        let __sym3 = __pop_Variant12(__symbols);
+        let __sym2 = __pop_Variant0(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym5.2;
+        let __nt = super::__action226::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (6, 37)
+    }
+    pub(crate) fn __reduce112<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "query-extract", Fact, RParen => ActionFn(227);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant19(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action227::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (4, 37)
+    }
+    pub(crate) fn __reduce113<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "check", RParen => ActionFn(209);
+        assert!(__symbols.len() >= 3);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym2.2;
+        let __nt = super::__action209::<>(input, __sym0, __sym1, __sym2);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (3, 37)
+    }
+    pub(crate) fn __reduce114<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "check", (Fact)+, RParen => ActionFn(210);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant10(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action210::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (4, 37)
+    }
+    pub(crate) fn __reduce115<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "check-proof", RParen => ActionFn(29);
+        assert!(__symbols.len() >= 3);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym2.2;
+        let __nt = super::__action29::<>(input, __sym0, __sym1, __sym2);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (3, 37)
+    }
+    pub(crate) fn __reduce116<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "run-schedule", RParen => ActionFn(269);
+        assert!(__symbols.len() >= 3);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym2.2;
+        let __nt = super::__action269::<>(input, __sym0, __sym1, __sym2);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (3, 37)
+    }
+    pub(crate) fn __reduce117<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "run-schedule", Schedule+, RParen => ActionFn(270);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant36(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action270::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (4, 37)
+    }
+    pub(crate) fn __reduce118<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "push", UNum, RParen => ActionFn(279);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant12(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action279::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (4, 37)
+    }
+    pub(crate) fn __reduce119<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "push", RParen => ActionFn(280);
+        assert!(__symbols.len() >= 3);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym2.2;
+        let __nt = super::__action280::<>(input, __sym0, __sym1, __sym2);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (3, 37)
+    }
+    pub(crate) fn __reduce120<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "pop", UNum, RParen => ActionFn(281);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant12(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action281::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (4, 37)
+    }
+    pub(crate) fn __reduce121<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "pop", RParen => ActionFn(282);
+        assert!(__symbols.len() >= 3);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym2.2;
+        let __nt = super::__action282::<>(input, __sym0, __sym1, __sym2);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (3, 37)
+    }
+    pub(crate) fn __reduce122<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "print-table", Ident, UNum, RParen => ActionFn(283);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant12(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action283::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (5, 37)
+    }
+    pub(crate) fn __reduce123<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "print-table", Ident, RParen => ActionFn(284);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action284::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (4, 37)
+    }
+    pub(crate) fn __reduce124<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "print-size", Ident, RParen => ActionFn(34);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action34::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (4, 37)
+    }
+    pub(crate) fn __reduce125<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "input", Ident, String, RParen => ActionFn(35);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant3(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action35::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (5, 37)
+    }
+    pub(crate) fn __reduce126<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "output", String, Expr+, RParen => ActionFn(36);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant18(__symbols);
+        let __sym2 = __pop_Variant3(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action36::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (5, 37)
+    }
+    pub(crate) fn __reduce127<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "fail", Command, RParen => ActionFn(37);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant16(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action37::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (4, 37)
+    }
+    pub(crate) fn __reduce128<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "include", String, RParen => ActionFn(38);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant3(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action38::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (4, 37)
+    }
+    pub(crate) fn __reduce129<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Cost = ":cost", UNum => ActionFn(45);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant12(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action45::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant25(__nt), __end));
+        (2, 38)
+    }
+    pub(crate) fn __reduce130<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Cost =  => ActionFn(46);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action46::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant25(__nt), __end));
+        (0, 38)
+    }
+    pub(crate) fn __reduce131<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Expr = Literal => ActionFn(60);
+        let __sym0 = __pop_Variant32(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action60::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant1(__nt), __end));
+        (1, 39)
+    }
+    pub(crate) fn __reduce132<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Expr = Ident => ActionFn(61);
+        let __sym0 = __pop_Variant7(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action61::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant1(__nt), __end));
+        (1, 39)
+    }
+    pub(crate) fn __reduce133<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Expr = CallExpr => ActionFn(62);
+        let __sym0 = __pop_Variant1(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action62::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant1(__nt), __end));
+        (1, 39)
+    }
+    pub(crate) fn __reduce134<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Expr* =  => ActionFn(83);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action83::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant18(__nt), __end));
+        (0, 40)
+    }
+    pub(crate) fn __reduce135<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Expr* = Expr+ => ActionFn(84);
+        let __sym0 = __pop_Variant18(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action84::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant18(__nt), __end));
+        (1, 40)
+    }
+    pub(crate) fn __reduce136<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Expr+ = Expr => ActionFn(92);
+        let __sym0 = __pop_Variant1(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action92::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant18(__nt), __end));
+        (1, 41)
+    }
+    pub(crate) fn __reduce137<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Expr+ = Expr+, Expr => ActionFn(93);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant1(__symbols);
+        let __sym0 = __pop_Variant18(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action93::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant18(__nt), __end));
+        (2, 41)
+    }
+    pub(crate) fn __reduce138<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // ExprList = LParen, RParen => ActionFn(247);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant30(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action247::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant26(__nt), __end));
+        (2, 42)
+    }
+    pub(crate) fn __reduce139<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // ExprList = LParen, (Expr)+, RParen => ActionFn(248);
+        assert!(__symbols.len() >= 3);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant18(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym2.2;
+        let __nt = super::__action248::<>(input, __sym0, __sym1, __sym2);
+        __symbols.push((__start, __Symbol::Variant26(__nt), __end));
+        (3, 42)
+    }
+    pub(crate) fn __reduce140<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // F64 = "NaN" => ActionFn(73);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action73::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant27(__nt), __end));
+        (1, 43)
+    }
+    pub(crate) fn __reduce141<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // F64 = r#"(-)?[0-9]+\\.[0-9]+(e(\\+)?(-)?[0-9]+)?"# => ActionFn(74);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action74::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant27(__nt), __end));
+        (1, 43)
+    }
+    pub(crate) fn __reduce142<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // F64 = "inf" => ActionFn(75);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action75::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant27(__nt), __end));
+        (1, 43)
+    }
+    pub(crate) fn __reduce143<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // F64 = "-inf" => ActionFn(76);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action76::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant27(__nt), __end));
+        (1, 43)
+    }
+    pub(crate) fn __reduce144<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Fact = LParen, "=", Expr+, Expr, RParen => ActionFn(57);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant1(__symbols);
+        let __sym2 = __pop_Variant18(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action57::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant19(__nt), __end));
+        (5, 44)
+    }
+    pub(crate) fn __reduce145<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Fact = Expr => ActionFn(58);
+        let __sym0 = __pop_Variant1(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action58::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant19(__nt), __end));
+        (1, 44)
+    }
+    pub(crate) fn __reduce146<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Fact* =  => ActionFn(145);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action145::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant10(__nt), __end));
+        (0, 45)
+    }
+    pub(crate) fn __reduce147<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Fact* = Fact+ => ActionFn(146);
+        let __sym0 = __pop_Variant10(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action146::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant10(__nt), __end));
+        (1, 45)
+    }
+    pub(crate) fn __reduce148<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Fact+ = Fact => ActionFn(155);
+        let __sym0 = __pop_Variant19(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action155::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant10(__nt), __end));
+        (1, 46)
+    }
+    pub(crate) fn __reduce149<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Fact+ = Fact+, Fact => ActionFn(156);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant19(__symbols);
+        let __sym0 = __pop_Variant10(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action156::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant10(__nt), __end));
+        (2, 46)
+    }
+    pub(crate) fn __reduce150<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Ident = r#"(([[:alpha:]][\\w-]*)|([-+*/?!=<>&|^/%_]))+"# => ActionFn(77);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action77::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant7(__nt), __end));
+        (1, 47)
+    }
+    pub(crate) fn __reduce151<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // IdentSort = LParen, Ident, Type, RParen => ActionFn(70);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant7(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action70::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant28(__nt), __end));
+        (4, 48)
+    }
+    pub(crate) fn __reduce152<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // IdentSort* =  => ActionFn(94);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action94::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant29(__nt), __end));
+        (0, 49)
+    }
+    pub(crate) fn __reduce153<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // IdentSort* = IdentSort+ => ActionFn(95);
+        let __sym0 = __pop_Variant29(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action95::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant29(__nt), __end));
+        (1, 49)
+    }
+    pub(crate) fn __reduce154<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // IdentSort+ = IdentSort => ActionFn(149);
+        let __sym0 = __pop_Variant28(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action149::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant29(__nt), __end));
+        (1, 50)
+    }
+    pub(crate) fn __reduce155<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // IdentSort+ = IdentSort+, IdentSort => ActionFn(150);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant28(__symbols);
+        let __sym0 = __pop_Variant29(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action150::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant29(__nt), __end));
+        (2, 50)
+    }
+    pub(crate) fn __reduce156<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // LParen = "(" => ActionFn(5);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action5::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant30(__nt), __end));
+        (1, 51)
+    }
+    pub(crate) fn __reduce157<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // LParen = "[" => ActionFn(6);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action6::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant30(__nt), __end));
+        (1, 51)
+    }
+    pub(crate) fn __reduce158<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // List<Action> = LParen, RParen => ActionFn(259);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant30(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action259::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant5(__nt), __end));
+        (2, 52)
+    }
+    pub(crate) fn __reduce159<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // List<Action> = LParen, Action+, RParen => ActionFn(260);
+        assert!(__symbols.len() >= 3);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant24(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym2.2;
+        let __nt = super::__action260::<>(input, __sym0, __sym1, __sym2);
+        __symbols.push((__start, __Symbol::Variant5(__nt), __end));
+        (3, 52)
+    }
+    pub(crate) fn __reduce160<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // List<Fact> = LParen, RParen => ActionFn(265);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant30(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action265::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant14(__nt), __end));
+        (2, 53)
+    }
+    pub(crate) fn __reduce161<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // List<Fact> = LParen, Fact+, RParen => ActionFn(266);
+        assert!(__symbols.len() >= 3);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant10(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym2.2;
+        let __nt = super::__action266::<>(input, __sym0, __sym1, __sym2);
+        __symbols.push((__start, __Symbol::Variant14(__nt), __end));
+        (3, 53)
+    }
+    pub(crate) fn __reduce162<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // List<Type> = LParen, RParen => ActionFn(277);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant30(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action277::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant31(__nt), __end));
+        (2, 54)
+    }
+    pub(crate) fn __reduce163<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // List<Type> = LParen, Type+, RParen => ActionFn(278);
+        assert!(__symbols.len() >= 3);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant20(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym2.2;
+        let __nt = super::__action278::<>(input, __sym0, __sym1, __sym2);
+        __symbols.push((__start, __Symbol::Variant31(__nt), __end));
+        (3, 54)
+    }
+    pub(crate) fn __reduce164<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Literal = Num => ActionFn(63);
+        let __sym0 = __pop_Variant33(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action63::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant32(__nt), __end));
+        (1, 55)
+    }
+    pub(crate) fn __reduce165<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Literal = F64 => ActionFn(64);
+        let __sym0 = __pop_Variant27(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action64::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant32(__nt), __end));
+        (1, 55)
+    }
+    pub(crate) fn __reduce166<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Literal = SymString => ActionFn(65);
+        let __sym0 = __pop_Variant7(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action65::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant32(__nt), __end));
+        (1, 55)
+    }
+    pub(crate) fn __reduce167<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Name = "[", Ident, "]" => ActionFn(56);
+        assert!(__symbols.len() >= 3);
+        let __sym2 = __pop_Variant0(__symbols);
+        let __sym1 = __pop_Variant7(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym2.2;
+        let __nt = super::__action56::<>(input, __sym0, __sym1, __sym2);
+        __symbols.push((__start, __Symbol::Variant7(__nt), __end));
+        (3, 56)
+    }
+    pub(crate) fn __reduce168<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // NonLetAction = LParen, "set", LParen, Ident, RParen, Expr, RParen => ActionFn(261);
+        assert!(__symbols.len() >= 7);
+        let __sym6 = __pop_Variant30(__symbols);
+        let __sym5 = __pop_Variant1(__symbols);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant7(__symbols);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym6.2;
+        let __nt = super::__action261::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6);
+        __symbols.push((__start, __Symbol::Variant23(__nt), __end));
+        (7, 57)
+    }
+    pub(crate) fn __reduce169<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // NonLetAction = LParen, "set", LParen, Ident, Expr+, RParen, Expr, RParen => ActionFn(262);
+        assert!(__symbols.len() >= 8);
+        let __sym7 = __pop_Variant30(__symbols);
+        let __sym6 = __pop_Variant1(__symbols);
+        let __sym5 = __pop_Variant30(__symbols);
+        let __sym4 = __pop_Variant18(__symbols);
+        let __sym3 = __pop_Variant7(__symbols);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym7.2;
+        let __nt = super::__action262::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7);
+        __symbols.push((__start, __Symbol::Variant23(__nt), __end));
+        (8, 57)
+    }
+    pub(crate) fn __reduce170<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // NonLetAction = LParen, "delete", LParen, Ident, RParen, RParen => ActionFn(263);
+        assert!(__symbols.len() >= 6);
+        let __sym5 = __pop_Variant30(__symbols);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant7(__symbols);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym5.2;
+        let __nt = super::__action263::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5);
+        __symbols.push((__start, __Symbol::Variant23(__nt), __end));
+        (6, 57)
+    }
+    pub(crate) fn __reduce171<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // NonLetAction = LParen, "delete", LParen, Ident, Expr+, RParen, RParen => ActionFn(264);
+        assert!(__symbols.len() >= 7);
+        let __sym6 = __pop_Variant30(__symbols);
+        let __sym5 = __pop_Variant30(__symbols);
+        let __sym4 = __pop_Variant18(__symbols);
+        let __sym3 = __pop_Variant7(__symbols);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym6.2;
+        let __nt = super::__action264::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6);
+        __symbols.push((__start, __Symbol::Variant23(__nt), __end));
+        (7, 57)
+    }
+    pub(crate) fn __reduce172<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // NonLetAction = LParen, "union", Expr, Expr, RParen => ActionFn(49);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant1(__symbols);
+        let __sym2 = __pop_Variant1(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action49::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant23(__nt), __end));
+        (5, 57)
+    }
+    pub(crate) fn __reduce173<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // NonLetAction = LParen, "panic", String, RParen => ActionFn(50);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant3(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action50::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant23(__nt), __end));
+        (4, 57)
+    }
+    pub(crate) fn __reduce174<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // NonLetAction = LParen, "extract", Expr, RParen => ActionFn(51);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant1(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action51::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant23(__nt), __end));
+        (4, 57)
+    }
+    pub(crate) fn __reduce175<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // NonLetAction = LParen, "extract", Expr, Expr, RParen => ActionFn(52);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant1(__symbols);
+        let __sym2 = __pop_Variant1(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action52::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant23(__nt), __end));
+        (5, 57)
+    }
+    pub(crate) fn __reduce176<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // NonLetAction = CallExpr => ActionFn(53);
+        let __sym0 = __pop_Variant1(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action53::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant23(__nt), __end));
+        (1, 57)
+    }
+    pub(crate) fn __reduce177<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Num = r#"(-)?[0-9]+"# => ActionFn(71);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action71::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant33(__nt), __end));
+        (1, 58)
+    }
+    pub(crate) fn __reduce178<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Program =  => ActionFn(239);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action239::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant34(__nt), __end));
+        (0, 59)
+    }
+    pub(crate) fn __reduce179<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Program = (Command)+ => ActionFn(240);
+        let __sym0 = __pop_Variant17(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action240::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant34(__nt), __end));
+        (1, 59)
+    }
+    pub(crate) fn __reduce180<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // RParen = ")" => ActionFn(7);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action7::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant30(__nt), __end));
+        (1, 60)
+    }
+    pub(crate) fn __reduce181<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // RParen = "]" => ActionFn(8);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action8::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant30(__nt), __end));
+        (1, 60)
+    }
+    pub(crate) fn __reduce182<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Schedule = LParen, "saturate", RParen => ActionFn(271);
+        assert!(__symbols.len() >= 3);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym2.2;
+        let __nt = super::__action271::<>(input, __sym0, __sym1, __sym2);
+        __symbols.push((__start, __Symbol::Variant35(__nt), __end));
+        (3, 61)
+    }
+    pub(crate) fn __reduce183<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Schedule = LParen, "saturate", Schedule+, RParen => ActionFn(272);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant36(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action272::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant35(__nt), __end));
+        (4, 61)
+    }
+    pub(crate) fn __reduce184<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Schedule = LParen, "seq", RParen => ActionFn(273);
+        assert!(__symbols.len() >= 3);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym2.2;
+        let __nt = super::__action273::<>(input, __sym0, __sym1, __sym2);
+        __symbols.push((__start, __Symbol::Variant35(__nt), __end));
+        (3, 61)
+    }
+    pub(crate) fn __reduce185<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Schedule = LParen, "seq", Schedule+, RParen => ActionFn(274);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant36(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action274::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant35(__nt), __end));
+        (4, 61)
+    }
+    pub(crate) fn __reduce186<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Schedule = LParen, "repeat", UNum, RParen => ActionFn(275);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant12(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action275::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant35(__nt), __end));
+        (4, 61)
+    }
+    pub(crate) fn __reduce187<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Schedule = LParen, "repeat", UNum, Schedule+, RParen => ActionFn(276);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant36(__symbols);
+        let __sym2 = __pop_Variant12(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action276::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant35(__nt), __end));
+        (5, 61)
+    }
+    pub(crate) fn __reduce188<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Schedule = LParen, "run", ":until", RParen => ActionFn(219);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant0(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action219::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant35(__nt), __end));
+        (4, 61)
+    }
+    pub(crate) fn __reduce189<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Schedule = LParen, "run", ":until", (Fact)+, RParen => ActionFn(220);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant10(__symbols);
+        let __sym2 = __pop_Variant0(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action220::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant35(__nt), __end));
+        (5, 61)
+    }
+    pub(crate) fn __reduce190<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Schedule = LParen, "run", RParen => ActionFn(221);
+        assert!(__symbols.len() >= 3);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym2.2;
+        let __nt = super::__action221::<>(input, __sym0, __sym1, __sym2);
+        __symbols.push((__start, __Symbol::Variant35(__nt), __end));
+        (3, 61)
+    }
+    pub(crate) fn __reduce191<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Schedule = LParen, "run", Ident, ":until", RParen => ActionFn(222);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant0(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action222::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant35(__nt), __end));
+        (5, 61)
+    }
+    pub(crate) fn __reduce192<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Schedule = LParen, "run", Ident, ":until", (Fact)+, RParen => ActionFn(223);
+        assert!(__symbols.len() >= 6);
+        let __sym5 = __pop_Variant30(__symbols);
+        let __sym4 = __pop_Variant10(__symbols);
+        let __sym3 = __pop_Variant0(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym5.2;
+        let __nt = super::__action223::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5);
+        __symbols.push((__start, __Symbol::Variant35(__nt), __end));
+        (6, 61)
+    }
+    pub(crate) fn __reduce193<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Schedule = LParen, "run", Ident, RParen => ActionFn(224);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action224::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant35(__nt), __end));
+        (4, 61)
+    }
+    pub(crate) fn __reduce194<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Schedule = Ident => ActionFn(44);
+        let __sym0 = __pop_Variant7(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action44::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant35(__nt), __end));
+        (1, 61)
+    }
+    pub(crate) fn __reduce195<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Schedule* =  => ActionFn(87);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action87::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant36(__nt), __end));
+        (0, 62)
+    }
+    pub(crate) fn __reduce196<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Schedule* = Schedule+ => ActionFn(88);
+        let __sym0 = __pop_Variant36(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action88::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant36(__nt), __end));
+        (1, 62)
+    }
+    pub(crate) fn __reduce197<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Schedule+ = Schedule => ActionFn(151);
+        let __sym0 = __pop_Variant35(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action151::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant36(__nt), __end));
+        (1, 63)
+    }
+    pub(crate) fn __reduce198<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Schedule+ = Schedule+, Schedule => ActionFn(152);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant35(__symbols);
+        let __sym0 = __pop_Variant36(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action152::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant36(__nt), __end));
+        (2, 63)
+    }
+    pub(crate) fn __reduce199<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Schema = List<Type>, Type => ActionFn(59);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant7(__symbols);
+        let __sym0 = __pop_Variant31(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action59::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant37(__nt), __end));
+        (2, 64)
+    }
+    pub(crate) fn __reduce200<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // String = r#"(\"[^\"]*\")+"# => ActionFn(79);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action79::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant3(__nt), __end));
+        (1, 65)
+    }
+    pub(crate) fn __reduce201<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // SymString = String => ActionFn(78);
+        let __sym0 = __pop_Variant3(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action78::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant7(__nt), __end));
+        (1, 66)
+    }
+    pub(crate) fn __reduce202<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Type = Ident => ActionFn(69);
+        let __sym0 = __pop_Variant7(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action69::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant7(__nt), __end));
+        (1, 67)
+    }
+    pub(crate) fn __reduce203<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Type* =  => ActionFn(143);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action143::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant20(__nt), __end));
+        (0, 68)
+    }
+    pub(crate) fn __reduce204<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Type* = Type+ => ActionFn(144);
+        let __sym0 = __pop_Variant20(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action144::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant20(__nt), __end));
+        (1, 68)
+    }
+    pub(crate) fn __reduce205<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Type+ = Type => ActionFn(157);
+        let __sym0 = __pop_Variant7(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action157::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant20(__nt), __end));
+        (1, 69)
+    }
+    pub(crate) fn __reduce206<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Type+ = Type+, Type => ActionFn(158);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant7(__symbols);
+        let __sym0 = __pop_Variant20(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action158::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant20(__nt), __end));
+        (2, 69)
+    }
+    pub(crate) fn __reduce207<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // UNum = Num => ActionFn(72);
+        let __sym0 = __pop_Variant33(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action72::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant12(__nt), __end));
+        (1, 70)
+    }
+    pub(crate) fn __reduce208<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // UNum? = UNum => ActionFn(85);
+        let __sym0 = __pop_Variant12(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action85::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant13(__nt), __end));
+        (1, 71)
+    }
+    pub(crate) fn __reduce209<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // UNum? =  => ActionFn(86);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action86::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant13(__nt), __end));
+        (0, 71)
+    }
+    pub(crate) fn __reduce210<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Variant = LParen, Ident, Cost, RParen => ActionFn(253);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant25(__symbols);
+        let __sym1 = __pop_Variant7(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action253::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant21(__nt), __end));
+        (4, 72)
+    }
+    pub(crate) fn __reduce211<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Variant = LParen, Ident, (Type)+, Cost, RParen => ActionFn(254);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant25(__symbols);
+        let __sym2 = __pop_Variant20(__symbols);
+        let __sym1 = __pop_Variant7(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action254::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant21(__nt), __end));
+        (5, 72)
+    }
+    pub(crate) fn __reduce212<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // __Action = Action => ActionFn(1);
+        let __sym0 = __pop_Variant23(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action1::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant23(__nt), __end));
+        (1, 73)
+    }
+    pub(crate) fn __reduce213<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // __Expr = Expr => ActionFn(3);
+        let __sym0 = __pop_Variant1(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action3::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant1(__nt), __end));
+        (1, 74)
+    }
+    pub(crate) fn __reduce215<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // __Program = Program => ActionFn(0);
+        let __sym0 = __pop_Variant34(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action0::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant34(__nt), __end));
+        (1, 76)
+    }
+}
+pub use self::__parse__Fact::FactParser;
+
+#[rustfmt::skip]
+#[allow(non_snake_case, non_camel_case_types, unused_mut, unused_variables, unused_imports, unused_parens, clippy::all)]
+mod __parse__Program {
+
+    use crate::ast::*;
+    use crate::Symbol;
+    use crate::Schedule;
+    use ordered_float::OrderedFloat;
+    #[allow(unused_extern_crates)]
+    extern crate lalrpop_util as __lalrpop_util;
+    #[allow(unused_imports)]
+    use self::__lalrpop_util::state_machine as __state_machine;
+    extern crate core;
+    extern crate alloc;
+    use self::__lalrpop_util::lexer::Token;
+    #[allow(dead_code)]
+    pub(crate) enum __Symbol<'input>
+     {
+        Variant0(&'input str),
+        Variant1(Expr),
+        Variant2(core::option::Option<Expr>),
+        Variant3(String),
+        Variant4(core::option::Option<String>),
+        Variant5(Vec<Action>),
+        Variant6(core::option::Option<Vec<Action>>),
+        Variant7(Symbol),
+        Variant8(core::option::Option<Symbol>),
+        Variant9(core::option::Option<&'input str>),
+        Variant10(alloc::vec::Vec<Fact>),
+        Variant11(core::option::Option<alloc::vec::Vec<Fact>>),
+        Variant12(usize),
+        Variant13(core::option::Option<usize>),
+        Variant14(Vec<Fact>),
+        Variant15(core::option::Option<Vec<Fact>>),
+        Variant16(Command),
+        Variant17(alloc::vec::Vec<Command>),
+        Variant18(alloc::vec::Vec<Expr>),
+        Variant19(Fact),
+        Variant20(alloc::vec::Vec<Symbol>),
+        Variant21(Variant),
+        Variant22(alloc::vec::Vec<Variant>),
+        Variant23(Action),
+        Variant24(alloc::vec::Vec<Action>),
+        Variant25(Option<usize>),
+        Variant26(Vec<Expr>),
+        Variant27(OrderedFloat<f64>),
+        Variant28(IdentSort),
+        Variant29(alloc::vec::Vec<IdentSort>),
+        Variant30(()),
+        Variant31(Vec<Symbol>),
+        Variant32(Literal),
+        Variant33(i64),
+        Variant34(Vec<Command>),
+        Variant35(Schedule),
+        Variant36(alloc::vec::Vec<Schedule>),
+        Variant37(Schema),
+    }
+    const __ACTION: &[i16] = &[
+        // State 0
+        203, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 1
+        203, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 2
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 0, 27, 28, 29, 30, 31, 0, 0, 32, 33, 34, 35, 36, 0, 206, 0, 0,
+        // State 3
+        203, 216, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 204, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 206, 222, 223,
+        // State 4
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 206, 0, 0,
+        // State 5
+        203, 0, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 206, 222, 223,
+        // State 6
+        203, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 7
+        203, 216, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 204, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 206, 222, 223,
+        // State 8
+        0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 9
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 206, 0, 0,
+        // State 10
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 206, 0, 0,
+        // State 11
+        203, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 12
+        203, 0, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 206, 222, 223,
+        // State 13
+        203, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 14
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 206, 0, 0,
+        // State 15
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 0, 0, 0,
+        // State 16
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 206, 0, 0,
+        // State 17
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 206, 0, 0,
+        // State 18
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 0, 0, 0,
+        // State 19
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 0, 0, 0,
+        // State 20
+        0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 222, 0,
+        // State 21
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 206, 0, 0,
+        // State 22
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 206, 0, 0,
+        // State 23
+        0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 222, 0,
+        // State 24
+        203, 0, 217, 0, 0, 0, 0, 0, 0, 0, 0, 60, 0, 0, 218, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 206, 222, 223,
+        // State 25
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 206, 0, 0,
+        // State 26
+        203, 0, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 206, 222, 223,
+        // State 27
+        203, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 28
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 206, 0, 0,
+        // State 29
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 206, 222, 0,
+        // State 30
+        203, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 204, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 206, 0, 0,
+        // State 31
+        203, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 32
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 206, 0, 0,
+        // State 33
+        203, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 206, 0, 0,
+        // State 34
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 206, 0, 0,
+        // State 35
+        203, 0, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 206, 222, 223,
+        // State 36
+        203, 216, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 204, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 206, 222, 223,
+        // State 37
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 206, 0, 0,
+        // State 38
+        0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 39
+        203, 0, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 206, 222, 223,
+        // State 40
+        203, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 204, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 41
+        203, 216, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 204, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 206, 222, 223,
+        // State 42
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 206, 0, 0,
+        // State 43
+        203, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 204, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 44
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 206, 0, 0,
+        // State 45
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 206, 0, 0,
+        // State 46
+        203, 216, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 204, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 206, 222, 223,
+        // State 47
+        0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 48
+        203, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 49
+        0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 50
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 0, 0, 0,
+        // State 51
+        203, 0, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 206, 222, 223,
+        // State 52
+        203, 0, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 206, 222, 223,
+        // State 53
+        0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 54
+        0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 55
+        0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 56
+        0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 222, 0,
+        // State 57
+        0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 58
+        0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 59
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 222, 0,
+        // State 60
+        203, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 61
+        203, 0, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 206, 222, 223,
+        // State 62
+        203, 216, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 204, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 206, 222, 223,
+        // State 63
+        203, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 64
+        0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 65
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 222, 0,
+        // State 66
+        0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 98, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 67
+        203, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 204, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 206, 0, 0,
+        // State 68
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 206, 0, 0,
+        // State 69
+        203, 0, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 206, 222, 223,
+        // State 70
+        203, 0, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 206, 222, 223,
+        // State 71
+        203, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 204, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 72
+        203, 0, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 206, 222, 223,
+        // State 73
+        0, 216, 0, 0, 0, 0, 0, 0, 108, 0, 0, 0, 109, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 74
+        203, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 204, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 75
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 206, 0, 0,
+        // State 76
+        203, 0, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 206, 222, 223,
+        // State 77
+        203, 0, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 206, 222, 223,
+        // State 78
+        203, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 204, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 79
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 206, 0, 0,
+        // State 80
+        0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 81
+        203, 216, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 204, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 206, 222, 223,
+        // State 82
+        0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 83
+        0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 206, 0, 0,
+        // State 84
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 206, 0, 0,
+        // State 85
+        0, -131, 0, 119, -131, -131, 0, -131, 0, -131, 0, 0, 0, 0, 0, 0, -131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 86
+        0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 87
+        0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 88
+        203, 216, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 204, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 206, 222, 223,
+        // State 89
+        0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 90
+        203, 0, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 206, 222, 223,
+        // State 91
+        0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 92
+        0, 216, 0, 0, 0, 0, 0, 0, 121, 0, 0, 0, 122, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 93
+        203, 216, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 204, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 206, 222, 223,
+        // State 94
+        203, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 204, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 95
+        0, 216, 0, 0, 0, 0, 125, 0, 126, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 96
+        0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 127, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 97
+        203, 216, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 204, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 206, 222, 223,
+        // State 98
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 222, 0,
+        // State 99
+        0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 131, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 206, 0, 0,
+        // State 100
+        203, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 204, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 206, 0, 0,
+        // State 101
+        203, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 204, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 206, 0, 0,
+        // State 102
+        203, 216, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 204, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 206, 222, 223,
+        // State 103
+        0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 104
+        0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 105
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 206, 0, 0,
+        // State 106
+        0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 107
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 206, 0, 0,
+        // State 108
+        203, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 109
+        203, 0, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 206, 222, 223,
+        // State 110
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 206, 0, 0,
+        // State 111
+        203, 216, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 204, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 206, 222, 223,
+        // State 112
+        203, 0, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 206, 222, 223,
+        // State 113
+        0, -131, 0, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 206, 0, 0,
+        // State 114
+        203, 216, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 204, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 206, 222, 223,
+        // State 115
+        0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 116
+        0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 206, 0, 0,
+        // State 117
+        0, 216, 0, 0, 145, 146, 0, 147, 0, 148, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 118
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 222, 0,
+        // State 119
+        0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 120
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 206, 0, 0,
+        // State 121
+        203, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 122
+        203, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 204, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 123
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 13, 0, 0, 0, 0, 0, 151, 0, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 36, 0, 206, 0, 0,
+        // State 124
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 0, 0, 0,
+        // State 125
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 206, 0, 0,
+        // State 126
+        203, 216, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 204, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 206, 222, 223,
+        // State 127
+        203, 216, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 204, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 206, 222, 223,
+        // State 128
+        203, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 204, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 206, 0, 0,
+        // State 129
+        0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 156, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 130
+        203, 216, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 204, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 206, 222, 223,
+        // State 131
+        203, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 204, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 206, 0, 0,
+        // State 132
+        203, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 204, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 206, 0, 0,
+        // State 133
+        203, 216, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 204, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 206, 222, 223,
+        // State 134
+        203, 0, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 206, 222, 223,
+        // State 135
+        203, 216, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 204, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 206, 222, 223,
+        // State 136
+        0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 137
+        0, 216, 0, 0, 0, 0, 0, 0, 162, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 138
+        203, 216, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 204, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 206, 222, 223,
+        // State 139
+        0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 140
+        -138, 216, -138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -138, -138, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -138, -138, -138, -138,
+        // State 141
+        0, -131, 0, 119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 206, 0, 0,
+        // State 142
+        0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 143
+        0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 144
+        203, 0, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 206, 222, 223,
+        // State 145
+        203, 0, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 206, 222, 223,
+        // State 146
+        203, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 147
+        0, 216, 0, 0, 167, 168, 0, 169, 0, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 148
+        0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 149
+        0, 216, 0, 0, 0, 0, 0, 0, 170, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 150
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 206, 0, 0,
+        // State 151
+        0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 152
+        0, 216, 0, 0, 0, 0, 172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 153
+        203, 216, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 204, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 206, 222, 223,
+        // State 154
+        203, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 204, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 206, 0, 0,
+        // State 155
+        203, 216, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 204, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 206, 222, 223,
+        // State 156
+        203, 216, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 204, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 206, 222, 223,
+        // State 157
+        203, 0, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 206, 222, 223,
+        // State 158
+        0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 159
+        203, 216, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 204, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 206, 222, 223,
+        // State 160
+        0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 161
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 206, 0, 0,
+        // State 162
+        0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 163
+        0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 164
+        0, 216, 0, 0, 177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 165
+        0, 216, 0, 0, 178, 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 166
+        203, 0, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 206, 222, 223,
+        // State 167
+        203, 0, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 206, 222, 223,
+        // State 168
+        203, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 169
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 206, 0, 0,
+        // State 170
+        203, 0, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 206, 222, 223,
+        // State 171
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 0, 0, 0,
+        // State 172
+        203, 216, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 204, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 206, 222, 223,
+        // State 173
+        0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 174
+        0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 175
+        0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 176
+        203, 0, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 206, 222, 223,
+        // State 177
+        203, 0, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 206, 222, 223,
+        // State 178
+        203, 0, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 206, 222, 223,
+        // State 179
+        0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 180
+        0, 216, 0, 0, 189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 181
+        0, 216, 0, 0, 190, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 182
+        0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 183
+        0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 184
+        0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 185
+        0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 186
+        0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 187
+        0, 216, 0, 0, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 188
+        203, 0, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 206, 222, 223,
+        // State 189
+        203, 0, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 206, 222, 223,
+        // State 190
+        203, 0, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 206, 222, 223,
+        // State 191
+        203, 0, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 206, 222, 223,
+        // State 192
+        0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 193
+        0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 194
+        0, 216, 0, 0, 197, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 195
+        0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 196
+        203, 0, 217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 206, 222, 223,
+        // State 197
+        0, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 198
+        -177, -177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -177, -177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 199
+        -33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 200
+        -101, -101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -101, -101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 201
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 202
+        -157, -157, -157, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -157, -157, -157, -157, -157, -157, -157, -157, -157, -157, -157, -157, -157, -157, -157, -157, -157, -157, -157, -157, -157, -157, -157, -157, -157, -157, -157, -157, -157, -157, -157, -157, -157, -157, -157, -157, -157, -157, -157, -157, -157, -157, -157, -157,
+        // State 203
+        -158, -158, -158, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -158, -158, -158, -158, -158, -158, -158, -158, -158, -158, -158, -158, -158, -158, -158, -158, -158, -158, -158, -158, -158, -158, -158, -158, -158, -158, -158, -158, -158, -158, -158, -158, -158, -158, -158, -158, -158, -158, -158, -158, -158, -158, -158, -158,
+        // State 204
+        -34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 205
+        -151, -151, -151, -151, -151, -151, -151, -151, -151, -151, -151, 0, -151, 0, -151, -151, -151, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -151, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -151, -151, -151, -151,
+        // State 206
+        -134, -134, -134, 0, -134, 0, 0, 0, -134, 0, 0, 0, -134, 0, -134, -134, -134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -134, -134, -134, -134,
+        // State 207
+        -38, -38, -38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -38, -38, -38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -38, -38, -38, -38,
+        // State 208
+        -166, -166, -166, 0, -166, 0, 0, 0, -166, 0, 0, 0, -166, 0, -166, -166, -166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -166, -166, -166, -166,
+        // State 209
+        -133, -133, -133, 0, -133, 0, 0, 0, -133, 0, 0, 0, -133, 0, -133, -133, -133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -133, -133, -133, -133,
+        // State 210
+        -132, -132, -132, 0, -132, 0, 0, 0, -132, 0, 0, 0, -132, 0, -132, -132, -132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -132, -132, -132, -132,
+        // State 211
+        -165, -165, -165, 0, -165, 0, 0, 0, -165, 0, 0, 0, -165, 0, -165, -165, -165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -165, -165, -165, -165,
+        // State 212
+        -61, -61, -61, 0, -61, 0, 0, 0, -61, 0, 0, 0, -61, 0, -61, -61, -61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -61, -61, -61, -61,
+        // State 213
+        -202, -202, -202, 0, -202, 0, 0, 0, -202, 0, 0, 0, -202, 0, -202, -202, -202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -202, -202, -202, -202,
+        // State 214
+        -167, -167, -167, 0, -167, 0, 0, 0, -167, 0, 0, 0, -167, 0, -167, -167, -167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -167, -167, -167, -167,
+        // State 215
+        -181, -181, -181, 0, -181, -181, -181, 0, -181, 0, 0, 0, -181, 0, -181, -181, -181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -181, -181, -181, -181,
+        // State 216
+        -144, -144, -144, 0, -144, 0, 0, 0, -144, 0, 0, 0, -144, 0, -144, -144, -144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -144, -144, -144, -144,
+        // State 217
+        -141, -141, -141, 0, -141, 0, 0, 0, -141, 0, 0, 0, -141, 0, -141, -141, -141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -141, -141, -141, -141,
+        // State 218
+        -182, -182, -182, 0, -182, -182, -182, 0, -182, 0, 0, 0, -182, 0, -182, -182, -182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -182, -182, -182, -182,
+        // State 219
+        -143, -143, -143, 0, -143, 0, 0, 0, -143, 0, 0, 0, -143, 0, -143, -143, -143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -143, -143, -143, -143,
+        // State 220
+        -201, -201, -201, 0, -201, 0, 0, 0, -201, 0, 0, 0, -201, 0, -201, -201, -201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -201, -201, -201, -201,
+        // State 221
+        -178, -178, -178, 0, -178, -178, 0, -178, -178, -178, -178, 0, -178, 0, -178, -178, -178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -178, -178, -178, -178,
+        // State 222
+        -142, -142, -142, 0, -142, 0, 0, 0, -142, 0, 0, 0, -142, 0, -142, -142, -142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -142, -142, -142, -142,
+        // State 223
+        -146, -146, -146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -146, -146, -146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -146, -146, -146, -146,
+        // State 224
+        -43, -43, -43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -43, -43, -43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -43, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -43, -43, -43, -43,
+        // State 225
+        -114, -114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -114, -114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 226
+        -116, -116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -116, -116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 227
+        -208, -208, -208, 0, -208, -208, 0, -208, 0, -208, -208, 0, 0, 0, -208, -208, -208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -208, -208, -208, -208,
+        // State 228
+        -122, -122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -122, -122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 229
+        -120, -120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -120, -120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 230
+        -195, -195, -195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -195, -195, -195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -195, -195, -195, -195,
+        // State 231
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, 0, 0, 0, 100, 0, 101, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 232
+        -117, -117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -117, -117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 233
+        -198, -198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -198, -198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -198, 0, 0,
+        // State 234
+        -39, -39, -39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -39, -39, -39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -39, -39, -39, -39,
+        // State 235
+        -62, -62, -62, 0, -62, 0, 0, 0, -62, 0, 0, 0, -62, 0, -62, -62, -62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -62, -62, -62, -62,
+        // State 236
+        -109, -109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -109, -109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 237
+        -155, -155, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -155, -155, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 238
+        -44, -44, -44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -44, -44, -44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -44, -44, -44, -44,
+        // State 239
+        -115, -115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -115, -115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 240
+        -64, -64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -64, -64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 241
+        -53, -53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -53, -53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 242
+        -175, -175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -175, -175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 243
+        -128, -128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -128, -128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 244
+        -129, -129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -129, -129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 245
+        -137, -137, -137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -137, -137, -137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -137, -137, -137, -137,
+        // State 246
+        -174, -174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -174, -174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 247
+        -121, -121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -121, -121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 248
+        -125, -125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -125, -125, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 249
+        -124, -124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -124, -124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 250
+        -119, -119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -119, -119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 251
+        -113, -113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -113, -113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 252
+        -149, -149, -149, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -149, -149, -149, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -149, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -149, -149, -149, -149,
+        // State 253
+        -161, -161, 0, 0, 0, 0, 0, 0, -161, 0, 0, 0, 0, 0, 0, -161, -161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 254
+        -87, -87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -87, -87, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 255
+        -104, -104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -104, -104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 256
+        -118, -118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -118, -118, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 257
+        -199, -199, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -199, -199, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -199, 0, 0,
+        // State 258
+        -68, -68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -68, -68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 259
+        -99, -99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -99, -99, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 260
+        -156, -156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -156, -156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 261
+        -65, -65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -65, -65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 262
+        -54, -54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -54, -54, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 263
+        -85, -85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -85, -85, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 264
+        -176, -176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -176, -176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 265
+        0, -203, 0, -203, -203, -203, 0, -203, 0, -203, 0, 0, 0, 0, 0, 0, -203, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -203, 0, 0,
+        // State 266
+        0, -163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -163, 0, 0,
+        // State 267
+        0, -206, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -206, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -206, 0, 0,
+        // State 268
+        0, -200, 0, -200, -200, -200, 0, -200, 0, -200, 0, 0, 0, 0, 0, 0, -200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 269
+        -126, -126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -126, -126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 270
+        -100, -100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -100, -100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 271
+        -138, -138, -138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -138, -138, -138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -138, -138, -138, -138,
+        // State 272
+        -127, -127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -127, -127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 273
+        -123, -123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -123, -123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 274
+        -86, -86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -86, -86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 275
+        -95, -95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -95, -95, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 276
+        -150, -150, -150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -150, -150, -150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -150, -150, -150, -150,
+        // State 277
+        -162, -162, 0, 0, 0, 0, 0, 0, -162, 0, 0, 0, 0, 0, 0, -162, -162, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 278
+        -59, -59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -59, -59, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 279
+        -56, -56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -56, -56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 280
+        0, -159, 0, 0, -159, -159, -159, 0, -159, 0, 0, 0, 0, 0, 0, 0, -159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 281
+        -91, -91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -91, -91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 282
+        -107, -107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -107, -107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 283
+        -102, -102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -102, -102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 284
+        -191, -191, -191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -191, -191, -191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -191, -191, -191, -191,
+        // State 285
+        -183, -183, -183, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -183, -183, -183, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -183, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -183, -183, -183, -183,
+        // State 286
+        -185, -185, -185, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -185, -185, -185, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -185, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -185, -185, -185, -185,
+        // State 287
+        -63, -63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -63, -63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 288
+        -108, -108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -108, -108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 289
+        -173, -173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -173, -173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 290
+        -110, -110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -110, -110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 291
+        0, -48, 0, -48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -48, 0, 0,
+        // State 292
+        -171, -171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -171, -171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 293
+        0, -164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -164, 0, 0,
+        // State 294
+        0, -207, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -207, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -207, 0, 0,
+        // State 295
+        -84, -84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -84, -84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 296
+        0, -130, 0, 0, -130, -130, 0, -130, 0, -130, 0, 0, 0, 0, 0, 0, -130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 297
+        -112, -112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -112, -112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 298
+        -60, -60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -60, -60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 299
+        0, -160, 0, 0, -160, -160, -160, 0, -160, 0, 0, 0, 0, 0, 0, 0, -160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 300
+        -105, -105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -105, -105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 301
+        -103, -103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -103, -103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 302
+        -187, -187, -187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -187, -187, -187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -187, -187, -187, -187,
+        // State 303
+        -194, -194, -194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -194, -194, -194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -194, -194, -194, -194,
+        // State 304
+        -189, -189, -189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -189, -189, -189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -189, -189, -189, -189,
+        // State 305
+        -184, -184, -184, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -184, -184, -184, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -184, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -184, -184, -184, -184,
+        // State 306
+        -186, -186, -186, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -186, -186, -186, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -186, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -186, -186, -186, -186,
+        // State 307
+        -97, -97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -97, -97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 308
+        -98, -98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -98, -98, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 309
+        -111, -111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -111, -111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 310
+        -152, -152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -152, -152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 311
+        -145, -145, -145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -145, -145, -145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -145, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -145, -145, -145, -145,
+        // State 312
+        0, -49, 0, -49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -49, 0, 0,
+        // State 313
+        -211, -211, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -211, -211, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 314
+        -172, -172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -172, -172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 315
+        -83, -83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -83, -83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 316
+        -93, -93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -93, -93, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 317
+        -94, -94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -94, -94, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 318
+        -89, -89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -89, -89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 319
+        -90, -90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -90, -90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 320
+        -106, -106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -106, -106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 321
+        -188, -188, -188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -188, -188, -188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -188, -188, -188, -188,
+        // State 322
+        -192, -192, -192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -192, -192, -192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -192, -192, -192, -192,
+        // State 323
+        -190, -190, -190, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -190, -190, -190, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -190, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -190, -190, -190, -190,
+        // State 324
+        -169, -169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -169, -169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 325
+        -66, -66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -66, -66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 326
+        -212, -212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -212, -212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 327
+        -76, -76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -76, -76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 328
+        -80, -80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -80, -80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 329
+        -82, -82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -82, -82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 330
+        -193, -193, -193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -193, -193, -193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -193, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -193, -193, -193, -193,
+        // State 331
+        -170, -170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -170, -170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 332
+        -67, -67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -67, -67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 333
+        -96, -96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -96, -96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 334
+        -75, -75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -75, -75, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 335
+        -79, -79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -79, -79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 336
+        -81, -81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -81, -81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 337
+        -92, -92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -92, -92, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 338
+        -55, -55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -55, -55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 339
+        -88, -88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -88, -88, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 340
+        -72, -72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -72, -72, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 341
+        -74, -74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -74, -74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 342
+        -78, -78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -78, -78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 343
+        -71, -71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -71, -71, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 344
+        -73, -73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -73, -73, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 345
+        -77, -77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -77, -77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 346
+        -70, -70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -70, -70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+        // State 347
+        -69, -69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -69, -69, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+    ];
+    fn __action(state: i16, integer: usize) -> i16 {
+        __ACTION[(state as usize) * 57 + integer]
+    }
+    const __EOF_ACTION: &[i16] = &[
+        // State 0
+        -179,
+        // State 1
+        -180,
+        // State 2
+        0,
+        // State 3
+        0,
+        // State 4
+        0,
+        // State 5
+        0,
+        // State 6
+        0,
+        // State 7
+        0,
+        // State 8
+        0,
+        // State 9
+        0,
+        // State 10
+        0,
+        // State 11
+        0,
+        // State 12
+        0,
+        // State 13
+        0,
+        // State 14
+        0,
+        // State 15
+        0,
+        // State 16
+        0,
+        // State 17
+        0,
+        // State 18
+        0,
+        // State 19
+        0,
+        // State 20
+        0,
+        // State 21
+        0,
+        // State 22
+        0,
+        // State 23
+        0,
+        // State 24
+        0,
+        // State 25
+        0,
+        // State 26
+        0,
+        // State 27
+        0,
+        // State 28
+        0,
+        // State 29
+        0,
+        // State 30
+        0,
+        // State 31
+        0,
+        // State 32
+        0,
+        // State 33
+        0,
+        // State 34
+        0,
+        // State 35
+        0,
+        // State 36
+        0,
+        // State 37
+        0,
+        // State 38
+        0,
+        // State 39
+        0,
+        // State 40
+        0,
+        // State 41
+        0,
+        // State 42
+        0,
+        // State 43
+        0,
+        // State 44
+        0,
+        // State 45
+        0,
+        // State 46
+        0,
+        // State 47
+        0,
+        // State 48
+        0,
+        // State 49
+        0,
+        // State 50
+        0,
+        // State 51
+        0,
+        // State 52
+        0,
+        // State 53
+        0,
+        // State 54
+        0,
+        // State 55
+        0,
+        // State 56
+        0,
+        // State 57
+        0,
+        // State 58
+        0,
+        // State 59
+        0,
+        // State 60
+        0,
+        // State 61
+        0,
+        // State 62
+        0,
+        // State 63
+        0,
+        // State 64
+        0,
+        // State 65
+        0,
+        // State 66
+        0,
+        // State 67
+        0,
+        // State 68
+        0,
+        // State 69
+        0,
+        // State 70
+        0,
+        // State 71
+        0,
+        // State 72
+        0,
+        // State 73
+        0,
+        // State 74
+        0,
+        // State 75
+        0,
+        // State 76
+        0,
+        // State 77
+        0,
+        // State 78
+        0,
+        // State 79
+        0,
+        // State 80
+        0,
+        // State 81
+        0,
+        // State 82
+        0,
+        // State 83
+        0,
+        // State 84
+        0,
+        // State 85
+        0,
+        // State 86
+        0,
+        // State 87
+        0,
+        // State 88
+        0,
+        // State 89
+        0,
+        // State 90
+        0,
+        // State 91
+        0,
+        // State 92
+        0,
+        // State 93
+        0,
+        // State 94
+        0,
+        // State 95
+        0,
+        // State 96
+        0,
+        // State 97
+        0,
+        // State 98
+        0,
+        // State 99
+        0,
+        // State 100
+        0,
+        // State 101
+        0,
+        // State 102
+        0,
+        // State 103
+        0,
+        // State 104
+        0,
+        // State 105
+        0,
+        // State 106
+        0,
+        // State 107
+        0,
+        // State 108
+        0,
+        // State 109
+        0,
+        // State 110
+        0,
+        // State 111
+        0,
+        // State 112
+        0,
+        // State 113
+        0,
+        // State 114
+        0,
+        // State 115
+        0,
+        // State 116
+        0,
+        // State 117
+        0,
+        // State 118
+        0,
+        // State 119
+        0,
+        // State 120
+        0,
+        // State 121
+        0,
+        // State 122
+        0,
+        // State 123
+        0,
+        // State 124
+        0,
+        // State 125
+        0,
+        // State 126
+        0,
+        // State 127
+        0,
+        // State 128
+        0,
+        // State 129
+        0,
+        // State 130
+        0,
+        // State 131
+        0,
+        // State 132
+        0,
+        // State 133
+        0,
+        // State 134
+        0,
+        // State 135
+        0,
+        // State 136
+        0,
+        // State 137
+        0,
+        // State 138
+        0,
+        // State 139
+        0,
+        // State 140
+        0,
+        // State 141
+        0,
+        // State 142
+        0,
+        // State 143
+        0,
+        // State 144
+        0,
+        // State 145
+        0,
+        // State 146
+        0,
+        // State 147
+        0,
+        // State 148
+        0,
+        // State 149
+        0,
+        // State 150
+        0,
+        // State 151
+        0,
+        // State 152
+        0,
+        // State 153
+        0,
+        // State 154
+        0,
+        // State 155
+        0,
+        // State 156
+        0,
+        // State 157
+        0,
+        // State 158
+        0,
+        // State 159
+        0,
+        // State 160
+        0,
+        // State 161
+        0,
+        // State 162
+        0,
+        // State 163
+        0,
+        // State 164
+        0,
+        // State 165
+        0,
+        // State 166
+        0,
+        // State 167
+        0,
+        // State 168
+        0,
+        // State 169
+        0,
+        // State 170
+        0,
+        // State 171
+        0,
+        // State 172
+        0,
+        // State 173
+        0,
+        // State 174
+        0,
+        // State 175
+        0,
+        // State 176
+        0,
+        // State 177
+        0,
+        // State 178
+        0,
+        // State 179
+        0,
+        // State 180
+        0,
+        // State 181
+        0,
+        // State 182
+        0,
+        // State 183
+        0,
+        // State 184
+        0,
+        // State 185
+        0,
+        // State 186
+        0,
+        // State 187
+        0,
+        // State 188
+        0,
+        // State 189
+        0,
+        // State 190
+        0,
+        // State 191
+        0,
+        // State 192
+        0,
+        // State 193
+        0,
+        // State 194
+        0,
+        // State 195
+        0,
+        // State 196
+        0,
+        // State 197
+        0,
+        // State 198
+        -177,
+        // State 199
+        -33,
+        // State 200
+        -101,
+        // State 201
+        -216,
+        // State 202
+        0,
+        // State 203
+        0,
+        // State 204
+        -34,
+        // State 205
+        0,
+        // State 206
+        0,
+        // State 207
+        0,
+        // State 208
+        0,
+        // State 209
+        0,
+        // State 210
+        0,
+        // State 211
+        0,
+        // State 212
+        -61,
+        // State 213
+        0,
+        // State 214
+        0,
+        // State 215
+        -181,
+        // State 216
+        0,
+        // State 217
+        0,
+        // State 218
+        -182,
+        // State 219
+        0,
+        // State 220
+        0,
+        // State 221
+        0,
+        // State 222
+        0,
+        // State 223
+        0,
+        // State 224
+        0,
+        // State 225
+        -114,
+        // State 226
+        -116,
+        // State 227
+        0,
+        // State 228
+        -122,
+        // State 229
+        -120,
+        // State 230
+        0,
+        // State 231
+        0,
+        // State 232
+        -117,
+        // State 233
+        0,
+        // State 234
+        0,
+        // State 235
+        -62,
+        // State 236
+        -109,
+        // State 237
+        0,
+        // State 238
+        0,
+        // State 239
+        -115,
+        // State 240
+        -64,
+        // State 241
+        0,
+        // State 242
+        -175,
+        // State 243
+        -128,
+        // State 244
+        -129,
+        // State 245
+        0,
+        // State 246
+        -174,
+        // State 247
+        -121,
+        // State 248
+        -125,
+        // State 249
+        -124,
+        // State 250
+        -119,
+        // State 251
+        -113,
+        // State 252
+        0,
+        // State 253
+        0,
+        // State 254
+        -87,
+        // State 255
+        -104,
+        // State 256
+        -118,
+        // State 257
+        0,
+        // State 258
+        -68,
+        // State 259
+        -99,
+        // State 260
+        0,
+        // State 261
+        -65,
+        // State 262
+        0,
+        // State 263
+        -85,
+        // State 264
+        -176,
+        // State 265
+        0,
+        // State 266
+        0,
+        // State 267
+        0,
+        // State 268
+        0,
+        // State 269
+        -126,
+        // State 270
+        -100,
+        // State 271
+        0,
+        // State 272
+        -127,
+        // State 273
+        -123,
+        // State 274
+        -86,
+        // State 275
+        -95,
+        // State 276
+        0,
+        // State 277
+        0,
+        // State 278
+        0,
+        // State 279
+        0,
+        // State 280
+        0,
+        // State 281
+        -91,
+        // State 282
+        -107,
+        // State 283
+        -102,
+        // State 284
+        0,
+        // State 285
+        0,
+        // State 286
+        0,
+        // State 287
+        -63,
+        // State 288
+        -108,
+        // State 289
+        -173,
+        // State 290
+        -110,
+        // State 291
+        0,
+        // State 292
+        -171,
+        // State 293
+        0,
+        // State 294
+        0,
+        // State 295
+        -84,
+        // State 296
+        0,
+        // State 297
+        -112,
+        // State 298
+        0,
+        // State 299
+        0,
+        // State 300
+        -105,
+        // State 301
+        -103,
+        // State 302
+        0,
+        // State 303
+        0,
+        // State 304
+        0,
+        // State 305
+        0,
+        // State 306
+        0,
+        // State 307
+        -97,
+        // State 308
+        -98,
+        // State 309
+        -111,
+        // State 310
+        0,
+        // State 311
+        0,
+        // State 312
+        0,
+        // State 313
+        0,
+        // State 314
+        -172,
+        // State 315
+        -83,
+        // State 316
+        -93,
+        // State 317
+        -94,
+        // State 318
+        -89,
+        // State 319
+        -90,
+        // State 320
+        -106,
+        // State 321
+        0,
+        // State 322
+        0,
+        // State 323
+        0,
+        // State 324
+        -169,
+        // State 325
+        -66,
+        // State 326
+        0,
+        // State 327
+        -76,
+        // State 328
+        -80,
+        // State 329
+        -82,
+        // State 330
+        0,
+        // State 331
+        -170,
+        // State 332
+        -67,
+        // State 333
+        -96,
+        // State 334
+        -75,
+        // State 335
+        -79,
+        // State 336
+        -81,
+        // State 337
+        -92,
+        // State 338
+        0,
+        // State 339
+        -88,
+        // State 340
+        -72,
+        // State 341
+        -74,
+        // State 342
+        -78,
+        // State 343
+        -71,
+        // State 344
+        -73,
+        // State 345
+        -77,
+        // State 346
+        -70,
+        // State 347
+        -69,
+    ];
+    fn __goto(state: i16, nt: usize) -> i16 {
+        match nt {
+            20 => 1,
+            23 => match state {
+                135 => 159,
+                _ => 36,
+            },
+            26 => match state {
+                97 => 127,
+                126 => 153,
+                130 => 156,
+                155 => 172,
+                _ => 41,
+            },
+            29 => 141,
+            32 => 78,
+            33 => match state {
+                122 => 298,
+                _ => 278,
+            },
+            35 => 122,
+            36 => match state {
+                0..=1 | 13 | 94 | 122 => 198,
+                _ => 206,
+            },
+            37 => match state {
+                0 => 199,
+                1 => 204,
+                _ => 47,
+            },
+            38 => match state {
+                113 => 142,
+                141 => 162,
+                _ => 117,
+            },
+            39 => match state {
+                5 => 39,
+                12 => 46,
+                26 => 61,
+                35 => 72,
+                39 => 73,
+                46 => 82,
+                51 => 87,
+                61 => 92,
+                69 => 103,
+                70 => 104,
+                72 => 106,
+                112 => 140,
+                134 => 158,
+                144 => 163,
+                145 => 164,
+                157 => 173,
+                166 => 179,
+                167 => 180,
+                170 => 183,
+                176 => 185,
+                177 => 186,
+                178 => 187,
+                188 => 192,
+                189 => 193,
+                190 => 194,
+                191 => 195,
+                196 => 197,
+                3 | 135 => 207,
+                36 | 159 => 234,
+                52 | 76..=77 | 81 | 102 | 109 => 245,
+                88 | 111 | 114 | 133 | 138 => 271,
+                _ => 223,
+            },
+            41 => match state {
+                76 => 111,
+                77 => 112,
+                81 => 114,
+                102 => 133,
+                109 => 138,
+                _ => 88,
+            },
+            43 => 208,
+            44 => match state {
+                24 => 58,
+                90 => 119,
+                41 | 127 | 153 | 156 | 172 => 238,
+                62 => 252,
+                93 => 276,
+                _ => 224,
+            },
+            46 => 93,
+            47 => match state {
+                2 | 37 | 42 | 123 => 3,
+                4 => 38,
+                9 => 43,
+                10 => 44,
+                14 => 48,
+                16 => 50,
+                17 => 51,
+                21 => 55,
+                22 => 56,
+                25 => 60,
+                28 => 64,
+                29 => 65,
+                32 => 69,
+                34 => 71,
+                44 => 80,
+                45 => 81,
+                68 => 102,
+                75 => 110,
+                79 => 113,
+                99 => 129,
+                105 => 135,
+                107 => 136,
+                120 => 148,
+                125 => 152,
+                150 => 170,
+                161 => 175,
+                169 => 182,
+                30 | 33 | 67 | 100..=101 | 128 | 131..=132 | 154 => 230,
+                83..=84 | 110 | 113 | 116 | 141 => 265,
+                _ => 209,
+            },
+            48 => match state {
+                74 => 260,
+                _ => 237,
+            },
+            50 => 74,
+            51 => match state {
+                0..=1 | 13 => 2,
+                6 => 40,
+                7 | 24 | 41 | 62 | 90 | 93 | 97 | 126..=127 | 130 | 153 | 155..=156 | 172 => 42,
+                11 => 45,
+                27 | 108 | 121 => 62,
+                31 => 68,
+                40 | 74 => 75,
+                43 | 78 => 79,
+                48 | 60 => 83,
+                63 | 146 | 168 => 94,
+                71 => 105,
+                94 | 122 => 123,
+                30 | 33 | 67 | 100..=101 | 128 | 131..=132 | 154 => 231,
+                _ => 37,
+            },
+            52 => match state {
+                146 => 165,
+                168 => 181,
+                _ => 95,
+            },
+            53 => match state {
+                108 => 137,
+                121 => 149,
+                _ => 63,
+            },
+            54 => match state {
+                60 => 91,
+                _ => 84,
+            },
+            55 => 210,
+            57 => match state {
+                94 | 122 => 279,
+                _ => 200,
+            },
+            58 => match state {
+                20 | 23 | 29 | 56 | 59 | 65 | 98 | 118 => 227,
+                _ => 211,
+            },
+            59 => 201,
+            60 => match state {
+                74 => 109,
+                81 => 115,
+                102 => 134,
+                114 => 143,
+                133 => 157,
+                135 => 160,
+                159 => 174,
+                3 => 212,
+                7 => 225,
+                8 => 226,
+                20 => 228,
+                23 => 229,
+                30 => 232,
+                36 => 235,
+                38 => 236,
+                41 => 239,
+                43 => 240,
+                46 => 242,
+                47 => 243,
+                49 => 244,
+                53 => 246,
+                54 => 247,
+                55 => 248,
+                56 => 249,
+                57 => 250,
+                58 => 251,
+                62 => 253,
+                64 => 254,
+                66 => 255,
+                67 => 256,
+                71 => 258,
+                73 => 259,
+                78 => 261,
+                80 => 263,
+                82 => 264,
+                83 => 266,
+                86 => 269,
+                87 => 270,
+                88 => 272,
+                89 => 273,
+                91 => 274,
+                92 => 275,
+                93 => 277,
+                94 => 280,
+                95 => 281,
+                96 => 282,
+                97 => 283,
+                99 => 284,
+                100 => 285,
+                101 => 286,
+                103 => 287,
+                104 => 288,
+                106 => 289,
+                111 => 290,
+                115 => 292,
+                116 => 293,
+                117 => 295,
+                119 => 297,
+                122 => 299,
+                126 => 300,
+                127 => 301,
+                128 => 302,
+                129 => 303,
+                130 => 304,
+                131 => 305,
+                132 => 306,
+                136 => 307,
+                137 => 308,
+                138 => 309,
+                139 => 310,
+                140 => 311,
+                142 => 313,
+                143 => 314,
+                147 => 315,
+                148 => 316,
+                149 => 317,
+                151 => 318,
+                152 => 319,
+                153 => 320,
+                154 => 321,
+                155 => 322,
+                156 => 323,
+                158 => 324,
+                160 => 325,
+                162 => 326,
+                163 => 327,
+                164 => 328,
+                165 => 329,
+                172 => 330,
+                173 => 331,
+                174 => 332,
+                175 => 333,
+                179 => 334,
+                180 => 335,
+                181 => 336,
+                182 => 337,
+                183 => 338,
+                184 => 339,
+                185 => 340,
+                186 => 341,
+                187 => 342,
+                192 => 343,
+                193 => 344,
+                194 => 345,
+                195 => 346,
+                197 => 347,
+                _ => 76,
+            },
+            61 => match state {
+                33 => 70,
+                67 | 131..=132 | 154 => 257,
+                _ => 233,
+            },
+            63 => match state {
+                100 => 131,
+                101 => 132,
+                128 => 154,
+                _ => 67,
+            },
+            64 => 85,
+            65 => match state {
+                15 => 49,
+                18 => 52,
+                19 => 53,
+                50 => 86,
+                124 => 151,
+                171 => 184,
+                _ => 213,
+            },
+            66 => 214,
+            67 => match state {
+                83 => 267,
+                84 => 268,
+                113 => 291,
+                116 => 294,
+                141 => 312,
+                _ => 139,
+            },
+            69 => 116,
+            70 => match state {
+                23 => 57,
+                29 => 66,
+                56 => 89,
+                59 => 90,
+                65 => 96,
+                98 => 128,
+                118 => 296,
+                _ => 54,
+            },
+            72 => match state {
+                78 => 262,
+                _ => 241,
+            },
+            _ => 0,
+        }
+    }
+    const __TERMINAL: &[&str] = &[
+        r###""(""###,
+        r###"")""###,
+        r###""-inf""###,
+        r###"":cost""###,
+        r###"":default""###,
+        r###"":merge""###,
+        r###"":name""###,
+        r###"":on_merge""###,
+        r###"":ruleset""###,
+        r###"":unextractable""###,
+        r###"":until""###,
+        r###"":variants""###,
+        r###"":when""###,
+        r###""=""###,
+        r###""NaN""###,
+        r###""[""###,
+        r###""]""###,
+        r###""add-ruleset""###,
+        r###""birewrite""###,
+        r###""calc""###,
+        r###""check""###,
+        r###""check-proof""###,
+        r###""datatype""###,
+        r###""declare""###,
+        r###""delete""###,
+        r###""extract""###,
+        r###""fail""###,
+        r###""function""###,
+        r###""include""###,
+        r###""inf""###,
+        r###""input""###,
+        r###""let""###,
+        r###""output""###,
+        r###""panic""###,
+        r###""pop""###,
+        r###""print-size""###,
+        r###""print-table""###,
+        r###""push""###,
+        r###""query-extract""###,
+        r###""relation""###,
+        r###""repeat""###,
+        r###""rewrite""###,
+        r###""rule""###,
+        r###""ruleset""###,
+        r###""run""###,
+        r###""run-schedule""###,
+        r###""saturate""###,
+        r###""seq""###,
+        r###""set""###,
+        r###""set-option""###,
+        r###""simplify""###,
+        r###""sort""###,
+        r###""union""###,
+        r###"r#"(\"[^\"]*\")+"#"###,
+        r###"r#"(([[:alpha:]][\\w-]*)|([-+*/?!=<>&|^/%_]))+"#"###,
+        r###"r#"(-)?[0-9]+"#"###,
+        r###"r#"(-)?[0-9]+\\.[0-9]+(e(\\+)?(-)?[0-9]+)?"#"###,
+    ];
+    fn __expected_tokens(__state: i16) -> alloc::vec::Vec<alloc::string::String> {
+        __TERMINAL.iter().enumerate().filter_map(|(index, terminal)| {
+            let next_state = __action(__state, index);
+            if next_state == 0 {
+                None
+            } else {
+                Some(alloc::string::ToString::to_string(terminal))
+            }
+        }).collect()
+    }
+    fn __expected_tokens_from_states<
+        'input,
+    >(
+        __states: &[i16],
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> alloc::vec::Vec<alloc::string::String>
+    {
+        __TERMINAL.iter().enumerate().filter_map(|(index, terminal)| {
+            if __accepts(None, __states, Some(index), core::marker::PhantomData::<(&())>) {
+                Some(alloc::string::ToString::to_string(terminal))
+            } else {
+                None
+            }
+        }).collect()
+    }
+    pub(crate) struct __StateMachine<'input>
+    where 
+    {
+        input: &'input str,
+        __phantom: core::marker::PhantomData<(&'input ())>,
+    }
+    impl<'input> __state_machine::ParserDefinition for __StateMachine<'input>
+    where 
+    {
+        type Location = usize;
+        type Error = String;
+        type Token = Token<'input>;
+        type TokenIndex = usize;
+        type Symbol = __Symbol<'input>;
+        type Success = Vec<Command>;
+        type StateIndex = i16;
+        type Action = i16;
+        type ReduceIndex = i16;
+        type NonterminalIndex = usize;
+
+        #[inline]
+        fn start_location(&self) -> Self::Location {
+              Default::default()
+        }
+
+        #[inline]
+        fn start_state(&self) -> Self::StateIndex {
+              0
+        }
+
+        #[inline]
+        fn token_to_index(&self, token: &Self::Token) -> Option<usize> {
+            __token_to_integer(token, core::marker::PhantomData::<(&())>)
+        }
+
+        #[inline]
+        fn action(&self, state: i16, integer: usize) -> i16 {
+            __action(state, integer)
+        }
+
+        #[inline]
+        fn error_action(&self, state: i16) -> i16 {
+            __action(state, 57 - 1)
+        }
+
+        #[inline]
+        fn eof_action(&self, state: i16) -> i16 {
+            __EOF_ACTION[state as usize]
+        }
+
+        #[inline]
+        fn goto(&self, state: i16, nt: usize) -> i16 {
+            __goto(state, nt)
+        }
+
+        fn token_to_symbol(&self, token_index: usize, token: Self::Token) -> Self::Symbol {
+            __token_to_symbol(token_index, token, core::marker::PhantomData::<(&())>)
+        }
+
+        fn expected_tokens(&self, state: i16) -> alloc::vec::Vec<alloc::string::String> {
+            __expected_tokens(state)
+        }
+
+        fn expected_tokens_from_states(&self, states: &[i16]) -> alloc::vec::Vec<alloc::string::String> {
+            __expected_tokens_from_states(states, core::marker::PhantomData::<(&())>)
+        }
+
+        #[inline]
+        fn uses_error_recovery(&self) -> bool {
+            false
+        }
+
+        #[inline]
+        fn error_recovery_symbol(
+            &self,
+            recovery: __state_machine::ErrorRecovery<Self>,
+        ) -> Self::Symbol {
+            panic!("error recovery not enabled for this grammar")
+        }
+
+        fn reduce(
+            &mut self,
+            action: i16,
+            start_location: Option<&Self::Location>,
+            states: &mut alloc::vec::Vec<i16>,
+            symbols: &mut alloc::vec::Vec<__state_machine::SymbolTriple<Self>>,
+        ) -> Option<__state_machine::ParseResult<Self>> {
+            __reduce(
+                self.input,
+                action,
+                start_location,
+                states,
+                symbols,
+                core::marker::PhantomData::<(&())>,
+            )
+        }
+
+        fn simulate_reduce(&self, action: i16) -> __state_machine::SimulatedReduce<Self> {
+            __simulate_reduce(action, core::marker::PhantomData::<(&())>)
+        }
+    }
+    fn __token_to_integer<
+        'input,
+    >(
+        __token: &Token<'input>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> Option<usize>
+    {
+        match *__token {
+            Token(4, _) if true => Some(0),
+            Token(5, _) if true => Some(1),
+            Token(6, _) if true => Some(2),
+            Token(7, _) if true => Some(3),
+            Token(8, _) if true => Some(4),
+            Token(9, _) if true => Some(5),
+            Token(10, _) if true => Some(6),
+            Token(11, _) if true => Some(7),
+            Token(12, _) if true => Some(8),
+            Token(13, _) if true => Some(9),
+            Token(14, _) if true => Some(10),
+            Token(15, _) if true => Some(11),
+            Token(16, _) if true => Some(12),
+            Token(17, _) if true => Some(13),
+            Token(18, _) if true => Some(14),
+            Token(19, _) if true => Some(15),
+            Token(20, _) if true => Some(16),
+            Token(21, _) if true => Some(17),
+            Token(22, _) if true => Some(18),
+            Token(23, _) if true => Some(19),
+            Token(24, _) if true => Some(20),
+            Token(25, _) if true => Some(21),
+            Token(26, _) if true => Some(22),
+            Token(27, _) if true => Some(23),
+            Token(28, _) if true => Some(24),
+            Token(29, _) if true => Some(25),
+            Token(30, _) if true => Some(26),
+            Token(31, _) if true => Some(27),
+            Token(32, _) if true => Some(28),
+            Token(33, _) if true => Some(29),
+            Token(34, _) if true => Some(30),
+            Token(35, _) if true => Some(31),
+            Token(36, _) if true => Some(32),
+            Token(37, _) if true => Some(33),
+            Token(38, _) if true => Some(34),
+            Token(39, _) if true => Some(35),
+            Token(40, _) if true => Some(36),
+            Token(41, _) if true => Some(37),
+            Token(42, _) if true => Some(38),
+            Token(43, _) if true => Some(39),
+            Token(44, _) if true => Some(40),
+            Token(45, _) if true => Some(41),
+            Token(46, _) if true => Some(42),
+            Token(47, _) if true => Some(43),
+            Token(48, _) if true => Some(44),
+            Token(49, _) if true => Some(45),
+            Token(50, _) if true => Some(46),
+            Token(51, _) if true => Some(47),
+            Token(52, _) if true => Some(48),
+            Token(53, _) if true => Some(49),
+            Token(54, _) if true => Some(50),
+            Token(55, _) if true => Some(51),
+            Token(56, _) if true => Some(52),
+            Token(0, _) if true => Some(53),
+            Token(1, _) if true => Some(54),
+            Token(2, _) if true => Some(55),
+            Token(3, _) if true => Some(56),
+            _ => None,
+        }
+    }
+    fn __token_to_symbol<
+        'input,
+    >(
+        __token_index: usize,
+        __token: Token<'input>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> __Symbol<'input>
+    {
+        match __token_index {
+            0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 => match __token {
+                Token(4, __tok0) | Token(5, __tok0) | Token(6, __tok0) | Token(7, __tok0) | Token(8, __tok0) | Token(9, __tok0) | Token(10, __tok0) | Token(11, __tok0) | Token(12, __tok0) | Token(13, __tok0) | Token(14, __tok0) | Token(15, __tok0) | Token(16, __tok0) | Token(17, __tok0) | Token(18, __tok0) | Token(19, __tok0) | Token(20, __tok0) | Token(21, __tok0) | Token(22, __tok0) | Token(23, __tok0) | Token(24, __tok0) | Token(25, __tok0) | Token(26, __tok0) | Token(27, __tok0) | Token(28, __tok0) | Token(29, __tok0) | Token(30, __tok0) | Token(31, __tok0) | Token(32, __tok0) | Token(33, __tok0) | Token(34, __tok0) | Token(35, __tok0) | Token(36, __tok0) | Token(37, __tok0) | Token(38, __tok0) | Token(39, __tok0) | Token(40, __tok0) | Token(41, __tok0) | Token(42, __tok0) | Token(43, __tok0) | Token(44, __tok0) | Token(45, __tok0) | Token(46, __tok0) | Token(47, __tok0) | Token(48, __tok0) | Token(49, __tok0) | Token(50, __tok0) | Token(51, __tok0) | Token(52, __tok0) | Token(53, __tok0) | Token(54, __tok0) | Token(55, __tok0) | Token(56, __tok0) | Token(0, __tok0) | Token(1, __tok0) | Token(2, __tok0) | Token(3, __tok0) if true => __Symbol::Variant0(__tok0),
+                _ => unreachable!(),
+            },
+            _ => unreachable!(),
+        }
+    }
+    fn __simulate_reduce<
+        'input,
+    >(
+        __reduce_index: i16,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> __state_machine::SimulatedReduce<__StateMachine<'input>>
+    {
+        match __reduce_index {
+            0 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 0,
+                }
+            }
+            1 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 1,
+                }
+            }
+            2 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 1,
+                }
+            }
+            3 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 2,
+                }
+            }
+            4 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 3,
+                }
+            }
+            5 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 3,
+                }
+            }
+            6 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 4,
+                }
+            }
+            7 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 5,
+                }
+            }
+            8 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 5,
+                }
+            }
+            9 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 6,
+                }
+            }
+            10 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 7,
+                }
+            }
+            11 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 7,
+                }
+            }
+            12 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 8,
+                }
+            }
+            13 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 9,
+                }
+            }
+            14 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 9,
+                }
+            }
+            15 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 10,
+                }
+            }
+            16 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 11,
+                }
+            }
+            17 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 11,
+                }
+            }
+            18 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 12,
+                }
+            }
+            19 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 12,
+                }
+            }
+            20 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 13,
+                }
+            }
+            21 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 13,
+                }
+            }
+            22 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 13,
+                }
+            }
+            23 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 14,
+                }
+            }
+            24 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 15,
+                }
+            }
+            25 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 15,
+                }
+            }
+            26 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 16,
+                }
+            }
+            27 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 17,
+                }
+            }
+            28 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 17,
+                }
+            }
+            29 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 18,
+                }
+            }
+            30 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 19,
+                }
+            }
+            31 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 19,
+                }
+            }
+            32 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 20,
+                }
+            }
+            33 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 20,
+                }
+            }
+            34 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 21,
+                }
+            }
+            35 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 22,
+                }
+            }
+            36 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 22,
+                }
+            }
+            37 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 23,
+                }
+            }
+            38 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 23,
+                }
+            }
+            39 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 24,
+                }
+            }
+            40 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 25,
+                }
+            }
+            41 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 25,
+                }
+            }
+            42 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 26,
+                }
+            }
+            43 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 26,
+                }
+            }
+            44 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 27,
+                }
+            }
+            45 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 28,
+                }
+            }
+            46 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 28,
+                }
+            }
+            47 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 29,
+                }
+            }
+            48 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 29,
+                }
+            }
+            49 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 30,
+                }
+            }
+            50 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 31,
+                }
+            }
+            51 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 31,
+                }
+            }
+            52 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 32,
+                }
+            }
+            53 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 32,
+                }
+            }
+            54 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 33,
+                }
+            }
+            55 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 33,
+                }
+            }
+            56 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 34,
+                }
+            }
+            57 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 34,
+                }
+            }
+            58 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 35,
+                }
+            }
+            59 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 35,
+                }
+            }
+            60 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 3,
+                    nonterminal_produced: 36,
+                }
+            }
+            61 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 36,
+                }
+            }
+            62 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 37,
+                }
+            }
+            63 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 37,
+                }
+            }
+            64 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 37,
+                }
+            }
+            65 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 7,
+                    nonterminal_produced: 37,
+                }
+            }
+            66 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 8,
+                    nonterminal_produced: 37,
+                }
+            }
+            67 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 37,
+                }
+            }
+            68 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 13,
+                    nonterminal_produced: 37,
+                }
+            }
+            69 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 12,
+                    nonterminal_produced: 37,
+                }
+            }
+            70 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 11,
+                    nonterminal_produced: 37,
+                }
+            }
+            71 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 10,
+                    nonterminal_produced: 37,
+                }
+            }
+            72 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 11,
+                    nonterminal_produced: 37,
+                }
+            }
+            73 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 10,
+                    nonterminal_produced: 37,
+                }
+            }
+            74 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 9,
+                    nonterminal_produced: 37,
+                }
+            }
+            75 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 8,
+                    nonterminal_produced: 37,
+                }
+            }
+            76 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 11,
+                    nonterminal_produced: 37,
+                }
+            }
+            77 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 10,
+                    nonterminal_produced: 37,
+                }
+            }
+            78 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 9,
+                    nonterminal_produced: 37,
+                }
+            }
+            79 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 8,
+                    nonterminal_produced: 37,
+                }
+            }
+            80 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 9,
+                    nonterminal_produced: 37,
+                }
+            }
+            81 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 8,
+                    nonterminal_produced: 37,
+                }
+            }
+            82 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 7,
+                    nonterminal_produced: 37,
+                }
+            }
+            83 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 6,
+                    nonterminal_produced: 37,
+                }
+            }
+            84 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 37,
+                }
+            }
+            85 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 37,
+                }
+            }
+            86 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 37,
+                }
+            }
+            87 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 9,
+                    nonterminal_produced: 37,
+                }
+            }
+            88 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 7,
+                    nonterminal_produced: 37,
+                }
+            }
+            89 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 7,
+                    nonterminal_produced: 37,
+                }
+            }
+            90 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 37,
+                }
+            }
+            91 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 9,
+                    nonterminal_produced: 37,
+                }
+            }
+            92 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 7,
+                    nonterminal_produced: 37,
+                }
+            }
+            93 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 7,
+                    nonterminal_produced: 37,
+                }
+            }
+            94 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 37,
+                }
+            }
+            95 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 9,
+                    nonterminal_produced: 37,
+                }
+            }
+            96 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 7,
+                    nonterminal_produced: 37,
+                }
+            }
+            97 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 7,
+                    nonterminal_produced: 37,
+                }
+            }
+            98 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 37,
+                }
+            }
+            99 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 37,
+                }
+            }
+            100 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 37,
+                }
+            }
+            101 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 37,
+                }
+            }
+            102 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 6,
+                    nonterminal_produced: 37,
+                }
+            }
+            103 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 37,
+                }
+            }
+            104 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 6,
+                    nonterminal_produced: 37,
+                }
+            }
+            105 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 7,
+                    nonterminal_produced: 37,
+                }
+            }
+            106 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 37,
+                }
+            }
+            107 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 37,
+                }
+            }
+            108 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 37,
+                }
+            }
+            109 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 6,
+                    nonterminal_produced: 37,
+                }
+            }
+            110 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 7,
+                    nonterminal_produced: 37,
+                }
+            }
+            111 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 6,
+                    nonterminal_produced: 37,
+                }
+            }
+            112 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 37,
+                }
+            }
+            113 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 3,
+                    nonterminal_produced: 37,
+                }
+            }
+            114 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 37,
+                }
+            }
+            115 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 3,
+                    nonterminal_produced: 37,
+                }
+            }
+            116 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 3,
+                    nonterminal_produced: 37,
+                }
+            }
+            117 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 37,
+                }
+            }
+            118 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 37,
+                }
+            }
+            119 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 3,
+                    nonterminal_produced: 37,
+                }
+            }
+            120 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 37,
+                }
+            }
+            121 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 3,
+                    nonterminal_produced: 37,
+                }
+            }
+            122 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 37,
+                }
+            }
+            123 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 37,
+                }
+            }
+            124 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 37,
+                }
+            }
+            125 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 37,
+                }
+            }
+            126 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 37,
+                }
+            }
+            127 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 37,
+                }
+            }
+            128 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 37,
+                }
+            }
+            129 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 38,
+                }
+            }
+            130 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 38,
+                }
+            }
+            131 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 39,
+                }
+            }
+            132 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 39,
+                }
+            }
+            133 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 39,
+                }
+            }
+            134 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 40,
+                }
+            }
+            135 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 40,
+                }
+            }
+            136 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 41,
+                }
+            }
+            137 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 41,
+                }
+            }
+            138 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 42,
+                }
+            }
+            139 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 3,
+                    nonterminal_produced: 42,
+                }
+            }
+            140 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 43,
+                }
+            }
+            141 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 43,
+                }
+            }
+            142 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 43,
+                }
+            }
+            143 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 43,
+                }
+            }
+            144 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 44,
+                }
+            }
+            145 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 44,
+                }
+            }
+            146 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 45,
+                }
+            }
+            147 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 45,
+                }
+            }
+            148 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 46,
+                }
+            }
+            149 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 46,
+                }
+            }
+            150 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 47,
+                }
+            }
+            151 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 48,
+                }
+            }
+            152 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 49,
+                }
+            }
+            153 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 49,
+                }
+            }
+            154 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 50,
+                }
+            }
+            155 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 50,
+                }
+            }
+            156 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 51,
+                }
+            }
+            157 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 51,
+                }
+            }
+            158 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 52,
+                }
+            }
+            159 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 3,
+                    nonterminal_produced: 52,
+                }
+            }
+            160 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 53,
+                }
+            }
+            161 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 3,
+                    nonterminal_produced: 53,
+                }
+            }
+            162 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 54,
+                }
+            }
+            163 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 3,
+                    nonterminal_produced: 54,
+                }
+            }
+            164 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 55,
+                }
+            }
+            165 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 55,
+                }
+            }
+            166 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 55,
+                }
+            }
+            167 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 3,
+                    nonterminal_produced: 56,
+                }
+            }
+            168 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 7,
+                    nonterminal_produced: 57,
+                }
+            }
+            169 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 8,
+                    nonterminal_produced: 57,
+                }
+            }
+            170 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 6,
+                    nonterminal_produced: 57,
+                }
+            }
+            171 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 7,
+                    nonterminal_produced: 57,
+                }
+            }
+            172 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 57,
+                }
+            }
+            173 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 57,
+                }
+            }
+            174 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 57,
+                }
+            }
+            175 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 57,
+                }
+            }
+            176 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 57,
+                }
+            }
+            177 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 58,
+                }
+            }
+            178 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 59,
+                }
+            }
+            179 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 59,
+                }
+            }
+            180 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 60,
+                }
+            }
+            181 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 60,
+                }
+            }
+            182 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 3,
+                    nonterminal_produced: 61,
+                }
+            }
+            183 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 61,
+                }
+            }
+            184 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 3,
+                    nonterminal_produced: 61,
+                }
+            }
+            185 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 61,
+                }
+            }
+            186 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 61,
+                }
+            }
+            187 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 61,
+                }
+            }
+            188 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 61,
+                }
+            }
+            189 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 61,
+                }
+            }
+            190 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 3,
+                    nonterminal_produced: 61,
+                }
+            }
+            191 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 61,
+                }
+            }
+            192 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 6,
+                    nonterminal_produced: 61,
+                }
+            }
+            193 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 61,
+                }
+            }
+            194 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 61,
+                }
+            }
+            195 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 62,
+                }
+            }
+            196 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 62,
+                }
+            }
+            197 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 63,
+                }
+            }
+            198 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 63,
+                }
+            }
+            199 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 64,
+                }
+            }
+            200 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 65,
+                }
+            }
+            201 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 66,
+                }
+            }
+            202 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 67,
+                }
+            }
+            203 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 68,
+                }
+            }
+            204 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 68,
+                }
+            }
+            205 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 69,
+                }
+            }
+            206 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 2,
+                    nonterminal_produced: 69,
+                }
+            }
+            207 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 70,
+                }
+            }
+            208 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 71,
+                }
+            }
+            209 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 0,
+                    nonterminal_produced: 71,
+                }
+            }
+            210 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 4,
+                    nonterminal_produced: 72,
+                }
+            }
+            211 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 5,
+                    nonterminal_produced: 72,
+                }
+            }
+            212 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 73,
+                }
+            }
+            213 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 74,
+                }
+            }
+            214 => {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop: 1,
+                    nonterminal_produced: 75,
+                }
+            }
+            215 => __state_machine::SimulatedReduce::Accept,
+            _ => panic!("invalid reduction index {}", __reduce_index)
+        }
+    }
+    pub struct ProgramParser {
+        builder: __lalrpop_util::lexer::MatcherBuilder,
+        _priv: (),
+    }
+
+    impl ProgramParser {
+        pub fn new() -> ProgramParser {
+            let __builder = super::__intern_token::new_builder();
+            ProgramParser {
+                builder: __builder,
+                _priv: (),
+            }
+        }
+
+        #[allow(dead_code)]
+        pub fn parse<
+            'input,
+        >(
+            &self,
+            input: &'input str,
+        ) -> Result<Vec<Command>, __lalrpop_util::ParseError<usize, Token<'input>, String>>
+        {
+            let mut __tokens = self.builder.matcher(input);
+            __state_machine::Parser::drive(
+                __StateMachine {
+                    input,
+                    __phantom: core::marker::PhantomData::<(&())>,
+                },
+                __tokens,
+            )
+        }
+    }
+    fn __accepts<
+        'input,
+    >(
+        __error_state: Option<i16>,
+        __states: &[i16],
+        __opt_integer: Option<usize>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> bool
+    {
+        let mut __states = __states.to_vec();
+        __states.extend(__error_state);
+        loop {
+            let mut __states_len = __states.len();
+            let __top = __states[__states_len - 1];
+            let __action = match __opt_integer {
+                None => __EOF_ACTION[__top as usize],
+                Some(__integer) => __action(__top, __integer),
+            };
+            if __action == 0 { return false; }
+            if __action > 0 { return true; }
+            let (__to_pop, __nt) = match __simulate_reduce(-(__action + 1), core::marker::PhantomData::<(&())>) {
+                __state_machine::SimulatedReduce::Reduce {
+                    states_to_pop, nonterminal_produced
+                } => (states_to_pop, nonterminal_produced),
+                __state_machine::SimulatedReduce::Accept => return true,
+            };
+            __states_len -= __to_pop;
+            __states.truncate(__states_len);
+            let __top = __states[__states_len - 1];
+            let __next_state = __goto(__top, __nt);
+            __states.push(__next_state);
+        }
+    }
+    pub(crate) fn __reduce<
+        'input,
+    >(
+        input: &'input str,
+        __action: i16,
+        __lookahead_start: Option<&usize>,
+        __states: &mut alloc::vec::Vec<i16>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> Option<Result<Vec<Command>,__lalrpop_util::ParseError<usize, Token<'input>, String>>>
+    {
+        let (__pop_states, __nonterminal) = match __action {
+            0 => {
+                __reduce0(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            1 => {
+                __reduce1(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            2 => {
+                __reduce2(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            3 => {
+                __reduce3(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            4 => {
+                __reduce4(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            5 => {
+                __reduce5(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            6 => {
+                __reduce6(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            7 => {
+                __reduce7(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            8 => {
+                __reduce8(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            9 => {
+                __reduce9(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            10 => {
+                __reduce10(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            11 => {
+                __reduce11(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            12 => {
+                __reduce12(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            13 => {
+                __reduce13(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            14 => {
+                __reduce14(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            15 => {
+                __reduce15(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            16 => {
+                __reduce16(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            17 => {
+                __reduce17(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            18 => {
+                __reduce18(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            19 => {
+                __reduce19(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            20 => {
+                __reduce20(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            21 => {
+                __reduce21(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            22 => {
+                __reduce22(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            23 => {
+                __reduce23(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            24 => {
+                __reduce24(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            25 => {
+                __reduce25(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            26 => {
+                __reduce26(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            27 => {
+                __reduce27(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            28 => {
+                __reduce28(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            29 => {
+                __reduce29(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            30 => {
+                __reduce30(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            31 => {
+                __reduce31(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            32 => {
+                __reduce32(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            33 => {
+                __reduce33(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            34 => {
+                __reduce34(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            35 => {
+                __reduce35(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            36 => {
+                __reduce36(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            37 => {
+                __reduce37(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            38 => {
+                __reduce38(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            39 => {
+                __reduce39(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            40 => {
+                __reduce40(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            41 => {
+                __reduce41(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            42 => {
+                __reduce42(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            43 => {
+                __reduce43(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            44 => {
+                __reduce44(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            45 => {
+                __reduce45(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            46 => {
+                __reduce46(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            47 => {
+                __reduce47(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            48 => {
+                __reduce48(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            49 => {
+                __reduce49(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            50 => {
+                __reduce50(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            51 => {
+                __reduce51(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            52 => {
+                __reduce52(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            53 => {
+                __reduce53(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            54 => {
+                __reduce54(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            55 => {
+                __reduce55(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            56 => {
+                __reduce56(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            57 => {
+                __reduce57(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            58 => {
+                __reduce58(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            59 => {
+                __reduce59(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            60 => {
+                __reduce60(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            61 => {
+                __reduce61(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            62 => {
+                __reduce62(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            63 => {
+                __reduce63(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            64 => {
+                __reduce64(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            65 => {
+                __reduce65(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            66 => {
+                __reduce66(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            67 => {
+                __reduce67(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            68 => {
+                __reduce68(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            69 => {
+                __reduce69(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            70 => {
+                __reduce70(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            71 => {
+                __reduce71(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            72 => {
+                __reduce72(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            73 => {
+                __reduce73(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            74 => {
+                __reduce74(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            75 => {
+                __reduce75(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            76 => {
+                __reduce76(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            77 => {
+                __reduce77(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            78 => {
+                __reduce78(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            79 => {
+                __reduce79(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            80 => {
+                __reduce80(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            81 => {
+                __reduce81(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            82 => {
+                __reduce82(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            83 => {
+                __reduce83(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            84 => {
+                __reduce84(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            85 => {
+                __reduce85(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            86 => {
+                __reduce86(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            87 => {
+                __reduce87(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            88 => {
+                __reduce88(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            89 => {
+                __reduce89(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            90 => {
+                __reduce90(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            91 => {
+                __reduce91(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            92 => {
+                __reduce92(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            93 => {
+                __reduce93(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            94 => {
+                __reduce94(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            95 => {
+                __reduce95(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            96 => {
+                __reduce96(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            97 => {
+                __reduce97(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            98 => {
+                __reduce98(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            99 => {
+                __reduce99(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            100 => {
+                __reduce100(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            101 => {
+                __reduce101(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            102 => {
+                __reduce102(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            103 => {
+                __reduce103(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            104 => {
+                __reduce104(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            105 => {
+                __reduce105(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            106 => {
+                __reduce106(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            107 => {
+                __reduce107(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            108 => {
+                __reduce108(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            109 => {
+                __reduce109(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            110 => {
+                __reduce110(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            111 => {
+                __reduce111(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            112 => {
+                __reduce112(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            113 => {
+                __reduce113(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            114 => {
+                __reduce114(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            115 => {
+                __reduce115(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            116 => {
+                __reduce116(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            117 => {
+                __reduce117(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            118 => {
+                __reduce118(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            119 => {
+                __reduce119(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            120 => {
+                __reduce120(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            121 => {
+                __reduce121(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            122 => {
+                __reduce122(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            123 => {
+                __reduce123(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            124 => {
+                __reduce124(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            125 => {
+                __reduce125(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            126 => {
+                __reduce126(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            127 => {
+                __reduce127(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            128 => {
+                __reduce128(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            129 => {
+                __reduce129(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            130 => {
+                __reduce130(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            131 => {
+                __reduce131(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            132 => {
+                __reduce132(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            133 => {
+                __reduce133(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            134 => {
+                __reduce134(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            135 => {
+                __reduce135(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            136 => {
+                __reduce136(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            137 => {
+                __reduce137(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            138 => {
+                __reduce138(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            139 => {
+                __reduce139(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            140 => {
+                __reduce140(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            141 => {
+                __reduce141(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            142 => {
+                __reduce142(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            143 => {
+                __reduce143(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            144 => {
+                __reduce144(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            145 => {
+                __reduce145(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            146 => {
+                __reduce146(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            147 => {
+                __reduce147(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            148 => {
+                __reduce148(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            149 => {
+                __reduce149(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            150 => {
+                __reduce150(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            151 => {
+                __reduce151(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            152 => {
+                __reduce152(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            153 => {
+                __reduce153(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            154 => {
+                __reduce154(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            155 => {
+                __reduce155(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            156 => {
+                __reduce156(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            157 => {
+                __reduce157(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            158 => {
+                __reduce158(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            159 => {
+                __reduce159(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            160 => {
+                __reduce160(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            161 => {
+                __reduce161(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            162 => {
+                __reduce162(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            163 => {
+                __reduce163(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            164 => {
+                __reduce164(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            165 => {
+                __reduce165(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            166 => {
+                __reduce166(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            167 => {
+                __reduce167(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            168 => {
+                __reduce168(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            169 => {
+                __reduce169(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            170 => {
+                __reduce170(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            171 => {
+                __reduce171(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            172 => {
+                __reduce172(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            173 => {
+                __reduce173(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            174 => {
+                __reduce174(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            175 => {
+                __reduce175(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            176 => {
+                __reduce176(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            177 => {
+                __reduce177(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            178 => {
+                __reduce178(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            179 => {
+                __reduce179(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            180 => {
+                __reduce180(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            181 => {
+                __reduce181(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            182 => {
+                __reduce182(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            183 => {
+                __reduce183(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            184 => {
+                __reduce184(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            185 => {
+                __reduce185(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            186 => {
+                __reduce186(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            187 => {
+                __reduce187(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            188 => {
+                __reduce188(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            189 => {
+                __reduce189(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            190 => {
+                __reduce190(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            191 => {
+                __reduce191(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            192 => {
+                __reduce192(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            193 => {
+                __reduce193(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            194 => {
+                __reduce194(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            195 => {
+                __reduce195(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            196 => {
+                __reduce196(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            197 => {
+                __reduce197(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            198 => {
+                __reduce198(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            199 => {
+                __reduce199(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            200 => {
+                __reduce200(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            201 => {
+                __reduce201(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            202 => {
+                __reduce202(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            203 => {
+                __reduce203(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            204 => {
+                __reduce204(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            205 => {
+                __reduce205(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            206 => {
+                __reduce206(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            207 => {
+                __reduce207(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            208 => {
+                __reduce208(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            209 => {
+                __reduce209(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            210 => {
+                __reduce210(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            211 => {
+                __reduce211(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            212 => {
+                __reduce212(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            213 => {
+                __reduce213(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            214 => {
+                __reduce214(input, __lookahead_start, __symbols, core::marker::PhantomData::<(&())>)
+            }
+            215 => {
+                // __Program = Program => ActionFn(0);
+                let __sym0 = __pop_Variant34(__symbols);
+                let __start = __sym0.0;
+                let __end = __sym0.2;
+                let __nt = super::__action0::<>(input, __sym0);
+                return Some(Ok(__nt));
+            }
+            _ => panic!("invalid action code {}", __action)
+        };
+        let __states_len = __states.len();
+        __states.truncate(__states_len - __pop_states);
+        let __state = *__states.last().unwrap();
+        let __next_state = __goto(__state, __nonterminal);
+        __states.push(__next_state);
+        None
+    }
+    #[inline(never)]
+    fn __symbol_type_mismatch() -> ! {
+        panic!("symbol type mismatch")
+    }
+    fn __pop_Variant30<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, (), usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant30(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant23<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, Action, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant23(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant16<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, Command, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant16(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant1<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, Expr, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant1(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant19<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, Fact, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant19(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant28<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, IdentSort, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant28(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant32<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, Literal, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant32(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant25<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, Option<usize>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant25(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant27<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, OrderedFloat<f64>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant27(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant35<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, Schedule, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant35(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant37<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, Schema, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant37(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant3<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, String, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant3(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant7<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, Symbol, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant7(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant21<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, Variant, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant21(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant5<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, Vec<Action>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant5(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant34<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, Vec<Command>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant34(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant26<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, Vec<Expr>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant26(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant14<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, Vec<Fact>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant14(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant31<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, Vec<Symbol>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant31(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant24<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, alloc::vec::Vec<Action>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant24(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant17<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, alloc::vec::Vec<Command>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant17(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant18<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, alloc::vec::Vec<Expr>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant18(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant10<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, alloc::vec::Vec<Fact>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant10(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant29<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, alloc::vec::Vec<IdentSort>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant29(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant36<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, alloc::vec::Vec<Schedule>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant36(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant20<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, alloc::vec::Vec<Symbol>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant20(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant22<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, alloc::vec::Vec<Variant>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant22(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant2<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, core::option::Option<Expr>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant2(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant4<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, core::option::Option<String>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant4(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant8<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, core::option::Option<Symbol>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant8(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant6<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, core::option::Option<Vec<Action>>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant6(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant15<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, core::option::Option<Vec<Fact>>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant15(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant11<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, core::option::Option<alloc::vec::Vec<Fact>>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant11(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant13<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, core::option::Option<usize>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant13(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant9<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, core::option::Option<&'input str>, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant9(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant33<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, i64, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant33(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant12<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, usize, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant12(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    fn __pop_Variant0<
+      'input,
+    >(
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>
+    ) -> (usize, &'input str, usize)
+     {
+        match __symbols.pop() {
+            Some((__l, __Symbol::Variant0(__v), __r)) => (__l, __v, __r),
+            _ => __symbol_type_mismatch()
+        }
+    }
+    pub(crate) fn __reduce0<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":default" <Expr>) = ":default", Expr => ActionFn(115);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant1(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action115::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant1(__nt), __end));
+        (2, 0)
+    }
+    pub(crate) fn __reduce1<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":default" <Expr>)? = ":default", Expr => ActionFn(161);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant1(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action161::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant2(__nt), __end));
+        (2, 1)
+    }
+    pub(crate) fn __reduce2<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":default" <Expr>)? =  => ActionFn(114);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action114::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant2(__nt), __end));
+        (0, 1)
+    }
+    pub(crate) fn __reduce3<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":merge" <Expr>) = ":merge", Expr => ActionFn(118);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant1(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action118::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant1(__nt), __end));
+        (2, 2)
+    }
+    pub(crate) fn __reduce4<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":merge" <Expr>)? = ":merge", Expr => ActionFn(164);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant1(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action164::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant2(__nt), __end));
+        (2, 3)
+    }
+    pub(crate) fn __reduce5<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":merge" <Expr>)? =  => ActionFn(117);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action117::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant2(__nt), __end));
+        (0, 3)
+    }
+    pub(crate) fn __reduce6<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":name" <String>) = ":name", String => ActionFn(107);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant3(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action107::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant3(__nt), __end));
+        (2, 4)
+    }
+    pub(crate) fn __reduce7<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":name" <String>)? = ":name", String => ActionFn(169);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant3(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action169::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant4(__nt), __end));
+        (2, 5)
+    }
+    pub(crate) fn __reduce8<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":name" <String>)? =  => ActionFn(106);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action106::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant4(__nt), __end));
+        (0, 5)
+    }
+    pub(crate) fn __reduce9<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":on_merge" <List<Action>>) = ":on_merge", List<Action> => ActionFn(121);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant5(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action121::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant5(__nt), __end));
+        (2, 6)
+    }
+    pub(crate) fn __reduce10<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":on_merge" <List<Action>>)? = ":on_merge", List<Action> => ActionFn(172);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant5(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action172::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant6(__nt), __end));
+        (2, 7)
+    }
+    pub(crate) fn __reduce11<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":on_merge" <List<Action>>)? =  => ActionFn(120);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action120::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant6(__nt), __end));
+        (0, 7)
+    }
+    pub(crate) fn __reduce12<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":ruleset" <Ident>) = ":ruleset", Ident => ActionFn(110);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant7(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action110::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant7(__nt), __end));
+        (2, 8)
+    }
+    pub(crate) fn __reduce13<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":ruleset" <Ident>)? = ":ruleset", Ident => ActionFn(181);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant7(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action181::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant8(__nt), __end));
+        (2, 9)
+    }
+    pub(crate) fn __reduce14<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":ruleset" <Ident>)? =  => ActionFn(109);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action109::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant8(__nt), __end));
+        (0, 9)
+    }
+    pub(crate) fn __reduce15<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":unextractable") = ":unextractable" => ActionFn(125);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action125::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant0(__nt), __end));
+        (1, 10)
+    }
+    pub(crate) fn __reduce16<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":unextractable")? = ":unextractable" => ActionFn(190);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action190::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant9(__nt), __end));
+        (1, 11)
+    }
+    pub(crate) fn __reduce17<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":unextractable")? =  => ActionFn(124);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action124::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant9(__nt), __end));
+        (0, 11)
+    }
+    pub(crate) fn __reduce18<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":until" <(Fact)*>) = ":until" => ActionFn(207);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action207::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant10(__nt), __end));
+        (1, 12)
+    }
+    pub(crate) fn __reduce19<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":until" <(Fact)*>) = ":until", (Fact)+ => ActionFn(208);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant10(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action208::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant10(__nt), __end));
+        (2, 12)
+    }
+    pub(crate) fn __reduce20<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":until" <(Fact)*>)? = ":until" => ActionFn(211);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action211::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant11(__nt), __end));
+        (1, 13)
+    }
+    pub(crate) fn __reduce21<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":until" <(Fact)*>)? = ":until", (Fact)+ => ActionFn(212);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant10(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action212::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant11(__nt), __end));
+        (2, 13)
+    }
+    pub(crate) fn __reduce22<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":until" <(Fact)*>)? =  => ActionFn(97);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action97::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant11(__nt), __end));
+        (0, 13)
+    }
+    pub(crate) fn __reduce23<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":variants" <UNum>) = ":variants", UNum => ActionFn(91);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant12(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action91::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant12(__nt), __end));
+        (2, 14)
+    }
+    pub(crate) fn __reduce24<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":variants" <UNum>)? = ":variants", UNum => ActionFn(225);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant12(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action225::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant13(__nt), __end));
+        (2, 15)
+    }
+    pub(crate) fn __reduce25<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":variants" <UNum>)? =  => ActionFn(90);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action90::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant13(__nt), __end));
+        (0, 15)
+    }
+    pub(crate) fn __reduce26<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":when" <List<Fact>>) = ":when", List<Fact> => ActionFn(104);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant14(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action104::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant14(__nt), __end));
+        (2, 16)
+    }
+    pub(crate) fn __reduce27<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":when" <List<Fact>>)? = ":when", List<Fact> => ActionFn(228);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant14(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action228::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant15(__nt), __end));
+        (2, 17)
+    }
+    pub(crate) fn __reduce28<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (":when" <List<Fact>>)? =  => ActionFn(103);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action103::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant15(__nt), __end));
+        (0, 17)
+    }
+    pub(crate) fn __reduce29<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Command) = Command => ActionFn(134);
+        let __sym0 = __pop_Variant16(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action134::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (1, 18)
+    }
+    pub(crate) fn __reduce30<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Command)* =  => ActionFn(132);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action132::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant17(__nt), __end));
+        (0, 19)
+    }
+    pub(crate) fn __reduce31<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Command)* = (Command)+ => ActionFn(133);
+        let __sym0 = __pop_Variant17(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action133::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant17(__nt), __end));
+        (1, 19)
+    }
+    pub(crate) fn __reduce32<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Command)+ = Command => ActionFn(237);
+        let __sym0 = __pop_Variant16(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action237::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant17(__nt), __end));
+        (1, 20)
+    }
+    pub(crate) fn __reduce33<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Command)+ = (Command)+, Command => ActionFn(238);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant16(__symbols);
+        let __sym0 = __pop_Variant17(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action238::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant17(__nt), __end));
+        (2, 20)
+    }
+    pub(crate) fn __reduce34<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Expr) = Expr => ActionFn(128);
+        let __sym0 = __pop_Variant1(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action128::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant1(__nt), __end));
+        (1, 21)
+    }
+    pub(crate) fn __reduce35<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Expr)* =  => ActionFn(126);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action126::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant18(__nt), __end));
+        (0, 22)
+    }
+    pub(crate) fn __reduce36<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Expr)* = (Expr)+ => ActionFn(127);
+        let __sym0 = __pop_Variant18(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action127::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant18(__nt), __end));
+        (1, 22)
+    }
+    pub(crate) fn __reduce37<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Expr)+ = Expr => ActionFn(241);
+        let __sym0 = __pop_Variant1(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action241::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant18(__nt), __end));
+        (1, 23)
+    }
+    pub(crate) fn __reduce38<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Expr)+ = (Expr)+, Expr => ActionFn(242);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant1(__symbols);
+        let __sym0 = __pop_Variant18(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action242::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant18(__nt), __end));
+        (2, 23)
+    }
+    pub(crate) fn __reduce39<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Fact) = Fact => ActionFn(101);
+        let __sym0 = __pop_Variant19(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action101::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant19(__nt), __end));
+        (1, 24)
+    }
+    pub(crate) fn __reduce40<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Fact)* =  => ActionFn(99);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action99::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant10(__nt), __end));
+        (0, 25)
+    }
+    pub(crate) fn __reduce41<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Fact)* = (Fact)+ => ActionFn(100);
+        let __sym0 = __pop_Variant10(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action100::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant10(__nt), __end));
+        (1, 25)
+    }
+    pub(crate) fn __reduce42<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Fact)+ = Fact => ActionFn(249);
+        let __sym0 = __pop_Variant19(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action249::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant10(__nt), __end));
+        (1, 26)
+    }
+    pub(crate) fn __reduce43<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Fact)+ = (Fact)+, Fact => ActionFn(250);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant19(__symbols);
+        let __sym0 = __pop_Variant10(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action250::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant10(__nt), __end));
+        (2, 26)
+    }
+    pub(crate) fn __reduce44<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Type) = Type => ActionFn(82);
+        let __sym0 = __pop_Variant7(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action82::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant7(__nt), __end));
+        (1, 27)
+    }
+    pub(crate) fn __reduce45<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Type)* =  => ActionFn(80);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action80::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant20(__nt), __end));
+        (0, 28)
+    }
+    pub(crate) fn __reduce46<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Type)* = (Type)+ => ActionFn(81);
+        let __sym0 = __pop_Variant20(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action81::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant20(__nt), __end));
+        (1, 28)
+    }
+    pub(crate) fn __reduce47<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Type)+ = Type => ActionFn(251);
+        let __sym0 = __pop_Variant7(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action251::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant20(__nt), __end));
+        (1, 29)
+    }
+    pub(crate) fn __reduce48<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Type)+ = (Type)+, Type => ActionFn(252);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant7(__symbols);
+        let __sym0 = __pop_Variant20(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action252::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant20(__nt), __end));
+        (2, 29)
+    }
+    pub(crate) fn __reduce49<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Variant) = Variant => ActionFn(131);
+        let __sym0 = __pop_Variant21(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action131::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant21(__nt), __end));
+        (1, 30)
+    }
+    pub(crate) fn __reduce50<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Variant)* =  => ActionFn(129);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action129::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant22(__nt), __end));
+        (0, 31)
+    }
+    pub(crate) fn __reduce51<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Variant)* = (Variant)+ => ActionFn(130);
+        let __sym0 = __pop_Variant22(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action130::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant22(__nt), __end));
+        (1, 31)
+    }
+    pub(crate) fn __reduce52<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Variant)+ = Variant => ActionFn(255);
+        let __sym0 = __pop_Variant21(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action255::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant22(__nt), __end));
+        (1, 32)
+    }
+    pub(crate) fn __reduce53<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // (Variant)+ = (Variant)+, Variant => ActionFn(256);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant21(__symbols);
+        let __sym0 = __pop_Variant22(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action256::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant22(__nt), __end));
+        (2, 32)
+    }
+    pub(crate) fn __reduce54<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Action = LParen, "let", Ident, Expr, RParen => ActionFn(54);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant1(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action54::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant23(__nt), __end));
+        (5, 33)
+    }
+    pub(crate) fn __reduce55<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Action = NonLetAction => ActionFn(55);
+        let __sym0 = __pop_Variant23(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action55::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant23(__nt), __end));
+        (1, 33)
+    }
+    pub(crate) fn __reduce56<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Action* =  => ActionFn(141);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action141::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant24(__nt), __end));
+        (0, 34)
+    }
+    pub(crate) fn __reduce57<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Action* = Action+ => ActionFn(142);
+        let __sym0 = __pop_Variant24(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action142::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant24(__nt), __end));
+        (1, 34)
+    }
+    pub(crate) fn __reduce58<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Action+ = Action => ActionFn(159);
+        let __sym0 = __pop_Variant23(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action159::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant24(__nt), __end));
+        (1, 35)
+    }
+    pub(crate) fn __reduce59<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Action+ = Action+, Action => ActionFn(160);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant23(__symbols);
+        let __sym0 = __pop_Variant24(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action160::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant24(__nt), __end));
+        (2, 35)
+    }
+    pub(crate) fn __reduce60<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // CallExpr = LParen, Ident, RParen => ActionFn(243);
+        assert!(__symbols.len() >= 3);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant7(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym2.2;
+        let __nt = super::__action243::<>(input, __sym0, __sym1, __sym2);
+        __symbols.push((__start, __Symbol::Variant1(__nt), __end));
+        (3, 36)
+    }
+    pub(crate) fn __reduce61<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // CallExpr = LParen, Ident, (Expr)+, RParen => ActionFn(244);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant18(__symbols);
+        let __sym1 = __pop_Variant7(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action244::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant1(__nt), __end));
+        (4, 36)
+    }
+    pub(crate) fn __reduce62<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "set-option", Ident, Expr, RParen => ActionFn(9);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant1(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action9::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (5, 37)
+    }
+    pub(crate) fn __reduce63<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "datatype", Ident, RParen => ActionFn(257);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action257::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (4, 37)
+    }
+    pub(crate) fn __reduce64<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "datatype", Ident, (Variant)+, RParen => ActionFn(258);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant22(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action258::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (5, 37)
+    }
+    pub(crate) fn __reduce65<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "sort", Ident, LParen, Ident, RParen, RParen => ActionFn(245);
+        assert!(__symbols.len() >= 7);
+        let __sym6 = __pop_Variant30(__symbols);
+        let __sym5 = __pop_Variant30(__symbols);
+        let __sym4 = __pop_Variant7(__symbols);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym6.2;
+        let __nt = super::__action245::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (7, 37)
+    }
+    pub(crate) fn __reduce66<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "sort", Ident, LParen, Ident, (Expr)+, RParen, RParen => ActionFn(246);
+        assert!(__symbols.len() >= 8);
+        let __sym7 = __pop_Variant30(__symbols);
+        let __sym6 = __pop_Variant30(__symbols);
+        let __sym5 = __pop_Variant18(__symbols);
+        let __sym4 = __pop_Variant7(__symbols);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym7.2;
+        let __nt = super::__action246::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (8, 37)
+    }
+    pub(crate) fn __reduce67<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "sort", Ident, RParen => ActionFn(12);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action12::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (4, 37)
+    }
+    pub(crate) fn __reduce68<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "function", Ident, Schema, Cost, ":unextractable", ":on_merge", List<Action>, ":merge", Expr, ":default", Expr, RParen => ActionFn(191);
+        assert!(__symbols.len() >= 13);
+        let __sym12 = __pop_Variant30(__symbols);
+        let __sym11 = __pop_Variant1(__symbols);
+        let __sym10 = __pop_Variant0(__symbols);
+        let __sym9 = __pop_Variant1(__symbols);
+        let __sym8 = __pop_Variant0(__symbols);
+        let __sym7 = __pop_Variant5(__symbols);
+        let __sym6 = __pop_Variant0(__symbols);
+        let __sym5 = __pop_Variant0(__symbols);
+        let __sym4 = __pop_Variant25(__symbols);
+        let __sym3 = __pop_Variant37(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym12.2;
+        let __nt = super::__action191::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9, __sym10, __sym11, __sym12);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (13, 37)
+    }
+    pub(crate) fn __reduce69<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "function", Ident, Schema, Cost, ":on_merge", List<Action>, ":merge", Expr, ":default", Expr, RParen => ActionFn(192);
+        assert!(__symbols.len() >= 12);
+        let __sym11 = __pop_Variant30(__symbols);
+        let __sym10 = __pop_Variant1(__symbols);
+        let __sym9 = __pop_Variant0(__symbols);
+        let __sym8 = __pop_Variant1(__symbols);
+        let __sym7 = __pop_Variant0(__symbols);
+        let __sym6 = __pop_Variant5(__symbols);
+        let __sym5 = __pop_Variant0(__symbols);
+        let __sym4 = __pop_Variant25(__symbols);
+        let __sym3 = __pop_Variant37(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym11.2;
+        let __nt = super::__action192::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9, __sym10, __sym11);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (12, 37)
+    }
+    pub(crate) fn __reduce70<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "function", Ident, Schema, Cost, ":unextractable", ":merge", Expr, ":default", Expr, RParen => ActionFn(193);
+        assert!(__symbols.len() >= 11);
+        let __sym10 = __pop_Variant30(__symbols);
+        let __sym9 = __pop_Variant1(__symbols);
+        let __sym8 = __pop_Variant0(__symbols);
+        let __sym7 = __pop_Variant1(__symbols);
+        let __sym6 = __pop_Variant0(__symbols);
+        let __sym5 = __pop_Variant0(__symbols);
+        let __sym4 = __pop_Variant25(__symbols);
+        let __sym3 = __pop_Variant37(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym10.2;
+        let __nt = super::__action193::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9, __sym10);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (11, 37)
+    }
+    pub(crate) fn __reduce71<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "function", Ident, Schema, Cost, ":merge", Expr, ":default", Expr, RParen => ActionFn(194);
+        assert!(__symbols.len() >= 10);
+        let __sym9 = __pop_Variant30(__symbols);
+        let __sym8 = __pop_Variant1(__symbols);
+        let __sym7 = __pop_Variant0(__symbols);
+        let __sym6 = __pop_Variant1(__symbols);
+        let __sym5 = __pop_Variant0(__symbols);
+        let __sym4 = __pop_Variant25(__symbols);
+        let __sym3 = __pop_Variant37(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym9.2;
+        let __nt = super::__action194::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (10, 37)
+    }
+    pub(crate) fn __reduce72<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "function", Ident, Schema, Cost, ":unextractable", ":on_merge", List<Action>, ":default", Expr, RParen => ActionFn(195);
+        assert!(__symbols.len() >= 11);
+        let __sym10 = __pop_Variant30(__symbols);
+        let __sym9 = __pop_Variant1(__symbols);
+        let __sym8 = __pop_Variant0(__symbols);
+        let __sym7 = __pop_Variant5(__symbols);
+        let __sym6 = __pop_Variant0(__symbols);
+        let __sym5 = __pop_Variant0(__symbols);
+        let __sym4 = __pop_Variant25(__symbols);
+        let __sym3 = __pop_Variant37(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym10.2;
+        let __nt = super::__action195::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9, __sym10);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (11, 37)
+    }
+    pub(crate) fn __reduce73<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "function", Ident, Schema, Cost, ":on_merge", List<Action>, ":default", Expr, RParen => ActionFn(196);
+        assert!(__symbols.len() >= 10);
+        let __sym9 = __pop_Variant30(__symbols);
+        let __sym8 = __pop_Variant1(__symbols);
+        let __sym7 = __pop_Variant0(__symbols);
+        let __sym6 = __pop_Variant5(__symbols);
+        let __sym5 = __pop_Variant0(__symbols);
+        let __sym4 = __pop_Variant25(__symbols);
+        let __sym3 = __pop_Variant37(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym9.2;
+        let __nt = super::__action196::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (10, 37)
+    }
+    pub(crate) fn __reduce74<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "function", Ident, Schema, Cost, ":unextractable", ":default", Expr, RParen => ActionFn(197);
+        assert!(__symbols.len() >= 9);
+        let __sym8 = __pop_Variant30(__symbols);
+        let __sym7 = __pop_Variant1(__symbols);
+        let __sym6 = __pop_Variant0(__symbols);
+        let __sym5 = __pop_Variant0(__symbols);
+        let __sym4 = __pop_Variant25(__symbols);
+        let __sym3 = __pop_Variant37(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym8.2;
+        let __nt = super::__action197::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (9, 37)
+    }
+    pub(crate) fn __reduce75<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "function", Ident, Schema, Cost, ":default", Expr, RParen => ActionFn(198);
+        assert!(__symbols.len() >= 8);
+        let __sym7 = __pop_Variant30(__symbols);
+        let __sym6 = __pop_Variant1(__symbols);
+        let __sym5 = __pop_Variant0(__symbols);
+        let __sym4 = __pop_Variant25(__symbols);
+        let __sym3 = __pop_Variant37(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym7.2;
+        let __nt = super::__action198::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (8, 37)
+    }
+    pub(crate) fn __reduce76<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "function", Ident, Schema, Cost, ":unextractable", ":on_merge", List<Action>, ":merge", Expr, RParen => ActionFn(199);
+        assert!(__symbols.len() >= 11);
+        let __sym10 = __pop_Variant30(__symbols);
+        let __sym9 = __pop_Variant1(__symbols);
+        let __sym8 = __pop_Variant0(__symbols);
+        let __sym7 = __pop_Variant5(__symbols);
+        let __sym6 = __pop_Variant0(__symbols);
+        let __sym5 = __pop_Variant0(__symbols);
+        let __sym4 = __pop_Variant25(__symbols);
+        let __sym3 = __pop_Variant37(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym10.2;
+        let __nt = super::__action199::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9, __sym10);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (11, 37)
+    }
+    pub(crate) fn __reduce77<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "function", Ident, Schema, Cost, ":on_merge", List<Action>, ":merge", Expr, RParen => ActionFn(200);
+        assert!(__symbols.len() >= 10);
+        let __sym9 = __pop_Variant30(__symbols);
+        let __sym8 = __pop_Variant1(__symbols);
+        let __sym7 = __pop_Variant0(__symbols);
+        let __sym6 = __pop_Variant5(__symbols);
+        let __sym5 = __pop_Variant0(__symbols);
+        let __sym4 = __pop_Variant25(__symbols);
+        let __sym3 = __pop_Variant37(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym9.2;
+        let __nt = super::__action200::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8, __sym9);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (10, 37)
+    }
+    pub(crate) fn __reduce78<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "function", Ident, Schema, Cost, ":unextractable", ":merge", Expr, RParen => ActionFn(201);
+        assert!(__symbols.len() >= 9);
+        let __sym8 = __pop_Variant30(__symbols);
+        let __sym7 = __pop_Variant1(__symbols);
+        let __sym6 = __pop_Variant0(__symbols);
+        let __sym5 = __pop_Variant0(__symbols);
+        let __sym4 = __pop_Variant25(__symbols);
+        let __sym3 = __pop_Variant37(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym8.2;
+        let __nt = super::__action201::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (9, 37)
+    }
+    pub(crate) fn __reduce79<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "function", Ident, Schema, Cost, ":merge", Expr, RParen => ActionFn(202);
+        assert!(__symbols.len() >= 8);
+        let __sym7 = __pop_Variant30(__symbols);
+        let __sym6 = __pop_Variant1(__symbols);
+        let __sym5 = __pop_Variant0(__symbols);
+        let __sym4 = __pop_Variant25(__symbols);
+        let __sym3 = __pop_Variant37(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym7.2;
+        let __nt = super::__action202::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (8, 37)
+    }
+    pub(crate) fn __reduce80<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "function", Ident, Schema, Cost, ":unextractable", ":on_merge", List<Action>, RParen => ActionFn(203);
+        assert!(__symbols.len() >= 9);
+        let __sym8 = __pop_Variant30(__symbols);
+        let __sym7 = __pop_Variant5(__symbols);
+        let __sym6 = __pop_Variant0(__symbols);
+        let __sym5 = __pop_Variant0(__symbols);
+        let __sym4 = __pop_Variant25(__symbols);
+        let __sym3 = __pop_Variant37(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym8.2;
+        let __nt = super::__action203::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (9, 37)
+    }
+    pub(crate) fn __reduce81<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "function", Ident, Schema, Cost, ":on_merge", List<Action>, RParen => ActionFn(204);
+        assert!(__symbols.len() >= 8);
+        let __sym7 = __pop_Variant30(__symbols);
+        let __sym6 = __pop_Variant5(__symbols);
+        let __sym5 = __pop_Variant0(__symbols);
+        let __sym4 = __pop_Variant25(__symbols);
+        let __sym3 = __pop_Variant37(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym7.2;
+        let __nt = super::__action204::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (8, 37)
+    }
+    pub(crate) fn __reduce82<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "function", Ident, Schema, Cost, ":unextractable", RParen => ActionFn(205);
+        assert!(__symbols.len() >= 7);
+        let __sym6 = __pop_Variant30(__symbols);
+        let __sym5 = __pop_Variant0(__symbols);
+        let __sym4 = __pop_Variant25(__symbols);
+        let __sym3 = __pop_Variant37(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym6.2;
+        let __nt = super::__action205::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (7, 37)
+    }
+    pub(crate) fn __reduce83<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "function", Ident, Schema, Cost, RParen => ActionFn(206);
+        assert!(__symbols.len() >= 6);
+        let __sym5 = __pop_Variant30(__symbols);
+        let __sym4 = __pop_Variant25(__symbols);
+        let __sym3 = __pop_Variant37(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym5.2;
+        let __nt = super::__action206::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (6, 37)
+    }
+    pub(crate) fn __reduce84<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "declare", Ident, Ident, RParen => ActionFn(14);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant7(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action14::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (5, 37)
+    }
+    pub(crate) fn __reduce85<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "relation", Ident, List<Type>, RParen => ActionFn(15);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant31(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action15::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (5, 37)
+    }
+    pub(crate) fn __reduce86<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "ruleset", Ident, RParen => ActionFn(16);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action16::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (4, 37)
+    }
+    pub(crate) fn __reduce87<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "rule", List<Fact>, List<Action>, ":ruleset", Ident, ":name", String, RParen => ActionFn(182);
+        assert!(__symbols.len() >= 9);
+        let __sym8 = __pop_Variant30(__symbols);
+        let __sym7 = __pop_Variant3(__symbols);
+        let __sym6 = __pop_Variant0(__symbols);
+        let __sym5 = __pop_Variant7(__symbols);
+        let __sym4 = __pop_Variant0(__symbols);
+        let __sym3 = __pop_Variant5(__symbols);
+        let __sym2 = __pop_Variant14(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym8.2;
+        let __nt = super::__action182::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (9, 37)
+    }
+    pub(crate) fn __reduce88<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "rule", List<Fact>, List<Action>, ":name", String, RParen => ActionFn(183);
+        assert!(__symbols.len() >= 7);
+        let __sym6 = __pop_Variant30(__symbols);
+        let __sym5 = __pop_Variant3(__symbols);
+        let __sym4 = __pop_Variant0(__symbols);
+        let __sym3 = __pop_Variant5(__symbols);
+        let __sym2 = __pop_Variant14(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym6.2;
+        let __nt = super::__action183::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (7, 37)
+    }
+    pub(crate) fn __reduce89<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "rule", List<Fact>, List<Action>, ":ruleset", Ident, RParen => ActionFn(184);
+        assert!(__symbols.len() >= 7);
+        let __sym6 = __pop_Variant30(__symbols);
+        let __sym5 = __pop_Variant7(__symbols);
+        let __sym4 = __pop_Variant0(__symbols);
+        let __sym3 = __pop_Variant5(__symbols);
+        let __sym2 = __pop_Variant14(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym6.2;
+        let __nt = super::__action184::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (7, 37)
+    }
+    pub(crate) fn __reduce90<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "rule", List<Fact>, List<Action>, RParen => ActionFn(185);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant5(__symbols);
+        let __sym2 = __pop_Variant14(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action185::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (5, 37)
+    }
+    pub(crate) fn __reduce91<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "rewrite", Expr, Expr, ":when", List<Fact>, ":ruleset", Ident, RParen => ActionFn(229);
+        assert!(__symbols.len() >= 9);
+        let __sym8 = __pop_Variant30(__symbols);
+        let __sym7 = __pop_Variant7(__symbols);
+        let __sym6 = __pop_Variant0(__symbols);
+        let __sym5 = __pop_Variant14(__symbols);
+        let __sym4 = __pop_Variant0(__symbols);
+        let __sym3 = __pop_Variant1(__symbols);
+        let __sym2 = __pop_Variant1(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym8.2;
+        let __nt = super::__action229::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (9, 37)
+    }
+    pub(crate) fn __reduce92<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "rewrite", Expr, Expr, ":ruleset", Ident, RParen => ActionFn(230);
+        assert!(__symbols.len() >= 7);
+        let __sym6 = __pop_Variant30(__symbols);
+        let __sym5 = __pop_Variant7(__symbols);
+        let __sym4 = __pop_Variant0(__symbols);
+        let __sym3 = __pop_Variant1(__symbols);
+        let __sym2 = __pop_Variant1(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym6.2;
+        let __nt = super::__action230::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (7, 37)
+    }
+    pub(crate) fn __reduce93<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "rewrite", Expr, Expr, ":when", List<Fact>, RParen => ActionFn(231);
+        assert!(__symbols.len() >= 7);
+        let __sym6 = __pop_Variant30(__symbols);
+        let __sym5 = __pop_Variant14(__symbols);
+        let __sym4 = __pop_Variant0(__symbols);
+        let __sym3 = __pop_Variant1(__symbols);
+        let __sym2 = __pop_Variant1(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym6.2;
+        let __nt = super::__action231::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (7, 37)
+    }
+    pub(crate) fn __reduce94<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "rewrite", Expr, Expr, RParen => ActionFn(232);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant1(__symbols);
+        let __sym2 = __pop_Variant1(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action232::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (5, 37)
+    }
+    pub(crate) fn __reduce95<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "birewrite", Expr, Expr, ":when", List<Fact>, ":ruleset", Ident, RParen => ActionFn(233);
+        assert!(__symbols.len() >= 9);
+        let __sym8 = __pop_Variant30(__symbols);
+        let __sym7 = __pop_Variant7(__symbols);
+        let __sym6 = __pop_Variant0(__symbols);
+        let __sym5 = __pop_Variant14(__symbols);
+        let __sym4 = __pop_Variant0(__symbols);
+        let __sym3 = __pop_Variant1(__symbols);
+        let __sym2 = __pop_Variant1(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym8.2;
+        let __nt = super::__action233::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7, __sym8);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (9, 37)
+    }
+    pub(crate) fn __reduce96<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "birewrite", Expr, Expr, ":ruleset", Ident, RParen => ActionFn(234);
+        assert!(__symbols.len() >= 7);
+        let __sym6 = __pop_Variant30(__symbols);
+        let __sym5 = __pop_Variant7(__symbols);
+        let __sym4 = __pop_Variant0(__symbols);
+        let __sym3 = __pop_Variant1(__symbols);
+        let __sym2 = __pop_Variant1(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym6.2;
+        let __nt = super::__action234::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (7, 37)
+    }
+    pub(crate) fn __reduce97<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "birewrite", Expr, Expr, ":when", List<Fact>, RParen => ActionFn(235);
+        assert!(__symbols.len() >= 7);
+        let __sym6 = __pop_Variant30(__symbols);
+        let __sym5 = __pop_Variant14(__symbols);
+        let __sym4 = __pop_Variant0(__symbols);
+        let __sym3 = __pop_Variant1(__symbols);
+        let __sym2 = __pop_Variant1(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym6.2;
+        let __nt = super::__action235::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (7, 37)
+    }
+    pub(crate) fn __reduce98<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "birewrite", Expr, Expr, RParen => ActionFn(236);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant1(__symbols);
+        let __sym2 = __pop_Variant1(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action236::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (5, 37)
+    }
+    pub(crate) fn __reduce99<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "let", Ident, Expr, RParen => ActionFn(20);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant1(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action20::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (5, 37)
+    }
+    pub(crate) fn __reduce100<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = NonLetAction => ActionFn(21);
+        let __sym0 = __pop_Variant23(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action21::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (1, 37)
+    }
+    pub(crate) fn __reduce101<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "run", UNum, ":until", RParen => ActionFn(213);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant0(__symbols);
+        let __sym2 = __pop_Variant12(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action213::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (5, 37)
+    }
+    pub(crate) fn __reduce102<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "run", UNum, ":until", (Fact)+, RParen => ActionFn(214);
+        assert!(__symbols.len() >= 6);
+        let __sym5 = __pop_Variant30(__symbols);
+        let __sym4 = __pop_Variant10(__symbols);
+        let __sym3 = __pop_Variant0(__symbols);
+        let __sym2 = __pop_Variant12(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym5.2;
+        let __nt = super::__action214::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (6, 37)
+    }
+    pub(crate) fn __reduce103<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "run", UNum, RParen => ActionFn(215);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant12(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action215::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (4, 37)
+    }
+    pub(crate) fn __reduce104<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "run", Ident, UNum, ":until", RParen => ActionFn(216);
+        assert!(__symbols.len() >= 6);
+        let __sym5 = __pop_Variant30(__symbols);
+        let __sym4 = __pop_Variant0(__symbols);
+        let __sym3 = __pop_Variant12(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym5.2;
+        let __nt = super::__action216::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (6, 37)
+    }
+    pub(crate) fn __reduce105<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "run", Ident, UNum, ":until", (Fact)+, RParen => ActionFn(217);
+        assert!(__symbols.len() >= 7);
+        let __sym6 = __pop_Variant30(__symbols);
+        let __sym5 = __pop_Variant10(__symbols);
+        let __sym4 = __pop_Variant0(__symbols);
+        let __sym3 = __pop_Variant12(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym6.2;
+        let __nt = super::__action217::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (7, 37)
+    }
+    pub(crate) fn __reduce106<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "run", Ident, UNum, RParen => ActionFn(218);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant12(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action218::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (5, 37)
+    }
+    pub(crate) fn __reduce107<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "simplify", Schedule, Expr, RParen => ActionFn(24);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant1(__symbols);
+        let __sym2 = __pop_Variant35(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action24::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (5, 37)
+    }
+    pub(crate) fn __reduce108<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "add-ruleset", Ident, RParen => ActionFn(25);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action25::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (4, 37)
+    }
+    pub(crate) fn __reduce109<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "calc", LParen, RParen, Expr+, RParen => ActionFn(267);
+        assert!(__symbols.len() >= 6);
+        let __sym5 = __pop_Variant30(__symbols);
+        let __sym4 = __pop_Variant18(__symbols);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym5.2;
+        let __nt = super::__action267::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (6, 37)
+    }
+    pub(crate) fn __reduce110<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "calc", LParen, IdentSort+, RParen, Expr+, RParen => ActionFn(268);
+        assert!(__symbols.len() >= 7);
+        let __sym6 = __pop_Variant30(__symbols);
+        let __sym5 = __pop_Variant18(__symbols);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant29(__symbols);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym6.2;
+        let __nt = super::__action268::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (7, 37)
+    }
+    pub(crate) fn __reduce111<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "query-extract", ":variants", UNum, Fact, RParen => ActionFn(226);
+        assert!(__symbols.len() >= 6);
+        let __sym5 = __pop_Variant30(__symbols);
+        let __sym4 = __pop_Variant19(__symbols);
+        let __sym3 = __pop_Variant12(__symbols);
+        let __sym2 = __pop_Variant0(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym5.2;
+        let __nt = super::__action226::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (6, 37)
+    }
+    pub(crate) fn __reduce112<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "query-extract", Fact, RParen => ActionFn(227);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant19(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action227::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (4, 37)
+    }
+    pub(crate) fn __reduce113<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "check", RParen => ActionFn(209);
+        assert!(__symbols.len() >= 3);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym2.2;
+        let __nt = super::__action209::<>(input, __sym0, __sym1, __sym2);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (3, 37)
+    }
+    pub(crate) fn __reduce114<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "check", (Fact)+, RParen => ActionFn(210);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant10(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action210::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (4, 37)
+    }
+    pub(crate) fn __reduce115<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "check-proof", RParen => ActionFn(29);
+        assert!(__symbols.len() >= 3);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym2.2;
+        let __nt = super::__action29::<>(input, __sym0, __sym1, __sym2);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (3, 37)
+    }
+    pub(crate) fn __reduce116<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "run-schedule", RParen => ActionFn(269);
+        assert!(__symbols.len() >= 3);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym2.2;
+        let __nt = super::__action269::<>(input, __sym0, __sym1, __sym2);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (3, 37)
+    }
+    pub(crate) fn __reduce117<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "run-schedule", Schedule+, RParen => ActionFn(270);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant36(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action270::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (4, 37)
+    }
+    pub(crate) fn __reduce118<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "push", UNum, RParen => ActionFn(279);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant12(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action279::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (4, 37)
+    }
+    pub(crate) fn __reduce119<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "push", RParen => ActionFn(280);
+        assert!(__symbols.len() >= 3);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym2.2;
+        let __nt = super::__action280::<>(input, __sym0, __sym1, __sym2);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (3, 37)
+    }
+    pub(crate) fn __reduce120<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "pop", UNum, RParen => ActionFn(281);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant12(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action281::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (4, 37)
+    }
+    pub(crate) fn __reduce121<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "pop", RParen => ActionFn(282);
+        assert!(__symbols.len() >= 3);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym2.2;
+        let __nt = super::__action282::<>(input, __sym0, __sym1, __sym2);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (3, 37)
+    }
+    pub(crate) fn __reduce122<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "print-table", Ident, UNum, RParen => ActionFn(283);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant12(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action283::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (5, 37)
+    }
+    pub(crate) fn __reduce123<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "print-table", Ident, RParen => ActionFn(284);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action284::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (4, 37)
+    }
+    pub(crate) fn __reduce124<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "print-size", Ident, RParen => ActionFn(34);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action34::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (4, 37)
+    }
+    pub(crate) fn __reduce125<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "input", Ident, String, RParen => ActionFn(35);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant3(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action35::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (5, 37)
+    }
+    pub(crate) fn __reduce126<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "output", String, Expr+, RParen => ActionFn(36);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant18(__symbols);
+        let __sym2 = __pop_Variant3(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action36::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (5, 37)
+    }
+    pub(crate) fn __reduce127<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "fail", Command, RParen => ActionFn(37);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant16(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action37::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (4, 37)
+    }
+    pub(crate) fn __reduce128<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Command = LParen, "include", String, RParen => ActionFn(38);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant3(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action38::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant16(__nt), __end));
+        (4, 37)
+    }
+    pub(crate) fn __reduce129<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Cost = ":cost", UNum => ActionFn(45);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant12(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action45::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant25(__nt), __end));
+        (2, 38)
+    }
+    pub(crate) fn __reduce130<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Cost =  => ActionFn(46);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action46::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant25(__nt), __end));
+        (0, 38)
+    }
+    pub(crate) fn __reduce131<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Expr = Literal => ActionFn(60);
+        let __sym0 = __pop_Variant32(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action60::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant1(__nt), __end));
+        (1, 39)
+    }
+    pub(crate) fn __reduce132<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Expr = Ident => ActionFn(61);
+        let __sym0 = __pop_Variant7(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action61::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant1(__nt), __end));
+        (1, 39)
+    }
+    pub(crate) fn __reduce133<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Expr = CallExpr => ActionFn(62);
+        let __sym0 = __pop_Variant1(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action62::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant1(__nt), __end));
+        (1, 39)
+    }
+    pub(crate) fn __reduce134<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Expr* =  => ActionFn(83);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action83::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant18(__nt), __end));
+        (0, 40)
+    }
+    pub(crate) fn __reduce135<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Expr* = Expr+ => ActionFn(84);
+        let __sym0 = __pop_Variant18(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action84::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant18(__nt), __end));
+        (1, 40)
+    }
+    pub(crate) fn __reduce136<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Expr+ = Expr => ActionFn(92);
+        let __sym0 = __pop_Variant1(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action92::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant18(__nt), __end));
+        (1, 41)
+    }
+    pub(crate) fn __reduce137<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Expr+ = Expr+, Expr => ActionFn(93);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant1(__symbols);
+        let __sym0 = __pop_Variant18(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action93::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant18(__nt), __end));
+        (2, 41)
+    }
+    pub(crate) fn __reduce138<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // ExprList = LParen, RParen => ActionFn(247);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant30(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action247::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant26(__nt), __end));
+        (2, 42)
+    }
+    pub(crate) fn __reduce139<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // ExprList = LParen, (Expr)+, RParen => ActionFn(248);
+        assert!(__symbols.len() >= 3);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant18(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym2.2;
+        let __nt = super::__action248::<>(input, __sym0, __sym1, __sym2);
+        __symbols.push((__start, __Symbol::Variant26(__nt), __end));
+        (3, 42)
+    }
+    pub(crate) fn __reduce140<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // F64 = "NaN" => ActionFn(73);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action73::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant27(__nt), __end));
+        (1, 43)
+    }
+    pub(crate) fn __reduce141<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // F64 = r#"(-)?[0-9]+\\.[0-9]+(e(\\+)?(-)?[0-9]+)?"# => ActionFn(74);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action74::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant27(__nt), __end));
+        (1, 43)
+    }
+    pub(crate) fn __reduce142<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // F64 = "inf" => ActionFn(75);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action75::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant27(__nt), __end));
+        (1, 43)
+    }
+    pub(crate) fn __reduce143<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // F64 = "-inf" => ActionFn(76);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action76::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant27(__nt), __end));
+        (1, 43)
+    }
+    pub(crate) fn __reduce144<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Fact = LParen, "=", Expr+, Expr, RParen => ActionFn(57);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant1(__symbols);
+        let __sym2 = __pop_Variant18(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action57::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant19(__nt), __end));
+        (5, 44)
+    }
+    pub(crate) fn __reduce145<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Fact = Expr => ActionFn(58);
+        let __sym0 = __pop_Variant1(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action58::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant19(__nt), __end));
+        (1, 44)
+    }
+    pub(crate) fn __reduce146<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Fact* =  => ActionFn(145);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action145::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant10(__nt), __end));
+        (0, 45)
+    }
+    pub(crate) fn __reduce147<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Fact* = Fact+ => ActionFn(146);
+        let __sym0 = __pop_Variant10(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action146::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant10(__nt), __end));
+        (1, 45)
+    }
+    pub(crate) fn __reduce148<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Fact+ = Fact => ActionFn(155);
+        let __sym0 = __pop_Variant19(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action155::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant10(__nt), __end));
+        (1, 46)
+    }
+    pub(crate) fn __reduce149<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Fact+ = Fact+, Fact => ActionFn(156);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant19(__symbols);
+        let __sym0 = __pop_Variant10(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action156::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant10(__nt), __end));
+        (2, 46)
+    }
+    pub(crate) fn __reduce150<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Ident = r#"(([[:alpha:]][\\w-]*)|([-+*/?!=<>&|^/%_]))+"# => ActionFn(77);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action77::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant7(__nt), __end));
+        (1, 47)
+    }
+    pub(crate) fn __reduce151<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // IdentSort = LParen, Ident, Type, RParen => ActionFn(70);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant7(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action70::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant28(__nt), __end));
+        (4, 48)
+    }
+    pub(crate) fn __reduce152<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // IdentSort* =  => ActionFn(94);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action94::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant29(__nt), __end));
+        (0, 49)
+    }
+    pub(crate) fn __reduce153<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // IdentSort* = IdentSort+ => ActionFn(95);
+        let __sym0 = __pop_Variant29(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action95::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant29(__nt), __end));
+        (1, 49)
+    }
+    pub(crate) fn __reduce154<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // IdentSort+ = IdentSort => ActionFn(149);
+        let __sym0 = __pop_Variant28(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action149::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant29(__nt), __end));
+        (1, 50)
+    }
+    pub(crate) fn __reduce155<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // IdentSort+ = IdentSort+, IdentSort => ActionFn(150);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant28(__symbols);
+        let __sym0 = __pop_Variant29(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action150::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant29(__nt), __end));
+        (2, 50)
+    }
+    pub(crate) fn __reduce156<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // LParen = "(" => ActionFn(5);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action5::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant30(__nt), __end));
+        (1, 51)
+    }
+    pub(crate) fn __reduce157<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // LParen = "[" => ActionFn(6);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action6::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant30(__nt), __end));
+        (1, 51)
+    }
+    pub(crate) fn __reduce158<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // List<Action> = LParen, RParen => ActionFn(259);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant30(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action259::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant5(__nt), __end));
+        (2, 52)
+    }
+    pub(crate) fn __reduce159<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // List<Action> = LParen, Action+, RParen => ActionFn(260);
+        assert!(__symbols.len() >= 3);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant24(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym2.2;
+        let __nt = super::__action260::<>(input, __sym0, __sym1, __sym2);
+        __symbols.push((__start, __Symbol::Variant5(__nt), __end));
+        (3, 52)
+    }
+    pub(crate) fn __reduce160<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // List<Fact> = LParen, RParen => ActionFn(265);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant30(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action265::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant14(__nt), __end));
+        (2, 53)
+    }
+    pub(crate) fn __reduce161<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // List<Fact> = LParen, Fact+, RParen => ActionFn(266);
+        assert!(__symbols.len() >= 3);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant10(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym2.2;
+        let __nt = super::__action266::<>(input, __sym0, __sym1, __sym2);
+        __symbols.push((__start, __Symbol::Variant14(__nt), __end));
+        (3, 53)
+    }
+    pub(crate) fn __reduce162<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // List<Type> = LParen, RParen => ActionFn(277);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant30(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action277::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant31(__nt), __end));
+        (2, 54)
+    }
+    pub(crate) fn __reduce163<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // List<Type> = LParen, Type+, RParen => ActionFn(278);
+        assert!(__symbols.len() >= 3);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant20(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym2.2;
+        let __nt = super::__action278::<>(input, __sym0, __sym1, __sym2);
+        __symbols.push((__start, __Symbol::Variant31(__nt), __end));
+        (3, 54)
+    }
+    pub(crate) fn __reduce164<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Literal = Num => ActionFn(63);
+        let __sym0 = __pop_Variant33(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action63::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant32(__nt), __end));
+        (1, 55)
+    }
+    pub(crate) fn __reduce165<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Literal = F64 => ActionFn(64);
+        let __sym0 = __pop_Variant27(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action64::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant32(__nt), __end));
+        (1, 55)
+    }
+    pub(crate) fn __reduce166<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Literal = SymString => ActionFn(65);
+        let __sym0 = __pop_Variant7(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action65::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant32(__nt), __end));
+        (1, 55)
+    }
+    pub(crate) fn __reduce167<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Name = "[", Ident, "]" => ActionFn(56);
+        assert!(__symbols.len() >= 3);
+        let __sym2 = __pop_Variant0(__symbols);
+        let __sym1 = __pop_Variant7(__symbols);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym2.2;
+        let __nt = super::__action56::<>(input, __sym0, __sym1, __sym2);
+        __symbols.push((__start, __Symbol::Variant7(__nt), __end));
+        (3, 56)
+    }
+    pub(crate) fn __reduce168<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // NonLetAction = LParen, "set", LParen, Ident, RParen, Expr, RParen => ActionFn(261);
+        assert!(__symbols.len() >= 7);
+        let __sym6 = __pop_Variant30(__symbols);
+        let __sym5 = __pop_Variant1(__symbols);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant7(__symbols);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym6.2;
+        let __nt = super::__action261::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6);
+        __symbols.push((__start, __Symbol::Variant23(__nt), __end));
+        (7, 57)
+    }
+    pub(crate) fn __reduce169<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // NonLetAction = LParen, "set", LParen, Ident, Expr+, RParen, Expr, RParen => ActionFn(262);
+        assert!(__symbols.len() >= 8);
+        let __sym7 = __pop_Variant30(__symbols);
+        let __sym6 = __pop_Variant1(__symbols);
+        let __sym5 = __pop_Variant30(__symbols);
+        let __sym4 = __pop_Variant18(__symbols);
+        let __sym3 = __pop_Variant7(__symbols);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym7.2;
+        let __nt = super::__action262::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6, __sym7);
+        __symbols.push((__start, __Symbol::Variant23(__nt), __end));
+        (8, 57)
+    }
+    pub(crate) fn __reduce170<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // NonLetAction = LParen, "delete", LParen, Ident, RParen, RParen => ActionFn(263);
+        assert!(__symbols.len() >= 6);
+        let __sym5 = __pop_Variant30(__symbols);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant7(__symbols);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym5.2;
+        let __nt = super::__action263::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5);
+        __symbols.push((__start, __Symbol::Variant23(__nt), __end));
+        (6, 57)
+    }
+    pub(crate) fn __reduce171<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // NonLetAction = LParen, "delete", LParen, Ident, Expr+, RParen, RParen => ActionFn(264);
+        assert!(__symbols.len() >= 7);
+        let __sym6 = __pop_Variant30(__symbols);
+        let __sym5 = __pop_Variant30(__symbols);
+        let __sym4 = __pop_Variant18(__symbols);
+        let __sym3 = __pop_Variant7(__symbols);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym6.2;
+        let __nt = super::__action264::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5, __sym6);
+        __symbols.push((__start, __Symbol::Variant23(__nt), __end));
+        (7, 57)
+    }
+    pub(crate) fn __reduce172<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // NonLetAction = LParen, "union", Expr, Expr, RParen => ActionFn(49);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant1(__symbols);
+        let __sym2 = __pop_Variant1(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action49::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant23(__nt), __end));
+        (5, 57)
+    }
+    pub(crate) fn __reduce173<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // NonLetAction = LParen, "panic", String, RParen => ActionFn(50);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant3(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action50::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant23(__nt), __end));
+        (4, 57)
+    }
+    pub(crate) fn __reduce174<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // NonLetAction = LParen, "extract", Expr, RParen => ActionFn(51);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant1(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action51::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant23(__nt), __end));
+        (4, 57)
+    }
+    pub(crate) fn __reduce175<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // NonLetAction = LParen, "extract", Expr, Expr, RParen => ActionFn(52);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant1(__symbols);
+        let __sym2 = __pop_Variant1(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action52::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant23(__nt), __end));
+        (5, 57)
+    }
+    pub(crate) fn __reduce176<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // NonLetAction = CallExpr => ActionFn(53);
+        let __sym0 = __pop_Variant1(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action53::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant23(__nt), __end));
+        (1, 57)
+    }
+    pub(crate) fn __reduce177<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Num = r#"(-)?[0-9]+"# => ActionFn(71);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action71::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant33(__nt), __end));
+        (1, 58)
+    }
+    pub(crate) fn __reduce178<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Program =  => ActionFn(239);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action239::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant34(__nt), __end));
+        (0, 59)
+    }
+    pub(crate) fn __reduce179<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Program = (Command)+ => ActionFn(240);
+        let __sym0 = __pop_Variant17(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action240::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant34(__nt), __end));
+        (1, 59)
+    }
+    pub(crate) fn __reduce180<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // RParen = ")" => ActionFn(7);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action7::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant30(__nt), __end));
+        (1, 60)
+    }
+    pub(crate) fn __reduce181<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // RParen = "]" => ActionFn(8);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action8::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant30(__nt), __end));
+        (1, 60)
+    }
+    pub(crate) fn __reduce182<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Schedule = LParen, "saturate", RParen => ActionFn(271);
+        assert!(__symbols.len() >= 3);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym2.2;
+        let __nt = super::__action271::<>(input, __sym0, __sym1, __sym2);
+        __symbols.push((__start, __Symbol::Variant35(__nt), __end));
+        (3, 61)
+    }
+    pub(crate) fn __reduce183<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Schedule = LParen, "saturate", Schedule+, RParen => ActionFn(272);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant36(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action272::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant35(__nt), __end));
+        (4, 61)
+    }
+    pub(crate) fn __reduce184<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Schedule = LParen, "seq", RParen => ActionFn(273);
+        assert!(__symbols.len() >= 3);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym2.2;
+        let __nt = super::__action273::<>(input, __sym0, __sym1, __sym2);
+        __symbols.push((__start, __Symbol::Variant35(__nt), __end));
+        (3, 61)
+    }
+    pub(crate) fn __reduce185<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Schedule = LParen, "seq", Schedule+, RParen => ActionFn(274);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant36(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action274::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant35(__nt), __end));
+        (4, 61)
+    }
+    pub(crate) fn __reduce186<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Schedule = LParen, "repeat", UNum, RParen => ActionFn(275);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant12(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action275::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant35(__nt), __end));
+        (4, 61)
+    }
+    pub(crate) fn __reduce187<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Schedule = LParen, "repeat", UNum, Schedule+, RParen => ActionFn(276);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant36(__symbols);
+        let __sym2 = __pop_Variant12(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action276::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant35(__nt), __end));
+        (5, 61)
+    }
+    pub(crate) fn __reduce188<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Schedule = LParen, "run", ":until", RParen => ActionFn(219);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant0(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action219::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant35(__nt), __end));
+        (4, 61)
+    }
+    pub(crate) fn __reduce189<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Schedule = LParen, "run", ":until", (Fact)+, RParen => ActionFn(220);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant10(__symbols);
+        let __sym2 = __pop_Variant0(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action220::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant35(__nt), __end));
+        (5, 61)
+    }
+    pub(crate) fn __reduce190<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Schedule = LParen, "run", RParen => ActionFn(221);
+        assert!(__symbols.len() >= 3);
+        let __sym2 = __pop_Variant30(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym2.2;
+        let __nt = super::__action221::<>(input, __sym0, __sym1, __sym2);
+        __symbols.push((__start, __Symbol::Variant35(__nt), __end));
+        (3, 61)
+    }
+    pub(crate) fn __reduce191<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Schedule = LParen, "run", Ident, ":until", RParen => ActionFn(222);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant0(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action222::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant35(__nt), __end));
+        (5, 61)
+    }
+    pub(crate) fn __reduce192<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Schedule = LParen, "run", Ident, ":until", (Fact)+, RParen => ActionFn(223);
+        assert!(__symbols.len() >= 6);
+        let __sym5 = __pop_Variant30(__symbols);
+        let __sym4 = __pop_Variant10(__symbols);
+        let __sym3 = __pop_Variant0(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym5.2;
+        let __nt = super::__action223::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4, __sym5);
+        __symbols.push((__start, __Symbol::Variant35(__nt), __end));
+        (6, 61)
+    }
+    pub(crate) fn __reduce193<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Schedule = LParen, "run", Ident, RParen => ActionFn(224);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant7(__symbols);
+        let __sym1 = __pop_Variant0(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action224::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant35(__nt), __end));
+        (4, 61)
+    }
+    pub(crate) fn __reduce194<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Schedule = Ident => ActionFn(44);
+        let __sym0 = __pop_Variant7(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action44::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant35(__nt), __end));
+        (1, 61)
+    }
+    pub(crate) fn __reduce195<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Schedule* =  => ActionFn(87);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action87::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant36(__nt), __end));
+        (0, 62)
+    }
+    pub(crate) fn __reduce196<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Schedule* = Schedule+ => ActionFn(88);
+        let __sym0 = __pop_Variant36(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action88::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant36(__nt), __end));
+        (1, 62)
+    }
+    pub(crate) fn __reduce197<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Schedule+ = Schedule => ActionFn(151);
+        let __sym0 = __pop_Variant35(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action151::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant36(__nt), __end));
+        (1, 63)
+    }
+    pub(crate) fn __reduce198<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Schedule+ = Schedule+, Schedule => ActionFn(152);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant35(__symbols);
+        let __sym0 = __pop_Variant36(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action152::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant36(__nt), __end));
+        (2, 63)
+    }
+    pub(crate) fn __reduce199<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Schema = List<Type>, Type => ActionFn(59);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant7(__symbols);
+        let __sym0 = __pop_Variant31(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action59::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant37(__nt), __end));
+        (2, 64)
+    }
+    pub(crate) fn __reduce200<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // String = r#"(\"[^\"]*\")+"# => ActionFn(79);
+        let __sym0 = __pop_Variant0(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action79::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant3(__nt), __end));
+        (1, 65)
+    }
+    pub(crate) fn __reduce201<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // SymString = String => ActionFn(78);
+        let __sym0 = __pop_Variant3(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action78::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant7(__nt), __end));
+        (1, 66)
+    }
+    pub(crate) fn __reduce202<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Type = Ident => ActionFn(69);
+        let __sym0 = __pop_Variant7(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action69::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant7(__nt), __end));
+        (1, 67)
+    }
+    pub(crate) fn __reduce203<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Type* =  => ActionFn(143);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action143::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant20(__nt), __end));
+        (0, 68)
+    }
+    pub(crate) fn __reduce204<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Type* = Type+ => ActionFn(144);
+        let __sym0 = __pop_Variant20(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action144::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant20(__nt), __end));
+        (1, 68)
+    }
+    pub(crate) fn __reduce205<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Type+ = Type => ActionFn(157);
+        let __sym0 = __pop_Variant7(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action157::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant20(__nt), __end));
+        (1, 69)
+    }
+    pub(crate) fn __reduce206<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Type+ = Type+, Type => ActionFn(158);
+        assert!(__symbols.len() >= 2);
+        let __sym1 = __pop_Variant7(__symbols);
+        let __sym0 = __pop_Variant20(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym1.2;
+        let __nt = super::__action158::<>(input, __sym0, __sym1);
+        __symbols.push((__start, __Symbol::Variant20(__nt), __end));
+        (2, 69)
+    }
+    pub(crate) fn __reduce207<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // UNum = Num => ActionFn(72);
+        let __sym0 = __pop_Variant33(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action72::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant12(__nt), __end));
+        (1, 70)
+    }
+    pub(crate) fn __reduce208<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // UNum? = UNum => ActionFn(85);
+        let __sym0 = __pop_Variant12(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action85::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant13(__nt), __end));
+        (1, 71)
+    }
+    pub(crate) fn __reduce209<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // UNum? =  => ActionFn(86);
+        let __start = __lookahead_start.cloned().or_else(|| __symbols.last().map(|s| s.2.clone())).unwrap_or_default();
+        let __end = __start.clone();
+        let __nt = super::__action86::<>(input, &__start, &__end);
+        __symbols.push((__start, __Symbol::Variant13(__nt), __end));
+        (0, 71)
+    }
+    pub(crate) fn __reduce210<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Variant = LParen, Ident, Cost, RParen => ActionFn(253);
+        assert!(__symbols.len() >= 4);
+        let __sym3 = __pop_Variant30(__symbols);
+        let __sym2 = __pop_Variant25(__symbols);
+        let __sym1 = __pop_Variant7(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym3.2;
+        let __nt = super::__action253::<>(input, __sym0, __sym1, __sym2, __sym3);
+        __symbols.push((__start, __Symbol::Variant21(__nt), __end));
+        (4, 72)
+    }
+    pub(crate) fn __reduce211<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // Variant = LParen, Ident, (Type)+, Cost, RParen => ActionFn(254);
+        assert!(__symbols.len() >= 5);
+        let __sym4 = __pop_Variant30(__symbols);
+        let __sym3 = __pop_Variant25(__symbols);
+        let __sym2 = __pop_Variant20(__symbols);
+        let __sym1 = __pop_Variant7(__symbols);
+        let __sym0 = __pop_Variant30(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym4.2;
+        let __nt = super::__action254::<>(input, __sym0, __sym1, __sym2, __sym3, __sym4);
+        __symbols.push((__start, __Symbol::Variant21(__nt), __end));
+        (5, 72)
+    }
+    pub(crate) fn __reduce212<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // __Action = Action => ActionFn(1);
+        let __sym0 = __pop_Variant23(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action1::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant23(__nt), __end));
+        (1, 73)
+    }
+    pub(crate) fn __reduce213<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // __Expr = Expr => ActionFn(3);
+        let __sym0 = __pop_Variant1(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action3::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant1(__nt), __end));
+        (1, 74)
+    }
+    pub(crate) fn __reduce214<
+        'input,
+    >(
+        input: &'input str,
+        __lookahead_start: Option<&usize>,
+        __symbols: &mut alloc::vec::Vec<(usize,__Symbol<'input>,usize)>,
+        _: core::marker::PhantomData<(&'input ())>,
+    ) -> (usize, usize)
+    {
+        // __Fact = Fact => ActionFn(2);
+        let __sym0 = __pop_Variant19(__symbols);
+        let __start = __sym0.0;
+        let __end = __sym0.2;
+        let __nt = super::__action2::<>(input, __sym0);
+        __symbols.push((__start, __Symbol::Variant19(__nt), __end));
+        (1, 75)
+    }
+}
+pub use self::__parse__Program::ProgramParser;
+#[cfg_attr(rustfmt, rustfmt_skip)]
+mod __intern_token {
+    #![allow(unused_imports)]
+    use crate::ast::*;
+    use crate::Symbol;
+    use crate::Schedule;
+    use ordered_float::OrderedFloat;
+    #[allow(unused_extern_crates)]
+    extern crate lalrpop_util as __lalrpop_util;
+    #[allow(unused_imports)]
+    use self::__lalrpop_util::state_machine as __state_machine;
+    extern crate core;
+    extern crate alloc;
+    pub fn new_builder() -> __lalrpop_util::lexer::MatcherBuilder {
+        let __strs: &[(&str, bool)] = &[
+            ("^(((?:\"[\0-!\\#-\u{10ffff}]*\"))+)", false),
+            ("^(((?:((?:[A-Za-z][\\-0-9A-Z_a-zªµºÀ-ÖØ-öø-ˁˆ-ˑˠ-ˤˬˮ\u{300}-ʹͶͷͺ-ͽͿΆΈ-ΊΌΎ-ΡΣ-ϵϷ-ҁ\u{483}-ԯԱ-Ֆՙՠ-ֈ\u{591}-\u{5bd}\u{5bf}\u{5c1}\u{5c2}\u{5c4}\u{5c5}\u{5c7}א-תׯ-ײ\u{610}-\u{61a}ؠ-٩ٮ-ۓە-\u{6dc}\u{6df}-\u{6e8}\u{6ea}-ۼۿܐ-\u{74a}ݍ-ޱ߀-ߵߺ\u{7fd}ࠀ-\u{82d}ࡀ-\u{85b}ࡠ-ࡪࡰ-ࢇࢉ-ࢎ\u{898}-\u{8e1}\u{8e3}-\u{963}०-९ॱ-ঃঅ-ঌএঐও-নপ-রলশ-হ\u{9bc}-\u{9c4}েৈো-ৎ\u{9d7}ড়ঢ়য়-\u{9e3}০-ৱৼ\u{9fe}\u{a01}-ਃਅ-ਊਏਐਓ-ਨਪ-ਰਲਲ਼ਵਸ਼ਸਹ\u{a3c}ਾ-\u{a42}\u{a47}\u{a48}\u{a4b}-\u{a4d}\u{a51}ਖ਼-ੜਫ਼੦-\u{a75}\u{a81}-ઃઅ-ઍએ-ઑઓ-નપ-રલળવ-હ\u{abc}-\u{ac5}\u{ac7}-ૉો-\u{acd}ૐૠ-\u{ae3}૦-૯ૹ-\u{aff}\u{b01}-ଃଅ-ଌଏଐଓ-ନପ-ରଲଳଵ-ହ\u{b3c}-\u{b44}େୈୋ-\u{b4d}\u{b55}-\u{b57}ଡ଼ଢ଼ୟ-\u{b63}୦-୯ୱ\u{b82}ஃஅ-ஊஎ-ஐஒ-கஙசஜஞடணதந-பம-ஹ\u{bbe}-ூெ-ைொ-\u{bcd}ௐ\u{bd7}௦-௯\u{c00}-ఌఎ-ఐఒ-నప-హ\u{c3c}-ౄ\u{c46}-\u{c48}\u{c4a}-\u{c4d}\u{c55}\u{c56}ౘ-ౚౝౠ-\u{c63}౦-౯ಀ-ಃಅ-ಌಎ-ಐಒ-ನಪ-ಳವ-ಹ\u{cbc}-ೄ\u{cc6}-ೈೊ-\u{ccd}\u{cd5}\u{cd6}ೝೞೠ-\u{ce3}೦-೯ೱ-ೳ\u{d00}-ഌഎ-ഐഒ-\u{d44}െ-ൈൊ-ൎൔ-\u{d57}ൟ-\u{d63}൦-൯ൺ-ൿ\u{d81}-ඃඅ-ඖක-නඳ-රලව-ෆ\u{dca}\u{dcf}-\u{dd4}\u{dd6}ෘ-\u{ddf}෦-෯ෲෳก-\u{e3a}เ-\u{e4e}๐-๙ກຂຄຆ-ຊຌ-ຣລວ-ຽເ-ໄໆ\u{ec8}-\u{ece}໐-໙ໜ-ໟༀ\u{f18}\u{f19}༠-༩\u{f35}\u{f37}\u{f39}༾-ཇཉ-ཬ\u{f71}-\u{f84}\u{f86}-\u{f97}\u{f99}-\u{fbc}\u{fc6}က-၉ၐ-\u{109d}Ⴀ-ჅჇჍა-ჺჼ-ቈቊ-ቍቐ-ቖቘቚ-ቝበ-ኈኊ-ኍነ-ኰኲ-ኵኸ-ኾዀዂ-ዅወ-ዖዘ-ጐጒ-ጕጘ-ፚ\u{135d}-\u{135f}ᎀ-ᎏᎠ-Ᏽᏸ-ᏽᐁ-ᙬᙯ-ᙿᚁ-ᚚᚠ-ᛪᛮ-ᛸᜀ-᜕ᜟ-᜴ᝀ-\u{1753}ᝠ-ᝬᝮ-ᝰ\u{1772}\u{1773}ក-\u{17d3}ៗៜ\u{17dd}០-៩\u{180b}-\u{180d}\u{180f}-᠙ᠠ-ᡸᢀ-ᢪᢰ-ᣵᤀ-ᤞ\u{1920}-ᤫᤰ-\u{193b}᥆-ᥭᥰ-ᥴᦀ-ᦫᦰ-ᧉ᧐-᧙ᨀ-\u{1a1b}ᨠ-\u{1a5e}\u{1a60}-\u{1a7c}\u{1a7f}-᪉᪐-᪙ᪧ\u{1ab0}-\u{1ace}\u{1b00}-ᭌ᭐-᭙\u{1b6b}-\u{1b73}\u{1b80}-᯳ᰀ-\u{1c37}᱀-᱉ᱍ-ᱽᲀ-ᲈᲐ-ᲺᲽ-Ჿ\u{1cd0}-\u{1cd2}\u{1cd4}-ᳺᴀ-ἕἘ-Ἕἠ-ὅὈ-Ὅὐ-ὗὙὛὝὟ-ώᾀ-ᾴᾶ-ᾼιῂ-ῄῆ-ῌῐ-ΐῖ-Ίῠ-Ῥῲ-ῴῶ-ῼ\u{200c}\u{200d}‿⁀⁔ⁱⁿₐ-ₜ\u{20d0}-\u{20f0}ℂℇℊ-ℓℕℙ-ℝℤΩℨK-ℭℯ-ℹℼ-ℿⅅ-ⅉⅎⅠ-ↈⒶ-ⓩⰀ-ⳤⳫ-ⳳⴀ-ⴥⴧⴭⴰ-ⵧⵯ\u{2d7f}-ⶖⶠ-ⶦⶨ-ⶮⶰ-ⶶⶸ-ⶾⷀ-ⷆⷈ-ⷎⷐ-ⷖⷘ-ⷞ\u{2de0}-\u{2dff}ⸯ々-〇〡-\u{302f}〱-〵〸-〼ぁ-ゖ\u{3099}\u{309a}ゝ-ゟァ-ヺー-ヿㄅ-ㄯㄱ-ㆎㆠ-ㆿㇰ-ㇿ㐀-䶿一-ꒌꓐ-ꓽꔀ-ꘌꘐ-ꘫꙀ-\u{a672}\u{a674}-\u{a67d}ꙿ-\u{a6f1}ꜗ-ꜟꜢ-ꞈꞋ-ꟊꟐꟑꟓꟕ-ꟙꟲ-ꠧ\u{a82c}ꡀ-ꡳꢀ-\u{a8c5}꣐-꣙\u{a8e0}-ꣷꣻꣽ-\u{a92d}ꤰ-꥓ꥠ-ꥼ\u{a980}-꧀ꧏ-꧙ꧠ-ꧾꨀ-\u{aa36}ꩀ-ꩍ꩐-꩙ꩠ-ꩶꩺ-ꫂꫛ-ꫝꫠ-ꫯꫲ-\u{aaf6}ꬁ-ꬆꬉ-ꬎꬑ-ꬖꬠ-ꬦꬨ-ꬮꬰ-ꭚꭜ-ꭩꭰ-ꯪ꯬\u{abed}꯰-꯹가-힣ힰ-ퟆퟋ-ퟻ豈-舘並-龎ff-stﬓ-ﬗיִ-ﬨשׁ-זּטּ-לּמּנּסּףּפּצּ-ﮱﯓ-ﴽﵐ-ﶏﶒ-ﷇﷰ-ﷻ\u{fe00}-\u{fe0f}\u{fe20}-\u{fe2f}︳︴﹍-﹏ﹰ-ﹴﹶ-ﻼ0-9A-Z_a-zヲ-하-ᅦᅧ-ᅬᅭ-ᅲᅳ-ᅵ𐀀-𐀋𐀍-𐀦𐀨-𐀺𐀼𐀽𐀿-𐁍𐁐-𐁝𐂀-𐃺𐅀-𐅴\u{101fd}𐊀-𐊜𐊠-𐋐\u{102e0}𐌀-𐌟𐌭-𐍊𐍐-\u{1037a}𐎀-𐎝𐎠-𐏃𐏈-𐏏𐏑-𐏕𐐀-𐒝𐒠-𐒩𐒰-𐓓𐓘-𐓻𐔀-𐔧𐔰-𐕣𐕰-𐕺𐕼-𐖊𐖌-𐖒𐖔𐖕𐖗-𐖡𐖣-𐖱𐖳-𐖹𐖻𐖼𐘀-𐜶𐝀-𐝕𐝠-𐝧𐞀-𐞅𐞇-𐞰𐞲-𐞺𐠀-𐠅𐠈𐠊-𐠵𐠷𐠸𐠼𐠿-𐡕𐡠-𐡶𐢀-𐢞𐣠-𐣲𐣴𐣵𐤀-𐤕𐤠-𐤹𐦀-𐦷𐦾𐦿𐨀-\u{10a03}\u{10a05}\u{10a06}\u{10a0c}-𐨓𐨕-𐨗𐨙-𐨵\u{10a38}-\u{10a3a}\u{10a3f}𐩠-𐩼𐪀-𐪜𐫀-𐫇𐫉-\u{10ae6}𐬀-𐬵𐭀-𐭕𐭠-𐭲𐮀-𐮑𐰀-𐱈𐲀-𐲲𐳀-𐳲𐴀-\u{10d27}𐴰-𐴹𐺀-𐺩\u{10eab}\u{10eac}𐺰𐺱\u{10efd}-𐼜𐼧𐼰-\u{10f50}𐽰-\u{10f85}𐾰-𐿄𐿠-𐿶𑀀-\u{11046}𑁦-𑁵\u{1107f}-\u{110ba}\u{110c2}𑃐-𑃨𑃰-𑃹\u{11100}-\u{11134}𑄶-𑄿𑅄-𑅇𑅐-\u{11173}𑅶\u{11180}-𑇄\u{111c9}-\u{111cc}𑇎-𑇚𑇜𑈀-𑈑𑈓-\u{11237}\u{1123e}-\u{11241}𑊀-𑊆𑊈𑊊-𑊍𑊏-𑊝𑊟-𑊨𑊰-\u{112ea}𑋰-𑋹\u{11300}-𑌃𑌅-𑌌𑌏𑌐𑌓-𑌨𑌪-𑌰𑌲𑌳𑌵-𑌹\u{1133b}-𑍄𑍇𑍈𑍋-𑍍𑍐\u{11357}𑍝-𑍣\u{11366}-\u{1136c}\u{11370}-\u{11374}𑐀-𑑊𑑐-𑑙\u{1145e}-𑑡𑒀-𑓅𑓇𑓐-𑓙𑖀-\u{115b5}𑖸-\u{115c0}𑗘-\u{115dd}𑘀-\u{11640}𑙄𑙐-𑙙𑚀-𑚸𑛀-𑛉𑜀-𑜚\u{1171d}-\u{1172b}𑜰-𑜹𑝀-𑝆𑠀-\u{1183a}𑢠-𑣩𑣿-𑤆𑤉𑤌-𑤓𑤕𑤖𑤘-𑤵𑤷𑤸\u{1193b}-\u{11943}𑥐-𑥙𑦠-𑦧𑦪-\u{119d7}\u{119da}-𑧡𑧣𑧤𑨀-\u{11a3e}\u{11a47}𑩐-\u{11a99}𑪝𑪰-𑫸𑰀-𑰈𑰊-\u{11c36}\u{11c38}-𑱀𑱐-𑱙𑱲-𑲏\u{11c92}-\u{11ca7}𑲩-\u{11cb6}𑴀-𑴆𑴈𑴉𑴋-\u{11d36}\u{11d3a}\u{11d3c}\u{11d3d}\u{11d3f}-\u{11d47}𑵐-𑵙𑵠-𑵥𑵧𑵨𑵪-𑶎\u{11d90}\u{11d91}𑶓-𑶘𑶠-𑶩𑻠-𑻶\u{11f00}-𑼐𑼒-\u{11f3a}𑼾-\u{11f42}𑽐-𑽙𑾰𒀀-𒎙𒐀-𒑮𒒀-𒕃𒾐-𒿰𓀀-𓐯\u{13440}-\u{13455}𔐀-𔙆𖠀-𖨸𖩀-𖩞𖩠-𖩩𖩰-𖪾𖫀-𖫉𖫐-𖫭\u{16af0}-\u{16af4}𖬀-\u{16b36}𖭀-𖭃𖭐-𖭙𖭣-𖭷𖭽-𖮏𖹀-𖹿𖼀-𖽊\u{16f4f}-𖾇\u{16f8f}-𖾟𖿠𖿡𖿣\u{16fe4}𖿰𖿱𗀀-𘟷𘠀-𘳕𘴀-𘴈𚿰-𚿳𚿵-𚿻𚿽𚿾𛀀-𛄢𛄲𛅐-𛅒𛅕𛅤-𛅧𛅰-𛋻𛰀-𛱪𛱰-𛱼𛲀-𛲈𛲐-𛲙\u{1bc9d}\u{1bc9e}\u{1cf00}-\u{1cf2d}\u{1cf30}-\u{1cf46}\u{1d165}-\u{1d169}𝅭-\u{1d172}\u{1d17b}-\u{1d182}\u{1d185}-\u{1d18b}\u{1d1aa}-\u{1d1ad}\u{1d242}-\u{1d244}𝐀-𝑔𝑖-𝒜𝒞𝒟𝒢𝒥𝒦𝒩-𝒬𝒮-𝒹𝒻𝒽-𝓃𝓅-𝔅𝔇-𝔊𝔍-𝔔𝔖-𝔜𝔞-𝔹𝔻-𝔾𝕀-𝕄𝕆𝕊-𝕐𝕒-𝚥𝚨-𝛀𝛂-𝛚𝛜-𝛺𝛼-𝜔𝜖-𝜴𝜶-𝝎𝝐-𝝮𝝰-𝞈𝞊-𝞨𝞪-𝟂𝟄-𝟋𝟎-𝟿\u{1da00}-\u{1da36}\u{1da3b}-\u{1da6c}\u{1da75}\u{1da84}\u{1da9b}-\u{1da9f}\u{1daa1}-\u{1daaf}𝼀-𝼞𝼥-𝼪\u{1e000}-\u{1e006}\u{1e008}-\u{1e018}\u{1e01b}-\u{1e021}\u{1e023}\u{1e024}\u{1e026}-\u{1e02a}𞀰-𞁭\u{1e08f}𞄀-𞄬\u{1e130}-𞄽𞅀-𞅉𞅎𞊐-\u{1e2ae}𞋀-𞋹𞓐-𞓹𞟠-𞟦𞟨-𞟫𞟭𞟮𞟰-𞟾𞠀-𞣄\u{1e8d0}-\u{1e8d6}𞤀-𞥋𞥐-𞥙𞸀-𞸃𞸅-𞸟𞸡𞸢𞸤𞸧𞸩-𞸲𞸴-𞸷𞸹𞸻𞹂𞹇𞹉𞹋𞹍-𞹏𞹑𞹒𞹔𞹗𞹙𞹛𞹝𞹟𞹡𞹢𞹤𞹧-𞹪𞹬-𞹲𞹴-𞹷𞹹-𞹼𞹾𞺀-𞺉𞺋-𞺛𞺡-𞺣𞺥-𞺩𞺫-𞺻🄰-🅉🅐-🅩🅰-🆉🯰-🯹𠀀-𪛟𪜀-𫜹𫝀-𫠝𫠠-𬺡𬺰-𮯠丽-𪘀𰀀-𱍊𱍐-𲎯\u{e0100}-\u{e01ef}]*))|([!%\\&\\*\\+\\-/<-\\?\\^_\\|])))+)", false),
+            ("^((?:(\\-)?[0-9]+))", false),
+            ("^((?:(\\-)?[0-9]+\\.[0-9]+((?:e(\\+)?(\\-)?[0-9]+))?))", false),
+            ("^(\\()", false),
+            ("^(\\))", false),
+            ("^((?:\\-inf))", false),
+            ("^((?::cost))", false),
+            ("^((?::default))", false),
+            ("^((?::merge))", false),
+            ("^((?::name))", false),
+            ("^((?::on_merge))", false),
+            ("^((?::ruleset))", false),
+            ("^((?::unextractable))", false),
+            ("^((?::until))", false),
+            ("^((?::variants))", false),
+            ("^((?::when))", false),
+            ("^(=)", false),
+            ("^((?:NaN))", false),
+            ("^(\\[)", false),
+            ("^(\\])", false),
+            ("^((?:add\\-ruleset))", false),
+            ("^((?:birewrite))", false),
+            ("^((?:calc))", false),
+            ("^((?:check))", false),
+            ("^((?:check\\-proof))", false),
+            ("^((?:datatype))", false),
+            ("^((?:declare))", false),
+            ("^((?:delete))", false),
+            ("^((?:extract))", false),
+            ("^((?:fail))", false),
+            ("^((?:function))", false),
+            ("^((?:include))", false),
+            ("^((?:inf))", false),
+            ("^((?:input))", false),
+            ("^((?:let))", false),
+            ("^((?:output))", false),
+            ("^((?:panic))", false),
+            ("^((?:pop))", false),
+            ("^((?:print\\-size))", false),
+            ("^((?:print\\-table))", false),
+            ("^((?:push))", false),
+            ("^((?:query\\-extract))", false),
+            ("^((?:relation))", false),
+            ("^((?:repeat))", false),
+            ("^((?:rewrite))", false),
+            ("^((?:rule))", false),
+            ("^((?:ruleset))", false),
+            ("^((?:run))", false),
+            ("^((?:run\\-schedule))", false),
+            ("^((?:saturate))", false),
+            ("^((?:seq))", false),
+            ("^((?:set))", false),
+            ("^((?:set\\-option))", false),
+            ("^((?:simplify))", false),
+            ("^((?:sort))", false),
+            ("^((?:union))", false),
+            ("^((?:;[\0-\t\u{b}\u{c}\u{e}-\u{10ffff}]*[\n\r]*))", true),
+            ("^([\t-\r \u{85}\u{a0}\u{1680}\u{2000}-\u{200a}\u{2028}\u{2029}\u{202f}\u{205f}\u{3000}]*)", true),
+        ];
+        __lalrpop_util::lexer::MatcherBuilder::new(__strs.iter().copied()).unwrap()
+    }
+}
+pub(crate) use self::__lalrpop_util::lexer::Token;
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action0<
+    'input,
+>(
+    input: &'input str,
+    (_, __0, _): (usize, Vec<Command>, usize),
+) -> Vec<Command>
+{
+    __0
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action1<
+    'input,
+>(
+    input: &'input str,
+    (_, __0, _): (usize, Action, usize),
+) -> Action
+{
+    __0
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action2<
+    'input,
+>(
+    input: &'input str,
+    (_, __0, _): (usize, Fact, usize),
+) -> Fact
+{
+    __0
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action3<
+    'input,
+>(
+    input: &'input str,
+    (_, __0, _): (usize, Expr, usize),
+) -> Expr
+{
+    __0
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action4<
+    'input,
+>(
+    input: &'input str,
+    (_, __0, _): (usize, alloc::vec::Vec<Command>, usize),
+) -> Vec<Command>
+{
+    __0
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action5<
+    'input,
+>(
+    input: &'input str,
+    (_, __0, _): (usize, &'input str, usize),
+)
+{
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action6<
+    'input,
+>(
+    input: &'input str,
+    (_, __0, _): (usize, &'input str, usize),
+)
+{
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action7<
+    'input,
+>(
+    input: &'input str,
+    (_, __0, _): (usize, &'input str, usize),
+)
+{
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action8<
+    'input,
+>(
+    input: &'input str,
+    (_, __0, _): (usize, &'input str, usize),
+)
+{
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action9<
+    'input,
+>(
+    input: &'input str,
+    (_, _, _): (usize, (), usize),
+    (_, _, _): (usize, &'input str, usize),
+    (_, name, _): (usize, Symbol, usize),
+    (_, value, _): (usize, Expr, usize),
+    (_, _, _): (usize, (), usize),
+) -> Command
+{
+    Command::SetOption { name, value }
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action10<
+    'input,
+>(
+    input: &'input str,
+    (_, _, _): (usize, (), usize),
+    (_, _, _): (usize, &'input str, usize),
+    (_, name, _): (usize, Symbol, usize),
+    (_, variants, _): (usize, alloc::vec::Vec<Variant>, usize),
+    (_, _, _): (usize, (), usize),
+) -> Command
+{
+    Command::Datatype { name, variants }
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action11<
+    'input,
+>(
+    input: &'input str,
+    (_, _, _): (usize, (), usize),
+    (_, _, _): (usize, &'input str, usize),
+    (_, name, _): (usize, Symbol, usize),
+    (_, _, _): (usize, (), usize),
+    (_, head, _): (usize, Symbol, usize),
+    (_, tail, _): (usize, alloc::vec::Vec<Expr>, usize),
+    (_, _, _): (usize, (), usize),
+    (_, _, _): (usize, (), usize),
+) -> Command
+{
+    Command::Sort (name, Some((head, tail)))
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action12<
+    'input,
+>(
+    input: &'input str,
+    (_, _, _): (usize, (), usize),
+    (_, _, _): (usize, &'input str, usize),
+    (_, name, _): (usize, Symbol, usize),
+    (_, _, _): (usize, (), usize),
+) -> Command
+{
+    Command::Sort (name, None)
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action13<
+    'input,
+>(
+    input: &'input str,
+    (_, _, _): (usize, (), usize),
+    (_, _, _): (usize, &'input str, usize),
+    (_, name, _): (usize, Symbol, usize),
+    (_, schema, _): (usize, Schema, usize),
+    (_, cost, _): (usize, Option<usize>, usize),
+    (_, unextractable, _): (usize, core::option::Option<&'input str>, usize),
+    (_, merge_action, _): (usize, core::option::Option<Vec<Action>>, usize),
+    (_, merge, _): (usize, core::option::Option<Expr>, usize),
+    (_, default, _): (usize, core::option::Option<Expr>, usize),
+    (_, _, _): (usize, (), usize),
+) -> Command
+{
+    {
+        Command::Function(FunctionDecl { name, schema, merge, merge_action: merge_action.unwrap_or_default(), default, cost, unextractable: unextractable.is_some() })
+    }
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action14<
+    'input,
+>(
+    input: &'input str,
+    (_, _, _): (usize, (), usize),
+    (_, _, _): (usize, &'input str, usize),
+    (_, name, _): (usize, Symbol, usize),
+    (_, sort, _): (usize, Symbol, usize),
+    (_, _, _): (usize, (), usize),
+) -> Command
+{
+    Command::Declare{name, sort}
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action15<
+    'input,
+>(
+    input: &'input str,
+    (_, _, _): (usize, (), usize),
+    (_, _, _): (usize, &'input str, usize),
+    (_, name, _): (usize, Symbol, usize),
+    (_, types, _): (usize, Vec<Symbol>, usize),
+    (_, _, _): (usize, (), usize),
+) -> Command
+{
+    Command::Function(FunctionDecl::relation(name, types))
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action16<
+    'input,
+>(
+    input: &'input str,
+    (_, _, _): (usize, (), usize),
+    (_, _, _): (usize, &'input str, usize),
+    (_, name, _): (usize, Symbol, usize),
+    (_, _, _): (usize, (), usize),
+) -> Command
+{
+    Command::AddRuleset(name)
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action17<
+    'input,
+>(
+    input: &'input str,
+    (_, _, _): (usize, (), usize),
+    (_, _, _): (usize, &'input str, usize),
+    (_, body, _): (usize, Vec<Fact>, usize),
+    (_, head, _): (usize, Vec<Action>, usize),
+    (_, ruleset, _): (usize, core::option::Option<Symbol>, usize),
+    (_, name, _): (usize, core::option::Option<String>, usize),
+    (_, _, _): (usize, (), usize),
+) -> Command
+{
+    Command::Rule{ruleset: ruleset.unwrap_or("".into()), name: name.unwrap_or("".to_string()).into(), rule: Rule { head, body }}
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action18<
+    'input,
+>(
+    input: &'input str,
+    (_, _, _): (usize, (), usize),
+    (_, _, _): (usize, &'input str, usize),
+    (_, lhs, _): (usize, Expr, usize),
+    (_, rhs, _): (usize, Expr, usize),
+    (_, conditions, _): (usize, core::option::Option<Vec<Fact>>, usize),
+    (_, ruleset, _): (usize, core::option::Option<Symbol>, usize),
+    (_, _, _): (usize, (), usize),
+) -> Command
+{
+    Command::Rewrite(ruleset.unwrap_or("".into()), Rewrite { lhs, rhs, conditions: conditions.unwrap_or_default() })
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action19<
+    'input,
+>(
+    input: &'input str,
+    (_, _, _): (usize, (), usize),
+    (_, _, _): (usize, &'input str, usize),
+    (_, lhs, _): (usize, Expr, usize),
+    (_, rhs, _): (usize, Expr, usize),
+    (_, conditions, _): (usize, core::option::Option<Vec<Fact>>, usize),
+    (_, ruleset, _): (usize, core::option::Option<Symbol>, usize),
+    (_, _, _): (usize, (), usize),
+) -> Command
+{
+    Command::BiRewrite(ruleset.unwrap_or("".into()), Rewrite { lhs, rhs, conditions: conditions.unwrap_or_default() })
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action20<
+    'input,
+>(
+    input: &'input str,
+    (_, _, _): (usize, (), usize),
+    (_, _, _): (usize, &'input str, usize),
+    (_, name, _): (usize, Symbol, usize),
+    (_, expr, _): (usize, Expr, usize),
+    (_, _, _): (usize, (), usize),
+) -> Command
+{
+    Command::Action(Action::Let(name, expr))
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action21<
+    'input,
+>(
+    input: &'input str,
+    (_, __0, _): (usize, Action, usize),
+) -> Command
+{
+    Command::Action(__0)
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action22<
+    'input,
+>(
+    input: &'input str,
+    (_, _, _): (usize, (), usize),
+    (_, _, _): (usize, &'input str, usize),
+    (_, limit, _): (usize, usize, usize),
+    (_, until, _): (usize, core::option::Option<alloc::vec::Vec<Fact>>, usize),
+    (_, _, _): (usize, (), usize),
+) -> Command
+{
+    Command::RunSchedule(Schedule::Repeat(limit, Box::new(Schedule::Run(RunConfig { ruleset : "".into(), until }))))
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action23<
+    'input,
+>(
+    input: &'input str,
+    (_, _, _): (usize, (), usize),
+    (_, _, _): (usize, &'input str, usize),
+    (_, ruleset, _): (usize, Symbol, usize),
+    (_, limit, _): (usize, usize, usize),
+    (_, until, _): (usize, core::option::Option<alloc::vec::Vec<Fact>>, usize),
+    (_, _, _): (usize, (), usize),
+) -> Command
+{
+    Command::RunSchedule(Schedule::Repeat(limit, Box::new(Schedule::Run(RunConfig { ruleset, until }))))
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action24<
+    'input,
+>(
+    input: &'input str,
+    (_, _, _): (usize, (), usize),
+    (_, _, _): (usize, &'input str, usize),
+    (_, schedule, _): (usize, Schedule, usize),
+    (_, expr, _): (usize, Expr, usize),
+    (_, _, _): (usize, (), usize),
+) -> Command
+{
+    Command::Simplify { expr, schedule }
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action25<
+    'input,
+>(
+    input: &'input str,
+    (_, _, _): (usize, (), usize),
+    (_, _, _): (usize, &'input str, usize),
+    (_, name, _): (usize, Symbol, usize),
+    (_, _, _): (usize, (), usize),
+) -> Command
+{
+    Command::AddRuleset(name)
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action26<
+    'input,
+>(
+    input: &'input str,
+    (_, _, _): (usize, (), usize),
+    (_, _, _): (usize, &'input str, usize),
+    (_, _, _): (usize, (), usize),
+    (_, idents, _): (usize, alloc::vec::Vec<IdentSort>, usize),
+    (_, _, _): (usize, (), usize),
+    (_, exprs, _): (usize, alloc::vec::Vec<Expr>, usize),
+    (_, _, _): (usize, (), usize),
+) -> Command
+{
+    Command::Calc(idents, exprs)
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action27<
+    'input,
+>(
+    input: &'input str,
+    (_, _, _): (usize, (), usize),
+    (_, _, _): (usize, &'input str, usize),
+    (_, variants, _): (usize, core::option::Option<usize>, usize),
+    (_, fact, _): (usize, Fact, usize),
+    (_, _, _): (usize, (), usize),
+) -> Command
+{
+    Command::Extract { fact, variants: variants.unwrap_or(0) }
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action28<
+    'input,
+>(
+    input: &'input str,
+    (_, _, _): (usize, (), usize),
+    (_, _, _): (usize, &'input str, usize),
+    (_, __0, _): (usize, alloc::vec::Vec<Fact>, usize),
+    (_, _, _): (usize, (), usize),
+) -> Command
+{
+    Command::Check(__0)
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action29<
+    'input,
+>(
+    input: &'input str,
+    (_, __0, _): (usize, (), usize),
+    (_, __1, _): (usize, &'input str, usize),
+    (_, __2, _): (usize, (), usize),
+) -> Command
+{
+    Command::CheckProof
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action30<
+    'input,
+>(
+    input: &'input str,
+    (_, _, _): (usize, (), usize),
+    (_, _, _): (usize, &'input str, usize),
+    (_, __0, _): (usize, alloc::vec::Vec<Schedule>, usize),
+    (_, _, _): (usize, (), usize),
+) -> Command
+{
+    Command::RunSchedule(Schedule::Sequence(__0))
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action31<
+    'input,
+>(
+    input: &'input str,
+    (_, _, _): (usize, (), usize),
+    (_, _, _): (usize, &'input str, usize),
+    (_, __0, _): (usize, core::option::Option<usize>, usize),
+    (_, _, _): (usize, (), usize),
+) -> Command
+{
+    Command::Push(__0.unwrap_or(1))
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action32<
+    'input,
+>(
+    input: &'input str,
+    (_, _, _): (usize, (), usize),
+    (_, _, _): (usize, &'input str, usize),
+    (_, __0, _): (usize, core::option::Option<usize>, usize),
+    (_, _, _): (usize, (), usize),
+) -> Command
+{
+    Command::Pop(__0.unwrap_or(1))
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action33<
+    'input,
+>(
+    input: &'input str,
+    (_, _, _): (usize, (), usize),
+    (_, _, _): (usize, &'input str, usize),
+    (_, sym, _): (usize, Symbol, usize),
+    (_, n, _): (usize, core::option::Option<usize>, usize),
+    (_, _, _): (usize, (), usize),
+) -> Command
+{
+    Command::PrintTable(sym, n.unwrap_or(10))
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action34<
+    'input,
+>(
+    input: &'input str,
+    (_, _, _): (usize, (), usize),
+    (_, _, _): (usize, &'input str, usize),
+    (_, sym, _): (usize, Symbol, usize),
+    (_, _, _): (usize, (), usize),
+) -> Command
+{
+    Command::PrintSize(sym)
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action35<
+    'input,
+>(
+    input: &'input str,
+    (_, _, _): (usize, (), usize),
+    (_, _, _): (usize, &'input str, usize),
+    (_, name, _): (usize, Symbol, usize),
+    (_, file, _): (usize, String, usize),
+    (_, _, _): (usize, (), usize),
+) -> Command
+{
+    Command::Input { name, file }
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action36<
+    'input,
+>(
+    input: &'input str,
+    (_, _, _): (usize, (), usize),
+    (_, _, _): (usize, &'input str, usize),
+    (_, file, _): (usize, String, usize),
+    (_, exprs, _): (usize, alloc::vec::Vec<Expr>, usize),
+    (_, _, _): (usize, (), usize),
+) -> Command
+{
+    Command::Output { file, exprs }
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action37<
+    'input,
+>(
+    input: &'input str,
+    (_, _, _): (usize, (), usize),
+    (_, _, _): (usize, &'input str, usize),
+    (_, __0, _): (usize, Command, usize),
+    (_, _, _): (usize, (), usize),
+) -> Command
+{
+    Command::Fail(Box::new(__0))
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action38<
+    'input,
+>(
+    input: &'input str,
+    (_, _, _): (usize, (), usize),
+    (_, _, _): (usize, &'input str, usize),
+    (_, file, _): (usize, String, usize),
+    (_, _, _): (usize, (), usize),
+) -> Command
+{
+    Command::Include(file)
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action39<
+    'input,
+>(
+    input: &'input str,
+    (_, _, _): (usize, (), usize),
+    (_, _, _): (usize, &'input str, usize),
+    (_, __0, _): (usize, alloc::vec::Vec<Schedule>, usize),
+    (_, _, _): (usize, (), usize),
+) -> Schedule
+{
+    Schedule::Saturate(Box::new(Schedule::Sequence(__0)))
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action40<
+    'input,
+>(
+    input: &'input str,
+    (_, _, _): (usize, (), usize),
+    (_, _, _): (usize, &'input str, usize),
+    (_, __0, _): (usize, alloc::vec::Vec<Schedule>, usize),
+    (_, _, _): (usize, (), usize),
+) -> Schedule
+{
+    Schedule::Sequence(__0)
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action41<
+    'input,
+>(
+    input: &'input str,
+    (_, _, _): (usize, (), usize),
+    (_, _, _): (usize, &'input str, usize),
+    (_, limit, _): (usize, usize, usize),
+    (_, scheds, _): (usize, alloc::vec::Vec<Schedule>, usize),
+    (_, _, _): (usize, (), usize),
+) -> Schedule
+{
+    Schedule::Repeat(limit, Box::new(Schedule::Sequence(scheds)))
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action42<
+    'input,
+>(
+    input: &'input str,
+    (_, _, _): (usize, (), usize),
+    (_, _, _): (usize, &'input str, usize),
+    (_, until, _): (usize, core::option::Option<alloc::vec::Vec<Fact>>, usize),
+    (_, _, _): (usize, (), usize),
+) -> Schedule
+{
+    Schedule::Run(RunConfig { ruleset: "".into(), until })
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action43<
+    'input,
+>(
+    input: &'input str,
+    (_, _, _): (usize, (), usize),
+    (_, _, _): (usize, &'input str, usize),
+    (_, ruleset, _): (usize, Symbol, usize),
+    (_, until, _): (usize, core::option::Option<alloc::vec::Vec<Fact>>, usize),
+    (_, _, _): (usize, (), usize),
+) -> Schedule
+{
+    Schedule::Run(RunConfig { ruleset, until })
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action44<
+    'input,
+>(
+    input: &'input str,
+    (_, ident, _): (usize, Symbol, usize),
+) -> Schedule
+{
+    Schedule::Run(RunConfig { ruleset: ident, until: None })
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action45<
+    'input,
+>(
+    input: &'input str,
+    (_, _, _): (usize, &'input str, usize),
+    (_, __0, _): (usize, usize, usize),
+) -> Option<usize>
+{
+    Some(__0)
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action46<
+    'input,
+>(
+    input: &'input str,
+    __lookbehind: &usize,
+    __lookahead: &usize,
+) -> Option<usize>
+{
+    None
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action47<
+    'input,
+>(
+    input: &'input str,
+    (_, _, _): (usize, (), usize),
+    (_, _, _): (usize, &'input str, usize),
+    (_, _, _): (usize, (), usize),
+    (_, f, _): (usize, Symbol, usize),
+    (_, args, _): (usize, alloc::vec::Vec<Expr>, usize),
+    (_, _, _): (usize, (), usize),
+    (_, v, _): (usize, Expr, usize),
+    (_, _, _): (usize, (), usize),
+) -> Action
+{
+    Action::Set ( f, args, v )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action48<
+    'input,
+>(
+    input: &'input str,
+    (_, _, _): (usize, (), usize),
+    (_, _, _): (usize, &'input str, usize),
+    (_, _, _): (usize, (), usize),
+    (_, f, _): (usize, Symbol, usize),
+    (_, args, _): (usize, alloc::vec::Vec<Expr>, usize),
+    (_, _, _): (usize, (), usize),
+    (_, _, _): (usize, (), usize),
+) -> Action
+{
+    Action::Delete ( f, args)
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action49<
+    'input,
+>(
+    input: &'input str,
+    (_, _, _): (usize, (), usize),
+    (_, _, _): (usize, &'input str, usize),
+    (_, e1, _): (usize, Expr, usize),
+    (_, e2, _): (usize, Expr, usize),
+    (_, _, _): (usize, (), usize),
+) -> Action
+{
+    Action::Union(e1, e2)
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action50<
+    'input,
+>(
+    input: &'input str,
+    (_, _, _): (usize, (), usize),
+    (_, _, _): (usize, &'input str, usize),
+    (_, msg, _): (usize, String, usize),
+    (_, _, _): (usize, (), usize),
+) -> Action
+{
+    Action::Panic(msg)
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action51<
+    'input,
+>(
+    input: &'input str,
+    (_, _, _): (usize, (), usize),
+    (_, _, _): (usize, &'input str, usize),
+    (_, expr, _): (usize, Expr, usize),
+    (_, _, _): (usize, (), usize),
+) -> Action
+{
+    Action::Extract(expr, Expr::Lit(Literal::Int(0)))
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action52<
+    'input,
+>(
+    input: &'input str,
+    (_, _, _): (usize, (), usize),
+    (_, _, _): (usize, &'input str, usize),
+    (_, expr, _): (usize, Expr, usize),
+    (_, variants, _): (usize, Expr, usize),
+    (_, _, _): (usize, (), usize),
+) -> Action
+{
+    Action::Extract(expr, variants)
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action53<
+    'input,
+>(
+    input: &'input str,
+    (_, e, _): (usize, Expr, usize),
+) -> Action
+{
+    Action::Expr(e)
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action54<
+    'input,
+>(
+    input: &'input str,
+    (_, _, _): (usize, (), usize),
+    (_, _, _): (usize, &'input str, usize),
+    (_, name, _): (usize, Symbol, usize),
+    (_, expr, _): (usize, Expr, usize),
+    (_, _, _): (usize, (), usize),
+) -> Action
+{
+    Action::Let(name, expr)
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action55<
+    'input,
+>(
+    input: &'input str,
+    (_, __0, _): (usize, Action, usize),
+) -> Action
+{
+    __0
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action56<
+    'input,
+>(
+    input: &'input str,
+    (_, _, _): (usize, &'input str, usize),
+    (_, __0, _): (usize, Symbol, usize),
+    (_, _, _): (usize, &'input str, usize),
+) -> Symbol
+{
+    __0
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action57<
+    'input,
+>(
+    input: &'input str,
+    (_, _, _): (usize, (), usize),
+    (_, _, _): (usize, &'input str, usize),
+    (_, mut es, _): (usize, alloc::vec::Vec<Expr>, usize),
+    (_, e, _): (usize, Expr, usize),
+    (_, _, _): (usize, (), usize),
+) -> Fact
+{
+    {
+        es.push(e);
+        Fact::Eq(es)
+    }
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action58<
+    'input,
+>(
+    input: &'input str,
+    (_, __0, _): (usize, Expr, usize),
+) -> Fact
+{
+    Fact::Fact(__0)
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action59<
+    'input,
+>(
+    input: &'input str,
+    (_, types, _): (usize, Vec<Symbol>, usize),
+    (_, output, _): (usize, Symbol, usize),
+) -> Schema
+{
+    Schema { input: types, output }
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action60<
+    'input,
+>(
+    input: &'input str,
+    (_, __0, _): (usize, Literal, usize),
+) -> Expr
+{
+    Expr::Lit(__0)
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action61<
+    'input,
+>(
+    input: &'input str,
+    (_, __0, _): (usize, Symbol, usize),
+) -> Expr
+{
+    Expr::Var(__0)
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action62<
+    'input,
+>(
+    input: &'input str,
+    (_, __0, _): (usize, Expr, usize),
+) -> Expr
+{
+    __0
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action63<
+    'input,
+>(
+    input: &'input str,
+    (_, __0, _): (usize, i64, usize),
+) -> Literal
+{
+    Literal::Int(__0)
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action64<
+    'input,
+>(
+    input: &'input str,
+    (_, __0, _): (usize, OrderedFloat<f64>, usize),
+) -> Literal
+{
+    Literal::F64(__0)
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action65<
+    'input,
+>(
+    input: &'input str,
+    (_, __0, _): (usize, Symbol, usize),
+) -> Literal
+{
+    Literal::String(__0)
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action66<
+    'input,
+>(
+    input: &'input str,
+    (_, _, _): (usize, (), usize),
+    (_, head, _): (usize, Symbol, usize),
+    (_, tail, _): (usize, alloc::vec::Vec<Expr>, usize),
+    (_, _, _): (usize, (), usize),
+) -> Expr
+{
+    Expr::Call(head, tail)
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action67<
+    'input,
+>(
+    input: &'input str,
+    (_, _, _): (usize, (), usize),
+    (_, sexps, _): (usize, alloc::vec::Vec<Expr>, usize),
+    (_, _, _): (usize, (), usize),
+) -> Vec<Expr>
+{
+    sexps
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action68<
+    'input,
+>(
+    input: &'input str,
+    (_, _, _): (usize, (), usize),
+    (_, name, _): (usize, Symbol, usize),
+    (_, types, _): (usize, alloc::vec::Vec<Symbol>, usize),
+    (_, cost, _): (usize, Option<usize>, usize),
+    (_, _, _): (usize, (), usize),
+) -> Variant
+{
+    Variant { name, types, cost }
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action69<
+    'input,
+>(
+    input: &'input str,
+    (_, __0, _): (usize, Symbol, usize),
+) -> Symbol
+{
+    __0
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action70<
+    'input,
+>(
+    input: &'input str,
+    (_, _, _): (usize, (), usize),
+    (_, ident, _): (usize, Symbol, usize),
+    (_, sort, _): (usize, Symbol, usize),
+    (_, _, _): (usize, (), usize),
+) -> IdentSort
+{
+    IdentSort { ident, sort }
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action71<
+    'input,
+>(
+    input: &'input str,
+    (_, s, _): (usize, &'input str, usize),
+) -> i64
+{
+    s.parse().unwrap()
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action72<
+    'input,
+>(
+    input: &'input str,
+    (_, __0, _): (usize, i64, usize),
+) -> usize
+{
+    __0.try_into().unwrap()
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action73<
+    'input,
+>(
+    input: &'input str,
+    (_, __0, _): (usize, &'input str, usize),
+) -> OrderedFloat<f64>
+{
+    OrderedFloat::<f64>(f64::NAN)
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action74<
+    'input,
+>(
+    input: &'input str,
+    (_, s, _): (usize, &'input str, usize),
+) -> OrderedFloat<f64>
+{
+    OrderedFloat::<f64>(s.parse().unwrap())
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action75<
+    'input,
+>(
+    input: &'input str,
+    (_, __0, _): (usize, &'input str, usize),
+) -> OrderedFloat<f64>
+{
+    OrderedFloat::<f64>(f64::INFINITY)
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action76<
+    'input,
+>(
+    input: &'input str,
+    (_, __0, _): (usize, &'input str, usize),
+) -> OrderedFloat<f64>
+{
+    OrderedFloat::<f64>(f64::NEG_INFINITY)
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action77<
+    'input,
+>(
+    input: &'input str,
+    (_, s, _): (usize, &'input str, usize),
+) -> Symbol
+{
+    s.parse().unwrap()
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action78<
+    'input,
+>(
+    input: &'input str,
+    (_, __0, _): (usize, String, usize),
+) -> Symbol
+{
+    Symbol::from(__0)
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action79<
+    'input,
+>(
+    input: &'input str,
+    (_, __0, _): (usize, &'input str, usize),
+) -> String
+{
+    {
+    let string: &str = __0;
+    let first_last_off: &str = &string[1..string.len() - 1];
+    first_last_off.replace("\"\"", "\"")
+}
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action80<
+    'input,
+>(
+    input: &'input str,
+    __lookbehind: &usize,
+    __lookahead: &usize,
+) -> alloc::vec::Vec<Symbol>
+{
+    alloc::vec![]
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action81<
+    'input,
+>(
+    input: &'input str,
+    (_, v, _): (usize, alloc::vec::Vec<Symbol>, usize),
+) -> alloc::vec::Vec<Symbol>
+{
+    v
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action82<
+    'input,
+>(
+    input: &'input str,
+    (_, __0, _): (usize, Symbol, usize),
+) -> Symbol
+{
+    __0
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action83<
+    'input,
+>(
+    input: &'input str,
+    __lookbehind: &usize,
+    __lookahead: &usize,
+) -> alloc::vec::Vec<Expr>
+{
+    alloc::vec![]
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action84<
+    'input,
+>(
+    input: &'input str,
+    (_, v, _): (usize, alloc::vec::Vec<Expr>, usize),
+) -> alloc::vec::Vec<Expr>
+{
+    v
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action85<
+    'input,
+>(
+    input: &'input str,
+    (_, __0, _): (usize, usize, usize),
+) -> core::option::Option<usize>
+{
+    Some(__0)
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action86<
+    'input,
+>(
+    input: &'input str,
+    __lookbehind: &usize,
+    __lookahead: &usize,
+) -> core::option::Option<usize>
+{
+    None
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action87<
+    'input,
+>(
+    input: &'input str,
+    __lookbehind: &usize,
+    __lookahead: &usize,
+) -> alloc::vec::Vec<Schedule>
+{
+    alloc::vec![]
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action88<
+    'input,
+>(
+    input: &'input str,
+    (_, v, _): (usize, alloc::vec::Vec<Schedule>, usize),
+) -> alloc::vec::Vec<Schedule>
+{
+    v
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action89<
+    'input,
+>(
+    input: &'input str,
+    (_, __0, _): (usize, usize, usize),
+) -> core::option::Option<usize>
+{
+    Some(__0)
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action90<
+    'input,
+>(
+    input: &'input str,
+    __lookbehind: &usize,
+    __lookahead: &usize,
+) -> core::option::Option<usize>
+{
+    None
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action91<
+    'input,
+>(
+    input: &'input str,
+    (_, _, _): (usize, &'input str, usize),
+    (_, __0, _): (usize, usize, usize),
+) -> usize
+{
+    __0
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action92<
+    'input,
+>(
+    input: &'input str,
+    (_, __0, _): (usize, Expr, usize),
+) -> alloc::vec::Vec<Expr>
+{
+    alloc::vec![__0]
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action93<
+    'input,
+>(
+    input: &'input str,
+    (_, v, _): (usize, alloc::vec::Vec<Expr>, usize),
+    (_, e, _): (usize, Expr, usize),
+) -> alloc::vec::Vec<Expr>
+{
+    { let mut v = v; v.push(e); v }
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action94<
+    'input,
+>(
+    input: &'input str,
+    __lookbehind: &usize,
+    __lookahead: &usize,
+) -> alloc::vec::Vec<IdentSort>
+{
+    alloc::vec![]
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action95<
+    'input,
+>(
+    input: &'input str,
+    (_, v, _): (usize, alloc::vec::Vec<IdentSort>, usize),
+) -> alloc::vec::Vec<IdentSort>
+{
+    v
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action96<
+    'input,
+>(
+    input: &'input str,
+    (_, __0, _): (usize, alloc::vec::Vec<Fact>, usize),
+) -> core::option::Option<alloc::vec::Vec<Fact>>
+{
+    Some(__0)
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action97<
+    'input,
+>(
+    input: &'input str,
+    __lookbehind: &usize,
+    __lookahead: &usize,
+) -> core::option::Option<alloc::vec::Vec<Fact>>
+{
+    None
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action98<
+    'input,
+>(
+    input: &'input str,
+    (_, _, _): (usize, &'input str, usize),
+    (_, __0, _): (usize, alloc::vec::Vec<Fact>, usize),
+) -> alloc::vec::Vec<Fact>
+{
+    __0
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action99<
+    'input,
+>(
+    input: &'input str,
+    __lookbehind: &usize,
+    __lookahead: &usize,
+) -> alloc::vec::Vec<Fact>
+{
+    alloc::vec![]
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action100<
+    'input,
+>(
+    input: &'input str,
+    (_, v, _): (usize, alloc::vec::Vec<Fact>, usize),
+) -> alloc::vec::Vec<Fact>
+{
+    v
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action101<
+    'input,
+>(
+    input: &'input str,
+    (_, __0, _): (usize, Fact, usize),
+) -> Fact
+{
+    __0
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action102<
+    'input,
+>(
+    input: &'input str,
+    (_, __0, _): (usize, Vec<Fact>, usize),
+) -> core::option::Option<Vec<Fact>>
+{
+    Some(__0)
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action103<
+    'input,
+>(
+    input: &'input str,
+    __lookbehind: &usize,
+    __lookahead: &usize,
+) -> core::option::Option<Vec<Fact>>
+{
+    None
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action104<
+    'input,
+>(
+    input: &'input str,
+    (_, _, _): (usize, &'input str, usize),
+    (_, __0, _): (usize, Vec<Fact>, usize),
+) -> Vec<Fact>
+{
+    __0
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action105<
+    'input,
+>(
+    input: &'input str,
+    (_, __0, _): (usize, String, usize),
+) -> core::option::Option<String>
+{
+    Some(__0)
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action106<
+    'input,
+>(
+    input: &'input str,
+    __lookbehind: &usize,
+    __lookahead: &usize,
+) -> core::option::Option<String>
+{
+    None
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action107<
+    'input,
+>(
+    input: &'input str,
+    (_, _, _): (usize, &'input str, usize),
+    (_, __0, _): (usize, String, usize),
+) -> String
+{
+    __0
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action108<
+    'input,
+>(
+    input: &'input str,
+    (_, __0, _): (usize, Symbol, usize),
+) -> core::option::Option<Symbol>
+{
+    Some(__0)
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action109<
+    'input,
+>(
+    input: &'input str,
+    __lookbehind: &usize,
+    __lookahead: &usize,
+) -> core::option::Option<Symbol>
+{
+    None
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action110<
+    'input,
+>(
+    input: &'input str,
+    (_, _, _): (usize, &'input str, usize),
+    (_, __0, _): (usize, Symbol, usize),
+) -> Symbol
+{
+    __0
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action111<
+    'input,
+>(
+    input: &'input str,
+    (_, _, _): (usize, (), usize),
+    (_, __0, _): (usize, alloc::vec::Vec<Fact>, usize),
+    (_, _, _): (usize, (), usize),
+) -> Vec<Fact>
+{
+    __0
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action112<
+    'input,
+>(
+    input: &'input str,
+    (_, _, _): (usize, (), usize),
+    (_, __0, _): (usize, alloc::vec::Vec<Symbol>, usize),
+    (_, _, _): (usize, (), usize),
+) -> Vec<Symbol>
+{
+    __0
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action113<
+    'input,
+>(
+    input: &'input str,
+    (_, __0, _): (usize, Expr, usize),
+) -> core::option::Option<Expr>
+{
+    Some(__0)
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action114<
+    'input,
+>(
+    input: &'input str,
+    __lookbehind: &usize,
+    __lookahead: &usize,
+) -> core::option::Option<Expr>
+{
+    None
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action115<
+    'input,
+>(
+    input: &'input str,
+    (_, _, _): (usize, &'input str, usize),
+    (_, __0, _): (usize, Expr, usize),
+) -> Expr
+{
+    __0
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action116<
+    'input,
+>(
+    input: &'input str,
+    (_, __0, _): (usize, Expr, usize),
+) -> core::option::Option<Expr>
+{
+    Some(__0)
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action117<
+    'input,
+>(
+    input: &'input str,
+    __lookbehind: &usize,
+    __lookahead: &usize,
+) -> core::option::Option<Expr>
+{
+    None
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action118<
+    'input,
+>(
+    input: &'input str,
+    (_, _, _): (usize, &'input str, usize),
+    (_, __0, _): (usize, Expr, usize),
+) -> Expr
+{
+    __0
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action119<
+    'input,
+>(
+    input: &'input str,
+    (_, __0, _): (usize, Vec<Action>, usize),
+) -> core::option::Option<Vec<Action>>
+{
+    Some(__0)
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action120<
+    'input,
+>(
+    input: &'input str,
+    __lookbehind: &usize,
+    __lookahead: &usize,
+) -> core::option::Option<Vec<Action>>
+{
+    None
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action121<
+    'input,
+>(
+    input: &'input str,
+    (_, _, _): (usize, &'input str, usize),
+    (_, __0, _): (usize, Vec<Action>, usize),
+) -> Vec<Action>
+{
+    __0
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action122<
+    'input,
+>(
+    input: &'input str,
+    (_, _, _): (usize, (), usize),
+    (_, __0, _): (usize, alloc::vec::Vec<Action>, usize),
+    (_, _, _): (usize, (), usize),
+) -> Vec<Action>
+{
+    __0
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action123<
+    'input,
+>(
+    input: &'input str,
+    (_, __0, _): (usize, &'input str, usize),
+) -> core::option::Option<&'input str>
+{
+    Some(__0)
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action124<
+    'input,
+>(
+    input: &'input str,
+    __lookbehind: &usize,
+    __lookahead: &usize,
+) -> core::option::Option<&'input str>
+{
+    None
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action125<
+    'input,
+>(
+    input: &'input str,
+    (_, __0, _): (usize, &'input str, usize),
+) -> &'input str
+{
+    __0
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action126<
+    'input,
+>(
+    input: &'input str,
+    __lookbehind: &usize,
+    __lookahead: &usize,
+) -> alloc::vec::Vec<Expr>
+{
+    alloc::vec![]
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action127<
+    'input,
+>(
+    input: &'input str,
+    (_, v, _): (usize, alloc::vec::Vec<Expr>, usize),
+) -> alloc::vec::Vec<Expr>
+{
+    v
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action128<
+    'input,
+>(
+    input: &'input str,
+    (_, __0, _): (usize, Expr, usize),
+) -> Expr
+{
+    __0
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action129<
+    'input,
+>(
+    input: &'input str,
+    __lookbehind: &usize,
+    __lookahead: &usize,
+) -> alloc::vec::Vec<Variant>
+{
+    alloc::vec![]
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action130<
+    'input,
+>(
+    input: &'input str,
+    (_, v, _): (usize, alloc::vec::Vec<Variant>, usize),
+) -> alloc::vec::Vec<Variant>
+{
+    v
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action131<
+    'input,
+>(
+    input: &'input str,
+    (_, __0, _): (usize, Variant, usize),
+) -> Variant
+{
+    __0
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action132<
+    'input,
+>(
+    input: &'input str,
+    __lookbehind: &usize,
+    __lookahead: &usize,
+) -> alloc::vec::Vec<Command>
+{
+    alloc::vec![]
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action133<
+    'input,
+>(
+    input: &'input str,
+    (_, v, _): (usize, alloc::vec::Vec<Command>, usize),
+) -> alloc::vec::Vec<Command>
+{
+    v
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action134<
+    'input,
+>(
+    input: &'input str,
+    (_, __0, _): (usize, Command, usize),
+) -> Command
+{
+    __0
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action135<
+    'input,
+>(
+    input: &'input str,
+    (_, __0, _): (usize, Command, usize),
+) -> alloc::vec::Vec<Command>
+{
+    alloc::vec![__0]
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action136<
+    'input,
+>(
+    input: &'input str,
+    (_, v, _): (usize, alloc::vec::Vec<Command>, usize),
+    (_, e, _): (usize, Command, usize),
+) -> alloc::vec::Vec<Command>
+{
+    { let mut v = v; v.push(e); v }
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action137<
+    'input,
+>(
+    input: &'input str,
+    (_, __0, _): (usize, Variant, usize),
+) -> alloc::vec::Vec<Variant>
+{
+    alloc::vec![__0]
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action138<
+    'input,
+>(
+    input: &'input str,
+    (_, v, _): (usize, alloc::vec::Vec<Variant>, usize),
+    (_, e, _): (usize, Variant, usize),
+) -> alloc::vec::Vec<Variant>
+{
+    { let mut v = v; v.push(e); v }
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action139<
+    'input,
+>(
+    input: &'input str,
+    (_, __0, _): (usize, Expr, usize),
+) -> alloc::vec::Vec<Expr>
+{
+    alloc::vec![__0]
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action140<
+    'input,
+>(
+    input: &'input str,
+    (_, v, _): (usize, alloc::vec::Vec<Expr>, usize),
+    (_, e, _): (usize, Expr, usize),
+) -> alloc::vec::Vec<Expr>
+{
+    { let mut v = v; v.push(e); v }
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action141<
+    'input,
+>(
+    input: &'input str,
+    __lookbehind: &usize,
+    __lookahead: &usize,
+) -> alloc::vec::Vec<Action>
+{
+    alloc::vec![]
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action142<
+    'input,
+>(
+    input: &'input str,
+    (_, v, _): (usize, alloc::vec::Vec<Action>, usize),
+) -> alloc::vec::Vec<Action>
+{
+    v
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action143<
+    'input,
+>(
+    input: &'input str,
+    __lookbehind: &usize,
+    __lookahead: &usize,
+) -> alloc::vec::Vec<Symbol>
+{
+    alloc::vec![]
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action144<
+    'input,
+>(
+    input: &'input str,
+    (_, v, _): (usize, alloc::vec::Vec<Symbol>, usize),
+) -> alloc::vec::Vec<Symbol>
+{
+    v
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action145<
+    'input,
+>(
+    input: &'input str,
+    __lookbehind: &usize,
+    __lookahead: &usize,
+) -> alloc::vec::Vec<Fact>
+{
+    alloc::vec![]
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action146<
+    'input,
+>(
+    input: &'input str,
+    (_, v, _): (usize, alloc::vec::Vec<Fact>, usize),
+) -> alloc::vec::Vec<Fact>
+{
+    v
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action147<
+    'input,
+>(
+    input: &'input str,
+    (_, __0, _): (usize, Fact, usize),
+) -> alloc::vec::Vec<Fact>
+{
+    alloc::vec![__0]
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action148<
+    'input,
+>(
+    input: &'input str,
+    (_, v, _): (usize, alloc::vec::Vec<Fact>, usize),
+    (_, e, _): (usize, Fact, usize),
+) -> alloc::vec::Vec<Fact>
+{
+    { let mut v = v; v.push(e); v }
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action149<
+    'input,
+>(
+    input: &'input str,
+    (_, __0, _): (usize, IdentSort, usize),
+) -> alloc::vec::Vec<IdentSort>
+{
+    alloc::vec![__0]
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action150<
+    'input,
+>(
+    input: &'input str,
+    (_, v, _): (usize, alloc::vec::Vec<IdentSort>, usize),
+    (_, e, _): (usize, IdentSort, usize),
+) -> alloc::vec::Vec<IdentSort>
+{
+    { let mut v = v; v.push(e); v }
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action151<
+    'input,
+>(
+    input: &'input str,
+    (_, __0, _): (usize, Schedule, usize),
+) -> alloc::vec::Vec<Schedule>
+{
+    alloc::vec![__0]
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action152<
+    'input,
+>(
+    input: &'input str,
+    (_, v, _): (usize, alloc::vec::Vec<Schedule>, usize),
+    (_, e, _): (usize, Schedule, usize),
+) -> alloc::vec::Vec<Schedule>
+{
+    { let mut v = v; v.push(e); v }
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action153<
+    'input,
+>(
+    input: &'input str,
+    (_, __0, _): (usize, Symbol, usize),
+) -> alloc::vec::Vec<Symbol>
+{
+    alloc::vec![__0]
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action154<
+    'input,
+>(
+    input: &'input str,
+    (_, v, _): (usize, alloc::vec::Vec<Symbol>, usize),
+    (_, e, _): (usize, Symbol, usize),
+) -> alloc::vec::Vec<Symbol>
+{
+    { let mut v = v; v.push(e); v }
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action155<
+    'input,
+>(
+    input: &'input str,
+    (_, __0, _): (usize, Fact, usize),
+) -> alloc::vec::Vec<Fact>
+{
+    alloc::vec![__0]
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action156<
+    'input,
+>(
+    input: &'input str,
+    (_, v, _): (usize, alloc::vec::Vec<Fact>, usize),
+    (_, e, _): (usize, Fact, usize),
+) -> alloc::vec::Vec<Fact>
+{
+    { let mut v = v; v.push(e); v }
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action157<
+    'input,
+>(
+    input: &'input str,
+    (_, __0, _): (usize, Symbol, usize),
+) -> alloc::vec::Vec<Symbol>
+{
+    alloc::vec![__0]
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action158<
+    'input,
+>(
+    input: &'input str,
+    (_, v, _): (usize, alloc::vec::Vec<Symbol>, usize),
+    (_, e, _): (usize, Symbol, usize),
+) -> alloc::vec::Vec<Symbol>
+{
+    { let mut v = v; v.push(e); v }
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action159<
+    'input,
+>(
+    input: &'input str,
+    (_, __0, _): (usize, Action, usize),
+) -> alloc::vec::Vec<Action>
+{
+    alloc::vec![__0]
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action160<
+    'input,
+>(
+    input: &'input str,
+    (_, v, _): (usize, alloc::vec::Vec<Action>, usize),
+    (_, e, _): (usize, Action, usize),
+) -> alloc::vec::Vec<Action>
+{
+    { let mut v = v; v.push(e); v }
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action161<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, &'input str, usize),
+    __1: (usize, Expr, usize),
+) -> core::option::Option<Expr>
+{
+    let __start0 = __0.0;
+    let __end0 = __1.2;
+    let __temp0 = __action115(
+        input,
+        __0,
+        __1,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action113(
+        input,
+        __temp0,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action162<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, Symbol, usize),
+    __3: (usize, Schema, usize),
+    __4: (usize, Option<usize>, usize),
+    __5: (usize, core::option::Option<&'input str>, usize),
+    __6: (usize, core::option::Option<Vec<Action>>, usize),
+    __7: (usize, core::option::Option<Expr>, usize),
+    __8: (usize, &'input str, usize),
+    __9: (usize, Expr, usize),
+    __10: (usize, (), usize),
+) -> Command
+{
+    let __start0 = __8.0;
+    let __end0 = __9.2;
+    let __temp0 = __action161(
+        input,
+        __8,
+        __9,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action13(
+        input,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __5,
+        __6,
+        __7,
+        __temp0,
+        __10,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action163<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, Symbol, usize),
+    __3: (usize, Schema, usize),
+    __4: (usize, Option<usize>, usize),
+    __5: (usize, core::option::Option<&'input str>, usize),
+    __6: (usize, core::option::Option<Vec<Action>>, usize),
+    __7: (usize, core::option::Option<Expr>, usize),
+    __8: (usize, (), usize),
+) -> Command
+{
+    let __start0 = __7.2;
+    let __end0 = __8.0;
+    let __temp0 = __action114(
+        input,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action13(
+        input,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __5,
+        __6,
+        __7,
+        __temp0,
+        __8,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action164<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, &'input str, usize),
+    __1: (usize, Expr, usize),
+) -> core::option::Option<Expr>
+{
+    let __start0 = __0.0;
+    let __end0 = __1.2;
+    let __temp0 = __action118(
+        input,
+        __0,
+        __1,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action116(
+        input,
+        __temp0,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action165<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, Symbol, usize),
+    __3: (usize, Schema, usize),
+    __4: (usize, Option<usize>, usize),
+    __5: (usize, core::option::Option<&'input str>, usize),
+    __6: (usize, core::option::Option<Vec<Action>>, usize),
+    __7: (usize, &'input str, usize),
+    __8: (usize, Expr, usize),
+    __9: (usize, &'input str, usize),
+    __10: (usize, Expr, usize),
+    __11: (usize, (), usize),
+) -> Command
+{
+    let __start0 = __7.0;
+    let __end0 = __8.2;
+    let __temp0 = __action164(
+        input,
+        __7,
+        __8,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action162(
+        input,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __5,
+        __6,
+        __temp0,
+        __9,
+        __10,
+        __11,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action166<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, Symbol, usize),
+    __3: (usize, Schema, usize),
+    __4: (usize, Option<usize>, usize),
+    __5: (usize, core::option::Option<&'input str>, usize),
+    __6: (usize, core::option::Option<Vec<Action>>, usize),
+    __7: (usize, &'input str, usize),
+    __8: (usize, Expr, usize),
+    __9: (usize, (), usize),
+) -> Command
+{
+    let __start0 = __6.2;
+    let __end0 = __7.0;
+    let __temp0 = __action117(
+        input,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action162(
+        input,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __5,
+        __6,
+        __temp0,
+        __7,
+        __8,
+        __9,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action167<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, Symbol, usize),
+    __3: (usize, Schema, usize),
+    __4: (usize, Option<usize>, usize),
+    __5: (usize, core::option::Option<&'input str>, usize),
+    __6: (usize, core::option::Option<Vec<Action>>, usize),
+    __7: (usize, &'input str, usize),
+    __8: (usize, Expr, usize),
+    __9: (usize, (), usize),
+) -> Command
+{
+    let __start0 = __7.0;
+    let __end0 = __8.2;
+    let __temp0 = __action164(
+        input,
+        __7,
+        __8,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action163(
+        input,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __5,
+        __6,
+        __temp0,
+        __9,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action168<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, Symbol, usize),
+    __3: (usize, Schema, usize),
+    __4: (usize, Option<usize>, usize),
+    __5: (usize, core::option::Option<&'input str>, usize),
+    __6: (usize, core::option::Option<Vec<Action>>, usize),
+    __7: (usize, (), usize),
+) -> Command
+{
+    let __start0 = __6.2;
+    let __end0 = __7.0;
+    let __temp0 = __action117(
+        input,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action163(
+        input,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __5,
+        __6,
+        __temp0,
+        __7,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action169<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, &'input str, usize),
+    __1: (usize, String, usize),
+) -> core::option::Option<String>
+{
+    let __start0 = __0.0;
+    let __end0 = __1.2;
+    let __temp0 = __action107(
+        input,
+        __0,
+        __1,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action105(
+        input,
+        __temp0,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action170<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, Vec<Fact>, usize),
+    __3: (usize, Vec<Action>, usize),
+    __4: (usize, core::option::Option<Symbol>, usize),
+    __5: (usize, &'input str, usize),
+    __6: (usize, String, usize),
+    __7: (usize, (), usize),
+) -> Command
+{
+    let __start0 = __5.0;
+    let __end0 = __6.2;
+    let __temp0 = __action169(
+        input,
+        __5,
+        __6,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action17(
+        input,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __temp0,
+        __7,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action171<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, Vec<Fact>, usize),
+    __3: (usize, Vec<Action>, usize),
+    __4: (usize, core::option::Option<Symbol>, usize),
+    __5: (usize, (), usize),
+) -> Command
+{
+    let __start0 = __4.2;
+    let __end0 = __5.0;
+    let __temp0 = __action106(
+        input,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action17(
+        input,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __temp0,
+        __5,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action172<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, &'input str, usize),
+    __1: (usize, Vec<Action>, usize),
+) -> core::option::Option<Vec<Action>>
+{
+    let __start0 = __0.0;
+    let __end0 = __1.2;
+    let __temp0 = __action121(
+        input,
+        __0,
+        __1,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action119(
+        input,
+        __temp0,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action173<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, Symbol, usize),
+    __3: (usize, Schema, usize),
+    __4: (usize, Option<usize>, usize),
+    __5: (usize, core::option::Option<&'input str>, usize),
+    __6: (usize, &'input str, usize),
+    __7: (usize, Vec<Action>, usize),
+    __8: (usize, &'input str, usize),
+    __9: (usize, Expr, usize),
+    __10: (usize, &'input str, usize),
+    __11: (usize, Expr, usize),
+    __12: (usize, (), usize),
+) -> Command
+{
+    let __start0 = __6.0;
+    let __end0 = __7.2;
+    let __temp0 = __action172(
+        input,
+        __6,
+        __7,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action165(
+        input,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __5,
+        __temp0,
+        __8,
+        __9,
+        __10,
+        __11,
+        __12,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action174<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, Symbol, usize),
+    __3: (usize, Schema, usize),
+    __4: (usize, Option<usize>, usize),
+    __5: (usize, core::option::Option<&'input str>, usize),
+    __6: (usize, &'input str, usize),
+    __7: (usize, Expr, usize),
+    __8: (usize, &'input str, usize),
+    __9: (usize, Expr, usize),
+    __10: (usize, (), usize),
+) -> Command
+{
+    let __start0 = __5.2;
+    let __end0 = __6.0;
+    let __temp0 = __action120(
+        input,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action165(
+        input,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __5,
+        __temp0,
+        __6,
+        __7,
+        __8,
+        __9,
+        __10,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action175<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, Symbol, usize),
+    __3: (usize, Schema, usize),
+    __4: (usize, Option<usize>, usize),
+    __5: (usize, core::option::Option<&'input str>, usize),
+    __6: (usize, &'input str, usize),
+    __7: (usize, Vec<Action>, usize),
+    __8: (usize, &'input str, usize),
+    __9: (usize, Expr, usize),
+    __10: (usize, (), usize),
+) -> Command
+{
+    let __start0 = __6.0;
+    let __end0 = __7.2;
+    let __temp0 = __action172(
+        input,
+        __6,
+        __7,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action166(
+        input,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __5,
+        __temp0,
+        __8,
+        __9,
+        __10,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action176<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, Symbol, usize),
+    __3: (usize, Schema, usize),
+    __4: (usize, Option<usize>, usize),
+    __5: (usize, core::option::Option<&'input str>, usize),
+    __6: (usize, &'input str, usize),
+    __7: (usize, Expr, usize),
+    __8: (usize, (), usize),
+) -> Command
+{
+    let __start0 = __5.2;
+    let __end0 = __6.0;
+    let __temp0 = __action120(
+        input,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action166(
+        input,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __5,
+        __temp0,
+        __6,
+        __7,
+        __8,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action177<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, Symbol, usize),
+    __3: (usize, Schema, usize),
+    __4: (usize, Option<usize>, usize),
+    __5: (usize, core::option::Option<&'input str>, usize),
+    __6: (usize, &'input str, usize),
+    __7: (usize, Vec<Action>, usize),
+    __8: (usize, &'input str, usize),
+    __9: (usize, Expr, usize),
+    __10: (usize, (), usize),
+) -> Command
+{
+    let __start0 = __6.0;
+    let __end0 = __7.2;
+    let __temp0 = __action172(
+        input,
+        __6,
+        __7,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action167(
+        input,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __5,
+        __temp0,
+        __8,
+        __9,
+        __10,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action178<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, Symbol, usize),
+    __3: (usize, Schema, usize),
+    __4: (usize, Option<usize>, usize),
+    __5: (usize, core::option::Option<&'input str>, usize),
+    __6: (usize, &'input str, usize),
+    __7: (usize, Expr, usize),
+    __8: (usize, (), usize),
+) -> Command
+{
+    let __start0 = __5.2;
+    let __end0 = __6.0;
+    let __temp0 = __action120(
+        input,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action167(
+        input,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __5,
+        __temp0,
+        __6,
+        __7,
+        __8,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action179<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, Symbol, usize),
+    __3: (usize, Schema, usize),
+    __4: (usize, Option<usize>, usize),
+    __5: (usize, core::option::Option<&'input str>, usize),
+    __6: (usize, &'input str, usize),
+    __7: (usize, Vec<Action>, usize),
+    __8: (usize, (), usize),
+) -> Command
+{
+    let __start0 = __6.0;
+    let __end0 = __7.2;
+    let __temp0 = __action172(
+        input,
+        __6,
+        __7,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action168(
+        input,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __5,
+        __temp0,
+        __8,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action180<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, Symbol, usize),
+    __3: (usize, Schema, usize),
+    __4: (usize, Option<usize>, usize),
+    __5: (usize, core::option::Option<&'input str>, usize),
+    __6: (usize, (), usize),
+) -> Command
+{
+    let __start0 = __5.2;
+    let __end0 = __6.0;
+    let __temp0 = __action120(
+        input,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action168(
+        input,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __5,
+        __temp0,
+        __6,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action181<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, &'input str, usize),
+    __1: (usize, Symbol, usize),
+) -> core::option::Option<Symbol>
+{
+    let __start0 = __0.0;
+    let __end0 = __1.2;
+    let __temp0 = __action110(
+        input,
+        __0,
+        __1,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action108(
+        input,
+        __temp0,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action182<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, Vec<Fact>, usize),
+    __3: (usize, Vec<Action>, usize),
+    __4: (usize, &'input str, usize),
+    __5: (usize, Symbol, usize),
+    __6: (usize, &'input str, usize),
+    __7: (usize, String, usize),
+    __8: (usize, (), usize),
+) -> Command
+{
+    let __start0 = __4.0;
+    let __end0 = __5.2;
+    let __temp0 = __action181(
+        input,
+        __4,
+        __5,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action170(
+        input,
+        __0,
+        __1,
+        __2,
+        __3,
+        __temp0,
+        __6,
+        __7,
+        __8,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action183<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, Vec<Fact>, usize),
+    __3: (usize, Vec<Action>, usize),
+    __4: (usize, &'input str, usize),
+    __5: (usize, String, usize),
+    __6: (usize, (), usize),
+) -> Command
+{
+    let __start0 = __3.2;
+    let __end0 = __4.0;
+    let __temp0 = __action109(
+        input,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action170(
+        input,
+        __0,
+        __1,
+        __2,
+        __3,
+        __temp0,
+        __4,
+        __5,
+        __6,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action184<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, Vec<Fact>, usize),
+    __3: (usize, Vec<Action>, usize),
+    __4: (usize, &'input str, usize),
+    __5: (usize, Symbol, usize),
+    __6: (usize, (), usize),
+) -> Command
+{
+    let __start0 = __4.0;
+    let __end0 = __5.2;
+    let __temp0 = __action181(
+        input,
+        __4,
+        __5,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action171(
+        input,
+        __0,
+        __1,
+        __2,
+        __3,
+        __temp0,
+        __6,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action185<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, Vec<Fact>, usize),
+    __3: (usize, Vec<Action>, usize),
+    __4: (usize, (), usize),
+) -> Command
+{
+    let __start0 = __3.2;
+    let __end0 = __4.0;
+    let __temp0 = __action109(
+        input,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action171(
+        input,
+        __0,
+        __1,
+        __2,
+        __3,
+        __temp0,
+        __4,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action186<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, Expr, usize),
+    __3: (usize, Expr, usize),
+    __4: (usize, core::option::Option<Vec<Fact>>, usize),
+    __5: (usize, &'input str, usize),
+    __6: (usize, Symbol, usize),
+    __7: (usize, (), usize),
+) -> Command
+{
+    let __start0 = __5.0;
+    let __end0 = __6.2;
+    let __temp0 = __action181(
+        input,
+        __5,
+        __6,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action18(
+        input,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __temp0,
+        __7,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action187<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, Expr, usize),
+    __3: (usize, Expr, usize),
+    __4: (usize, core::option::Option<Vec<Fact>>, usize),
+    __5: (usize, (), usize),
+) -> Command
+{
+    let __start0 = __4.2;
+    let __end0 = __5.0;
+    let __temp0 = __action109(
+        input,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action18(
+        input,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __temp0,
+        __5,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action188<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, Expr, usize),
+    __3: (usize, Expr, usize),
+    __4: (usize, core::option::Option<Vec<Fact>>, usize),
+    __5: (usize, &'input str, usize),
+    __6: (usize, Symbol, usize),
+    __7: (usize, (), usize),
+) -> Command
+{
+    let __start0 = __5.0;
+    let __end0 = __6.2;
+    let __temp0 = __action181(
+        input,
+        __5,
+        __6,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action19(
+        input,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __temp0,
+        __7,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action189<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, Expr, usize),
+    __3: (usize, Expr, usize),
+    __4: (usize, core::option::Option<Vec<Fact>>, usize),
+    __5: (usize, (), usize),
+) -> Command
+{
+    let __start0 = __4.2;
+    let __end0 = __5.0;
+    let __temp0 = __action109(
+        input,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action19(
+        input,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __temp0,
+        __5,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action190<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, &'input str, usize),
+) -> core::option::Option<&'input str>
+{
+    let __start0 = __0.0;
+    let __end0 = __0.2;
+    let __temp0 = __action125(
+        input,
+        __0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action123(
+        input,
+        __temp0,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action191<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, Symbol, usize),
+    __3: (usize, Schema, usize),
+    __4: (usize, Option<usize>, usize),
+    __5: (usize, &'input str, usize),
+    __6: (usize, &'input str, usize),
+    __7: (usize, Vec<Action>, usize),
+    __8: (usize, &'input str, usize),
+    __9: (usize, Expr, usize),
+    __10: (usize, &'input str, usize),
+    __11: (usize, Expr, usize),
+    __12: (usize, (), usize),
+) -> Command
+{
+    let __start0 = __5.0;
+    let __end0 = __5.2;
+    let __temp0 = __action190(
+        input,
+        __5,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action173(
+        input,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __temp0,
+        __6,
+        __7,
+        __8,
+        __9,
+        __10,
+        __11,
+        __12,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action192<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, Symbol, usize),
+    __3: (usize, Schema, usize),
+    __4: (usize, Option<usize>, usize),
+    __5: (usize, &'input str, usize),
+    __6: (usize, Vec<Action>, usize),
+    __7: (usize, &'input str, usize),
+    __8: (usize, Expr, usize),
+    __9: (usize, &'input str, usize),
+    __10: (usize, Expr, usize),
+    __11: (usize, (), usize),
+) -> Command
+{
+    let __start0 = __4.2;
+    let __end0 = __5.0;
+    let __temp0 = __action124(
+        input,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action173(
+        input,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __temp0,
+        __5,
+        __6,
+        __7,
+        __8,
+        __9,
+        __10,
+        __11,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action193<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, Symbol, usize),
+    __3: (usize, Schema, usize),
+    __4: (usize, Option<usize>, usize),
+    __5: (usize, &'input str, usize),
+    __6: (usize, &'input str, usize),
+    __7: (usize, Expr, usize),
+    __8: (usize, &'input str, usize),
+    __9: (usize, Expr, usize),
+    __10: (usize, (), usize),
+) -> Command
+{
+    let __start0 = __5.0;
+    let __end0 = __5.2;
+    let __temp0 = __action190(
+        input,
+        __5,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action174(
+        input,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __temp0,
+        __6,
+        __7,
+        __8,
+        __9,
+        __10,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action194<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, Symbol, usize),
+    __3: (usize, Schema, usize),
+    __4: (usize, Option<usize>, usize),
+    __5: (usize, &'input str, usize),
+    __6: (usize, Expr, usize),
+    __7: (usize, &'input str, usize),
+    __8: (usize, Expr, usize),
+    __9: (usize, (), usize),
+) -> Command
+{
+    let __start0 = __4.2;
+    let __end0 = __5.0;
+    let __temp0 = __action124(
+        input,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action174(
+        input,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __temp0,
+        __5,
+        __6,
+        __7,
+        __8,
+        __9,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action195<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, Symbol, usize),
+    __3: (usize, Schema, usize),
+    __4: (usize, Option<usize>, usize),
+    __5: (usize, &'input str, usize),
+    __6: (usize, &'input str, usize),
+    __7: (usize, Vec<Action>, usize),
+    __8: (usize, &'input str, usize),
+    __9: (usize, Expr, usize),
+    __10: (usize, (), usize),
+) -> Command
+{
+    let __start0 = __5.0;
+    let __end0 = __5.2;
+    let __temp0 = __action190(
+        input,
+        __5,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action175(
+        input,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __temp0,
+        __6,
+        __7,
+        __8,
+        __9,
+        __10,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action196<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, Symbol, usize),
+    __3: (usize, Schema, usize),
+    __4: (usize, Option<usize>, usize),
+    __5: (usize, &'input str, usize),
+    __6: (usize, Vec<Action>, usize),
+    __7: (usize, &'input str, usize),
+    __8: (usize, Expr, usize),
+    __9: (usize, (), usize),
+) -> Command
+{
+    let __start0 = __4.2;
+    let __end0 = __5.0;
+    let __temp0 = __action124(
+        input,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action175(
+        input,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __temp0,
+        __5,
+        __6,
+        __7,
+        __8,
+        __9,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action197<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, Symbol, usize),
+    __3: (usize, Schema, usize),
+    __4: (usize, Option<usize>, usize),
+    __5: (usize, &'input str, usize),
+    __6: (usize, &'input str, usize),
+    __7: (usize, Expr, usize),
+    __8: (usize, (), usize),
+) -> Command
+{
+    let __start0 = __5.0;
+    let __end0 = __5.2;
+    let __temp0 = __action190(
+        input,
+        __5,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action176(
+        input,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __temp0,
+        __6,
+        __7,
+        __8,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action198<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, Symbol, usize),
+    __3: (usize, Schema, usize),
+    __4: (usize, Option<usize>, usize),
+    __5: (usize, &'input str, usize),
+    __6: (usize, Expr, usize),
+    __7: (usize, (), usize),
+) -> Command
+{
+    let __start0 = __4.2;
+    let __end0 = __5.0;
+    let __temp0 = __action124(
+        input,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action176(
+        input,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __temp0,
+        __5,
+        __6,
+        __7,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action199<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, Symbol, usize),
+    __3: (usize, Schema, usize),
+    __4: (usize, Option<usize>, usize),
+    __5: (usize, &'input str, usize),
+    __6: (usize, &'input str, usize),
+    __7: (usize, Vec<Action>, usize),
+    __8: (usize, &'input str, usize),
+    __9: (usize, Expr, usize),
+    __10: (usize, (), usize),
+) -> Command
+{
+    let __start0 = __5.0;
+    let __end0 = __5.2;
+    let __temp0 = __action190(
+        input,
+        __5,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action177(
+        input,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __temp0,
+        __6,
+        __7,
+        __8,
+        __9,
+        __10,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action200<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, Symbol, usize),
+    __3: (usize, Schema, usize),
+    __4: (usize, Option<usize>, usize),
+    __5: (usize, &'input str, usize),
+    __6: (usize, Vec<Action>, usize),
+    __7: (usize, &'input str, usize),
+    __8: (usize, Expr, usize),
+    __9: (usize, (), usize),
+) -> Command
+{
+    let __start0 = __4.2;
+    let __end0 = __5.0;
+    let __temp0 = __action124(
+        input,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action177(
+        input,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __temp0,
+        __5,
+        __6,
+        __7,
+        __8,
+        __9,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action201<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, Symbol, usize),
+    __3: (usize, Schema, usize),
+    __4: (usize, Option<usize>, usize),
+    __5: (usize, &'input str, usize),
+    __6: (usize, &'input str, usize),
+    __7: (usize, Expr, usize),
+    __8: (usize, (), usize),
+) -> Command
+{
+    let __start0 = __5.0;
+    let __end0 = __5.2;
+    let __temp0 = __action190(
+        input,
+        __5,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action178(
+        input,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __temp0,
+        __6,
+        __7,
+        __8,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action202<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, Symbol, usize),
+    __3: (usize, Schema, usize),
+    __4: (usize, Option<usize>, usize),
+    __5: (usize, &'input str, usize),
+    __6: (usize, Expr, usize),
+    __7: (usize, (), usize),
+) -> Command
+{
+    let __start0 = __4.2;
+    let __end0 = __5.0;
+    let __temp0 = __action124(
+        input,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action178(
+        input,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __temp0,
+        __5,
+        __6,
+        __7,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action203<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, Symbol, usize),
+    __3: (usize, Schema, usize),
+    __4: (usize, Option<usize>, usize),
+    __5: (usize, &'input str, usize),
+    __6: (usize, &'input str, usize),
+    __7: (usize, Vec<Action>, usize),
+    __8: (usize, (), usize),
+) -> Command
+{
+    let __start0 = __5.0;
+    let __end0 = __5.2;
+    let __temp0 = __action190(
+        input,
+        __5,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action179(
+        input,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __temp0,
+        __6,
+        __7,
+        __8,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action204<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, Symbol, usize),
+    __3: (usize, Schema, usize),
+    __4: (usize, Option<usize>, usize),
+    __5: (usize, &'input str, usize),
+    __6: (usize, Vec<Action>, usize),
+    __7: (usize, (), usize),
+) -> Command
+{
+    let __start0 = __4.2;
+    let __end0 = __5.0;
+    let __temp0 = __action124(
+        input,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action179(
+        input,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __temp0,
+        __5,
+        __6,
+        __7,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action205<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, Symbol, usize),
+    __3: (usize, Schema, usize),
+    __4: (usize, Option<usize>, usize),
+    __5: (usize, &'input str, usize),
+    __6: (usize, (), usize),
+) -> Command
+{
+    let __start0 = __5.0;
+    let __end0 = __5.2;
+    let __temp0 = __action190(
+        input,
+        __5,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action180(
+        input,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __temp0,
+        __6,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action206<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, Symbol, usize),
+    __3: (usize, Schema, usize),
+    __4: (usize, Option<usize>, usize),
+    __5: (usize, (), usize),
+) -> Command
+{
+    let __start0 = __4.2;
+    let __end0 = __5.0;
+    let __temp0 = __action124(
+        input,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action180(
+        input,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __temp0,
+        __5,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action207<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, &'input str, usize),
+) -> alloc::vec::Vec<Fact>
+{
+    let __start0 = __0.2;
+    let __end0 = __0.2;
+    let __temp0 = __action99(
+        input,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action98(
+        input,
+        __0,
+        __temp0,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action208<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, &'input str, usize),
+    __1: (usize, alloc::vec::Vec<Fact>, usize),
+) -> alloc::vec::Vec<Fact>
+{
+    let __start0 = __1.0;
+    let __end0 = __1.2;
+    let __temp0 = __action100(
+        input,
+        __1,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action98(
+        input,
+        __0,
+        __temp0,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action209<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, (), usize),
+) -> Command
+{
+    let __start0 = __1.2;
+    let __end0 = __2.0;
+    let __temp0 = __action99(
+        input,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action28(
+        input,
+        __0,
+        __1,
+        __temp0,
+        __2,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action210<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, alloc::vec::Vec<Fact>, usize),
+    __3: (usize, (), usize),
+) -> Command
+{
+    let __start0 = __2.0;
+    let __end0 = __2.2;
+    let __temp0 = __action100(
+        input,
+        __2,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action28(
+        input,
+        __0,
+        __1,
+        __temp0,
+        __3,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action211<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, &'input str, usize),
+) -> core::option::Option<alloc::vec::Vec<Fact>>
+{
+    let __start0 = __0.0;
+    let __end0 = __0.2;
+    let __temp0 = __action207(
+        input,
+        __0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action96(
+        input,
+        __temp0,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action212<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, &'input str, usize),
+    __1: (usize, alloc::vec::Vec<Fact>, usize),
+) -> core::option::Option<alloc::vec::Vec<Fact>>
+{
+    let __start0 = __0.0;
+    let __end0 = __1.2;
+    let __temp0 = __action208(
+        input,
+        __0,
+        __1,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action96(
+        input,
+        __temp0,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action213<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, usize, usize),
+    __3: (usize, &'input str, usize),
+    __4: (usize, (), usize),
+) -> Command
+{
+    let __start0 = __3.0;
+    let __end0 = __3.2;
+    let __temp0 = __action211(
+        input,
+        __3,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action22(
+        input,
+        __0,
+        __1,
+        __2,
+        __temp0,
+        __4,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action214<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, usize, usize),
+    __3: (usize, &'input str, usize),
+    __4: (usize, alloc::vec::Vec<Fact>, usize),
+    __5: (usize, (), usize),
+) -> Command
+{
+    let __start0 = __3.0;
+    let __end0 = __4.2;
+    let __temp0 = __action212(
+        input,
+        __3,
+        __4,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action22(
+        input,
+        __0,
+        __1,
+        __2,
+        __temp0,
+        __5,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action215<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, usize, usize),
+    __3: (usize, (), usize),
+) -> Command
+{
+    let __start0 = __2.2;
+    let __end0 = __3.0;
+    let __temp0 = __action97(
+        input,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action22(
+        input,
+        __0,
+        __1,
+        __2,
+        __temp0,
+        __3,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action216<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, Symbol, usize),
+    __3: (usize, usize, usize),
+    __4: (usize, &'input str, usize),
+    __5: (usize, (), usize),
+) -> Command
+{
+    let __start0 = __4.0;
+    let __end0 = __4.2;
+    let __temp0 = __action211(
+        input,
+        __4,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action23(
+        input,
+        __0,
+        __1,
+        __2,
+        __3,
+        __temp0,
+        __5,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action217<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, Symbol, usize),
+    __3: (usize, usize, usize),
+    __4: (usize, &'input str, usize),
+    __5: (usize, alloc::vec::Vec<Fact>, usize),
+    __6: (usize, (), usize),
+) -> Command
+{
+    let __start0 = __4.0;
+    let __end0 = __5.2;
+    let __temp0 = __action212(
+        input,
+        __4,
+        __5,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action23(
+        input,
+        __0,
+        __1,
+        __2,
+        __3,
+        __temp0,
+        __6,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action218<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, Symbol, usize),
+    __3: (usize, usize, usize),
+    __4: (usize, (), usize),
+) -> Command
+{
+    let __start0 = __3.2;
+    let __end0 = __4.0;
+    let __temp0 = __action97(
+        input,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action23(
+        input,
+        __0,
+        __1,
+        __2,
+        __3,
+        __temp0,
+        __4,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action219<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, &'input str, usize),
+    __3: (usize, (), usize),
+) -> Schedule
+{
+    let __start0 = __2.0;
+    let __end0 = __2.2;
+    let __temp0 = __action211(
+        input,
+        __2,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action42(
+        input,
+        __0,
+        __1,
+        __temp0,
+        __3,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action220<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, &'input str, usize),
+    __3: (usize, alloc::vec::Vec<Fact>, usize),
+    __4: (usize, (), usize),
+) -> Schedule
+{
+    let __start0 = __2.0;
+    let __end0 = __3.2;
+    let __temp0 = __action212(
+        input,
+        __2,
+        __3,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action42(
+        input,
+        __0,
+        __1,
+        __temp0,
+        __4,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action221<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, (), usize),
+) -> Schedule
+{
+    let __start0 = __1.2;
+    let __end0 = __2.0;
+    let __temp0 = __action97(
+        input,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action42(
+        input,
+        __0,
+        __1,
+        __temp0,
+        __2,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action222<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, Symbol, usize),
+    __3: (usize, &'input str, usize),
+    __4: (usize, (), usize),
+) -> Schedule
+{
+    let __start0 = __3.0;
+    let __end0 = __3.2;
+    let __temp0 = __action211(
+        input,
+        __3,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action43(
+        input,
+        __0,
+        __1,
+        __2,
+        __temp0,
+        __4,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action223<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, Symbol, usize),
+    __3: (usize, &'input str, usize),
+    __4: (usize, alloc::vec::Vec<Fact>, usize),
+    __5: (usize, (), usize),
+) -> Schedule
+{
+    let __start0 = __3.0;
+    let __end0 = __4.2;
+    let __temp0 = __action212(
+        input,
+        __3,
+        __4,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action43(
+        input,
+        __0,
+        __1,
+        __2,
+        __temp0,
+        __5,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action224<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, Symbol, usize),
+    __3: (usize, (), usize),
+) -> Schedule
+{
+    let __start0 = __2.2;
+    let __end0 = __3.0;
+    let __temp0 = __action97(
+        input,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action43(
+        input,
+        __0,
+        __1,
+        __2,
+        __temp0,
+        __3,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action225<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, &'input str, usize),
+    __1: (usize, usize, usize),
+) -> core::option::Option<usize>
+{
+    let __start0 = __0.0;
+    let __end0 = __1.2;
+    let __temp0 = __action91(
+        input,
+        __0,
+        __1,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action89(
+        input,
+        __temp0,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action226<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, &'input str, usize),
+    __3: (usize, usize, usize),
+    __4: (usize, Fact, usize),
+    __5: (usize, (), usize),
+) -> Command
+{
+    let __start0 = __2.0;
+    let __end0 = __3.2;
+    let __temp0 = __action225(
+        input,
+        __2,
+        __3,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action27(
+        input,
+        __0,
+        __1,
+        __temp0,
+        __4,
+        __5,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action227<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, Fact, usize),
+    __3: (usize, (), usize),
+) -> Command
+{
+    let __start0 = __1.2;
+    let __end0 = __2.0;
+    let __temp0 = __action90(
+        input,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action27(
+        input,
+        __0,
+        __1,
+        __temp0,
+        __2,
+        __3,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action228<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, &'input str, usize),
+    __1: (usize, Vec<Fact>, usize),
+) -> core::option::Option<Vec<Fact>>
+{
+    let __start0 = __0.0;
+    let __end0 = __1.2;
+    let __temp0 = __action104(
+        input,
+        __0,
+        __1,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action102(
+        input,
+        __temp0,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action229<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, Expr, usize),
+    __3: (usize, Expr, usize),
+    __4: (usize, &'input str, usize),
+    __5: (usize, Vec<Fact>, usize),
+    __6: (usize, &'input str, usize),
+    __7: (usize, Symbol, usize),
+    __8: (usize, (), usize),
+) -> Command
+{
+    let __start0 = __4.0;
+    let __end0 = __5.2;
+    let __temp0 = __action228(
+        input,
+        __4,
+        __5,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action186(
+        input,
+        __0,
+        __1,
+        __2,
+        __3,
+        __temp0,
+        __6,
+        __7,
+        __8,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action230<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, Expr, usize),
+    __3: (usize, Expr, usize),
+    __4: (usize, &'input str, usize),
+    __5: (usize, Symbol, usize),
+    __6: (usize, (), usize),
+) -> Command
+{
+    let __start0 = __3.2;
+    let __end0 = __4.0;
+    let __temp0 = __action103(
+        input,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action186(
+        input,
+        __0,
+        __1,
+        __2,
+        __3,
+        __temp0,
+        __4,
+        __5,
+        __6,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action231<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, Expr, usize),
+    __3: (usize, Expr, usize),
+    __4: (usize, &'input str, usize),
+    __5: (usize, Vec<Fact>, usize),
+    __6: (usize, (), usize),
+) -> Command
+{
+    let __start0 = __4.0;
+    let __end0 = __5.2;
+    let __temp0 = __action228(
+        input,
+        __4,
+        __5,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action187(
+        input,
+        __0,
+        __1,
+        __2,
+        __3,
+        __temp0,
+        __6,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action232<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, Expr, usize),
+    __3: (usize, Expr, usize),
+    __4: (usize, (), usize),
+) -> Command
+{
+    let __start0 = __3.2;
+    let __end0 = __4.0;
+    let __temp0 = __action103(
+        input,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action187(
+        input,
+        __0,
+        __1,
+        __2,
+        __3,
+        __temp0,
+        __4,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action233<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, Expr, usize),
+    __3: (usize, Expr, usize),
+    __4: (usize, &'input str, usize),
+    __5: (usize, Vec<Fact>, usize),
+    __6: (usize, &'input str, usize),
+    __7: (usize, Symbol, usize),
+    __8: (usize, (), usize),
+) -> Command
+{
+    let __start0 = __4.0;
+    let __end0 = __5.2;
+    let __temp0 = __action228(
+        input,
+        __4,
+        __5,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action188(
+        input,
+        __0,
+        __1,
+        __2,
+        __3,
+        __temp0,
+        __6,
+        __7,
+        __8,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action234<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, Expr, usize),
+    __3: (usize, Expr, usize),
+    __4: (usize, &'input str, usize),
+    __5: (usize, Symbol, usize),
+    __6: (usize, (), usize),
+) -> Command
+{
+    let __start0 = __3.2;
+    let __end0 = __4.0;
+    let __temp0 = __action103(
+        input,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action188(
+        input,
+        __0,
+        __1,
+        __2,
+        __3,
+        __temp0,
+        __4,
+        __5,
+        __6,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action235<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, Expr, usize),
+    __3: (usize, Expr, usize),
+    __4: (usize, &'input str, usize),
+    __5: (usize, Vec<Fact>, usize),
+    __6: (usize, (), usize),
+) -> Command
+{
+    let __start0 = __4.0;
+    let __end0 = __5.2;
+    let __temp0 = __action228(
+        input,
+        __4,
+        __5,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action189(
+        input,
+        __0,
+        __1,
+        __2,
+        __3,
+        __temp0,
+        __6,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action236<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, Expr, usize),
+    __3: (usize, Expr, usize),
+    __4: (usize, (), usize),
+) -> Command
+{
+    let __start0 = __3.2;
+    let __end0 = __4.0;
+    let __temp0 = __action103(
+        input,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action189(
+        input,
+        __0,
+        __1,
+        __2,
+        __3,
+        __temp0,
+        __4,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action237<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, Command, usize),
+) -> alloc::vec::Vec<Command>
+{
+    let __start0 = __0.0;
+    let __end0 = __0.2;
+    let __temp0 = __action134(
+        input,
+        __0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action135(
+        input,
+        __temp0,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action238<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, alloc::vec::Vec<Command>, usize),
+    __1: (usize, Command, usize),
+) -> alloc::vec::Vec<Command>
+{
+    let __start0 = __1.0;
+    let __end0 = __1.2;
+    let __temp0 = __action134(
+        input,
+        __1,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action136(
+        input,
+        __0,
+        __temp0,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action239<
+    'input,
+>(
+    input: &'input str,
+    __lookbehind: &usize,
+    __lookahead: &usize,
+) -> Vec<Command>
+{
+    let __start0 = *__lookbehind;
+    let __end0 = *__lookahead;
+    let __temp0 = __action132(
+        input,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action4(
+        input,
+        __temp0,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action240<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, alloc::vec::Vec<Command>, usize),
+) -> Vec<Command>
+{
+    let __start0 = __0.0;
+    let __end0 = __0.2;
+    let __temp0 = __action133(
+        input,
+        __0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action4(
+        input,
+        __temp0,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action241<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, Expr, usize),
+) -> alloc::vec::Vec<Expr>
+{
+    let __start0 = __0.0;
+    let __end0 = __0.2;
+    let __temp0 = __action128(
+        input,
+        __0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action139(
+        input,
+        __temp0,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action242<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, alloc::vec::Vec<Expr>, usize),
+    __1: (usize, Expr, usize),
+) -> alloc::vec::Vec<Expr>
+{
+    let __start0 = __1.0;
+    let __end0 = __1.2;
+    let __temp0 = __action128(
+        input,
+        __1,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action140(
+        input,
+        __0,
+        __temp0,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action243<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, Symbol, usize),
+    __2: (usize, (), usize),
+) -> Expr
+{
+    let __start0 = __1.2;
+    let __end0 = __2.0;
+    let __temp0 = __action126(
+        input,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action66(
+        input,
+        __0,
+        __1,
+        __temp0,
+        __2,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action244<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, Symbol, usize),
+    __2: (usize, alloc::vec::Vec<Expr>, usize),
+    __3: (usize, (), usize),
+) -> Expr
+{
+    let __start0 = __2.0;
+    let __end0 = __2.2;
+    let __temp0 = __action127(
+        input,
+        __2,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action66(
+        input,
+        __0,
+        __1,
+        __temp0,
+        __3,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action245<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, Symbol, usize),
+    __3: (usize, (), usize),
+    __4: (usize, Symbol, usize),
+    __5: (usize, (), usize),
+    __6: (usize, (), usize),
+) -> Command
+{
+    let __start0 = __4.2;
+    let __end0 = __5.0;
+    let __temp0 = __action126(
+        input,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action11(
+        input,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __temp0,
+        __5,
+        __6,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action246<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, Symbol, usize),
+    __3: (usize, (), usize),
+    __4: (usize, Symbol, usize),
+    __5: (usize, alloc::vec::Vec<Expr>, usize),
+    __6: (usize, (), usize),
+    __7: (usize, (), usize),
+) -> Command
+{
+    let __start0 = __5.0;
+    let __end0 = __5.2;
+    let __temp0 = __action127(
+        input,
+        __5,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action11(
+        input,
+        __0,
+        __1,
+        __2,
+        __3,
+        __4,
+        __temp0,
+        __6,
+        __7,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action247<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, (), usize),
+) -> Vec<Expr>
+{
+    let __start0 = __0.2;
+    let __end0 = __1.0;
+    let __temp0 = __action126(
+        input,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action67(
+        input,
+        __0,
+        __temp0,
+        __1,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action248<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, alloc::vec::Vec<Expr>, usize),
+    __2: (usize, (), usize),
+) -> Vec<Expr>
+{
+    let __start0 = __1.0;
+    let __end0 = __1.2;
+    let __temp0 = __action127(
+        input,
+        __1,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action67(
+        input,
+        __0,
+        __temp0,
+        __2,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action249<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, Fact, usize),
+) -> alloc::vec::Vec<Fact>
+{
+    let __start0 = __0.0;
+    let __end0 = __0.2;
+    let __temp0 = __action101(
+        input,
+        __0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action147(
+        input,
+        __temp0,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action250<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, alloc::vec::Vec<Fact>, usize),
+    __1: (usize, Fact, usize),
+) -> alloc::vec::Vec<Fact>
+{
+    let __start0 = __1.0;
+    let __end0 = __1.2;
+    let __temp0 = __action101(
+        input,
+        __1,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action148(
+        input,
+        __0,
+        __temp0,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action251<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, Symbol, usize),
+) -> alloc::vec::Vec<Symbol>
+{
+    let __start0 = __0.0;
+    let __end0 = __0.2;
+    let __temp0 = __action82(
+        input,
+        __0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action153(
+        input,
+        __temp0,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action252<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, alloc::vec::Vec<Symbol>, usize),
+    __1: (usize, Symbol, usize),
+) -> alloc::vec::Vec<Symbol>
+{
+    let __start0 = __1.0;
+    let __end0 = __1.2;
+    let __temp0 = __action82(
+        input,
+        __1,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action154(
+        input,
+        __0,
+        __temp0,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action253<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, Symbol, usize),
+    __2: (usize, Option<usize>, usize),
+    __3: (usize, (), usize),
+) -> Variant
+{
+    let __start0 = __1.2;
+    let __end0 = __2.0;
+    let __temp0 = __action80(
+        input,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action68(
+        input,
+        __0,
+        __1,
+        __temp0,
+        __2,
+        __3,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action254<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, Symbol, usize),
+    __2: (usize, alloc::vec::Vec<Symbol>, usize),
+    __3: (usize, Option<usize>, usize),
+    __4: (usize, (), usize),
+) -> Variant
+{
+    let __start0 = __2.0;
+    let __end0 = __2.2;
+    let __temp0 = __action81(
+        input,
+        __2,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action68(
+        input,
+        __0,
+        __1,
+        __temp0,
+        __3,
+        __4,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action255<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, Variant, usize),
+) -> alloc::vec::Vec<Variant>
+{
+    let __start0 = __0.0;
+    let __end0 = __0.2;
+    let __temp0 = __action131(
+        input,
+        __0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action137(
+        input,
+        __temp0,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action256<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, alloc::vec::Vec<Variant>, usize),
+    __1: (usize, Variant, usize),
+) -> alloc::vec::Vec<Variant>
+{
+    let __start0 = __1.0;
+    let __end0 = __1.2;
+    let __temp0 = __action131(
+        input,
+        __1,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action138(
+        input,
+        __0,
+        __temp0,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action257<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, Symbol, usize),
+    __3: (usize, (), usize),
+) -> Command
+{
+    let __start0 = __2.2;
+    let __end0 = __3.0;
+    let __temp0 = __action129(
+        input,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action10(
+        input,
+        __0,
+        __1,
+        __2,
+        __temp0,
+        __3,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action258<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, Symbol, usize),
+    __3: (usize, alloc::vec::Vec<Variant>, usize),
+    __4: (usize, (), usize),
+) -> Command
+{
+    let __start0 = __3.0;
+    let __end0 = __3.2;
+    let __temp0 = __action130(
+        input,
+        __3,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action10(
+        input,
+        __0,
+        __1,
+        __2,
+        __temp0,
+        __4,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action259<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, (), usize),
+) -> Vec<Action>
+{
+    let __start0 = __0.2;
+    let __end0 = __1.0;
+    let __temp0 = __action141(
+        input,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action122(
+        input,
+        __0,
+        __temp0,
+        __1,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action260<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, alloc::vec::Vec<Action>, usize),
+    __2: (usize, (), usize),
+) -> Vec<Action>
+{
+    let __start0 = __1.0;
+    let __end0 = __1.2;
+    let __temp0 = __action142(
+        input,
+        __1,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action122(
+        input,
+        __0,
+        __temp0,
+        __2,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action261<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, (), usize),
+    __3: (usize, Symbol, usize),
+    __4: (usize, (), usize),
+    __5: (usize, Expr, usize),
+    __6: (usize, (), usize),
+) -> Action
+{
+    let __start0 = __3.2;
+    let __end0 = __4.0;
+    let __temp0 = __action83(
+        input,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action47(
+        input,
+        __0,
+        __1,
+        __2,
+        __3,
+        __temp0,
+        __4,
+        __5,
+        __6,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action262<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, (), usize),
+    __3: (usize, Symbol, usize),
+    __4: (usize, alloc::vec::Vec<Expr>, usize),
+    __5: (usize, (), usize),
+    __6: (usize, Expr, usize),
+    __7: (usize, (), usize),
+) -> Action
+{
+    let __start0 = __4.0;
+    let __end0 = __4.2;
+    let __temp0 = __action84(
+        input,
+        __4,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action47(
+        input,
+        __0,
+        __1,
+        __2,
+        __3,
+        __temp0,
+        __5,
+        __6,
+        __7,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action263<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, (), usize),
+    __3: (usize, Symbol, usize),
+    __4: (usize, (), usize),
+    __5: (usize, (), usize),
+) -> Action
+{
+    let __start0 = __3.2;
+    let __end0 = __4.0;
+    let __temp0 = __action83(
+        input,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action48(
+        input,
+        __0,
+        __1,
+        __2,
+        __3,
+        __temp0,
+        __4,
+        __5,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action264<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, (), usize),
+    __3: (usize, Symbol, usize),
+    __4: (usize, alloc::vec::Vec<Expr>, usize),
+    __5: (usize, (), usize),
+    __6: (usize, (), usize),
+) -> Action
+{
+    let __start0 = __4.0;
+    let __end0 = __4.2;
+    let __temp0 = __action84(
+        input,
+        __4,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action48(
+        input,
+        __0,
+        __1,
+        __2,
+        __3,
+        __temp0,
+        __5,
+        __6,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action265<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, (), usize),
+) -> Vec<Fact>
+{
+    let __start0 = __0.2;
+    let __end0 = __1.0;
+    let __temp0 = __action145(
+        input,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action111(
+        input,
+        __0,
+        __temp0,
+        __1,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action266<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, alloc::vec::Vec<Fact>, usize),
+    __2: (usize, (), usize),
+) -> Vec<Fact>
+{
+    let __start0 = __1.0;
+    let __end0 = __1.2;
+    let __temp0 = __action146(
+        input,
+        __1,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action111(
+        input,
+        __0,
+        __temp0,
+        __2,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action267<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, (), usize),
+    __3: (usize, (), usize),
+    __4: (usize, alloc::vec::Vec<Expr>, usize),
+    __5: (usize, (), usize),
+) -> Command
+{
+    let __start0 = __2.2;
+    let __end0 = __3.0;
+    let __temp0 = __action94(
+        input,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action26(
+        input,
+        __0,
+        __1,
+        __2,
+        __temp0,
+        __3,
+        __4,
+        __5,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action268<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, (), usize),
+    __3: (usize, alloc::vec::Vec<IdentSort>, usize),
+    __4: (usize, (), usize),
+    __5: (usize, alloc::vec::Vec<Expr>, usize),
+    __6: (usize, (), usize),
+) -> Command
+{
+    let __start0 = __3.0;
+    let __end0 = __3.2;
+    let __temp0 = __action95(
+        input,
+        __3,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action26(
+        input,
+        __0,
+        __1,
+        __2,
+        __temp0,
+        __4,
+        __5,
+        __6,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action269<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, (), usize),
+) -> Command
+{
+    let __start0 = __1.2;
+    let __end0 = __2.0;
+    let __temp0 = __action87(
+        input,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action30(
+        input,
+        __0,
+        __1,
+        __temp0,
+        __2,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action270<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, alloc::vec::Vec<Schedule>, usize),
+    __3: (usize, (), usize),
+) -> Command
+{
+    let __start0 = __2.0;
+    let __end0 = __2.2;
+    let __temp0 = __action88(
+        input,
+        __2,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action30(
+        input,
+        __0,
+        __1,
+        __temp0,
+        __3,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action271<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, (), usize),
+) -> Schedule
+{
+    let __start0 = __1.2;
+    let __end0 = __2.0;
+    let __temp0 = __action87(
+        input,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action39(
+        input,
+        __0,
+        __1,
+        __temp0,
+        __2,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action272<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, alloc::vec::Vec<Schedule>, usize),
+    __3: (usize, (), usize),
+) -> Schedule
+{
+    let __start0 = __2.0;
+    let __end0 = __2.2;
+    let __temp0 = __action88(
+        input,
+        __2,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action39(
+        input,
+        __0,
+        __1,
+        __temp0,
+        __3,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action273<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, (), usize),
+) -> Schedule
+{
+    let __start0 = __1.2;
+    let __end0 = __2.0;
+    let __temp0 = __action87(
+        input,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action40(
+        input,
+        __0,
+        __1,
+        __temp0,
+        __2,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action274<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, alloc::vec::Vec<Schedule>, usize),
+    __3: (usize, (), usize),
+) -> Schedule
+{
+    let __start0 = __2.0;
+    let __end0 = __2.2;
+    let __temp0 = __action88(
+        input,
+        __2,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action40(
+        input,
+        __0,
+        __1,
+        __temp0,
+        __3,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action275<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, usize, usize),
+    __3: (usize, (), usize),
+) -> Schedule
+{
+    let __start0 = __2.2;
+    let __end0 = __3.0;
+    let __temp0 = __action87(
+        input,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action41(
+        input,
+        __0,
+        __1,
+        __2,
+        __temp0,
+        __3,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action276<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, usize, usize),
+    __3: (usize, alloc::vec::Vec<Schedule>, usize),
+    __4: (usize, (), usize),
+) -> Schedule
+{
+    let __start0 = __3.0;
+    let __end0 = __3.2;
+    let __temp0 = __action88(
+        input,
+        __3,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action41(
+        input,
+        __0,
+        __1,
+        __2,
+        __temp0,
+        __4,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action277<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, (), usize),
+) -> Vec<Symbol>
+{
+    let __start0 = __0.2;
+    let __end0 = __1.0;
+    let __temp0 = __action143(
+        input,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action112(
+        input,
+        __0,
+        __temp0,
+        __1,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action278<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, alloc::vec::Vec<Symbol>, usize),
+    __2: (usize, (), usize),
+) -> Vec<Symbol>
+{
+    let __start0 = __1.0;
+    let __end0 = __1.2;
+    let __temp0 = __action144(
+        input,
+        __1,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action112(
+        input,
+        __0,
+        __temp0,
+        __2,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action279<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, usize, usize),
+    __3: (usize, (), usize),
+) -> Command
+{
+    let __start0 = __2.0;
+    let __end0 = __2.2;
+    let __temp0 = __action85(
+        input,
+        __2,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action31(
+        input,
+        __0,
+        __1,
+        __temp0,
+        __3,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action280<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, (), usize),
+) -> Command
+{
+    let __start0 = __1.2;
+    let __end0 = __2.0;
+    let __temp0 = __action86(
+        input,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action31(
+        input,
+        __0,
+        __1,
+        __temp0,
+        __2,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action281<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, usize, usize),
+    __3: (usize, (), usize),
+) -> Command
+{
+    let __start0 = __2.0;
+    let __end0 = __2.2;
+    let __temp0 = __action85(
+        input,
+        __2,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action32(
+        input,
+        __0,
+        __1,
+        __temp0,
+        __3,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action282<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, (), usize),
+) -> Command
+{
+    let __start0 = __1.2;
+    let __end0 = __2.0;
+    let __temp0 = __action86(
+        input,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action32(
+        input,
+        __0,
+        __1,
+        __temp0,
+        __2,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action283<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, Symbol, usize),
+    __3: (usize, usize, usize),
+    __4: (usize, (), usize),
+) -> Command
+{
+    let __start0 = __3.0;
+    let __end0 = __3.2;
+    let __temp0 = __action85(
+        input,
+        __3,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action33(
+        input,
+        __0,
+        __1,
+        __2,
+        __temp0,
+        __4,
+    )
+}
+
+#[allow(unused_variables)]
+#[allow(clippy::too_many_arguments)]
+fn __action284<
+    'input,
+>(
+    input: &'input str,
+    __0: (usize, (), usize),
+    __1: (usize, &'input str, usize),
+    __2: (usize, Symbol, usize),
+    __3: (usize, (), usize),
+) -> Command
+{
+    let __start0 = __2.2;
+    let __end0 = __3.0;
+    let __temp0 = __action86(
+        input,
+        &__start0,
+        &__end0,
+    );
+    let __temp0 = (__start0, __temp0, __end0);
+    __action33(
+        input,
+        __0,
+        __1,
+        __2,
+        __temp0,
+        __3,
+    )
+}
+#[allow(clippy::type_complexity)]
+
+pub trait __ToTriple<'input, >
+{
+    fn to_triple(value: Self) -> Result<(usize,Token<'input>,usize), __lalrpop_util::ParseError<usize, Token<'input>, String>>;
+}
+
+impl<'input, > __ToTriple<'input, > for (usize, Token<'input>, usize)
+{
+    fn to_triple(value: Self) -> Result<(usize,Token<'input>,usize), __lalrpop_util::ParseError<usize, Token<'input>, String>> {
+        Ok(value)
+    }
+}
+impl<'input, > __ToTriple<'input, > for Result<(usize, Token<'input>, usize), String>
+{
+    fn to_triple(value: Self) -> Result<(usize,Token<'input>,usize), __lalrpop_util::ParseError<usize, Token<'input>, String>> {
+        match value {
+            Ok(v) => Ok(v),
+            Err(error) => Err(__lalrpop_util::ParseError::User { error }),
+        }
+    }
+}
+
\ No newline at end of file diff --git a/docs/src/egglog/lib.rs.html b/docs/src/egglog/lib.rs.html new file mode 100644 index 000000000..209b7b04b --- /dev/null +++ b/docs/src/egglog/lib.rs.html @@ -0,0 +1,2597 @@ +lib.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+390
+391
+392
+393
+394
+395
+396
+397
+398
+399
+400
+401
+402
+403
+404
+405
+406
+407
+408
+409
+410
+411
+412
+413
+414
+415
+416
+417
+418
+419
+420
+421
+422
+423
+424
+425
+426
+427
+428
+429
+430
+431
+432
+433
+434
+435
+436
+437
+438
+439
+440
+441
+442
+443
+444
+445
+446
+447
+448
+449
+450
+451
+452
+453
+454
+455
+456
+457
+458
+459
+460
+461
+462
+463
+464
+465
+466
+467
+468
+469
+470
+471
+472
+473
+474
+475
+476
+477
+478
+479
+480
+481
+482
+483
+484
+485
+486
+487
+488
+489
+490
+491
+492
+493
+494
+495
+496
+497
+498
+499
+500
+501
+502
+503
+504
+505
+506
+507
+508
+509
+510
+511
+512
+513
+514
+515
+516
+517
+518
+519
+520
+521
+522
+523
+524
+525
+526
+527
+528
+529
+530
+531
+532
+533
+534
+535
+536
+537
+538
+539
+540
+541
+542
+543
+544
+545
+546
+547
+548
+549
+550
+551
+552
+553
+554
+555
+556
+557
+558
+559
+560
+561
+562
+563
+564
+565
+566
+567
+568
+569
+570
+571
+572
+573
+574
+575
+576
+577
+578
+579
+580
+581
+582
+583
+584
+585
+586
+587
+588
+589
+590
+591
+592
+593
+594
+595
+596
+597
+598
+599
+600
+601
+602
+603
+604
+605
+606
+607
+608
+609
+610
+611
+612
+613
+614
+615
+616
+617
+618
+619
+620
+621
+622
+623
+624
+625
+626
+627
+628
+629
+630
+631
+632
+633
+634
+635
+636
+637
+638
+639
+640
+641
+642
+643
+644
+645
+646
+647
+648
+649
+650
+651
+652
+653
+654
+655
+656
+657
+658
+659
+660
+661
+662
+663
+664
+665
+666
+667
+668
+669
+670
+671
+672
+673
+674
+675
+676
+677
+678
+679
+680
+681
+682
+683
+684
+685
+686
+687
+688
+689
+690
+691
+692
+693
+694
+695
+696
+697
+698
+699
+700
+701
+702
+703
+704
+705
+706
+707
+708
+709
+710
+711
+712
+713
+714
+715
+716
+717
+718
+719
+720
+721
+722
+723
+724
+725
+726
+727
+728
+729
+730
+731
+732
+733
+734
+735
+736
+737
+738
+739
+740
+741
+742
+743
+744
+745
+746
+747
+748
+749
+750
+751
+752
+753
+754
+755
+756
+757
+758
+759
+760
+761
+762
+763
+764
+765
+766
+767
+768
+769
+770
+771
+772
+773
+774
+775
+776
+777
+778
+779
+780
+781
+782
+783
+784
+785
+786
+787
+788
+789
+790
+791
+792
+793
+794
+795
+796
+797
+798
+799
+800
+801
+802
+803
+804
+805
+806
+807
+808
+809
+810
+811
+812
+813
+814
+815
+816
+817
+818
+819
+820
+821
+822
+823
+824
+825
+826
+827
+828
+829
+830
+831
+832
+833
+834
+835
+836
+837
+838
+839
+840
+841
+842
+843
+844
+845
+846
+847
+848
+849
+850
+851
+852
+853
+854
+855
+856
+857
+858
+859
+860
+861
+862
+863
+864
+865
+866
+867
+868
+869
+870
+871
+872
+873
+874
+875
+876
+877
+878
+879
+880
+881
+882
+883
+884
+885
+886
+887
+888
+889
+890
+891
+892
+893
+894
+895
+896
+897
+898
+899
+900
+901
+902
+903
+904
+905
+906
+907
+908
+909
+910
+911
+912
+913
+914
+915
+916
+917
+918
+919
+920
+921
+922
+923
+924
+925
+926
+927
+928
+929
+930
+931
+932
+933
+934
+935
+936
+937
+938
+939
+940
+941
+942
+943
+944
+945
+946
+947
+948
+949
+950
+951
+952
+953
+954
+955
+956
+957
+958
+959
+960
+961
+962
+963
+964
+965
+966
+967
+968
+969
+970
+971
+972
+973
+974
+975
+976
+977
+978
+979
+980
+981
+982
+983
+984
+985
+986
+987
+988
+989
+990
+991
+992
+993
+994
+995
+996
+997
+998
+999
+1000
+1001
+1002
+1003
+1004
+1005
+1006
+1007
+1008
+1009
+1010
+1011
+1012
+1013
+1014
+1015
+1016
+1017
+1018
+1019
+1020
+1021
+1022
+1023
+1024
+1025
+1026
+1027
+1028
+1029
+1030
+1031
+1032
+1033
+1034
+1035
+1036
+1037
+1038
+1039
+1040
+1041
+1042
+1043
+1044
+1045
+1046
+1047
+1048
+1049
+1050
+1051
+1052
+1053
+1054
+1055
+1056
+1057
+1058
+1059
+1060
+1061
+1062
+1063
+1064
+1065
+1066
+1067
+1068
+1069
+1070
+1071
+1072
+1073
+1074
+1075
+1076
+1077
+1078
+1079
+1080
+1081
+1082
+1083
+1084
+1085
+1086
+1087
+1088
+1089
+1090
+1091
+1092
+1093
+1094
+1095
+1096
+1097
+1098
+1099
+1100
+1101
+1102
+1103
+1104
+1105
+1106
+1107
+1108
+1109
+1110
+1111
+1112
+1113
+1114
+1115
+1116
+1117
+1118
+1119
+1120
+1121
+1122
+1123
+1124
+1125
+1126
+1127
+1128
+1129
+1130
+1131
+1132
+1133
+1134
+1135
+1136
+1137
+1138
+1139
+1140
+1141
+1142
+1143
+1144
+1145
+1146
+1147
+1148
+1149
+1150
+1151
+1152
+1153
+1154
+1155
+1156
+1157
+1158
+1159
+1160
+1161
+1162
+1163
+1164
+1165
+1166
+1167
+1168
+1169
+1170
+1171
+1172
+1173
+1174
+1175
+1176
+1177
+1178
+1179
+1180
+1181
+1182
+1183
+1184
+1185
+1186
+1187
+1188
+1189
+1190
+1191
+1192
+1193
+1194
+1195
+1196
+1197
+1198
+1199
+1200
+1201
+1202
+1203
+1204
+1205
+1206
+1207
+1208
+1209
+1210
+1211
+1212
+1213
+1214
+1215
+1216
+1217
+1218
+1219
+1220
+1221
+1222
+1223
+1224
+1225
+1226
+1227
+1228
+1229
+1230
+1231
+1232
+1233
+1234
+1235
+1236
+1237
+1238
+1239
+1240
+1241
+1242
+1243
+1244
+1245
+1246
+1247
+1248
+1249
+1250
+1251
+1252
+1253
+1254
+1255
+1256
+1257
+1258
+1259
+1260
+1261
+1262
+1263
+1264
+1265
+1266
+1267
+1268
+1269
+1270
+1271
+1272
+1273
+1274
+1275
+1276
+1277
+1278
+1279
+1280
+1281
+1282
+1283
+1284
+1285
+1286
+1287
+1288
+1289
+1290
+1291
+1292
+1293
+1294
+1295
+1296
+1297
+1298
+
pub mod ast;
+mod extract;
+mod function;
+mod gj;
+mod proofs;
+mod serialize;
+pub mod sort;
+mod termdag;
+mod typecheck;
+mod typechecking;
+mod unionfind;
+pub mod util;
+mod value;
+
+use extract::Extractor;
+use hashbrown::hash_map::Entry;
+use index::ColumnIndex;
+use instant::{Duration, Instant};
+pub use serialize::SerializeConfig;
+use sort::*;
+pub use termdag::{Term, TermDag};
+use thiserror::Error;
+
+use proofs::ProofState;
+
+use symbolic_expressions::Sexp;
+
+use ast::*;
+pub use typechecking::{TypeInfo, UNIT_SYM};
+
+use std::fmt::{Display, Formatter, Write};
+use std::fs::File;
+use std::hash::Hash;
+use std::io::Read;
+use std::iter::once;
+use std::ops::{Deref, Range};
+use std::path::PathBuf;
+use std::rc::Rc;
+use std::str::FromStr;
+use std::{fmt::Debug, sync::Arc};
+use typecheck::Program;
+
+pub type ArcSort = Arc<dyn Sort>;
+
+pub use value::*;
+
+use function::*;
+use gj::*;
+use unionfind::*;
+use util::*;
+
+use crate::typechecking::TypeError;
+
+pub type Subst = IndexMap<Symbol, Value>;
+
+pub trait PrimitiveLike {
+    fn name(&self) -> Symbol;
+    fn accept(&self, types: &[ArcSort]) -> Option<ArcSort>;
+    fn apply(&self, values: &[Value]) -> Option<Value>;
+}
+
+#[derive(Debug, Clone, Default)]
+pub struct RunReport {
+    pub updated: bool,
+    pub search_time: Duration,
+    pub apply_time: Duration,
+    pub rebuild_time: Duration,
+}
+
+#[derive(Debug, Clone)]
+pub struct ExtractReport {
+    pub cost: usize,
+    pub expr: Term,
+    pub variants: Vec<Term>,
+    pub termdag: TermDag,
+}
+
+impl RunReport {
+    pub fn union(&self, other: &Self) -> Self {
+        Self {
+            updated: self.updated || other.updated,
+            search_time: self.search_time + other.search_time,
+            apply_time: self.apply_time + other.apply_time,
+            rebuild_time: self.rebuild_time + other.rebuild_time,
+        }
+    }
+}
+
+pub const HIGH_COST: usize = i64::MAX as usize;
+
+#[derive(Clone)]
+pub struct Primitive(Arc<dyn PrimitiveLike>);
+
+impl Deref for Primitive {
+    type Target = dyn PrimitiveLike;
+    fn deref(&self) -> &Self::Target {
+        &*self.0
+    }
+}
+
+impl Hash for Primitive {
+    fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
+        Arc::as_ptr(&self.0).hash(state);
+    }
+}
+
+impl Eq for Primitive {}
+impl PartialEq for Primitive {
+    fn eq(&self, other: &Self) -> bool {
+        // this is a bit of a hack, but clippy says we don't want to compare the
+        // vtables, just the data pointers
+        std::ptr::eq(
+            Arc::as_ptr(&self.0) as *const u8,
+            Arc::as_ptr(&other.0) as *const u8,
+        )
+    }
+}
+
+impl Debug for Primitive {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(f, "Prim({})", self.0.name())
+    }
+}
+
+impl<T: PrimitiveLike + 'static> From<T> for Primitive {
+    fn from(p: T) -> Self {
+        Self(Arc::new(p))
+    }
+}
+
+pub struct SimplePrimitive {
+    name: Symbol,
+    input: Vec<ArcSort>,
+    output: ArcSort,
+    f: fn(&[Value]) -> Option<Value>,
+}
+
+impl PrimitiveLike for SimplePrimitive {
+    fn name(&self) -> Symbol {
+        self.name
+    }
+    fn accept(&self, types: &[ArcSort]) -> Option<ArcSort> {
+        if self.input.len() != types.len() {
+            return None;
+        }
+        // TODO can we use a better notion of equality than just names?
+        self.input
+            .iter()
+            .zip(types)
+            .all(|(a, b)| a.name() == b.name())
+            .then(|| self.output.clone())
+    }
+    fn apply(&self, values: &[Value]) -> Option<Value> {
+        (self.f)(values)
+    }
+}
+
+#[derive(Debug, Clone, PartialEq, Eq, Hash, Copy)]
+pub enum CompilerPassStop {
+    Desugar,
+    TypecheckDesugared,
+    TermEncoding,
+    TypecheckTermEncoding,
+    Proofs,
+    TypecheckProofs,
+    All,
+}
+
+impl Display for CompilerPassStop {
+    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
+        match self {
+            CompilerPassStop::Desugar => write!(f, "desugar"),
+            CompilerPassStop::TypecheckDesugared => write!(f, "typecheck_desugared"),
+            CompilerPassStop::TermEncoding => write!(f, "term_encoding"),
+            CompilerPassStop::TypecheckTermEncoding => write!(f, "typecheck_term_encoding"),
+            CompilerPassStop::Proofs => write!(f, "proofs"),
+            CompilerPassStop::TypecheckProofs => write!(f, "typecheck_proofs"),
+            CompilerPassStop::All => write!(f, "all"),
+        }
+    }
+}
+
+impl FromStr for CompilerPassStop {
+    type Err = String;
+
+    fn from_str(s: &str) -> Result<Self, Self::Err> {
+        match s {
+            "desugar" => Ok(CompilerPassStop::Desugar),
+            "typecheck_desugared" => Ok(CompilerPassStop::TypecheckDesugared),
+            "term_encoding" => Ok(CompilerPassStop::TermEncoding),
+            "typecheck_term_encoding" => Ok(CompilerPassStop::TypecheckTermEncoding),
+            "proofs" => Ok(CompilerPassStop::Proofs),
+            "typecheck_proofs" => Ok(CompilerPassStop::TypecheckProofs),
+            "all" => Ok(CompilerPassStop::All),
+            _ => Err(format!("Unknown compiler pass stop: {}", s)),
+        }
+    }
+}
+
+#[derive(Clone)]
+pub struct EGraph {
+    egraphs: Vec<Self>,
+    unionfind: UnionFind,
+    pub(crate) proof_state: ProofState,
+    functions: HashMap<Symbol, Function>,
+    rulesets: HashMap<Symbol, HashMap<Symbol, Rule>>,
+    ruleset_iteration: HashMap<Symbol, usize>,
+    proofs_enabled: bool,
+    interactive_mode: bool,
+    timestamp: u32,
+    pub test_proofs: bool,
+    pub match_limit: usize,
+    pub node_limit: usize,
+    pub fact_directory: Option<PathBuf>,
+    pub seminaive: bool,
+    // sort, value, and timestamp
+    pub global_bindings: HashMap<Symbol, (ArcSort, Value, u32)>,
+    extract_report: Option<ExtractReport>,
+    run_report: Option<RunReport>,
+    msgs: Vec<String>,
+}
+
+#[derive(Clone, Debug)]
+struct Rule {
+    query: CompiledQuery,
+    program: Program,
+    matches: usize,
+    times_banned: usize,
+    banned_until: usize,
+    todo_timestamp: u32,
+    search_time: Duration,
+    apply_time: Duration,
+}
+
+impl Default for EGraph {
+    fn default() -> Self {
+        let mut egraph = Self {
+            egraphs: vec![],
+            unionfind: Default::default(),
+            functions: Default::default(),
+            rulesets: Default::default(),
+            ruleset_iteration: Default::default(),
+            proof_state: ProofState::default(),
+            global_bindings: Default::default(),
+            match_limit: usize::MAX,
+            node_limit: usize::MAX,
+            timestamp: 0,
+            proofs_enabled: false,
+            interactive_mode: false,
+            test_proofs: false,
+            fact_directory: None,
+            seminaive: true,
+            extract_report: None,
+            run_report: None,
+            msgs: Default::default(),
+        };
+        egraph.rulesets.insert("".into(), Default::default());
+        egraph
+    }
+}
+
+#[derive(Debug, Error)]
+#[error("Not found: {0}")]
+pub struct NotFoundError(Expr);
+
+impl EGraph {
+    pub fn is_interactive_mode(&self) -> bool {
+        self.interactive_mode
+    }
+
+    pub fn push(&mut self) {
+        self.egraphs.push(self.clone());
+    }
+
+    pub fn pop(&mut self) -> Result<(), Error> {
+        match self.egraphs.pop() {
+            Some(e) => {
+                *self = e;
+                Ok(())
+            }
+            None => Err(Error::Pop),
+        }
+    }
+
+    pub fn union(&mut self, id1: Id, id2: Id, sort: Symbol) -> Id {
+        self.unionfind.union(id1, id2, sort)
+    }
+
+    #[track_caller]
+    fn debug_assert_invariants(&self) {
+        #[cfg(debug_assertions)]
+        for (name, function) in self.functions.iter() {
+            function.nodes.assert_sorted();
+            for (i, inputs, output) in function.nodes.iter_range(0..function.nodes.len()) {
+                for input in inputs {
+                    assert_eq!(
+                        input,
+                        &self.bad_find_value(*input),
+                        "[{i}] {name}({inputs:?}) = {output:?}\n{:?}",
+                        function.schema,
+                    )
+                }
+                assert_eq!(
+                    output.value,
+                    self.bad_find_value(output.value),
+                    "[{i}] {name}({inputs:?}) = {output:?}\n{:?}",
+                    function.schema,
+                )
+            }
+            for ix in &function.indexes {
+                for (_, offs) in ix.iter() {
+                    for off in offs {
+                        assert!(
+                            (*off as usize) < function.nodes.num_offsets(),
+                            "index contains offset {off:?}, which is out of range for function {name}"
+                        );
+                    }
+                }
+            }
+            for (rix, sort) in function.rebuild_indexes.iter().zip(
+                function
+                    .schema
+                    .input
+                    .iter()
+                    .chain(once(&function.schema.output)),
+            ) {
+                assert!(sort.is_eq_container_sort() == rix.is_some());
+                if sort.is_eq_container_sort() {
+                    let rix = rix.as_ref().unwrap();
+                    for ix in rix.iter() {
+                        for (_, offs) in ix.iter() {
+                            for off in offs {
+                                assert!(
+                                (*off as usize) < function.nodes.num_offsets(),
+                                "index contains offset {off:?}, which is out of range for function {name}"
+                            );
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    // find the leader term for this term
+    // in the corresponding table
+    pub fn find(&self, id: Id) -> Id {
+        self.unionfind.find(id)
+    }
+
+    pub fn rebuild_nofail(&mut self) -> usize {
+        match self.rebuild() {
+            Ok(updates) => updates,
+            Err(e) => {
+                panic!("Unsoundness detected during rebuild. Exiting: {e}")
+            }
+        }
+    }
+
+    pub fn rebuild(&mut self) -> Result<usize, Error> {
+        self.unionfind.clear_recent_ids();
+        let mut updates = 0;
+        loop {
+            let new = self.rebuild_one()?;
+            log::debug!("{new} rebuilds?");
+            self.unionfind.clear_recent_ids();
+            updates += new;
+            if new == 0 {
+                break;
+            }
+        }
+
+        // now update global bindings
+        let mut new_global_bindings = std::mem::take(&mut self.global_bindings);
+        for (_sym, (sort, value, ts)) in new_global_bindings.iter_mut() {
+            if sort.canonicalize(value, &self.unionfind) {
+                *ts = self.timestamp;
+            }
+        }
+        self.global_bindings = new_global_bindings;
+
+        self.debug_assert_invariants();
+        Ok(updates)
+    }
+
+    fn rebuild_one(&mut self) -> Result<usize, Error> {
+        let mut new_unions = 0;
+        let mut deferred_merges = Vec::new();
+        for function in self.functions.values_mut() {
+            let (unions, merges) = function.rebuild(&mut self.unionfind, self.timestamp)?;
+            if !merges.is_empty() {
+                deferred_merges.push((function.decl.name, merges));
+            }
+            new_unions += unions;
+        }
+        for (func, merges) in deferred_merges {
+            new_unions += self.apply_merges(func, &merges);
+        }
+
+        Ok(new_unions)
+    }
+
+    fn apply_merges(&mut self, func: Symbol, merges: &[DeferredMerge]) -> usize {
+        let mut stack = Vec::new();
+        let mut function = self.functions.get_mut(&func).unwrap();
+        let n_unions = self.unionfind.n_unions();
+        let merge_prog = match &function.merge.merge_vals {
+            MergeFn::Expr(e) => Some(e.clone()),
+            MergeFn::AssertEq | MergeFn::Union => None,
+        };
+
+        for (inputs, old, new) in merges {
+            if let Some(prog) = function.merge.on_merge.clone() {
+                self.run_actions(&mut stack, &[*old, *new], &prog, true)
+                    .unwrap();
+                function = self.functions.get_mut(&func).unwrap();
+                stack.clear();
+            }
+            if let Some(prog) = &merge_prog {
+                // TODO: error handling?
+                self.run_actions(&mut stack, &[*old, *new], prog, true)
+                    .unwrap();
+                let merged = stack.pop().expect("merges should produce a value");
+                stack.clear();
+                function = self.functions.get_mut(&func).unwrap();
+                function.insert(inputs, merged, self.timestamp);
+            }
+        }
+        self.unionfind.n_unions() - n_unions + function.clear_updates()
+    }
+
+    pub fn declare_function(&mut self, decl: &FunctionDecl) -> Result<(), Error> {
+        let function = Function::new(self, decl)?;
+        let old = self.functions.insert(decl.name, function);
+        if old.is_some() {
+            panic!(
+                "Typechecking should have caught function already bound: {}",
+                decl.name
+            );
+        }
+
+        Ok(())
+    }
+
+    pub fn declare_constructor(
+        &mut self,
+        variant: Variant,
+        sort: impl Into<Symbol>,
+    ) -> Result<(), Error> {
+        let name = variant.name;
+        let sort = sort.into();
+        self.declare_function(&FunctionDecl {
+            name,
+            schema: Schema {
+                input: variant.types,
+                output: sort,
+            },
+            merge: None,
+            merge_action: vec![],
+            default: None,
+            cost: variant.cost,
+            unextractable: false,
+        })?;
+        // if let Some(ctors) = self.sorts.get_mut(&sort) {
+        //     ctors.push(name);
+        // }
+        Ok(())
+    }
+
+    pub fn eval_lit(&self, lit: &Literal) -> Value {
+        match lit {
+            Literal::Int(i) => i.store(&self.proof_state.type_info.get_sort()).unwrap(),
+            Literal::F64(f) => f.store(&self.proof_state.type_info.get_sort()).unwrap(),
+            Literal::String(s) => s.store(&self.proof_state.type_info.get_sort()).unwrap(),
+            Literal::Unit => ().store(&self.proof_state.type_info.get_sort()).unwrap(),
+        }
+    }
+
+    pub fn function_to_dag(
+        &mut self,
+        sym: Symbol,
+        n: usize,
+    ) -> Result<(Vec<(Term, Term)>, TermDag), Error> {
+        let f = self.functions.get(&sym).ok_or(TypeError::Unbound(sym))?;
+        let schema = f.schema.clone();
+        let nodes = f
+            .nodes
+            .iter()
+            .take(n)
+            .map(|(k, v)| (ValueVec::from(k), v.clone()))
+            .collect::<Vec<_>>();
+
+        let mut termdag = TermDag::default();
+        let extractor = Extractor::new(self, &mut termdag);
+        let mut terms = Vec::new();
+        for (ins, out) in nodes {
+            let mut children = Vec::new();
+            for (a, a_type) in ins.iter().copied().zip(&schema.input) {
+                if a_type.is_eq_sort() {
+                    children.push(extractor.find_best(a, &mut termdag, a_type).unwrap().1);
+                } else {
+                    children.push(termdag.expr_to_term(&a_type.make_expr(self, a).1));
+                };
+            }
+
+            let out = if schema.output.is_eq_sort() {
+                extractor
+                    .find_best(out.value, &mut termdag, &schema.output)
+                    .unwrap()
+                    .1
+            } else {
+                termdag.expr_to_term(&schema.output.make_expr(self, out.value).1)
+            };
+            terms.push((termdag.app(sym, children), out));
+        }
+        drop(extractor);
+
+        Ok((terms, termdag))
+    }
+
+    pub fn print_function(&mut self, sym: Symbol, n: usize) -> Result<(), Error> {
+        log::info!("Printing up to {n} tuples of table {sym}: ");
+        let (terms_with_outputs, termdag) = self.function_to_dag(sym, n)?;
+        let f = self
+            .functions
+            .get(&sym)
+            .ok_or(TypeError::UnboundFunction(sym))?;
+        let out_is_unit = f.schema.output.name() == UNIT_SYM.into();
+
+        let mut buf = String::new();
+        let s = &mut buf;
+        s.push_str("(\n");
+        if terms_with_outputs.is_empty() {
+            log::info!("   (none)");
+        }
+        for (term, output) in terms_with_outputs {
+            let tuple_str = format!(
+                "   {}{}",
+                termdag.to_string(&term),
+                if !out_is_unit {
+                    format!(" -> {}", termdag.to_string(&output))
+                } else {
+                    "".into()
+                },
+            );
+            log::info!("{}", tuple_str);
+            s.push_str(&tuple_str);
+            s.push('\n');
+        }
+        s.push_str(")\n");
+        self.print_msg(buf);
+        Ok(())
+    }
+
+    pub fn print_size(&mut self, sym: Symbol) -> Result<(), Error> {
+        let f = self.functions.get(&sym).ok_or(TypeError::Unbound(sym))?;
+        log::info!("Function {} has size {}", sym, f.nodes.len());
+        self.print_msg(f.nodes.len().to_string());
+        Ok(())
+    }
+
+    // returns whether the egraph was updated
+    pub fn run_schedule(&mut self, sched: &NormSchedule) -> RunReport {
+        match sched {
+            NormSchedule::Run(config) => self.run_rules(config),
+            NormSchedule::Repeat(limit, sched) => {
+                let mut report = RunReport::default();
+                for _i in 0..*limit {
+                    let rec = self.run_schedule(sched);
+                    report = report.union(&rec);
+                    if !rec.updated {
+                        break;
+                    }
+                }
+                report
+            }
+            NormSchedule::Saturate(sched) => {
+                let mut report = RunReport::default();
+                loop {
+                    let rec = self.run_schedule(sched);
+                    report = report.union(&rec);
+                    if !rec.updated {
+                        break;
+                    }
+                }
+                report
+            }
+            NormSchedule::Sequence(scheds) => {
+                let mut report = RunReport::default();
+                for sched in scheds {
+                    report = report.union(&self.run_schedule(sched));
+                }
+                report
+            }
+        }
+    }
+
+    pub fn run_rules_once(&mut self, config: &NormRunConfig, report: &mut RunReport) {
+        // first rebuild
+        let rebuild_start = Instant::now();
+        let updates = self.rebuild_nofail();
+        log::debug!("database size: {}", self.num_tuples());
+        log::debug!("Made {updates} updates");
+        report.rebuild_time += rebuild_start.elapsed();
+        self.timestamp += 1;
+
+        let NormRunConfig { ruleset, until } = config;
+
+        if let Some(facts) = until {
+            if self.check_facts(facts).is_ok() {
+                log::info!(
+                    "Breaking early because of facts:\n {}!",
+                    ListDisplay(facts, "\n")
+                );
+                return;
+            }
+        }
+
+        let subreport = self.step_rules(*ruleset);
+        *report = report.union(&subreport);
+
+        log::debug!("database size: {}", self.num_tuples());
+        self.timestamp += 1;
+
+        if self.num_tuples() > self.node_limit {
+            log::warn!("Node limit reached, {} nodes. Stopping!", self.num_tuples());
+        }
+    }
+
+    pub fn run_rules(&mut self, config: &NormRunConfig) -> RunReport {
+        let mut report: RunReport = Default::default();
+
+        self.run_rules_once(config, &mut report);
+
+        // Report the worst offenders
+        log::debug!("Slowest rules:\n{}", {
+            let mut msg = String::new();
+            let mut vec = self
+                .rulesets
+                .iter()
+                .flat_map(|(_name, rules)| rules)
+                .collect::<Vec<_>>();
+            vec.sort_by_key(|(_, r)| r.search_time + r.apply_time);
+            for (name, rule) in vec.iter().rev().take(5) {
+                write!(
+                    msg,
+                    "{name}\n  Search: {:.3}s\n  Apply: {:.3}s\n",
+                    rule.search_time.as_secs_f64(),
+                    rule.apply_time.as_secs_f64()
+                )
+                .unwrap();
+            }
+            msg
+        });
+
+        // // TODO detect functions
+        // for (name, r) in &self.functions {
+        //     log::debug!("{name}:");
+        //     for (args, val) in &r.nodes {
+        //         log::debug!("  {args:?} = {val:?}");
+        //     }
+        // }
+        report
+    }
+
+    fn step_rules(&mut self, ruleset: Symbol) -> RunReport {
+        let n_unions_before = self.unionfind.n_unions();
+        // don't ban parent or rebuilding
+        let match_limit =
+            if ruleset.as_str().contains("parent_") || ruleset.as_str().contains("rebuilding_") {
+                usize::MAX
+            } else {
+                self.match_limit
+            };
+        let mut report = RunReport::default();
+
+        let ban_length = 5;
+
+        if !self.rulesets.contains_key(&ruleset) {
+            panic!("run: No ruleset named '{ruleset}'");
+        }
+        let mut rules: HashMap<Symbol, Rule> =
+            std::mem::take(self.rulesets.get_mut(&ruleset).unwrap());
+        let iteration = *self.ruleset_iteration.entry(ruleset).or_default();
+        self.ruleset_iteration.insert(ruleset, iteration + 1);
+        // TODO why did I have to copy the rules here for the first for loop?
+        let copy_rules = rules.clone();
+        let search_start = Instant::now();
+        let mut searched = vec![];
+        for (name, rule) in copy_rules.iter() {
+            let mut all_values = vec![];
+            if rule.banned_until <= iteration {
+                let mut fuel = safe_shl(match_limit, rule.times_banned);
+                let rule_search_start = Instant::now();
+                self.run_query(&rule.query, rule.todo_timestamp, |values| {
+                    assert_eq!(values.len(), rule.query.vars.len());
+                    all_values.extend_from_slice(values);
+                    if fuel > 0 {
+                        fuel -= 1;
+                        Ok(())
+                    } else {
+                        Err(())
+                    }
+                });
+                let rule_search_time = rule_search_start.elapsed();
+                log::trace!(
+                    "Searched for {name} in {:.3}s ({} results)",
+                    rule_search_time.as_secs_f64(),
+                    all_values.len()
+                );
+                searched.push((name, all_values, rule_search_time));
+            }
+        }
+
+        let search_elapsed = search_start.elapsed();
+        report.search_time += search_elapsed;
+
+        let apply_start = Instant::now();
+        for (name, all_values, time) in searched {
+            let rule = rules.get_mut(name).unwrap();
+            rule.search_time += time;
+            let num_vars = rule.query.vars.len();
+
+            // the query doesn't require matches
+            if num_vars != 0 {
+                // backoff logic
+                let len = all_values.len() / num_vars;
+                let threshold = safe_shl(match_limit, rule.times_banned);
+                if len > threshold {
+                    let ban_length = safe_shl(ban_length, rule.times_banned);
+                    rule.times_banned = rule.times_banned.saturating_add(1);
+                    rule.banned_until = iteration + ban_length;
+                    log::info!("Banning rule {name} for {ban_length} iterations, matched {len} > {threshold} times");
+                    report.updated = true;
+                    continue;
+                }
+            }
+
+            rule.todo_timestamp = self.timestamp;
+            let rule_apply_start = Instant::now();
+
+            let stack = &mut vec![];
+            // run one iteration when n == 0
+            if num_vars == 0 {
+                rule.matches += 1;
+                // we can ignore results here
+                stack.clear();
+                let _ = self.run_actions(stack, &[], &rule.program, true);
+            } else {
+                for values in all_values.chunks(num_vars) {
+                    rule.matches += 1;
+                    // we can ignore results here
+                    stack.clear();
+                    let _ = self.run_actions(stack, values, &rule.program, true);
+                }
+            }
+
+            rule.apply_time += rule_apply_start.elapsed();
+        }
+        self.rulesets.insert(ruleset, rules);
+        let apply_elapsed = apply_start.elapsed();
+        report.apply_time += apply_elapsed;
+        report.updated |= self.did_change_tables() || n_unions_before != self.unionfind.n_unions();
+
+        report
+    }
+
+    fn did_change_tables(&self) -> bool {
+        for (_name, function) in &self.functions {
+            if function.nodes.max_ts() >= self.timestamp {
+                return true;
+            }
+        }
+
+        false
+    }
+
+    fn add_rule_with_name(
+        &mut self,
+        name: String,
+        rule: ast::Rule,
+        ruleset: Symbol,
+    ) -> Result<Symbol, Error> {
+        let name = Symbol::from(name);
+        let mut ctx = typecheck::Context::new(self);
+        let (query0, action0) = ctx
+            .typecheck_query(&rule.body, &rule.head)
+            .map_err(Error::TypeErrors)?;
+        let query = self.compile_gj_query(query0, &ctx.types);
+        let program = self
+            .compile_actions(&ctx.types, &action0)
+            .map_err(Error::TypeErrors)?;
+        // println!(
+        //     "Compiled rule {rule:?}\n{subst:?}to {program:#?}",
+        //     subst = &ctx.types
+        // );
+        let compiled_rule = Rule {
+            query,
+            matches: 0,
+            times_banned: 0,
+            banned_until: 0,
+            todo_timestamp: 0,
+            program,
+            search_time: Duration::default(),
+            apply_time: Duration::default(),
+        };
+        if let Some(rules) = self.rulesets.get_mut(&ruleset) {
+            match rules.entry(name) {
+                Entry::Occupied(_) => panic!("Rule '{name}' was already present"),
+                Entry::Vacant(e) => e.insert(compiled_rule),
+            };
+        } else {
+            panic!("No such ruleset {ruleset}");
+        }
+        Ok(name)
+    }
+
+    pub fn add_rule(&mut self, rule: ast::Rule, ruleset: Symbol) -> Result<Symbol, Error> {
+        let name = format!("{}", rule);
+        self.add_rule_with_name(name, rule, ruleset)
+    }
+
+    pub fn eval_actions(&mut self, actions: &[Action]) -> Result<(), Error> {
+        let types = Default::default();
+        let program = self
+            .compile_actions(&types, actions)
+            .map_err(Error::TypeErrors)?;
+        let mut stack = vec![];
+        self.run_actions(&mut stack, &[], &program, true)?;
+        Ok(())
+    }
+
+    pub fn eval_expr(
+        &mut self,
+        expr: &Expr,
+        expected_type: Option<ArcSort>,
+        make_defaults: bool,
+    ) -> Result<(ArcSort, Value), Error> {
+        let types = Default::default();
+        let (t, program) = self
+            .compile_expr(&types, expr, expected_type)
+            .map_err(Error::TypeErrors)?;
+        let mut stack = vec![];
+        self.run_actions(&mut stack, &[], &program, make_defaults)?;
+        assert_eq!(stack.len(), 1);
+        Ok((t, stack.pop().unwrap()))
+    }
+
+    fn add_ruleset(&mut self, name: Symbol) {
+        match self.rulesets.entry(name) {
+            Entry::Occupied(_) => panic!("Ruleset '{name}' was already present"),
+            Entry::Vacant(e) => e.insert(Default::default()),
+        };
+    }
+
+    pub fn set_option(&mut self, name: &str, value: Expr) {
+        match name {
+            "enable_proofs" => {
+                self.proofs_enabled = true;
+            }
+            "interactive_mode" => {
+                if let Expr::Lit(Literal::Int(i)) = value {
+                    self.interactive_mode = i != 0;
+                } else {
+                    panic!("interactive_mode must be an integer");
+                }
+            }
+            "match_limit" => {
+                if let Expr::Lit(Literal::Int(i)) = value {
+                    self.match_limit = i as usize;
+                } else {
+                    panic!("match_limit must be an integer");
+                }
+            }
+            "node_limit" => {
+                if let Expr::Lit(Literal::Int(i)) = value {
+                    self.node_limit = i as usize;
+                } else {
+                    panic!("node_limit must be an integer");
+                }
+            }
+            _ => panic!("Unknown option '{}'", name),
+        }
+    }
+
+    fn check_facts(&mut self, facts: &[NormFact]) -> Result<(), Error> {
+        let mut ctx = typecheck::Context::new(self);
+        let converted_facts = facts.iter().map(|f| f.to_fact()).collect::<Vec<Fact>>();
+        let empty_actions = vec![];
+        let (query0, _) = ctx
+            .typecheck_query(&converted_facts, &empty_actions)
+            .map_err(Error::TypeErrors)?;
+        let query = self.compile_gj_query(query0, &ctx.types);
+
+        let mut matched = false;
+        // TODO what timestamp to use?
+        self.run_query(&query, 0, |values| {
+            assert_eq!(values.len(), query.vars.len());
+            matched = true;
+            Err(())
+        });
+        if !matched {
+            // TODO add useful info here
+            Err(Error::CheckError(facts.to_vec()))
+        } else {
+            Ok(())
+        }
+    }
+
+    fn run_command(&mut self, command: NCommand, should_run: bool) -> Result<(), Error> {
+        let pre_rebuild = Instant::now();
+        self.extract_report = None;
+        self.run_report = None;
+        let rebuild_num = self.rebuild()?;
+        if rebuild_num > 0 {
+            log::info!(
+                "Rebuild before command: {:10}ms",
+                pre_rebuild.elapsed().as_millis()
+            );
+        }
+
+        self.debug_assert_invariants();
+
+        self.extract_report = None;
+        self.run_report = None;
+        match command {
+            NCommand::SetOption { name, value } => {
+                let str = format!("Set option {} to {}", name, value);
+                self.set_option(name.into(), value);
+                log::info!("{}", str)
+            }
+            // Sorts are already declared during typechecking
+            NCommand::Sort(name, _presort_and_args) => log::info!("Declared sort {}.", name),
+            NCommand::Function(fdecl) => {
+                self.declare_function(&fdecl)?;
+                log::info!("Declared function {}.", fdecl.name)
+            }
+            NCommand::AddRuleset(name) => {
+                self.add_ruleset(name);
+                log::info!("Declared ruleset {name}.");
+            }
+            NCommand::NormRule {
+                ruleset,
+                rule,
+                name,
+            } => {
+                self.add_rule(rule.to_rule(), ruleset)?;
+                log::info!("Declared rule {name}.")
+            }
+            NCommand::RunSchedule(sched) => {
+                if should_run {
+                    self.run_report = Some(self.run_schedule(&sched));
+                    log::info!("Ran schedule {}.", sched)
+                } else {
+                    log::warn!("Skipping schedule.")
+                }
+            }
+            NCommand::Check(facts) => {
+                if should_run {
+                    self.check_facts(&facts)?;
+                    log::info!("Checked fact {:?}.", facts);
+                } else {
+                    log::warn!("Skipping check.")
+                }
+            }
+            NCommand::CheckProof => log::error!("TODO implement proofs"),
+            NCommand::NormAction(action) => {
+                if should_run {
+                    match &action {
+                        NormAction::Let(name, contents) => {
+                            let (etype, value) = self.eval_expr(&contents.to_expr(), None, true)?;
+                            let present = self
+                                .global_bindings
+                                .insert(*name, (etype, value, self.timestamp));
+                            if present.is_some() {
+                                panic!("Variable {name} was already present in global bindings");
+                            }
+                        }
+                        NormAction::LetVar(var1, var2) => {
+                            let value = self.global_bindings.get(var2).unwrap();
+                            let present = self.global_bindings.insert(*var1, value.clone());
+                            if present.is_some() {
+                                panic!("Variable {var1} was already present in global bindings");
+                            }
+                        }
+                        NormAction::LetLit(var, lit) => {
+                            let value = self.eval_lit(lit);
+                            let etype = self.proof_state.type_info.infer_literal(lit);
+                            let present = self
+                                .global_bindings
+                                .insert(*var, (etype, value, self.timestamp));
+
+                            if present.is_some() {
+                                panic!("Variable {var} was already present in global bindings");
+                            }
+                        }
+                        _ => {
+                            self.eval_actions(std::slice::from_ref(&action.to_action()))?;
+                        }
+                    }
+                } else {
+                    log::warn!("Skipping running {action}.")
+                }
+            }
+            NCommand::Push(n) => {
+                (0..n).for_each(|_| self.push());
+                log::info!("Pushed {n} levels.")
+            }
+            NCommand::Pop(n) => {
+                for _ in 0..n {
+                    self.pop()?;
+                }
+                log::info!("Popped {n} levels.")
+            }
+            NCommand::PrintTable(f, n) => {
+                self.print_function(f, n)?;
+            }
+            NCommand::PrintSize(f) => {
+                self.print_size(f)?;
+            }
+            NCommand::Fail(c) => {
+                let result = self.run_command(*c, should_run);
+                if let Err(e) = result {
+                    log::info!("Command failed as expected: {}", e);
+                } else {
+                    return Err(Error::ExpectFail);
+                }
+            }
+            NCommand::Input { name, file } => {
+                let func = self.functions.get_mut(&name).unwrap();
+                let is_unit = func.schema.output.name().as_str() == "Unit";
+
+                let mut filename = self.fact_directory.clone().unwrap_or_default();
+                filename.push(file.as_str());
+
+                // check that the function uses supported types
+                for t in &func.schema.input {
+                    match t.name().as_str() {
+                        "i64" | "String" => {}
+                        s => panic!("Unsupported type {} for input", s),
+                    }
+                }
+                match func.schema.output.name().as_str() {
+                    "i64" | "String" | "Unit" => {}
+                    s => panic!("Unsupported type {} for input", s),
+                }
+
+                log::info!("Opening file '{:?}'...", filename);
+                let mut f = File::open(filename).unwrap();
+                let mut contents = String::new();
+                f.read_to_string(&mut contents).unwrap();
+
+                let mut actions: Vec<Action> = vec![];
+                let mut str_buf: Vec<&str> = vec![];
+                for line in contents.lines() {
+                    str_buf.clear();
+                    str_buf.extend(line.split('\t').map(|s| s.trim()));
+                    if str_buf.is_empty() {
+                        continue;
+                    }
+
+                    let parse = |s: &str| -> Expr {
+                        if let Ok(i) = s.parse() {
+                            Expr::Lit(Literal::Int(i))
+                        } else {
+                            Expr::Lit(Literal::String(s.into()))
+                        }
+                    };
+
+                    let mut exprs: Vec<Expr> = str_buf.iter().map(|&s| parse(s)).collect();
+
+                    actions.push(if is_unit {
+                        Action::Expr(Expr::Call(name, exprs))
+                    } else {
+                        let out = exprs.pop().unwrap();
+                        Action::Set(name, exprs, out)
+                    });
+                }
+                self.eval_actions(&actions)?;
+                log::info!("Read {} facts into {name} from '{file}'.", actions.len())
+            }
+            NCommand::Output { file, exprs } => {
+                let mut filename = self.fact_directory.clone().unwrap_or_default();
+                filename.push(file.as_str());
+                // append to file
+                let mut f = File::options()
+                    .write(true)
+                    .append(true)
+                    .create(true)
+                    .open(&filename)
+                    .map_err(|e| Error::IoError(filename.clone(), e))?;
+
+                for expr in exprs {
+                    use std::io::Write;
+                    let res = self.extract_expr(expr, 1)?;
+                    writeln!(f, "{}", res.termdag.to_string(&res.expr))
+                        .map_err(|e| Error::IoError(filename.clone(), e))?;
+                }
+
+                log::info!("Output to '{filename:?}'.")
+            }
+        };
+        Ok(())
+    }
+
+    pub fn clear(&mut self) {
+        for f in self.functions.values_mut() {
+            f.clear();
+        }
+    }
+
+    // Extract an expression from the current state, returning the cost, the extracted expression and some number
+    // of other variants, if variants is not zero.
+    pub fn extract_expr(&mut self, e: Expr, num_variants: usize) -> Result<ExtractReport, Error> {
+        let (t, value) = self.eval_expr(&e, None, true)?;
+        let mut termdag = TermDag::default();
+        let (cost, expr) = self.extract(value, &mut termdag, &t);
+        let variants = match num_variants {
+            0 => vec![],
+            1 => vec![expr.clone()],
+            _ => {
+                if self.get_sort(&value).is_some_and(|sort| sort.is_eq_sort()) {
+                    self.extract_variants(value, num_variants, &mut termdag)
+                } else {
+                    vec![expr.clone()]
+                }
+            }
+        };
+        Ok(ExtractReport {
+            cost,
+            expr,
+            variants,
+            termdag,
+        })
+    }
+
+    pub fn process_commands(
+        &mut self,
+        program: Vec<Command>,
+        stop: CompilerPassStop,
+    ) -> Result<Vec<NormCommand>, Error> {
+        let mut result = vec![];
+
+        for command in program {
+            match command {
+                Command::Push(num) => {
+                    for _ in 0..num {
+                        self.push();
+                    }
+                }
+                Command::Pop(num) => {
+                    for _ in 0..num {
+                        self.pop()
+                            .expect("Failed to desugar, popped too many times");
+                    }
+                }
+                _ => {}
+            }
+            result.extend(self.process_command(command, stop)?);
+        }
+        Ok(result)
+    }
+
+    pub fn set_underscores_for_desugaring(&mut self, underscores: usize) {
+        self.proof_state.desugar.number_underscores = underscores;
+    }
+
+    fn process_command(
+        &mut self,
+        command: Command,
+        stop: CompilerPassStop,
+    ) -> Result<Vec<NormCommand>, Error> {
+        let program = self.proof_state.desugar.desugar_program(
+            vec![command],
+            self.test_proofs,
+            self.seminaive,
+        )?;
+        if stop == CompilerPassStop::Desugar {
+            return Ok(program);
+        }
+
+        let type_info_before = self.proof_state.type_info.clone();
+
+        self.proof_state.type_info.typecheck_program(&program)?;
+        if stop == CompilerPassStop::TypecheckDesugared {
+            return Ok(program);
+        }
+
+        // reset type info
+        self.proof_state.type_info = type_info_before;
+        self.proof_state.type_info.typecheck_program(&program)?;
+        if stop == CompilerPassStop::TypecheckTermEncoding {
+            return Ok(program);
+        }
+
+        Ok(program)
+    }
+
+    pub fn run_program(&mut self, program: Vec<Command>) -> Result<Vec<String>, Error> {
+        let should_run = true;
+
+        for command in program {
+            // Important to process each command individually
+            // because push and pop create new scopes
+            for processed in self.process_command(command, CompilerPassStop::All)? {
+                self.run_command(processed.command, should_run)?;
+            }
+        }
+        log::logger().flush();
+
+        // remove consecutive empty lines
+        Ok(self.flush_msgs())
+    }
+
+    // this is bad because we shouldn't inspect values like this, we should use type information
+    fn bad_find_value(&self, value: Value) -> Value {
+        if let Some((tag, id)) = self.value_to_id(value) {
+            Value::from_id(tag, self.find(id))
+        } else {
+            value
+        }
+    }
+
+    pub fn parse_program(&self, input: &str) -> Result<Vec<Command>, Error> {
+        self.proof_state.desugar.parse_program(input)
+    }
+
+    pub fn parse_and_run_program(&mut self, input: &str) -> Result<Vec<String>, Error> {
+        let parsed = self.proof_state.desugar.parse_program(input)?;
+        self.run_program(parsed)
+    }
+
+    pub fn num_tuples(&self) -> usize {
+        self.functions.values().map(|f| f.nodes.len()).sum()
+    }
+
+    pub(crate) fn get_sort(&self, value: &Value) -> Option<&ArcSort> {
+        self.proof_state.type_info.sorts.get(&value.tag)
+    }
+
+    pub fn add_arcsort(&mut self, arcsort: ArcSort) -> Result<(), TypeError> {
+        self.proof_state.type_info.add_arcsort(arcsort)
+    }
+
+    /// Gets the last extract report and returns it, if the last command saved it.
+    pub fn get_extract_report(&self) -> &Option<ExtractReport> {
+        &self.extract_report
+    }
+
+    /// Gets the last run report and returns it, if the last command saved it.
+    pub fn get_run_report(&self) -> &Option<RunReport> {
+        &self.run_report
+    }
+
+    /// Serializes the egraph for export to graphviz.
+    pub fn serialize_for_graphviz(&self) -> egraph_serialize::EGraph {
+        let mut serialized = self.serialize(SerializeConfig::default());
+        serialized.inline_leaves();
+        serialized
+    }
+
+    pub(crate) fn print_msg(&mut self, msg: String) {
+        self.msgs.push(msg);
+    }
+
+    fn flush_msgs(&mut self) -> Vec<String> {
+        self.msgs.dedup_by(|a, b| a.is_empty() && b.is_empty());
+        std::mem::take(&mut self.msgs)
+    }
+}
+
+#[derive(Debug, Error)]
+pub enum Error {
+    #[error(transparent)]
+    ParseError(#[from] lalrpop_util::ParseError<usize, String, String>),
+    #[error(transparent)]
+    NotFoundError(#[from] NotFoundError),
+    #[error(transparent)]
+    TypeError(#[from] TypeError),
+    #[error("Errors:\n{}", ListDisplay(.0, "\n"))]
+    TypeErrors(Vec<TypeError>),
+    #[error("Check failed: \n{}", ListDisplay(.0, "\n"))]
+    CheckError(Vec<NormFact>),
+    #[error("Evaluating primitive {0:?} failed. ({0:?} {:?})", ListDebug(.1, " "))]
+    PrimitiveError(Primitive, Vec<Value>),
+    #[error("Illegal merge attempted for function {0}, {1:?} != {2:?}")]
+    MergeError(Symbol, Value, Value),
+    #[error("Tried to pop too much")]
+    Pop,
+    #[error("Command should have failed.")]
+    ExpectFail,
+    #[error("IO error: {0}: {1}")]
+    IoError(PathBuf, std::io::Error),
+}
+
+fn safe_shl(a: usize, b: usize) -> usize {
+    a.checked_shl(b.try_into().unwrap()).unwrap_or(usize::MAX)
+}
+
\ No newline at end of file diff --git a/docs/src/egglog/proofs.rs.html b/docs/src/egglog/proofs.rs.html new file mode 100644 index 000000000..293c0badd --- /dev/null +++ b/docs/src/egglog/proofs.rs.html @@ -0,0 +1,23 @@ +proofs.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+
use crate::*;
+
+use crate::ast::desugar::Desugar;
+
+pub const RULE_PROOF_KEYWORD: &str = "rule-proof";
+
+#[derive(Default, Clone)]
+pub(crate) struct ProofState {
+    pub(crate) desugar: Desugar,
+    pub(crate) type_info: TypeInfo,
+}
+
\ No newline at end of file diff --git a/docs/src/egglog/serialize.rs.html b/docs/src/egglog/serialize.rs.html new file mode 100644 index 000000000..fdc8420f0 --- /dev/null +++ b/docs/src/egglog/serialize.rs.html @@ -0,0 +1,415 @@ +serialize.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+
use ordered_float::NotNan;
+use std::collections::VecDeque;
+
+use crate::{
+    ast::{FunctionDecl, Id},
+    function::{table::hash_values, ValueVec},
+    util::HashMap,
+    EGraph, Value,
+};
+
+pub struct SerializeConfig {
+    // Maximumum number of functions to include in the serialized graph, any after this will be discarded
+    pub max_functions: Option<usize>,
+    // Maximum number of calls to include per function, any after this will be discarded
+    pub max_calls_per_function: Option<usize>,
+    // Whether to include temporary functions in the serialized graph
+    pub include_temporary_functions: bool,
+}
+
+impl Default for SerializeConfig {
+    fn default() -> Self {
+        SerializeConfig {
+            max_functions: Some(40),
+            max_calls_per_function: Some(40),
+            include_temporary_functions: false,
+        }
+    }
+}
+
+impl EGraph {
+    /// Serialize the egraph into a format that can be read by the egraph-serialize crate.
+    ///
+    /// There are multiple different semantically valid ways to do this.
+    ///
+    /// For node costs:
+    /// - Primitives: 1.0
+    /// - Function without costs: 1.0
+    /// - Function with costs: the cost
+    ///
+    /// For node IDs:
+    /// - Functions: Function name + hash of input values
+    /// - Args which are eq sorts: Choose one ID from the e-class, distribute roughly evenly.
+    /// - Args and outputs values which are primitives: Sort name + hash of value
+    ///
+    /// For e-classes:
+    /// - Eq sorts: Use the canonical ID of the e-class
+    /// - Primitives: Use the node ID
+    ///
+    /// This is to achieve the following properties:
+    /// - Equivalent primitive values will show up once in the e-graph.
+    /// - Functions which return primitive values will be added to the e-class of that value.
+    /// - Nodes will have consistant IDs throughout execution of e-graph (used for animating changes in the visualization)
+    /// - Edges in the visualization will be well distributed (used for animating changes in the visualization)
+    ///   (Note that this will be changed in `<https://github.com/egraphs-good/egglog/pull/158>` so that edges point to exact nodes instead of looking up the e-class)
+    pub fn serialize(&self, config: SerializeConfig) -> egraph_serialize::EGraph {
+        // First collect a list of all the calls we want to serialize, into the function decl, the inputs, and the output, and if its an eq sort
+        let all_calls: Vec<(&FunctionDecl, &ValueVec, &Value, egraph_serialize::NodeId)> = self
+            .functions
+            .values()
+            .filter(|f| {
+                config.include_temporary_functions || !self.is_temp_name(f.decl.name.to_string())
+            })
+            .map(|function| {
+                function
+                    .nodes
+                    .vals
+                    .iter()
+                    .filter(|(i, _)| i.live())
+                    .take(config.max_calls_per_function.unwrap_or(usize::MAX))
+                    .map(|(input, output)| {
+                        (
+                            &function.decl,
+                            &input.data,
+                            &output.value,
+                            format!("{}-{}", function.decl.name, hash_values(&input.data)).into(),
+                        )
+                    })
+                    .collect::<Vec<_>>()
+            })
+            // Filter out functions with no calls
+            .filter(|f| !f.is_empty())
+            .take(config.max_functions.unwrap_or(usize::MAX))
+            .flatten()
+            .collect();
+
+        // Then create a mapping from each canonical e-class ID to the set of node IDs in that e-class
+        // Note that this is only for e-classes, primitives have e-classes equal to their node ID
+        let mut node_ids: NodeIDs = all_calls
+            .iter()
+            .filter_map(|(_decl, _input, output, node_id)| {
+                if self.get_sort(output).unwrap().is_eq_sort() {
+                    let id = output.bits as usize;
+                    let canonical: usize = self.unionfind.find(Id::from(id)).into();
+                    let canonical_id: egraph_serialize::ClassId = canonical.to_string().into();
+                    Some((canonical_id, node_id))
+                } else {
+                    None
+                }
+            })
+            .fold(HashMap::default(), |mut acc, (canonical_id, node_id)| {
+                acc.entry(canonical_id)
+                    .or_insert_with(VecDeque::new)
+                    .push_back(node_id.clone());
+                acc
+            });
+        let mut egraph = egraph_serialize::EGraph::default();
+        for (decl, input, output, node_id) in all_calls {
+            let eclass = self.serialize_value(&mut egraph, &mut node_ids, output).0;
+            let children: Vec<_> = input
+                .iter()
+                // Filter out children which don't have an ID, meaning that we skipped emitting them due to size constraints
+                .filter_map(|v| self.serialize_value(&mut egraph, &mut node_ids, v).1)
+                .collect();
+            egraph.nodes.insert(
+                node_id,
+                egraph_serialize::Node {
+                    op: decl.name.to_string(),
+                    eclass,
+                    cost: NotNan::new(decl.cost.unwrap_or(1) as f64).unwrap(),
+                    children,
+                },
+            );
+        }
+        egraph
+    }
+
+    /// Serialize the value and return the eclass and node ID
+    /// If this is a primitive value, we will add the node to the data, but if it is an eclass, we will not
+    fn serialize_value(
+        &self,
+        egraph: &mut egraph_serialize::EGraph,
+        node_ids: &mut NodeIDs,
+        value: &Value,
+    ) -> (egraph_serialize::ClassId, Option<egraph_serialize::NodeId>) {
+        let sort = self.get_sort(value).unwrap();
+        let (class_id, node_id): (egraph_serialize::ClassId, Option<egraph_serialize::NodeId>) =
+            if sort.is_eq_sort() {
+                let id: usize = value.bits as usize;
+                let canonical: usize = self.unionfind.find(Id::from(id)).into();
+                let class_id: egraph_serialize::ClassId = canonical.to_string().into();
+                (class_id.clone(), get_node_id(node_ids, class_id))
+            } else {
+                let sort_name = sort.name().to_string();
+                let node_id_str = format!("{}-{}", sort_name, hash_values(vec![*value].as_slice()));
+                let (eclass, node_id): (egraph_serialize::ClassId, egraph_serialize::NodeId) =
+                    (node_id_str.clone().into(), node_id_str.into());
+                // Add node for value
+                {
+                    let children: Vec<egraph_serialize::NodeId> = sort
+                        .inner_values(value)
+                        .into_iter()
+                        .filter_map(|(_, v)| self.serialize_value(egraph, node_ids, &v).1)
+                        .collect();
+                    // If this is a container sort, use the name, otherwise use the value
+                    let op: String = if sort.is_container_sort() {
+                        log::warn!("{} is a container sort", sort.name());
+                        sort.name().to_string()
+                    } else {
+                        sort.make_expr(self, *value).1.to_string()
+                    };
+                    egraph.nodes.insert(
+                        node_id.clone(),
+                        egraph_serialize::Node {
+                            op,
+                            eclass: eclass.clone(),
+                            cost: NotNan::new(0.0).unwrap(),
+                            children,
+                        },
+                    );
+                };
+                (eclass, Some(node_id))
+            };
+        egraph.class_data.insert(
+            class_id.clone(),
+            egraph_serialize::ClassData {
+                typ: Some(sort.name().to_string()),
+            },
+        );
+        (class_id, node_id)
+    }
+
+    /// Returns true if the name is in the form v{digits}__
+    /// like v78___
+    ///
+    /// Checks for pattern created by Desugar.get_fresh
+    fn is_temp_name(&self, name: String) -> bool {
+        let number_underscores = self.proof_state.desugar.number_underscores;
+        let res = name.starts_with('v')
+            && name.ends_with("_".repeat(number_underscores).as_str())
+            && name[1..name.len() - number_underscores]
+                .parse::<u32>()
+                .is_ok();
+        res
+    }
+}
+
+type NodeIDs = HashMap<egraph_serialize::ClassId, VecDeque<egraph_serialize::NodeId>>;
+
+/// Returns the node ID for the given class ID, rotating the queue
+fn get_node_id(
+    node_ids: &mut HashMap<egraph_serialize::ClassId, VecDeque<egraph_serialize::NodeId>>,
+    class_id: egraph_serialize::ClassId,
+) -> Option<egraph_serialize::NodeId> {
+    let node_ids = node_ids.get_mut(&class_id)?;
+    node_ids.rotate_left(1);
+    Some(node_ids.front().unwrap().clone())
+}
+
\ No newline at end of file diff --git a/docs/src/egglog/sort/f64.rs.html b/docs/src/egglog/sort/f64.rs.html new file mode 100644 index 000000000..e5ac86c58 --- /dev/null +++ b/docs/src/egglog/sort/f64.rs.html @@ -0,0 +1,161 @@ +f64.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+
use super::*;
+use crate::ast::Literal;
+use ordered_float::OrderedFloat;
+
+#[derive(Debug)]
+pub struct F64Sort {
+    name: Symbol,
+}
+
+impl F64Sort {
+    pub fn new(name: Symbol) -> Self {
+        Self { name }
+    }
+}
+
+impl Sort for F64Sort {
+    fn name(&self) -> Symbol {
+        self.name
+    }
+
+    fn as_arc_any(self: Arc<Self>) -> Arc<dyn Any + Send + Sync + 'static> {
+        self
+    }
+
+    #[rustfmt::skip]
+    // We need the closure for division and mod operations, as they can panic.
+    // cf https://github.com/rust-lang/rust-clippy/issues/9422
+    #[allow(clippy::unnecessary_lazy_evaluations)]
+    fn register_primitives(self: Arc<Self>, eg: &mut TypeInfo) {
+        type Opt<T=()> = Option<T>;
+
+        add_primitives!(eg, "neg" = |a: f64| -> f64 { -a });
+
+        add_primitives!(eg, "+" = |a: f64, b: f64| -> f64 { a + b });
+        add_primitives!(eg, "-" = |a: f64, b: f64| -> f64 { a - b });
+        add_primitives!(eg, "*" = |a: f64, b: f64| -> f64 { a * b });
+        add_primitives!(eg, "/" = |a: f64, b: f64| -> Opt<f64> { (b != 0.0).then(|| a / b) });
+        add_primitives!(eg, "%" = |a: f64, b: f64| -> Opt<f64> { (b != 0.0).then(|| a % b) });
+
+        add_primitives!(eg, "<" = |a: f64, b: f64| -> Opt { (a < b).then(|| ()) });
+        add_primitives!(eg, ">" = |a: f64, b: f64| -> Opt { (a > b).then(|| ()) });
+        add_primitives!(eg, "<=" = |a: f64, b: f64| -> Opt { (a <= b).then(|| ()) });
+        add_primitives!(eg, ">=" = |a: f64, b: f64| -> Opt { (a >= b).then(|| ()) });
+
+        add_primitives!(eg, "min" = |a: f64, b: f64| -> f64 { a.min(b) });
+        add_primitives!(eg, "max" = |a: f64, b: f64| -> f64 { a.max(b) });
+        add_primitives!(eg, "abs" = |a: f64| -> f64 { a.abs() });
+
+        add_primitives!(eg, "to-f64" = |a: i64| -> f64 { a as f64 });
+        add_primitives!(eg, "to-i64" = |a: f64| -> i64 { a as i64 });
+        // Use debug instead of to_string so that decimal place is always printed
+        add_primitives!(eg, "to-string" = |a: f64| -> Symbol { format!("{:?}", a).into() });
+
+    }
+
+    fn make_expr(&self, _egraph: &EGraph, value: Value) -> (Cost, Expr) {
+        assert!(value.tag == self.name());
+        (
+            1,
+            Expr::Lit(Literal::F64(OrderedFloat(f64::from_bits(value.bits)))),
+        )
+    }
+}
+
+impl IntoSort for f64 {
+    type Sort = F64Sort;
+    fn store(self, sort: &Self::Sort) -> Option<Value> {
+        Some(Value {
+            tag: sort.name,
+            bits: self.to_bits(),
+        })
+    }
+}
+
+impl FromSort for f64 {
+    type Sort = F64Sort;
+    fn load(_sort: &Self::Sort, value: &Value) -> Self {
+        f64::from_bits(value.bits)
+    }
+}
+
\ No newline at end of file diff --git a/docs/src/egglog/sort/i64.rs.html b/docs/src/egglog/sort/i64.rs.html new file mode 100644 index 000000000..f6105dff6 --- /dev/null +++ b/docs/src/egglog/sort/i64.rs.html @@ -0,0 +1,171 @@ +i64.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+
use crate::ast::Literal;
+
+use super::*;
+
+#[derive(Debug)]
+pub struct I64Sort {
+    name: Symbol,
+}
+
+impl I64Sort {
+    pub fn new(name: Symbol) -> Self {
+        Self { name }
+    }
+}
+
+impl Sort for I64Sort {
+    fn name(&self) -> Symbol {
+        self.name
+    }
+
+    fn as_arc_any(self: Arc<Self>) -> Arc<dyn Any + Send + Sync + 'static> {
+        self
+    }
+
+    #[rustfmt::skip]
+    // We need the closure for division and mod operations, as they can panic.
+    // cf https://github.com/rust-lang/rust-clippy/issues/9422
+    #[allow(clippy::unnecessary_lazy_evaluations)]
+    fn register_primitives(self: Arc<Self>, typeinfo: &mut TypeInfo) {
+        typeinfo.add_primitive(TermOrderingMin {
+           });
+        typeinfo.add_primitive(TermOrderingMax {
+           });
+
+        type Opt<T=()> = Option<T>;
+
+        add_primitives!(typeinfo, "+" = |a: i64, b: i64| -> i64 { a + b });
+        add_primitives!(typeinfo, "-" = |a: i64, b: i64| -> i64 { a - b });
+        add_primitives!(typeinfo, "*" = |a: i64, b: i64| -> i64 { a * b });
+        add_primitives!(typeinfo, "/" = |a: i64, b: i64| -> Opt<i64> { (b != 0).then(|| a / b) });
+        add_primitives!(typeinfo, "%" = |a: i64, b: i64| -> Opt<i64> { (b != 0).then(|| a % b) });
+
+        add_primitives!(typeinfo, "&" = |a: i64, b: i64| -> i64 { a & b });
+        add_primitives!(typeinfo, "|" = |a: i64, b: i64| -> i64 { a | b });
+        add_primitives!(typeinfo, "^" = |a: i64, b: i64| -> i64 { a ^ b });
+        add_primitives!(typeinfo, "<<" = |a: i64, b: i64| -> Opt<i64> { b.try_into().ok().and_then(|b| a.checked_shl(b)) });
+        add_primitives!(typeinfo, ">>" = |a: i64, b: i64| -> Opt<i64> { b.try_into().ok().and_then(|b| a.checked_shr(b)) });
+        add_primitives!(typeinfo, "not-i64" = |a: i64| -> i64 { !a });
+
+        add_primitives!(typeinfo, "log2" = |a: i64| -> i64 { (a as i64).ilog2() as i64 });
+
+        add_primitives!(typeinfo, "<" = |a: i64, b: i64| -> Opt { (a < b).then(|| ()) });
+        add_primitives!(typeinfo, ">" = |a: i64, b: i64| -> Opt { (a > b).then(|| ()) });
+        add_primitives!(typeinfo, "<=" = |a: i64, b: i64| -> Opt { (a <= b).then(|| ()) });
+        add_primitives!(typeinfo, ">=" = |a: i64, b: i64| -> Opt { (a >= b).then(|| ()) });
+
+        add_primitives!(typeinfo, "min" = |a: i64, b: i64| -> i64 { a.min(b) });
+        add_primitives!(typeinfo, "max" = |a: i64, b: i64| -> i64 { a.max(b) });
+
+        add_primitives!(typeinfo, "to-string" = |a: i64| -> Symbol { a.to_string().into() });
+
+    }
+
+    fn make_expr(&self, _egraph: &EGraph, value: Value) -> (Cost, Expr) {
+        assert!(value.tag == self.name());
+        (1, Expr::Lit(Literal::Int(value.bits as _)))
+    }
+}
+
+impl IntoSort for i64 {
+    type Sort = I64Sort;
+    fn store(self, sort: &Self::Sort) -> Option<Value> {
+        Some(Value {
+            tag: sort.name,
+            bits: self as u64,
+        })
+    }
+}
+
+impl FromSort for i64 {
+    type Sort = I64Sort;
+    fn load(_sort: &Self::Sort, value: &Value) -> Self {
+        value.bits as Self
+    }
+}
+
\ No newline at end of file diff --git a/docs/src/egglog/sort/macros.rs.html b/docs/src/egglog/sort/macros.rs.html new file mode 100644 index 000000000..d9ba9e102 --- /dev/null +++ b/docs/src/egglog/sort/macros.rs.html @@ -0,0 +1,153 @@ +macros.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+
#[macro_export]
+macro_rules! to_tt {
+    ($tt:tt, $callback:ident) => {
+        $callback!($tt)
+    };
+}
+
+#[macro_export]
+macro_rules! unpack {
+    (& $t:ident) => {
+        $t
+    };
+    ($t:ident) => {
+        $t
+    };
+}
+
+#[macro_export]
+macro_rules! add_primitives {
+    // ($egraph:expr, $($rest:tt)*) => {
+    //      add_primitives!(@doubled $egraph, $($rest)*, $($rest)*)
+    // };
+    ($type_info:expr,
+        $name:literal = |$($param:ident : $param_t:ty),*| -> $ret:ty { $body:expr }
+        // $name2:literal = |$($param2:ident : $(&)? $base_param_t:ident),*| -> $ret2:ty { $body2:expr }
+    ) => {{
+        let type_info: &mut _ = $type_info;
+        #[allow(unused_imports, non_snake_case)]
+        {
+            use $crate::{*, sort::*};
+
+            struct MyPrim {$(
+                $param: Arc<<$param_t as FromSort>::Sort>,
+            )*
+                __out: Arc<<$ret as IntoSort>::Sort>,
+            }
+
+            impl $crate::PrimitiveLike for MyPrim {
+                fn name(&self) -> $crate::Symbol {
+                    $name.into()
+                }
+
+                fn accept(&self, types: &[ArcSort]) -> Option<ArcSort> {
+                    let mut types = types.iter();
+                    $(
+                        if self.$param.name() != types.next()?.name() {
+                            return None;
+                        }
+                    )*
+                    if types.next().is_some() {
+                        None
+                    } else {
+                        Some(self.__out.clone())
+                    }
+                }
+
+                fn apply(&self, values: &[Value]) -> Option<Value> {
+                    if let [$($param),*] = values {
+                        $(let $param: $param_t = <$param_t as FromSort>::load(&self.$param, $param);)*
+                        // print!("{}( ", $name);
+                        // $( print!("{}={:?}, ", stringify!($param), $param); )*
+                        let result: $ret = $body;
+                        // println!(") = {result:?}");
+                        result.store(&self.__out)
+                    } else {
+                        panic!("wrong number of arguments")
+                    }
+                }
+            }
+            type_info.add_primitive($crate::Primitive::from(MyPrim {
+                $( $param: type_info.get_sort::<<$param_t as IntoSort>::Sort>(), )*
+                __out: type_info.get_sort::<<$ret as IntoSort>::Sort>(),
+            }))
+        }
+    }};
+}
+
\ No newline at end of file diff --git a/docs/src/egglog/sort/map.rs.html b/docs/src/egglog/sort/map.rs.html new file mode 100644 index 000000000..d467a6259 --- /dev/null +++ b/docs/src/egglog/sort/map.rs.html @@ -0,0 +1,763 @@ +map.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+
use std::collections::BTreeMap;
+use std::sync::Mutex;
+
+use super::*;
+
+type ValueMap = BTreeMap<Value, Value>;
+
+#[derive(Debug)]
+pub struct MapSort {
+    name: Symbol,
+    key: ArcSort,
+    value: ArcSort,
+    maps: Mutex<IndexSet<ValueMap>>,
+}
+
+impl MapSort {
+    fn kv_names(&self) -> (Symbol, Symbol) {
+        (self.key.name(), self.value.name())
+    }
+
+    pub fn make_sort(
+        typeinfo: &mut TypeInfo,
+        name: Symbol,
+        args: &[Expr],
+    ) -> Result<ArcSort, TypeError> {
+        if let [Expr::Var(k), Expr::Var(v)] = args {
+            let k = typeinfo.sorts.get(k).ok_or(TypeError::UndefinedSort(*k))?;
+            let v = typeinfo.sorts.get(v).ok_or(TypeError::UndefinedSort(*v))?;
+
+            if k.is_eq_container_sort() || v.is_container_sort() {
+                return Err(TypeError::UndefinedSort(
+                    "Maps nested with other EqSort containers are not allowed".into(),
+                ));
+            }
+
+            Ok(Arc::new(Self {
+                name,
+                key: k.clone(),
+                value: v.clone(),
+                maps: Default::default(),
+            }))
+        } else {
+            panic!()
+        }
+    }
+}
+
+impl MapSort {
+    pub fn presort_names() -> Vec<Symbol> {
+        vec![
+            "map-empty".into(),
+            "map-insert".into(),
+            "map-get".into(),
+            "map-not-contains".into(),
+            "map-contains".into(),
+            "map-remove".into(),
+        ]
+    }
+}
+
+impl Sort for MapSort {
+    fn name(&self) -> Symbol {
+        self.name
+    }
+
+    fn as_arc_any(self: Arc<Self>) -> Arc<dyn Any + Send + Sync + 'static> {
+        self
+    }
+
+    fn is_container_sort(&self) -> bool {
+        true
+    }
+
+    fn is_eq_container_sort(&self) -> bool {
+        self.key.is_eq_sort() || self.value.is_eq_sort()
+    }
+
+    fn inner_values(&self, value: &Value) -> Vec<(&ArcSort, Value)> {
+        let maps = self.maps.lock().unwrap();
+        let map = maps.get_index(value.bits as usize).unwrap();
+        let mut result = Vec::new();
+        for (k, v) in map.iter() {
+            result.push((&self.key, *k));
+            result.push((&self.value, *v));
+        }
+        result
+    }
+
+    fn canonicalize(&self, _value: &mut Value, _unionfind: &UnionFind) -> bool {
+        false
+    }
+
+    fn register_primitives(self: Arc<Self>, typeinfo: &mut TypeInfo) {
+        typeinfo.add_primitive(Ctor {
+            name: "map-empty".into(),
+            map: self.clone(),
+        });
+        typeinfo.add_primitive(Insert {
+            name: "map-insert".into(),
+            map: self.clone(),
+        });
+        typeinfo.add_primitive(Get {
+            name: "map-get".into(),
+            map: self.clone(),
+        });
+        typeinfo.add_primitive(NotContains {
+            name: "map-not-contains".into(),
+            map: self.clone(),
+            unit: typeinfo.get_sort(),
+        });
+        typeinfo.add_primitive(Contains {
+            name: "map-contains".into(),
+            map: self.clone(),
+            unit: typeinfo.get_sort(),
+        });
+        typeinfo.add_primitive(Remove {
+            name: "map-remove".into(),
+            map: self,
+        });
+    }
+
+    fn make_expr(&self, egraph: &EGraph, value: Value) -> (Cost, Expr) {
+        let mut termdag = TermDag::default();
+        let extractor = Extractor::new(egraph, &mut termdag);
+        self.extract_expr(egraph, value, &extractor, &mut termdag)
+            .expect("Extraction should be successful since extractor has been fully initialized")
+    }
+
+    fn extract_expr(
+        &self,
+        _egraph: &EGraph,
+        value: Value,
+        extractor: &Extractor,
+        termdag: &mut TermDag,
+    ) -> Option<(Cost, Expr)> {
+        let map = ValueMap::load(self, &value);
+        let mut expr = Expr::call("map-empty", []);
+        let mut cost = 0usize;
+        for (k, v) in map.iter().rev() {
+            let k = extractor.find_best(*k, termdag, &self.key)?;
+            let v = extractor.find_best(*v, termdag, &self.value)?;
+            cost = cost.saturating_add(k.0).saturating_add(v.0);
+            expr = Expr::call(
+                "map-insert",
+                [expr, termdag.term_to_expr(&k.1), termdag.term_to_expr(&v.1)],
+            )
+        }
+        Some((cost, expr))
+    }
+}
+
+impl IntoSort for ValueMap {
+    type Sort = MapSort;
+    fn store(self, sort: &Self::Sort) -> Option<Value> {
+        let mut maps = sort.maps.lock().unwrap();
+        let (i, _) = maps.insert_full(self);
+        Some(Value {
+            tag: sort.name,
+            bits: i as u64,
+        })
+    }
+}
+
+impl FromSort for ValueMap {
+    type Sort = MapSort;
+    fn load(sort: &Self::Sort, value: &Value) -> Self {
+        let maps = sort.maps.lock().unwrap();
+        maps.get_index(value.bits as usize).unwrap().clone()
+    }
+}
+
+struct Ctor {
+    name: Symbol,
+    map: Arc<MapSort>,
+}
+
+pub(crate) struct TermOrderingMin {}
+
+impl PrimitiveLike for TermOrderingMin {
+    fn name(&self) -> Symbol {
+        "ordering-min".into()
+    }
+
+    fn accept(&self, types: &[ArcSort]) -> Option<ArcSort> {
+        match types {
+            [a, b] if a.name() == b.name() => Some(a.clone()),
+            _ => None,
+        }
+    }
+
+    fn apply(&self, values: &[Value]) -> Option<Value> {
+        assert_eq!(values.len(), 2);
+        if values[0] < values[1] {
+            Some(values[0])
+        } else {
+            Some(values[1])
+        }
+    }
+}
+
+pub(crate) struct TermOrderingMax {}
+
+impl PrimitiveLike for TermOrderingMax {
+    fn name(&self) -> Symbol {
+        "ordering-max".into()
+    }
+
+    fn accept(&self, types: &[ArcSort]) -> Option<ArcSort> {
+        match types {
+            [a, b] if a.name() == b.name() => Some(a.clone()),
+            _ => None,
+        }
+    }
+
+    fn apply(&self, values: &[Value]) -> Option<Value> {
+        assert_eq!(values.len(), 2);
+        if values[0] > values[1] {
+            Some(values[0])
+        } else {
+            Some(values[1])
+        }
+    }
+}
+
+impl PrimitiveLike for Ctor {
+    fn name(&self) -> Symbol {
+        self.name
+    }
+
+    fn accept(&self, types: &[ArcSort]) -> Option<ArcSort> {
+        match types {
+            [] => Some(self.map.clone()),
+            _ => None,
+        }
+    }
+
+    fn apply(&self, values: &[Value]) -> Option<Value> {
+        assert!(values.is_empty());
+        ValueMap::default().store(&self.map)
+    }
+}
+
+struct Insert {
+    name: Symbol,
+    map: Arc<MapSort>,
+}
+
+impl PrimitiveLike for Insert {
+    fn name(&self) -> Symbol {
+        self.name
+    }
+
+    fn accept(&self, types: &[ArcSort]) -> Option<ArcSort> {
+        match types {
+            [map, key, value]
+                if (map.name(), (key.name(), value.name()))
+                    == (self.map.name, self.map.kv_names()) =>
+            {
+                Some(self.map.clone())
+            }
+            _ => None,
+        }
+    }
+
+    fn apply(&self, values: &[Value]) -> Option<Value> {
+        let mut map = ValueMap::load(&self.map, &values[0]);
+        map.insert(values[1], values[2]);
+        map.store(&self.map)
+    }
+}
+
+struct Get {
+    name: Symbol,
+    map: Arc<MapSort>,
+}
+
+impl PrimitiveLike for Get {
+    fn name(&self) -> Symbol {
+        self.name
+    }
+
+    fn accept(&self, types: &[ArcSort]) -> Option<ArcSort> {
+        match types {
+            [map, key] if (map.name(), key.name()) == (self.map.name, self.map.key.name()) => {
+                Some(self.map.value.clone())
+            }
+            _ => None,
+        }
+    }
+
+    fn apply(&self, values: &[Value]) -> Option<Value> {
+        let map = ValueMap::load(&self.map, &values[0]);
+        map.get(&values[1]).copied()
+    }
+}
+
+struct NotContains {
+    name: Symbol,
+    map: Arc<MapSort>,
+    unit: Arc<UnitSort>,
+}
+
+impl PrimitiveLike for NotContains {
+    fn name(&self) -> Symbol {
+        self.name
+    }
+
+    fn accept(&self, types: &[ArcSort]) -> Option<ArcSort> {
+        match types {
+            [map, key] if (map.name(), key.name()) == (self.map.name, self.map.key.name()) => {
+                Some(self.unit.clone())
+            }
+            _ => None,
+        }
+    }
+
+    fn apply(&self, values: &[Value]) -> Option<Value> {
+        let map = ValueMap::load(&self.map, &values[0]);
+        if map.contains_key(&values[1]) {
+            None
+        } else {
+            Some(Value::unit())
+        }
+    }
+}
+
+struct Contains {
+    name: Symbol,
+    map: Arc<MapSort>,
+    unit: Arc<UnitSort>,
+}
+
+impl PrimitiveLike for Contains {
+    fn name(&self) -> Symbol {
+        self.name
+    }
+
+    fn accept(&self, types: &[ArcSort]) -> Option<ArcSort> {
+        match types {
+            [map, key] if (map.name(), key.name()) == (self.map.name, self.map.key.name()) => {
+                Some(self.unit.clone())
+            }
+            _ => None,
+        }
+    }
+
+    fn apply(&self, values: &[Value]) -> Option<Value> {
+        let map = ValueMap::load(&self.map, &values[0]);
+        if map.contains_key(&values[1]) {
+            Some(Value::unit())
+        } else {
+            None
+        }
+    }
+}
+
+struct Remove {
+    name: Symbol,
+    map: Arc<MapSort>,
+}
+
+impl PrimitiveLike for Remove {
+    fn name(&self) -> Symbol {
+        self.name
+    }
+
+    fn accept(&self, types: &[ArcSort]) -> Option<ArcSort> {
+        match types {
+            [map, key] if (map.name(), key.name()) == (self.map.name, self.map.key.name()) => {
+                Some(self.map.clone())
+            }
+            _ => None,
+        }
+    }
+
+    fn apply(&self, values: &[Value]) -> Option<Value> {
+        let mut map = ValueMap::load(&self.map, &values[0]);
+        map.remove(&values[1]);
+        map.store(&self.map)
+    }
+}
+
\ No newline at end of file diff --git a/docs/src/egglog/sort/mod.rs.html b/docs/src/egglog/sort/mod.rs.html new file mode 100644 index 000000000..db8182fd1 --- /dev/null +++ b/docs/src/egglog/sort/mod.rs.html @@ -0,0 +1,291 @@ +mod.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+
#[macro_use]
+mod macros;
+use std::fmt::Debug;
+use std::{any::Any, sync::Arc};
+
+mod rational;
+pub use rational::*;
+mod string;
+pub use string::*;
+mod unit;
+pub use unit::*;
+mod i64;
+pub use self::i64::*;
+mod f64;
+pub use self::f64::*;
+mod map;
+pub use map::*;
+mod set;
+pub use set::*;
+mod vec;
+pub use vec::*;
+
+use crate::extract::{Cost, Extractor};
+use crate::*;
+
+pub trait Sort: Any + Send + Sync + Debug {
+    fn name(&self) -> Symbol;
+    fn as_arc_any(self: Arc<Self>) -> Arc<dyn Any + Send + Sync + 'static>;
+    fn is_eq_sort(&self) -> bool {
+        false
+    }
+
+    // return true if it is a container sort.
+    fn is_container_sort(&self) -> bool {
+        false
+    }
+
+    // return true if it is a container sort that contains ids.
+    // only eq_sort and eq_container_sort need to be canonicalized.
+    fn is_eq_container_sort(&self) -> bool {
+        false
+    }
+
+    // Only eq_container_sort need to implement this method,
+    // which returns a list of ids to be tracked.
+    fn foreach_tracked_values<'a>(&'a self, value: &'a Value, mut f: Box<dyn FnMut(Value) + 'a>) {
+        for (sort, value) in self.inner_values(value) {
+            if sort.is_eq_sort() {
+                f(value)
+            }
+        }
+    }
+
+    // Sort-wise canonicalization. Return true if value is modified.
+    // Only EqSort or containers of EqSort should override.
+    fn canonicalize(&self, value: &mut Value, unionfind: &UnionFind) -> bool {
+        debug_assert_eq!(self.name(), value.tag);
+        let _ = unionfind;
+        false
+    }
+
+    /// Return the inner values and sorts.
+    /// Only eq_container_sort need to implement this method,
+    fn inner_values(&self, value: &Value) -> Vec<(&ArcSort, Value)> {
+        let _ = value;
+        vec![]
+    }
+
+    fn register_primitives(self: Arc<Self>, info: &mut TypeInfo) {
+        let _ = info;
+    }
+
+    /// Extracting an expression (with smallest cost) out of a primitive value
+    fn make_expr(&self, egraph: &EGraph, value: Value) -> (Cost, Expr);
+
+    /// For values like EqSort containers, to make/extract an expression from it
+    /// requires an extractor. Moreover, the extraction may be unsuccessful if
+    /// the extractor is not fully initialized.
+    ///
+    /// The default behavior is to call make_expr
+    fn extract_expr(
+        &self,
+        egraph: &EGraph,
+        value: Value,
+        _extractor: &Extractor,
+        _termdag: &mut TermDag,
+    ) -> Option<(Cost, Expr)> {
+        Some(self.make_expr(egraph, value))
+    }
+}
+
+#[derive(Debug)]
+pub struct EqSort {
+    pub name: Symbol,
+}
+
+impl Sort for EqSort {
+    fn name(&self) -> Symbol {
+        self.name
+    }
+
+    fn as_arc_any(self: Arc<Self>) -> Arc<dyn Any + Send + Sync + 'static> {
+        self
+    }
+
+    fn is_eq_sort(&self) -> bool {
+        true
+    }
+
+    fn canonicalize(&self, value: &mut Value, unionfind: &UnionFind) -> bool {
+        debug_assert_eq!(self.name(), value.tag);
+        let bits = usize::from(unionfind.find(Id::from(value.bits as usize))) as u64;
+        if bits != value.bits {
+            value.bits = bits;
+            true
+        } else {
+            false
+        }
+    }
+
+    fn make_expr(&self, _egraph: &EGraph, _value: Value) -> (Cost, Expr) {
+        unimplemented!("No make_expr for EqSort {}", self.name)
+    }
+}
+
+pub trait FromSort: Sized {
+    type Sort: Sort;
+    fn load(sort: &Self::Sort, value: &Value) -> Self;
+}
+
+pub trait IntoSort: Sized {
+    type Sort: Sort;
+    fn store(self, sort: &Self::Sort) -> Option<Value>;
+}
+
+impl<T: IntoSort> IntoSort for Option<T> {
+    type Sort = T::Sort;
+
+    fn store(self, sort: &Self::Sort) -> Option<Value> {
+        self?.store(sort)
+    }
+}
+
+pub type PreSort =
+    fn(typeinfo: &mut TypeInfo, name: Symbol, params: &[Expr]) -> Result<ArcSort, TypeError>;
+
\ No newline at end of file diff --git a/docs/src/egglog/sort/rational.rs.html b/docs/src/egglog/sort/rational.rs.html new file mode 100644 index 000000000..5c60226c2 --- /dev/null +++ b/docs/src/egglog/sort/rational.rs.html @@ -0,0 +1,289 @@ +rational.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+
use num_integer::Roots;
+use num_traits::{CheckedAdd, CheckedDiv, CheckedMul, CheckedSub, One, Signed, ToPrimitive, Zero};
+use std::sync::Mutex;
+
+type R = num_rational::Rational64;
+use crate::{ast::Literal, util::IndexSet};
+
+use super::*;
+
+#[derive(Debug)]
+pub struct RationalSort {
+    name: Symbol,
+    rats: Mutex<IndexSet<R>>,
+}
+
+impl RationalSort {
+    pub fn new(name: Symbol) -> Self {
+        Self {
+            name,
+            rats: Default::default(),
+        }
+    }
+}
+
+impl Sort for RationalSort {
+    fn name(&self) -> Symbol {
+        self.name
+    }
+
+    fn as_arc_any(self: Arc<Self>) -> Arc<dyn Any + Send + Sync + 'static> {
+        self
+    }
+
+    #[rustfmt::skip]
+    fn register_primitives(self: Arc<Self>, eg: &mut TypeInfo) {
+        type Opt<T=()> = Option<T>;
+
+        // TODO we can't have primitives take borrows just yet, since it
+        // requires returning a reference to the locked sort
+        add_primitives!(eg, "+" = |a: R, b: R| -> Opt<R> { a.checked_add(&b) });
+        add_primitives!(eg, "-" = |a: R, b: R| -> Opt<R> { a.checked_sub(&b) });
+        add_primitives!(eg, "*" = |a: R, b: R| -> Opt<R> { a.checked_mul(&b) });
+        add_primitives!(eg, "/" = |a: R, b: R| -> Opt<R> { a.checked_div(&b) });
+
+        add_primitives!(eg, "min" = |a: R, b: R| -> R { a.min(b) });
+        add_primitives!(eg, "max" = |a: R, b: R| -> R { a.max(b) });
+        add_primitives!(eg, "neg" = |a: R| -> R { -a });
+        add_primitives!(eg, "abs" = |a: R| -> R { a.abs() });
+        add_primitives!(eg, "floor" = |a: R| -> R { a.floor() });
+        add_primitives!(eg, "ceil" = |a: R| -> R { a.ceil() });
+        add_primitives!(eg, "round" = |a: R| -> R { a.round() });
+        add_primitives!(eg, "rational" = |a: i64, b: i64| -> R { R::new(a, b) });
+        add_primitives!(eg, "to-f64" = |a: R| -> f64 { a.to_f64().unwrap() });
+
+        add_primitives!(eg, "pow" = |a: R, b: R| -> Option<R> {
+            if a.is_zero() {
+                if b.is_positive() {
+                    Some(R::zero())
+                } else {
+                    None
+                }
+            } else if b.is_zero() {
+                Some(R::one())
+            } else if let Some(b) = b.to_i64() {
+                if let Ok(b) = usize::try_from(b) {
+                    num_traits::checked_pow(a, b)
+                } else {
+                    // TODO handle negative powers
+                    None
+                }
+            } else {
+                None
+            }
+        });
+        add_primitives!(eg, "log" = |a: R| -> Option<R> {
+            if a.is_one() {
+                Some(R::zero())
+            } else {
+                todo!()
+            }
+        });
+        add_primitives!(eg, "sqrt" = |a: R| -> Option<R> {
+            if a.numer().is_positive() && a.denom().is_positive() {
+                let s1 = a.numer().sqrt();
+                let s2 = a.denom().sqrt();
+                let is_perfect = &(s1 * s1) == a.numer() && &(s2 * s2) == a.denom();
+                if is_perfect {
+                    Some(R::new(s1, s2))
+                } else {
+                    None
+                }
+            } else {
+                None
+            }
+        });
+        add_primitives!(eg, "cbrt" = |a: R| -> Option<R> {
+            if a.is_one() {
+                Some(R::one())
+            } else {
+                todo!()
+            }
+        });
+
+        add_primitives!(eg, "<" = |a: R, b: R| -> Opt { if a < b {Some(())} else {None} }); 
+        add_primitives!(eg, ">" = |a: R, b: R| -> Opt { if a > b {Some(())} else {None} }); 
+        add_primitives!(eg, "<=" = |a: R, b: R| -> Opt { if a <= b {Some(())} else {None} }); 
+        add_primitives!(eg, ">=" = |a: R, b: R| -> Opt { if a >= b {Some(())} else {None} }); 
+   }
+    fn make_expr(&self, _egraph: &EGraph, value: Value) -> (Cost, Expr) {
+        assert!(value.tag == self.name());
+        let rat = R::load(self, &value);
+        let numer = *rat.numer();
+        let denom = *rat.denom();
+        (
+            1,
+            Expr::call(
+                "rational",
+                vec![
+                    Expr::Lit(Literal::Int(numer)),
+                    Expr::Lit(Literal::Int(denom)),
+                ],
+            ),
+        )
+    }
+}
+
+impl FromSort for R {
+    type Sort = RationalSort;
+    fn load(sort: &Self::Sort, value: &Value) -> Self {
+        let i = value.bits as usize;
+        *sort.rats.lock().unwrap().get_index(i).unwrap()
+    }
+}
+
+impl IntoSort for R {
+    type Sort = RationalSort;
+    fn store(self, sort: &Self::Sort) -> Option<Value> {
+        let (i, _) = sort.rats.lock().unwrap().insert_full(self);
+        Some(Value {
+            tag: sort.name,
+            bits: i as u64,
+        })
+    }
+}
+
\ No newline at end of file diff --git a/docs/src/egglog/sort/set.rs.html b/docs/src/egglog/sort/set.rs.html new file mode 100644 index 000000000..16cfdeba8 --- /dev/null +++ b/docs/src/egglog/sort/set.rs.html @@ -0,0 +1,843 @@ +set.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+390
+391
+392
+393
+394
+395
+396
+397
+398
+399
+400
+401
+402
+403
+404
+405
+406
+407
+408
+409
+410
+411
+412
+413
+414
+415
+416
+417
+418
+419
+420
+421
+
use std::collections::BTreeSet;
+use std::sync::Mutex;
+
+use super::*;
+
+type ValueSet = BTreeSet<Value>;
+
+#[derive(Debug)]
+pub struct SetSort {
+    name: Symbol,
+    element: ArcSort,
+    sets: Mutex<IndexSet<ValueSet>>,
+}
+
+impl SetSort {
+    pub fn element_name(&self) -> Symbol {
+        self.element.name()
+    }
+
+    pub fn make_sort(
+        typeinfo: &mut TypeInfo,
+        name: Symbol,
+        args: &[Expr],
+    ) -> Result<ArcSort, TypeError> {
+        if let [Expr::Var(e)] = args {
+            let e = typeinfo.sorts.get(e).ok_or(TypeError::UndefinedSort(*e))?;
+
+            if e.is_eq_container_sort() {
+                return Err(TypeError::UndefinedSort(
+                    "Sets nested with other EqSort containers are not allowed".into(),
+                ));
+            }
+
+            Ok(Arc::new(Self {
+                name,
+                element: e.clone(),
+                sets: Default::default(),
+            }))
+        } else {
+            panic!()
+        }
+    }
+}
+
+impl SetSort {
+    pub fn presort_names() -> Vec<Symbol> {
+        vec![
+            "set-of".into(),
+            "set-empty".into(),
+            "set-insert".into(),
+            "set-not-contains".into(),
+            "set-contains".into(),
+            "set-remove".into(),
+            "set-union".into(),
+            "set-diff".into(),
+            "set-intersect".into(),
+        ]
+    }
+}
+
+impl Sort for SetSort {
+    fn name(&self) -> Symbol {
+        self.name
+    }
+
+    fn as_arc_any(self: Arc<Self>) -> Arc<dyn Any + Send + Sync + 'static> {
+        self
+    }
+
+    fn is_container_sort(&self) -> bool {
+        true
+    }
+
+    fn is_eq_container_sort(&self) -> bool {
+        self.element.is_eq_sort()
+    }
+
+    fn inner_values(&self, value: &Value) -> Vec<(&ArcSort, Value)> {
+        // TODO: Potential duplication of code
+        let sets = self.sets.lock().unwrap();
+        let set = sets.get_index(value.bits as usize).unwrap();
+        let mut result = Vec::new();
+        for e in set.iter() {
+            result.push((&self.element, *e));
+        }
+        result
+    }
+
+    fn canonicalize(&self, _value: &mut Value, _unionfind: &UnionFind) -> bool {
+        false
+    }
+
+    fn register_primitives(self: Arc<Self>, typeinfo: &mut TypeInfo) {
+        typeinfo.add_primitive(SetOf {
+            name: "set-of".into(),
+            set: self.clone(),
+        });
+        typeinfo.add_primitive(Ctor {
+            name: "set-empty".into(),
+            set: self.clone(),
+        });
+        typeinfo.add_primitive(Insert {
+            name: "set-insert".into(),
+            set: self.clone(),
+        });
+        typeinfo.add_primitive(NotContains {
+            name: "set-not-contains".into(),
+            set: self.clone(),
+            unit: typeinfo.get_sort(),
+        });
+        typeinfo.add_primitive(Contains {
+            name: "set-contains".into(),
+            set: self.clone(),
+            unit: typeinfo.get_sort(),
+        });
+        typeinfo.add_primitive(Remove {
+            name: "set-remove".into(),
+            set: self.clone(),
+        });
+        typeinfo.add_primitive(Union {
+            name: "set-union".into(),
+            set: self.clone(),
+        });
+        typeinfo.add_primitive(Diff {
+            name: "set-diff".into(),
+            set: self.clone(),
+        });
+        typeinfo.add_primitive(Intersect {
+            name: "set-intersect".into(),
+            set: self,
+        });
+    }
+
+    fn make_expr(&self, egraph: &EGraph, value: Value) -> (Cost, Expr) {
+        let mut termdag = TermDag::default();
+        let extractor = Extractor::new(egraph, &mut termdag);
+        self.extract_expr(egraph, value, &extractor, &mut termdag)
+            .expect("Extraction should be successful since extractor has been fully initialized")
+    }
+
+    fn extract_expr(
+        &self,
+        _egraph: &EGraph,
+        value: Value,
+        extractor: &Extractor,
+        termdag: &mut TermDag,
+    ) -> Option<(Cost, Expr)> {
+        let set = ValueSet::load(self, &value);
+        let mut expr = Expr::call("set-empty", []);
+        let mut cost = 0usize;
+        for e in set.iter().rev() {
+            let e = extractor.find_best(*e, termdag, &self.element)?;
+            cost = cost.saturating_add(e.0);
+            expr = Expr::call("set-insert", [expr, termdag.term_to_expr(&e.1)])
+        }
+        Some((cost, expr))
+    }
+}
+
+impl IntoSort for ValueSet {
+    type Sort = SetSort;
+    fn store(self, sort: &Self::Sort) -> Option<Value> {
+        let mut sets = sort.sets.lock().unwrap();
+        let (i, _) = sets.insert_full(self);
+        Some(Value {
+            tag: sort.name,
+            bits: i as u64,
+        })
+    }
+}
+
+impl FromSort for ValueSet {
+    type Sort = SetSort;
+    fn load(sort: &Self::Sort, value: &Value) -> Self {
+        let sets = sort.sets.lock().unwrap();
+        sets.get_index(value.bits as usize).unwrap().clone()
+    }
+}
+
+struct SetOf {
+    name: Symbol,
+    set: Arc<SetSort>,
+}
+
+impl PrimitiveLike for SetOf {
+    fn name(&self) -> Symbol {
+        self.name
+    }
+
+    fn accept(&self, types: &[ArcSort]) -> Option<ArcSort> {
+        if types.iter().all(|t| t.name() == self.set.element_name()) {
+            Some(self.set.clone())
+        } else {
+            None
+        }
+    }
+
+    fn apply(&self, values: &[Value]) -> Option<Value> {
+        let set = ValueSet::from_iter(values.iter().copied());
+        Some(set.store(&self.set).unwrap())
+    }
+}
+
+struct Ctor {
+    name: Symbol,
+    set: Arc<SetSort>,
+}
+
+impl PrimitiveLike for Ctor {
+    fn name(&self) -> Symbol {
+        self.name
+    }
+
+    fn accept(&self, types: &[ArcSort]) -> Option<ArcSort> {
+        match types {
+            [] => Some(self.set.clone()),
+            _ => None,
+        }
+    }
+
+    fn apply(&self, values: &[Value]) -> Option<Value> {
+        assert!(values.is_empty());
+        ValueSet::default().store(&self.set)
+    }
+}
+
+struct Insert {
+    name: Symbol,
+    set: Arc<SetSort>,
+}
+
+impl PrimitiveLike for Insert {
+    fn name(&self) -> Symbol {
+        self.name
+    }
+
+    fn accept(&self, types: &[ArcSort]) -> Option<ArcSort> {
+        match types {
+            [set, key] if (set.name(), key.name()) == (self.set.name, self.set.element_name()) => {
+                Some(self.set.clone())
+            }
+            _ => None,
+        }
+    }
+
+    fn apply(&self, values: &[Value]) -> Option<Value> {
+        let mut set = ValueSet::load(&self.set, &values[0]);
+        set.insert(values[1]);
+        set.store(&self.set)
+    }
+}
+
+struct NotContains {
+    name: Symbol,
+    set: Arc<SetSort>,
+    unit: Arc<UnitSort>,
+}
+
+impl PrimitiveLike for NotContains {
+    fn name(&self) -> Symbol {
+        self.name
+    }
+
+    fn accept(&self, types: &[ArcSort]) -> Option<ArcSort> {
+        match types {
+            [set, element]
+                if (set.name(), element.name()) == (self.set.name, self.set.element_name()) =>
+            {
+                Some(self.unit.clone())
+            }
+            _ => None,
+        }
+    }
+
+    fn apply(&self, values: &[Value]) -> Option<Value> {
+        let set = ValueSet::load(&self.set, &values[0]);
+        if set.contains(&values[1]) {
+            None
+        } else {
+            Some(Value::unit())
+        }
+    }
+}
+
+struct Contains {
+    name: Symbol,
+    set: Arc<SetSort>,
+    unit: Arc<UnitSort>,
+}
+
+impl PrimitiveLike for Contains {
+    fn name(&self) -> Symbol {
+        self.name
+    }
+
+    fn accept(&self, types: &[ArcSort]) -> Option<ArcSort> {
+        match types {
+            [set, key] if (set.name(), key.name()) == (self.set.name, self.set.element_name()) => {
+                Some(self.unit.clone())
+            }
+            _ => None,
+        }
+    }
+
+    fn apply(&self, values: &[Value]) -> Option<Value> {
+        let set = ValueSet::load(&self.set, &values[0]);
+        if set.contains(&values[1]) {
+            Some(Value::unit())
+        } else {
+            None
+        }
+    }
+}
+
+struct Union {
+    name: Symbol,
+    set: Arc<SetSort>,
+}
+
+impl PrimitiveLike for Union {
+    fn name(&self) -> Symbol {
+        self.name
+    }
+
+    fn accept(&self, types: &[ArcSort]) -> Option<ArcSort> {
+        match types {
+            [set1, set2] if set1.name() == self.set.name() && set2.name() == self.set.name() => {
+                Some(self.set.clone())
+            }
+            _ => None,
+        }
+    }
+
+    fn apply(&self, values: &[Value]) -> Option<Value> {
+        let mut set1 = ValueSet::load(&self.set, &values[0]);
+        let set2 = ValueSet::load(&self.set, &values[1]);
+        set1.extend(set2.iter());
+        set1.store(&self.set)
+    }
+}
+
+struct Intersect {
+    name: Symbol,
+    set: Arc<SetSort>,
+}
+
+impl PrimitiveLike for Intersect {
+    fn name(&self) -> Symbol {
+        self.name
+    }
+
+    fn accept(&self, types: &[ArcSort]) -> Option<ArcSort> {
+        match types {
+            [set1, set2] if set1.name() == self.set.name && set2.name() == self.set.name() => {
+                Some(self.set.clone())
+            }
+            _ => None,
+        }
+    }
+
+    fn apply(&self, values: &[Value]) -> Option<Value> {
+        let mut set1 = ValueSet::load(&self.set, &values[0]);
+        let set2 = ValueSet::load(&self.set, &values[1]);
+        set1.retain(|k| set2.contains(k));
+        // set.insert(values[1], values[2]);
+        set1.store(&self.set)
+    }
+}
+
+struct Remove {
+    name: Symbol,
+    set: Arc<SetSort>,
+}
+
+impl PrimitiveLike for Remove {
+    fn name(&self) -> Symbol {
+        self.name
+    }
+
+    fn accept(&self, types: &[ArcSort]) -> Option<ArcSort> {
+        match types {
+            [set, key] if (set.name(), key.name()) == (self.set.name, self.set.element_name()) => {
+                Some(self.set.clone())
+            }
+            _ => None,
+        }
+    }
+
+    fn apply(&self, values: &[Value]) -> Option<Value> {
+        let mut set = ValueSet::load(&self.set, &values[0]);
+        set.remove(&values[1]);
+        set.store(&self.set)
+    }
+}
+
+struct Diff {
+    name: Symbol,
+    set: Arc<SetSort>,
+}
+
+impl PrimitiveLike for Diff {
+    fn name(&self) -> Symbol {
+        self.name
+    }
+
+    fn accept(&self, types: &[ArcSort]) -> Option<ArcSort> {
+        match types {
+            [set1, set2] if set1.name() == self.set.name && set2.name() == self.set.name() => {
+                Some(self.set.clone())
+            }
+            _ => None,
+        }
+    }
+
+    fn apply(&self, values: &[Value]) -> Option<Value> {
+        let mut set1 = ValueSet::load(&self.set, &values[0]);
+        let set2 = ValueSet::load(&self.set, &values[1]);
+        set1.retain(|k| !set2.contains(k));
+        set1.store(&self.set)
+    }
+}
+
\ No newline at end of file diff --git a/docs/src/egglog/sort/string.rs.html b/docs/src/egglog/sort/string.rs.html new file mode 100644 index 000000000..ae83d5f96 --- /dev/null +++ b/docs/src/egglog/sort/string.rs.html @@ -0,0 +1,175 @@ +string.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+
use std::num::NonZeroU32;
+
+use crate::ast::Literal;
+
+use super::*;
+
+#[derive(Debug)]
+pub struct StringSort {
+    name: Symbol,
+}
+
+impl StringSort {
+    pub fn new(name: Symbol) -> Self {
+        Self { name }
+    }
+}
+
+impl Sort for StringSort {
+    fn name(&self) -> Symbol {
+        self.name
+    }
+
+    fn as_arc_any(self: Arc<Self>) -> Arc<dyn Any + Send + Sync + 'static> {
+        self
+    }
+
+    fn make_expr(&self, _egraph: &EGraph, value: Value) -> (Cost, Expr) {
+        assert!(value.tag == self.name);
+        let sym = Symbol::from(NonZeroU32::new(value.bits as _).unwrap());
+        (1, Expr::Lit(Literal::String(sym)))
+    }
+
+    fn register_primitives(self: Arc<Self>, typeinfo: &mut TypeInfo) {
+        typeinfo.add_primitive(Add {
+            name: "+".into(),
+            string: self,
+        });
+    }
+}
+
+// TODO could use a local symbol table
+
+impl IntoSort for Symbol {
+    type Sort = StringSort;
+    fn store(self, sort: &Self::Sort) -> Option<Value> {
+        Some(Value {
+            tag: sort.name,
+            bits: NonZeroU32::from(self).get() as _,
+        })
+    }
+}
+
+impl FromSort for Symbol {
+    type Sort = StringSort;
+    fn load(_sort: &Self::Sort, value: &Value) -> Self {
+        NonZeroU32::new(value.bits as u32).unwrap().into()
+    }
+}
+
+struct Add {
+    name: Symbol,
+    string: Arc<StringSort>,
+}
+
+impl PrimitiveLike for Add {
+    fn name(&self) -> Symbol {
+        self.name
+    }
+
+    fn accept(&self, types: &[ArcSort]) -> Option<ArcSort> {
+        if types.iter().all(|t| t.name() == self.string.name) {
+            Some(self.string.clone())
+        } else {
+            None
+        }
+    }
+
+    fn apply(&self, values: &[Value]) -> Option<Value> {
+        let mut res_string: String = "".to_owned();
+        for value in values {
+            let sym = Symbol::load(&self.string, value);
+            res_string.push_str(sym.as_str());
+        }
+        let res_symbol: Symbol = res_string.into();
+        Some(Value::from(res_symbol))
+    }
+}
+
\ No newline at end of file diff --git a/docs/src/egglog/sort/unit.rs.html b/docs/src/egglog/sort/unit.rs.html new file mode 100644 index 000000000..71723696b --- /dev/null +++ b/docs/src/egglog/sort/unit.rs.html @@ -0,0 +1,123 @@ +unit.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+
use super::*;
+use crate::{ast::Literal, ArcSort, PrimitiveLike};
+
+#[derive(Debug)]
+pub struct UnitSort {
+    name: Symbol,
+}
+
+impl UnitSort {
+    pub fn new(name: Symbol) -> Self {
+        Self { name }
+    }
+}
+
+impl Sort for UnitSort {
+    fn name(&self) -> Symbol {
+        self.name
+    }
+
+    fn as_arc_any(self: Arc<Self>) -> Arc<dyn Any + Send + Sync + 'static> {
+        self
+    }
+
+    fn register_primitives(self: Arc<Self>, type_info: &mut TypeInfo) {
+        type_info.add_primitive(NotEqualPrimitive { unit: self })
+    }
+
+    fn make_expr(&self, _egraph: &EGraph, value: Value) -> (Cost, Expr) {
+        assert_eq!(value.tag, self.name);
+        (1, Expr::Lit(Literal::Unit))
+    }
+}
+
+impl IntoSort for () {
+    type Sort = UnitSort;
+
+    fn store(self, _sort: &Self::Sort) -> Option<Value> {
+        Some(Value::unit())
+    }
+}
+
+pub struct NotEqualPrimitive {
+    unit: ArcSort,
+}
+
+impl PrimitiveLike for NotEqualPrimitive {
+    fn name(&self) -> Symbol {
+        "!=".into()
+    }
+
+    fn accept(&self, types: &[ArcSort]) -> Option<ArcSort> {
+        match types {
+            [a, b] if a.name() == b.name() => Some(self.unit.clone()),
+            _ => None,
+        }
+    }
+
+    fn apply(&self, values: &[Value]) -> Option<Value> {
+        (values[0] != values[1]).then(Value::unit)
+    }
+}
+
\ No newline at end of file diff --git a/docs/src/egglog/sort/vec.rs.html b/docs/src/egglog/sort/vec.rs.html new file mode 100644 index 000000000..83f2e0d24 --- /dev/null +++ b/docs/src/egglog/sort/vec.rs.html @@ -0,0 +1,849 @@ +vec.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+390
+391
+392
+393
+394
+395
+396
+397
+398
+399
+400
+401
+402
+403
+404
+405
+406
+407
+408
+409
+410
+411
+412
+413
+414
+415
+416
+417
+418
+419
+420
+421
+422
+423
+424
+
use std::sync::Mutex;
+
+use super::*;
+
+type ValueVec = Vec<Value>;
+
+#[derive(Debug)]
+pub struct VecSort {
+    name: Symbol,
+    element: ArcSort,
+    vecs: Mutex<IndexSet<ValueVec>>,
+}
+
+impl VecSort {
+    pub fn element_name(&self) -> Symbol {
+        self.element.name()
+    }
+
+    pub fn presort_names() -> Vec<Symbol> {
+        vec![
+            "vec-of".into(),
+            "vec-append".into(),
+            "vec-empty".into(),
+            "vec-push".into(),
+            "vec-pop".into(),
+            "vec-not-contains".into(),
+            "vec-contains".into(),
+            "vec-length".into(),
+            "vec-get".into(),
+        ]
+    }
+
+    pub fn make_sort(
+        typeinfo: &mut TypeInfo,
+        name: Symbol,
+        args: &[Expr],
+    ) -> Result<ArcSort, TypeError> {
+        if let [Expr::Var(e)] = args {
+            let e = typeinfo.sorts.get(e).ok_or(TypeError::UndefinedSort(*e))?;
+
+            if e.is_eq_container_sort() {
+                return Err(TypeError::UndefinedSort(
+                    "Sets nested with other EqSort containers are not allowed".into(),
+                ));
+            }
+
+            Ok(Arc::new(Self {
+                name,
+                element: e.clone(),
+                vecs: Default::default(),
+            }))
+        } else {
+            panic!("Vec sort must have sort as argument. Got {:?}", args)
+        }
+    }
+}
+
+impl Sort for VecSort {
+    fn name(&self) -> Symbol {
+        self.name
+    }
+
+    fn as_arc_any(self: Arc<Self>) -> Arc<dyn Any + Send + Sync + 'static> {
+        self
+    }
+
+    fn is_container_sort(&self) -> bool {
+        true
+    }
+
+    fn is_eq_container_sort(&self) -> bool {
+        self.element.is_eq_sort()
+    }
+
+    fn inner_values(&self, value: &Value) -> Vec<(&ArcSort, Value)> {
+        // TODO: Potential duplication of code
+        let vecs = self.vecs.lock().unwrap();
+        let vec = vecs.get_index(value.bits as usize).unwrap();
+        let mut result: Vec<(&Arc<dyn Sort>, Value)> = Vec::new();
+        for e in vec.iter() {
+            result.push((&self.element, *e));
+        }
+        result
+    }
+
+    fn canonicalize(&self, value: &mut Value, unionfind: &UnionFind) -> bool {
+        let vecs = self.vecs.lock().unwrap();
+        let vec = vecs.get_index(value.bits as usize).unwrap();
+        let mut changed = false;
+        let new_set: ValueVec = vec
+            .iter()
+            .map(|e| {
+                let mut e = *e;
+                changed |= self.element.canonicalize(&mut e, unionfind);
+                e
+            })
+            .collect();
+        drop(vecs);
+        *value = new_set.store(self).unwrap();
+        changed
+    }
+
+    fn register_primitives(self: Arc<Self>, typeinfo: &mut TypeInfo) {
+        typeinfo.add_primitive(VecOf {
+            name: "vec-of".into(),
+            vec: self.clone(),
+        });
+        typeinfo.add_primitive(Append {
+            name: "vec-append".into(),
+            vec: self.clone(),
+        });
+        typeinfo.add_primitive(Ctor {
+            name: "vec-empty".into(),
+            vec: self.clone(),
+        });
+        typeinfo.add_primitive(Push {
+            name: "vec-push".into(),
+            vec: self.clone(),
+        });
+        typeinfo.add_primitive(Pop {
+            name: "vec-pop".into(),
+            vec: self.clone(),
+        });
+        typeinfo.add_primitive(NotContains {
+            name: "vec-not-contains".into(),
+            vec: self.clone(),
+            unit: typeinfo.get_sort(),
+        });
+        typeinfo.add_primitive(Contains {
+            name: "vec-contains".into(),
+            vec: self.clone(),
+            unit: typeinfo.get_sort(),
+        });
+        typeinfo.add_primitive(Length {
+            name: "vec-length".into(),
+            vec: self.clone(),
+            i64: typeinfo.get_sort(),
+        });
+        typeinfo.add_primitive(Get {
+            name: "vec-get".into(),
+            vec: self,
+            i64: typeinfo.get_sort(),
+        })
+    }
+
+    fn make_expr(&self, egraph: &EGraph, value: Value) -> (Cost, Expr) {
+        let mut termdag = TermDag::default();
+        let extractor = Extractor::new(egraph, &mut termdag);
+        self.extract_expr(egraph, value, &extractor, &mut termdag)
+            .expect("Extraction should be successful since extractor has been fully initialized")
+    }
+
+    fn extract_expr(
+        &self,
+        _egraph: &EGraph,
+        value: Value,
+        extractor: &Extractor,
+        termdag: &mut TermDag,
+    ) -> Option<(Cost, Expr)> {
+        let vec = ValueVec::load(self, &value);
+        let mut expr = Expr::call("vec-empty", []);
+        let mut cost = 0usize;
+        for e in vec.iter().rev() {
+            let e = extractor.find_best(*e, termdag, &self.element)?;
+            cost = cost.saturating_add(e.0);
+            expr = Expr::call("vec-push", [expr, termdag.term_to_expr(&e.1)])
+        }
+        Some((cost, expr))
+    }
+}
+
+impl IntoSort for ValueVec {
+    type Sort = VecSort;
+    fn store(self, sort: &Self::Sort) -> Option<Value> {
+        let mut vecs = sort.vecs.lock().unwrap();
+        let (i, _) = vecs.insert_full(self);
+        Some(Value {
+            tag: sort.name,
+            bits: i as u64,
+        })
+    }
+}
+
+impl FromSort for ValueVec {
+    type Sort = VecSort;
+    fn load(sort: &Self::Sort, value: &Value) -> Self {
+        let vecs = sort.vecs.lock().unwrap();
+        vecs.get_index(value.bits as usize).unwrap().clone()
+    }
+}
+
+struct VecOf {
+    name: Symbol,
+    vec: Arc<VecSort>,
+}
+
+impl PrimitiveLike for VecOf {
+    fn name(&self) -> Symbol {
+        self.name
+    }
+
+    fn accept(&self, types: &[ArcSort]) -> Option<ArcSort> {
+        if types.iter().all(|t| t.name() == self.vec.element_name()) {
+            Some(self.vec.clone())
+        } else {
+            None
+        }
+    }
+
+    fn apply(&self, values: &[Value]) -> Option<Value> {
+        let vec = ValueVec::from_iter(values.iter().copied());
+        vec.store(&self.vec)
+    }
+}
+
+struct Append {
+    name: Symbol,
+    vec: Arc<VecSort>,
+}
+
+impl PrimitiveLike for Append {
+    fn name(&self) -> Symbol {
+        self.name
+    }
+
+    fn accept(&self, types: &[ArcSort]) -> Option<ArcSort> {
+        if types.iter().all(|t| t.name() == self.vec.name()) {
+            Some(self.vec.clone())
+        } else {
+            None
+        }
+    }
+
+    fn apply(&self, values: &[Value]) -> Option<Value> {
+        let vec = ValueVec::from_iter(values.iter().flat_map(|v| ValueVec::load(&self.vec, v)));
+        vec.store(&self.vec)
+    }
+}
+
+struct Ctor {
+    name: Symbol,
+    vec: Arc<VecSort>,
+}
+
+impl PrimitiveLike for Ctor {
+    fn name(&self) -> Symbol {
+        self.name
+    }
+
+    fn accept(&self, types: &[ArcSort]) -> Option<ArcSort> {
+        match types {
+            [] => Some(self.vec.clone()),
+            _ => None,
+        }
+    }
+
+    fn apply(&self, values: &[Value]) -> Option<Value> {
+        assert!(values.is_empty());
+        ValueVec::default().store(&self.vec)
+    }
+}
+
+struct Push {
+    name: Symbol,
+    vec: Arc<VecSort>,
+}
+
+impl PrimitiveLike for Push {
+    fn name(&self) -> Symbol {
+        self.name
+    }
+
+    fn accept(&self, types: &[ArcSort]) -> Option<ArcSort> {
+        match types {
+            [vec, key] if (vec.name(), key.name()) == (self.vec.name, self.vec.element_name()) => {
+                Some(self.vec.clone())
+            }
+            _ => None,
+        }
+    }
+
+    fn apply(&self, values: &[Value]) -> Option<Value> {
+        let mut vec = ValueVec::load(&self.vec, &values[0]);
+        vec.push(values[1]);
+        vec.store(&self.vec)
+    }
+}
+
+struct Pop {
+    name: Symbol,
+    vec: Arc<VecSort>,
+}
+
+impl PrimitiveLike for Pop {
+    fn name(&self) -> Symbol {
+        self.name
+    }
+
+    fn accept(&self, types: &[ArcSort]) -> Option<ArcSort> {
+        match types {
+            [vec] if vec.name() == self.vec.name => Some(self.vec.clone()),
+            _ => None,
+        }
+    }
+
+    fn apply(&self, values: &[Value]) -> Option<Value> {
+        let mut vec = ValueVec::load(&self.vec, &values[0]);
+        vec.pop();
+        vec.store(&self.vec)
+    }
+}
+
+struct NotContains {
+    name: Symbol,
+    vec: Arc<VecSort>,
+    unit: Arc<UnitSort>,
+}
+
+impl PrimitiveLike for NotContains {
+    fn name(&self) -> Symbol {
+        self.name
+    }
+
+    fn accept(&self, types: &[ArcSort]) -> Option<ArcSort> {
+        match types {
+            [vec, element]
+                if (vec.name(), element.name()) == (self.vec.name, self.vec.element_name()) =>
+            {
+                Some(self.unit.clone())
+            }
+            _ => None,
+        }
+    }
+
+    fn apply(&self, values: &[Value]) -> Option<Value> {
+        let vec = ValueVec::load(&self.vec, &values[0]);
+        if vec.contains(&values[1]) {
+            None
+        } else {
+            Some(Value::unit())
+        }
+    }
+}
+
+struct Contains {
+    name: Symbol,
+    vec: Arc<VecSort>,
+    unit: Arc<UnitSort>,
+}
+
+impl PrimitiveLike for Contains {
+    fn name(&self) -> Symbol {
+        self.name
+    }
+
+    fn accept(&self, types: &[ArcSort]) -> Option<ArcSort> {
+        match types {
+            [vec, key] if (vec.name(), key.name()) == (self.vec.name, self.vec.element_name()) => {
+                Some(self.unit.clone())
+            }
+            _ => None,
+        }
+    }
+
+    fn apply(&self, values: &[Value]) -> Option<Value> {
+        let vec = ValueVec::load(&self.vec, &values[0]);
+        if vec.contains(&values[1]) {
+            Some(Value::unit())
+        } else {
+            None
+        }
+    }
+}
+
+struct Length {
+    name: Symbol,
+    vec: Arc<VecSort>,
+    i64: Arc<I64Sort>,
+}
+
+impl PrimitiveLike for Length {
+    fn name(&self) -> Symbol {
+        self.name
+    }
+
+    fn accept(&self, types: &[ArcSort]) -> Option<ArcSort> {
+        match types {
+            [vec] if vec.name() == self.vec.name => Some(self.i64.clone()),
+            _ => None,
+        }
+    }
+
+    fn apply(&self, values: &[Value]) -> Option<Value> {
+        let vec = ValueVec::load(&self.vec, &values[0]);
+        Some(Value::from(vec.len() as i64))
+    }
+}
+
+struct Get {
+    name: Symbol,
+    vec: Arc<VecSort>,
+    i64: Arc<I64Sort>,
+}
+
+impl PrimitiveLike for Get {
+    fn name(&self) -> Symbol {
+        self.name
+    }
+
+    fn accept(&self, types: &[ArcSort]) -> Option<ArcSort> {
+        match types {
+            [vec, index] if (vec.name(), index.name()) == (self.vec.name, "i64".into()) => {
+                Some(self.vec.element.clone())
+            }
+            _ => None,
+        }
+    }
+
+    fn apply(&self, values: &[Value]) -> Option<Value> {
+        let vec = ValueVec::load(&self.vec, &values[0]);
+        let index = i64::load(&self.i64, &values[1]);
+        vec.get(index as usize).copied()
+    }
+}
+
\ No newline at end of file diff --git a/docs/src/egglog/termdag.rs.html b/docs/src/egglog/termdag.rs.html new file mode 100644 index 000000000..094062c54 --- /dev/null +++ b/docs/src/egglog/termdag.rs.html @@ -0,0 +1,557 @@ +termdag.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+
use crate::{
+    ast::{Expr, Literal},
+    util::{HashMap, HashSet},
+    Symbol,
+};
+
+#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)]
+pub struct TermId(usize);
+
+/// Like [`Expr`]s but with sharing and deduplication.
+///
+/// Terms refer to their children indirectly via opaque [TermId]s (internally
+/// these are just `usize`s) that map into an ambient [`TermDag`].
+#[derive(Clone, PartialEq, Eq, Hash, Debug)]
+pub enum Term {
+    Lit(Literal),
+    Var(Symbol),
+    App(Symbol, Vec<TermId>),
+}
+
+/// A hashconsing arena for [`Term`]s.
+#[derive(Clone, PartialEq, Eq, Debug, Default)]
+pub struct TermDag {
+    // think of nodes as a map from indices to Terms.
+    // invariant: the nodes map and the hashcons map are inverses.
+    // note that this implies:
+    // - no duplicates in nodes
+    // - every element of node is a key in hashcons
+    // - every key of hashcons is in nodes
+    pub nodes: Vec<Term>,
+    pub hashcons: HashMap<Term, TermId>,
+}
+
+#[macro_export]
+macro_rules! match_term_app {
+    ($e:expr; { $(
+        ($head:expr, $args:pat) => $body:expr $(,)?
+    ),*}) => {
+        match $e {
+            Term::App(head, args) => {
+                $(
+                    if head.as_str() == $head {
+                        match args.as_slice() {
+                            $args => $body,
+                            _ => panic!("arg mismatch"),
+                        }
+                    } else
+                )* {
+                    panic!("Failed to match any of the heads of the patterns. Got: {}", head);
+                }
+            }
+            _ => panic!("not an app")
+        }
+    }
+}
+
+impl TermDag {
+    /// Returns the number of nodes in this DAG.
+    pub fn size(&self) -> usize {
+        self.nodes.len()
+    }
+
+    /// Convert the given term to its id.
+    ///
+    /// Panics if the term does not already exist in this [TermDag].
+    pub fn lookup(&self, node: &Term) -> TermId {
+        *self.hashcons.get(node).unwrap()
+    }
+
+    /// Convert the given id to the corresponding term.
+    ///
+    /// Panics if the id is not valid.
+    pub fn get(&self, id: TermId) -> Term {
+        self.nodes[id.0].clone()
+    }
+
+    /// Make and return a [`Term::App`] with the given head symbol and children,
+    /// and insert into the DAG if it is not already present.
+    ///
+    /// Panics if any of the children are not already in the DAG.
+    pub fn app(&mut self, sym: Symbol, children: Vec<Term>) -> Term {
+        let node = Term::App(sym, children.iter().map(|c| self.lookup(c)).collect());
+
+        self.add_node(&node);
+
+        node
+    }
+
+    /// Make and return a [`Term::Lit`] with the given literal, and insert into
+    /// the DAG if it is not already present.
+    pub fn lit(&mut self, lit: Literal) -> Term {
+        let node = Term::Lit(lit);
+
+        self.add_node(&node);
+
+        node
+    }
+
+    /// Make and return a [`Term::Var`] with the given symbol, and insert into
+    /// the DAG if it is not already present.
+    pub fn var(&mut self, sym: Symbol) -> Term {
+        let node = Term::Var(sym);
+
+        self.add_node(&node);
+
+        node
+    }
+
+    fn add_node(&mut self, node: &Term) {
+        if self.hashcons.get(node).is_none() {
+            let idx = self.nodes.len();
+            self.nodes.push(node.clone());
+            self.hashcons.insert(node.clone(), TermId(idx));
+        }
+    }
+
+    /// Recursively converts the given expression to a term.
+    ///
+    /// This involves inserting every subexpression into this DAG. Because
+    /// TermDags are hashconsed, the resulting term is guaranteed to maximally
+    /// share subterms.
+    pub fn expr_to_term(&mut self, expr: &Expr) -> Term {
+        let res = match expr {
+            Expr::Lit(lit) => Term::Lit(lit.clone()),
+            Expr::Var(v) => Term::Var(*v),
+            Expr::Call(op, args) => {
+                let args = args
+                    .iter()
+                    .map(|a| {
+                        let term = self.expr_to_term(a);
+                        self.lookup(&term)
+                    })
+                    .collect();
+                Term::App(*op, args)
+            }
+        };
+        self.add_node(&res);
+        res
+    }
+
+    /// Recursively converts the given term to an expression.
+    ///
+    /// Panics if the term contains subterms that are not in the DAG.
+    pub fn term_to_expr(&self, term: &Term) -> Expr {
+        match term {
+            Term::Lit(lit) => Expr::Lit(lit.clone()),
+            Term::Var(v) => Expr::Var(*v),
+            Term::App(op, args) => {
+                let args = args
+                    .iter()
+                    .map(|a| {
+                        let term = self.get(*a);
+                        self.term_to_expr(&term)
+                    })
+                    .collect();
+                Expr::Call(*op, args)
+            }
+        }
+    }
+
+    /// Converts the given term to a string.
+    ///
+    /// Panics if the term or any of its subterms are not in the DAG.
+    pub fn to_string(&self, term: &Term) -> String {
+        let mut stored = HashMap::<TermId, String>::default();
+        let mut seen = HashSet::<TermId>::default();
+        let id = self.lookup(term);
+        // use a stack to avoid stack overflow
+        let mut stack = vec![id];
+        while let Some(next) = stack.pop() {
+            match self.nodes[next.0].clone() {
+                Term::App(name, children) => {
+                    if seen.contains(&next) {
+                        let mut str = String::new();
+                        str.push_str(&format!("({}", name));
+                        for c in children.iter() {
+                            str.push_str(&format!(" {}", stored[c]));
+                        }
+                        str.push(')');
+                        stored.insert(next, str);
+                    } else {
+                        seen.insert(next);
+                        stack.push(next);
+                        for c in children.iter().rev() {
+                            stack.push(*c);
+                        }
+                    }
+                }
+                Term::Lit(lit) => {
+                    stored.insert(next, format!("{}", lit));
+                }
+                Term::Var(v) => {
+                    stored.insert(next, format!("{}", v));
+                }
+            }
+        }
+
+        stored.get(&id).unwrap().clone()
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use crate::ast;
+
+    use super::*;
+
+    fn parse_term(s: &str) -> (TermDag, Term) {
+        let e = crate::ast::parse_expr(s).unwrap();
+        let mut td = TermDag::default();
+        let t = td.expr_to_term(&e);
+        (td, t)
+    }
+
+    #[test]
+    fn test_to_from_expr() {
+        let s = r#"(f (g x y) x y (g x y))"#;
+        let e = crate::ast::parse_expr(s).unwrap();
+        let mut td = TermDag::default();
+        assert_eq!(td.size(), 0);
+        let t = td.expr_to_term(&e);
+        assert_eq!(td.size(), 4);
+        // the expression above has 4 distinct subterms.
+        // in left-to-right, depth-first order, they are:
+        //     x, y, (g x y), and the root call to f
+        // so we can compute expected answer by hand:
+        assert_eq!(
+            td.nodes,
+            vec![
+                Term::Var("x".into()),
+                Term::Var("y".into()),
+                Term::App("g".into(), vec![0, 1].into_iter().map(TermId).collect()),
+                Term::App(
+                    "f".into(),
+                    vec![2, 0, 1, 2].into_iter().map(TermId).collect()
+                ),
+            ]
+        );
+        let e2 = td.term_to_expr(&t);
+        assert_eq!(e, e2); // roundtrip
+    }
+
+    #[test]
+    fn test_match_term_app() {
+        let s = r#"(f (g x y) x y (g x y))"#;
+        let (td, t) = parse_term(s);
+        match_term_app!(t; {
+            ("f", [_, x, _, _]) =>
+                assert_eq!(td.term_to_expr(&td.get(*x)), ast::Expr::Var(Symbol::new("x")))
+        })
+    }
+
+    #[test]
+    fn test_to_string() {
+        let s = r#"(f (g x y) x y (g x y))"#;
+        let (td, t) = parse_term(s);
+        assert_eq!(td.to_string(&t), s);
+    }
+
+    #[test]
+    fn test_lookup() {
+        let s = r#"(f (g x y) x y (g x y))"#;
+        let (td, t) = parse_term(s);
+        assert_eq!(td.lookup(&t).0, td.size() - 1);
+    }
+
+    #[test]
+    fn test_app_var_lit() {
+        let s = r#"(f (g x y) x 7 (g x y))"#;
+        let (mut td, t) = parse_term(s);
+        let x = td.var("x".into());
+        let y = td.var("y".into());
+        let seven = td.lit(7.into());
+        let g = td.app("g".into(), vec![x.clone(), y.clone()]);
+        let t2 = td.app("f".into(), vec![g.clone(), x, seven, g]);
+        assert_eq!(t, t2);
+    }
+}
+
\ No newline at end of file diff --git a/docs/src/egglog/typecheck.rs.html b/docs/src/egglog/typecheck.rs.html new file mode 100644 index 000000000..10fc96a44 --- /dev/null +++ b/docs/src/egglog/typecheck.rs.html @@ -0,0 +1,1869 @@ +typecheck.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+390
+391
+392
+393
+394
+395
+396
+397
+398
+399
+400
+401
+402
+403
+404
+405
+406
+407
+408
+409
+410
+411
+412
+413
+414
+415
+416
+417
+418
+419
+420
+421
+422
+423
+424
+425
+426
+427
+428
+429
+430
+431
+432
+433
+434
+435
+436
+437
+438
+439
+440
+441
+442
+443
+444
+445
+446
+447
+448
+449
+450
+451
+452
+453
+454
+455
+456
+457
+458
+459
+460
+461
+462
+463
+464
+465
+466
+467
+468
+469
+470
+471
+472
+473
+474
+475
+476
+477
+478
+479
+480
+481
+482
+483
+484
+485
+486
+487
+488
+489
+490
+491
+492
+493
+494
+495
+496
+497
+498
+499
+500
+501
+502
+503
+504
+505
+506
+507
+508
+509
+510
+511
+512
+513
+514
+515
+516
+517
+518
+519
+520
+521
+522
+523
+524
+525
+526
+527
+528
+529
+530
+531
+532
+533
+534
+535
+536
+537
+538
+539
+540
+541
+542
+543
+544
+545
+546
+547
+548
+549
+550
+551
+552
+553
+554
+555
+556
+557
+558
+559
+560
+561
+562
+563
+564
+565
+566
+567
+568
+569
+570
+571
+572
+573
+574
+575
+576
+577
+578
+579
+580
+581
+582
+583
+584
+585
+586
+587
+588
+589
+590
+591
+592
+593
+594
+595
+596
+597
+598
+599
+600
+601
+602
+603
+604
+605
+606
+607
+608
+609
+610
+611
+612
+613
+614
+615
+616
+617
+618
+619
+620
+621
+622
+623
+624
+625
+626
+627
+628
+629
+630
+631
+632
+633
+634
+635
+636
+637
+638
+639
+640
+641
+642
+643
+644
+645
+646
+647
+648
+649
+650
+651
+652
+653
+654
+655
+656
+657
+658
+659
+660
+661
+662
+663
+664
+665
+666
+667
+668
+669
+670
+671
+672
+673
+674
+675
+676
+677
+678
+679
+680
+681
+682
+683
+684
+685
+686
+687
+688
+689
+690
+691
+692
+693
+694
+695
+696
+697
+698
+699
+700
+701
+702
+703
+704
+705
+706
+707
+708
+709
+710
+711
+712
+713
+714
+715
+716
+717
+718
+719
+720
+721
+722
+723
+724
+725
+726
+727
+728
+729
+730
+731
+732
+733
+734
+735
+736
+737
+738
+739
+740
+741
+742
+743
+744
+745
+746
+747
+748
+749
+750
+751
+752
+753
+754
+755
+756
+757
+758
+759
+760
+761
+762
+763
+764
+765
+766
+767
+768
+769
+770
+771
+772
+773
+774
+775
+776
+777
+778
+779
+780
+781
+782
+783
+784
+785
+786
+787
+788
+789
+790
+791
+792
+793
+794
+795
+796
+797
+798
+799
+800
+801
+802
+803
+804
+805
+806
+807
+808
+809
+810
+811
+812
+813
+814
+815
+816
+817
+818
+819
+820
+821
+822
+823
+824
+825
+826
+827
+828
+829
+830
+831
+832
+833
+834
+835
+836
+837
+838
+839
+840
+841
+842
+843
+844
+845
+846
+847
+848
+849
+850
+851
+852
+853
+854
+855
+856
+857
+858
+859
+860
+861
+862
+863
+864
+865
+866
+867
+868
+869
+870
+871
+872
+873
+874
+875
+876
+877
+878
+879
+880
+881
+882
+883
+884
+885
+886
+887
+888
+889
+890
+891
+892
+893
+894
+895
+896
+897
+898
+899
+900
+901
+902
+903
+904
+905
+906
+907
+908
+909
+910
+911
+912
+913
+914
+915
+916
+917
+918
+919
+920
+921
+922
+923
+924
+925
+926
+927
+928
+929
+930
+931
+932
+933
+934
+
use crate::*;
+use indexmap::map::Entry as IEntry;
+use typechecking::TypeError;
+
+pub struct Context<'a> {
+    pub egraph: &'a EGraph,
+    pub types: IndexMap<Symbol, ArcSort>,
+    unit: ArcSort,
+    errors: Vec<TypeError>,
+    unionfind: UnionFind,
+    nodes: HashMap<ENode, Id>,
+}
+
+#[derive(Hash, Eq, PartialEq, Clone)]
+enum ENode {
+    Func(Symbol, Vec<Id>),
+    Prim(Primitive, Vec<Id>),
+    Literal(Literal),
+    Var(Symbol),
+}
+
+#[derive(Debug, Clone, PartialEq, Eq)]
+pub enum AtomTerm {
+    Var(Symbol),
+    Value(Value),
+    Global(Symbol),
+}
+
+impl std::fmt::Display for AtomTerm {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        match self {
+            AtomTerm::Var(v) => write!(f, "{}", v),
+            AtomTerm::Value(_) => write!(f, "<value>"),
+            AtomTerm::Global(g) => write!(f, "{}", g),
+        }
+    }
+}
+
+#[derive(Debug, Clone, PartialEq, Eq)]
+pub struct Atom<T> {
+    pub head: T,
+    pub args: Vec<AtomTerm>,
+}
+
+impl<T: std::fmt::Display> std::fmt::Display for Atom<T> {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        write!(f, "({} {}) ", self.head, ListDisplay(&self.args, " "))
+    }
+}
+
+#[derive(Default, Debug, Clone)]
+pub struct Query {
+    pub atoms: Vec<Atom<Symbol>>,
+    pub filters: Vec<Atom<Primitive>>,
+}
+
+impl std::fmt::Display for Query {
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        for atom in &self.atoms {
+            writeln!(f, "{atom}")?;
+        }
+        if !self.filters.is_empty() {
+            writeln!(f, "where ")?;
+            for filter in &self.filters {
+                writeln!(
+                    f,
+                    "({} {})",
+                    filter.head.name(),
+                    ListDisplay(&filter.args, " ")
+                )?;
+            }
+        }
+        Ok(())
+    }
+}
+
+impl<T> Atom<T> {
+    pub fn vars(&self) -> impl Iterator<Item = Symbol> + '_ {
+        self.args.iter().filter_map(|t| match t {
+            AtomTerm::Var(v) => Some(*v),
+            AtomTerm::Value(_) => None,
+            AtomTerm::Global(_) => None,
+        })
+    }
+}
+
+pub(crate) struct ValueEq {}
+
+impl PrimitiveLike for ValueEq {
+    fn name(&self) -> Symbol {
+        "value-eq".into()
+    }
+
+    fn accept(&self, types: &[ArcSort]) -> Option<ArcSort> {
+        match types {
+            [a, b] if a.name() == b.name() => Some(a.clone()),
+            _ => None,
+        }
+    }
+
+    fn apply(&self, values: &[Value]) -> Option<Value> {
+        assert_eq!(values.len(), 2);
+        if values[0] == values[1] {
+            Some(values[0])
+        } else {
+            None
+        }
+    }
+}
+
+impl<'a> Context<'a> {
+    pub fn new(egraph: &'a EGraph) -> Self {
+        Self {
+            egraph,
+            unit: egraph.proof_state.type_info.sorts[&Symbol::from(UNIT_SYM)].clone(),
+            types: Default::default(),
+            errors: Vec::default(),
+            unionfind: UnionFind::default(),
+            nodes: HashMap::default(),
+        }
+    }
+
+    fn add_node(&mut self, node: ENode) -> Id {
+        let entry = self.nodes.entry(node);
+        *entry.or_insert_with(|| self.unionfind.make_set())
+    }
+
+    pub fn typecheck_query(
+        &mut self,
+        facts: &'a [Fact],
+        actions: &'a [Action],
+    ) -> Result<(Query, Vec<Action>), Vec<TypeError>> {
+        for fact in facts {
+            self.typecheck_fact(fact);
+        }
+
+        // congruence isn't strictly necessary, but it can eliminate some redundant atoms
+        self.rebuild();
+
+        // First find the canoncial version of each leaf
+        let mut leaves = HashMap::<Id, Expr>::default();
+        let mut canon = HashMap::<Symbol, Expr>::default();
+
+        // Do literals first
+        for (node, &id) in &self.nodes {
+            match node {
+                ENode::Literal(lit) => {
+                    let old = leaves.insert(id, Expr::Lit(lit.clone()));
+                    if let Some(Expr::Lit(old_lit)) = old {
+                        panic!("Duplicate literal: {:?} {:?}", old_lit, lit);
+                    }
+                }
+                _ => continue,
+            }
+        }
+        // Globally bound variables first
+        for (node, &id) in &self.nodes {
+            match node {
+                ENode::Var(var) => {
+                    if self.egraph.global_bindings.get(var).is_some() {
+                        match leaves.entry(id) {
+                            Entry::Occupied(existing) => {
+                                canon.insert(*var, existing.get().clone());
+                            }
+                            Entry::Vacant(v) => {
+                                v.insert(Expr::Var(*var));
+                            }
+                        }
+                    }
+                }
+                _ => continue,
+            }
+        }
+
+        // Now do variables
+        for (node, &id) in &self.nodes {
+            debug_assert_eq!(id, self.unionfind.find(id));
+            match node {
+                ENode::Var(var) => match leaves.entry(id) {
+                    Entry::Occupied(existing) => {
+                        canon.insert(*var, existing.get().clone());
+                    }
+                    Entry::Vacant(v) => {
+                        v.insert(Expr::Var(*var));
+                    }
+                },
+                _ => continue,
+            }
+        }
+
+        // replace canonical things in the actions
+        let res_actions = actions.iter().map(|a| a.replace_canon(&canon)).collect();
+        for (var, _expr) in canon {
+            self.types.remove(&var);
+        }
+
+        let get_leaf = |id: &Id| -> AtomTerm {
+            let mk = || AtomTerm::Var(Symbol::from(format!("?__{}", id)));
+            match leaves.get(id) {
+                Some(Expr::Var(v)) => {
+                    if let Some((_ty, _value, _ts)) = self.egraph.global_bindings.get(v) {
+                        AtomTerm::Global(*v)
+                    } else {
+                        AtomTerm::Var(*v)
+                    }
+                }
+                Some(Expr::Lit(l)) => AtomTerm::Value(self.egraph.eval_lit(l)),
+                _ => mk(),
+            }
+        };
+
+        let mut query = Query::default();
+        let mut query_eclasses = HashSet::<Id>::default();
+        // Now we can fill in the nodes with the canonical leaves
+        for (node, id) in &self.nodes {
+            match node {
+                ENode::Func(f, ids) => {
+                    let args = ids.iter().chain([id]).map(get_leaf).collect();
+                    for id in ids {
+                        query_eclasses.insert(*id);
+                    }
+                    query.atoms.push(Atom { head: *f, args });
+                }
+                ENode::Prim(p, ids) => {
+                    let mut args = vec![];
+                    for child in ids {
+                        let leaf = get_leaf(child);
+                        if let AtomTerm::Var(v) = leaf {
+                            if self.egraph.global_bindings.contains_key(&v) {
+                                args.push(AtomTerm::Value(self.egraph.global_bindings[&v].1));
+                                continue;
+                            }
+                        }
+                        args.push(get_leaf(child));
+                        query_eclasses.insert(*child);
+                    }
+                    args.push(get_leaf(id));
+                    query.filters.push(Atom {
+                        head: p.clone(),
+                        args,
+                    });
+                }
+                _ => {}
+            }
+        }
+
+        // filter for global variables
+        for node in &self.nodes {
+            if let ENode::Var(var) = node.0 {
+                if self.egraph.global_bindings.contains_key(var) {
+                    let canon = get_leaf(node.1);
+                    if canon != AtomTerm::Global(*var) {
+                        // compare global to canon
+                        query.filters.push(Atom {
+                            head: Primitive(Arc::new(ValueEq {})),
+                            args: vec![canon.clone(), AtomTerm::Global(*var), canon],
+                        });
+                    }
+                }
+            }
+        }
+
+        if self.errors.is_empty() {
+            Ok((query, res_actions))
+        } else {
+            Err(self.errors.clone())
+        }
+    }
+
+    fn rebuild(&mut self) {
+        let mut keep_going = true;
+        while keep_going {
+            keep_going = false;
+            let nodes = std::mem::take(&mut self.nodes);
+            for (mut node, id) in nodes {
+                // canonicalize
+                let id = self.unionfind.find(id);
+                if let ENode::Func(_, children) | ENode::Prim(_, children) = &mut node {
+                    for child in children {
+                        *child = self.unionfind.find(*child);
+                    }
+                }
+
+                // reinsert and handle hit
+                if let Some(old) = self.nodes.insert(node.clone(), id) {
+                    keep_going = true;
+                    self.unionfind.union_raw(old, id);
+                }
+            }
+        }
+    }
+
+    fn typecheck_fact(&mut self, fact: &Fact) {
+        match fact {
+            Fact::Eq(exprs) => {
+                assert!(exprs.len() == 2);
+                let mut later = vec![];
+                let mut ty: Option<ArcSort> = None;
+                let mut ids = Vec::with_capacity(exprs.len());
+                for expr in exprs {
+                    match (expr, &ty) {
+                        (_, Some(expected)) => {
+                            ids.push(self.check_query_expr(expr, expected.clone()))
+                        }
+                        // This is a variable the we couldn't infer the type of,
+                        // so we'll try again later when we can check its type
+                        (Expr::Var(v), None)
+                            if !self.types.contains_key(v)
+                                && !self.egraph.global_bindings.contains_key(v) =>
+                        {
+                            later.push(expr)
+                        }
+                        (_, None) => match self.infer_query_expr(expr) {
+                            (_, None) => (),
+                            (id, Some(t)) => {
+                                ty = Some(t);
+                                ids.push(id);
+                            }
+                        },
+                    }
+                }
+
+                if let Some(ty) = ty {
+                    for e in later {
+                        ids.push(self.check_query_expr(e, ty.clone()));
+                    }
+                } else {
+                    for e in later {
+                        self.errors.push(TypeError::InferenceFailure(e.clone()));
+                    }
+                }
+
+                ids.into_iter()
+                    .reduce(|a, b| self.unionfind.union_raw(a, b));
+            }
+            Fact::Fact(e) => {
+                self.check_query_expr(e, self.unit.clone());
+            }
+        }
+    }
+
+    fn check_query_expr(&mut self, expr: &Expr, expected: ArcSort) -> Id {
+        match expr {
+            Expr::Var(sym) => {
+                match self.types.entry(*sym) {
+                    IEntry::Occupied(ty) => {
+                        // TODO name comparison??
+                        if ty.get().name() != expected.name() {
+                            self.errors.push(TypeError::Mismatch {
+                                expr: expr.clone(),
+                                expected,
+                                actual: ty.get().clone(),
+                                reason: "mismatch".into(),
+                            })
+                        }
+                    }
+                    // we can actually bind the variable here
+                    IEntry::Vacant(entry) => {
+                        entry.insert(expected);
+                    }
+                }
+                self.add_node(ENode::Var(*sym))
+            }
+            _ => {
+                let (id, actual) = self.infer_query_expr(expr);
+                if let Some(actual) = actual {
+                    if actual.name() != expected.name() {
+                        self.errors.push(TypeError::Mismatch {
+                            expr: expr.clone(),
+                            expected,
+                            actual,
+                            reason: "mismatch".into(),
+                        })
+                    }
+                }
+                id
+            }
+        }
+    }
+
+    fn infer_query_expr(&mut self, expr: &Expr) -> (Id, Option<ArcSort>) {
+        match expr {
+            Expr::Var(sym) => {
+                if self.egraph.functions.contains_key(sym) {
+                    return self.infer_query_expr(&Expr::call(*sym, []));
+                }
+
+                let ty = if let Some(ty) = self.types.get(sym) {
+                    Some(ty.clone())
+                } else if let Some(ty) = self.egraph.global_bindings.get(sym) {
+                    Some(ty.0.clone())
+                } else {
+                    self.errors.push(TypeError::Unbound(*sym));
+                    None
+                };
+                (self.add_node(ENode::Var(*sym)), ty)
+            }
+            Expr::Lit(lit) => {
+                let t = self.egraph.proof_state.type_info.infer_literal(lit);
+                (self.add_node(ENode::Literal(lit.clone())), Some(t))
+            }
+            Expr::Call(sym, args) => {
+                if let Some(f) = self.egraph.functions.get(sym) {
+                    if f.schema.input.len() != args.len() {
+                        self.errors.push(TypeError::Arity {
+                            expr: expr.clone(),
+                            expected: f.schema.input.len(),
+                        });
+                    }
+
+                    let ids: Vec<Id> = args
+                        .iter()
+                        .zip(&f.schema.input)
+                        .map(|(arg, ty)| self.check_query_expr(arg, ty.clone()))
+                        .collect();
+                    let t = f.schema.output.clone();
+                    (self.add_node(ENode::Func(*sym, ids)), Some(t))
+                } else if let Some(prims) = self.egraph.proof_state.type_info.primitives.get(sym) {
+                    let (ids, arg_tys): (Vec<Id>, Vec<Option<ArcSort>>) =
+                        args.iter().map(|arg| self.infer_query_expr(arg)).unzip();
+
+                    if let Some(arg_tys) = arg_tys.iter().cloned().collect::<Option<Vec<ArcSort>>>()
+                    {
+                        for prim in prims {
+                            if let Some(output_type) = prim.accept(&arg_tys) {
+                                let id = self.add_node(ENode::Prim(prim.clone(), ids));
+                                return (id, Some(output_type));
+                            }
+                        }
+                        self.errors.push(TypeError::NoMatchingPrimitive {
+                            op: *sym,
+                            inputs: arg_tys.iter().map(|t| t.name()).collect(),
+                        });
+                    }
+
+                    (self.unionfind.make_set(), None)
+                } else {
+                    self.errors.push(TypeError::Unbound(*sym));
+                    (self.unionfind.make_set(), None)
+                }
+            }
+        }
+    }
+}
+
+struct ActionChecker<'a> {
+    egraph: &'a EGraph,
+    types: &'a IndexMap<Symbol, ArcSort>,
+    locals: IndexMap<Symbol, ArcSort>,
+    instructions: Vec<Instruction>,
+}
+
+impl<'a> ActionChecker<'a> {
+    fn check_action(&mut self, action: &Action) -> Result<(), TypeError> {
+        match action {
+            Action::Let(v, e) => {
+                if self.types.contains_key(v) || self.locals.contains_key(v) {
+                    return Err(TypeError::AlreadyDefined(*v));
+                }
+                let (_, ty) = self.infer_expr(e)?;
+                self.locals.insert(*v, ty);
+                Ok(())
+            }
+            Action::Set(f, args, val) => {
+                let fake_call = Expr::Call(*f, args.clone());
+                let (_, ty) = self.infer_expr(&fake_call)?;
+                let fake_instr = self.instructions.pop().unwrap();
+                assert!(matches!(fake_instr, Instruction::CallFunction(..)));
+                self.check_expr(val, ty)?;
+                self.instructions.push(Instruction::Set(*f));
+                Ok(())
+            }
+            Action::Extract(variable, variants) => {
+                let (_, _ty) = self.infer_expr(variable)?;
+                let (_, _ty2) = self.infer_expr(variants)?;
+                self.instructions.push(Instruction::Extract(2));
+                Ok(())
+            }
+            Action::Delete(f, args) => {
+                let fake_call = Expr::Call(*f, args.clone());
+                let (_, _ty) = self.infer_expr(&fake_call)?;
+                let fake_instr = self.instructions.pop().unwrap();
+                assert!(matches!(fake_instr, Instruction::CallFunction(..)));
+                self.instructions.push(Instruction::DeleteRow(*f));
+                Ok(())
+            }
+            Action::Union(a, b) => {
+                let (_, ty) = self.infer_expr(a)?;
+                if !ty.is_eq_sort() {
+                    panic!("Base types cannot be unioned")
+                }
+                self.check_expr(b, ty)?;
+                self.instructions.push(Instruction::Union(2));
+                Ok(())
+            }
+            Action::Panic(msg) => {
+                self.instructions.push(Instruction::Panic(msg.clone()));
+                Ok(())
+            }
+            Action::Expr(expr) => {
+                self.infer_expr(expr)?;
+                self.instructions.push(Instruction::Pop);
+                Ok(())
+            }
+        }
+    }
+}
+
+impl<'a> ExprChecker<'a> for ActionChecker<'a> {
+    type T = ();
+
+    fn egraph(&self) -> &'a EGraph {
+        self.egraph
+    }
+
+    fn do_lit(&mut self, lit: &Literal) -> Self::T {
+        self.instructions.push(Instruction::Literal(lit.clone()));
+    }
+
+    fn infer_var(&mut self, sym: Symbol) -> Result<(Self::T, ArcSort), TypeError> {
+        if let Some((sort, _v, _ts)) = self.egraph().global_bindings.get(&sym) {
+            self.instructions.push(Instruction::Global(sym));
+            Ok(((), sort.clone()))
+        } else if let Some((i, _, ty)) = self.locals.get_full(&sym) {
+            self.instructions.push(Instruction::Load(Load::Stack(i)));
+            Ok(((), ty.clone()))
+        } else if let Some((i, _, ty)) = self.types.get_full(&sym) {
+            self.instructions.push(Instruction::Load(Load::Subst(i)));
+            Ok(((), ty.clone()))
+        } else {
+            Err(TypeError::Unbound(sym))
+        }
+    }
+
+    fn do_function(&mut self, f: Symbol, _args: Vec<Self::T>) -> Self::T {
+        let func_type = self
+            .egraph
+            .proof_state
+            .type_info
+            .func_types
+            .get(&f)
+            .unwrap();
+        self.instructions.push(Instruction::CallFunction(
+            f,
+            func_type.has_default || !func_type.has_merge,
+        ));
+    }
+
+    fn do_prim(&mut self, prim: Primitive, args: Vec<Self::T>) -> Self::T {
+        self.instructions
+            .push(Instruction::CallPrimitive(prim, args.len()));
+    }
+}
+
+trait ExprChecker<'a> {
+    type T;
+    fn egraph(&self) -> &'a EGraph;
+    fn do_lit(&mut self, lit: &Literal) -> Self::T;
+    fn do_function(&mut self, f: Symbol, args: Vec<Self::T>) -> Self::T;
+    fn do_prim(&mut self, prim: Primitive, args: Vec<Self::T>) -> Self::T;
+
+    fn infer_var(&mut self, var: Symbol) -> Result<(Self::T, ArcSort), TypeError>;
+    fn check_var(&mut self, var: Symbol, ty: ArcSort) -> Result<Self::T, TypeError> {
+        let (t, actual) = self.infer_var(var)?;
+        if actual.name() != ty.name() {
+            Err(TypeError::Mismatch {
+                expr: Expr::Var(var),
+                expected: ty,
+                actual,
+                reason: "mismatch".into(),
+            })
+        } else {
+            Ok(t)
+        }
+    }
+
+    fn check_expr(&mut self, expr: &Expr, ty: ArcSort) -> Result<Self::T, TypeError> {
+        match expr {
+            Expr::Var(v) if !self.is_variable(*v) => self.check_var(*v, ty),
+            _ => {
+                let (t, actual) = self.infer_expr(expr)?;
+                if actual.name() != ty.name() {
+                    Err(TypeError::Mismatch {
+                        expr: expr.clone(),
+                        expected: ty,
+                        actual,
+                        reason: "mismatch".into(),
+                    })
+                } else {
+                    Ok(t)
+                }
+            }
+        }
+    }
+
+    fn is_variable(&self, sym: Symbol) -> bool {
+        self.egraph().global_bindings.contains_key(&sym)
+    }
+
+    fn infer_expr(&mut self, expr: &Expr) -> Result<(Self::T, ArcSort), TypeError> {
+        match expr {
+            Expr::Lit(lit) => {
+                let t = self.do_lit(lit);
+                Ok((t, self.egraph().proof_state.type_info.infer_literal(lit)))
+            }
+            Expr::Var(sym) => self.infer_var(*sym),
+            Expr::Call(sym, args) => {
+                if let Some(functype) = self.egraph().proof_state.type_info.func_types.get(sym) {
+                    assert!(functype.input.len() == args.len());
+
+                    let mut ts = vec![];
+                    for (expected, arg) in functype.input.iter().zip(args) {
+                        ts.push(self.check_expr(arg, expected.clone())?);
+                    }
+
+                    let t = self.do_function(*sym, ts);
+                    Ok((t, functype.output.clone()))
+                } else if let Some(prims) = self.egraph().proof_state.type_info.primitives.get(sym)
+                {
+                    let mut ts = Vec::with_capacity(args.len());
+                    let mut tys = Vec::with_capacity(args.len());
+                    for arg in args {
+                        let (t, ty) = self.infer_expr(arg)?;
+                        ts.push(t);
+                        tys.push(ty);
+                    }
+
+                    for prim in prims {
+                        if let Some(output_type) = prim.accept(&tys) {
+                            let t = self.do_prim(prim.clone(), ts);
+                            return Ok((t, output_type));
+                        }
+                    }
+
+                    Err(TypeError::NoMatchingPrimitive {
+                        op: *sym,
+                        inputs: tys.into_iter().map(|t| t.name()).collect(),
+                    })
+                } else {
+                    panic!("Unbound function {}", sym);
+                }
+            }
+        }
+    }
+}
+
+#[derive(Clone, Debug)]
+enum Load {
+    Stack(usize),
+    Subst(usize),
+}
+
+#[derive(Clone, Debug)]
+enum Instruction {
+    Literal(Literal),
+    Load(Load),
+    Global(Symbol),
+    // function to call, and whether to make defaults
+    CallFunction(Symbol, bool),
+    CallPrimitive(Primitive, usize),
+    DeleteRow(Symbol),
+    Set(Symbol),
+    Union(usize),
+    Extract(usize),
+    Panic(String),
+    Pop,
+}
+
+#[derive(Clone, Debug)]
+pub struct Program(Vec<Instruction>);
+
+impl EGraph {
+    pub fn compile_actions(
+        &self,
+        types: &IndexMap<Symbol, ArcSort>,
+        actions: &[Action],
+    ) -> Result<Program, Vec<TypeError>> {
+        let mut checker = ActionChecker {
+            egraph: self,
+            types,
+            locals: IndexMap::default(),
+            instructions: Vec::new(),
+        };
+
+        let mut errors = vec![];
+        for a in actions {
+            if let Err(err) = checker.check_action(a) {
+                errors.push(err);
+            }
+        }
+
+        if errors.is_empty() {
+            Ok(Program(checker.instructions))
+        } else {
+            Err(errors)
+        }
+    }
+
+    pub fn compile_expr(
+        &self,
+        types: &IndexMap<Symbol, ArcSort>,
+        expr: &Expr,
+        expected_type: Option<ArcSort>,
+    ) -> Result<(ArcSort, Program), Vec<TypeError>> {
+        let mut checker = ActionChecker {
+            egraph: self,
+            types,
+            locals: IndexMap::default(),
+            instructions: Vec::new(),
+        };
+
+        let t: ArcSort = if let Some(expected) = expected_type {
+            checker
+                .check_expr(expr, expected.clone())
+                .map_err(|err| vec![err])?;
+            expected
+        } else {
+            checker.infer_expr(expr).map_err(|err| vec![err])?.1
+        };
+
+        Ok((t, Program(checker.instructions)))
+    }
+
+    pub fn run_actions(
+        &mut self,
+        stack: &mut Vec<Value>,
+        subst: &[Value],
+        program: &Program,
+        make_defaults: bool,
+    ) -> Result<(), Error> {
+        for instr in &program.0 {
+            match instr {
+                Instruction::Global(sym) => {
+                    let (_ty, value, _ts) = self.global_bindings.get(sym).unwrap();
+                    stack.push(*value);
+                }
+                Instruction::Load(load) => match load {
+                    Load::Stack(idx) => stack.push(stack[*idx]),
+                    Load::Subst(idx) => stack.push(subst[*idx]),
+                },
+                Instruction::CallFunction(f, make_defaults_func) => {
+                    let make_defaults = make_defaults && *make_defaults_func;
+                    let function = self.functions.get_mut(f).unwrap();
+                    let output_tag = function.schema.output.name();
+                    let new_len = stack.len() - function.schema.input.len();
+                    let values = &stack[new_len..];
+
+                    if cfg!(debug_assertions) {
+                        for (ty, val) in function.schema.input.iter().zip(values) {
+                            assert_eq!(ty.name(), val.tag,);
+                        }
+                    }
+
+                    let value = if let Some(out) = function.nodes.get(values) {
+                        out.value
+                    } else if make_defaults {
+                        if function.merge.on_merge.is_some() {
+                            panic!("No value found for function {} with values {:?}", f, values);
+                        }
+                        let ts = self.timestamp;
+                        let out = &function.schema.output;
+                        match function.decl.default.as_ref() {
+                            None if out.name() == UNIT_SYM.into() => {
+                                function.insert(values, Value::unit(), ts);
+                                Value::unit()
+                            }
+                            None if out.is_eq_sort() => {
+                                let id = self.unionfind.make_set();
+                                let value = Value::from_id(out.name(), id);
+                                function.insert(values, value, ts);
+                                value
+                            }
+                            Some(default) => {
+                                // TODO: this is not efficient due to cloning
+                                let out = out.clone();
+                                let default = default.clone();
+                                let (_, value) = self.eval_expr(&default, Some(out), true)?;
+                                self.functions.get_mut(f).unwrap().insert(values, value, ts);
+                                value
+                            }
+                            _ => {
+                                return Err(Error::NotFoundError(NotFoundError(Expr::Var(
+                                    format!("No value found for {f} {:?}", values).into(),
+                                ))))
+                            }
+                        }
+                    } else {
+                        return Err(Error::NotFoundError(NotFoundError(Expr::Var(
+                            format!("No value found for {f} {:?}", values).into(),
+                        ))));
+                    };
+
+                    debug_assert_eq!(output_tag, value.tag);
+                    stack.truncate(new_len);
+                    stack.push(value);
+                }
+                Instruction::CallPrimitive(p, arity) => {
+                    let new_len = stack.len() - arity;
+                    let values = &stack[new_len..];
+                    if let Some(value) = p.apply(values) {
+                        stack.truncate(new_len);
+                        stack.push(value);
+                    } else {
+                        return Err(Error::PrimitiveError(p.clone(), values.to_vec()));
+                    }
+                }
+                Instruction::Set(f) => {
+                    assert!(make_defaults);
+                    let function = self.functions.get_mut(f).unwrap();
+                    // desugaring should have desugared
+                    // set to union
+                    // except for setting the parent relation
+                    let new_value = stack.pop().unwrap();
+                    let new_len = stack.len() - function.schema.input.len();
+                    let args = &stack[new_len..];
+
+                    // We should only have canonical values here: omit the canonicalization step
+                    let old_value = function.get(args);
+
+                    if let Some(old_value) = old_value {
+                        if new_value != old_value {
+                            let merged: Value = match function.merge.merge_vals.clone() {
+                                MergeFn::AssertEq => {
+                                    return Err(Error::MergeError(*f, new_value, old_value));
+                                }
+                                MergeFn::Union => {
+                                    self.unionfind
+                                        .union_values(old_value, new_value, old_value.tag)
+                                }
+                                MergeFn::Expr(merge_prog) => {
+                                    let values = [old_value, new_value];
+                                    let old_len = stack.len();
+                                    self.run_actions(stack, &values, &merge_prog, true)?;
+                                    let result = stack.pop().unwrap();
+                                    stack.truncate(old_len);
+                                    result
+                                }
+                            };
+                            if merged != old_value {
+                                let args = &stack[new_len..];
+                                let function = self.functions.get_mut(f).unwrap();
+                                function.insert(args, merged, self.timestamp);
+                            }
+                            // re-borrow
+                            let function = self.functions.get_mut(f).unwrap();
+                            if let Some(prog) = function.merge.on_merge.clone() {
+                                let values = [old_value, new_value];
+                                // XXX: we get an error if we pass the current
+                                // stack and then truncate it to the old length.
+                                // Why?
+                                self.run_actions(&mut Vec::new(), &values, &prog, true)?;
+                            }
+                        }
+                    } else {
+                        function.insert(args, new_value, self.timestamp);
+                    }
+                    stack.truncate(new_len)
+                }
+                Instruction::Union(arity) => {
+                    let new_len = stack.len() - arity;
+                    let values = &stack[new_len..];
+                    let sort = values[0].tag;
+                    let first = self.unionfind.find(Id::from(values[0].bits as usize));
+                    values[1..].iter().fold(first, |a, b| {
+                        let b = self.unionfind.find(Id::from(b.bits as usize));
+                        self.unionfind.union(a, b, sort)
+                    });
+                    stack.truncate(new_len);
+                }
+                Instruction::Extract(arity) => {
+                    let new_len = stack.len() - arity;
+                    let values = &stack[new_len..];
+                    let new_len = stack.len() - arity;
+                    let mut termdag = TermDag::default();
+                    let num_sort = values[1].tag;
+                    assert!(num_sort.to_string() == "i64");
+
+                    let variants = values[1].bits as i64;
+                    if variants == 0 {
+                        let (cost, expr) = self.extract(
+                            values[0],
+                            &mut termdag,
+                            self.proof_state
+                                .type_info
+                                .sorts
+                                .get(&values[0].tag)
+                                .unwrap(),
+                        );
+                        let extracted = termdag.to_string(&expr);
+                        log::info!("extracted with cost {cost}: {}", extracted);
+                        self.print_msg(extracted);
+                    } else {
+                        if variants < 0 {
+                            panic!("Cannot extract negative number of variants");
+                        }
+                        let extracted =
+                            self.extract_variants(values[0], variants as usize, &mut termdag);
+                        log::info!("extracted variants:");
+                        let mut msg = String::default();
+                        msg += "(\n";
+                        assert!(!extracted.is_empty());
+                        for expr in extracted {
+                            let str = termdag.to_string(&expr);
+                            log::info!("   {}", str);
+                            msg += &format!("   {}\n", str);
+                        }
+                        msg += ")";
+                        self.print_msg(msg);
+                    }
+
+                    stack.truncate(new_len);
+                }
+                Instruction::Panic(msg) => panic!("Panic: {}", msg),
+                Instruction::Literal(lit) => match lit {
+                    Literal::Int(i) => stack.push(Value::from(*i)),
+                    Literal::F64(f) => stack.push(Value::from(*f)),
+                    Literal::String(s) => stack.push(Value::from(*s)),
+                    Literal::Unit => stack.push(Value::unit()),
+                },
+                Instruction::Pop => {
+                    stack.pop().unwrap();
+                }
+                Instruction::DeleteRow(f) => {
+                    let function = self.functions.get_mut(f).unwrap();
+                    let new_len = stack.len() - function.schema.input.len();
+                    let args = &stack[new_len..];
+                    function.remove(args, self.timestamp);
+                    stack.truncate(new_len);
+                }
+            }
+        }
+        Ok(())
+    }
+}
+
\ No newline at end of file diff --git a/docs/src/egglog/typechecking.rs.html b/docs/src/egglog/typechecking.rs.html new file mode 100644 index 000000000..2bda9075c --- /dev/null +++ b/docs/src/egglog/typechecking.rs.html @@ -0,0 +1,1353 @@ +typechecking.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+390
+391
+392
+393
+394
+395
+396
+397
+398
+399
+400
+401
+402
+403
+404
+405
+406
+407
+408
+409
+410
+411
+412
+413
+414
+415
+416
+417
+418
+419
+420
+421
+422
+423
+424
+425
+426
+427
+428
+429
+430
+431
+432
+433
+434
+435
+436
+437
+438
+439
+440
+441
+442
+443
+444
+445
+446
+447
+448
+449
+450
+451
+452
+453
+454
+455
+456
+457
+458
+459
+460
+461
+462
+463
+464
+465
+466
+467
+468
+469
+470
+471
+472
+473
+474
+475
+476
+477
+478
+479
+480
+481
+482
+483
+484
+485
+486
+487
+488
+489
+490
+491
+492
+493
+494
+495
+496
+497
+498
+499
+500
+501
+502
+503
+504
+505
+506
+507
+508
+509
+510
+511
+512
+513
+514
+515
+516
+517
+518
+519
+520
+521
+522
+523
+524
+525
+526
+527
+528
+529
+530
+531
+532
+533
+534
+535
+536
+537
+538
+539
+540
+541
+542
+543
+544
+545
+546
+547
+548
+549
+550
+551
+552
+553
+554
+555
+556
+557
+558
+559
+560
+561
+562
+563
+564
+565
+566
+567
+568
+569
+570
+571
+572
+573
+574
+575
+576
+577
+578
+579
+580
+581
+582
+583
+584
+585
+586
+587
+588
+589
+590
+591
+592
+593
+594
+595
+596
+597
+598
+599
+600
+601
+602
+603
+604
+605
+606
+607
+608
+609
+610
+611
+612
+613
+614
+615
+616
+617
+618
+619
+620
+621
+622
+623
+624
+625
+626
+627
+628
+629
+630
+631
+632
+633
+634
+635
+636
+637
+638
+639
+640
+641
+642
+643
+644
+645
+646
+647
+648
+649
+650
+651
+652
+653
+654
+655
+656
+657
+658
+659
+660
+661
+662
+663
+664
+665
+666
+667
+668
+669
+670
+671
+672
+673
+674
+675
+676
+
use crate::{proofs::RULE_PROOF_KEYWORD, *};
+
+#[derive(Clone, Debug)]
+pub struct FuncType {
+    pub input: Vec<ArcSort>,
+    pub output: ArcSort,
+    pub has_merge: bool,
+    pub has_default: bool,
+}
+
+impl FuncType {
+    pub fn new(input: Vec<ArcSort>, output: ArcSort, has_merge: bool, has_default: bool) -> Self {
+        Self {
+            input,
+            output,
+            has_merge,
+            has_default,
+        }
+    }
+}
+
+#[derive(Clone)]
+pub struct TypeInfo {
+    // get the sort from the sorts name()
+    pub presorts: HashMap<Symbol, PreSort>,
+    pub presort_names: HashSet<Symbol>,
+    pub sorts: HashMap<Symbol, Arc<dyn Sort>>,
+    pub primitives: HashMap<Symbol, Vec<Primitive>>,
+    pub func_types: HashMap<Symbol, FuncType>,
+    pub global_types: HashMap<Symbol, ArcSort>,
+    pub local_types: HashMap<CommandId, HashMap<Symbol, ArcSort>>,
+}
+
+impl Default for TypeInfo {
+    fn default() -> Self {
+        let mut res = Self {
+            presorts: Default::default(),
+            presort_names: Default::default(),
+            sorts: Default::default(),
+            primitives: Default::default(),
+            func_types: Default::default(),
+            global_types: Default::default(),
+            local_types: Default::default(),
+        };
+
+        res.add_sort(UnitSort::new(UNIT_SYM.into()));
+        res.add_sort(StringSort::new("String".into()));
+        res.add_sort(I64Sort::new("i64".into()));
+        res.add_sort(F64Sort::new("f64".into()));
+        res.add_sort(RationalSort::new("Rational".into()));
+
+        res.presort_names.extend(MapSort::presort_names());
+        res.presort_names.extend(SetSort::presort_names());
+        res.presort_names.extend(VecSort::presort_names());
+
+        res.presorts.insert("Map".into(), MapSort::make_sort);
+        res.presorts.insert("Set".into(), SetSort::make_sort);
+        res.presorts.insert("Vec".into(), VecSort::make_sort);
+
+        res
+    }
+}
+
+pub const UNIT_SYM: &str = "Unit";
+
+impl TypeInfo {
+    pub(crate) fn infer_literal(&self, lit: &Literal) -> ArcSort {
+        match lit {
+            Literal::Int(_) => self.sorts.get(&Symbol::from("i64")),
+            Literal::F64(_) => self.sorts.get(&Symbol::from("f64")),
+            Literal::String(_) => self.sorts.get(&Symbol::from("String")),
+            Literal::Unit => self.sorts.get(&Symbol::from("Unit")),
+        }
+        .unwrap()
+        .clone()
+    }
+
+    pub fn add_sort<S: Sort + 'static>(&mut self, sort: S) {
+        self.add_arcsort(Arc::new(sort)).unwrap()
+    }
+
+    pub fn add_arcsort(&mut self, sort: ArcSort) -> Result<(), TypeError> {
+        let name = sort.name();
+
+        match self.sorts.entry(name) {
+            Entry::Occupied(_) => Err(TypeError::SortAlreadyBound(name)),
+            Entry::Vacant(e) => {
+                e.insert(sort.clone());
+                sort.register_primitives(self);
+                Ok(())
+            }
+        }
+    }
+
+    pub fn get_sort<S: Sort + Send + Sync>(&self) -> Arc<S> {
+        for sort in self.sorts.values() {
+            let sort = sort.clone().as_arc_any();
+            if let Ok(sort) = Arc::downcast(sort) {
+                return sort;
+            }
+        }
+
+        // TODO handle if multiple match?
+        // could handle by type id??
+        panic!("Failed to lookup sort: {}", std::any::type_name::<S>());
+    }
+
+    pub fn add_primitive(&mut self, prim: impl Into<Primitive>) {
+        let prim = prim.into();
+        self.primitives.entry(prim.name()).or_default().push(prim);
+    }
+
+    pub(crate) fn typecheck_program(
+        &mut self,
+        program: &Vec<NormCommand>,
+    ) -> Result<(), TypeError> {
+        for command in program {
+            self.typecheck_command(command)?;
+        }
+
+        Ok(())
+    }
+
+    pub(crate) fn function_to_functype(&self, func: &FunctionDecl) -> Result<FuncType, TypeError> {
+        let input = func
+            .schema
+            .input
+            .iter()
+            .map(|name| {
+                if let Some(sort) = self.sorts.get(name) {
+                    Ok(sort.clone())
+                } else {
+                    Err(TypeError::Unbound(*name))
+                }
+            })
+            .collect::<Result<Vec<_>, _>>()?;
+        let output = if let Some(sort) = self.sorts.get(&func.schema.output) {
+            Ok(sort.clone())
+        } else {
+            Err(TypeError::Unbound(func.schema.output))
+        }?;
+        Ok(FuncType::new(
+            input,
+            output,
+            func.merge.is_some(),
+            func.default.is_some(),
+        ))
+    }
+
+    fn typecheck_ncommand(&mut self, command: &NCommand, id: CommandId) -> Result<(), TypeError> {
+        match command {
+            NCommand::Function(fdecl) => {
+                if self.sorts.contains_key(&fdecl.name) {
+                    return Err(TypeError::SortAlreadyBound(fdecl.name));
+                }
+                if self.is_primitive(fdecl.name) {
+                    return Err(TypeError::PrimitiveAlreadyBound(fdecl.name));
+                }
+                let ftype = self.function_to_functype(fdecl)?;
+                if self.func_types.insert(fdecl.name, ftype).is_some() {
+                    return Err(TypeError::FunctionAlreadyBound(fdecl.name));
+                }
+            }
+            NCommand::NormRule {
+                rule,
+                ruleset: _,
+                name: _,
+            } => {
+                self.typecheck_rule(id, rule)?;
+            }
+            NCommand::Sort(sort, presort_and_args) => {
+                self.declare_sort(*sort, presort_and_args)?;
+            }
+            NCommand::NormAction(action) => {
+                self.typecheck_action(id, action, true)?;
+            }
+            NCommand::Check(facts) => {
+                self.typecheck_facts(id, facts)?;
+                self.verify_normal_form_facts(facts);
+            }
+            NCommand::Fail(cmd) => {
+                self.typecheck_ncommand(cmd, id)?;
+            }
+            NCommand::RunSchedule(schedule) => {
+                self.typecheck_schedule(id, schedule)?;
+            }
+
+            // TODO cover all cases in typechecking
+            _ => (),
+        }
+        Ok(())
+    }
+
+    fn typecheck_schedule(
+        &mut self,
+        ctx: CommandId,
+        schedule: &NormSchedule,
+    ) -> Result<(), TypeError> {
+        match schedule {
+            NormSchedule::Repeat(_times, schedule) => {
+                self.typecheck_schedule(ctx, schedule)?;
+            }
+            NormSchedule::Sequence(schedules) => {
+                for schedule in schedules {
+                    self.typecheck_schedule(ctx, schedule)?;
+                }
+            }
+            NormSchedule::Saturate(schedule) => {
+                self.typecheck_schedule(ctx, schedule)?;
+            }
+            NormSchedule::Run(run_config) => {
+                if let Some(facts) = &run_config.until {
+                    self.typecheck_facts(ctx, facts)?;
+                    self.verify_normal_form_facts(facts);
+                }
+            }
+        }
+
+        Result::Ok(())
+    }
+
+    pub(crate) fn typecheck_command(&mut self, command: &NormCommand) -> Result<(), TypeError> {
+        assert!(self
+            .local_types
+            .insert(command.metadata.id, Default::default())
+            .is_none());
+        self.typecheck_ncommand(&command.command, command.metadata.id)
+    }
+
+    pub fn declare_sort(
+        &mut self,
+        name: impl Into<Symbol>,
+        presort_and_args: &Option<(Symbol, Vec<Expr>)>,
+    ) -> Result<(), TypeError> {
+        let name = name.into();
+        if self.func_types.contains_key(&name) {
+            return Err(TypeError::FunctionAlreadyBound(name));
+        }
+
+        let sort = match presort_and_args {
+            Some((presort, args)) => {
+                let mksort = self
+                    .presorts
+                    .get(presort)
+                    .ok_or(TypeError::PresortNotFound(*presort))?;
+                mksort(self, name, args)?
+            }
+            None => Arc::new(EqSort { name }),
+        };
+        self.add_arcsort(sort)
+    }
+
+    fn typecheck_rule(&mut self, ctx: CommandId, rule: &NormRule) -> Result<(), TypeError> {
+        // also check the validity of the ssa
+        self.typecheck_facts(ctx, &rule.body)?;
+        self.typecheck_actions(ctx, &rule.head)?;
+        let mut bindings = self.verify_normal_form_facts(&rule.body);
+        self.verify_normal_form_actions(&rule.head, &mut bindings);
+        Ok(())
+    }
+
+    fn typecheck_facts(&mut self, ctx: CommandId, facts: &Vec<NormFact>) -> Result<(), TypeError> {
+        for fact in facts {
+            self.typecheck_fact(ctx, fact)?;
+        }
+        Ok(())
+    }
+
+    fn typecheck_actions(
+        &mut self,
+        ctx: CommandId,
+        actions: &Vec<NormAction>,
+    ) -> Result<(), TypeError> {
+        for action in actions {
+            self.typecheck_action(ctx, action, false)?;
+        }
+        Ok(())
+    }
+
+    fn verify_normal_form_facts(&self, facts: &Vec<NormFact>) -> HashSet<Symbol> {
+        let mut let_bound: HashSet<Symbol> = Default::default();
+
+        for fact in facts {
+            match fact {
+                NormFact::Compute(var, NormExpr::Call(_head, body)) => {
+                    assert!(!self.global_types.contains_key(var));
+                    assert!(let_bound.insert(*var));
+                    body.iter().for_each(|bvar| {
+                        if !self.global_types.contains_key(bvar) {
+                            assert!(let_bound.contains(bvar));
+                        }
+                    });
+                }
+                NormFact::Assign(var, NormExpr::Call(_head, body)) => {
+                    assert!(!self.global_types.contains_key(var));
+                    assert!(let_bound.insert(*var));
+                    body.iter().for_each(|bvar| {
+                        assert!(!self.global_types.contains_key(bvar));
+                        assert!(let_bound.insert(*bvar), "Expected {} to be bound", bvar);
+                    });
+                }
+                NormFact::AssignVar(lhs, _rhs) => {
+                    assert!(!self.global_types.contains_key(lhs));
+                    assert!(let_bound.insert(*lhs));
+                }
+                NormFact::AssignLit(var, _lit) => {
+                    assert!(let_bound.insert(*var));
+                }
+                NormFact::ConstrainEq(var1, var2) => {
+                    if !let_bound.contains(var1)
+                        && !let_bound.contains(var2)
+                        && !self.global_types.contains_key(var1)
+                        && !self.global_types.contains_key(var2)
+                    {
+                        panic!("ConstrainEq on unbound variables");
+                    }
+                }
+            }
+        }
+        let_bound
+    }
+
+    fn verify_normal_form_actions(
+        &self,
+        actions: &Vec<NormAction>,
+        let_bound: &mut HashSet<Symbol>,
+    ) {
+        let assert_bound = |var, let_bound: &HashSet<Symbol>| {
+            assert!(
+                let_bound.contains(var)
+                    || self.global_types.contains_key(var)
+                    || self.reserved_type(*var).is_some(),
+                "Expected {var} to be let bound in body of rule",
+            )
+        };
+
+        for action in actions {
+            match action {
+                NormAction::Let(var, NormExpr::Call(_head, body)) => {
+                    assert!(let_bound.insert(*var));
+                    body.iter().for_each(|bvar| {
+                        assert_bound(bvar, let_bound);
+                    });
+                }
+                NormAction::LetVar(v1, v2) => {
+                    assert_bound(v2, let_bound);
+                    assert!(let_bound.insert(*v1));
+                }
+                NormAction::LetLit(v1, _lit) => {
+                    assert!(let_bound.insert(*v1));
+                }
+                NormAction::Delete(NormExpr::Call(_head, body)) => {
+                    body.iter().for_each(|bvar| {
+                        assert_bound(bvar, let_bound);
+                    });
+                }
+                NormAction::Set(NormExpr::Call(_head, body), var) => {
+                    body.iter().for_each(|bvar| {
+                        assert_bound(bvar, let_bound);
+                    });
+                    assert_bound(var, let_bound);
+                }
+                NormAction::Extract(var, variants) => {
+                    assert_bound(var, let_bound);
+                    assert_bound(variants, let_bound);
+                }
+                NormAction::Union(v1, v2) => {
+                    assert_bound(v1, let_bound);
+                    assert_bound(v2, let_bound);
+                }
+                NormAction::Panic(..) => (),
+            }
+        }
+    }
+
+    fn introduce_binding(
+        &mut self,
+        ctx: CommandId,
+        var: Symbol,
+        sort: Arc<dyn Sort>,
+        is_global: bool,
+    ) -> Result<(), TypeError> {
+        if is_global {
+            if let Some(_existing) = self.global_types.insert(var, sort) {
+                return Err(TypeError::GlobalAlreadyBound(var));
+            }
+        } else if let Some(existing) = self
+            .local_types
+            .get_mut(&ctx)
+            .unwrap()
+            .insert(var, sort.clone())
+        {
+            return Err(TypeError::LocalAlreadyBound(var, existing, sort));
+        }
+
+        Ok(())
+    }
+
+    fn typecheck_action(
+        &mut self,
+        ctx: CommandId,
+        action: &NormAction,
+        is_global: bool,
+    ) -> Result<(), TypeError> {
+        match action {
+            NormAction::Let(var, expr) => {
+                let expr_type = self.typecheck_expr(ctx, expr, true)?.output;
+
+                self.introduce_binding(ctx, *var, expr_type, is_global)?;
+            }
+            NormAction::LetLit(var, lit) => {
+                let lit_type = self.infer_literal(lit);
+                self.introduce_binding(ctx, *var, lit_type, is_global)?;
+            }
+            NormAction::Delete(expr) => {
+                self.typecheck_expr(ctx, expr, true)?;
+            }
+            NormAction::Set(expr, other) => {
+                let func_type = self.typecheck_expr(ctx, expr, true)?.output;
+                let other_type = self.lookup(ctx, *other)?;
+                if func_type.name() != other_type.name() {
+                    return Err(TypeError::TypeMismatch(func_type, other_type));
+                }
+            }
+            NormAction::Union(var1, var2) => {
+                let var1_type = self.lookup(ctx, *var1)?;
+                let var2_type = self.lookup(ctx, *var2)?;
+                if var1_type.name() != var2_type.name() {
+                    return Err(TypeError::TypeMismatch(var1_type, var2_type));
+                }
+            }
+            NormAction::Extract(_var, _variants) => {}
+            NormAction::LetVar(var1, var2) => {
+                let var2_type = self.lookup(ctx, *var2)?;
+                self.introduce_binding(ctx, *var1, var2_type, is_global)?;
+            }
+            NormAction::Panic(..) => (),
+        }
+        Ok(())
+    }
+
+    fn typecheck_fact(&mut self, ctx: CommandId, fact: &NormFact) -> Result<(), TypeError> {
+        match fact {
+            NormFact::Compute(var, expr) => {
+                let expr_type = self.typecheck_expr(ctx, expr, true)?;
+                if let Some(_existing) = self
+                    .local_types
+                    .get_mut(&ctx)
+                    .unwrap()
+                    .insert(*var, expr_type.output.clone())
+                {
+                    return Err(TypeError::AlreadyDefined(*var));
+                }
+            }
+            NormFact::Assign(var, expr) => {
+                let expr_type = self.typecheck_expr(ctx, expr, false)?;
+                if let Some(_existing) = self
+                    .local_types
+                    .get_mut(&ctx)
+                    .unwrap()
+                    .insert(*var, expr_type.output.clone())
+                {
+                    return Err(TypeError::AlreadyDefined(*var));
+                }
+            }
+            NormFact::AssignVar(lhs, rhs) => {
+                let rhs_type = self.lookup(ctx, *rhs)?;
+                if let Some(_existing) = self
+                    .local_types
+                    .get_mut(&ctx)
+                    .unwrap()
+                    .insert(*lhs, rhs_type.clone())
+                {
+                    return Err(TypeError::AlreadyDefined(*lhs));
+                }
+            }
+            NormFact::AssignLit(var, lit) => {
+                let lit_type = self.infer_literal(lit);
+                if let Some(existing) = self
+                    .local_types
+                    .get_mut(&ctx)
+                    .unwrap()
+                    .insert(*var, lit_type.clone())
+                {
+                    if lit_type.name() != existing.name() {
+                        return Err(TypeError::TypeMismatch(lit_type, existing));
+                    }
+                }
+            }
+            NormFact::ConstrainEq(var1, var2) => {
+                let l1 = self.lookup(ctx, *var1);
+                let l2 = self.lookup(ctx, *var2);
+                if let Ok(v1type) = l1 {
+                    if let Ok(v2type) = l2 {
+                        if v1type.name() != v2type.name() {
+                            return Err(TypeError::TypeMismatch(v1type, v2type));
+                        }
+                    } else {
+                        self.local_types
+                            .get_mut(&ctx)
+                            .unwrap()
+                            .insert(*var2, v1type);
+                    }
+                } else if let Ok(v2type) = l2 {
+                    self.local_types
+                        .get_mut(&ctx)
+                        .unwrap()
+                        .insert(*var1, v2type);
+                } else {
+                    return Err(TypeError::Unbound(*var1));
+                }
+            }
+        }
+        Ok(())
+    }
+
+    pub fn reserved_type(&self, sym: Symbol) -> Option<ArcSort> {
+        if sym == RULE_PROOF_KEYWORD.into() {
+            Some(self.sorts.get::<Symbol>(&"Proof__".into()).unwrap().clone())
+        } else {
+            None
+        }
+    }
+
+    pub fn lookup(&self, ctx: CommandId, sym: Symbol) -> Result<ArcSort, TypeError> {
+        // special logic for reserved keywords
+        if let Some(t) = self.reserved_type(sym) {
+            return Ok(t);
+        }
+
+        self.global_types
+            .get(&sym)
+            .map(|x| Ok(x.clone()))
+            .unwrap_or_else(|| {
+                if let Some(found) = self.local_types.get(&ctx).unwrap().get(&sym) {
+                    Ok(found.clone())
+                } else {
+                    Err(TypeError::Unbound(sym))
+                }
+            })
+    }
+
+    fn set_local_type(
+        &mut self,
+        ctx: CommandId,
+        sym: Symbol,
+        sym_type: ArcSort,
+    ) -> Result<(), TypeError> {
+        if let Some(existing) = self
+            .local_types
+            .get_mut(&ctx)
+            .unwrap()
+            .insert(sym, sym_type.clone())
+        {
+            if existing.name() != sym_type.name() {
+                return Err(TypeError::LocalAlreadyBound(sym, existing, sym_type));
+            }
+        }
+        Ok(())
+    }
+
+    pub(crate) fn is_primitive(&self, sym: Symbol) -> bool {
+        self.primitives.contains_key(&sym) || self.presort_names.contains(&sym)
+    }
+
+    fn lookup_func(
+        &self,
+        _ctx: CommandId,
+        sym: Symbol,
+        input_types: Vec<ArcSort>,
+    ) -> Result<FuncType, TypeError> {
+        if let Some(found) = self.func_types.get(&sym) {
+            Ok(found.clone())
+        } else {
+            if let Some(prims) = self.primitives.get(&sym) {
+                for prim in prims {
+                    if let Some(return_type) = prim.accept(&input_types) {
+                        return Ok(FuncType::new(input_types, return_type, false, true));
+                    }
+                }
+            }
+
+            Err(TypeError::NoMatchingPrimitive {
+                op: sym,
+                inputs: input_types.iter().map(|s| s.name()).collect(),
+            })
+        }
+    }
+
+    pub(crate) fn typecheck_expr(
+        &mut self,
+        ctx: CommandId,
+        expr: &NormExpr,
+        expect_lookup: bool,
+    ) -> Result<FuncType, TypeError> {
+        match expr {
+            NormExpr::Call(head, body) => {
+                let child_types = if let Some(found) = self.func_types.get(head) {
+                    found.input.clone()
+                } else {
+                    let types = body
+                        .iter()
+                        .map(|var| self.lookup(ctx, *var))
+                        .collect::<Result<Vec<_>, _>>();
+                    if let Ok(types) = types {
+                        types
+                    } else if expect_lookup {
+                        // return the error
+                        types?
+                    } else {
+                        return Err(TypeError::UnboundFunction(*head));
+                    }
+                };
+                for (child_type, var) in child_types.iter().zip(body.iter()) {
+                    if expect_lookup {
+                        self.lookup(ctx, *var)?;
+                    } else {
+                        self.set_local_type(ctx, *var, child_type.clone())?;
+                    }
+                }
+
+                self.lookup_func(ctx, *head, child_types)
+            }
+        }
+    }
+}
+
+#[derive(Debug, Clone, Error)]
+pub enum TypeError {
+    #[error("Arity mismatch, expected {expected} args: {expr}")]
+    Arity { expr: Expr, expected: usize },
+    #[error(
+        "Type mismatch: expr = {expr}, expected = {}, actual = {}, reason: {reason}", 
+        .expected.name(), .actual.name(),
+    )]
+    Mismatch {
+        expr: Expr,
+        expected: ArcSort,
+        actual: ArcSort,
+        reason: String,
+    },
+    #[error("Tried to unify too many literals: {}", ListDisplay(.0, "\n"))]
+    TooManyLiterals(Vec<Literal>),
+    #[error("Unbound symbol {0}")]
+    Unbound(Symbol),
+    #[error("Undefined sort {0}")]
+    UndefinedSort(Symbol),
+    #[error("Unbound function {0}")]
+    UnboundFunction(Symbol),
+    #[error("Function already bound {0}")]
+    FunctionAlreadyBound(Symbol),
+    #[error("Function declarations are not allowed after a push.")]
+    FunctionAfterPush(Symbol),
+    #[error("Sort declarations are not allowed after a push.")]
+    SortAfterPush(Symbol),
+    #[error("Global already bound {0}")]
+    GlobalAlreadyBound(Symbol),
+    #[error("Local already bound {0} with type {}. Got: {}", .1.name(), .2.name())]
+    LocalAlreadyBound(Symbol, ArcSort, ArcSort),
+    #[error("Sort {0} already declared.")]
+    SortAlreadyBound(Symbol),
+    #[error("Primitive {0} already declared.")]
+    PrimitiveAlreadyBound(Symbol),
+    #[error("Type mismatch: expected {}, actual {}", .0.name(), .1.name())]
+    TypeMismatch(ArcSort, ArcSort),
+    #[error("Presort {0} not found.")]
+    PresortNotFound(Symbol),
+    #[error("Cannot type a variable as unit: {0}")]
+    UnitVar(Symbol),
+    #[error("Failed to infer a type for: {0}")]
+    InferenceFailure(Expr),
+    #[error("No matching primitive for: ({op} {})", ListDisplay(.inputs, " "))]
+    NoMatchingPrimitive { op: Symbol, inputs: Vec<Symbol> },
+    #[error("Variable {0} was already defined")]
+    AlreadyDefined(Symbol),
+}
+
\ No newline at end of file diff --git a/docs/src/egglog/unionfind.rs.html b/docs/src/egglog/unionfind.rs.html new file mode 100644 index 000000000..4a8d3a6be --- /dev/null +++ b/docs/src/egglog/unionfind.rs.html @@ -0,0 +1,359 @@ +unionfind.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+
//! Baseline union-find implementation without sizes or ranks, using path
+//! halving for compression.
+//!
+//! This implementation uses interior mutability for `find`.
+use crate::util::HashMap;
+use crate::{Id, Symbol, Value};
+
+use std::cell::Cell;
+use std::fmt::Debug;
+use std::mem;
+
+#[derive(Debug, Clone, Default)]
+#[cfg_attr(feature = "serde-1", derive(serde::Serialize, serde::Deserialize))]
+pub struct UnionFind {
+    parents: Vec<Cell<Id>>,
+    n_unions: usize,
+    recent_ids: HashMap<Symbol, Vec<Id>>,
+    staged_ids: HashMap<Symbol, Vec<Id>>,
+}
+
+impl UnionFind {
+    /// The number of unions that have been performed over the lifetime of this
+    /// data-structure.
+    pub fn n_unions(&self) -> usize {
+        self.n_unions
+    }
+
+    /// Create a fresh [`Id`].
+    pub fn make_set(&mut self) -> Id {
+        let res = Id::from(self.parents.len());
+        self.parents.push(Cell::new(res));
+        res
+    }
+
+    /// The number of ids that recently stopped being canonical.
+    pub fn new_ids(&self, sort_filter: impl Fn(Symbol) -> bool) -> usize {
+        self.recent_ids
+            .iter()
+            .filter_map(|(sort, ids)| {
+                if sort_filter(*sort) {
+                    Some(ids.len())
+                } else {
+                    None
+                }
+            })
+            .sum()
+    }
+
+    /// Clear any ids currently marked as dirty and then move any ids marked
+    /// non-canonical since the last call to this method (or the
+    /// data-structure's creation) into the dirty set.
+    pub fn clear_recent_ids(&mut self) {
+        mem::swap(&mut self.recent_ids, &mut self.staged_ids);
+        self.staged_ids.values_mut().for_each(Vec::clear);
+    }
+
+    /// Iterate over the ids of the given sort marked as "dirty", i.e. any
+    /// [`Id`]s that ceased to be canonical between the last call to
+    /// [`clear_recent_ids`] and the call prior to that.
+    ///
+    /// [`clear_recent_ids`]: UnionFind::clear_recent_ids
+    pub fn dirty_ids(&self, sort: Symbol) -> impl Iterator<Item = Id> + '_ {
+        let ids = self
+            .recent_ids
+            .get(&sort)
+            .map(|ids| ids.as_slice())
+            .unwrap_or(&[]);
+        ids.iter().copied()
+    }
+
+    /// Look up the canonical representative for the given [`Id`].
+    pub fn find(&self, id: Id) -> Id {
+        let mut cur = self.parent(id);
+        loop {
+            let next = self.parent(cur.get());
+            if cur.get() == next.get() {
+                return cur.get();
+            }
+            // Path halving
+            let grand = self.parent(next.get());
+            cur.set(grand.get());
+            cur = grand;
+        }
+    }
+
+    /// Merge the equivalence classes associated with the two values.
+    ///
+    /// This method assumes that the given values belong to the same, "eq-able",
+    /// sort. Its behavior is unspecified on other values.
+    pub fn union_values(&mut self, val1: Value, val2: Value, sort: Symbol) -> Value {
+        debug_assert_eq!(val1.tag, val2.tag);
+        let id1 = Id::from(val1.bits as usize);
+        let id2 = Id::from(val2.bits as usize);
+        let res = self.union(id1, id2, sort);
+        Value {
+            bits: usize::from(res) as u64,
+            tag: val1.tag,
+        }
+    }
+
+    /// Like [`union_values`], but operating on raw [`Id`]s.
+    ///
+    /// [`union_values`]: UnionFind::union_values
+    pub fn union(&mut self, id1: Id, id2: Id, sort: Symbol) -> Id {
+        let (res, reparented) = self.do_union(id1, id2);
+        if let Some(id) = reparented {
+            self.staged_ids.entry(sort).or_default().push(id)
+        }
+        res
+    }
+
+    /// Merge the underlying equivalence classes for the two ids.
+    ///
+    /// This method does not update any metadata related to timestamps or sorts;
+    /// that metadata will eventually be required for the correctness of
+    /// rebuilding. This method should only be used for "out-of-band" use-cases,
+    /// such as typechecking.
+    pub fn union_raw(&mut self, id1: Id, id2: Id) -> Id {
+        self.do_union(id1, id2).0
+    }
+
+    fn do_union(&mut self, id1: Id, id2: Id) -> (Id, Option<Id>) {
+        let id1 = self.find(id1);
+        let id2 = self.find(id2);
+        if id1 != id2 {
+            self.parent(id2).set(id1);
+            self.n_unions += 1;
+            (id1, Some(id2))
+        } else {
+            (id1, None)
+        }
+    }
+
+    fn parent(&self, id: Id) -> &Cell<Id> {
+        &self.parents[usize::from(id)]
+    }
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    fn ids(us: impl IntoIterator<Item = usize>) -> Vec<Cell<Id>> {
+        us.into_iter().map(|u| Cell::new(u.into())).collect()
+    }
+
+    #[test]
+    fn union_find() {
+        let n = 10;
+        let id = Id::from;
+
+        let mut uf = UnionFind::default();
+        for _ in 0..n {
+            uf.make_set();
+        }
+
+        // test the initial condition of everyone in their own set
+        assert_eq!(uf.parents, ids(0..n));
+
+        // build up one set
+        uf.union_raw(id(0), id(1));
+        uf.union_raw(id(0), id(2));
+        uf.union_raw(id(0), id(3));
+
+        // build up another set
+        uf.union_raw(id(6), id(7));
+        uf.union_raw(id(6), id(8));
+        uf.union_raw(id(6), id(9));
+
+        // this should compress all paths
+        for i in 0..n {
+            uf.find(id(i));
+        }
+
+        // indexes:         0, 1, 2, 3, 4, 5, 6, 7, 8, 9
+        let expected = vec![0, 0, 0, 0, 4, 5, 6, 6, 6, 6];
+        assert_eq!(uf.parents, ids(expected));
+    }
+}
+
\ No newline at end of file diff --git a/docs/src/egglog/util.rs.html b/docs/src/egglog/util.rs.html new file mode 100644 index 000000000..a38f67038 --- /dev/null +++ b/docs/src/egglog/util.rs.html @@ -0,0 +1,123 @@ +util.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+
#![allow(unused)]
+
+use std::fmt::Display;
+
+#[allow(unused_imports)]
+use crate::*;
+
+pub(crate) type BuildHasher = std::hash::BuildHasherDefault<rustc_hash::FxHasher>;
+
+pub(crate) type HashMap<K, V> = hashbrown::HashMap<K, V, BuildHasher>;
+pub(crate) type HashSet<K> = hashbrown::HashSet<K, BuildHasher>;
+
+pub type IndexMap<K, V> = indexmap::IndexMap<K, V, BuildHasher>;
+pub type IndexSet<K> = indexmap::IndexSet<K, BuildHasher>;
+
+pub(crate) fn concat_vecs<T>(to: &mut Vec<T>, mut from: Vec<T>) {
+    if to.len() < from.len() {
+        std::mem::swap(to, &mut from)
+    }
+    to.extend(from);
+}
+
+pub(crate) struct ListDisplay<'a, TS>(pub TS, pub &'a str);
+
+impl<'a, TS> Display for ListDisplay<'a, TS>
+where
+    TS: Clone + IntoIterator,
+    TS::Item: Display,
+{
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let mut did_something = false;
+        for item in self.0.clone().into_iter() {
+            if did_something {
+                f.write_str(self.1)?;
+            }
+            Display::fmt(&item, f)?;
+            did_something = true;
+        }
+        Ok(())
+    }
+}
+
+pub(crate) struct ListDebug<'a, TS>(pub TS, pub &'a str);
+
+impl<'a, TS> Debug for ListDebug<'a, TS>
+where
+    TS: Clone + IntoIterator,
+    TS::Item: Debug,
+{
+    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+        let mut did_something = false;
+        for item in self.0.clone().into_iter() {
+            if did_something {
+                f.write_str(self.1)?;
+            }
+            Debug::fmt(&item, f)?;
+            did_something = true;
+        }
+        Ok(())
+    }
+}
+
\ No newline at end of file diff --git a/docs/src/egglog/value.rs.html b/docs/src/egglog/value.rs.html new file mode 100644 index 000000000..439b11d8f --- /dev/null +++ b/docs/src/egglog/value.rs.html @@ -0,0 +1,137 @@ +value.rs - source
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+
use ordered_float::OrderedFloat;
+use std::num::NonZeroU32;
+
+use lazy_static::lazy_static;
+
+use crate::{ast::Symbol, Id};
+
+#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Clone, Copy)]
+// FIXME this shouldn't be pub
+pub struct Value {
+    pub tag: Symbol,
+    pub bits: u64,
+}
+
+lazy_static! {
+    static ref BOGUS: Symbol = "__bogus__".into();
+    static ref UNIT: Symbol = "Unit".into();
+}
+
+impl Value {
+    pub fn unit() -> Self {
+        Value {
+            tag: *UNIT,
+            bits: 0,
+        }
+    }
+
+    pub fn fake() -> Self {
+        Value {
+            tag: *BOGUS,
+            bits: 1234567890,
+        }
+    }
+
+    pub fn from_id(tag: Symbol, id: Id) -> Self {
+        Value {
+            tag,
+            bits: usize::from(id) as u64,
+        }
+    }
+}
+
+impl From<i64> for Value {
+    fn from(i: i64) -> Self {
+        Self {
+            tag: Symbol::from("i64"),
+            bits: i as u64,
+        }
+    }
+}
+
+impl From<OrderedFloat<f64>> for Value {
+    fn from(f: OrderedFloat<f64>) -> Self {
+        Self {
+            tag: Symbol::from("f64"),
+            bits: f.into_inner().to_bits(),
+        }
+    }
+}
+
+impl From<Symbol> for Value {
+    fn from(s: Symbol) -> Self {
+        Self {
+            tag: Symbol::from("String"),
+            bits: NonZeroU32::from(s).get().into(),
+        }
+    }
+}
+
\ No newline at end of file diff --git a/docs/static.files/COPYRIGHT-23e9bde6c69aea69.txt b/docs/static.files/COPYRIGHT-23e9bde6c69aea69.txt new file mode 100644 index 000000000..1447df792 --- /dev/null +++ b/docs/static.files/COPYRIGHT-23e9bde6c69aea69.txt @@ -0,0 +1,50 @@ +# REUSE-IgnoreStart + +These documentation pages include resources by third parties. This copyright +file applies only to those resources. The following third party resources are +included, and carry their own copyright notices and license terms: + +* Fira Sans (FiraSans-Regular.woff2, FiraSans-Medium.woff2): + + Copyright (c) 2014, Mozilla Foundation https://mozilla.org/ + with Reserved Font Name Fira Sans. + + Copyright (c) 2014, Telefonica S.A. + + Licensed under the SIL Open Font License, Version 1.1. + See FiraSans-LICENSE.txt. + +* rustdoc.css, main.js, and playpen.js: + + Copyright 2015 The Rust Developers. + Licensed under the Apache License, Version 2.0 (see LICENSE-APACHE.txt) or + the MIT license (LICENSE-MIT.txt) at your option. + +* normalize.css: + + Copyright (c) Nicolas Gallagher and Jonathan Neal. + Licensed under the MIT license (see LICENSE-MIT.txt). + +* Source Code Pro (SourceCodePro-Regular.ttf.woff2, + SourceCodePro-Semibold.ttf.woff2, SourceCodePro-It.ttf.woff2): + + Copyright 2010, 2012 Adobe Systems Incorporated (http://www.adobe.com/), + with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark + of Adobe Systems Incorporated in the United States and/or other countries. + + Licensed under the SIL Open Font License, Version 1.1. + See SourceCodePro-LICENSE.txt. + +* Source Serif 4 (SourceSerif4-Regular.ttf.woff2, SourceSerif4-Bold.ttf.woff2, + SourceSerif4-It.ttf.woff2): + + Copyright 2014-2021 Adobe (http://www.adobe.com/), with Reserved Font Name + 'Source'. All Rights Reserved. Source is a trademark of Adobe in the United + States and/or other countries. + + Licensed under the SIL Open Font License, Version 1.1. + See SourceSerif4-LICENSE.md. + +This copyright file is intended to be distributed with rustdoc output. + +# REUSE-IgnoreEnd diff --git a/docs/static.files/FiraSans-LICENSE-db4b642586e02d97.txt b/docs/static.files/FiraSans-LICENSE-db4b642586e02d97.txt new file mode 100644 index 000000000..d7e9c149b --- /dev/null +++ b/docs/static.files/FiraSans-LICENSE-db4b642586e02d97.txt @@ -0,0 +1,98 @@ +// REUSE-IgnoreStart + +Digitized data copyright (c) 2012-2015, The Mozilla Foundation and Telefonica S.A. +with Reserved Font Name < Fira >, + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. + +// REUSE-IgnoreEnd diff --git a/docs/static.files/FiraSans-Medium-8f9a781e4970d388.woff2 b/docs/static.files/FiraSans-Medium-8f9a781e4970d388.woff2 new file mode 100644 index 000000000..7a1e5fc54 Binary files /dev/null and b/docs/static.files/FiraSans-Medium-8f9a781e4970d388.woff2 differ diff --git a/docs/static.files/FiraSans-Regular-018c141bf0843ffd.woff2 b/docs/static.files/FiraSans-Regular-018c141bf0843ffd.woff2 new file mode 100644 index 000000000..e766e06cc Binary files /dev/null and b/docs/static.files/FiraSans-Regular-018c141bf0843ffd.woff2 differ diff --git a/docs/static.files/LICENSE-APACHE-b91fa81cba47b86a.txt b/docs/static.files/LICENSE-APACHE-b91fa81cba47b86a.txt new file mode 100644 index 000000000..16fe87b06 --- /dev/null +++ b/docs/static.files/LICENSE-APACHE-b91fa81cba47b86a.txt @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/docs/static.files/LICENSE-MIT-65090b722b3f6c56.txt b/docs/static.files/LICENSE-MIT-65090b722b3f6c56.txt new file mode 100644 index 000000000..31aa79387 --- /dev/null +++ b/docs/static.files/LICENSE-MIT-65090b722b3f6c56.txt @@ -0,0 +1,23 @@ +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/docs/static.files/NanumBarunGothic-0f09457c7a19b7c6.ttf.woff2 b/docs/static.files/NanumBarunGothic-0f09457c7a19b7c6.ttf.woff2 new file mode 100644 index 000000000..1866ad4bc Binary files /dev/null and b/docs/static.files/NanumBarunGothic-0f09457c7a19b7c6.ttf.woff2 differ diff --git a/docs/static.files/NanumBarunGothic-LICENSE-18c5adf4b52b4041.txt b/docs/static.files/NanumBarunGothic-LICENSE-18c5adf4b52b4041.txt new file mode 100644 index 000000000..4b3edc29e --- /dev/null +++ b/docs/static.files/NanumBarunGothic-LICENSE-18c5adf4b52b4041.txt @@ -0,0 +1,103 @@ +// REUSE-IgnoreStart + +Copyright (c) 2010, NAVER Corporation (https://www.navercorp.com/), + +with Reserved Font Name Nanum, Naver Nanum, NanumGothic, Naver NanumGothic, +NanumMyeongjo, Naver NanumMyeongjo, NanumBrush, Naver NanumBrush, NanumPen, +Naver NanumPen, Naver NanumGothicEco, NanumGothicEco, Naver NanumMyeongjoEco, +NanumMyeongjoEco, Naver NanumGothicLight, NanumGothicLight, NanumBarunGothic, +Naver NanumBarunGothic, NanumSquareRound, NanumBarunPen, MaruBuri + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. + +// REUSE-IgnoreEnd diff --git a/docs/static.files/SourceCodePro-It-1cc31594bf4f1f79.ttf.woff2 b/docs/static.files/SourceCodePro-It-1cc31594bf4f1f79.ttf.woff2 new file mode 100644 index 000000000..462c34efc Binary files /dev/null and b/docs/static.files/SourceCodePro-It-1cc31594bf4f1f79.ttf.woff2 differ diff --git a/docs/static.files/SourceCodePro-LICENSE-d180d465a756484a.txt b/docs/static.files/SourceCodePro-LICENSE-d180d465a756484a.txt new file mode 100644 index 000000000..0d2941e14 --- /dev/null +++ b/docs/static.files/SourceCodePro-LICENSE-d180d465a756484a.txt @@ -0,0 +1,97 @@ +// REUSE-IgnoreStart + +Copyright 2010, 2012 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of Adobe Systems Incorporated in the United States and/or other countries. + +This Font Software is licensed under the SIL Open Font License, Version 1.1. + +This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. + +// REUSE-IgnoreEnd diff --git a/docs/static.files/SourceCodePro-Regular-562dcc5011b6de7d.ttf.woff2 b/docs/static.files/SourceCodePro-Regular-562dcc5011b6de7d.ttf.woff2 new file mode 100644 index 000000000..10b558e0b Binary files /dev/null and b/docs/static.files/SourceCodePro-Regular-562dcc5011b6de7d.ttf.woff2 differ diff --git a/docs/static.files/SourceCodePro-Semibold-d899c5a5c4aeb14a.ttf.woff2 b/docs/static.files/SourceCodePro-Semibold-d899c5a5c4aeb14a.ttf.woff2 new file mode 100644 index 000000000..5ec64eef0 Binary files /dev/null and b/docs/static.files/SourceCodePro-Semibold-d899c5a5c4aeb14a.ttf.woff2 differ diff --git a/docs/static.files/SourceSerif4-Bold-a2c9cd1067f8b328.ttf.woff2 b/docs/static.files/SourceSerif4-Bold-a2c9cd1067f8b328.ttf.woff2 new file mode 100644 index 000000000..181a07f63 Binary files /dev/null and b/docs/static.files/SourceSerif4-Bold-a2c9cd1067f8b328.ttf.woff2 differ diff --git a/docs/static.files/SourceSerif4-It-acdfaf1a8af734b1.ttf.woff2 b/docs/static.files/SourceSerif4-It-acdfaf1a8af734b1.ttf.woff2 new file mode 100644 index 000000000..2ae08a7be Binary files /dev/null and b/docs/static.files/SourceSerif4-It-acdfaf1a8af734b1.ttf.woff2 differ diff --git a/docs/static.files/SourceSerif4-LICENSE-3bb119e13b1258b7.md b/docs/static.files/SourceSerif4-LICENSE-3bb119e13b1258b7.md new file mode 100644 index 000000000..175fa4f47 --- /dev/null +++ b/docs/static.files/SourceSerif4-LICENSE-3bb119e13b1258b7.md @@ -0,0 +1,98 @@ + + +Copyright 2014-2021 Adobe (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of Adobe in the United States and/or other countries. +Copyright 2014 - 2023 Adobe (http://www.adobe.com/), with Reserved Font Name ‘Source’. All Rights Reserved. Source is a trademark of Adobe in the United States and/or other countries. + +This Font Software is licensed under the SIL Open Font License, Version 1.1. + +This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. + + diff --git a/docs/static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2 b/docs/static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2 new file mode 100644 index 000000000..0263fc304 Binary files /dev/null and b/docs/static.files/SourceSerif4-Regular-46f98efaafac5295.ttf.woff2 differ diff --git a/docs/static.files/ayu-614652228113ac93.css b/docs/static.files/ayu-614652228113ac93.css new file mode 100644 index 000000000..8fd09c9e4 --- /dev/null +++ b/docs/static.files/ayu-614652228113ac93.css @@ -0,0 +1 @@ + :root{--main-background-color:#0f1419;--main-color:#c5c5c5;--settings-input-color:#ffb454;--settings-input-border-color:#999;--settings-button-color:#fff;--settings-button-border-focus:#e0e0e0;--sidebar-background-color:#14191f;--sidebar-background-color-hover:rgba(70,70,70,0.33);--code-block-background-color:#191f26;--scrollbar-track-background-color:transparent;--scrollbar-thumb-background-color:#5c6773;--scrollbar-color:#5c6773 #24292f;--headings-border-bottom-color:#5c6773;--border-color:#5c6773;--button-background-color:#141920;--right-side-color:grey;--code-attribute-color:#999;--toggles-color:#999;--toggle-filter:invert(100%);--search-input-focused-border-color:#5c6773;--copy-path-button-color:#fff;--copy-path-img-filter:invert(70%);--copy-path-img-hover-filter:invert(100%);--codeblock-error-hover-color:rgb(255,0,0);--codeblock-error-color:rgba(255,0,0,.5);--codeblock-ignore-hover-color:rgb(255,142,0);--codeblock-ignore-color:rgba(255,142,0,.6);--type-link-color:#ffa0a5;--trait-link-color:#39afd7;--assoc-item-link-color:#39afd7;--function-link-color:#fdd687;--macro-link-color:#a37acc;--keyword-link-color:#39afd7;--mod-link-color:#39afd7;--link-color:#39afd7;--sidebar-link-color:#53b1db;--sidebar-current-link-background-color:transparent;--search-result-link-focus-background-color:#3c3c3c;--search-result-border-color:#aaa3;--search-color:#fff;--search-error-code-background-color:#4f4c4c;--search-results-alias-color:#c5c5c5;--search-results-grey-color:#999;--search-tab-title-count-color:#888;--search-tab-button-not-selected-border-top-color:none;--search-tab-button-not-selected-background:transparent !important;--search-tab-button-selected-border-top-color:none;--search-tab-button-selected-background:#141920 !important;--stab-background-color:#314559;--stab-code-color:#e6e1cf;--code-highlight-kw-color:#ff7733;--code-highlight-kw-2-color:#ff7733;--code-highlight-lifetime-color:#ff7733;--code-highlight-prelude-color:#69f2df;--code-highlight-prelude-val-color:#ff7733;--code-highlight-number-color:#b8cc52;--code-highlight-string-color:#b8cc52;--code-highlight-literal-color:#ff7733;--code-highlight-attribute-color:#e6e1cf;--code-highlight-self-color:#36a3d9;--code-highlight-macro-color:#a37acc;--code-highlight-question-mark-color:#ff9011;--code-highlight-comment-color:#788797;--code-highlight-doc-comment-color:#a1ac88;--src-line-numbers-span-color:#5c6773;--src-line-number-highlighted-background-color:rgba(255,236,164,0.06);--test-arrow-color:#788797;--test-arrow-background-color:rgba(57,175,215,0.09);--test-arrow-hover-color:#c5c5c5;--test-arrow-hover-background-color:rgba(57,175,215,0.368);--target-background-color:rgba(255,236,164,0.06);--target-border-color:rgba(255,180,76,0.85);--kbd-color:#c5c5c5;--kbd-background:#314559;--kbd-box-shadow-color:#5c6773;--rust-logo-filter:drop-shadow(1px 0 0px #fff) drop-shadow(0 1px 0 #fff) drop-shadow(-1px 0 0 #fff) drop-shadow(0 -1px 0 #fff);--crate-search-div-filter:invert(41%) sepia(12%) saturate(487%) hue-rotate(171deg) brightness(94%) contrast(94%);--crate-search-div-hover-filter:invert(98%) sepia(12%) saturate(81%) hue-rotate(343deg) brightness(113%) contrast(76%);--crate-search-hover-border:#e0e0e0;--source-sidebar-background-selected:#14191f;--source-sidebar-background-hover:#14191f;--table-alt-row-background-color:#191f26;--codeblock-link-background:#333;--scrape-example-toggle-line-background:#999;--scrape-example-toggle-line-hover-background:#c5c5c5;--scrape-example-code-line-highlight:rgb(91,59,1);--scrape-example-code-line-highlight-focus:rgb(124,75,15);--scrape-example-help-border-color:#aaa;--scrape-example-help-color:#eee;--scrape-example-help-hover-border-color:#fff;--scrape-example-help-hover-color:#fff;--scrape-example-code-wrapper-background-start:rgba(15,20,25,1);--scrape-example-code-wrapper-background-end:rgba(15,20,25,0);}h1,h2,h3,h4,h1 a,.sidebar h2 a,.sidebar h3 a,#source-sidebar>.title{color:#fff;}h4{border:none;}.docblock code{color:#ffb454;}.docblock a>code{color:#39AFD7 !important;}.code-header,.docblock pre>code,pre,pre>code,.item-info code,.rustdoc.source .example-wrap{color:#e6e1cf;}.sidebar .current,.sidebar a:hover,#source-sidebar div.files>a:hover,details.dir-entry summary:hover,#source-sidebar div.files>a:focus,details.dir-entry summary:focus,#source-sidebar div.files>a.selected{color:#ffb44c;}.sidebar-elems .location{color:#ff7733;}.src-line-numbers .line-highlighted{color:#708090;padding-right:7px;border-right:1px solid #ffb44c;}.search-results a:hover,.search-results a:focus{color:#fff !important;background-color:#3c3c3c;}.search-results a{color:#0096cf;}.search-results a div.desc{color:#c5c5c5;}.result-name .primitive>i,.result-name .keyword>i{color:#788797;}#search-tabs>button.selected{border-bottom:1px solid #ffb44c !important;border-top:none;}#search-tabs>button:not(.selected){border:none;background-color:transparent !important;}#search-tabs>button:hover{border-bottom:1px solid rgba(242,151,24,0.3);}#settings-menu>a img{filter:invert(100);} \ No newline at end of file diff --git a/docs/static.files/clipboard-7571035ce49a181d.svg b/docs/static.files/clipboard-7571035ce49a181d.svg new file mode 100644 index 000000000..8adbd9963 --- /dev/null +++ b/docs/static.files/clipboard-7571035ce49a181d.svg @@ -0,0 +1 @@ + diff --git a/docs/static.files/dark-1097f8e92a01e3cf.css b/docs/static.files/dark-1097f8e92a01e3cf.css new file mode 100644 index 000000000..1e5e7d194 --- /dev/null +++ b/docs/static.files/dark-1097f8e92a01e3cf.css @@ -0,0 +1 @@ +:root{--main-background-color:#353535;--main-color:#ddd;--settings-input-color:#2196f3;--settings-input-border-color:#999;--settings-button-color:#000;--settings-button-border-focus:#ffb900;--sidebar-background-color:#505050;--sidebar-background-color-hover:#676767;--code-block-background-color:#2A2A2A;--scrollbar-track-background-color:#717171;--scrollbar-thumb-background-color:rgba(32,34,37,.6);--scrollbar-color:rgba(32,34,37,.6) #5a5a5a;--headings-border-bottom-color:#d2d2d2;--border-color:#e0e0e0;--button-background-color:#f0f0f0;--right-side-color:grey;--code-attribute-color:#999;--toggles-color:#999;--toggle-filter:invert(100%);--search-input-focused-border-color:#008dfd;--copy-path-button-color:#999;--copy-path-img-filter:invert(50%);--copy-path-img-hover-filter:invert(65%);--codeblock-error-hover-color:rgb(255,0,0);--codeblock-error-color:rgba(255,0,0,.5);--codeblock-ignore-hover-color:rgb(255,142,0);--codeblock-ignore-color:rgba(255,142,0,.6);--type-link-color:#2dbfb8;--trait-link-color:#b78cf2;--assoc-item-link-color:#d2991d;--function-link-color:#2bab63;--macro-link-color:#09bd00;--keyword-link-color:#d2991d;--mod-link-color:#d2991d;--link-color:#d2991d;--sidebar-link-color:#fdbf35;--sidebar-current-link-background-color:#444;--search-result-link-focus-background-color:#616161;--search-result-border-color:#aaa3;--search-color:#111;--search-error-code-background-color:#484848;--search-results-alias-color:#fff;--search-results-grey-color:#ccc;--search-tab-title-count-color:#888;--search-tab-button-not-selected-border-top-color:#252525;--search-tab-button-not-selected-background:#252525;--search-tab-button-selected-border-top-color:#0089ff;--search-tab-button-selected-background:#353535;--stab-background-color:#314559;--stab-code-color:#e6e1cf;--code-highlight-kw-color:#ab8ac1;--code-highlight-kw-2-color:#769acb;--code-highlight-lifetime-color:#d97f26;--code-highlight-prelude-color:#769acb;--code-highlight-prelude-val-color:#ee6868;--code-highlight-number-color:#83a300;--code-highlight-string-color:#83a300;--code-highlight-literal-color:#ee6868;--code-highlight-attribute-color:#ee6868;--code-highlight-self-color:#ee6868;--code-highlight-macro-color:#3e999f;--code-highlight-question-mark-color:#ff9011;--code-highlight-comment-color:#8d8d8b;--code-highlight-doc-comment-color:#8ca375;--src-line-numbers-span-color:#3b91e2;--src-line-number-highlighted-background-color:#0a042f;--test-arrow-color:#dedede;--test-arrow-background-color:rgba(78,139,202,0.2);--test-arrow-hover-color:#dedede;--test-arrow-hover-background-color:#4e8bca;--target-background-color:#494a3d;--target-border-color:#bb7410;--kbd-color:#000;--kbd-background:#fafbfc;--kbd-box-shadow-color:#c6cbd1;--rust-logo-filter:drop-shadow(1px 0 0px #fff) drop-shadow(0 1px 0 #fff) drop-shadow(-1px 0 0 #fff) drop-shadow(0 -1px 0 #fff);--crate-search-div-filter:invert(94%) sepia(0%) saturate(721%) hue-rotate(255deg) brightness(90%) contrast(90%);--crate-search-div-hover-filter:invert(69%) sepia(60%) saturate(6613%) hue-rotate(184deg) brightness(100%) contrast(91%);--crate-search-hover-border:#2196f3;--source-sidebar-background-selected:#333;--source-sidebar-background-hover:#444;--table-alt-row-background-color:#2A2A2A;--codeblock-link-background:#333;--scrape-example-toggle-line-background:#999;--scrape-example-toggle-line-hover-background:#c5c5c5;--scrape-example-code-line-highlight:rgb(91,59,1);--scrape-example-code-line-highlight-focus:rgb(124,75,15);--scrape-example-help-border-color:#aaa;--scrape-example-help-color:#eee;--scrape-example-help-hover-border-color:#fff;--scrape-example-help-hover-color:#fff;--scrape-example-code-wrapper-background-start:rgba(53,53,53,1);--scrape-example-code-wrapper-background-end:rgba(53,53,53,0);} \ No newline at end of file diff --git a/docs/static.files/favicon-16x16-8b506e7a72182f1c.png b/docs/static.files/favicon-16x16-8b506e7a72182f1c.png new file mode 100644 index 000000000..ea4b45cae Binary files /dev/null and b/docs/static.files/favicon-16x16-8b506e7a72182f1c.png differ diff --git a/docs/static.files/favicon-2c020d218678b618.svg b/docs/static.files/favicon-2c020d218678b618.svg new file mode 100644 index 000000000..8b34b5119 --- /dev/null +++ b/docs/static.files/favicon-2c020d218678b618.svg @@ -0,0 +1,24 @@ + + + + + diff --git a/docs/static.files/favicon-32x32-422f7d1d52889060.png b/docs/static.files/favicon-32x32-422f7d1d52889060.png new file mode 100644 index 000000000..69b8613ce Binary files /dev/null and b/docs/static.files/favicon-32x32-422f7d1d52889060.png differ diff --git a/docs/static.files/light-0f8c037637f9eb3e.css b/docs/static.files/light-0f8c037637f9eb3e.css new file mode 100644 index 000000000..21c3a859b --- /dev/null +++ b/docs/static.files/light-0f8c037637f9eb3e.css @@ -0,0 +1 @@ +:root{--main-background-color:white;--main-color:black;--settings-input-color:#2196f3;--settings-input-border-color:#717171;--settings-button-color:#000;--settings-button-border-focus:#717171;--sidebar-background-color:#F5F5F5;--sidebar-background-color-hover:#E0E0E0;--code-block-background-color:#F5F5F5;--scrollbar-track-background-color:#dcdcdc;--scrollbar-thumb-background-color:rgba(36,37,39,0.6);--scrollbar-color:rgba(36,37,39,0.6) #d9d9d9;--headings-border-bottom-color:#ddd;--border-color:#e0e0e0;--button-background-color:#fff;--right-side-color:grey;--code-attribute-color:#999;--toggles-color:#999;--toggle-filter:none;--search-input-focused-border-color:#66afe9;--copy-path-button-color:#999;--copy-path-img-filter:invert(50%);--copy-path-img-hover-filter:invert(35%);--codeblock-error-hover-color:rgb(255,0,0);--codeblock-error-color:rgba(255,0,0,.5);--codeblock-ignore-hover-color:rgb(255,142,0);--codeblock-ignore-color:rgba(255,142,0,.6);--type-link-color:#ad378a;--trait-link-color:#6e4fc9;--assoc-item-link-color:#3873ad;--function-link-color:#ad7c37;--macro-link-color:#068000;--keyword-link-color:#3873ad;--mod-link-color:#3873ad;--link-color:#3873ad;--sidebar-link-color:#356da4;--sidebar-current-link-background-color:#fff;--search-result-link-focus-background-color:#ccc;--search-result-border-color:#aaa3;--search-color:#000;--search-error-code-background-color:#d0cccc;--search-results-alias-color:#000;--search-results-grey-color:#999;--search-tab-title-count-color:#888;--search-tab-button-not-selected-border-top-color:#e6e6e6;--search-tab-button-not-selected-background:#e6e6e6;--search-tab-button-selected-border-top-color:#0089ff;--search-tab-button-selected-background:#ffffff;--stab-background-color:#fff5d6;--stab-code-color:#000;--code-highlight-kw-color:#8959a8;--code-highlight-kw-2-color:#4271ae;--code-highlight-lifetime-color:#b76514;--code-highlight-prelude-color:#4271ae;--code-highlight-prelude-val-color:#c82829;--code-highlight-number-color:#718c00;--code-highlight-string-color:#718c00;--code-highlight-literal-color:#c82829;--code-highlight-attribute-color:#c82829;--code-highlight-self-color:#c82829;--code-highlight-macro-color:#3e999f;--code-highlight-question-mark-color:#ff9011;--code-highlight-comment-color:#8e908c;--code-highlight-doc-comment-color:#4d4d4c;--src-line-numbers-span-color:#c67e2d;--src-line-number-highlighted-background-color:#fdffd3;--test-arrow-color:#f5f5f5;--test-arrow-background-color:rgba(78,139,202,0.2);--test-arrow-hover-color:#f5f5f5;--test-arrow-hover-background-color:#4e8bca;--target-background-color:#fdffd3;--target-border-color:#ad7c37;--kbd-color:#000;--kbd-background:#fafbfc;--kbd-box-shadow-color:#c6cbd1;--rust-logo-filter:initial;--crate-search-div-filter:invert(100%) sepia(0%) saturate(4223%) hue-rotate(289deg) brightness(114%) contrast(76%);--crate-search-div-hover-filter:invert(44%) sepia(18%) saturate(23%) hue-rotate(317deg) brightness(96%) contrast(93%);--crate-search-hover-border:#717171;--source-sidebar-background-selected:#fff;--source-sidebar-background-hover:#e0e0e0;--table-alt-row-background-color:#F5F5F5;--codeblock-link-background:#eee;--scrape-example-toggle-line-background:#ccc;--scrape-example-toggle-line-hover-background:#999;--scrape-example-code-line-highlight:#fcffd6;--scrape-example-code-line-highlight-focus:#f6fdb0;--scrape-example-help-border-color:#555;--scrape-example-help-color:#333;--scrape-example-help-hover-border-color:#000;--scrape-example-help-hover-color:#000;--scrape-example-code-wrapper-background-start:rgba(255,255,255,1);--scrape-example-code-wrapper-background-end:rgba(255,255,255,0);} \ No newline at end of file diff --git a/docs/static.files/main-f0540c1d82cde29b.js b/docs/static.files/main-f0540c1d82cde29b.js new file mode 100644 index 000000000..2fa290256 --- /dev/null +++ b/docs/static.files/main-f0540c1d82cde29b.js @@ -0,0 +1,7 @@ +"use strict";function resourcePath(basename,extension){return getVar("root-path")+basename+getVar("resource-suffix")+extension}function hideMain(){addClass(document.getElementById(MAIN_ID),"hidden")}function showMain(){removeClass(document.getElementById(MAIN_ID),"hidden")}function elemIsInParent(elem,parent){while(elem&&elem!==document.body){if(elem===parent){return true}elem=elem.parentElement}return false}function blurHandler(event,parentElem,hideCallback){if(!elemIsInParent(document.activeElement,parentElem)&&!elemIsInParent(event.relatedTarget,parentElem)){hideCallback()}}window.rootPath=getVar("root-path");window.currentCrate=getVar("current-crate");function setMobileTopbar(){const mobileLocationTitle=document.querySelector(".mobile-topbar h2");const locationTitle=document.querySelector(".sidebar h2.location");if(mobileLocationTitle&&locationTitle){mobileLocationTitle.innerHTML=locationTitle.innerHTML}}function getVirtualKey(ev){if("key"in ev&&typeof ev.key!=="undefined"){return ev.key}const c=ev.charCode||ev.keyCode;if(c===27){return"Escape"}return String.fromCharCode(c)}const MAIN_ID="main-content";const SETTINGS_BUTTON_ID="settings-menu";const ALTERNATIVE_DISPLAY_ID="alternative-display";const NOT_DISPLAYED_ID="not-displayed";const HELP_BUTTON_ID="help-button";function getSettingsButton(){return document.getElementById(SETTINGS_BUTTON_ID)}function getHelpButton(){return document.getElementById(HELP_BUTTON_ID)}function getNakedUrl(){return window.location.href.split("?")[0].split("#")[0]}function insertAfter(newNode,referenceNode){referenceNode.parentNode.insertBefore(newNode,referenceNode.nextSibling)}function getOrCreateSection(id,classes){let el=document.getElementById(id);if(!el){el=document.createElement("section");el.id=id;el.className=classes;insertAfter(el,document.getElementById(MAIN_ID))}return el}function getAlternativeDisplayElem(){return getOrCreateSection(ALTERNATIVE_DISPLAY_ID,"content hidden")}function getNotDisplayedElem(){return getOrCreateSection(NOT_DISPLAYED_ID,"hidden")}function switchDisplayedElement(elemToDisplay){const el=getAlternativeDisplayElem();if(el.children.length>0){getNotDisplayedElem().appendChild(el.firstElementChild)}if(elemToDisplay===null){addClass(el,"hidden");showMain();return}el.appendChild(elemToDisplay);hideMain();removeClass(el,"hidden")}function browserSupportsHistoryApi(){return window.history&&typeof window.history.pushState==="function"}function loadCss(cssUrl){const link=document.createElement("link");link.href=cssUrl;link.rel="stylesheet";document.getElementsByTagName("head")[0].appendChild(link)}function preLoadCss(cssUrl){const link=document.createElement("link");link.href=cssUrl;link.rel="preload";link.as="style";document.getElementsByTagName("head")[0].appendChild(link)}(function(){const isHelpPage=window.location.pathname.endsWith("/help.html");function loadScript(url){const script=document.createElement("script");script.src=url;document.head.append(script)}getSettingsButton().onclick=event=>{if(event.ctrlKey||event.altKey||event.metaKey){return}window.hideAllModals(false);addClass(getSettingsButton(),"rotate");event.preventDefault();loadCss(getVar("static-root-path")+getVar("settings-css"));loadScript(getVar("static-root-path")+getVar("settings-js"));preLoadCss(getVar("static-root-path")+getVar("theme-light-css"));preLoadCss(getVar("static-root-path")+getVar("theme-dark-css"));preLoadCss(getVar("static-root-path")+getVar("theme-ayu-css"));setTimeout(()=>{const themes=getVar("themes").split(",");for(const theme of themes){if(theme!==""){preLoadCss(getVar("root-path")+theme+".css")}}},0)};window.searchState={loadingText:"Loading search results...",input:document.getElementsByClassName("search-input")[0],outputElement:()=>{let el=document.getElementById("search");if(!el){el=document.createElement("section");el.id="search";getNotDisplayedElem().appendChild(el)}return el},title:document.title,titleBeforeSearch:document.title,timeout:null,currentTab:0,focusedByTab:[null,null,null],clearInputTimeout:()=>{if(searchState.timeout!==null){clearTimeout(searchState.timeout);searchState.timeout=null}},isDisplayed:()=>searchState.outputElement().parentElement.id===ALTERNATIVE_DISPLAY_ID,focus:()=>{searchState.input.focus()},defocus:()=>{searchState.input.blur()},showResults:search=>{if(search===null||typeof search==="undefined"){search=searchState.outputElement()}switchDisplayedElement(search);searchState.mouseMovedAfterSearch=false;document.title=searchState.title},hideResults:()=>{switchDisplayedElement(null);document.title=searchState.titleBeforeSearch;if(browserSupportsHistoryApi()){history.replaceState(null,"",getNakedUrl()+window.location.hash)}},getQueryStringParams:()=>{const params={};window.location.search.substring(1).split("&").map(s=>{const pair=s.split("=");params[decodeURIComponent(pair[0])]=typeof pair[1]==="undefined"?null:decodeURIComponent(pair[1])});return params},setup:()=>{const search_input=searchState.input;if(!searchState.input){return}let searchLoaded=false;function loadSearch(){if(!searchLoaded){searchLoaded=true;loadScript(getVar("static-root-path")+getVar("search-js"));loadScript(resourcePath("search-index",".js"))}}search_input.addEventListener("focus",()=>{search_input.origPlaceholder=search_input.placeholder;search_input.placeholder="Type your search here.";loadSearch()});if(search_input.value!==""){loadSearch()}const params=searchState.getQueryStringParams();if(params.search!==undefined){searchState.setLoadingSearch();loadSearch()}},setLoadingSearch:()=>{const search=searchState.outputElement();search.innerHTML="

"+searchState.loadingText+"

";searchState.showResults(search)},};const toggleAllDocsId="toggle-all-docs";let savedHash="";function handleHashes(ev){if(ev!==null&&searchState.isDisplayed()&&ev.newURL){switchDisplayedElement(null);const hash=ev.newURL.slice(ev.newURL.indexOf("#")+1);if(browserSupportsHistoryApi()){history.replaceState(null,"",getNakedUrl()+window.location.search+"#"+hash)}const elem=document.getElementById(hash);if(elem){elem.scrollIntoView()}}const pageId=window.location.hash.replace(/^#/,"");if(savedHash!==pageId){savedHash=pageId;if(pageId!==""){expandSection(pageId)}}}function onHashChange(ev){hideSidebar();handleHashes(ev)}function openParentDetails(elem){while(elem){if(elem.tagName==="DETAILS"){elem.open=true}elem=elem.parentNode}}function expandSection(id){openParentDetails(document.getElementById(id))}function handleEscape(ev){searchState.clearInputTimeout();searchState.hideResults();ev.preventDefault();searchState.defocus();window.hideAllModals(true)}function handleShortcut(ev){const disableShortcuts=getSettingValue("disable-shortcuts")==="true";if(ev.ctrlKey||ev.altKey||ev.metaKey||disableShortcuts){return}if(document.activeElement.tagName==="INPUT"&&document.activeElement.type!=="checkbox"&&document.activeElement.type!=="radio"){switch(getVirtualKey(ev)){case"Escape":handleEscape(ev);break}}else{switch(getVirtualKey(ev)){case"Escape":handleEscape(ev);break;case"s":case"S":ev.preventDefault();searchState.focus();break;case"+":ev.preventDefault();expandAllDocs();break;case"-":ev.preventDefault();collapseAllDocs();break;case"?":showHelp();break;default:break}}}document.addEventListener("keypress",handleShortcut);document.addEventListener("keydown",handleShortcut);function addSidebarItems(){if(!window.SIDEBAR_ITEMS){return}const sidebar=document.getElementsByClassName("sidebar-elems")[0];function block(shortty,id,longty){const filtered=window.SIDEBAR_ITEMS[shortty];if(!filtered){return}const h3=document.createElement("h3");h3.innerHTML=`${longty}`;const ul=document.createElement("ul");ul.className="block "+shortty;for(const name of filtered){let path;if(shortty==="mod"){path=name+"/index.html"}else{path=shortty+"."+name+".html"}const current_page=document.location.href.split("/").pop();const link=document.createElement("a");link.href=path;if(path===current_page){link.className="current"}link.textContent=name;const li=document.createElement("li");li.appendChild(link);ul.appendChild(li)}sidebar.appendChild(h3);sidebar.appendChild(ul)}if(sidebar){block("primitive","primitives","Primitive Types");block("mod","modules","Modules");block("macro","macros","Macros");block("struct","structs","Structs");block("enum","enums","Enums");block("union","unions","Unions");block("constant","constants","Constants");block("static","static","Statics");block("trait","traits","Traits");block("fn","functions","Functions");block("type","types","Type Definitions");block("foreigntype","foreign-types","Foreign Types");block("keyword","keywords","Keywords");block("traitalias","trait-aliases","Trait Aliases")}}window.register_implementors=imp=>{const implementors=document.getElementById("implementors-list");const synthetic_implementors=document.getElementById("synthetic-implementors-list");const inlined_types=new Set();const TEXT_IDX=0;const SYNTHETIC_IDX=1;const TYPES_IDX=2;if(synthetic_implementors){onEachLazy(synthetic_implementors.getElementsByClassName("impl"),el=>{const aliases=el.getAttribute("data-aliases");if(!aliases){return}aliases.split(",").forEach(alias=>{inlined_types.add(alias)})})}let currentNbImpls=implementors.getElementsByClassName("impl").length;const traitName=document.querySelector(".main-heading h1 > .trait").textContent;const baseIdName="impl-"+traitName+"-";const libs=Object.getOwnPropertyNames(imp);const script=document.querySelector("script[data-ignore-extern-crates]");const ignoreExternCrates=new Set((script?script.getAttribute("data-ignore-extern-crates"):"").split(","));for(const lib of libs){if(lib===window.currentCrate||ignoreExternCrates.has(lib)){continue}const structs=imp[lib];struct_loop:for(const struct of structs){const list=struct[SYNTHETIC_IDX]?synthetic_implementors:implementors;if(struct[SYNTHETIC_IDX]){for(const struct_type of struct[TYPES_IDX]){if(inlined_types.has(struct_type)){continue struct_loop}inlined_types.add(struct_type)}}const code=document.createElement("h3");code.innerHTML=struct[TEXT_IDX];addClass(code,"code-header");onEachLazy(code.getElementsByTagName("a"),elem=>{const href=elem.getAttribute("href");if(href&&!/^(?:[a-z+]+:)?\/\//.test(href)){elem.setAttribute("href",window.rootPath+href)}});const currentId=baseIdName+currentNbImpls;const anchor=document.createElement("a");anchor.href="#"+currentId;addClass(anchor,"anchor");const display=document.createElement("div");display.id=currentId;addClass(display,"impl");display.appendChild(anchor);display.appendChild(code);list.appendChild(display);currentNbImpls+=1}}};if(window.pending_implementors){window.register_implementors(window.pending_implementors)}function addSidebarCrates(){if(!window.ALL_CRATES){return}const sidebarElems=document.getElementsByClassName("sidebar-elems")[0];if(!sidebarElems){return}const h3=document.createElement("h3");h3.innerHTML="Crates";const ul=document.createElement("ul");ul.className="block crate";for(const crate of window.ALL_CRATES){const link=document.createElement("a");link.href=window.rootPath+crate+"/index.html";if(window.rootPath!=="./"&&crate===window.currentCrate){link.className="current"}link.textContent=crate;const li=document.createElement("li");li.appendChild(link);ul.appendChild(li)}sidebarElems.appendChild(h3);sidebarElems.appendChild(ul)}function expandAllDocs(){const innerToggle=document.getElementById(toggleAllDocsId);removeClass(innerToggle,"will-expand");onEachLazy(document.getElementsByClassName("toggle"),e=>{if(!hasClass(e,"type-contents-toggle")&&!hasClass(e,"more-examples-toggle")){e.open=true}});innerToggle.title="collapse all docs";innerToggle.children[0].innerText="\u2212"}function collapseAllDocs(){const innerToggle=document.getElementById(toggleAllDocsId);addClass(innerToggle,"will-expand");onEachLazy(document.getElementsByClassName("toggle"),e=>{if(e.parentNode.id!=="implementations-list"||(!hasClass(e,"implementors-toggle")&&!hasClass(e,"type-contents-toggle"))){e.open=false}});innerToggle.title="expand all docs";innerToggle.children[0].innerText="+"}function toggleAllDocs(){const innerToggle=document.getElementById(toggleAllDocsId);if(!innerToggle){return}if(hasClass(innerToggle,"will-expand")){expandAllDocs()}else{collapseAllDocs()}}(function(){const toggles=document.getElementById(toggleAllDocsId);if(toggles){toggles.onclick=toggleAllDocs}const hideMethodDocs=getSettingValue("auto-hide-method-docs")==="true";const hideImplementations=getSettingValue("auto-hide-trait-implementations")==="true";const hideLargeItemContents=getSettingValue("auto-hide-large-items")!=="false";function setImplementorsTogglesOpen(id,open){const list=document.getElementById(id);if(list!==null){onEachLazy(list.getElementsByClassName("implementors-toggle"),e=>{e.open=open})}}if(hideImplementations){setImplementorsTogglesOpen("trait-implementations-list",false);setImplementorsTogglesOpen("blanket-implementations-list",false)}onEachLazy(document.getElementsByClassName("toggle"),e=>{if(!hideLargeItemContents&&hasClass(e,"type-contents-toggle")){e.open=true}if(hideMethodDocs&&hasClass(e,"method-toggle")){e.open=false}})}());window.rustdoc_add_line_numbers_to_examples=()=>{onEachLazy(document.getElementsByClassName("rust-example-rendered"),x=>{const parent=x.parentNode;const line_numbers=parent.querySelectorAll(".example-line-numbers");if(line_numbers.length>0){return}const count=x.textContent.split("\n").length;const elems=[];for(let i=0;i{onEachLazy(document.getElementsByClassName("rust-example-rendered"),x=>{const parent=x.parentNode;const line_numbers=parent.querySelectorAll(".example-line-numbers");for(const node of line_numbers){parent.removeChild(node)}})};if(getSettingValue("line-numbers")==="true"){window.rustdoc_add_line_numbers_to_examples()}function showSidebar(){window.hideAllModals(false);const sidebar=document.getElementsByClassName("sidebar")[0];addClass(sidebar,"shown")}function hideSidebar(){const sidebar=document.getElementsByClassName("sidebar")[0];removeClass(sidebar,"shown")}window.addEventListener("resize",()=>{if(window.CURRENT_TOOLTIP_ELEMENT){const base=window.CURRENT_TOOLTIP_ELEMENT.TOOLTIP_BASE;const force_visible=base.TOOLTIP_FORCE_VISIBLE;hideTooltip(false);if(force_visible){showTooltip(base);base.TOOLTIP_FORCE_VISIBLE=true}}});const mainElem=document.getElementById(MAIN_ID);if(mainElem){mainElem.addEventListener("click",hideSidebar)}onEachLazy(document.querySelectorAll("a[href^='#']"),el=>{el.addEventListener("click",()=>{expandSection(el.hash.slice(1));hideSidebar()})});onEachLazy(document.querySelectorAll(".toggle > summary:not(.hideme)"),el=>{el.addEventListener("click",e=>{if(e.target.tagName!=="SUMMARY"&&e.target.tagName!=="A"){e.preventDefault()}})});function showTooltip(e){const notable_ty=e.getAttribute("data-notable-ty");if(!window.NOTABLE_TRAITS&¬able_ty){const data=document.getElementById("notable-traits-data");if(data){window.NOTABLE_TRAITS=JSON.parse(data.innerText)}else{throw new Error("showTooltip() called with notable without any notable traits!")}}if(window.CURRENT_TOOLTIP_ELEMENT&&window.CURRENT_TOOLTIP_ELEMENT.TOOLTIP_BASE===e){return}window.hideAllModals(false);const wrapper=document.createElement("div");if(notable_ty){wrapper.innerHTML="
"+window.NOTABLE_TRAITS[notable_ty]+"
"}else if(e.getAttribute("title")!==undefined){const titleContent=document.createElement("div");titleContent.className="content";titleContent.appendChild(document.createTextNode(e.getAttribute("title")));wrapper.appendChild(titleContent)}wrapper.className="tooltip popover";const focusCatcher=document.createElement("div");focusCatcher.setAttribute("tabindex","0");focusCatcher.onfocus=hideTooltip;wrapper.appendChild(focusCatcher);const pos=e.getBoundingClientRect();wrapper.style.top=(pos.top+window.scrollY+pos.height)+"px";wrapper.style.left=0;wrapper.style.right="auto";wrapper.style.visibility="hidden";const body=document.getElementsByTagName("body")[0];body.appendChild(wrapper);const wrapperPos=wrapper.getBoundingClientRect();const finalPos=pos.left+window.scrollX-wrapperPos.width+24;if(finalPos>0){wrapper.style.left=finalPos+"px"}else{wrapper.style.setProperty("--popover-arrow-offset",(wrapperPos.right-pos.right+4)+"px")}wrapper.style.visibility="";window.CURRENT_TOOLTIP_ELEMENT=wrapper;window.CURRENT_TOOLTIP_ELEMENT.TOOLTIP_BASE=e;wrapper.onpointerleave=function(ev){if(ev.pointerType!=="mouse"){return}if(!e.TOOLTIP_FORCE_VISIBLE&&!elemIsInParent(event.relatedTarget,e)){hideTooltip(true)}}}function tooltipBlurHandler(event){if(window.CURRENT_TOOLTIP_ELEMENT&&!elemIsInParent(document.activeElement,window.CURRENT_TOOLTIP_ELEMENT)&&!elemIsInParent(event.relatedTarget,window.CURRENT_TOOLTIP_ELEMENT)&&!elemIsInParent(document.activeElement,window.CURRENT_TOOLTIP_ELEMENT.TOOLTIP_BASE)&&!elemIsInParent(event.relatedTarget,window.CURRENT_TOOLTIP_ELEMENT.TOOLTIP_BASE)){setTimeout(()=>hideTooltip(false),0)}}function hideTooltip(focus){if(window.CURRENT_TOOLTIP_ELEMENT){if(window.CURRENT_TOOLTIP_ELEMENT.TOOLTIP_BASE.TOOLTIP_FORCE_VISIBLE){if(focus){window.CURRENT_TOOLTIP_ELEMENT.TOOLTIP_BASE.focus()}window.CURRENT_TOOLTIP_ELEMENT.TOOLTIP_BASE.TOOLTIP_FORCE_VISIBLE=false}const body=document.getElementsByTagName("body")[0];body.removeChild(window.CURRENT_TOOLTIP_ELEMENT);window.CURRENT_TOOLTIP_ELEMENT=null}}onEachLazy(document.getElementsByClassName("tooltip"),e=>{e.onclick=function(){this.TOOLTIP_FORCE_VISIBLE=this.TOOLTIP_FORCE_VISIBLE?false:true;if(window.CURRENT_TOOLTIP_ELEMENT&&!this.TOOLTIP_FORCE_VISIBLE){hideTooltip(true)}else{showTooltip(this);window.CURRENT_TOOLTIP_ELEMENT.setAttribute("tabindex","0");window.CURRENT_TOOLTIP_ELEMENT.focus();window.CURRENT_TOOLTIP_ELEMENT.onblur=tooltipBlurHandler}return false};e.onpointerenter=function(ev){if(ev.pointerType!=="mouse"){return}showTooltip(this)};e.onpointerleave=function(ev){if(ev.pointerType!=="mouse"){return}if(!this.TOOLTIP_FORCE_VISIBLE&&!elemIsInParent(ev.relatedTarget,window.CURRENT_TOOLTIP_ELEMENT)){hideTooltip(true)}}});const sidebar_menu_toggle=document.getElementsByClassName("sidebar-menu-toggle")[0];if(sidebar_menu_toggle){sidebar_menu_toggle.addEventListener("click",()=>{const sidebar=document.getElementsByClassName("sidebar")[0];if(!hasClass(sidebar,"shown")){showSidebar()}else{hideSidebar()}})}function helpBlurHandler(event){blurHandler(event,getHelpButton(),window.hidePopoverMenus)}function buildHelpMenu(){const book_info=document.createElement("span");book_info.className="top";book_info.innerHTML="You can find more information in \ + the rustdoc book.";const shortcuts=[["?","Show this help dialog"],["S","Focus the search field"],["↑","Move up in search results"],["↓","Move down in search results"],["← / →","Switch result tab (when results focused)"],["⏎","Go to active search result"],["+","Expand all sections"],["-","Collapse all sections"],].map(x=>"
"+x[0].split(" ").map((y,index)=>((index&1)===0?""+y+"":" "+y+" ")).join("")+"
"+x[1]+"
").join("");const div_shortcuts=document.createElement("div");addClass(div_shortcuts,"shortcuts");div_shortcuts.innerHTML="

Keyboard Shortcuts

"+shortcuts+"
";const infos=["Prefix searches with a type followed by a colon (e.g., fn:) to \ + restrict the search to a given item kind.","Accepted kinds are: fn, mod, struct, \ + enum, trait, type, macro, \ + and const.","Search functions by type signature (e.g., vec -> usize or \ + -> vec or String, enum:Cow -> bool)","You can look for items with an exact name by putting double quotes around \ + your request: \"string\"","Look for items inside another one by searching for a path: vec::Vec",].map(x=>"

"+x+"

").join("");const div_infos=document.createElement("div");addClass(div_infos,"infos");div_infos.innerHTML="

Search Tricks

"+infos;const rustdoc_version=document.createElement("span");rustdoc_version.className="bottom";const rustdoc_version_code=document.createElement("code");rustdoc_version_code.innerText="rustdoc "+getVar("rustdoc-version");rustdoc_version.appendChild(rustdoc_version_code);const container=document.createElement("div");if(!isHelpPage){container.className="popover"}container.id="help";container.style.display="none";const side_by_side=document.createElement("div");side_by_side.className="side-by-side";side_by_side.appendChild(div_shortcuts);side_by_side.appendChild(div_infos);container.appendChild(book_info);container.appendChild(side_by_side);container.appendChild(rustdoc_version);if(isHelpPage){const help_section=document.createElement("section");help_section.appendChild(container);document.getElementById("main-content").appendChild(help_section);container.style.display="block"}else{const help_button=getHelpButton();help_button.appendChild(container);container.onblur=helpBlurHandler;help_button.onblur=helpBlurHandler;help_button.children[0].onblur=helpBlurHandler}return container}window.hideAllModals=function(switchFocus){hideSidebar();window.hidePopoverMenus();hideTooltip(switchFocus)};window.hidePopoverMenus=function(){onEachLazy(document.querySelectorAll(".search-form .popover"),elem=>{elem.style.display="none"})};function getHelpMenu(buildNeeded){let menu=getHelpButton().querySelector(".popover");if(!menu&&buildNeeded){menu=buildHelpMenu()}return menu}function showHelp(){getHelpButton().querySelector("a").focus();const menu=getHelpMenu(true);if(menu.style.display==="none"){window.hideAllModals();menu.style.display=""}}if(isHelpPage){showHelp();document.querySelector(`#${HELP_BUTTON_ID} > a`).addEventListener("click",event=>{const target=event.target;if(target.tagName!=="A"||target.parentElement.id!==HELP_BUTTON_ID||event.ctrlKey||event.altKey||event.metaKey){return}event.preventDefault()})}else{document.querySelector(`#${HELP_BUTTON_ID} > a`).addEventListener("click",event=>{const target=event.target;if(target.tagName!=="A"||target.parentElement.id!==HELP_BUTTON_ID||event.ctrlKey||event.altKey||event.metaKey){return}event.preventDefault();const menu=getHelpMenu(true);const shouldShowHelp=menu.style.display==="none";if(shouldShowHelp){showHelp()}else{window.hidePopoverMenus()}})}setMobileTopbar();addSidebarItems();addSidebarCrates();onHashChange(null);window.addEventListener("hashchange",onHashChange);searchState.setup()}());(function(){let reset_button_timeout=null;const but=document.getElementById("copy-path");if(!but){return}but.onclick=()=>{const parent=but.parentElement;const path=[];onEach(parent.childNodes,child=>{if(child.tagName==="A"){path.push(child.textContent)}});const el=document.createElement("textarea");el.value=path.join("::");el.setAttribute("readonly","");el.style.position="absolute";el.style.left="-9999px";document.body.appendChild(el);el.select();document.execCommand("copy");document.body.removeChild(el);but.children[0].style.display="none";let tmp;if(but.childNodes.length<2){tmp=document.createTextNode("✓");but.appendChild(tmp)}else{onEachLazy(but.childNodes,e=>{if(e.nodeType===Node.TEXT_NODE){tmp=e;return true}});tmp.textContent="✓"}if(reset_button_timeout!==null){window.clearTimeout(reset_button_timeout)}function reset_button(){tmp.textContent="";reset_button_timeout=null;but.children[0].style.display=""}reset_button_timeout=window.setTimeout(reset_button,1000)}}()) \ No newline at end of file diff --git a/docs/static.files/normalize-76eba96aa4d2e634.css b/docs/static.files/normalize-76eba96aa4d2e634.css new file mode 100644 index 000000000..469959f13 --- /dev/null +++ b/docs/static.files/normalize-76eba96aa4d2e634.css @@ -0,0 +1,2 @@ + /*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ +html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:0.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type="button"],[type="reset"],[type="submit"],button{-webkit-appearance:button}[type="button"]::-moz-focus-inner,[type="reset"]::-moz-focus-inner,[type="submit"]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type="button"]:-moz-focusring,[type="reset"]:-moz-focusring,[type="submit"]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:0.35em 0.75em 0.625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type="checkbox"],[type="radio"]{box-sizing:border-box;padding:0}[type="number"]::-webkit-inner-spin-button,[type="number"]::-webkit-outer-spin-button{height:auto}[type="search"]{-webkit-appearance:textfield;outline-offset:-2px}[type="search"]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}template{display:none}[hidden]{display:none} \ No newline at end of file diff --git a/docs/static.files/noscript-13285aec31fa243e.css b/docs/static.files/noscript-13285aec31fa243e.css new file mode 100644 index 000000000..c32e0cb13 --- /dev/null +++ b/docs/static.files/noscript-13285aec31fa243e.css @@ -0,0 +1 @@ + #main-content .attributes{margin-left:0 !important;}#copy-path{display:none;}nav.sub{display:none;}.source .sidebar{display:none;}.notable-traits{display:none;} \ No newline at end of file diff --git a/docs/static.files/rust-logo-151179464ae7ed46.svg b/docs/static.files/rust-logo-151179464ae7ed46.svg new file mode 100644 index 000000000..62424d8ff --- /dev/null +++ b/docs/static.files/rust-logo-151179464ae7ed46.svg @@ -0,0 +1,61 @@ + + + diff --git a/docs/static.files/rustdoc-f3501f0f5ae15dfb.css b/docs/static.files/rustdoc-f3501f0f5ae15dfb.css new file mode 100644 index 000000000..3681b049e --- /dev/null +++ b/docs/static.files/rustdoc-f3501f0f5ae15dfb.css @@ -0,0 +1,8 @@ + :root{--nav-sub-mobile-padding:8px;}@font-face {font-family:'Fira Sans';font-style:normal;font-weight:400;src:local('Fira Sans'),url("FiraSans-Regular-018c141bf0843ffd.woff2") format("woff2");font-display:swap;}@font-face {font-family:'Fira Sans';font-style:normal;font-weight:500;src:local('Fira Sans Medium'),url("FiraSans-Medium-8f9a781e4970d388.woff2") format("woff2");font-display:swap;}@font-face {font-family:'Source Serif 4';font-style:normal;font-weight:400;src:local('Source Serif 4'),url("SourceSerif4-Regular-46f98efaafac5295.ttf.woff2") format("woff2");font-display:swap;}@font-face {font-family:'Source Serif 4';font-style:italic;font-weight:400;src:local('Source Serif 4 Italic'),url("SourceSerif4-It-acdfaf1a8af734b1.ttf.woff2") format("woff2");font-display:swap;}@font-face {font-family:'Source Serif 4';font-style:normal;font-weight:700;src:local('Source Serif 4 Bold'),url("SourceSerif4-Bold-a2c9cd1067f8b328.ttf.woff2") format("woff2");font-display:swap;}@font-face {font-family:'Source Code Pro';font-style:normal;font-weight:400;src:url("SourceCodePro-Regular-562dcc5011b6de7d.ttf.woff2") format("woff2");font-display:swap;}@font-face {font-family:'Source Code Pro';font-style:italic;font-weight:400;src:url("SourceCodePro-It-1cc31594bf4f1f79.ttf.woff2") format("woff2");font-display:swap;}@font-face {font-family:'Source Code Pro';font-style:normal;font-weight:600;src:url("SourceCodePro-Semibold-d899c5a5c4aeb14a.ttf.woff2") format("woff2");font-display:swap;}@font-face {font-family:'NanumBarunGothic';src:url("NanumBarunGothic-0f09457c7a19b7c6.ttf.woff2") format("woff2");font-display:swap;unicode-range:U+AC00-D7AF,U+1100-11FF,U+3130-318F,U+A960-A97F,U+D7B0-D7FF;}*{box-sizing:border-box;}body{font:1rem/1.5 "Source Serif 4",NanumBarunGothic,serif;margin:0;position:relative;overflow-wrap:break-word;overflow-wrap:anywhere;font-feature-settings:"kern","liga";background-color:var(--main-background-color);color:var(--main-color);}h1{font-size:1.5rem;}h2{font-size:1.375rem;}h3{font-size:1.25rem;}h1,h2,h3,h4,h5,h6{font-weight:500;}h1,h2,h3,h4{margin:25px 0 15px 0;padding-bottom:6px;}.docblock h3,.docblock h4,h5,h6{margin:15px 0 5px 0;}.docblock>h2:first-child,.docblock>h3:first-child,.docblock>h4:first-child,.docblock>h5:first-child,.docblock>h6:first-child{margin-top:0;}.main-heading h1{margin:0;padding:0;flex-grow:1;overflow-wrap:break-word;overflow-wrap:anywhere;}.main-heading{display:flex;flex-wrap:wrap;padding-bottom:6px;margin-bottom:15px;}.content h2,.top-doc .docblock>h3,.top-doc .docblock>h4{border-bottom:1px solid var(--headings-border-bottom-color);}h1,h2{line-height:1.25;padding-top:3px;padding-bottom:9px;}h3.code-header{font-size:1.125rem;}h4.code-header{font-size:1rem;}.code-header{font-weight:600;margin:0;padding:0;white-space:pre-wrap;}#crate-search,h1,h2,h3,h4,h5,h6,.sidebar,.mobile-topbar,.search-input,.search-results .result-name,.item-name>a,.out-of-band,span.since,a.srclink,#help-button>a,summary.hideme,.scraped-example-list,ul.all-items{font-family:"Fira Sans",Arial,NanumBarunGothic,sans-serif;}#toggle-all-docs,a.anchor,.small-section-header a,#source-sidebar a,.rust a,.sidebar h2 a,.sidebar h3 a,.mobile-topbar h2 a,h1 a,.search-results a,.stab,.result-name .primitive>i,.result-name .keyword>i{color:var(--main-color);}span.enum,a.enum,span.struct,a.struct,span.union,a.union,span.primitive,a.primitive,span.type,a.type,span.foreigntype,a.foreigntype{color:var(--type-link-color);}span.trait,a.trait,span.traitalias,a.traitalias{color:var(--trait-link-color);}span.associatedtype,a.associatedtype,span.constant,a.constant,span.static,a.static{color:var(--assoc-item-link-color);}span.fn,a.fn,span.method,a.method,span.tymethod,a.tymethod{color:var(--function-link-color);}span.attr,a.attr,span.derive,a.derive,span.macro,a.macro{color:var(--macro-link-color);}span.mod,a.mod{color:var(--mod-link-color);}span.keyword,a.keyword{color:var(--keyword-link-color);}a{color:var(--link-color);text-decoration:none;}ol,ul{padding-left:24px;}ul ul,ol ul,ul ol,ol ol{margin-bottom:.625em;}p{margin:0 0 .75em 0;}p:last-child{margin:0;}button{padding:1px 6px;cursor:pointer;}button#toggle-all-docs{padding:0;background:none;border:none;-webkit-appearance:none;opacity:1;}.rustdoc{display:flex;flex-direction:row;flex-wrap:nowrap;}main{position:relative;flex-grow:1;padding:10px 15px 40px 45px;min-width:0;}.source main{padding:15px;}.width-limiter{max-width:960px;margin-right:auto;}details:not(.toggle) summary{margin-bottom:.6em;}code,pre,a.test-arrow,.code-header{font-family:"Source Code Pro",monospace;}.docblock code,.docblock-short code{border-radius:3px;padding:0 0.125em;}.docblock pre code,.docblock-short pre code{padding:0;}pre{padding:14px;line-height:1.5;}pre.item-decl{overflow-x:auto;}.item-decl .type-contents-toggle{contain:initial;}.source .content pre{padding:20px;}.rustdoc.source .example-wrap pre.src-line-numbers{padding:20px 0 20px 4px;}img{max-width:100%;}.sub-logo-container,.logo-container{line-height:0;display:block;}.sub-logo-container{margin-right:32px;}.sub-logo-container>img{height:60px;width:60px;object-fit:contain;}.rust-logo{filter:var(--rust-logo-filter);}.sidebar{font-size:0.875rem;flex:0 0 200px;overflow-y:scroll;overscroll-behavior:contain;position:sticky;height:100vh;top:0;left:0;}.rustdoc.source .sidebar{flex-basis:50px;border-right:1px solid;overflow-x:hidden;overflow-y:hidden;z-index:1;}.sidebar,.mobile-topbar,.sidebar-menu-toggle,#src-sidebar-toggle,#source-sidebar{background-color:var(--sidebar-background-color);}#src-sidebar-toggle>button:hover,#src-sidebar-toggle>button:focus{background-color:var(--sidebar-background-color-hover);}.source .sidebar>*:not(#src-sidebar-toggle){visibility:hidden;}.source-sidebar-expanded .source .sidebar{overflow-y:auto;flex-basis:300px;}.source-sidebar-expanded .source .sidebar>*:not(#src-sidebar-toggle){visibility:visible;}#all-types{margin-top:1em;}*{scrollbar-width:initial;scrollbar-color:var(--scrollbar-color);}.sidebar{scrollbar-width:thin;scrollbar-color:var(--scrollbar-color);}::-webkit-scrollbar{width:12px;}.sidebar::-webkit-scrollbar{width:8px;}::-webkit-scrollbar-track{-webkit-box-shadow:inset 0;background-color:var(--scrollbar-track-background-color);}.sidebar::-webkit-scrollbar-track{background-color:var(--scrollbar-track-background-color);}::-webkit-scrollbar-thumb,.sidebar::-webkit-scrollbar-thumb{background-color:var(--scrollbar-thumb-background-color);}.hidden{display:none !important;}.sidebar .logo-container{margin-top:10px;margin-bottom:10px;text-align:center;}.version{overflow-wrap:break-word;}.logo-container>img{height:100px;width:100px;}ul.block,.block li{padding:0;margin:0;list-style:none;}.sidebar-elems a,.sidebar>h2 a{display:block;padding:0.25rem;margin-left:-0.25rem;}.sidebar h2{overflow-wrap:anywhere;padding:0;margin:0.7rem 0;}.sidebar h3{font-size:1.125rem;padding:0;margin:0;}.sidebar-elems,.sidebar>h2{padding-left:24px;}.sidebar a{color:var(--sidebar-link-color);}.sidebar .current,.sidebar a:hover:not(.logo-container){background-color:var(--sidebar-current-link-background-color);}.sidebar-elems .block{margin-bottom:2em;}.sidebar-elems .block li a{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;}.mobile-topbar{display:none;}.rustdoc .example-wrap{display:flex;position:relative;margin-bottom:10px;}.rustdoc .example-wrap:last-child{margin-bottom:0px;}.rustdoc .example-wrap pre{margin:0;flex-grow:1;}.rustdoc:not(.source) .example-wrap pre{overflow:auto hidden;}.rustdoc .example-wrap pre.example-line-numbers,.rustdoc .example-wrap pre.src-line-numbers{flex-grow:0;min-width:fit-content;overflow:initial;text-align:right;-webkit-user-select:none;user-select:none;padding:14px 8px;color:var(--src-line-numbers-span-color);}.rustdoc .example-wrap pre.src-line-numbers{padding:14px 0;}.src-line-numbers a,.src-line-numbers span{color:var(--src-line-numbers-span-color);padding:0 8px;}.src-line-numbers :target{background-color:transparent;border-right:none;padding:0 8px;}.src-line-numbers .line-highlighted{background-color:var(--src-line-number-highlighted-background-color);}.search-loading{text-align:center;}.docblock-short{overflow-wrap:break-word;overflow-wrap:anywhere;}.docblock :not(pre)>code,.docblock-short code{white-space:pre-wrap;}.top-doc .docblock h2{font-size:1.375rem;}.top-doc .docblock h3{font-size:1.25rem;}.top-doc .docblock h4,.top-doc .docblock h5{font-size:1.125rem;}.top-doc .docblock h6{font-size:1rem;}.docblock h5{font-size:1rem;}.docblock h6{font-size:0.875rem;}.docblock{margin-left:24px;position:relative;}.docblock>:not(.more-examples-toggle):not(.example-wrap){max-width:100%;overflow-x:auto;}.out-of-band{flex-grow:0;font-size:1.125rem;}.docblock code,.docblock-short code,pre,.rustdoc.source .example-wrap{background-color:var(--code-block-background-color);}#main-content{position:relative;}.docblock table{margin:.5em 0;border-collapse:collapse;}.docblock table td,.docblock table th{padding:.5em;border:1px solid var(--border-color);}.docblock table tbody tr:nth-child(2n){background:var(--table-alt-row-background-color);}.method .where,.fn .where,.where.fmt-newline{display:block;white-space:pre-wrap;font-size:0.875rem;}.item-info{display:block;margin-left:24px;}.item-info code{font-size:0.875rem;}#main-content>.item-info{margin-left:0;}nav.sub{flex-grow:1;flex-flow:row nowrap;margin:4px 0 25px 0;display:flex;align-items:center;}.search-form{position:relative;display:flex;height:34px;flex-grow:1;}.source nav.sub{margin:0 0 15px 0;}.small-section-header{display:block;position:relative;}.small-section-header:hover>.anchor,.impl:hover>.anchor,.trait-impl:hover>.anchor,.variant:hover>.anchor{display:initial;}.anchor{display:none;position:absolute;left:-0.5em;background:none !important;}.anchor.field{left:-5px;}.small-section-header>.anchor{left:-15px;padding-right:8px;}h2.small-section-header>.anchor{padding-right:6px;}.main-heading a:hover,.example-wrap .rust a:hover,.all-items a:hover,.docblock a:not(.test-arrow):not(.scrape-help):not(.tooltip):hover,.docblock-short a:not(.test-arrow):not(.scrape-help):not(.tooltip):hover,.item-info a{text-decoration:underline;}.crate.block a.current{font-weight:500;}table,.item-table{overflow-wrap:break-word;}.item-table{display:table;padding:0;margin:0;}.item-table>li{display:table-row;}.item-table>li>div{display:table-cell;}.item-table>li>.item-name{padding-right:1.25rem;}.search-results-title{margin-top:0;white-space:nowrap;display:flex;align-items:baseline;}#crate-search-div{position:relative;min-width:5em;}#crate-search{min-width:115px;padding:0 23px 0 4px;max-width:100%;text-overflow:ellipsis;border:1px solid var(--border-color);border-radius:4px;outline:none;cursor:pointer;-moz-appearance:none;-webkit-appearance:none;text-indent:0.01px;background-color:var(--main-background-color);color:inherit;line-height:1.5;font-weight:500;}#crate-search:hover,#crate-search:focus{border-color:var(--crate-search-hover-border);}@-moz-document url-prefix(){#crate-search{padding-left:0px;padding-right:19px;}}#crate-search-div::after{pointer-events:none;width:100%;height:100%;position:absolute;top:0;left:0;content:"";background-repeat:no-repeat;background-size:20px;background-position:calc(100% - 2px) 56%;background-image:url('data:image/svg+xml, \ + ');filter:var(--crate-search-div-filter);}#crate-search-div:hover::after,#crate-search-div:focus-within::after{filter:var(--crate-search-div-hover-filter);}#crate-search>option{font-size:1rem;}.search-input{-webkit-appearance:none;outline:none;border:1px solid var(--border-color);border-radius:2px;padding:8px;font-size:1rem;flex-grow:1;background-color:var(--button-background-color);color:var(--search-color);}.search-input:focus{border-color:var(--search-input-focused-border-color);}.search-results{display:none;}.search-results.active{display:block;}.search-results>a{display:flex;margin-left:2px;margin-right:2px;border-bottom:1px solid var(--search-result-border-color);gap:1em;}.search-results>a>div{flex:1;}.search-results>a>div.desc{white-space:nowrap;text-overflow:ellipsis;overflow:hidden;}.search-results a:hover,.search-results a:focus{background-color:var(--search-result-link-focus-background-color);}.search-results .result-name span.alias{color:var(--search-results-alias-color);}.search-results .result-name span.grey{color:var(--search-results-grey-color);}.popover{position:absolute;top:100%;right:0;z-index:2;margin-top:7px;border-radius:3px;border:1px solid var(--border-color);background-color:var(--main-background-color);color:var(--main-color);--popover-arrow-offset:11px;}.popover::before{content:'';position:absolute;right:var(--popover-arrow-offset);border:solid var(--border-color);border-width:1px 1px 0 0;background-color:var(--main-background-color);padding:4px;transform:rotate(-45deg);top:-5px;}#help.popover{max-width:600px;--popover-arrow-offset:48px;}#help dt{float:left;clear:left;margin-right:0.5rem;}#help span.top,#help span.bottom{text-align:center;display:block;font-size:1.125rem;}#help span.top{margin:10px 0;border-bottom:1px solid var(--border-color);padding-bottom:4px;margin-bottom:6px;}#help span.bottom{clear:both;border-top:1px solid var(--border-color);}.side-by-side>div{width:50%;float:left;padding:0 20px 20px 17px;}.item-info .stab{min-height:36px;display:flex;padding:3px;margin-bottom:5px;}.item-name .stab{margin-left:0.3125em;}.stab{padding:0 2px;font-size:0.875rem;font-weight:normal;color:var(--main-color);background-color:var(--stab-background-color);width:fit-content;align-items:center;white-space:pre-wrap;border-radius:3px;display:inline-flex;vertical-align:text-bottom;}.stab.portability>code{background:none;color:var(--stab-code-color);}.stab .emoji{font-size:1.25rem;margin-right:0.3rem;}.emoji{text-shadow:1px 0 0 black,-1px 0 0 black,0 1px 0 black,0 -1px 0 black;}.since{font-weight:normal;font-size:initial;}.rightside{padding-left:12px;float:right;}.rightside:not(a),.out-of-band{color:var(--right-side-color);}pre.rust{tab-size:4;-moz-tab-size:4;}pre.rust .kw{color:var(--code-highlight-kw-color);}pre.rust .kw-2{color:var(--code-highlight-kw-2-color);}pre.rust .lifetime{color:var(--code-highlight-lifetime-color);}pre.rust .prelude-ty{color:var(--code-highlight-prelude-color);}pre.rust .prelude-val{color:var(--code-highlight-prelude-val-color);}pre.rust .string{color:var(--code-highlight-string-color);}pre.rust .number{color:var(--code-highlight-number-color);}pre.rust .bool-val{color:var(--code-highlight-literal-color);}pre.rust .self{color:var(--code-highlight-self-color);}pre.rust .attr{color:var(--code-highlight-attribute-color);}pre.rust .macro,pre.rust .macro-nonterminal{color:var(--code-highlight-macro-color);}pre.rust .question-mark{font-weight:bold;color:var(--code-highlight-question-mark-color);}pre.rust .comment{color:var(--code-highlight-comment-color);}pre.rust .doccomment{color:var(--code-highlight-doc-comment-color);}.rustdoc.source .example-wrap pre.rust a{background:var(--codeblock-link-background);}.example-wrap.compile_fail,.example-wrap.should_panic{border-left:2px solid var(--codeblock-error-color);}.ignore.example-wrap{border-left:2px solid var(--codeblock-ignore-color);}.example-wrap.compile_fail:hover,.example-wrap.should_panic:hover{border-left:2px solid var(--codeblock-error-hover-color);}.example-wrap.ignore:hover{border-left:2px solid var(--codeblock-ignore-hover-color);}.example-wrap.compile_fail .tooltip,.example-wrap.should_panic .tooltip{color:var(--codeblock-error-color);}.example-wrap.ignore .tooltip{color:var(--codeblock-ignore-color);}.example-wrap.compile_fail:hover .tooltip,.example-wrap.should_panic:hover .tooltip{color:var(--codeblock-error-hover-color);}.example-wrap.ignore:hover .tooltip{color:var(--codeblock-ignore-hover-color);}.example-wrap .tooltip{position:absolute;display:block;left:-25px;top:5px;margin:0;line-height:1;}.example-wrap.compile_fail .tooltip,.example-wrap.should_panic .tooltip,.example-wrap.ignore .tooltip{font-weight:bold;font-size:1.25rem;}a.test-arrow{visibility:hidden;position:absolute;padding:5px 10px 5px 10px;border-radius:5px;font-size:1.375rem;top:5px;right:5px;z-index:1;color:var(--test-arrow-color);background-color:var(--test-arrow-background-color);}a.test-arrow:hover{color:var(--test-arrow-hover-color);background-color:var(--test-arrow-hover-background-color);}.example-wrap:hover .test-arrow{visibility:visible;}.code-attribute{font-weight:300;color:var(--code-attribute-color);}.item-spacer{width:100%;height:12px;display:block;}.out-of-band>span.since{font-size:1.25rem;}.sub-variant h4{font-size:1rem;font-weight:400;margin-top:0;margin-bottom:0;}.sub-variant{margin-left:24px;margin-bottom:40px;}.sub-variant>.sub-variant-field{margin-left:24px;}:target{padding-right:3px;background-color:var(--target-background-color);border-right:3px solid var(--target-border-color);}.code-header a.tooltip{color:inherit;margin-right:15px;position:relative;}a.tooltip:hover::after{position:absolute;top:calc(100% - 10px);left:-15px;right:-15px;height:20px;content:"\00a0";}.popover.tooltip .content{margin:0.25em 0.5em;}.popover.tooltip .content pre,.popover.tooltip .content code{background:transparent;margin:0;padding:0;font-size:1.25rem;white-space:pre-wrap;}.popover.tooltip .content>h3:first-child{margin:0 0 5px 0;}.search-failed{text-align:center;margin-top:20px;display:none;}.search-failed.active{display:block;}.search-failed>ul{text-align:left;max-width:570px;margin-left:auto;margin-right:auto;}#search-tabs{display:flex;flex-direction:row;gap:1px;margin-bottom:4px;}#search-tabs button{text-align:center;font-size:1.125rem;border:0;border-top:2px solid;flex:1;line-height:1.5;color:inherit;}#search-tabs button:not(.selected){background-color:var(--search-tab-button-not-selected-background);border-top-color:var(--search-tab-button-not-selected-border-top-color);}#search-tabs button:hover,#search-tabs button.selected{background-color:var(--search-tab-button-selected-background);border-top-color:var(--search-tab-button-selected-border-top-color);}#search-tabs .count{font-size:1rem;color:var(--search-tab-title-count-color);}#search .error code{border-radius:3px;background-color:var(--search-error-code-background-color);}.search-corrections{font-weight:normal;}#src-sidebar-toggle{position:sticky;top:0;left:0;font-size:1.25rem;border-bottom:1px solid;display:flex;height:40px;justify-content:stretch;align-items:stretch;z-index:10;}#source-sidebar{width:100%;overflow:auto;}#source-sidebar>.title{font-size:1.5rem;text-align:center;border-bottom:1px solid var(--border-color);margin-bottom:6px;}#source-sidebar div.files>a:hover,details.dir-entry summary:hover,#source-sidebar div.files>a:focus,details.dir-entry summary:focus{background-color:var(--source-sidebar-background-hover);}#source-sidebar div.files>a.selected{background-color:var(--source-sidebar-background-selected);}#src-sidebar-toggle>button{font-size:inherit;font-weight:bold;background:none;color:inherit;text-align:center;border:none;outline:none;flex:1 1;-webkit-appearance:none;opacity:1;}#settings-menu,#help-button{margin-left:4px;display:flex;}#settings-menu>a,#help-button>a{display:flex;align-items:center;justify-content:center;background-color:var(--button-background-color);border:1px solid var(--border-color);border-radius:2px;color:var(--settings-button-color);font-size:20px;width:33px;}#settings-menu>a:hover,#settings-menu>a:focus,#help-button>a:hover,#help-button>a:focus{border-color:var(--settings-button-border-focus);}#copy-path{color:var(--copy-path-button-color);background:var(--main-background-color);height:34px;margin-left:10px;padding:0;padding-left:2px;border:0;width:33px;}#copy-path>img{filter:var(--copy-path-img-filter);}#copy-path:hover>img{filter:var(--copy-path-img-hover-filter);}@keyframes rotating{from{transform:rotate(0deg);}to{transform:rotate(360deg);}}#settings-menu.rotate>a img{animation:rotating 2s linear infinite;}kbd{display:inline-block;padding:3px 5px;font:15px monospace;line-height:10px;vertical-align:middle;border:solid 1px var(--border-color);border-radius:3px;color:var(--kbd-color);background-color:var(--kbd-background);box-shadow:inset 0 -1px 0 var(--kbd-box-shadow-color);}ul.all-items>li{list-style:none;}details.dir-entry{padding-left:4px;}details.dir-entry>summary{margin:0 0 0 -4px;padding:0 0 0 4px;cursor:pointer;}details.dir-entry div.folders,details.dir-entry div.files{padding-left:23px;}details.dir-entry a{display:block;}details.toggle{contain:layout;position:relative;}details.toggle>summary.hideme{cursor:pointer;font-size:1rem;}details.toggle>summary{list-style:none;outline:none;}details.toggle>summary::-webkit-details-marker,details.toggle>summary::marker{display:none;}details.toggle>summary.hideme>span{margin-left:9px;}details.toggle>summary::before{background:url('data:image/svg+xml,') no-repeat top left;content:"";cursor:pointer;width:16px;height:16px;display:inline-block;vertical-align:middle;opacity:.5;filter:var(--toggle-filter);}details.toggle>summary.hideme>span,.more-examples-toggle summary,.more-examples-toggle .hide-more{color:var(--toggles-color);}details.toggle>summary::after{content:"Expand";overflow:hidden;width:0;height:0;position:absolute;}details.toggle>summary.hideme::after{content:"";}details.toggle>summary:focus::before,details.toggle>summary:hover::before{opacity:1;}details.toggle>summary:focus-visible::before{outline:1px dotted #000;outline-offset:1px;}details.non-exhaustive{margin-bottom:8px;}details.toggle>summary.hideme::before{position:relative;}details.toggle>summary:not(.hideme)::before{position:absolute;left:-24px;top:4px;}.impl-items>details.toggle>summary:not(.hideme)::before{position:absolute;left:-24px;}details.toggle[open] >summary.hideme{position:absolute;}details.toggle[open] >summary.hideme>span{display:none;}details.toggle[open] >summary::before{background:url('data:image/svg+xml,') no-repeat top left;}details.toggle[open] >summary::after{content:"Collapse";}.docblock summary>*{display:inline-block;}.docblock>.example-wrap:first-child .tooltip{margin-top:16px;}@media (max-width:700px){*[id]{scroll-margin-top:45px;}.rustdoc{display:block;}main{padding-left:15px;padding-top:0px;}.main-heading{flex-direction:column;}.out-of-band{text-align:left;margin-left:initial;padding:initial;}.out-of-band .since::before{content:"Since ";}.sidebar .logo-container,.sidebar .location{display:none;}.sidebar{position:fixed;top:45px;left:-1000px;z-index:11;height:calc(100vh - 45px);width:200px;}.source main,.rustdoc.source .sidebar{top:0;padding:0;height:100vh;border:0;}.sidebar.shown,.source-sidebar-expanded .source .sidebar,.rustdoc:not(.source) .sidebar:focus-within{left:0;}.mobile-topbar h2{padding-bottom:0;margin:auto 0.5em auto auto;overflow:hidden;font-size:24px;}.mobile-topbar h2 a{display:block;text-overflow:ellipsis;overflow:hidden;white-space:nowrap;}.mobile-topbar .logo-container>img{max-width:35px;max-height:35px;margin:5px 0 5px 20px;}.mobile-topbar{display:flex;flex-direction:row;position:sticky;z-index:10;font-size:2rem;height:45px;width:100%;left:0;top:0;}.sidebar-menu-toggle{width:45px;font-size:32px;border:none;color:var(--main-color);}.sidebar-elems{margin-top:1em;}.anchor{display:none !important;}#search-tabs .count{display:block;}#main-content>details.toggle>summary::before,#main-content>div>details.toggle>summary::before{left:-11px;}#src-sidebar-toggle{position:fixed;left:1px;top:100px;width:30px;font-size:1.5rem;padding:0;z-index:10;border-top-right-radius:3px;border-bottom-right-radius:3px;border:1px solid;border-left:0;}.source-sidebar-expanded #src-sidebar-toggle{left:unset;top:unset;width:unset;border-top-right-radius:unset;border-bottom-right-radius:unset;position:sticky;border:0;border-bottom:1px solid;}#copy-path,#help-button{display:none;}.item-table,.item-row,.item-table>li,.item-table>li>div,.search-results>a,.search-results>a>div{display:block;}.search-results>a{padding:5px 0px;}.search-results>a>div.desc,.item-table>li>div.desc{padding-left:2em;}.source-sidebar-expanded .source .sidebar{max-width:100vw;width:100vw;}details.toggle:not(.top-doc)>summary{margin-left:10px;}.impl-items>details.toggle>summary:not(.hideme)::before,#main-content>details.toggle:not(.top-doc)>summary::before,#main-content>div>details.toggle>summary::before{left:-11px;}.impl-items>.item-info{margin-left:34px;}.source nav.sub{margin:0;padding:var(--nav-sub-mobile-padding);}}@media (min-width:701px){.scraped-example-title{position:absolute;z-index:10;background:var(--main-background-color);bottom:8px;right:5px;padding:2px 4px;box-shadow:0 0 4px var(--main-background-color);}}@media print{nav.sidebar,nav.sub,.out-of-band,a.srclink,#copy-path,details.toggle[open] >summary::before,details.toggle>summary::before,details.toggle.top-doc>summary{display:none;}.docblock{margin-left:0;}main{padding:10px;}}@media (max-width:464px){.docblock{margin-left:12px;}.docblock code{overflow-wrap:break-word;overflow-wrap:anywhere;}nav.sub{flex-direction:column;}.search-form{align-self:stretch;}.sub-logo-container>img{height:35px;width:35px;margin-bottom:var(--nav-sub-mobile-padding);}}.variant,.implementors-toggle>summary,.impl,#implementors-list>.docblock,.impl-items>section,.impl-items>.toggle>summary,.methods>section,.methods>.toggle>summary{margin-bottom:0.75em;}.variants>.docblock,.implementors-toggle>.docblock,.impl-items>.toggle[open]:not(:last-child),.methods>.toggle[open]:not(:last-child),.implementors-toggle[open]:not(:last-child){margin-bottom:2em;}#trait-implementations-list .impl-items>.toggle:not(:last-child),#synthetic-implementations-list .impl-items>.toggle:not(:last-child),#blanket-implementations-list .impl-items>.toggle:not(:last-child){margin-bottom:1em;}.scraped-example-list .scrape-help{margin-left:10px;padding:0 4px;font-weight:normal;font-size:12px;position:relative;bottom:1px;border:1px solid var(--scrape-example-help-border-color);border-radius:50px;color:var(--scrape-example-help-color);}.scraped-example-list .scrape-help:hover{border-color:var(--scrape-example-help-hover-border-color);color:var(--scrape-example-help-hover-color);}.scraped-example{position:relative;}.scraped-example .code-wrapper{position:relative;display:flex;flex-direction:row;flex-wrap:wrap;width:100%;}.scraped-example:not(.expanded) .code-wrapper{max-height:calc(1.5em * 5 + 10px);}.scraped-example:not(.expanded) .code-wrapper pre{overflow-y:hidden;padding-bottom:0;max-height:calc(1.5em * 5 + 10px);}.more-scraped-examples .scraped-example:not(.expanded) .code-wrapper,.more-scraped-examples .scraped-example:not(.expanded) .code-wrapper pre{max-height:calc(1.5em * 10 + 10px);}.scraped-example .code-wrapper .next,.scraped-example .code-wrapper .prev,.scraped-example .code-wrapper .expand{color:var(--main-color);position:absolute;top:0.25em;z-index:1;padding:0;background:none;border:none;-webkit-appearance:none;opacity:1;}.scraped-example .code-wrapper .prev{right:2.25em;}.scraped-example .code-wrapper .next{right:1.25em;}.scraped-example .code-wrapper .expand{right:0.25em;}.scraped-example:not(.expanded) .code-wrapper::before,.scraped-example:not(.expanded) .code-wrapper::after{content:" ";width:100%;height:5px;position:absolute;z-index:1;}.scraped-example:not(.expanded) .code-wrapper::before{top:0;background:linear-gradient(to bottom,var(--scrape-example-code-wrapper-background-start),var(--scrape-example-code-wrapper-background-end));}.scraped-example:not(.expanded) .code-wrapper::after{bottom:0;background:linear-gradient(to top,var(--scrape-example-code-wrapper-background-start),var(--scrape-example-code-wrapper-background-end));}.scraped-example .code-wrapper .example-wrap{width:100%;overflow-y:hidden;margin-bottom:0;}.scraped-example:not(.expanded) .code-wrapper .example-wrap{overflow-x:hidden;}.scraped-example .example-wrap .rust span.highlight{background:var(--scrape-example-code-line-highlight);}.scraped-example .example-wrap .rust span.highlight.focus{background:var(--scrape-example-code-line-highlight-focus);}.more-examples-toggle{max-width:calc(100% + 25px);margin-top:10px;margin-left:-25px;}.more-examples-toggle .hide-more{margin-left:25px;cursor:pointer;}.more-scraped-examples{margin-left:25px;position:relative;}.toggle-line{position:absolute;top:5px;bottom:0;right:calc(100% + 10px);padding:0 4px;cursor:pointer;}.toggle-line-inner{min-width:2px;height:100%;background:var(--scrape-example-toggle-line-background);}.toggle-line:hover .toggle-line-inner{background:var(--scrape-example-toggle-line-hover-background);}.more-scraped-examples .scraped-example,.example-links{margin-top:20px;}.more-scraped-examples .scraped-example:first-child{margin-top:5px;}.example-links ul{margin-bottom:0;} \ No newline at end of file diff --git a/docs/static.files/scrape-examples-ef1e698c1d417c0c.js b/docs/static.files/scrape-examples-ef1e698c1d417c0c.js new file mode 100644 index 000000000..ba830e374 --- /dev/null +++ b/docs/static.files/scrape-examples-ef1e698c1d417c0c.js @@ -0,0 +1 @@ +"use strict";(function(){const DEFAULT_MAX_LINES=5;const HIDDEN_MAX_LINES=10;function scrollToLoc(elt,loc,isHidden){const lines=elt.querySelector(".src-line-numbers");let scrollOffset;const maxLines=isHidden?HIDDEN_MAX_LINES:DEFAULT_MAX_LINES;if(loc[1]-loc[0]>maxLines){const line=Math.max(0,loc[0]-1);scrollOffset=lines.children[line].offsetTop}else{const wrapper=elt.querySelector(".code-wrapper");const halfHeight=wrapper.offsetHeight/2;const offsetTop=lines.children[loc[0]].offsetTop;const lastLine=lines.children[loc[1]];const offsetBot=lastLine.offsetTop+lastLine.offsetHeight;const offsetMid=(offsetTop+offsetBot)/2;scrollOffset=offsetMid-halfHeight}lines.scrollTo(0,scrollOffset);elt.querySelector(".rust").scrollTo(0,scrollOffset)}function updateScrapedExample(example,isHidden){const locs=JSON.parse(example.attributes.getNamedItem("data-locs").textContent);let locIndex=0;const highlights=Array.prototype.slice.call(example.querySelectorAll(".highlight"));const link=example.querySelector(".scraped-example-title a");if(locs.length>1){const onChangeLoc=changeIndex=>{removeClass(highlights[locIndex],"focus");changeIndex();scrollToLoc(example,locs[locIndex][0],isHidden);addClass(highlights[locIndex],"focus");const url=locs[locIndex][1];const title=locs[locIndex][2];link.href=url;link.innerHTML=title};example.querySelector(".prev").addEventListener("click",()=>{onChangeLoc(()=>{locIndex=(locIndex-1+locs.length)%locs.length})});example.querySelector(".next").addEventListener("click",()=>{onChangeLoc(()=>{locIndex=(locIndex+1)%locs.length})})}const expandButton=example.querySelector(".expand");if(expandButton){expandButton.addEventListener("click",()=>{if(hasClass(example,"expanded")){removeClass(example,"expanded");scrollToLoc(example,locs[0][0],isHidden)}else{addClass(example,"expanded")}})}scrollToLoc(example,locs[0][0],isHidden)}const firstExamples=document.querySelectorAll(".scraped-example-list > .scraped-example");onEachLazy(firstExamples,el=>updateScrapedExample(el,false));onEachLazy(document.querySelectorAll(".more-examples-toggle"),toggle=>{onEachLazy(toggle.querySelectorAll(".toggle-line, .hide-more"),button=>{button.addEventListener("click",()=>{toggle.open=false})});const moreExamples=toggle.querySelectorAll(".scraped-example");toggle.querySelector("summary").addEventListener("click",()=>{setTimeout(()=>{onEachLazy(moreExamples,el=>updateScrapedExample(el,true))})},{once:true})})})() \ No newline at end of file diff --git a/docs/static.files/search-4926e5fc22a5646a.js b/docs/static.files/search-4926e5fc22a5646a.js new file mode 100644 index 000000000..df0778881 --- /dev/null +++ b/docs/static.files/search-4926e5fc22a5646a.js @@ -0,0 +1 @@ +"use strict";(function(){const itemTypes=["mod","externcrate","import","struct","enum","fn","type","static","trait","impl","tymethod","method","structfield","variant","macro","primitive","associatedtype","constant","associatedconstant","union","foreigntype","keyword","existential","attr","derive","traitalias",];const TY_PRIMITIVE=itemTypes.indexOf("primitive");const TY_KEYWORD=itemTypes.indexOf("keyword");const ROOT_PATH=typeof window!=="undefined"?window.rootPath:"../";function hasOwnPropertyRustdoc(obj,property){return Object.prototype.hasOwnProperty.call(obj,property)}function printTab(nb){let iter=0;let foundCurrentTab=false;let foundCurrentResultSet=false;onEachLazy(document.getElementById("search-tabs").childNodes,elem=>{if(nb===iter){addClass(elem,"selected");foundCurrentTab=true}else{removeClass(elem,"selected")}iter+=1});const isTypeSearch=(nb>0||iter===1);iter=0;onEachLazy(document.getElementById("results").childNodes,elem=>{if(nb===iter){addClass(elem,"active");foundCurrentResultSet=true}else{removeClass(elem,"active")}iter+=1});if(foundCurrentTab&&foundCurrentResultSet){searchState.currentTab=nb;const correctionsElem=document.getElementsByClassName("search-corrections");if(isTypeSearch){removeClass(correctionsElem[0],"hidden")}else{addClass(correctionsElem[0],"hidden")}}else if(nb!==0){printTab(0)}}const editDistanceState={current:[],prev:[],prevPrev:[],calculate:function calculate(a,b,limit){if(a.lengthlimit){return limit+1}while(b.length>0&&b[0]===a[0]){a=a.substring(1);b=b.substring(1)}while(b.length>0&&b[b.length-1]===a[a.length-1]){a=a.substring(0,a.length-1);b=b.substring(0,b.length-1)}if(b.length===0){return minDist}const aLength=a.length;const bLength=b.length;for(let i=0;i<=bLength;++i){this.current[i]=0;this.prev[i]=i;this.prevPrev[i]=Number.MAX_VALUE}for(let i=1;i<=aLength;++i){this.current[0]=i;const aIdx=i-1;for(let j=1;j<=bLength;++j){const bIdx=j-1;const substitutionCost=a[aIdx]===b[bIdx]?0:1;this.current[j]=Math.min(this.prev[j]+1,this.current[j-1]+1,this.prev[j-1]+substitutionCost);if((i>1)&&(j>1)&&(a[aIdx]===b[bIdx-1])&&(a[aIdx-1]===b[bIdx])){this.current[j]=Math.min(this.current[j],this.prevPrev[j-2]+1)}}const prevPrevTmp=this.prevPrev;this.prevPrev=this.prev;this.prev=this.current;this.current=prevPrevTmp}const distance=this.prev[bLength];return distance<=limit?distance:(limit+1)},};function editDistance(a,b,limit){return editDistanceState.calculate(a,b,limit)}function initSearch(rawSearchIndex){const MAX_RESULTS=200;const NO_TYPE_FILTER=-1;let searchIndex;let currentResults;let typeNameIdMap;const ALIASES=new Map();function isWhitespace(c){return" \t\n\r".indexOf(c)!==-1}function isSpecialStartCharacter(c){return"<\"".indexOf(c)!==-1}function isEndCharacter(c){return",>-".indexOf(c)!==-1}function isStopCharacter(c){return isWhitespace(c)||isEndCharacter(c)}function isErrorCharacter(c){return"()".indexOf(c)!==-1}function itemTypeFromName(typename){const index=itemTypes.findIndex(i=>i===typename);if(index<0){throw["Unknown type filter ",typename]}return index}function getStringElem(query,parserState,isInGenerics){if(isInGenerics){throw["Unexpected ","\""," in generics"]}else if(query.literalSearch){throw["Cannot have more than one literal search element"]}else if(parserState.totalElems-parserState.genericsElems>0){throw["Cannot use literal search when there is more than one element"]}parserState.pos+=1;const start=parserState.pos;const end=getIdentEndPosition(parserState);if(parserState.pos>=parserState.length){throw["Unclosed ","\""]}else if(parserState.userQuery[end]!=="\""){throw["Unexpected ",parserState.userQuery[end]," in a string element"]}else if(start===end){throw["Cannot have empty string element"]}parserState.pos+=1;query.literalSearch=true}function isPathStart(parserState){return parserState.userQuery.slice(parserState.pos,parserState.pos+2)==="::"}function isReturnArrow(parserState){return parserState.userQuery.slice(parserState.pos,parserState.pos+2)==="->"}function isIdentCharacter(c){return(c==="_"||(c>="0"&&c<="9")||(c>="a"&&c<="z")||(c>="A"&&c<="Z"))}function isSeparatorCharacter(c){return c===","||isWhitespaceCharacter(c)}function isWhitespaceCharacter(c){return c===" "||c==="\t"}function createQueryElement(query,parserState,name,generics,isInGenerics){if(name==="*"||(name.length===0&&generics.length===0)){return}if(query.literalSearch&&parserState.totalElems-parserState.genericsElems>0){throw["You cannot have more than one element if you use quotes"]}const pathSegments=name.split("::");if(pathSegments.length>1){for(let i=0,len=pathSegments.length;i=end){throw["Found generics without a path"]}parserState.pos+=1;getItemsBefore(query,parserState,generics,">")}if(start>=end&&generics.length===0){return}elems.push(createQueryElement(query,parserState,parserState.userQuery.slice(start,end),generics,isInGenerics))}function getItemsBefore(query,parserState,elems,endChar){let foundStopChar=true;let start=parserState.pos;const oldTypeFilter=parserState.typeFilter;parserState.typeFilter=null;while(parserState.pos"){extra="<"}else if(endChar===""){extra="->"}else{extra=endChar}throw["Unexpected ",c," after ",extra]}if(!foundStopChar){if(endChar!==""){throw["Expected ",",",", "," "," or ",endChar,", found ",c,]}throw["Expected ",","," or "," ",", found ",c,]}const posBefore=parserState.pos;start=parserState.pos;getNextElem(query,parserState,elems,endChar===">");if(endChar!==""&&parserState.pos>=parserState.length){throw["Unclosed ","<"]}if(posBefore===parserState.pos){parserState.pos+=1}foundStopChar=false}if(parserState.pos>=parserState.length&&endChar!==""){throw["Unclosed ","<"]}parserState.pos+=1;parserState.typeFilter=oldTypeFilter}function checkExtraTypeFilterCharacters(start,parserState){const query=parserState.userQuery;for(let pos=start;pos"){if(isReturnArrow(parserState)){break}throw["Unexpected ",c," (did you mean ","->","?)"]}throw["Unexpected ",c]}else if(c===":"&&!isPathStart(parserState)){if(parserState.typeFilter!==null){throw["Unexpected ",":"]}if(query.elems.length===0){throw["Expected type filter before ",":"]}else if(query.literalSearch){throw["You cannot use quotes on type filter"]}const typeFilterElem=query.elems.pop();checkExtraTypeFilterCharacters(start,parserState);parserState.typeFilter=typeFilterElem.name;parserState.pos+=1;parserState.totalElems-=1;query.literalSearch=false;foundStopChar=true;continue}if(!foundStopChar){if(parserState.typeFilter!==null){throw["Expected ",",",", "," "," or ","->",", found ",c,]}throw["Expected ",",",", "," ",", ",":"," or ","->",", found ",c,]}const before=query.elems.length;start=parserState.pos;getNextElem(query,parserState,query.elems,false);if(query.elems.length===before){parserState.pos+=1}foundStopChar=false}if(parserState.typeFilter!==null){throw["Unexpected ",":"," (expected path after type filter)"]}while(parserState.pos"]}break}else{parserState.pos+=1}}}function newParsedQuery(userQuery){return{original:userQuery,userQuery:userQuery.toLowerCase(),elems:[],returned:[],foundElems:0,literalSearch:false,error:null,correction:null,}}function buildUrl(search,filterCrates){let extra="?search="+encodeURIComponent(search);if(filterCrates!==null){extra+="&filter-crate="+encodeURIComponent(filterCrates)}return getNakedUrl()+extra+window.location.hash}function getFilterCrates(){const elem=document.getElementById("crate-search");if(elem&&elem.value!=="all crates"&&hasOwnPropertyRustdoc(rawSearchIndex,elem.value)){return elem.value}return null}function parseQuery(userQuery){function convertTypeFilterOnElem(elem){if(elem.typeFilter!==null){let typeFilter=elem.typeFilter;if(typeFilter==="const"){typeFilter="constant"}elem.typeFilter=itemTypeFromName(typeFilter)}else{elem.typeFilter=NO_TYPE_FILTER}for(const elem2 of elem.generics){convertTypeFilterOnElem(elem2)}}userQuery=userQuery.trim();const parserState={length:userQuery.length,pos:0,totalElems:0,genericsElems:0,typeFilter:null,userQuery:userQuery.toLowerCase(),};let query=newParsedQuery(userQuery);try{parseInput(query,parserState);for(const elem of query.elems){convertTypeFilterOnElem(elem)}for(const elem of query.returned){convertTypeFilterOnElem(elem)}}catch(err){query=newParsedQuery(userQuery);query.error=err;return query}if(!query.literalSearch){query.literalSearch=parserState.totalElems>1}query.foundElems=query.elems.length+query.returned.length;return query}function createQueryResults(results_in_args,results_returned,results_others,parsedQuery){return{"in_args":results_in_args,"returned":results_returned,"others":results_others,"query":parsedQuery,}}function execQuery(parsedQuery,searchWords,filterCrates,currentCrate){const results_others=new Map(),results_in_args=new Map(),results_returned=new Map();function transformResults(results){const duplicates=new Set();const out=[];for(const result of results){if(result.id>-1){const obj=searchIndex[result.id];obj.dist=result.dist;const res=buildHrefAndPath(obj);obj.displayPath=pathSplitter(res[0]);obj.fullPath=obj.displayPath+obj.name;obj.fullPath+="|"+obj.ty;if(duplicates.has(obj.fullPath)){continue}duplicates.add(obj.fullPath);obj.href=res[1];out.push(obj);if(out.length>=MAX_RESULTS){break}}}return out}function sortResults(results,isType,preferredCrate){if(results.size===0){return[]}const userQuery=parsedQuery.userQuery;const result_list=[];for(const result of results.values()){result.word=searchWords[result.id];result.item=searchIndex[result.id]||{};result_list.push(result)}result_list.sort((aaa,bbb)=>{let a,b;a=(aaa.word!==userQuery);b=(bbb.word!==userQuery);if(a!==b){return a-b}a=(aaa.index<0);b=(bbb.index<0);if(a!==b){return a-b}a=aaa.path_dist;b=bbb.path_dist;if(a!==b){return a-b}a=aaa.index;b=bbb.index;if(a!==b){return a-b}a=(aaa.dist);b=(bbb.dist);if(a!==b){return a-b}a=aaa.item.deprecated;b=bbb.item.deprecated;if(a!==b){return a-b}a=(aaa.item.crate!==preferredCrate);b=(bbb.item.crate!==preferredCrate);if(a!==b){return a-b}a=aaa.word.length;b=bbb.word.length;if(a!==b){return a-b}a=aaa.word;b=bbb.word;if(a!==b){return(a>b?+1:-1)}if((aaa.item.ty===TY_PRIMITIVE&&bbb.item.ty!==TY_KEYWORD)||(aaa.item.ty===TY_KEYWORD&&bbb.item.ty!==TY_PRIMITIVE)){return-1}if((bbb.item.ty===TY_PRIMITIVE&&aaa.item.ty!==TY_PRIMITIVE)||(bbb.item.ty===TY_KEYWORD&&aaa.item.ty!==TY_KEYWORD)){return 1}a=(aaa.item.desc==="");b=(bbb.item.desc==="");if(a!==b){return a-b}a=aaa.item.ty;b=bbb.item.ty;if(a!==b){return a-b}a=aaa.item.path;b=bbb.item.path;if(a!==b){return(a>b?+1:-1)}return 0});let nameSplit=null;if(parsedQuery.elems.length===1){const hasPath=typeof parsedQuery.elems[0].path==="undefined";nameSplit=hasPath?null:parsedQuery.elems[0].path}for(const result of result_list){if(result.dontValidate){continue}const name=result.item.name.toLowerCase(),path=result.item.path.toLowerCase(),parent=result.item.parent;if(!isType&&!validateResult(name,path,nameSplit,parent)){result.id=-1}}return transformResults(result_list)}function checkGenerics(row,elem){if(row.generics.length===0||elem.generics.length===0){return false}if(elem.generics.length>0&&row.generics.length>=elem.generics.length){const elems=new Map();const addEntryToElems=function addEntryToElems(entry){if(entry.id===-1){for(const inner_entry of entry.generics){addEntryToElems(inner_entry)}return}let currentEntryElems;if(elems.has(entry.id)){currentEntryElems=elems.get(entry.id)}else{currentEntryElems=[];elems.set(entry.id,currentEntryElems)}currentEntryElems.push(entry)};for(const entry of row.generics){addEntryToElems(entry)}const handleGeneric=generic=>{if(!elems.has(generic.id)){return false}const matchElems=elems.get(generic.id);const matchIdx=matchElems.findIndex(tmp_elem=>{if(generic.generics.length>0&&!checkGenerics(tmp_elem,generic)){return false}return typePassesFilter(generic.typeFilter,tmp_elem.ty)});if(matchIdx===-1){return false}matchElems.splice(matchIdx,1);if(matchElems.length===0){elems.delete(generic.id)}return true};for(const generic of elem.generics){if(generic.typeFilter!==-1&&!handleGeneric(generic)){return false}}for(const generic of elem.generics){if(generic.typeFilter===-1&&!handleGeneric(generic)){return false}}return true}return false}function checkIfInGenerics(row,elem){for(const entry of row.generics){if(checkType(entry,elem)){return true}}return false}function checkType(row,elem){if(row.id===-1){return row.generics.length>0?checkIfInGenerics(row,elem):false}if(row.id===elem.id&&typePassesFilter(elem.typeFilter,row.ty)){if(elem.generics.length>0){return checkGenerics(row,elem)}return true}return checkIfInGenerics(row,elem)}function findArg(row,elem,skipPositions){if(row&&row.type&&row.type.inputs&&row.type.inputs.length>0){let i=0;for(const input of row.type.inputs){if(skipPositions.indexOf(i)!==-1){i+=1;continue}if(checkType(input,elem)){return i}i+=1}}return-1}function checkReturned(row,elem,skipPositions){if(row&&row.type&&row.type.output.length>0){let i=0;for(const ret_ty of row.type.output){if(skipPositions.indexOf(i)!==-1){i+=1;continue}if(checkType(ret_ty,elem)){return i}i+=1}}return-1}function checkPath(contains,ty,maxEditDistance){if(contains.length===0){return 0}let ret_dist=maxEditDistance+1;const path=ty.path.split("::");if(ty.parent&&ty.parent.name){path.push(ty.parent.name.toLowerCase())}const length=path.length;const clength=contains.length;if(clength>length){return maxEditDistance+1}for(let i=0;ilength){break}let dist_total=0;let aborted=false;for(let x=0;xmaxEditDistance){aborted=true;break}dist_total+=dist}if(!aborted){ret_dist=Math.min(ret_dist,Math.round(dist_total/clength))}}return ret_dist}function typePassesFilter(filter,type){if(filter<=NO_TYPE_FILTER||filter===type)return true;const name=itemTypes[type];switch(itemTypes[filter]){case"constant":return name==="associatedconstant";case"fn":return name==="method"||name==="tymethod";case"type":return name==="primitive"||name==="associatedtype";case"trait":return name==="traitalias"}return false}function createAliasFromItem(item){return{crate:item.crate,name:item.name,path:item.path,desc:item.desc,ty:item.ty,parent:item.parent,type:item.type,is_alias:true,deprecated:item.deprecated,}}function handleAliases(ret,query,filterCrates,currentCrate){const lowerQuery=query.toLowerCase();const aliases=[];const crateAliases=[];if(filterCrates!==null){if(ALIASES.has(filterCrates)&&ALIASES.get(filterCrates).has(lowerQuery)){const query_aliases=ALIASES.get(filterCrates).get(lowerQuery);for(const alias of query_aliases){aliases.push(createAliasFromItem(searchIndex[alias]))}}}else{for(const[crate,crateAliasesIndex]of ALIASES){if(crateAliasesIndex.has(lowerQuery)){const pushTo=crate===currentCrate?crateAliases:aliases;const query_aliases=crateAliasesIndex.get(lowerQuery);for(const alias of query_aliases){pushTo.push(createAliasFromItem(searchIndex[alias]))}}}}const sortFunc=(aaa,bbb)=>{if(aaa.path{alias.alias=query;const res=buildHrefAndPath(alias);alias.displayPath=pathSplitter(res[0]);alias.fullPath=alias.displayPath+alias.name;alias.href=res[1];ret.others.unshift(alias);if(ret.others.length>MAX_RESULTS){ret.others.pop()}};aliases.forEach(pushFunc);crateAliases.forEach(pushFunc)}function addIntoResults(results,fullId,id,index,dist,path_dist,maxEditDistance){const inBounds=dist<=maxEditDistance||index!==-1;if(dist===0||(!parsedQuery.literalSearch&&inBounds)){if(results.has(fullId)){const result=results.get(fullId);if(result.dontValidate||result.dist<=dist){return}}results.set(fullId,{id:id,index:index,dontValidate:parsedQuery.literalSearch,dist:dist,path_dist:path_dist,})}}function handleSingleArg(row,pos,elem,results_others,results_in_args,results_returned,maxEditDistance){if(!row||(filterCrates!==null&&row.crate!==filterCrates)){return}let index=-1,path_dist=0;const fullId=row.id;const searchWord=searchWords[pos];const in_args=findArg(row,elem,[]);if(in_args!==-1){addIntoResults(results_in_args,fullId,pos,-1,0,0,maxEditDistance)}const returned=checkReturned(row,elem,[]);if(returned!==-1){addIntoResults(results_returned,fullId,pos,-1,0,0,maxEditDistance)}if(!typePassesFilter(elem.typeFilter,row.ty)){return}const row_index=row.normalizedName.indexOf(elem.pathLast);const word_index=searchWord.indexOf(elem.pathLast);if(row_index===-1){index=word_index}else if(word_index===-1){index=row_index}else if(word_index1){path_dist=checkPath(elem.pathWithoutLast,row,maxEditDistance);if(path_dist>maxEditDistance){return}}if(parsedQuery.literalSearch){if(searchWord===elem.name){addIntoResults(results_others,fullId,pos,index,0,path_dist)}return}const dist=editDistance(searchWord,elem.pathLast,maxEditDistance);if(index===-1&&dist+path_dist>maxEditDistance){return}addIntoResults(results_others,fullId,pos,index,dist,path_dist,maxEditDistance)}function handleArgs(row,pos,results){if(!row||(filterCrates!==null&&row.crate!==filterCrates)){return}function checkArgs(elems,callback){const skipPositions=[];for(const elem of elems){const position=callback(row,elem,skipPositions);if(position!==-1){skipPositions.push(position)}else{return false}}return true}if(!checkArgs(parsedQuery.elems,findArg)){return}if(!checkArgs(parsedQuery.returned,checkReturned)){return}addIntoResults(results,row.id,pos,0,0,0,Number.MAX_VALUE)}function innerRunQuery(){let elem,i,nSearchWords,in_returned,row;let queryLen=0;for(const elem of parsedQuery.elems){queryLen+=elem.name.length}for(const elem of parsedQuery.returned){queryLen+=elem.name.length}const maxEditDistance=Math.floor(queryLen/3);function convertNameToId(elem){if(typeNameIdMap.has(elem.name)){elem.id=typeNameIdMap.get(elem.name)}else if(!parsedQuery.literalSearch){let match=-1;let matchDist=maxEditDistance+1;let matchName="";for(const[name,id]of typeNameIdMap){const dist=editDistance(name,elem.name,maxEditDistance);if(dist<=matchDist&&dist<=maxEditDistance){if(dist===matchDist&&matchName>name){continue}match=id;matchDist=dist;matchName=name}}if(match!==-1){parsedQuery.correction=matchName}elem.id=match}for(const elem2 of elem.generics){convertNameToId(elem2)}}for(const elem of parsedQuery.elems){convertNameToId(elem)}for(const elem of parsedQuery.returned){convertNameToId(elem)}if(parsedQuery.foundElems===1){if(parsedQuery.elems.length===1){elem=parsedQuery.elems[0];for(i=0,nSearchWords=searchWords.length;i0){for(i=0,nSearchWords=searchWords.length;i-1||path.indexOf(key)>-1||(parent!==undefined&&parent.name!==undefined&&parent.name.toLowerCase().indexOf(key)>-1)||editDistance(name,key,maxEditDistance)<=maxEditDistance)){return false}}return true}function nextTab(direction){const next=(searchState.currentTab+direction+3)%searchState.focusedByTab.length;searchState.focusedByTab[searchState.currentTab]=document.activeElement;printTab(next);focusSearchResult()}function focusSearchResult(){const target=searchState.focusedByTab[searchState.currentTab]||document.querySelectorAll(".search-results.active a").item(0)||document.querySelectorAll("#search-tabs button").item(searchState.currentTab);searchState.focusedByTab[searchState.currentTab]=null;if(target){target.focus()}}function buildHrefAndPath(item){let displayPath;let href;const type=itemTypes[item.ty];const name=item.name;let path=item.path;if(type==="mod"){displayPath=path+"::";href=ROOT_PATH+path.replace(/::/g,"/")+"/"+name+"/index.html"}else if(type==="import"){displayPath=item.path+"::";href=ROOT_PATH+item.path.replace(/::/g,"/")+"/index.html#reexport."+name}else if(type==="primitive"||type==="keyword"){displayPath="";href=ROOT_PATH+path.replace(/::/g,"/")+"/"+type+"."+name+".html"}else if(type==="externcrate"){displayPath="";href=ROOT_PATH+name+"/index.html"}else if(item.parent!==undefined){const myparent=item.parent;let anchor="#"+type+"."+name;const parentType=itemTypes[myparent.ty];let pageType=parentType;let pageName=myparent.name;if(parentType==="primitive"){displayPath=myparent.name+"::"}else if(type==="structfield"&&parentType==="variant"){const enumNameIdx=item.path.lastIndexOf("::");const enumName=item.path.substr(enumNameIdx+2);path=item.path.substr(0,enumNameIdx);displayPath=path+"::"+enumName+"::"+myparent.name+"::";anchor="#variant."+myparent.name+".field."+name;pageType="enum";pageName=enumName}else{displayPath=path+"::"+myparent.name+"::"}href=ROOT_PATH+path.replace(/::/g,"/")+"/"+pageType+"."+pageName+".html"+anchor}else{displayPath=item.path+"::";href=ROOT_PATH+item.path.replace(/::/g,"/")+"/"+type+"."+name+".html"}return[displayPath,href]}function pathSplitter(path){const tmp=""+path.replace(/::/g,"::");if(tmp.endsWith("")){return tmp.slice(0,tmp.length-6)}return tmp}function addTab(array,query,display){let extraClass="";if(display===true){extraClass=" active"}const output=document.createElement("div");let length=0;if(array.length>0){output.className="search-results "+extraClass;array.forEach(item=>{const name=item.name;const type=itemTypes[item.ty];length+=1;let extra="";if(type==="primitive"){extra=" (primitive type)"}else if(type==="keyword"){extra=" (keyword)"}const link=document.createElement("a");link.className="result-"+type;link.href=item.href;const resultName=document.createElement("div");resultName.className="result-name";if(item.is_alias){const alias=document.createElement("span");alias.className="alias";const bold=document.createElement("b");bold.innerText=item.alias;alias.appendChild(bold);alias.insertAdjacentHTML("beforeend"," - see ");resultName.appendChild(alias)}resultName.insertAdjacentHTML("beforeend",item.displayPath+""+name+extra+"");link.appendChild(resultName);const description=document.createElement("div");description.className="desc";description.insertAdjacentHTML("beforeend",item.desc);link.appendChild(description);output.appendChild(link)})}else if(query.error===null){output.className="search-failed"+extraClass;output.innerHTML="No results :(
"+"Try on DuckDuckGo?

"+"Or try looking in one of these:"}return[output,length]}function makeTabHeader(tabNb,text,nbElems){if(searchState.currentTab===tabNb){return""}return""}function showResults(results,go_to_first,filterCrates){const search=searchState.outputElement();if(go_to_first||(results.others.length===1&&getSettingValue("go-to-only-result")==="true")){const elem=document.createElement("a");elem.href=results.others[0].href;removeClass(elem,"active");document.body.appendChild(elem);elem.click();return}if(results.query===undefined){results.query=parseQuery(searchState.input.value)}currentResults=results.query.userQuery;const ret_others=addTab(results.others,results.query,true);const ret_in_args=addTab(results.in_args,results.query,false);const ret_returned=addTab(results.returned,results.query,false);let currentTab=searchState.currentTab;if((currentTab===0&&ret_others[1]===0)||(currentTab===1&&ret_in_args[1]===0)||(currentTab===2&&ret_returned[1]===0)){if(ret_others[1]!==0){currentTab=0}else if(ret_in_args[1]!==0){currentTab=1}else if(ret_returned[1]!==0){currentTab=2}}let crates="";const crates_list=Object.keys(rawSearchIndex);if(crates_list.length>1){crates=" in 
"}let output=`

Results${crates}

`;if(results.query.error!==null){const error=results.query.error;error.forEach((value,index)=>{value=value.split("<").join("<").split(">").join(">");if(index%2!==0){error[index]=`${value}`}else{error[index]=value}});output+=`

Query parser error: "${error.join("")}".

`;output+="
"+makeTabHeader(0,"In Names",ret_others[1])+"
";currentTab=0}else if(results.query.foundElems<=1&&results.query.returned.length===0){output+="
"+makeTabHeader(0,"In Names",ret_others[1])+makeTabHeader(1,"In Parameters",ret_in_args[1])+makeTabHeader(2,"In Return Types",ret_returned[1])+"
"}else{const signatureTabTitle=results.query.elems.length===0?"In Function Return Types":results.query.returned.length===0?"In Function Parameters":"In Function Signatures";output+="
"+makeTabHeader(0,signatureTabTitle,ret_others[1])+"
";currentTab=0}if(results.query.correction!==null){const orig=results.query.returned.length>0?results.query.returned[0].name:results.query.elems[0].name;output+="

"+`Type "${orig}" not found. `+"Showing results for closest type name "+`"${results.query.correction}" instead.

`}const resultsElem=document.createElement("div");resultsElem.id="results";resultsElem.appendChild(ret_others[0]);resultsElem.appendChild(ret_in_args[0]);resultsElem.appendChild(ret_returned[0]);search.innerHTML=output;const crateSearch=document.getElementById("crate-search");if(crateSearch){crateSearch.addEventListener("input",updateCrate)}search.appendChild(resultsElem);searchState.showResults(search);const elems=document.getElementById("search-tabs").childNodes;searchState.focusedByTab=[];let i=0;for(const elem of elems){const j=i;elem.onclick=()=>printTab(j);searchState.focusedByTab.push(null);i+=1}printTab(currentTab)}function search(e,forced){if(e){e.preventDefault()}const query=parseQuery(searchState.input.value.trim());let filterCrates=getFilterCrates();if(!forced&&query.userQuery===currentResults){if(query.userQuery.length>0){putBackSearch()}return}searchState.setLoadingSearch();const params=searchState.getQueryStringParams();if(filterCrates===null&¶ms["filter-crate"]!==undefined){filterCrates=params["filter-crate"]}searchState.title="Results for "+query.original+" - Rust";if(browserSupportsHistoryApi()){const newURL=buildUrl(query.original,filterCrates);if(!history.state&&!params.search){history.pushState(null,"",newURL)}else{history.replaceState(null,"",newURL)}}showResults(execQuery(query,searchWords,filterCrates,window.currentCrate),params.go_to_first,filterCrates)}function buildTypeMapIndex(typeNameIdMap,name){if(name===""||name===null){return-1}if(typeNameIdMap.has(name)){return typeNameIdMap.get(name)}else{const id=typeNameIdMap.size;typeNameIdMap.set(name,id);return id}}function buildItemSearchTypeAll(types,lowercasePaths,typeNameIdMap){const PATH_INDEX_DATA=0;const GENERICS_DATA=1;return types.map(type=>{let pathIndex,generics;if(typeof type==="number"){pathIndex=type;generics=[]}else{pathIndex=type[PATH_INDEX_DATA];generics=buildItemSearchTypeAll(type[GENERICS_DATA],lowercasePaths,typeNameIdMap)}return{id:pathIndex===0?-1:buildTypeMapIndex(typeNameIdMap,lowercasePaths[pathIndex-1].name),ty:pathIndex===0?null:lowercasePaths[pathIndex-1].ty,generics:generics,}})}function buildFunctionSearchType(functionSearchType,lowercasePaths,typeNameIdMap){const INPUTS_DATA=0;const OUTPUT_DATA=1;if(functionSearchType===0){return null}let inputs,output;if(typeof functionSearchType[INPUTS_DATA]==="number"){const pathIndex=functionSearchType[INPUTS_DATA];inputs=[{id:pathIndex===0?-1:buildTypeMapIndex(typeNameIdMap,lowercasePaths[pathIndex-1].name),ty:pathIndex===0?null:lowercasePaths[pathIndex-1].ty,generics:[],}]}else{inputs=buildItemSearchTypeAll(functionSearchType[INPUTS_DATA],lowercasePaths,typeNameIdMap)}if(functionSearchType.length>1){if(typeof functionSearchType[OUTPUT_DATA]==="number"){const pathIndex=functionSearchType[OUTPUT_DATA];output=[{id:pathIndex===0?-1:buildTypeMapIndex(typeNameIdMap,lowercasePaths[pathIndex-1].name),ty:pathIndex===0?null:lowercasePaths[pathIndex-1].ty,generics:[],}]}else{output=buildItemSearchTypeAll(functionSearchType[OUTPUT_DATA],lowercasePaths,typeNameIdMap)}}else{output=[]}return{inputs,output,}}function buildIndex(rawSearchIndex){searchIndex=[];const searchWords=[];typeNameIdMap=new Map();const charA="A".charCodeAt(0);let currentIndex=0;let id=0;for(const crate in rawSearchIndex){if(!hasOwnPropertyRustdoc(rawSearchIndex,crate)){continue}let crateSize=0;const crateCorpus=rawSearchIndex[crate];searchWords.push(crate);const crateRow={crate:crate,ty:1,name:crate,path:"",desc:crateCorpus.doc,parent:undefined,type:null,id:id,normalizedName:crate.indexOf("_")===-1?crate:crate.replace(/_/g,""),deprecated:null,};id+=1;searchIndex.push(crateRow);currentIndex+=1;const itemTypes=crateCorpus.t;const itemNames=crateCorpus.n;const itemPaths=new Map(crateCorpus.q);const itemDescs=crateCorpus.d;const itemParentIdxs=crateCorpus.i;const itemFunctionSearchTypes=crateCorpus.f;const deprecatedItems=new Set(crateCorpus.c);const paths=crateCorpus.p;const aliases=crateCorpus.a;const lowercasePaths=[];let len=paths.length;for(let i=0;i0?paths[itemParentIdxs[i]-1]:undefined,type:buildFunctionSearchType(itemFunctionSearchTypes[i],lowercasePaths,typeNameIdMap),id:id,normalizedName:word.indexOf("_")===-1?word:word.replace(/_/g,""),deprecated:deprecatedItems.has(i),};id+=1;searchIndex.push(row);lastPath=row.path;crateSize+=1}if(aliases){const currentCrateAliases=new Map();ALIASES.set(crate,currentCrateAliases);for(const alias_name in aliases){if(!hasOwnPropertyRustdoc(aliases,alias_name)){continue}let currentNameAliases;if(currentCrateAliases.has(alias_name)){currentNameAliases=currentCrateAliases.get(alias_name)}else{currentNameAliases=[];currentCrateAliases.set(alias_name,currentNameAliases)}for(const local_alias of aliases[alias_name]){currentNameAliases.push(local_alias+currentIndex)}}}currentIndex+=crateSize}return searchWords}function onSearchSubmit(e){e.preventDefault();searchState.clearInputTimeout();search()}function putBackSearch(){const search_input=searchState.input;if(!searchState.input){return}if(search_input.value!==""&&!searchState.isDisplayed()){searchState.showResults();if(browserSupportsHistoryApi()){history.replaceState(null,"",buildUrl(search_input.value,getFilterCrates()))}document.title=searchState.title}}function registerSearchEvents(){const params=searchState.getQueryStringParams();if(searchState.input.value===""){searchState.input.value=params.search||""}const searchAfter500ms=()=>{searchState.clearInputTimeout();if(searchState.input.value.length===0){searchState.hideResults()}else{searchState.timeout=setTimeout(search,500)}};searchState.input.onkeyup=searchAfter500ms;searchState.input.oninput=searchAfter500ms;document.getElementsByClassName("search-form")[0].onsubmit=onSearchSubmit;searchState.input.onchange=e=>{if(e.target!==document.activeElement){return}searchState.clearInputTimeout();setTimeout(search,0)};searchState.input.onpaste=searchState.input.onchange;searchState.outputElement().addEventListener("keydown",e=>{if(e.altKey||e.ctrlKey||e.shiftKey||e.metaKey){return}if(e.which===38){const previous=document.activeElement.previousElementSibling;if(previous){previous.focus()}else{searchState.focus()}e.preventDefault()}else if(e.which===40){const next=document.activeElement.nextElementSibling;if(next){next.focus()}const rect=document.activeElement.getBoundingClientRect();if(window.innerHeight-rect.bottom{if(e.which===40){focusSearchResult();e.preventDefault()}});searchState.input.addEventListener("focus",()=>{putBackSearch()});searchState.input.addEventListener("blur",()=>{searchState.input.placeholder=searchState.input.origPlaceholder});if(browserSupportsHistoryApi()){const previousTitle=document.title;window.addEventListener("popstate",e=>{const params=searchState.getQueryStringParams();document.title=previousTitle;currentResults=null;if(params.search&¶ms.search.length>0){searchState.input.value=params.search;search(e)}else{searchState.input.value="";searchState.hideResults()}})}window.onpageshow=()=>{const qSearch=searchState.getQueryStringParams().search;if(searchState.input.value===""&&qSearch){searchState.input.value=qSearch}search()}}function updateCrate(ev){if(ev.target.value==="all crates"){const params=searchState.getQueryStringParams();const query=searchState.input.value.trim();if(!history.state&&!params.search){history.pushState(null,"",buildUrl(query,null))}else{history.replaceState(null,"",buildUrl(query,null))}}currentResults=null;search(undefined,true)}const searchWords=buildIndex(rawSearchIndex);if(typeof window!=="undefined"){registerSearchEvents();if(window.searchState.getQueryStringParams().search){search()}}if(typeof exports!=="undefined"){exports.initSearch=initSearch;exports.execQuery=execQuery;exports.parseQuery=parseQuery}return searchWords}if(typeof window!=="undefined"){window.initSearch=initSearch;if(window.searchIndex!==undefined){initSearch(window.searchIndex)}}else{initSearch({})}})() \ No newline at end of file diff --git a/docs/static.files/settings-8c76f75bfb6bd192.css b/docs/static.files/settings-8c76f75bfb6bd192.css new file mode 100644 index 000000000..5241bb861 --- /dev/null +++ b/docs/static.files/settings-8c76f75bfb6bd192.css @@ -0,0 +1,3 @@ +.setting-line{margin:1.2em 0.6em;}.setting-radio input,.setting-check input{margin-right:0.3em;height:1.2rem;width:1.2rem;border:2px solid var(--settings-input-border-color);outline:none;-webkit-appearance:none;cursor:pointer;}.setting-radio input{border-radius:50%;}.setting-radio span,.setting-check span{padding-bottom:1px;}.setting-radio{margin-top:0.1em;margin-bottom:0.1em;min-width:3.8em;padding:0.3em;display:inline-flex;align-items:center;cursor:pointer;}.setting-radio+.setting-radio{margin-left:0.5em;}.setting-check{margin-right:20px;display:flex;align-items:center;cursor:pointer;}.setting-radio input:checked{box-shadow:inset 0 0 0 3px var(--main-background-color);background-color:var(--settings-input-color);}.setting-check input:checked{background-color:var(--settings-input-color);border-width:1px;content:url('data:image/svg+xml,\ + \ + ');}.setting-radio input:focus,.setting-check input:focus{box-shadow:0 0 1px 1px var(--settings-input-color);}.setting-radio input:checked:focus{box-shadow:inset 0 0 0 3px var(--main-background-color),0 0 2px 2px var(--settings-input-color);}.setting-radio input:hover,.setting-check input:hover{border-color:var(--settings-input-color) !important;} \ No newline at end of file diff --git a/docs/static.files/settings-de11bff964e9d4e5.js b/docs/static.files/settings-de11bff964e9d4e5.js new file mode 100644 index 000000000..cc508a861 --- /dev/null +++ b/docs/static.files/settings-de11bff964e9d4e5.js @@ -0,0 +1,17 @@ +"use strict";(function(){const isSettingsPage=window.location.pathname.endsWith("/settings.html");function changeSetting(settingName,value){if(settingName==="theme"){const useSystem=value==="system preference"?"true":"false";updateLocalStorage("use-system-theme",useSystem)}updateLocalStorage(settingName,value);switch(settingName){case"theme":case"preferred-dark-theme":case"preferred-light-theme":updateTheme();updateLightAndDark();break;case"line-numbers":if(value===true){window.rustdoc_add_line_numbers_to_examples()}else{window.rustdoc_remove_line_numbers_from_examples()}break}}function showLightAndDark(){removeClass(document.getElementById("preferred-light-theme"),"hidden");removeClass(document.getElementById("preferred-dark-theme"),"hidden")}function hideLightAndDark(){addClass(document.getElementById("preferred-light-theme"),"hidden");addClass(document.getElementById("preferred-dark-theme"),"hidden")}function updateLightAndDark(){const useSystem=getSettingValue("use-system-theme");if(useSystem==="true"||(useSystem===null&&getSettingValue("theme")===null)){showLightAndDark()}else{hideLightAndDark()}}function setEvents(settingsElement){updateLightAndDark();onEachLazy(settingsElement.querySelectorAll("input[type=\"checkbox\"]"),toggle=>{const settingId=toggle.id;const settingValue=getSettingValue(settingId);if(settingValue!==null){toggle.checked=settingValue==="true"}toggle.onchange=function(){changeSetting(this.id,this.checked)}});onEachLazy(settingsElement.querySelectorAll("input[type=\"radio\"]"),elem=>{const settingId=elem.name;let settingValue=getSettingValue(settingId);if(settingId==="theme"){const useSystem=getSettingValue("use-system-theme");if(useSystem==="true"||settingValue===null){settingValue=useSystem==="false"?"light":"system preference"}}if(settingValue!==null&&settingValue!=="null"){elem.checked=settingValue===elem.value}elem.addEventListener("change",ev=>{changeSetting(ev.target.name,ev.target.value)})})}function buildSettingsPageSections(settings){let output="";for(const setting of settings){const js_data_name=setting["js_name"];const setting_name=setting["name"];if(setting["options"]!==undefined){output+=`\ +
+
${setting_name}
+
`;onEach(setting["options"],option=>{const checked=option===setting["default"]?" checked":"";const full=`${js_data_name}-${option.replace(/ /g,"-")}`;output+=`\ + `});output+=`\ +
+
`}else{const checked=setting["default"]===true?" checked":"";output+=`\ +
\ + \ +
`}}return output}function buildSettingsPage(){const theme_names=getVar("themes").split(",").filter(t=>t);theme_names.push("light","dark","ayu");const settings=[{"name":"Theme","js_name":"theme","default":"system preference","options":theme_names.concat("system preference"),},{"name":"Preferred light theme","js_name":"preferred-light-theme","default":"light","options":theme_names,},{"name":"Preferred dark theme","js_name":"preferred-dark-theme","default":"dark","options":theme_names,},{"name":"Auto-hide item contents for large items","js_name":"auto-hide-large-items","default":true,},{"name":"Auto-hide item methods' documentation","js_name":"auto-hide-method-docs","default":false,},{"name":"Auto-hide trait implementation documentation","js_name":"auto-hide-trait-implementations","default":false,},{"name":"Directly go to item in search if there is only one result","js_name":"go-to-only-result","default":false,},{"name":"Show line numbers on code examples","js_name":"line-numbers","default":false,},{"name":"Disable keyboard shortcuts","js_name":"disable-shortcuts","default":false,},];const elementKind=isSettingsPage?"section":"div";const innerHTML=`
${buildSettingsPageSections(settings)}
`;const el=document.createElement(elementKind);el.id="settings";if(!isSettingsPage){el.className="popover"}el.innerHTML=innerHTML;if(isSettingsPage){document.getElementById(MAIN_ID).appendChild(el)}else{el.setAttribute("tabindex","-1");getSettingsButton().appendChild(el)}return el}const settingsMenu=buildSettingsPage();function displaySettings(){settingsMenu.style.display=""}function settingsBlurHandler(event){blurHandler(event,getSettingsButton(),window.hidePopoverMenus)}if(isSettingsPage){getSettingsButton().onclick=function(event){event.preventDefault()}}else{const settingsButton=getSettingsButton();const settingsMenu=document.getElementById("settings");settingsButton.onclick=function(event){if(elemIsInParent(event.target,settingsMenu)){return}event.preventDefault();const shouldDisplaySettings=settingsMenu.style.display==="none";window.hideAllModals();if(shouldDisplaySettings){displaySettings()}};settingsButton.onblur=settingsBlurHandler;settingsButton.querySelector("a").onblur=settingsBlurHandler;onEachLazy(settingsMenu.querySelectorAll("input"),el=>{el.onblur=settingsBlurHandler});settingsMenu.onblur=settingsBlurHandler}setTimeout(()=>{setEvents(settingsMenu);if(!isSettingsPage){displaySettings()}removeClass(getSettingsButton(),"rotate")},0)})() \ No newline at end of file diff --git a/docs/static.files/source-script-11255107d0a65077.js b/docs/static.files/source-script-11255107d0a65077.js new file mode 100644 index 000000000..6afbb5a26 --- /dev/null +++ b/docs/static.files/source-script-11255107d0a65077.js @@ -0,0 +1 @@ +"use strict";(function(){const rootPath=document.getElementById("rustdoc-vars").attributes["data-root-path"].value;const NAME_OFFSET=0;const DIRS_OFFSET=1;const FILES_OFFSET=2;const RUSTDOC_MOBILE_BREAKPOINT=700;function closeSidebarIfMobile(){if(window.innerWidth"){addClass(document.documentElement,"source-sidebar-expanded");child.innerText="<";updateLocalStorage("source-sidebar-show","true")}else{removeClass(document.documentElement,"source-sidebar-expanded");child.innerText=">";updateLocalStorage("source-sidebar-show","false")}}function createSidebarToggle(){const sidebarToggle=document.createElement("div");sidebarToggle.id="src-sidebar-toggle";const inner=document.createElement("button");if(getCurrentValue("source-sidebar-show")==="true"){inner.innerText="<"}else{inner.innerText=">"}inner.onclick=toggleSidebar;sidebarToggle.appendChild(inner);return sidebarToggle}function createSourceSidebar(){const container=document.querySelector("nav.sidebar");const sidebarToggle=createSidebarToggle();container.insertBefore(sidebarToggle,container.firstChild);const sidebar=document.createElement("div");sidebar.id="source-sidebar";let hasFoundFile=false;const title=document.createElement("div");title.className="title";title.innerText="Files";sidebar.appendChild(title);Object.keys(sourcesIndex).forEach(key=>{sourcesIndex[key][NAME_OFFSET]=key;hasFoundFile=createDirEntry(sourcesIndex[key],sidebar,"",hasFoundFile)});container.appendChild(sidebar);const selected_elem=sidebar.getElementsByClassName("selected")[0];if(typeof selected_elem!=="undefined"){selected_elem.focus()}}const lineNumbersRegex=/^#?(\d+)(?:-(\d+))?$/;function highlightSourceLines(match){if(typeof match==="undefined"){match=window.location.hash.match(lineNumbersRegex)}if(!match){return}let from=parseInt(match[1],10);let to=from;if(typeof match[2]!=="undefined"){to=parseInt(match[2],10)}if(to{onEachLazy(e.getElementsByTagName("a"),i_e=>{removeClass(i_e,"line-highlighted")})});for(let i=from;i<=to;++i){elem=document.getElementById(i);if(!elem){break}addClass(elem,"line-highlighted")}}const handleSourceHighlight=(function(){let prev_line_id=0;const set_fragment=name=>{const x=window.scrollX,y=window.scrollY;if(browserSupportsHistoryApi()){history.replaceState(null,null,"#"+name);highlightSourceLines()}else{location.replace("#"+name)}window.scrollTo(x,y)};return ev=>{let cur_line_id=parseInt(ev.target.id,10);if(isNaN(cur_line_id)||ev.ctrlKey||ev.altKey||ev.metaKey){return}ev.preventDefault();if(ev.shiftKey&&prev_line_id){if(prev_line_id>cur_line_id){const tmp=prev_line_id;prev_line_id=cur_line_id;cur_line_id=tmp}set_fragment(prev_line_id+"-"+cur_line_id)}else{prev_line_id=cur_line_id;set_fragment(cur_line_id)}}}());window.addEventListener("hashchange",()=>{const match=window.location.hash.match(lineNumbersRegex);if(match){return highlightSourceLines(match)}});onEachLazy(document.getElementsByClassName("src-line-numbers"),el=>{el.addEventListener("click",handleSourceHighlight)});highlightSourceLines();window.createSourceSidebar=createSourceSidebar})() \ No newline at end of file diff --git a/docs/static.files/storage-62ce34ea385b278a.js b/docs/static.files/storage-62ce34ea385b278a.js new file mode 100644 index 000000000..6f4ec2e54 --- /dev/null +++ b/docs/static.files/storage-62ce34ea385b278a.js @@ -0,0 +1 @@ +"use strict";const darkThemes=["dark","ayu"];window.currentTheme=document.getElementById("themeStyle");const settingsDataset=(function(){const settingsElement=document.getElementById("default-settings");return settingsElement&&settingsElement.dataset?settingsElement.dataset:null})();function getSettingValue(settingName){const current=getCurrentValue(settingName);if(current===null&&settingsDataset!==null){const def=settingsDataset[settingName.replace(/-/g,"_")];if(def!==undefined){return def}}return current}const localStoredTheme=getSettingValue("theme");function hasClass(elem,className){return elem&&elem.classList&&elem.classList.contains(className)}function addClass(elem,className){if(elem&&elem.classList){elem.classList.add(className)}}function removeClass(elem,className){if(elem&&elem.classList){elem.classList.remove(className)}}function onEach(arr,func,reversed){if(arr&&arr.length>0){if(reversed){for(let i=arr.length-1;i>=0;--i){if(func(arr[i])){return true}}}else{for(const elem of arr){if(func(elem)){return true}}}}return false}function onEachLazy(lazyArray,func,reversed){return onEach(Array.prototype.slice.call(lazyArray),func,reversed)}function updateLocalStorage(name,value){try{window.localStorage.setItem("rustdoc-"+name,value)}catch(e){}}function getCurrentValue(name){try{return window.localStorage.getItem("rustdoc-"+name)}catch(e){return null}}const getVar=(function getVar(name){const el=document.getElementById("rustdoc-vars");return el?el.attributes["data-"+name].value:null});function switchTheme(newThemeName,saveTheme){if(saveTheme){updateLocalStorage("theme",newThemeName)}let newHref;if(newThemeName==="light"||newThemeName==="dark"||newThemeName==="ayu"){newHref=getVar("static-root-path")+getVar("theme-"+newThemeName+"-css")}else{newHref=getVar("root-path")+newThemeName+getVar("resource-suffix")+".css"}if(!window.currentTheme){document.write(``);window.currentTheme=document.getElementById("themeStyle")}else if(newHref!==window.currentTheme.href){window.currentTheme.href=newHref}}const updateTheme=(function(){const mql=window.matchMedia("(prefers-color-scheme: dark)");function updateTheme(){if(getSettingValue("use-system-theme")!=="false"){const lightTheme=getSettingValue("preferred-light-theme")||"light";const darkTheme=getSettingValue("preferred-dark-theme")||"dark";updateLocalStorage("use-system-theme","true");switchTheme(mql.matches?darkTheme:lightTheme,true)}else{switchTheme(getSettingValue("theme"),false)}}mql.addEventListener("change",updateTheme);return updateTheme})();if(getSettingValue("use-system-theme")!=="false"&&window.matchMedia){if(getSettingValue("use-system-theme")===null&&getSettingValue("preferred-dark-theme")===null&&darkThemes.indexOf(localStoredTheme)>=0){updateLocalStorage("preferred-dark-theme",localStoredTheme)}}updateTheme();if(getSettingValue("source-sidebar-show")==="true"){addClass(document.documentElement,"source-sidebar-expanded")}window.addEventListener("pageshow",ev=>{if(ev.persisted){setTimeout(updateTheme,0)}}) \ No newline at end of file diff --git a/docs/static.files/wheel-7b819b6101059cd0.svg b/docs/static.files/wheel-7b819b6101059cd0.svg new file mode 100644 index 000000000..83c07f63d --- /dev/null +++ b/docs/static.files/wheel-7b819b6101059cd0.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/examples.json b/examples.json new file mode 100644 index 000000000..6f11128d8 --- /dev/null +++ b/examples.json @@ -0,0 +1,58 @@ +{ + "antiunify": "(datatype Expr\n (Num i64)\n (Var String)\n (Add Expr Expr))\n\n(rewrite (Add x y) (Add y x))\n(rewrite (Add (Num x) (Num y)) (Num (+ x y)))\n\n;; antiunificaiton returns an expression that could unify with either\n;; of the input expressions\n;; (AU x y) can be considered a placeholder variable\n(function AU (Expr Expr) Expr)\n\n(rewrite (AU x x) x)\n(rewrite\n (AU (Add a b) (Add c d))\n (Add (AU a c) (AU b d)))\n\n(let e1 (Add (Var \"x\") (Add (Num 1) (Num 2))))\n(let e2 (Add (Num 3) (Var \"y\")))\n\n(let au12 (AU e1 e2))\n\n(run 4)\n(check (= au12 (Add (Num 3) (AU (Var \"x\") (Var \"y\")))))\n(query-extract au12)\n", + "array": "; Smtlib theory of arrays\n; https://smtlib.cs.uiowa.edu/theories-ArraysEx.shtml\n; http://smtlib.cs.uiowa.edu/version1/theories/Arrays.smt\n\n(datatype Math\n (Num i64)\n (Var String)\n)\n\n\n(datatype Array\n (Const i64)\n (AVar String)\n)\n\n(function add (Math Math) Math)\n(function select (Array Math) Math)\n(function store (Array Math Math) Array)\n\n(relation neq (Math Math))\n\n(rule ((neq x y))\n ((neq y x)))\n\n(rule ((neq x x))\n ((panic \"query (neq x x) found something equal to itself\")))\n\n\n; injectivity rules take not equal to not equal.\n(rule ((neq x y) (= (add x z) e))\n ((neq (add x z) (add y z))))\n(rule ((= (add x (Num i)) e) (!= i 0))\n ((neq e x)))\n\n\n(rule ((= (Num a) n1) (= (Num b) n2) (!= a b))\n ((neq n1 n2)))\n\n; select gets from store\n(rewrite (select (store mem i e) i) e)\n; select passes through wrong index\n(rule ((= (select (store mem i1 e) i2) e1) (neq i1 i2))\n ((set (select mem i2) e1)))\n; aliasing writes destroy old value\n(rewrite (store (store mem i e1) i e2) (store mem i e2))\n; non-aliasing writes commutes\n(rule ((= (store (store mem i2 e2) i1 e1) mem1) (neq i1 i2))\n ((set (store (store mem i1 e1) i2 e2) mem1)))\n\n; typical math rules\n(rewrite (add x y) (add y x))\n(rewrite (add (add x y) z) (add x (add y z)))\n(rewrite (add (Num x) (Num y)) (Num (+ x y)))\n(rewrite (add x (Num 0)) x)\n\n(push)\n(let r1 (Var \"r1\"))\n(let r2 (Var \"r2\"))\n(let r3 (Var \"r3\"))\n(let mem1 (AVar \"mem1\"))\n\n(neq r1 r2)\n(neq r2 r3)\n(neq r1 r3)\n(let test1 (select (store mem1 r1 (Num 42)) r1))\n(let test2 (select (store mem1 r1 (Num 42)) (add r1 (Num 17))))\n(let test3 (select (store (store mem1 (add r1 r2) (Num 1)) (add r2 r1) (Num 2)) (add r1 r3)))\n(let test4 (add (Num 1) (add (add (Num 1) (add (Num 1) r1)) (Num -3))))\n\n(run 5)\n(check (= test1 (Num 42)))\n(check (neq r1 r2))\n(check (neq r1 (add r1 (Num 17))))\n(check (= test2 (select mem1 (add r1 (Num 17)))))\n(check (= test3 (select mem1 (add r1 r3))))\n(check (= test4 r1))\n(pop)\n", + "bdd": "; Binary Decision Diagrams are if-then-else trees/ compressed tries that hash cons their leaves\n; This is easily expressible in the facilities provided. Everything in egglog is automatcally shared\n; and Compression is easily expressible as a rule.\n\n; They are a notion of first class set useful for certain classes of uniformly describable sets.\n; https://en.wikipedia.org/wiki/Binary_decision_diagram\n; https://www.lri.fr/~filliatr/ftp/publis/hash-consing2.pdf Type-Safe Modular Hash-Consing - Section 3.3\n\n(datatype BDD\n (ITE i64 BDD BDD) ; variables labelled by number\n)\n(declare True BDD)\n(declare False BDD)\n\n; compress unneeded nodes\n(rewrite (ITE n a a) a)\n\n(function and (BDD BDD) BDD)\n(rewrite (and x y) (and y x))\n(rewrite (and False n) False)\n(rewrite (and True x) x)\n\n; We use an order where low variables are higher in tree\n; Could go the other way.\n(rewrite (and (ITE n a1 a2) (ITE m b1 b2))\n (ITE n (and a1 (ITE m b1 b2)) (and a2 (ITE m b1 b2)))\n :when ((< n m))\n)\n(rewrite (and (ITE n a1 a2) (ITE n b1 b2))\n (ITE n (and a1 b1) (and a2 b2))\n)\n\n(function or (BDD BDD) BDD)\n(rewrite (or x y) (or y x))\n(rewrite (or True n) True)\n(rewrite (or False x) x)\n(rewrite (or (ITE n a1 a2) (ITE m b1 b2))\n (ITE n (or a1 (ITE m b1 b2)) (or a2 (ITE m b1 b2)))\n :when ((< n m))\n)\n(rewrite (or (ITE n a1 a2) (ITE n b1 b2))\n (ITE n (or a1 b1) (or a2 b2))\n)\n\n(function not (BDD) BDD)\n(rewrite (not True) False)\n(rewrite (not False) True)\n(rewrite (not (ITE n a1 a2)) (ITE n (not a1) (not a2)))\n\n\n(function xor (BDD BDD) BDD)\n(rewrite (xor x y) (xor y x))\n(rewrite (xor True n) (not n))\n(rewrite (xor False x) x)\n\n(rewrite (xor (ITE n a1 a2) (ITE m b1 b2))\n (ITE n (xor a1 (ITE m b1 b2)) (xor a2 (ITE m b1 b2)))\n :when ((< n m))\n)\n(rewrite (xor (ITE n a1 a2) (ITE n b1 b2))\n (ITE n (xor a1 b1) (xor a2 b2))\n)\n\n(push)\n;;; Tests\n\n(let v0 (ITE 0 True False))\n(let v1 (ITE 1 True False))\n(let v2 (ITE 2 True False))\n\n(let t0 (not (not v0)))\n(let t1 (or v0 (not v0)))\n(let t2 (and v0 (not v0)))\n(let t3 (and v0 v0))\n(let t4 (or v0 v0))\n(let t5 (xor (not v0) v0))\n(let t6 (and (or v1 v2) v2))\n\n(let t7a (xor (not v0) v1))\n(let t7b (xor v0 (not v1)))\n(let t7c (not (xor v0 v1)))\n\n(let t8 (and v1 v2))\n\n(let t9 (and (not v1) (and (not v0) (xor v0 v1))))\n(let t10 (or (not v1) (or (not v0) (xor v0 (not v1)))))\n\n(run 30)\n\n(check (= t0 v0)) ; not cancels\n(check (= t1 True))\n(check (= t2 False))\n(check (= t3 v0))\n(check (= t4 v0))\n(check (= t5 True))\n(check (= t6 v2))\n\n(check (= t7a t7b))\n(check (= t7a t7c))\n\n(check (= t8 (ITE 1 (ITE 2 True False) False)))\n\n(check (= t9 False))\n(check (= t10 True))\n(pop)\n", + "before-proofs": "(set-option enable_proofs 1)\n\n(datatype Math\n (Add Math Math)\n (Sub Math Math)\n (Const Rational)\n (Var String))\n\n(rewrite (Add a b) (Add (Add a b) (Const (rational 0 1))))\n\n(rewrite (Add a b) (Add b a))\n\n\n(rewrite (Add a (Add b c))\n (Add (Add a b) c))\n\n(let two (rational 2 1))\n(let start1 (Add (Var \"x\") (Const two)))\n;; add original proofs\n\n(run 3)\n\n\n(check (!= (Var \"x\") (Const two)))\n(check (= (Add (Var \"x\") (Const two))\n (Add (Const two) (Var \"x\"))))\n\n(let zero (Const (rational 0 1)))\n(let addx2 (Add (Var \"x\") (Const two)))\n(let addx20 (Add addx2 zero))\n(let addzerofront (Add (Add zero (Var \"x\")) (Const two)))\n\n(check (= addx2\n addx20))\n", + "birewrite": "(datatype Math (Add Math Math) (Lit i64))\n\n(birewrite (Add (Add x y) z) (Add x (Add y z)))\n\n(let a (Lit 1))\n(let b (Lit 2))\n(let c (Lit 3))\n\n(let d (Lit 4))\n(let e (Lit 5))\n(let f (Lit 6))\n\n(let ex1 (Add (Add a b) c))\n(let ex2 (Add d (Add e f)))\n\n(run 10)\n(check (= ex1 (Add a (Add b c))))\n(check (= ex2 (Add (Add d e) f)))\n", + "bitwise": "(check (= 0 (& 10 0)))\n(check (= 8 (& 8 10)))\n(check (= 10 (| 8 10)))\n(check (= 2 (^ 8 10)))\n(check (= 8 (<< 1 3)))\n(check (= 1 (>> 8 3)))\n(check (= 2 (% 8 3)))\n(check (= 2 (/ 8 3)))\n(check (= -1 (not-i64 0)))\n\n; bitsets\n;(function bs-union (i64 i64) i64)\n;(rewrite (bs-union a b) (| a b))\n\n;(function bs-inter (i64 i64) i64)\n;(rewrite (bs-inter a b) (& a b))\n\n;(function bs-comp (i64) i64)\n;(rewrite (bs-comp a) (bvnot a))\n\n; singleton set\n;(function bs-sing (i64) i64)\n;(rewrite (bs-sing a) (1 << a))\n\n;(function bs-insert (i64 i64) i64)\n;(rewrite (bs-insert s x) (| s (1 << a))\n\n;(function bs-diff (i64 i64) i64)\n;(rewrite (bs-diff a b) (^ a (bs-inter a b))\n\n;(let bs-empty 0)\n\n;(let bs-subset (i64 i64) bool)\n;(rewrite (bs-subset x y) (is-zero (bs-diff x y)))\n\n;(let bs-is-elem (i64 i64) bool)\n;(rewrite (bs-is-elem s x) (not (is-zero (bs-inter s (sing x)))))\n", + "calc": "(datatype G)\n(declare I G)\n(declare A G)\n(declare B G)\n(function g* (G G) G)\n(function inv (G) G)\n(birewrite (g* (g* a b) c) (g* a (g* b c))) ; assoc\n(rewrite (g* I a) a) ; idl\n(rewrite (g* a I) a) ; idr\n(rewrite (g* (inv a) a) I) ; invl\n(rewrite (g* a (inv a)) I) ; invr\n\n; A is cyclic of period 4\n(rewrite (g* A (g* A (g* A A))) I)\n\n(let A2 (g* A A))\n(let A4 (g* A2 A2))\n(let A8 (g* A4 A4))\n\n\n(calc ()\n (g* A4 A4)\n (g* (g* A2 A2) (g* A2 A2))\n (g* A2 (g* A2 (g* A2 A2)))\n)\n\n; Note that (calc ((I G) (b G)) ...) will fail because names must be unused\n(calc ((a G) (b G))\n (g* (g* b (g* (inv a) a)) (inv b))\n (g* b (inv b))\n I\n)\n", + "combinators": "; Substitution in lambda-calculus via S/K/I combinators. Extremely slow, as\n; abstraction elimination does not pay attention to whether variables are free\n; in an expression before introducing 'S'.\n;\n; Provides an example of how to implement substitution by embedding in a\n; 'richer' data-type and then mapping back to syntax.\n\n(datatype Expr\n (Var String :cost 100)\n (Abs String Expr)\n (If Expr Expr Expr)\n (N i64)\n (Add Expr Expr)\n (App Expr Expr))\n(declare T Expr)\n(declare F Expr)\n\n\n; (\\x. (if x then 0 else 1) + 2) false\n(let test\n (App \n (Abs \"x\" (Add (If (Var \"x\") (N 0) (N 1)) (N 2))) F))\n\n(datatype CExpr\n (CVar String :cost 10000) ; (variables that haven't been eliminated yet)\n (CAbs String CExpr :cost 10000) ; (abstractions that haven't been eliminated yet)\n (CN i64)\n (CApp CExpr CExpr))\n(declare CT CExpr)\n(declare CF CExpr)\n(declare CIf CExpr)\n(declare CAdd CExpr)\n(declare S CExpr)\n(declare K CExpr)\n(declare I CExpr)\n\n;;;; Conversion functions\n(function Comb (Expr) CExpr :cost 1000000)\n(function Uncomb (CExpr) Expr) \n(rewrite (Comb (Uncomb cx)) cx)\n(rewrite (Uncomb (Comb x)) x)\n\n; Mechanical mappings back and forth.\n; Note: we avoid resugaring S/K/I\n(rule ((= x (N n))) ((set (Comb x) (CN n))))\n(rule ((= cx (CN n))) ((set (Uncomb cx) (N n))))\n(rule ((= x T)) ((set (Comb x) CT)))\n(rule ((= cx CT)) ((set (Uncomb cx) T)))\n(rule ((= x F)) ((set (Comb x) CF)))\n(rule ((= cx CF)) ((set (Uncomb cx) F)))\n\n(rule ((= x (If c t f)))\n ((set (Comb x) (CApp (CApp (CApp CIf (Comb c)) (Comb t)) (Comb f)))))\n(rule ((= cx (CApp (CApp (CApp CIf cc) ct) cf)))\n ((set (Uncomb cx) (If (Uncomb cc) (Uncomb ct) (Uncomb cf)))))\n\n(rule ((= x (Add l r)))\n ((set (Comb x) (CApp (CApp CAdd (Comb l)) (Comb r)))))\n(rule ((= cx (CApp (CApp CAdd cl) cr)))\n ((set (Uncomb cx) (Add (Uncomb cl) (Uncomb cr)))))\n(rule ((= x (App f a))) ((set (Comb x) (CApp (Comb f) (Comb a)))))\n\n(rule ((= x (Var v))) ((set (Comb x) (CVar v))))\n(rule ((= x (Abs v body))) ((set (Comb x) (CAbs v (Comb body)))))\n\n;;;; Abstraction Elimination \n(rewrite (CAbs v (CVar v)) I)\n; Hacks, could be replaced by !free computation.\n(rewrite (CAbs v1 (CVar v2)) (CApp K (CVar v2)) \n :when ((!= v1 v2)))\n(rewrite (CAbs v (CN n)) (CApp K (CN n)))\n(rewrite (CAbs v CT) (CApp K CT))\n(rewrite (CAbs v CF) (CApp K CF))\n(rewrite (CAbs v CIf) (CApp K CIf))\n(rewrite (CAbs v CAdd) (CApp K CAdd))\n(rewrite (CAbs v (CApp x y)) (CApp (CApp S (CAbs v x)) (CAbs v y)))\n; May be needed for multiple nested variables\n(rewrite (CAbs v (CApp K (CVar v))) K)\n\n;;;; Primitive Evaluation rules (letd on \"surface syntax\")\n(rewrite (If T t f) t)\n(rewrite (If F t f) f)\n(rewrite (Add (N n) (N m)) (N (+ n m)))\n\n;;;; Substitution Rules (letd on the combinator representation)\n(rewrite (CApp I cx) cx)\n(rewrite (CApp (CApp K cx) cy) cx)\n; Without demand, this can cause an explosion in DB size.\n(rewrite (CApp (CApp (CApp S cx) cy) cz) (CApp (CApp cx cz) (CApp cy cz)))\n\n(run 11)\n(query-extract (Comb test))\n(check (= test (N 3)))", + "container-rebuild": "(push)\n(datatype Math\n (Num i64))\n\n(sort MathVec (Vec Math))\n\n(let v1 (vec-of (Num 1) (Num 2)))\n(let v2 (vec-of (Num 2) (Num 2)))\n\n(union (Num 1) (Num 2))\n\n(check (= v1 v2))\n\n(function MyVec (MathVec) Math)\n\n(MyVec v1)\n\n(check (MyVec v2))\n\n(check (= (MyVec v1) (MyVec v2)))\n\n(let v3 (vec-of (Num 4) (Num 5)))\n\n(union (Num 4) (Num 6))\n(union (Num 5) (Num 7))\n\n;; We don't have any (MyVec v3) yet\n(fail (check (= (MyVec v3) (MyVec (vec-of (Num 6) (Num 7))))))\n\n(MyVec v3)\n(check (= (MyVec v3) (MyVec (vec-of (Num 6) (Num 7)))))\n\n(pop)\n\n(push)\n\n(datatype Math\n (Num i64))\n\n(sort MathVec (Vec Math))\n\n\n(let v1 (vec-of (Num 1) (Num 2)))\n(let v2 (vec-of (Num 2) (Num 2)))\n\n(union (Num 1) (Num 2))\n\n(function MyVec (MathVec) Math)\n\n;; make a reference to v1\n(MyVec v1)\n\n(extract (MyVec v1))\n\n;; rebuilding creates (MyVec v2)\n(check (= (MyVec v1) (MyVec v2)))\n(pop)\n\n(push)\n(datatype Math\n (Add i64 i64)\n (Expensive :cost 100))\n\n(sort MathVec (Vec Math))\n\n(let myvec (vec-of (Expensive)))\n(let cheapvec (vec-of (Add 1 2)))\n\n(function VecContainer (MathVec) Math)\n\n(let myvecontainer (VecContainer cheapvec))\n\n\n(union myvecontainer (Expensive))\n\n;; (vec-push (vec-empty) (VecContainer (vec-push (vec-empty) (Add 1 2))))\n;; should have cost 4\n(extract myvec 0)\n\n(pop)", + "cyk": "(datatype term (Term String))\n(datatype nonterm (NonTerm String))\n(datatype tree (NT String tree tree)\n (T String String))\n\n(function getString (i64) String)\n\n(relation Prod (nonterm nonterm nonterm))\n(relation End (nonterm String))\n\n\n\n(relation P (i64 i64 nonterm))\n(function B (i64 i64 nonterm) tree :cost 1000)\n\n(rule ((End (NonTerm a) s)\n (= s (getString pos)))\n ((P 1 pos (NonTerm a))\n (set (B 1 pos (NonTerm a)) (T a s)))) \n\n(rule ((Prod (NonTerm a) (NonTerm b) (NonTerm c)) ;; a -> bc\n (P p1 s (NonTerm b))\n (P p2 (+ s p1) (NonTerm c)))\n ((P (+ p1 p2) s (NonTerm a))))\n\n\n(rule ((Prod (NonTerm a) (NonTerm b) (NonTerm c))\n (= f1 (B p1 s (NonTerm b)))\n (= f2 (B p2 (+ s p1) (NonTerm c))))\n ((set (B (+ p1 p2) s (NonTerm a)) \n (NT a f1 f2))))\n\n(push)\n\n\n(set (getString 1) \"she\")\n(set (getString 2) \"eats\")\n(set (getString 3) \"a\")\n(set (getString 4) \"fish\")\n(set (getString 5) \"with\")\n(set (getString 6) \"a\")\n(set (getString 7) \"fork\")\n\n\n(Prod (NonTerm \"S\") (NonTerm \"NP\") (NonTerm \"VP\"))\n(Prod (NonTerm \"VP\") (NonTerm \"VP\") (NonTerm \"PP\"))\n(Prod (NonTerm \"VP\") (NonTerm \"V\") (NonTerm \"NP\"))\n(End (NonTerm \"VP\") \"eats\")\n(Prod (NonTerm \"PP\") (NonTerm \"P\") (NonTerm \"NP\"))\n(Prod (NonTerm \"NP\") (NonTerm \"DET\") (NonTerm \"N\"))\n(End (NonTerm \"NP\") \"she\")\n(End (NonTerm \"V\") \"eats\")\n(End (NonTerm \"P\") \"with\")\n(End (NonTerm \"N\") \"fish\")\n(End (NonTerm \"N\") \"fork\")\n(End (NonTerm \"DET\") \"a\")\n\n\n(let test1 (B 7 1 (NonTerm \"S\")))\n\n(run 100)\n\n(check (P 7 1 (NonTerm \"S\")))\n(fail (check (P 7 1 (NonTerm \"VP\"))))\n(fail (check (P 7 1 (NonTerm \"\"))))\n\n(query-extract test1)\n\n(pop)\n\n(push)\n\n(Prod (NonTerm \"S\") (NonTerm \"A\") (NonTerm \"B\"))\n(Prod (NonTerm \"S\") (NonTerm \"B\") (NonTerm \"C\"))\n(Prod (NonTerm \"A\") (NonTerm \"B\") (NonTerm \"A\"))\n(End (NonTerm \"A\") \"a\")\n(Prod (NonTerm \"B\") (NonTerm \"C\") (NonTerm \"C\"))\n(End (NonTerm \"B\") \"b\")\n(Prod (NonTerm \"C\") (NonTerm \"A\") (NonTerm \"B\"))\n(End (NonTerm \"C\") \"a\")\n\n(push)\n\n(set (getString 1) \"a\")\n(set (getString 2) \"b\")\n(set (getString 3) \"a\")\n(set (getString 4) \"a\")\n(set (getString 5) \"b\")\n\n(run 100)\n(check (P 5 1 (NonTerm \"S\")))\n(fail (check (P 5 1 (NonTerm \"B\"))))\n(let test2 (B 5 1 (NonTerm \"S\")))\n(query-extract:variants 10 test2)\n\n(pop)\n\n(push)\n\n(set (getString 1) \"a\")\n(set (getString 2) \"a\")\n(set (getString 3) \"a\")\n(set (getString 4) \"a\")\n(set (getString 5) \"a\")\n\n(run 100)\n(check (P 5 1 (NonTerm \"S\")))\n(check (P 5 1 (NonTerm \"A\")))\n(fail (check (P 5 1 (NonTerm \"B\"))))\n(fail (check (P 5 1 (NonTerm \"\"))))\n(fail (check (P 5 1 (NonTerm \"unrelated\"))))\n(let test3 (B 5 1 (NonTerm \"S\")))\n(query-extract :variants 10 test3)\n\n(pop)", + "cykjson": "(datatype tree (NT String tree tree)\n (T String String))\n\n(function getString (i64) String)\n\n(relation Prod (String String String))\n(relation End (String String))\n\n\n(relation P (i64 i64 String))\n(function B (i64 i64 String) tree :cost 100000)\n\n(rule ((End a s)\n (= s (getString pos)))\n ((P 1 pos a)\n (set (B 1 pos a) (T a s)))) \n\n(rule ((Prod a b c) ;; a -> bc\n (P p1 s b)\n (P p2 (+ s p1) c))\n ((P (+ p1 p2) s a)))\n\n\n(rule ((Prod a b c)\n (= f1 (B p1 s b))\n (= f2 (B p2 (+ s p1) c)))\n ((set (B (+ p1 p2) s a) \n (NT a f1 f2))))\n\n\n(input Prod \"./tests/cykjson_Prod.csv\")\n(input End \"./tests/cykjson_End.csv\")\n\n; small size 801\n(input getString \"./tests/cykjson_small_token.csv\")\n\n; medium size 7821 but runs for 2 min.\n;(input getString \"./tests/cykjson_medium_token.csv\")\n\n(let test1 (B 801 1 \"VAL\"))\n\n(run 10000)\n\n(check (P 801 1 \"VAL\"))", + "delete": "(function foo (i64) i64)\n(set (foo 1) 7)\n(check (= (foo 1) 7))\n(delete (foo 1))\n(rule ((= x (foo 1))) ((panic \"foo 1 was there!\")))\n(run 1)", + "eqsat-basic": "(datatype Math\n (Num i64)\n (Var String)\n (Add Math Math)\n (Mul Math Math))\n\n;; expr1 = 2 * (x + 3)\n(let expr1 (Mul (Num 2) (Add (Var \"x\") (Num 3))))\n;; expr2 = 6 + 2 * x\n(let expr2 (Add (Num 6) (Mul (Num 2) (Var \"x\"))))\n\n\n;; (rule ((= __root (Add a b)))\n;; ((union __root (Add b a)))\n(rewrite (Add a b)\n (Add b a))\n(rewrite (Mul a (Add b c))\n (Add (Mul a b) (Mul a c)))\n(rewrite (Add (Num a) (Num b))\n (Num (+ a b)))\n(rewrite (Mul (Num a) (Num b))\n (Num (* a b)))\n\n(run 10)\n(check (= expr1 expr2))\n", + "eqsolve": "(datatype Expr\n (Add Expr Expr)\n (Neg Expr)\n (Num i64)\n (Mul Expr Expr)\n (Var String)\n)\n\n(rewrite (Add x y) (Add y x))\n(rewrite (Add (Add x y) z) (Add x (Add y z)))\n(rewrite (Add (Num x) (Num y)) (Num (+ x y)))\n(rule ((= (Add x y) z))\n ((union (Add z (Neg y)) x)))\n(rewrite (Neg (Neg x)) x)\n(rewrite (Neg (Num n)) (Num (- 0 n)))\n\n(rule ((= x (Var v))) ((union (Mul (Num 1) x) x)))\n(rule ((= x (Add x1 x2))) ((union (Mul (Num 1) x) x)))\n(rewrite (Add (Mul y x) (Mul z x)) (Mul (Add y z) x))\n(rewrite (Mul x y) (Mul y x))\n(rule ((= (Mul (Num x) y) (Num z))\n (= (% z x) 0))\n ((union y (Num (/ z x)))))\n\n; system 1: x + 2 = 7\n(set (Add (Var \"x\") (Num 2)) (Num 7))\n; system 2: z + y = 6, 2z = y\n(set (Add (Var \"z\") (Var \"y\")) (Num 6))\n(set (Add (Var \"z\") (Var \"z\")) (Var \"y\"))\n\n(run 5)\n(query-extract (Var \"x\"))\n(query-extract (Var \"y\"))\n(query-extract (Var \"z\"))\n(check (= (Var \"z\") (Add (Num 6) (Neg (Var \"y\")))))\n(check (= (Var \"y\") (Add (Add (Num 6) (Neg (Var \"y\"))) (Add (Num 6) (Neg (Var \"y\"))))))\n(check (= (Var \"y\") (Add (Add (Num 12) (Neg (Var \"y\"))) (Neg (Var \"y\")))))\n(check (= (Add (Var \"y\") (Var \"y\")) \n (Add (Num 12) (Neg (Var \"y\")))))\n(check (= (Add (Add (Var \"y\") (Var \"y\")) (Var \"y\"))\n (Num 12)))\n(check (= (Add (Mul (Num 2) (Var \"y\")) (Var \"y\"))\n (Num 12)))\n(check (= (Mul (Num 3) (Var \"y\"))\n (Num 12)))\n", + "f64": "(check (= (neg 1.5) -1.5))\n(check (= (+ 1.5 9.2) 10.7))\n(check (= (/ 12.5 2.0) 6.25))\n(check (< 1.5 9.2))\n(check (>= 9.2 1.5))\n(fail (check (< 9.2 1.5)))\n(fail (check (= (+ 1.5 9.2) 10.6)))\n(check (= (to-f64 1) 1.0))\n(check (= (to-i64 1.0) 1))\n(check (= (to-string 1.2) \"1.2\"))\n(check (= (to-string 1.0) \"1.0\"))\n", + "unbound": "(datatype Math\n (Add Math Math)\n (Sub Math Math)\n)\n\n(rule ((= e (Add x y))) ((Add x i)))\n", + "fail_wrong_assertion": ";; This test ensure check test fails for wrong assertion\n(function f (i64) i64 :merge (min old new))\n\n(set (f 1) 4)\n(set (f 1) 5)\n\n(check (= (f 1) 4))\n(fail (check (= (f 1) 2)))\n\n(delete (f 1))\n(fail (check (= (f 1) 4)))\n\n(function g (i64 i64) i64 :merge (min old new))\n\n(set (g 1 2) 3)\n(set (g 2 3) 3)\n\n(check (= (g 1 2) (g 2 3)))\n(fail (check (!= (g 1 2) (g 2 3))))\n(fail (check (= (g 0 2) (g 2 3))))\n(check (= x (g 1 2)))\n(fail (check (= x (g 1 3))))\n(check (= x (g 1 2)) (= y (g 2 3)) (= x y))\n(fail (check (= x (g 0 0)) (= y (g 1 1)) (= x y)))", + "fibonacci-demand": "(datatype Expr \n (Num i64 :cost 1)\n (Add Expr Expr :cost 5))\n\n(function Fib (i64) Expr :cost 10)\n\n(rewrite (Add (Num a) (Num b)) (Num (+ a b)))\n(rewrite (Fib x) (Add (Fib (- x 1)) (Fib (- x 2)))\n :when ((> x 1)))\n(rewrite (Fib x) (Num x)\n :when ((<= x 1)))\n\n(let f7 (Fib 7))\n(run 1000)\n(print-table Fib)\n(query-extract f7)\n(check (= f7 (Num 13)))\n \n ", + "fibonacci": "(function fib (i64) i64)\n(set (fib 0) 0)\n(set (fib 1) 1)\n\n(rule ((= f0 (fib x))\n (= f1 (fib (+ x 1))))\n ((set (fib (+ x 2)) (+ f0 f1))))\n\n(run 7)\n\n(check (= (fib 7) 13))", + "fusion": "(datatype Var)\n(datatype Term\n (App Term Term)\n (Lam Var Term)\n (TVar Var)\n (Let Var Term Term)\n (Add Term Term)\n (Num i64)\n (CaseSplit Term Term Term)\n (Cons Term Term))\n(declare Nil Term)\n\n(function V (String) Var) \n(function From (Term) Var)\n\n;; ==== FV ====\n(sort StringSet (Set Var))\n(function freer (Term) StringSet :merge (set-intersect old new))\n(rule ((= e (App e1 e2))\n (= (freer e1) fv1)\n (= (freer e2) fv2))\n ((set (freer e) (set-union fv1 fv2))))\n(rule ((= e (Lam var body))\n (= (freer body) fv))\n ((set (freer e) (set-remove fv var))))\n(rule ((= e (TVar v)))\n ((set (freer e) (set-insert (set-empty) v))))\n(rule ((= e (Let var e1 e2))\n (= (freer e1) fv1)\n (= (freer e2) fv2))\n ((set (freer e) (set-union (set-remove fv1 var) fv2))))\n(rule ((= e (Add e1 e2))\n (= (freer e1) fv1)\n (= (freer e2) fv2))\n ((set (freer e) (set-union fv1 fv2))))\n(rule ((= e (Num v)))\n ((set (freer e) (set-empty))))\n(rule ((= e (CaseSplit e1 e2 e3))\n (= (freer e1) fv1)\n (= (freer e2) fv2)\n (= (freer e3) fv3))\n ((set (freer e) (set-union (set-union fv1 fv2) fv3))))\n(rule ((= e (Cons e1 e2))\n (= (freer e1) fv1)\n (= (freer e2) fv2))\n ((set (freer e) (set-union fv1 fv2))))\n(rule ((= e Nil))\n ((set (freer e) (set-empty))))\n\n;; ==== eval ====\n; beta\n(rewrite (App (Lam v body) e) (Let v e body))\n; case-split-nil\n(rewrite (CaseSplit Nil e1 e2) e1)\n; case-split-cons\n(rewrite (CaseSplit (Cons x xs) e1 e2) (App (App e2 x) xs))\n\n; let-num\n(rewrite (Let v e (Num n)) (Num n))\n; let-nil\n(rewrite (Let v e Nil) Nil)\n; let-var-same\n(rewrite (Let v1 e (TVar v1)) e)\n; let-var-diff\n(rewrite (Let v1 e (TVar v2)) (TVar v2) :when ((!= v1 v2)))\n\n; let-lam-close\n(rewrite (Let v1 e expr) expr :when ((set-not-contains (freer expr) v1))) \n; let-app\n(rewrite (Let v e expr) (App (Let v e a) (Let v e b)) :when ((= expr (App a b)) (set-contains (freer expr) v)))\n; let-add\n(rewrite (Let v e expr) (Add (Let v e a) (Let v e b)) :when ((= expr (Add a b)) (set-contains (freer expr) v)))\n; let-cons\n(rewrite (Let v e expr) (Cons (Let v e x) (Let v e xs)) :when ((= expr (Cons x xs)) (set-contains (freer expr) v)))\n; let-case-split\n(rewrite (Let v e expr) \n (CaseSplit (Let v e e1) (Let v e e2) (Let v e e3))\n :when ((= expr (CaseSplit e1 e2 e3))\n (set-contains (freer expr) v)))\n; let-lam-same\n(rewrite (Let v1 e (Lam v1 body)) (Lam v1 body))\n; let-lam-diff\n(rewrite (Let v1 e (Lam v2 body)) (Lam v2 (Let v1 e body))\n :when ((set-contains (freer body) v1)\n (!= v1 v2)\n (= fvs (freer e))\n (set-not-contains fvs v2)))\n(rule ((= expr (Let v1 e (Lam v2 body)))\n (set-contains (freer body) v1)\n (!= v1 v2)\n (= fvs (freer e))\n (set-contains fvs v2))\n ((union expr (Lam (From expr) (Let v1 e (Let v2 (TVar (From expr)) body))))))\n\n(function pushdown (Term Term) Term :cost 10000)\n(rewrite (App f (App (Lam x e) e2))\n (App (Lam x (pushdown f e)) e2))\n\n(rewrite (pushdown f (CaseSplit e e1 (Lam x (Lam xs e2)))) \n (CaseSplit e (App f e1) (Lam x (Lam xs (App f e2)))))\n\n(relation is-tail (Term))\n(rule ((= demand (pushdown f e)) (= e (App e1 e2))) ((is-tail e)))\n(rule ((= demand (pushdown f e)) (= e (Lam x e))) ((is-tail e)))\n(rule ((= demand (pushdown f e)) (= e (TVar x))) ((is-tail e)))\n(rule ((= demand (pushdown f e)) (= e (Cons e1 e2))) ((is-tail e)))\n(rule ((= demand (pushdown f e)) (= e Nil)) ((is-tail e)))\n(rule ((= demand (pushdown f e)) (= e (Add e1 e2))) ((is-tail e)))\n(rule ((= demand (pushdown f e)) (= e (Num n1))) ((is-tail e)))\n(rewrite (pushdown f e) (App f e) :when ((is-tail e)))\n\n;; ==== definition ====\n\n(function sum () Term :cost 1000)\n(function mapf () Term :cost 1000)\n(function sum-o-mapf () Term)\n(rewrite (App (sum) (App (mapf) x)) (App (sum-o-mapf) x))\n(union (sum) (Lam (V \"xs\")\n (CaseSplit (TVar (V \"xs\")) \n (Num 0)\n (Lam (V \"x\") (Lam (V \"xs'\") \n (Add (TVar (V \"x\")) (App (sum) (TVar (V \"xs'\")))))))))\n\n(union (mapf) (Lam (V \"xs\")\n (CaseSplit (TVar (V \"xs\"))\n Nil\n (Lam (V \"x\") (Lam (V \"xs'\")\n (Cons (Add (TVar (V \"x\")) (Num 1))\n (App (mapf) (TVar (V \"xs'\")))))))))\n\n(set (freer (sum)) (set-empty))\n(set (freer (mapf)) (set-empty))\n\n(let expr (App (sum) (App (mapf) (TVar (V \"expr\")))))\n\n(run 100)\n\n(query-extract (freer expr))\n\n\n(let my-output\n (CaseSplit (TVar (V \"expr\")) (Num 0) \n (Lam (V \"x\") (Lam (V \"xs'\") \n (Add (Add (TVar (V \"x\")) (Num 1)) \n (App (sum-o-mapf) (TVar (V \"xs'\"))))))))\n\n(check (= (App (sum-o-mapf) (TVar (V \"expr\")))\n (CaseSplit (TVar (V \"expr\")) (Num 0) \n (Lam (V \"x\") (Lam (V \"xs'\") \n (Add (Add (TVar (V \"x\")) (Num 1)) \n (App (sum-o-mapf) (TVar (V \"xs'\")))))))))\n", + "herbie-tutorial": "(datatype Math\n (Num Rational)\n (Var String)\n (Add Math Math)\n (Div Math Math)\n (Mul Math Math))\n\n(let zero (Num (rational 0 1)))\n(let one (Num (rational 1 1)))\n(let two (Num (rational 2 1)))\n\n(rewrite (Add a b) (Add b a))\n(rewrite (Add a zero) a)\n(rewrite (Add (Num r1) (Num r2))\n (Num (+ r1 r2)))\n\n(let one-two (Add one two))\n\n(push)\n(run 1)\n;; yay, constant folding works\n(check (= one-two (Num (rational 3 1))))\n;; also, commutativity works\n(check (= (Add two one) one-two))\n(pop)\n\n(push)\n;; rule is like rewrite, but more like an arbitrary query\n;; and actions\n(rule ((Num r))\n ((union one (Div (Num r) (Num r)))))\n;; uh oh, division by zero!\n(run 1)\n\n(pop)\n\n;; we need to detect when things are non-zero\n(function lower-bound (Math) Rational :merge (max old new))\n(function upper-bound (Math) Rational :merge (min old new))\n\n(rule ((Num r))\n ((set (lower-bound (Num r)) r)\n (set (upper-bound (Num r)) r)))\n(rule ((= e (Add a b)))\n ((set (lower-bound e)\n (+ (lower-bound a) (lower-bound b)))))\n(rule ((= e (Add a b)))\n ((set (upper-bound e)\n (+ (upper-bound a) (upper-bound b)))))\n(rule ((= e (Mul a b)))\n ((set (lower-bound e)\n (min (* (lower-bound a) (lower-bound b))\n (min (* (lower-bound a) (upper-bound b))\n (min (* (upper-bound a) (lower-bound b))\n (* (upper-bound a) (upper-bound b))))))\n (set (upper-bound e)\n (max (* (lower-bound a) (lower-bound b))\n (max (* (lower-bound a) (upper-bound b))\n (max (* (upper-bound a) (lower-bound b))\n (* (upper-bound a) (upper-bound b))))))))\n\n(rule ((= e (Add a b))\n (> (lower-bound e) (rational 0 1)))\n ((union one (Div (Add a b) (Add a b)))))\n\n(let x (Var \"x\"))\n(let x1 (Add x one))\n\n(push)\n(set (lower-bound x) (rational 0 1))\n(set (upper-bound x) (rational 1 1))\n\n(run 3)\n\n(query-extract (lower-bound x1))\n(query-extract (upper-bound x1))\n(check (= one (Div x1 x1)))\n\n(pop)\n\n\n;; Set the variable x to a particular input value 200/201\n(set (lower-bound x) (rational 200 201))\n(set (upper-bound x) (rational 200 201))\n\n(run 3)\n\n(query-extract (lower-bound x1))\n(query-extract (upper-bound x1))\n\n(function true-value (Math) f64)\n\n(rule ((= (to-f64 (lower-bound e))\n (to-f64 (upper-bound e))))\n ((set (true-value e)\n (to-f64 (lower-bound e)))))\n\n(run 1)\n(query-extract (true-value x1))\n\n(function best-error (Math) f64 :merge new :default (to-f64 (rational 10000 1)))\n\n(rule ((Num n))\n ((set (best-error (Num n)) (to-f64 n))))\n(rule ((Add a b)) ((best-error (Add a b))))\n\n;; finally, the mega rule for finding more accurate programs\n(rule ((= expr (Add a b))\n (= (best-error a) va)\n (= (best-error b) vb)\n (= true-v (true-value (Add a b)))\n (= computed (+ va vb))\n (< (abs (- computed true-v))\n (best-error (Add a b))))\n ((set (best-error (Add a b)) computed)))\n\n\n\n(push)\n\n(let target\n (Add \n (Add (Num (rational 1 100)) (Num (rational 1 100)))\n (Num (rational -2 100))))\n\n(run 1)\n\n;; set a default\n(best-error target)\n;; error is bad, constant folding hasn't fired enough\n(query-extract (best-error target))\n\n(run 1)\n\n;; error is good, constant folding has fired enough\n(query-extract (best-error target))\n\n\n(pop)", + "herbie": ";; Implements part of the simplification layer of herbie in egglog\ud83e\udee1\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;;\n;; Datatypes\n\n(datatype Math\n ; Ground terms\n (Num Rational)\n (Var String)\n\n ; Custom ops\n (Const String)\n (Unary String Math)\n ; unneeded for now\n ; (Binary String Math Math)\n\n ; Constant-folding ops\n (Add Math Math)\n (Sub Math Math)\n (Mul Math Math)\n (Div Math Math)\n (Pow Math Math)\n (Neg Math)\n (Sqrt Math)\n (Cbrt Math) ; cube root\n (Fabs Math)\n (Ceil Math)\n (Floor Math)\n (Round Math)\n (Log Math))\n\n(let r-zero (rational 0 1))\n(let r-one (rational 1 1))\n(let r-two (rational 2 1))\n(let zero (Num r-zero))\n(let one (Num r-one))\n(let two (Num r-two))\n(let three (Num (rational 3 1)))\n(let neg-one (Neg one))\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;;\n;; Analyses\n;; --------\n;; This example has three analyses:\n;; an interval analysis consisting of a hi and lo component\n;; and a non-zero analysis.\n;; The non-zero analysis is built off the interval analysis (in order to prove\n;; that rewrites are sound, even if some parts of an expr can't be const-evaled)\n\n; TODO: unbounded intervals?\n(function hi (Math) Rational :merge (min old new))\n(function lo (Math) Rational :merge (max old new))\n(relation non-zero (Math))\n\n;; First, constant folding!\n;; We don't need an explicit constant folding analysis, we can just union\n;; with nums when we can\n\n; Cases\n(rewrite (Add (Num a) (Num b)) (Num (+ a b)))\n(rewrite (Sub (Num a) (Num b)) (Num (- a b)))\n(rewrite (Mul (Num a) (Num b)) (Num (* a b)))\n(rewrite (Div (Num a) denom) (Num (/ a b)) :when ((= denom (Num b)) (non-zero denom)))\n(rewrite (Pow (Num a) (Num b)) (Num res) :when ((= res (pow a b))))\n(rewrite (Neg (Num a)) (Num (neg a)))\n;; TODO unimplemented\n;; (rewrite (Sqrt (Num a)) (Num res) :when ((= res (sqrt a))))\n;; (rewrite (Cbrt (Num a)) (Num res) :when ((= res (cbrt a))))\n(rewrite (Fabs (Num a)) (Num (abs a)))\n(rewrite (Ceil (Num a)) (Num (ceil a)))\n(rewrite (Floor (Num a)) (Num (floor a)))\n(rewrite (Round (Num a)) (Num (round a)))\n(rewrite (Log (Num a)) (Num res) :when ((= res (log a))))\n\n;; To check if something is zero, we check that zero is not contained in the\n;; interval. There are two possible (overlapping!) cases:\n;; - There exists a lo interval, in which case it must be larger than 0\n;; - There exists a hi interval, in which case it must be smaller than 0\n;; This assumes that intervals are well-formed: lo <= hi at all times.\n(rule ((= l (lo e))\n (> l r-zero))\n ((non-zero e)))\n(rule ((= h (hi e))\n (< h r-zero))\n ((non-zero e)))\n\n(rule ((= e (Num ve)))\n ((set (lo e) ve)\n (set (hi e) ve)))\n\n;; The interval analyses are similar to the constant-folding analysis,\n;; except we have to take the lower/upper bound of the results we get\n(rule ((= e (Add a b))\n (= la (lo a))\n (= lb (lo b)))\n ((set (lo e) (+ la lb))))\n(rule ((= e (Add a b))\n (= ha (hi a))\n (= hb (hi b)))\n ((set (hi e) (+ ha hb))))\n \n(rule ((= e (Sub a b))\n (= la (lo a))\n (= ha (hi a))\n (= lb (lo b))\n (= hb (hi b)))\n ((set (lo e) \n (min (min (- la lb) (- la hb))\n (min (- ha lb) (- ha hb))))\n (set (hi e) \n (max (max (- la lb) (- la hb))\n (max (- ha lb) (- ha hb))))))\n\n(rule ((= e (Mul a b))\n (= la (lo a))\n (= ha (hi a))\n (= lb (lo b))\n (= hb (hi b)))\n ((set (lo e) \n (min (min (* la lb) (* la hb))\n (min (* ha lb) (* ha hb))))\n (set (hi e) \n (max (max (* la lb) (* la hb))\n (max (* ha lb) (* ha hb))))))\n\n(rule ((= e (Div a b))\n (= la (lo a))\n (= ha (hi a))\n (= lb (lo b))\n (= hb (hi b)))\n ((set (lo e) \n (min (min (/ la lb) (/ la hb))\n (min (/ ha lb) (/ ha hb))))\n (set (hi e) \n (max (max (/ la lb) (/ la hb))\n (max (/ ha lb) (/ ha hb))))))\n\n; TODO: Pow\n\n(rule ((= e (Neg a))\n (= la (lo a))\n (= ha (hi a)))\n ((set (lo e) (neg ha))\n (set (hi e) (neg la))))\n\n; TODO: Sqrt\n; TODO: Cbrt\n\n(rule ((= e (Fabs a))\n (= la (lo a))\n (= ha (hi a)))\n ((set (lo e) (min (abs la) (abs ha)))\n (set (hi e) (max (abs la) (abs ha)))))\n\n(rule ((= e (Ceil a))\n (= la (lo a)))\n ((set (lo e) (ceil la))))\n(rule ((= e (Ceil a))\n (= ha (hi a)))\n ((set (hi e) (ceil ha))))\n\n(rule ((= e (Floor a))\n (= la (lo a)))\n ((set (lo e) (floor la))))\n(rule ((= e (Floor a))\n (= ha (hi a)))\n ((set (hi e) (floor ha))))\n\n(rule ((= e (Round a))\n (= la (lo a)))\n ((set (lo e) (round la))))\n(rule ((= e (Round a))\n (= ha (hi a)))\n ((set (hi e) (round ha))))\n\n; TODO: Log\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;;\n;; Rewrites\n;; --------\n;; These rewrites were compiled from src/syntax/rules.rkt in the herbie repo,\n;; using all rewrites in the `simplify` rewrite group.\n\n;; Commutativity\n(rewrite (Add a b) (Add b a))\n(rewrite (Mul a b) (Mul b a))\n\n;; Associativity\n(rewrite (Add a (Add b c)) (Add (Add a b) c))\n(rewrite (Add (Add a b) c) (Add a (Add b c)))\n(rewrite (Add a (Sub b c)) (Sub (Add a b) c))\n(rewrite (Add (Sub a b) c) (Sub a (Sub b c)))\n(rewrite (Sub a (Add b c)) (Sub (Sub a b) c))\n(rewrite (Sub (Add a b) c) (Add a (Sub b c)))\n(rewrite (Sub (Sub a b) c) (Sub a (Add b c)))\n(rewrite (Sub a (Sub b c)) (Add (Sub a b) c))\n(rewrite (Mul a (Mul b c)) (Mul (Mul a b) c))\n(rewrite (Mul (Mul a b) c) (Mul a (Mul b c)))\n(rewrite (Mul a (Div b c)) (Div (Mul a b) c))\n(rewrite (Mul (Div a b) c) (Div (Mul a c) b))\n(rewrite (Div a (Mul b c)) (Div (Div a b) c))\n(rewrite (Div (Mul b c) a) (Div b (Div a c)) :when ((non-zero c)))\n(rewrite (Div a (Div b c)) (Mul (Div a b) c) :when ((non-zero c)))\n(rewrite (Div (Div b c) a) (Div b (Mul a c)) :when ((non-zero a)))\n\n;; Counting\n(rewrite (Add x x) (Mul two x))\n\n;; Distributivity\n(rewrite (Mul a (Add b c)) (Add (Mul a b) (Mul a c)))\n(rewrite (Mul a (Add b c)) (Add (Mul b a) (Mul c a)))\n(rewrite (Add (Mul a b) (Mul a c)) (Mul a (Add b c)))\n(rewrite (Sub (Mul a b) (Mul a c)) (Mul a (Sub b c)))\n(rewrite (Add (Mul b a) (Mul c a)) (Mul a (Add b c)))\n(rewrite (Sub (Mul b a) (Mul c a)) (Mul a (Sub b c)))\n(rewrite (Add (Mul b a) a) (Mul (Add b one) a))\n(rewrite (Add a (Mul c a)) (Mul (Add c one) a))\n\n(rewrite (Neg (Mul a b)) (Mul (Neg a) b))\n(rewrite (Neg (Mul a b)) (Mul a (Neg b)))\n(rewrite (Mul (Neg a) b) (Neg (Mul a b)))\n(rewrite (Mul a (Neg b)) (Neg (Mul a b)))\n(rewrite (Neg (Add a b)) (Add (Neg a) (Neg b)))\n(rewrite (Add (Neg a) (Neg b)) (Neg (Add a b)))\n(rewrite (Div (Neg a) b) (Neg (Div a b)))\n(rewrite (Neg (Div a b)) (Div (Neg a) b))\n\n(rewrite (Sub a (Mul (Neg b) c)) (Add a (Mul b c)))\n(rewrite (Sub a (Mul b c)) (Add a (Mul (Neg b) c)))\n\n;; Difference of squares\n(rewrite (Mul (Mul a b) (Mul a b)) (Mul (Mul a a) (Mul b b)))\n(rewrite (Mul (Mul a a) (Mul b b)) (Mul (Mul a b) (Mul a b)))\n(rewrite (Sub (Mul a a) (Mul b b)) (Mul (Add a b) (Sub a b)))\n(rewrite (Sub (Mul a a) one) (Mul (Add a one) (Sub a one)))\n(rewrite (Add (Mul a a) (Neg one)) (Mul (Add a one) (Sub a one)))\n(rewrite (Pow a b) (Mul (Pow a (Div b two)) (Pow a (Div b two))))\n(rewrite (Mul (Pow a b) (Pow a b)) (Pow a (Mul two b)))\n\n;; Identity\n;; This isn't subsumed by const folding since this can return results\n;; even if we can't evaluate a precise value for x\n(rewrite (Div one (Div one x))\n x\n :when ((non-zero x)))\n(rewrite (Mul x (Div one x))\n one\n :when ((non-zero x)))\n(rewrite (Mul (Div one x) x)\n one\n :when ((non-zero x)))\n\n(rewrite (Sub x x) zero)\n(rewrite (Div x x) one\n :when ((non-zero x)))\n(rewrite (Div zero x) zero\n :when ((non-zero x)))\n(rewrite (Mul zero x) zero)\n(rewrite (Mul x zero) zero)\n\n(rewrite (Add zero x) x)\n(rewrite (Add x zero) x)\n(rewrite (Sub zero x) (Neg x))\n(rewrite (Sub x zero) x)\n(rewrite (Neg (Neg x)) x)\n(rewrite (Mul one x) x)\n(rewrite (Mul x one) x)\n(rewrite (Div x one) x)\n(rewrite (Mul neg-one x) (Neg x))\n \n(rewrite (Sub a b) (Add a (Neg b)))\n(rewrite (Add a (Neg b)) (Sub a b))\n(rewrite (Neg x) (Sub zero x))\n(rewrite (Neg x) (Mul neg-one x))\n\n(rewrite (Div x y) (Mul x (Div one y)))\n(rewrite (Mul x (Div one y)) (Div x y))\n(rewrite (Div x y) (Div one (Div y x))\n :when ((non-zero x)\n (non-zero y)))\n\n; FIXME: this rule can't be expressed in its full generality;\n; we can't express the general rule x -> 1/x since\n; we can't quantify over Math yet\n; for now we just apply it to vars\n; it's also p slow lmao\n(rewrite (Var x) (Mul one (Var x)))\n\n;; Fractions\n(rewrite (Div (Sub a b) c) (Sub (Div a c) (Div b c)))\n(rewrite (Div (Mul a b) (Mul c d)) (Mul (Div a c) (Div b d)))\n\n;; Square root\n(rewrite (Mul (Sqrt x) (Sqrt x)) x)\n(rewrite (Sqrt (Mul x x)) (Fabs x))\n\n(rewrite (Mul (Neg x) (Neg x)) (Mul x x))\n(rewrite (Mul (Fabs x) (Fabs x)) (Mul x x))\n\n;; Absolute values\n(rewrite (Fabs (Fabs x)) (Fabs x))\n(rewrite (Fabs (Sub a b)) (Fabs (Sub b a)))\n(rewrite (Fabs (Neg x)) (Fabs x))\n(rewrite (Fabs (Mul x x)) (Mul x x))\n(rewrite (Fabs (Mul a b)) (Mul (Fabs a) (Fabs b)))\n(rewrite (Fabs (Div a b)) (Div (Fabs a) (Fabs b)))\n\n;; Cube root\n(rewrite (Pow (Cbrt x) three) x)\n(rewrite (Cbrt (Pow x three)) x)\n(rewrite (Mul (Mul (Cbrt x) (Cbrt x)) (Cbrt x)) x)\n(rewrite (Mul (Cbrt x) (Mul (Cbrt x) (Cbrt x))) x)\n(rewrite (Pow (Neg x) three) (Neg (Pow x three)))\n\n(rewrite (Pow (Mul x y) three)\n (Mul (Pow x three) (Pow y three)))\n(rewrite (Pow (Div x y) three)\n (Div (Pow x three) (Pow y three)))\n \n(rewrite (Pow x three) (Mul x (Mul x x)))\n; FIXME: this rewrite is slow and has the potential to blow up the egraph\n; this is bc this rule and the second-to-last difference of squares rule\n; have some cyclic behavior goin on\n; the last identity rule compounds this behavior\n(rewrite (Mul x (Mul x x)) (Pow x three))\n\n;; Exponentials\n(rewrite (Unary \"exp\" (Log x)) x)\n(rewrite (Log (Unary \"exp\" x)) x)\n\n(rewrite (Unary \"exp\" zero) one)\n(rewrite (Unary \"exp\" one) (Const \"E\"))\n;; (rewrite one (Unary \"exp\" zero))\n(rewrite (Const \"E\") (Unary \"exp\" one))\n\n(rewrite (Unary \"exp\" (Add a b)) (Mul (Unary \"exp\" a) (Unary \"exp\" b)))\n(rewrite (Unary \"exp\" (Sub a b)) (Div (Unary \"exp\" a) (Unary \"exp\" b)))\n(rewrite (Unary \"exp\" (Neg a)) (Div one (Unary \"exp\" a)))\n\n(rewrite (Mul (Unary \"exp\" a) (Unary \"exp\" b)) (Unary \"exp\" (Add a b)))\n(rewrite (Div one (Unary \"exp\" a)) (Unary \"exp\" (Neg a)))\n(rewrite (Div (Unary \"exp\" a) (Unary \"exp\" b)) (Unary \"exp\" (Sub a b)))\n(rewrite (Unary \"exp\" (Mul a b)) (Pow (Unary \"exp\" a) b))\n(rewrite (Unary \"exp\" (Div a two)) (Sqrt (Unary \"exp\" a)))\n(rewrite (Unary \"exp\" (Div a three)) (Cbrt (Unary \"exp\" a)))\n(rewrite (Unary \"exp\" (Mul a two)) (Mul (Unary \"exp\" a) (Unary \"exp\" a)))\n(rewrite (Unary \"exp\" (Mul a three)) (Pow (Unary \"exp\" a) three))\n\n;; Powers\n(rewrite (Pow a neg-one) (Div one a))\n(rewrite (Pow a one) a)\n\n; 0^0 is undefined\n(rewrite (Pow a zero) one :when ((non-zero a)))\n(rewrite (Pow one a) one)\n\n(rewrite (Unary \"Exp\" (Mul (Log a) b)) (Pow a b))\n(rewrite (Mul (Pow a b) a) (Pow a (Add b one)))\n(rewrite (Pow a (Num (rational 1 2))) (Sqrt a))\n(rewrite (Pow a two) (Mul a a))\n(rewrite (Pow a (Num (rational 1 3))) (Cbrt a))\n(rewrite (Pow a three) (Mul (Mul a a) a))\n\n; 0^0 is undefined\n(rewrite (Pow zero a) zero :when ((non-zero a)))\n\n;; Logarithms\n(rewrite (Log (Mul a b)) (Add (Log a) (Log b)))\n(rewrite (Log (Div a b)) (Sub (Log a) (Log b)))\n(rewrite (Log (Div one a)) (Neg (Log a)))\n(rewrite (Log (Pow a b)) (Mul b (Log a)))\n(rewrite (Log (Const \"E\")) one)\n\n;; Trigonometry\n(rewrite (Add (Mul (Unary \"cos\" a) (Unary \"cos\" a)) (Mul (Unary \"sin\" a) (Unary \"sin\" a)))\n one)\n(rewrite (Sub one (Mul (Unary \"cos\" a) (Unary \"cos\" a)))\n (Mul (Unary \"sin\" a) (Unary \"sin\" a)))\n(rewrite (Sub one (Mul (Unary \"sin\" a) (Unary \"sin\" a)))\n (Mul (Unary \"cos\" a) (Unary \"cos\" a)))\n(rewrite (Add (Mul (Unary \"cos\" a) (Unary \"cos\" a)) (Num (rational -1 1))) \n (Neg (Mul (Unary \"sin\" a) (Unary \"sin\" a))))\n(rewrite (Add (Mul (Unary \"sin\" a) (Unary \"sin\" a)) (Num (rational -1 1))) \n (Neg (Mul (Unary \"cos\" a) (Unary \"cos\" a))))\n(rewrite (Sub (Mul (Unary \"cos\" a) (Unary \"cos\" a)) one) \n (Neg (Mul (Unary \"sin\" a) (Unary \"sin\" a))))\n(rewrite (Sub (Mul (Unary \"sin\" a) (Unary \"sin\" a)) one) \n (Neg (Mul (Unary \"cos\" a) (Unary \"cos\" a))))\n(rewrite (Unary \"sin\" (Div (Const \"PI\") (Num (rational 6 1)))) \n (Num (rational 1 2)))\n(rewrite (Unary \"sin\" (Div (Const \"PI\") (Num (rational 4 1)))) \n (Div (Sqrt two) two))\n(rewrite (Unary \"sin\" (Div (Const \"PI\") three)) \n (Div (Sqrt three) two))\n(rewrite (Unary \"sin\" (Div (Const \"PI\") two)) \n one)\n(rewrite (Unary \"sin\" (Const \"PI\")) \n zero)\n(rewrite (Unary \"sin\" (Add x (Const \"PI\"))) \n (Neg (Unary \"sin\" x)))\n(rewrite (Unary \"sin\" (Add x (Div (Const \"PI\") two))) \n (Unary \"cos\" x))\n(rewrite (Unary \"cos\" (Div (Const \"PI\") (Num (rational 6 1)))) \n (Div (Sqrt three) two))\n(rewrite (Unary \"cos\" (Div (Const \"PI\") (Num (rational 4 1)))) \n (Div (Sqrt two) two))\n(rewrite (Unary \"cos\" (Div (Const \"PI\") three)) \n (Num (rational 1 2)))\n(rewrite (Unary \"cos\" (Div (Const \"PI\") two)) \n zero)\n(rewrite (Unary \"cos\" (Const \"PI\")) \n (Num (rational -1 1)))\n(rewrite (Unary \"cos\" (Add x (Const \"PI\"))) \n (Neg (Unary \"cos\" x)))\n(rewrite (Unary \"cos\" (Add x (Div (Const \"PI\") two))) \n (Neg (Unary \"sin\" x)))\n(rewrite (Unary \"tan\" (Div (Const \"PI\") (Num (rational 6 1)))) \n (Div one (Sqrt three)))\n(rewrite (Unary \"tan\" (Div (Const \"PI\") (Num (rational 4 1)))) \n one)\n(rewrite (Unary \"tan\" (Div (Const \"PI\") three)) \n (Sqrt three))\n(rewrite (Unary \"tan\" (Const \"PI\")) \n zero)\n(rewrite (Unary \"tan\" (Add x (Const \"PI\"))) \n (Unary \"tan\" x))\n(rewrite (Unary \"tan\" (Add x (Div (Const \"PI\") two))) \n (Div neg-one (Unary \"tan\" x)))\n(rewrite (Div (Unary \"sin\" a) (Add one (Unary \"cos\" a))) \n (Unary \"tan\" (Div a two)))\n(rewrite (Div (Neg (Unary \"sin\" a)) (Add one (Unary \"cos\" a)))\n (Unary \"tan\" (Div (Neg a) two)))\n(rewrite (Div (Sub one (Unary \"cos\" a)) (Unary \"sin\" a)) \n (Unary \"tan\" (Div a two)))\n(rewrite (Div (Sub one (Unary \"cos\" a)) (Neg (Unary \"sin\" a)))\n (Unary \"tan\" (Div (Neg a) two)))\n(rewrite (Div (Add (Unary \"sin\" a) (Unary \"sin\" b)) (Add (Unary \"cos\" a) (Unary \"cos\" b)))\n (Unary \"tan\" (Div (Add a b) two)))\n(rewrite (Div (Sub (Unary \"sin\" a) (Unary \"sin\" b)) (Add (Unary \"cos\" a) (Unary \"cos\" b)))\n (Unary \"tan\" (Div (Sub a b) two)))\n\n(rewrite (Unary \"sin\" zero) zero)\n(rewrite (Unary \"cos\" zero) one)\n(rewrite (Unary \"tan\" zero) zero)\n\n(rewrite (Unary \"sin\" (Neg x)) (Neg (Unary \"sin\" x)))\n(rewrite (Unary \"cos\" (Neg x)) (Unary \"cos\" x))\n(rewrite (Unary \"tan\" (Neg x)) (Neg (Unary \"cos\" x)))\n\n; Hyperbolics\n(rewrite (Unary \"sinh\" x) (Div (Sub (Unary \"exp\" x) (Unary \"exp\" (Neg x))) two))\n(rewrite (Unary \"cosh\" x) (Div (Add (Unary \"exp\" x) (Unary \"exp\" (Neg x))) two))\n(rewrite (Unary \"tanh\" x) (Div (Sub (Unary \"exp\" x) (Unary \"exp\" (Neg x))) (Add (Unary \"exp\" x) (Unary \"exp\" (Neg x)))))\n(rewrite (Unary \"tanh\" x) (Div (Sub (Unary \"exp\" (Mul two x)) one) (Add (Unary \"exp\" (Mul two x)) one)))\n(rewrite (Unary \"tanh\" x) (Div (Sub one (Unary \"exp\" (Mul (Num (rational -2 1)) x))) (Add one (Unary \"exp\" (Mul (Num (rational -2 1)) x)))))\n(rewrite (Sub (Mul (Unary \"cosh\" x) (Unary \"cosh\" x)) (Mul (Unary \"sinh\" x) (Unary \"sinh\" x))) one)\n(rewrite (Add (Unary \"cosh\" x) (Unary \"sinh\" x)) (Unary \"exp\" x))\n(rewrite (Sub (Unary \"cosh\" x) (Unary \"sinh\" x)) (Unary \"exp\" (Neg x)))\n\n;; Unimplemented: misc. rewrites (conditionals, specialized numerical fns)\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;;\n;; Testing\n;; -------\n;; In actuality, herbie would be responsible for plugging exprs in here.\n;; For our purposes, we take some test cases from herbie\n;; (src/core/simplify.rkt)\n\n(push)\n(let e (Add one zero))\n(run 1)\n(check (= e one))\n(pop)\n\n(push)\n(let five (Num (rational 5 1)))\n(let six (Num (rational 6 1)))\n(let e2 (Add one five))\n(run 1)\n(check (= e2 six))\n(pop)\n\n(let x (Var \"x\"))\n\n(push)\n(let e3 (Add x zero))\n(run 1)\n(check (= e3 x))\n(pop)\n\n(push)\n(let e4 (Sub x zero))\n(run 1)\n(check (= e4 x))\n(pop)\n\n(push)\n\n(let e5 (Mul x one))\n(run 1)\n(check (= e5 x))\n(pop)\n\n(push)\n\n(let e6 (Div x one))\n(run 1)\n(check (= e6 x))\n(pop)\n\n(push)\n\n(let e7 (Sub (Mul one x) (Mul (Add x one) one)))\n(run 3)\n(check (= e7 (Num (rational -1 1))))\n(pop)\n\n(push)\n\n(let e8 (Sub (Add x one) x))\n(run 4)\n(check (= e8 one))\n(pop)\n\n(push)\n\n(let e9 (Sub (Add x one) one))\n(run 4)\n(check (= e9 x))\n(pop)\n\n(push)\n\n(set (lo x) r-one)\n(let e10 (Div (Mul x three) x))\n(run 3)\n(check (= e10 three))\n(pop)\n\n(push)\n\n(let e11 (Sub (Mul (Sqrt (Add x one)) (Sqrt (Add x one))) (Mul (Sqrt x) (Sqrt x))))\n(run 5)\n(check (= one e11))\n(pop)\n\n(push)\n(let e12 (Add (Num (rational 1 5)) (Num (rational 3 10))))\n(run 1)\n(check (= e12 (Num (rational 1 2))))\n(pop)\n\n(push)\n(let e13 (Unary \"cos\" (Const \"PI\")))\n(run 1)\n(check (= e13 (Num (rational -1 1))))\n(pop)\n\n(push)\n(let sqrt5 (Sqrt (Num (rational 5 1))))\n(let e14\n (Div one (Sub (Div (Add one sqrt5) two) (Div (Sub one sqrt5) two))))\n(let tgt (Div one sqrt5))\n(run 6)\n(check (= e14 tgt))\n(pop)", + "i64": "(check (= (to-string 20) \"20\"))\n", + "include": "(include \"tests/path.egg\")\n(check (path 1 3))\n", + "intersection": ";; computes \"e-graph intersection\"\n\n(datatype Expr\n (Var String)\n (f Expr))\n\n(function intersect (Expr Expr) Expr)\n\n(rule (\n (= x3 (intersect x1 x2))\n (= f1 (f x1))\n (= f2 (f x2))\n)(\n (set (intersect f1 f2) (f x3))\n))\n\n(let a1 (Var \"a1\")) (let a2 (Var \"a2\")) (let a3 (Var \"a3\"))\n(let b1 (Var \"b1\")) (let b2 (Var \"b2\")) (let b3 (Var \"b3\"))\n\n;; e-graph 1: f(a) = f(b), f(f(a))\n(let t1 (f (f a1)))\n(let fb1 (f b1))\n(union (f a1) fb1)\n\n;; e-graph 2: f(f(a)) = f(f(b))\n(let t2 (f (f a2)))\n(let t2p (f (f b2)))\n(union t2 t2p)\n\n(set (intersect a1 a2) a3)\n(set (intersect b1 b2) b3)\n\n(run 100)\n\n(let t3 (f (f a3)))\n(query-extract :variants 5 t3)\n\n;; f(f(a)) = f(f(b)) is preserved\n(check (= (f (f a3)) (f (f b3))))\n;; but not f(a) = f(b), it was only in e-graph 1\n(check (!= (f a3) (f b3)))", + "interval": "(datatype Math\n (Num Rational)\n (Var String)\n (Mul Math Math))\n\n(function hi (Math) Rational :merge (min old new))\n(function lo (Math) Rational :merge (max old new))\n\n(rule ((= mul (Mul a b)))\n ((set (lo mul) \n (min (min (* (lo a) (lo b)) (* (lo a) (hi b)))\n (min (* (hi a) (lo b)) (* (hi a) (hi b)))))))\n\n(let x (Var \"x\"))\n(let e (Mul x x))\n\n(set (lo x) (rational -10 1))\n(set (hi x) (rational 10 1))\n\n(run 1)\n\n(check (= (lo e) (rational -100 1)))\n\n(rule ((= mul (Mul a a)))\n ((set (lo mul) (* (lo a) (lo a)))))\n\n(run 1)\n(check (= (lo e) (rational 100 1)))\n\n;; testing extraction of rationals\n(query-extract (lo e))\n", + "knapsack": "(datatype expr \n (Num i64)\n (Add expr expr)\n (Max expr expr))\n(rewrite (Add (Num a) (Num b)) (Num (+ a b)))\n(rewrite (Max (Num a) (Num b)) (Num (max a b)))\n\n; List of (weight, value) pairs\n(datatype objects\n (Cons i64 i64 objects))\n(declare Nil objects)\n\n; Given a capacity and a list of objects, finds the maximum value of a\n; collection of objects whose total weight does not exceed the capacity.\n(function Knap (i64 objects) expr)\n\n(rule ((= f (Knap capacity (Cons weight val rest))) (<= weight capacity))\n ((set (Knap capacity (Cons weight val rest))\n (Max\n (Add (Num val) (Knap (- capacity weight) rest))\n (Knap capacity rest)))))\n\n(rule ((= f (Knap capacity (Cons weight val rest))) (> weight capacity))\n ((set (Knap capacity (Cons weight val rest))\n (Knap capacity rest))))\n\n(rule ((= f (Knap capacity Nil)))\n ((set (Knap capacity Nil) (Num 0))))\n\n(let test1 (Knap 13 (Cons 5 5 (Cons 3 3 (Cons 12 12 (Cons 5 5 Nil))))))\n\n(let test2 (Knap 5 (Cons 6 6 Nil)))\n\n(let test3 (Knap 5 (Cons 1 1 (Cons 1 1 (Cons 1 1 Nil)))))\n\n(let test4 (Knap 15 (Cons 12 40 (Cons 2 20 (Cons 1 20 (Cons 1 10 (Cons 4 100 Nil)))))))\n\n; turn a (Num n) into n\n(function Unwrap (expr) i64)\n(rule ((= x (Num n))) ((set (Unwrap (Num n)) n)))\n\n(run 100)\n\n(check (= test1 (Num 13)))\n\n", + "lambda": ";; NOTE: This file contains several unsafe operations\n(datatype Value (Num i64))\n(declare True Value)\n(declare False Value)\n(datatype VarType)\n(datatype Term\n (Val Value)\n (Var VarType)\n (Add Term Term)\n (Eq Term Term)\n (App Term Term)\n (Lam VarType Term)\n (Let VarType Term Term)\n (Fix VarType Term)\n (If Term Term Term))\n(function V (String) VarType) \n(function From (Term) VarType)\n\n; All free variables are free,\n; but some free variables are more free than others\n; Freer variables will only contain variables\n; that will affect the evaluation\n; of the corresponding term\n; e.g., x is free in x - x, but not freer in x - x\n(sort StringSet (Set VarType))\n(function freer (Term) StringSet :merge (set-intersect old new))\n(rule ((= e (Val v)))\n ((set (freer e) (set-empty))))\n(rule ((= e (Var v)))\n ((set (freer e) (set-insert (set-empty) v))))\n(rule ((= e (Add e1 e2))\n (= (freer e1) fv1)\n (= (freer e2) fv2))\n ((set (freer e) (set-union fv1 fv2))))\n(rule ((= e (Eq e1 e2))\n (= (freer e1) fv1)\n (= (freer e2) fv2))\n ((set (freer e) (set-union fv1 fv2))))\n(rule ((= e (App e1 e2))\n (= (freer e1) fv1)\n (= (freer e2) fv2))\n ((set (freer e) (set-union fv1 fv2))))\n(rule ((= e (Lam var body))\n (= (freer body) fv))\n ((set (freer e) (set-remove fv var))))\n(rule ((= e (Let var e1 e2))\n (= (freer e1) fv1)\n (= (freer e2) fv2))\n ((set (freer e) (set-union (set-remove fv1 var) fv2))))\n(rule ((= e (Fix var body))\n (= (freer body) fv))\n ((set (freer e) (set-remove fv var))))\n(rule ((= e (If c e1 e2))\n (= (freer c) fv1)\n (= (freer e1) fv2)\n (= (freer e2) fv3))\n ((set (freer e) (set-union fv1 (set-union fv2 fv3)))))\n\n;; START evals-to\n(function evals-to (Term) Value)\n\n(rule ((= e (Val val)))\n ((union (evals-to e) val)))\n(rule ((= e (Add a b))\n (= (Num va) (evals-to a))\n (= (Num vb) (evals-to b)))\n ((union (evals-to e) (Num (+ va vb)))))\n(rule ((= e (Eq a b))\n (= (evals-to b) (evals-to a)))\n ((union (evals-to e) True)))\n(rule ((= e (Eq a b))\n (= va (evals-to a))\n (= vb (evals-to b))\n (!= va vb)) ; TODO: if true and false are non-mergeable datatype, \n ; we should be able to do != over it\n ((union (evals-to e) False)))\n(rule ((= v (evals-to e)))\n ((union e (Val v))))\n;; END evals-to\n\n; if-true\n(rewrite (If (Val True) then else) then)\n; if-false\n(rewrite (If (Val False) then else) else)\n; if-elim\n(rule ((= term (If (Eq (Var x) e) then else)))\n ((Let x e then)\n (Let x e else)))\n(rewrite (If (Eq (Var x) e) then else) else\n :when ((= (Let x e then) (Let x e else))))\n\n; add-comm\n(rewrite (Add a b) (Add b a))\n; add-assoc\n(rewrite (Add (Add a b) c) (Add a (Add b c)))\n; eq-comm\n(rewrite (Eq a b) (Eq b a))\n\n; fix\n(rewrite (Fix v e) (Let v (Fix v e) e))\n; beta\n(rewrite (App (Lam v body) e) (Let v e body))\n; let-app\n(rewrite (Let v e (App a b)) (App (Let v e a) (Let v e b)))\n; let-add\n(rewrite (Let v e (Add a b)) (Add (Let v e a) (Let v e b)))\n; let-eq\n(rewrite (Let v e (Eq a b)) (Eq (Let v e a) (Let v e b)))\n; let-const\n(rewrite (Let v e c) c :when ((= const (evals-to c))))\n; let-if\n(rewrite (Let v e (If cond then else)) \n (If (Let v e cond) (Let v e then) (Let v e else)))\n; let-var-same\n(rewrite (Let v1 e (Var v1)) e)\n; let-var-diff\n(rewrite (Let v1 e (Var v2)) (Var v2) :when ((!= v1 v2)))\n; let-lam-same\n(rewrite (Let v1 e (Lam v1 body)) (Lam v1 body))\n; let-lam-diff\n(rewrite (Let v1 e (Lam v2 body)) (Lam v2 (Let v1 e body))\n :when ((!= v1 v2)\n (= fvs (freer e))\n (set-not-contains fvs v2)))\n(rule ((= expr (Let v1 e (Lam v2 body)))\n (!= v1 v2)\n (= fvs (freer e))\n (set-contains fvs v2))\n ((union expr (Lam (From expr) (Let v1 e (Let v2 (Var (From expr)) body))))))\n\n(relation result ())\n\n;; lambda_under\n(push)\n(let e \n (Lam (V \"x\") \n (Add (Val (Num 4))\n (App (Lam (V \"y\") (Var (V \"y\"))) (Val (Num 4))))))\n(run 10)\n(check (= e (Lam (V \"x\") (Val (Num 8)))))\n(pop)\n\n;; lambda_if_elim\n(push)\n(let e2 (If (Eq (Var (V \"a\")) (Var (V \"b\")))\n (Add (Var (V \"a\")) (Var (V \"a\")))\n (Add (Var (V \"a\")) (Var (V \"b\")))))\n(run 10)\n(check (= e2 (Add (Var (V \"a\")) (Var (V \"b\")))))\n(pop)\n\n;; lambda_let_simple\n(push)\n(let e3 (Let (V \"x\") (Val (Num 0))\n (Let (V \"y\") (Val (Num 1))\n (Add (Var (V \"x\")) (Var (V \"y\"))))))\n(run 10)\n(check (= e3 (Val (Num 1))))\n(pop)\n\n;; lambda_capture\n(push)\n(let e4 (Let (V \"x\") (Val (Num 1)) \n (Lam (V \"x\") (Var (V \"x\")))))\n(run 10)\n(fail (check (= e4 (Lam (V \"x\") (Val (Num 1))))))\n(pop)\n\n;; lambda_capture_free\n(push)\n(let e5 (Let (V \"y\") (Add (Var (V \"x\")) (Var (V \"x\"))) \n (Lam (V \"x\") (Var (V \"y\")))))\n(run 10)\n(check (set-contains (freer (Lam (V \"x\") (Var (V \"y\")))) (V \"y\")))\n(fail (check (= e5 (Lam (V \"x\") (Add (Var (V \"x\")) (Var (V \"x\")))))))\n(pop)\n\n;; lambda_closure_not_seven\n(push)\n(let e6\n (Let (V \"five\") (Val (Num 5))\n (Let (V \"add-five\") (Lam (V \"x\") (Add (Var (V \"x\")) (Var (V \"five\"))))\n (Let (V \"five\") (Val (Num 6))\n (App (Var (V \"add-five\")) (Val (Num 1)))))))\n(run 10)\n(fail (check (= e6 (Val (Num 7)))))\n(check (= e6 (Val (Num 6))))\n(pop)\n\n\n;; lambda_compose\n(push)\n(let e7\n (Let (V \"compose\") (Lam (V \"f\") \n (Lam (V \"g\") \n (Lam (V \"x\") (App (Var (V \"f\"))\n (App (Var (V \"g\")) \n (Var (V \"x\")))))))\n (Let (V \"add1\") (Lam (V \"y\") (Add (Var (V \"y\")) (Val (Num 1))))\n (App (App (Var (V \"compose\")) (Var (V \"add1\"))) (Var (V \"add1\"))))))\n(run 20)\n\n(rule (\n (= goal1 (Lam x (Add (Val (Num 1))\n (App (Lam y (Add (Val (Num 1)) (Var y)))\n (Var x)))))\n (= goal2 (Lam x (Add (Var x) (Val (Num 2)))))\n)(\n (result)\n))\n(run 1)\n(check (result))\n(pop)\n\n;; lambda_if_simple\n(push)\n(let e10 (If (Eq (Val (Num 1)) (Val (Num 1))) (Val (Num 7)) (Val (Num 9))))\n(run 4)\n(check (= e10 (Val (Num 7))))\n(pop)\n\n;; lambda_compose_many\n(push)\n(let e11\n (Let (V \"compose\") (Lam (V \"f\") (Lam (V \"g\") (Lam (V \"x\") (App (Var (V \"f\"))\n (App (Var (V \"g\")) (Var (V \"x\")))))))\n (Let (V \"add1\") (Lam (V \"y\") (Add (Var (V \"y\")) (Val (Num 1))))\n (App (App (Var (V \"compose\")) (Var (V \"add1\")))\n (App (App (Var (V \"compose\")) (Var (V \"add1\")))\n (App (App (Var (V \"compose\")) (Var (V \"add1\")))\n (App (App (Var (V \"compose\")) (Var (V \"add1\")))\n (App (App (Var (V \"compose\")) (Var (V \"add1\")))\n (App (App (Var (V \"compose\")) (Var (V \"add1\")))\n (Var (V \"add1\")))))))))))\n\n(run 30)\n(rule (\n (= e11 (Lam x (Add (Var x) (Val (Num 7)))))\n)(\n (result)\n))\n(run 1)\n(check (result))\n(pop)\n\n;; lambda_if\n(push)\n(let e8\n (Let (V \"zeroone\") (Lam (V \"x\")\n (If (Eq (Var (V \"x\")) (Val (Num 0)))\n (Val (Num 0))\n (Val (Num 1))))\n (Add (App (Var (V \"zeroone\")) (Val (Num 0)))\n (App (Var (V \"zeroone\")) (Val (Num 10)))))\n)\n(run 20)\n(check (= e8 (Val (Num 1))))\n(pop)\n", + "levenshtein-distance": "; Datatypes\n\n(datatype expr \n (Num i64)\n (Add expr expr)\n (Min expr expr expr))\n(rewrite (Add (Num a) (Num b)) (Num (+ a b)))\n(rewrite (Min (Num a) (Num b) (Num c)) (Num (min (min a b) c)))\n\n; `String` supports limited operations, let's just use it as a char type\n(datatype str\n (Cons String str))\n(declare Empty str)\n\n; Length function\n\n(function Length (str) expr)\n\n(rule ((= f (Length Empty)))\n ((set (Length Empty) (Num 0))))\n\n(rule ((= f (Length (Cons c cs))))\n ((set (Length (Cons c cs)) (Add (Num 1) (Length cs)))))\n\n; EditDist function\n\n(function EditDist (str str) expr)\n\n(rule ((= f (EditDist Empty s)))\n ((set (EditDist Empty s) (Length s))))\n\n(rule ((= f (EditDist s Empty)))\n ((set (EditDist s Empty) (Length s))))\n\n(rule ((= f (EditDist (Cons head rest1) (Cons head rest2))))\n ((set (EditDist (Cons head rest1) (Cons head rest2))\n (EditDist rest1 rest2))))\n\n(rule ((= f (EditDist (Cons head1 rest1) (Cons head2 rest2))) (!= head1 head2))\n ((set (EditDist (Cons head1 rest1) (Cons head2 rest2))\n (Add (Num 1)\n (Min (EditDist rest1 rest2)\n (EditDist (Cons head1 rest1) rest2)\n (EditDist rest1 (Cons head2 rest2)))))))\n\n; Unwrap function - turn a (Num n) into n\n\n(function Unwrap (expr) i64)\n(rule ((= x (Num n))) ((set (Unwrap (Num n)) n)))\n\n; Tests\n(let HorseStr (Cons \"h\" (Cons \"o\" (Cons \"r\" (Cons \"s\" (Cons \"e\" Empty))))))\n(let RosStr (Cons \"r\" (Cons \"o\" (Cons \"s\" Empty))))\n(let IntentionStr (Cons \"i\" (Cons \"n\" (Cons \"t\" (Cons \"e\" (Cons \"n\" (Cons \"t\" (Cons \"i\" (Cons \"o\" (Cons \"n\" Empty))))))))))\n(let ExecutionStr (Cons \"e\" (Cons \"x\" (Cons \"e\" (Cons \"c\" (Cons \"u\" (Cons \"t\" (Cons \"i\" (Cons \"o\" (Cons \"n\" Empty))))))))))\n\n(let Test1 (EditDist HorseStr RosStr))\n(let Test2 (EditDist IntentionStr ExecutionStr))\n(let Test3 (EditDist HorseStr Empty))\n\n(run 100)\n\n(extract (Unwrap Test1))\n(check (= Test1 (Num 3)))\n\n(extract (Unwrap Test2))\n(check (= Test2 (Num 5)))\n\n(extract (Unwrap Test3))\n(check (= Test3 (Num 5)))", + "map": "(sort MyMap (Map i64 String))\n\n(let my_map1 (map-insert (map-empty) 1 \"one\"))\n(let my_map2 (map-insert my_map1 2 \"two\"))\n\n(check (= \"one\" (map-get my_map1 1)))\n(query-extract my_map2)", + "math-microbenchmark": "(datatype Math\n (Diff Math Math)\n (Integral Math Math)\n \n (Add Math Math)\n (Sub Math Math)\n (Mul Math Math)\n (Div Math Math)\n (Pow Math Math)\n (Ln Math)\n (Sqrt Math)\n \n (Sin Math)\n (Cos Math)\n \n (Const Rational)\n (Var String))\n\n(rewrite (Add a b) (Add b a))\n(rewrite (Mul a b) (Mul b a))\n(rewrite (Add a (Add b c)) (Add (Add a b) c))\n(rewrite (Mul a (Mul b c)) (Mul (Mul a b) c))\n\n(rewrite (Sub a b) (Add a (Mul (Const (rational -1 1)) b)))\n;; (rewrite (Div a b) (Mul a (Pow b (Const (rational -1 1)))) :when ((is-not-zero b)))\n\n(rewrite (Add a (Const (rational 0 1))) a)\n(rewrite (Mul a (Const (rational 0 1))) (Const (rational 0 1)))\n(rewrite (Mul a (Const (rational 1 1))) a)\n\n(rewrite (Sub a a) (Const (rational 0 1)))\n\n(rewrite (Mul a (Add b c)) (Add (Mul a b) (Mul a c)))\n(rewrite (Add (Mul a b) (Mul a c)) (Mul a (Add b c)))\n\n(rewrite (Mul (Pow a b) (Pow a c)) (Pow a (Add b c)))\n(rewrite (Pow x (Const (rational 1 1))) x)\n(rewrite (Pow x (Const (rational 2 1))) (Mul x x))\n\n(rewrite (Diff x (Add a b)) (Add (Diff x a) (Diff x b)))\n(rewrite (Diff x (Mul a b)) (Add (Mul a (Diff x b)) (Mul b (Diff x a))))\n\n(rewrite (Diff x (Sin x)) (Cos x))\n(rewrite (Diff x (Cos x)) (Mul (Const (rational -1 1)) (Sin x)))\n\n(rewrite (Integral (Const (rational 1 1)) x) x)\n(rewrite (Integral (Cos x) x) (Sin x))\n(rewrite (Integral (Sin x) x) (Mul (Const (rational -1 1)) (Cos x)))\n(rewrite (Integral (Add f g) x) (Add (Integral f x) (Integral g x)))\n(rewrite (Integral (Sub f g) x) (Sub (Integral f x) (Integral g x)))\n(rewrite (Integral (Mul a b) x) \n(Sub (Mul a (Integral b x)) \n (Integral (Mul (Diff x a) (Integral b x)) x)))\n(Integral (Ln (Var \"x\")) (Var \"x\"))\n(Integral (Add (Var \"x\") (Cos (Var \"x\"))) (Var \"x\"))\n(Integral (Mul (Cos (Var \"x\")) (Var \"x\")) (Var \"x\"))\n(Diff (Var \"x\") (Add (Const (rational 1 1)) (Mul (Const (rational 2 1)) (Var \"x\"))))\n(Diff (Var \"x\") (Sub (Pow (Var \"x\") (Const (rational 3 1))) (Mul (Const (rational 7 1)) (Pow (Var \"x\") (Const (rational 2 1))))))\n(Add (Mul (Var \"y\") (Add (Var \"x\") (Var \"y\"))) (Sub (Add (Var \"x\") (Const (rational 2 1))) (Add (Var \"x\") (Var \"x\"))))\n(Div (Const (rational 1 1))\n (Sub (Div (Add (Const (rational 1 1))\n (Sqrt (Var \"five\")))\n (Const (rational 2 1)))\n (Div (Sub (Const (rational 1 1))\n (Sqrt (Var \"five\")))\n (Const (rational 2 1)))))\n(run 10)\n(print-size Add)\n(print-size Mul)\n", + "math": "(datatype Math\n (Diff Math Math)\n (Integral Math Math)\n \n (Add Math Math)\n (Sub Math Math)\n (Mul Math Math)\n (Div Math Math)\n (Pow Math Math)\n (Ln Math)\n (Sqrt Math)\n \n (Sin Math)\n (Cos Math)\n \n (Const Rational)\n (Var String))\n\n(relation MathU (Math))\n(rule ((= e (Diff x y))) ((MathU e)))\n(rule ((= e (Integral x y))) ((MathU e)))\n(rule ((= e (Add x y))) ((MathU e)))\n(rule ((= e (Sub x y))) ((MathU e)))\n(rule ((= e (Mul x y))) ((MathU e)))\n(rule ((= e (Div x y))) ((MathU e)))\n(rule ((= e (Pow x y))) ((MathU e)))\n(rule ((= e (Ln x))) ((MathU e)))\n(rule ((= e (Sqrt x))) ((MathU e)))\n(rule ((= e (Sin x))) ((MathU e)))\n(rule ((= e (Cos x))) ((MathU e)))\n(rule ((= e (Const x))) ((MathU e)))\n(rule ((= e (Var x))) ((MathU e)))\n\n(relation evals-to (Math Rational))\n\n(rule ((= e (Const c))) ((evals-to e c)))\n(rule ((= e (Add a b)) (evals-to a va) (evals-to b vb))\n ((evals-to e (+ va vb))))\n(rule ((= e (Sub a b)) (evals-to a va) (evals-to b vb))\n ((evals-to e (- va vb))))\n(rule ((= e (Mul a b)) (evals-to a va) (evals-to b vb))\n ((evals-to e (* va vb))))\n(rule ((= e (Div a b)) (evals-to a va) (evals-to b vb) (!= vb (rational 0 1)))\n ((evals-to e (/ va vb))))\n(rule ((evals-to x vx)) ((union x (Const vx))))\n\n(relation is-const (Math))\n(rule ((evals-to a va)) ((is-const a)))\n\n(relation is-sym (Math))\n(rule ((= e (Var s))) ((is-sym e)))\n\n(relation is-not-zero (Math))\n(rule ((evals-to x vx)\n (!= vx (rational 0 1)))\n ((is-not-zero x)))\n\n(relation is-const-or-distinct-var-demand (Math Math))\n(relation is-const-or-distinct-var (Math Math))\n(rule ((is-const-or-distinct-var-demand v w)\n (is-const v))\n ((is-const-or-distinct-var v w)))\n(rule ((is-const-or-distinct-var-demand v w)\n (= v (Var vv))\n (= w (Var vw))\n (!= vv vw))\n ((is-const-or-distinct-var v w)))\n\n(rewrite (Add a b) (Add b a))\n(rewrite (Mul a b) (Mul b a))\n(rewrite (Add a (Add b c)) (Add (Add a b) c))\n(rewrite (Mul a (Mul b c)) (Mul (Mul a b) c))\n\n(rewrite (Sub a b) (Add a (Mul (Const (rational -1 1)) b)))\n(rewrite (Div a b) (Mul a (Pow b (Const (rational -1 1)))) :when ((is-not-zero b)))\n\n(rewrite (Add a (Const (rational 0 1))) a)\n(rewrite (Mul a (Const (rational 0 1))) (Const (rational 0 1)))\n(rewrite (Mul a (Const (rational 1 1))) a)\n\n;; NOTE: these two rules are different from math.rs, as math.rs does pruning\n(rule ((MathU a) (!= a (Const (rational 0 1)))) ((union a (Add a (Const (rational 0 1))))))\n(rule ((MathU a) (!= a (Const (rational 1 1)))) ((union a (Mul a (Const (rational 1 1))))))\n\n(rewrite (Sub a a) (Const (rational 0 1)))\n(rewrite (Div a a) (Const (rational 1 1)) :when ((is-not-zero a)))\n\n(rewrite (Mul a (Add b c)) (Add (Mul a b) (Mul a c)))\n(rewrite (Add (Mul a b) (Mul a c)) (Mul a (Add b c)))\n\n(rewrite (Mul (Pow a b) (Pow a c)) (Pow a (Add b c)))\n(rewrite (Pow x (Const (rational 0 1))) (Const (rational 1 1)) :when ((is-not-zero x)))\n(rewrite (Pow x (Const (rational 1 1))) x)\n(rewrite (Pow x (Const (rational 2 1))) (Mul x x))\n(rewrite (Pow x (Const (rational -1 1))) (Div (Const (rational 1 1)) x) :when ((is-not-zero x)))\n(rewrite (Mul x (Div (Const (rational 1 1)) x)) (Const (rational 1 1)) :when ((is-not-zero x)))\n\n(rewrite (Diff x x) (Const (rational 1 1)) :when ((is-sym x)))\n(rule ((= e (Diff x c))\n (is-sym x))\n ((is-const-or-distinct-var-demand c x)))\n(rewrite (Diff x c) (Const (rational 0 1)) :when ((is-sym x) (is-const-or-distinct-var c x)))\n\n(rewrite (Diff x (Add a b)) (Add (Diff x a) (Diff x b)))\n(rewrite (Diff x (Mul a b)) (Add (Mul a (Diff x b)) (Mul b (Diff x a))))\n\n(rewrite (Diff x (Sin x)) (Cos x))\n(rewrite (Diff x (Cos x)) (Mul (Const (rational -1 1)) (Sin x)))\n\n(rewrite (Diff x (Ln x)) (Div (Const (rational 1 1)) x) :when ((is-not-zero x)))\n\n(rewrite (Diff x (Pow f g))\n (Mul (Pow f g) \n (Add (Mul (Diff x f) (Div g f)) \n (Mul (Diff x g) (Ln f)))) \n :when ((is-not-zero f) \n (is-not-zero g)))\n\n(rewrite (Integral (Const (rational 1 1)) x) x)\n(rewrite (Integral (Pow x c) x)\n (Div (Pow x (Add c (Const (rational 1 1)))) (Add c (Const (rational 1 1)))) \n :when ((is-const c)))\n(rewrite (Integral (Cos x) x) (Sin x))\n(rewrite (Integral (Sin x) x) (Mul (Const (rational -1 1)) (Cos x)))\n(rewrite (Integral (Add f g) x) (Add (Integral f x) (Integral g x)))\n(rewrite (Integral (Sub f g) x) (Sub (Integral f x) (Integral g x)))\n(rewrite (Integral (Mul a b) x) \n (Sub (Mul a (Integral b x)) \n (Integral (Mul (Diff x a) (Integral b x)) x)))\n\n\n(let start-expr2 (Add (Const (rational 1 1))\n (Sub (Var \"a\") \n (Mul (Sub (Const (rational 2 1)) \n (Const (rational 1 1))) \n (Var \"a\")))))\n\n(run 6)\n\n(let end-expr2 (Const (rational 1 1)))\n\n(check (= start-expr2 end-expr2))\n\n(query-extract start-expr2)", + "matrix": "\n(datatype Dim (Times Dim Dim) (NamedDim String) (Lit i64))\n\n(rewrite (Times a (Times b c)) (Times (Times a b) c))\n(rewrite (Times (Times a b) c) (Times a (Times b c)) )\n(rewrite (Times (Lit i) (Lit j)) (Lit (* i j)))\n(rewrite (Times a b) (Times b a))\n\n(datatype MExpr\n (MMul MExpr MExpr)\n (Kron MExpr MExpr)\n (NamedMat String)\n (Id Dim)\n ; DSum\n ; HStack\n ; VStack\n ; Transpose\n ; Inverse\n ; Zero Math Math\n ; ScalarMul\n)\n\n; alternative encoding (type A) = (Matrix n m) may be more useful for \"large story example\"\n(function nrows (MExpr) Dim)\n(function ncols (MExpr) Dim)\n\n(rewrite (nrows (Kron A B)) (Times (nrows A) (nrows B)))\n(rewrite (ncols (Kron A B)) (Times (ncols A) (ncols B)))\n\n(rewrite (nrows (MMul A B)) (nrows A))\n(rewrite (ncols (MMul A B)) (ncols B))\n\n(rewrite (nrows (Id n)) n)\n(rewrite (ncols (Id n)) n)\n\n(rewrite (MMul (Id n) A) A)\n(rewrite (MMul A (Id n)) A)\n\n(rewrite (MMul A (MMul B C)) (MMul (MMul A B) C))\n(rewrite (MMul (MMul A B) C) (MMul A (MMul B C)))\n\n(rewrite (Kron A (Kron B C)) (Kron (Kron A B) C))\n(rewrite (Kron (Kron A B) C) (Kron A (Kron B C)))\n\n(rewrite (Kron (MMul A C) (MMul B D)) (MMul (Kron A B) (Kron C D)))\n\n\n(rewrite (MMul (Kron A B) (Kron C D))\n (Kron (MMul A C) (MMul B D))\n :when\n ((= (ncols A) (nrows C))\n (= (ncols B) (nrows D)))\n)\n\n; demand\n(rule ((= e (MMul A B)))\n((ncols A)\n(nrows A)\n(ncols B)\n(nrows B))\n)\n\n(rule ((= e (Kron A B)))\n((ncols A)\n(nrows A)\n(ncols B)\n(nrows B))\n)\n\n\n(let n (NamedDim \"n\"))\n(let m (NamedDim \"m\"))\n(let p (NamedDim \"p\"))\n\n(let A (NamedMat \"A\"))\n(let B (NamedMat \"B\"))\n(let C (NamedMat \"C\"))\n\n(set (nrows A) n)\n(set (ncols A) n)\n(set (nrows B) m)\n(set (ncols B) m)\n(set (nrows C) p)\n(set (ncols C) p)\n(let ex1 (MMul (Kron (Id n) B) (Kron A (Id m))))\n(let rows1 (nrows ex1))\n(let cols1 (ncols ex1))\n\n(run 20)\n\n(check (= (nrows B) m))\n(check (= (nrows (Kron (Id n) B)) (Times n m)))\n(let simple_ex1 (Kron A B))\n(check (= ex1 simple_ex1))\n\n(let ex2 (MMul (Kron (Id p) C) (Kron A (Id m))))\n(run 10)\n(fail (check (= ex2 (Kron A C))))\n", + "merge-during-rebuild": "; This file tests that non-union merges can be triggered during rebuilds as well\n; as \"inline\" during a set action. See issue #42\n\n(datatype N (Node i64))\n(function distance (N N) i64 :merge (min old new))\n\n(let a (Node 0))\n(let b (Node 1))\n(let x (Node 2))\n(let y (Node 3))\n(set (distance x y) 1)\n(set (distance a b) 2)\n\n(union a x)\n(union b y)\n\n(run 1)\n(check (= (distance x y) 1)) ; fails, the distance has gone up!\n", + "merge-saturates": ";; SKIP_PROOFS\n;; doesn't work with proofs because of the side effect in\n;; the merge function\n(function foo () i64 :merge (min old new))\n\n(set (foo) 0)\n\n; This should break at iteration 0 because the merge doesn't cause any updates\n(rule ((= f (foo))) ((set (foo) 1)))\n(run 100)\n\n\n; This should run for about 50 iterations, because even though the merge doesn't\n; change the value of baz, it has a side effect of expanding the domain of bar.\n\n(function baz (i64) i64 :default 0)\n\n(function bar () i64 :merge (min (baz new) 0))\n\n(set (bar) 1)\n(set (bar) 2)\n\n(rule ((= f (baz x)) (< x 50))\n ((set (bar) (+ x 1))))\n\n(run 100)\n(check (= 0 (baz 50)))\n", + "name-resolution": "(datatype Math\n (Add Math Math)\n (Num i64))\n \n(let zero (Num 0))\n\n\n;; zero here refers to the function/constant zero, not a free variable\n(rewrite (Add zero x) x)\n\n(let a (Add (Num 0) (Num 3)))\n(let b (Add (Num 7) (Num 9)))\n(let c (Num 16))\n(union b c)\n\n;; crash if we merge two numbers\n(rule (\n (= (Num x) (Num y))\n (!= x y)\n)(\n (panic \"ahhh\")\n))\n \n \n(run 10)", + "path-union": "(datatype Node\n (mk i64))\n\n(relation edge (Node Node))\n(relation path (Node Node))\n \n(rule ((edge x y))\n ((path x y)))\n\n(rule ((path x y) (edge y z))\n ((path x z)))\n\n(edge (mk 1) (mk 2))\n(edge (mk 2) (mk 3))\n(edge (mk 5) (mk 6))\n\n(union (mk 3) (mk 5))\n\n(run 10)\n(check (edge (mk 3) (mk 6)))\n(check (path (mk 1) (mk 6)))", + "path": "(relation path (i64 i64))\n(relation edge (i64 i64))\n\n(rule ((edge x y))\n ((path x y)))\n\n(rule ((path x y) (edge y z))\n ((path x z)))\n \n(edge 1 2)\n(edge 2 3)\n(edge 3 4)\n(check (edge 1 2))\n(fail (check (path 1 2)))\n(run 3)\n\n(print-table path)\n(check (path 1 4))\n(fail (check (path 4 1)))\n", + "pathproof": "; proofs of connectivity are paths\n(datatype Proof\n (Trans i64 Proof)\n (Edge i64 i64))\n\n; We enhance the path relation to carry a proof field\n(relation path (i64 i64 Proof))\n(relation edge (i64 i64))\n\n(edge 2 1)\n(edge 3 2)\n(edge 1 3)\n\n(rule ((edge x y)) \n ((path x y (Edge x y))))\n(rule ((edge x y) (path y z p)) \n ((path x z (Trans x p))))\n\n; We consider equal all paths tha connect same points.\n; Smallest Extraction will extract shortest path.\n(rule ((path x y p1) (path x y p2)) \n ((union p1 p2)))\n\n(run 3)\n(check (path 3 1 (Trans 3 (Edge 2 1))))\n; Would prefer being able to check\n;(check (path 1 2 _))\n; or extract\n;(query-extract (path 1 4 ?p))\n(print-table path)", + "points-to": "; Identifiers represented as strings, keep some newtypes around to aid clarity\n(datatype ClassT (Class String))\n(datatype FieldT (Field String))\n\n(datatype Stmt\n (New String ClassT)\n ; Assign dst src\n (Assign String String)\n ; Store dst field src\n (Store String FieldT String)\n ; Load dst src field\n (Load String String FieldT))\n\n(relation VarPointsTo (String ClassT))\n(relation HeapPointsTo (ClassT FieldT ClassT))\n\n; New variables point to classes they're initialized as\n(rule ((= x (New a b))) ((VarPointsTo a b)))\n\n; If I assign v1 <- v2 and v2 points to a class c2, then v1 points to class c2\n; as well\n(rule ((= x (Assign v1 v2)) (VarPointsTo v2 c2))\n ((VarPointsTo v1 c2)))\n\n; If c1.f points to c2, and v2 points to class c1, then assigning v1 <- v2.f\n; means v1 points to c2\n(rule ((= x (Load v1 v2 f)) \n (VarPointsTo v2 c1)\n (HeapPointsTo c1 f c2))\n ((VarPointsTo v1 c2)))\n\n; If v1 points to class c1, and v2 to c2, and if v1.f <- v2, then c1.f points to\n; c2\n(rule ((= x (Store v1 f v2))\n (VarPointsTo v1 c1)\n (VarPointsTo v2 c2))\n ((HeapPointsTo c1 f c2)))\n\n; Example in \"From Datalog to Flix\"\n; l1: ClassA o1 = new ClassA();\n; l2: ClassB o2 = new ClassB();\n; l3: ClassB o3 = o2;\n; l4: o2.f = o1;\n; l5: Object r = o3.f;\n\n(let A (Class \"A\"))\n(let B (Class \"B\"))\n(let f (Field \"f\"))\n\n(let l1 (New \"o1\" A))\n(let l2 (New \"o2\" B))\n(let l3 (Assign \"o3\" \"o2\"))\n(let l4 (Store \"o2\" f \"o1\"))\n(let l5 (Load \"r\" \"o3\" f))\n\n(run 3)\n\n(check (VarPointsTo \"o1\" A))\n(check (VarPointsTo \"o2\" B))\n\n(check (VarPointsTo \"o3\" B))\n(check (HeapPointsTo B f A))\n(check (VarPointsTo \"r\" A))", + "primitives": "(check (= (+ 2 2) 4))\n(check (= (- 2 1) 1))\n(check (= (- 1 2) -1))\n(check (< 1 2))\n(check (> 1 -2))", + "prims": "; A nasty, imperative implementation of Prim's algorithm... in egglog!\n; https://en.wikipedia.org/wiki/Prim%27s_algorithm\n\n; Weighted edge (vertex 1 * vertex 2 * weight)\n(datatype edge (Edge i64 i64 i64))\n(relation edge-exists (edge))\n\n(relation true ())\n(true)\n(let infinity 99999999) ; close enough\n\n; ==== PROBLEM INSTANCES ====\n\n; Graph 1\n; (1)--2--(2)\n; \\ |\n; 1 2\n; \\ |\n; (3)--3--(4)\n(ruleset graph1)\n(rule ((true))\n ((edge-exists (Edge 1 2 2))\n (edge-exists (Edge 1 4 1))\n (edge-exists (Edge 2 4 2))\n (edge-exists (Edge 3 4 3)))\n :ruleset graph1)\n\n; Graph 2\n; (1)-2-(2) (3)\n; |\\ /| / |\n; | 3 5 | 4 |\n; 5 X 2 / 5\n; | / \\ |/ |\n; (4)-4-(5)-7-(6)\n(ruleset graph2)\n(rule ((true))\n ((edge-exists (Edge 1 2 1))\n (edge-exists (Edge 1 4 5))\n (edge-exists (Edge 1 5 3))\n (edge-exists (Edge 2 4 5))\n (edge-exists (Edge 2 5 2))\n (edge-exists (Edge 3 5 4))\n (edge-exists (Edge 3 6 5))\n (edge-exists (Edge 4 5 4))\n (edge-exists (Edge 5 6 7)))\n :ruleset graph2)\n\n; ==== \"INIT\" RULESET ====\n\n(ruleset init)\n\n; Graph is undirected\n(rule ((= e (Edge x y weight)))\n ((union e (Edge y x weight)))\n :ruleset init)\n\n; Whether a vertex is included *so far* (this changes). Returns 0 or 1.\n(function vertex-included (i64) i64 :merge (max old new))\n\n; All vertices default to being not included (note vertex-included's :merge)\n(rule ((edge-exists (Edge x y weight)))\n ((set (vertex-included x) 0))\n :ruleset init)\n\n; Keep track of the current iteration\n(function current-iteration () i64 :merge (max old new))\n\n; Map iteration to best edge found so far\n(function iteration-to-best-edge (i64) edge :merge new)\n(function iteration-to-best-edge-weight (i64) i64 :merge new)\n\n(rule ((true))\n ((set (vertex-included 1) 1) ; Initially just include vertex 1\n (set (current-iteration) 0)\n (set (iteration-to-best-edge-weight 0) infinity))\n :ruleset init)\n\n; === \"CHOOSE BEST EDGE\" RULESET ===\n\n(relation edge-in-mst (edge)) ; whether an edge is in our solution\n\n(ruleset choose-best-edge)\n(rule ((= i (current-iteration))\n (edge-exists (Edge x y weight))\n (= 1 (vertex-included x))\n (= 0 (vertex-included y))\n (< weight (iteration-to-best-edge-weight i)))\n ((set (iteration-to-best-edge-weight i) weight)\n (set (iteration-to-best-edge i) (Edge x y weight)))\n :ruleset choose-best-edge)\n\n; === \"FINISH ITERATION\" RULESET ===\n\n(ruleset finish-iteration)\n(rule ((= i (current-iteration))\n (= (Edge x y weight) (iteration-to-best-edge i)))\n ((edge-in-mst (Edge x y weight)) ; incorporate chosen best edge\n (set (vertex-included x) 1) ; mark its vertices as included\n (set (vertex-included y) 1)\n (set (current-iteration) (+ i 1)) ; advance iteration\n (set (iteration-to-best-edge-weight (+ i 1)) infinity))\n :ruleset finish-iteration)\n\n; === RUN VIA SCHEDULE ===\n\n(run-schedule\n (saturate init graph1) ; change to graph2 to see other example\n (saturate (saturate choose-best-edge) finish-iteration)\n)\n\n; === PRINT RESULTS ===\n\n; (print-table edge-in-mst) ; this is not very helpful\n\n; Just copy canonical edges to solution\n(relation solution (i64 i64 i64))\n\n(ruleset finalize)\n(rule ((edge-in-mst (Edge x y weight)) (< x y))\n ((solution x y weight))\n :ruleset finalize)\n(run-schedule (saturate finalize))\n\n(print-table solution) ; this is better\n", + "push-pop": "(function foo () i64 :merge (max old new))\n\n(set (foo) 1)\n(check (= (foo) 1))\n\n(push)\n(set (foo) 2)\n(check (= (foo) 2))\n(pop)\n\n(check (= (foo) 1))", + "resolution": "; Resolution theorem proving\n; \n; Traditional resolution theorem provers maintain a clause database\n; of formulas in Conjunction Normal Form (CNF a big And of Ors).\n; Each clause is a set of positive and negative literals\n; The prover saturates this set by taking two clauses \n; {a}\\/c1 {not a}\\/c2 and creating a new clause c1 \\/ c2.\n; Clauses also are pruned by simplications, unit propagation,\n; and subsumption.\n; These systems use sophisticated term indexing to find matching clauses\n\n; A natural question is whether egglog's saturation and term indexing gives\n; a leg up towards building one of these systems. A programmable one even,\n; with built in support for equality reasoning\n\n; Resolution is provided by a join\n; unit propagation is an equation solving process and egraph substitution\n; Clause Simplification is provided by rewrite rules\n\n; This encoding seems about right but is unsatisfying\n; Using AC to encode the set nature of clauses is inefficient\n\n; An important aspect of these provers that seems challenging to encode shallowly\n; is that the match also occurs modulo _unification_.\n; The unification variables of each clause are not globally scoped, really\n; they are scoped outside the body of each clase in an implicit \\forall\n; This encoding as it stands really only supports ground atoms modulo equality\n\n(datatype Bool)\n(declare True Bool)\n(declare False Bool)\n(function or (Bool Bool) Bool)\n(function negate (Bool) Bool)\n\n; clauses are assumed in the normal form (or a (or b (or c False)))\n\n(set (negate False) True)\n(set (negate True) False)\n\n; \"Solving\" negation equations\n(rule ((= (negate p) True)) ((union p False)))\n(rule ((= (negate p) False)) ((union p True)))\n\n; canonicalize associtivity. \"append\" for clauses\n; terminate with false\n(rewrite (or (or a b) c) (or a (or b c)))\n; commutativity\n(rewrite (or a (or b c)) (or b (or a c)))\n\n;absoprtion\n(rewrite (or a (or a b)) (or a b))\n(rewrite (or a (or (negate a) b)) True)\n\n; simplification\n(rewrite (or False a) a)\n(rewrite (or a False) a)\n(rewrite (or True a) True)\n(rewrite (or a True) True)\n\n; unit propagation\n; This is kind of interesting actually.\n; Looks a bit like equation solving\n\n; The following is not valid egglog but could be?\n;(rewrite p True \n; :when ((= True (or p False))))\n\n(rule ((= True (or p False))) ((union p True)))\n\n; resolution\n; This counts on commutativity to bubble everything possible up to the front of the clause.\n(rule ((= True (or a as)) (= True (or (negate a) bs)))\n ((set (or as bs) True)))\n\n; example predicate\n(function p (i64) Bool)\n(let p0 (p 0))\n(let p1 (p 1))\n(let p2 (p 2))\n;(set (or p0 (or p1 (or p2 False))) True)\n;(set (or (negate p0) (or p1 (or (negate p2) False))) True)\n(set (or p1 (or (negate p2) False)) True)\n(set (or p2 (or (negate p0) False)) True)\n(set (or p0 (or (negate p1) False)) True)\n(union p1 False)\n(set (or (negate p0) (or p1 (or p2 False))) True)\n(run 10)\n\n\n(check (!= True False))\n(check (= p0 False))\n(check (= p2 False))\n\n; we could turn the original axioms into _patterns_ in all possible directions.\n; Which is kind of compelling\n; (rule ((or (pat x))) )\n; or let a unification expansion happen and use thos\n\n\n", + "rw-analysis": ";;;;;;;;;;;;;;;;\n;; Abstact Domain\n;;;;;;;;;;;;;;;;\n\n; Top means it can be an arbitrary value\n(datatype Val (I i64))\n(declare Top Val)\n(declare True Val)\n(declare False Val)\n(relation Bool (Val))\n(Bool True)\n(Bool False)\n\n(function merge-val (Val Val) Val)\n\n(rewrite (merge-val Top x) Top)\n(rewrite (merge-val x Top) Top)\n(rewrite (merge-val True False) Top)\n(rewrite (merge-val True (I x)) Top)\n(rewrite (merge-val False True) Top)\n(rewrite (merge-val False (I x)) Top)\n(rewrite (merge-val (I x) (I y)) Top :when ((!= x y)))\n(rewrite (merge-val x x) x)\n\n(function add-val (Val Val) Val)\n\n(rewrite (add-val Top x) Top)\n(rewrite (add-val x Top) Top)\n(rewrite (add-val True x) Top)\n(rewrite (add-val False x) Top)\n(rewrite (add-val x True) Top)\n(rewrite (add-val x False) Top)\n(rewrite (add-val (I x) (I y)) (I (+ x y)))\n\n(function eq-val (Val Val) Val)\n\n(rewrite (eq-val Top x) Top)\n(rewrite (eq-val x Top) Top)\n(rewrite (eq-val True False) False)\n(rewrite (eq-val True (I x)) False)\n(rewrite (eq-val False True) False)\n(rewrite (eq-val False (I x)) False)\n(rewrite (eq-val (I x) True) False)\n(rewrite (eq-val (I x) False) False)\n(rewrite (eq-val x x) True)\n\n(datatype VarT (V String))\n(datatype Loc (L i64))\n(datatype Exp\n (Add VarT VarT)\n (Eq VarT VarT)\n (Var VarT)\n (Const Val))\n(datatype ProgStmt\n (Ass VarT Exp)\n (If VarT Loc Loc)\n (Goto Loc)\n (Call VarT))\n(declare End ProgStmt)\n(function Prog (Loc) ProgStmt)\n(relation RProg (Loc ProgStmt))\n\n(function const-prop (Loc VarT) Val :merge (merge-val old new))\n\n;;;;;;;;;;;;;;;;\n;; ASS Case\n;;;;;;;;;;;;;;;;\n\n;; PROPAGATION\n\n; propagate x = k\n(rule (\n (RProg (L li) (Ass x (Const k)))\n)(\n (set (const-prop (L (+ li 1)) x) k)\n))\n\n; propagate x = a + b (non-constant)\n(rule (\n (RProg l (Ass x (Add x1 x2)))\n (= v1 (const-prop l x1))\n (= v2 (const-prop l x2))\n (= l (L li))\n)(\n (set (const-prop (L (+ li 1)) x) (add-val v1 v2))\n))\n\n; propagate x = a == b\n(rule (\n (RProg l (Ass x (Eq x1 x2)))\n (= v1 (const-prop l x1))\n (= v2 (const-prop l x2))\n (= l (L li))\n)(\n (set (const-prop (L (+ li 1)) x) (eq-val v1 v2))\n))\n\n; propagate other vars\n(rule (\n (RProg (L li) (Ass (V x) e))\n (= val (const-prop (L li) (V y)))\n (!= x y)\n)(\n (set (const-prop (L (+ li 1)) (V y)) val)\n))\n\n;; TRANSFORMATION \n\n; generate demand for biop\n(rule (\n (= (Prog l) (Ass x (Add x1 x2)))\n (= v1 (const-prop l x1))\n (= v2 (const-prop l x2))\n)(\n (add-val v1 v2)\n))\n\n(rule (\n (= (Prog l) (Ass x (Eq x1 x2)))\n (= v1 (const-prop l x1))\n (= v2 (const-prop l x2))\n)(\n (eq-val v1 v2)\n))\n\n; replace x = a + b (constant)\n(rule (\n (= (Prog l) (Ass x (Add x1 x2)))\n (= (I val) (add-val (const-prop l x1)\n (const-prop l x2)))\n)(\n (RProg l (Ass x (Const (I val))))\n))\n\n; replace x = a + b (non-contant)\n(rule (\n (= (Prog l) (Ass x (Add x1 x2)))\n (= Top (add-val (const-prop l x1)\n (const-prop l x2)))\n)(\n (RProg l (Ass x (Add x1 x2)))\n))\n\n; replace x = a == b (constant)\n(rule (\n (= (Prog l) (Ass x (Eq x1 x2)))\n (= b (eq-val (const-prop l x1) (const-prop l x2)))\n (Bool b)\n)(\n (RProg l (Ass x (Const b)))\n))\n\n; replace x = a == b (non-constant)\n(rule (\n (= (Prog l) (Ass x (Eq x1 x2)))\n (= Top (eq-val (const-prop l x1) (const-prop l x2)))\n)(\n (RProg l (Ass x (Eq x1 x2)))\n))\n\n; replace x = k\n(rule (\n (= (Prog l) (Ass x (Const val)))\n)(\n (RProg l (Ass x (Const val)))\n))\n\n;;;;;;;;;;;;;;;;\n;; CALL CASE\n;;;;;;;;;;;;;;;;\n\n;; PROPAGATION\n(rule (\n (RProg l (Call f))\n (= val (const-prop l x))\n (= l (L li))\n)(\n (set (const-prop (L (+ li 1)) x) val)\n))\n\n;; TRANSFORMATION\n(rule (\n (= (Prog l) (Call f))\n)(\n (RProg l (Call f))\n))\n\n;;;;;;;;;;;;;;;;\n;; IF CASE\n;;;;;;;;;;;;;;;;\n\n;; PROPAGATION\n(rule (\n (RProg l (If b l1 l2))\n (= val (const-prop l x))\n)(\n (set (const-prop l1 x) val)\n (set (const-prop l2 x) val)\n))\n\n;; TRANSFORMATION\n\n; replace if true\n(rule (\n (= (Prog l) (If b l1 l2))\n (= True (const-prop l b))\n)(\n (RProg l (Goto l1))\n))\n\n; replace if false\n(rule (\n (= (Prog l) (If b l1 l2))\n (= False (const-prop l b))\n)(\n (RProg l (Goto l2))\n))\n\n; replace if Top\n(rule (\n (= (Prog l) (If b l1 l2))\n (= Top (const-prop l b))\n)(\n (RProg l (If b l1 l2))\n))\n\n;;;;;;;;;;;;;;;;\n;; GOTO CASE\n;;;;;;;;;;;;;;;;\n\n;; PROPAGATION\n(rule (\n (RProg l1 (Goto l2))\n (= val (const-prop l1 x))\n)(\n (set (const-prop l2 x) val)\n))\n\n;; TRANSFORMATION\n(rule (\n (= (Prog l1) (Goto l2))\n)(\n (RProg l1 (Goto l2))\n))\n\n;;;;;;;;;;;;;;;;\n;; TEST\n;;;;;;;;;;;;;;;;\n\n(union (Prog (L 0)) (Ass (V \"b\") (Const Top)))\n(union (Prog (L 1)) (Ass (V \"ten\") (Const (I 10))))\n(union (Prog (L 2)) (Ass (V \"one\") (Const (I 1))))\n(union (Prog (L 3)) (Ass (V \"zero\") (Const (I 0))))\n; x := 10\n(union (Prog (L 4)) (Ass (V \"x\") (Const (I 10))))\n; while (...) {\n(union (Prog (L 5)) (If (V \"b\") (L 6) (L 13)))\n; if (x == 10) {\n(union (Prog (L 6)) (Ass (V \"cond\") (Eq (V \"x\") (V \"ten\"))))\n(union (Prog (L 7)) (If (V \"cond\") (L 8) (L 10)))\n; DoSomething();\n(union (Prog (L 8)) (Call (V \"DoSomething\")))\n; }\n(union (Prog (L 9)) (Goto (L 12)))\n; else {\n; DoSomething();\n(union (Prog (L 10)) (Call (V \"DoSomethingElse\")))\n; x := x + 1;\n(union (Prog (L 11)) (Ass (V \"x\") (Add (V \"x\") (V \"one\"))))\n;; (union (Prog (L 11)) (Call (V \"DoSomethingElse\")))\n; }\n(union (Prog (L 12)) (Goto (L 5)))\n; y := x\n(union (Prog (L 13)) (Ass (V \"y\") (Add (V \"x\") (V \"zero\"))))\n(union (Prog (L 14)) End)\n\n(run 20)\n\n(check (= (const-prop (L 14) (V \"y\")) (I 10)))\n\n", + "schedule-demo": "; Step with alternating feet, left before right\n(relation left (i64))\n(relation right (i64))\n\n(left 0)\n(right 0)\n\n(ruleset step-left)\n(rule ((left x) (right x))\n ((left (+ x 1)))\n :ruleset step-left)\n\n(ruleset step-right)\n(rule ((left x) (right y) (= x (+ y 1)))\n ((right x))\n :ruleset step-right)\n\n(run-schedule\n (repeat 10\n (saturate step-right)\n (saturate step-left)))\n\n; We took 10 steps with the left, but the right couldn't go the first round,\n; so we took only 9 steps with the right.\n(check (left 10))\n(check (right 9))\n(fail (check (left 11)))\n(fail (check (right 10)))\n", + "semi_naive_set_function": ";; From issue#93. The change happened in right-hand-side of a rule may also impact output in semi-naive cases\n(push)\n(function f (i64) i64 :merge (max old new))\n\n(set (f 0) 0)\n(set (f 3) 0)\n\n(rule ((= f0 (f 0))) ((set (f 1) f0)))\n(rule ((= f1 (f 1))) ((set (f 2) f1)))\n\n;; update f3 some iters later to make sure f(0) is inactive\n(rule ((= f2 (f 2))) ((set (f 3) 3)))\n\n(push)\n\n;; This rule should fire and set f(0) to be 3, but because f0 is inactive, \n;; it does not fire (despite that f3 is active now)\n(rule ((= f0 (f 0))) ((set (f 0) (f 3))))\n\n(run 100)\n(print-table f) ;; f0 is expected to have value 3, but has 0 in reality.\n\n(check (= (f 0) 3))\n(check (= (f 1) 3))\n(check (= (f 2) 3))\n(check (= (f 3) 3))\n\n(pop)\n(push)\n\n;; variants of the last rule.\n(rule ((= f0 (f 0)) (= x 3) (= y x)) ((set (f 0) (f y))))\n\n(run 100)\n(check (= (f 0) 3))\n(check (= (f 1) 3))\n(check (= (f 2) 3))\n(check (= (f 3) 3))\n\n(pop)\n(push)\n\n;; adding let binding\n(rule ((= f0 (f 0))) ((let x 3) (let y x) (set (f 0) (f y))))\n\n(run 100)\n(check (= (f 0) 3))\n(check (= (f 1) 3))\n(check (= (f 2) 3))\n(check (= (f 3) 3))\n\n(pop)\n(push)\n\n(function g (i64) i64 :merge (max old new))\n(set (g 0) 3)\n\n;; bind to another function\n(rule ((= f0 (f 0))) ((let x (g 0)) (let y x) (set (f 0) (f y))))\n\n(run 100)\n(check (= (f 0) 3))\n(check (= (f 1) 3))\n(check (= (f 2) 3))\n(check (= (f 3) 3))\n\n(pop)\n(pop)\n\n;; more complicated case, when the evaluation never finish\n;; the semi_naive and naive behavior diverage a bit\n(function f (i64) i64 :merge (max old new))\n\n(set (f 0) 0)\n(set (f 3) 0)\n\n(rule ((= f0 (f 0))) ((set (f 1) (+ 1 f0))))\n(rule ((= f1 (f 1))) ((set (f 2) (+ 1 f1))))\n\n(push)\n\n(rule ((= f2 (f 2))) ((set (f 3) 1)))\n(rule ((= f0 (f 0))) ((set (f 0) (f (f 3)))))\n\n\n(run 100)\n(print-table f) \n(check (!= 0 (f 0)))\n(check (!= 0 (f 1)))\n(check (!= 0 (f 2)))\n\n(pop)\n\n\n;; id function that will set all int values, but need strong induction.\n(function g (i64) i64 :merge (max old new))\n(set (g 0) 0)\n(set (g 1) 1)\n(rule ((= x (g x))) ((set (g (+ x 1)) (+ (g (- x 1)) 2))))\n\n(run 100)\n(print-table g) \n\n(check (= 20 (g 20)))", + "stratified": "(relation path (i64 i64))\n(relation edge (i64 i64))\n\n(rule ((edge x y))\n ((path x y)))\n\n(edge 1 2)\n(edge 2 3)\n(edge 3 4)\n(check (edge 1 2))\n(run 3)\n(check (path 1 2))\n\n(ruleset path-rules)\n\n(rule ((path x y) (edge y z))\n ((path x z))\n :ruleset path-rules)\n\n(edge 3 8)\n(run path-rules 1)\n(check (path 1 3))\n\n\n\n; Should fail\n; (check (path 1 4))\n; (check (path 3 8)) \n", + "string": "; Tests for the string sort\n(check (= (+ \"a\" \"bc\" \"de\") \"abcde\"))\n", + "string_quotes": "(function f () String)\n(input f \"tests/string_quotes.csv\")\n(check (= (f) \"abc\"))\n", + "typecheck": "; type checking for simply typed lambda calculus\n\n(datatype Type \n (TArr Type Type) ; t1 -> t2\n)\n(declare TUnit Type)\n\n(datatype Expr \n (Lam String Type Expr) ; lam x : t . e\n (App Expr Expr) \n (Var String) \n)\n(declare MyUnit Expr)\n\n(datatype Ctx \n (Cons String Type Ctx)\n)\n(declare Nil Ctx)\n\n; ctx |- expr : type\n(function typeof (Ctx Expr) Type)\n\n; ctx |- () : unit\n(rewrite (typeof ctx MyUnit) TUnit)\n\n; ctx; x: t |- x : t\n(rewrite (typeof (Cons x t ctx) (Var x)) t)\n\n; ctx |- f :- t1 -> t2\n; ctx |- e : t1\n; -----------------\n; ctx |- f e : t2\n\n(rule (\n (= (typeof ctx (App f e)) t2)\n)(\n (typeof ctx f)\n (typeof ctx e)\n))\n\n(rule (\n (= (typeof ctx (App f e)) t1)\n (= (typeof ctx f) (TArr (typeof ctx e) t2))\n)(\n (union t1 t2)\n))\n\n; ctx |- x : t\n; ------------------ y != x \n; ctx; y: t |- x : t\n\n(rewrite (typeof (Cons y ty ctx) (Var x))\n (typeof ctx (Var x))\n :when ((!= x y)))\n\n; ctx; x: t1 |- e : t2\n; ------------------------------\n; ctx |- lam x: t1. e : t1 -> t2\n\n; rhs of rewrite creates demand\n(rewrite (typeof ctx (Lam x t1 e))\n (TArr t1 (typeof (Cons x t1 ctx) e)))\n\n; TEST\n; ----\n\n; lam x : unit, f : unit -> unit . f x\n(let e \n (Lam \"x\" TUnit \n (Lam \"f\" (TArr TUnit TUnit)\n (App (Var \"f\") (Var \"x\")))))\n\n; lam x : unit . x\n(let id (Lam \"x\" TUnit (Var \"x\")))\n(let t-id (typeof Nil id))\n\n; (e () id) = ()\n(let app-unit-id (App (App e MyUnit) id))\n(let t-app (typeof Nil app-unit-id))\n\n(let free (Lam \"x\" TUnit (Var \"y\")))\n(let t-free-ill (typeof Nil free))\n(let t-free-1 (typeof (Cons \"y\" TUnit Nil) free))\n(let t-free-2 (typeof (Cons \"y\" (TArr (TArr TUnit TUnit) TUnit) Nil) free))\n\n(run 15)\n\n(query-extract t-id)\n(check (= t-id (TArr TUnit TUnit)))\n\n(query-extract t-app)\n(check (= t-app TUnit))\n\n(query-extract t-free-1)\n(check (= t-free-1 (TArr TUnit TUnit)))\n(query-extract t-free-2)\n(check (= t-free-2 (TArr TUnit (TArr (TArr TUnit TUnit) TUnit))))\n; this will err\n; (query-extract t-free-ill)\n", + "typeinfer": ";;;;;;;;;;;;;;;;;;;;;;\n;; Exprs and Types\n;;;;;;;;;;;;;;;;;;;;;;\n\n(datatype Ident)\n(datatype Expr)\n(datatype Type)\n(datatype Scheme)\n(datatype Ctx)\n;; TODO: can't do unit right now\n(sort QuantifiedVs (Set Ident))\n\n(function Fresh (Ident i64) Ident)\n(function V (String) Ident)\n\n(function Var (Ident) Expr)\n(function App (Expr Expr) Expr)\n(function Abs (Ident Expr) Expr)\n(function Let (Ident Expr Expr) Expr)\n(function Num (i64) Expr)\n(function True () Expr)\n(function False () Expr)\n(function MyUnit () Expr)\n\n(function TVar (Ident) Type :cost 3)\n(function TArr (Type Type) Type :cost 1)\n(function TInt () Type :cost 1)\n(function TBool () Type :cost 1)\n(function TUnit () Type :cost 1)\n\n(function Forall (QuantifiedVs Type) Scheme)\n(function Nil () Ctx)\n(function Cons (Ident Scheme Ctx) Ctx)\n\n(relation ftvCtx (Ctx QuantifiedVs))\n(relation ftv (Type QuantifiedVs))\n(relation ftvScheme (Scheme QuantifiedVs))\n(relation has-qs (Ctx Type QuantifiedVs))\n(relation has-qs-demand (Ctx Type))\n\n;;;;;;;;;;;;;;;;;;;;;;\n;; Expression size\n;;;;;;;;;;;;;;;;;;;;;;\n(relation expr-size (Expr i64))\n(rule ((= e (Num n)))((expr-size e 1)))\n(rule ((= e (Var x)))((expr-size e 1)))\n;; asserted facts will be cleared so we define them as rules\n(rule ((= e (True))) ((expr-size e 1)))\n(rule ((= e (False))) ((expr-size e 1)))\n(rule ((= e (MyUnit))) ((expr-size e 1)))\n(rule ((= e (App e1 e2)) \n (expr-size e1 s1) \n (expr-size e2 s2))\n ((expr-size e (+ (+ s1 s2) 1))))\n(rule ((= e (Let x e1 e2)) \n (expr-size e1 s1) \n (expr-size e2 s2))\n ((expr-size e (+ (+ s1 s2) 1))))\n(rule ((= e (Abs x e1)) \n (expr-size e1 s1))\n ((expr-size e (+ s1 1))))\n\n;;;;;;;;;;;;;;;;;;;;;;\n;; Scheme and Context\n;;;;;;;;;;;;;;;;;;;;;;\n\n(rule ((= e (TBool)))((ftv e (set-empty))))\n(rule ((= e (TUnit)))((ftv e (set-empty))))\n(rule ((= e (TInt)))((ftv e (set-empty))))\n(rule ((= e (TVar x)))((ftv e (set-insert (set-empty) x))))\n(rule ((= e (TArr fr to))\n (ftv fr s1)\n (ftv to s2))\n ((ftv e (set-union s1 s2))))\n(rule ((= c (Nil))) ((ftvCtx c (set-empty))))\n(rule ((= e (Forall qs t))\n (ftv t fvs))\n ((ftvScheme e (set-diff fvs qs)))) \n(rule ((= c (Cons x s n))\n (ftvCtx n fvs1)\n (ftvScheme s fvs2))\n ((ftvCtx c (set-union fvs1 fvs2))))\n\n\n;; TODO: rewrite lookup to use native sets\n(function lookup (Ctx Ident) Scheme :cost 1000)\n(rewrite (lookup (Cons x s tl) x) s)\n(rule (\n (= t (lookup (Cons y s tl) x))\n (!= x y)\n)(\n (union t (lookup tl x))\n))\n\n;;;;;;;;;;;;;;;;;;;;;;\n;; Generalization and Instantiation\n;;;;;;;;;;;;;;;;;;;;;;\n\n(function generalize (Ctx Type) Scheme :cost 1000)\n(function instantiate (Scheme i64) Type :cost 1000)\n\n(rule ((has-qs-demand ctx (TInt)))\n ((has-qs ctx (TInt) (set-empty))))\n(rule ((has-qs-demand ctx (TBool)))\n ((has-qs ctx (TBool) (set-empty))))\n(rule ((has-qs-demand ctx (TUnit)))\n ((has-qs ctx (TUnit) (set-empty))))\n\n(rule ((has-qs-demand ctx (TArr fr to)))\n ((has-qs-demand ctx fr)\n (has-qs-demand ctx to)))\n(rule ((has-qs-demand ctx (TArr fr to))\n (has-qs ctx fr qs1)\n (has-qs ctx to qs2))\n ((has-qs ctx (TArr fr to) (set-union qs1 qs2))))\n\n(rule ((has-qs-demand ctx (TVar x))\n (ftvCtx ctx key-set)\n (set-contains key-set x))\n ((has-qs ctx (TVar x) (set-empty))))\n(rule ((has-qs-demand ctx (TVar x))\n (ftvCtx ctx key-set)\n (set-not-contains key-set x))\n ((has-qs ctx (TVar x) (set-insert (set-empty) x))))\n\n(rule ((= sc (generalize ctx t)))\n ((has-qs-demand ctx t)))\n(rewrite (generalize ctx t)\n (Forall qs t)\n :when ((has-qs ctx t qs)))\n\n(function subst-fresh (QuantifiedVs Type i64) Type :cost 1000)\n(rewrite (subst-fresh vs (TInt) c) (TInt))\n(rewrite (subst-fresh vs (TBool) c) (TBool))\n(rewrite (subst-fresh vs (TUnit) c) (TUnit))\n(rewrite (subst-fresh vs (TArr fr to) c) \n (TArr (subst-fresh vs fr c) (subst-fresh vs to c)))\n(rule ((= otype (subst-fresh vs (TVar s) c))\n (set-contains vs s))\n ((union otype (TVar (Fresh s c)))))\n(rule ((= otype (subst-fresh vs (TVar s) c))\n (set-not-contains vs s))\n ((union otype (TVar s))))\n\n(rewrite (instantiate (Forall vs t) c)\n (subst-fresh vs t c))\n\n;;;;;;;;;;;;;;;;;;;;;;\n;; Injectivity\n;;;;;;;;;;;;;;;;;;;;;;\n\n(rule ((= (TArr fr1 to1) (TArr fr2 to2)))\n ((union fr1 fr2) \n (union to1 to2)))\n\n;;;;;;;;;;;;;;;;;;;;;;\n;; Type inference\n;;;;;;;;;;;;;;;;;;;;;;\n\n; ctx |- expr : type\n(function typeof (Ctx Expr i64) Type :cost 1000)\n\n;; Basic types (TInt, TBool, TUnit)\n(rewrite (typeof ctx (Num x) c) (TInt))\n(rewrite (typeof ctx (True) c) (TBool))\n(rewrite (typeof ctx (False) c) (TBool))\n(rewrite (typeof ctx (MyUnit) c) (TUnit))\n\n; sc = lookup(ctx, x)\n; t = instantiate(sc)\n; ---------------\n; ctx |- x : t\n(rewrite (typeof ctx (Var x) c)\n (instantiate (lookup ctx x) c))\n\n(rewrite \n (typeof ctx (Abs x e) c)\n (TArr (TVar (Fresh x c)) \n (typeof (Cons x (Forall (set-empty) (TVar (Fresh x c)))\n ctx)\n e cc))\n :when ((= cc (+ c 1))))\n\n(rule ((= to (typeof ctx (App e1 e2) c))\n (= c1 (+ c 1))\n (expr-size e1 sz)\n (= c2 (+ c (+ sz 1))))\n ((union (typeof ctx e1 c1) \n (TArr (typeof ctx e2 c2) to))))\n\n(rewrite (typeof ctx (Let x e1 e2) c)\n (typeof (Cons x (generalize ctx (typeof ctx e1 c1)) \n ctx)\n e2 c2)\n :when ((= c1 (+ c 1))\n (expr-size e1 sz)\n (= c2 (+ c (+ sz 1)))))\n\n;;;;;;;;;;;;;;;;;;;;;;\n;; Occurs check\n;;;;;;;;;;;;;;;;;;;;;;\n(relation occurs-check (Ident Type))\n(function errors () Ident)\n(rule ((= (TVar x) (TArr fr to)))\n ((occurs-check x fr)\n (occurs-check x to)))\n(rule ((occurs-check x (TVar x)))\n ;; ((set (errors) x)))\n ((panic \"occurs check fail\")))\n(rule ((occurs-check x (TArr fr to)))\n ((occurs-check x fr)\n (occurs-check x to)))\n\n(relation base-types (Type))\n(base-types (TInt))\n(base-types (TBool))\n(base-types (TUnit))\n(rule ((base-types t)\n (= t (TArr fr to)))\n ((panic \"Unifying base types with functions\")) )\n(rule ((= (TInt) (TBool))) ((panic \"Unifying base types\")))\n(rule ((= (TInt) (TUnit))) ((panic \"Unifying base types\")))\n(rule ((= (TBool) (TUnit))) ((panic \"Unifying base types\")))\n;;;;;;;;;;;;;;;;;;;;;;\n;; TEST\n;;;;;;;;;;;;;;;;;;;;;;\n\n(push)\n(let id (Abs (V \"x\") (Var (V \"x\"))))\n(let t-id (typeof (Nil) id 0))\n(run 100)\n(check (= t-id (TArr (TVar (Fresh (V \"x\") 0)) (TVar (Fresh (V \"x\") 0)))))\n(pop)\n\n(push)\n(let let-poly (Let (V \"id\") (Abs (V \"x\") (Var (V \"x\")))\n (App (App (Var (V \"id\")) (Var (V \"id\")))\n (App (Var (V \"id\")) (True)))))\n(let t-let-poly (typeof (Nil) let-poly 0))\n(run 100)\n(check (= t-let-poly (TBool)))\n(pop)\n\n(push)\n(let id-id (App (Abs (V \"x\") (Var (V \"x\")))\n (Abs (V \"y\") (Var (V \"y\")))))\n(let t-id-id (typeof (Nil) id-id 0))\n(run 100)\n(check (= t-id-id (TArr (TVar (Fresh (V \"y\") 3)) (TVar (Fresh (V \"y\") 3)))))\n(pop)\n\n\n(push)\n(let let-true (Let (V \"x\") (True) (True)))\n(let t-let-true (typeof (Nil) let-true 0))\n(run 100)\n(check (= t-let-true (TBool)))\n(pop)\n\n(push)\n\n(let let-var-true (Let (V \"x\") (True) (Var (V \"x\"))))\n(let t-let-var-true (typeof (Nil) let-var-true 0))\n(run 100)\n(check (= t-let-var-true (TBool)))\n(pop)\n\n(push)\n\n(let abs-id (Abs (V \"x\") \n (Let (V \"y\") (Abs (V \"z\") (Var (V \"z\"))) (Var (V \"y\")))))\n(let t-abs-id (typeof (Nil) abs-id 0))\n(run 100)\n(let x (Fresh (V \"x\") 0))\n(let z (Fresh (Fresh (V \"z\") 2) 4))\n(check (= t-abs-id (TArr (TVar x) (TArr (TVar z) (TVar z)))))\n(pop)\n\n(push)\n\n(let let-env (Let (V \"x\") (True) \n (Let (V \"f\") (Abs (V \"a\") (Var (V \"a\")))\n (Let (V \"x\") (MyUnit)\n (App (Var (V \"f\")) (Var (V \"x\")))\n ))))\n(let t-let-env (typeof (Nil) let-env 0))\n(run 100)\n(check (= t-let-env (TUnit)))\n(pop)\n\n(push)\n(let let-env-2a (Let (V \"x\") (MyUnit)\n (Let (V \"f\") (Abs (V \"y\") (Var (V \"x\")))\n (Let (V \"x\") (True)\n (App (Var (V \"f\")) (Var (V \"x\")))))))\n(let t-let-env-2a (typeof (Nil) let-env-2a 0))\n(run 100)\n(check (= t-let-env-2a (TUnit)))\n(pop)\n\n(push)\n\n(let let-env-2b (App (Abs (V \"x\")\n (Let (V \"f\") (Abs (V \"y\") (Var (V \"x\")))\n (Let (V \"x\") (True)\n (App (Var (V \"f\")) (Var (V \"x\"))))))\n (MyUnit)))\n(let t-let-env-2b (typeof (Nil) let-env-2b 0))\n(run 100)\n(check (= t-let-env-2b (TUnit)))\n(pop)\n\n(push)\n\n;; ((lambda (x) ((lambda (f) ((lambda (x) (f x)) #t)) (lambda (y) x))) 5)\n(let let-env-hard (App (Abs (V \"x\") \n (App (Abs (V \"f\") \n (App (Abs (V \"x\") (App (Var (V \"f\")) (Var (V \"x\")))) \n (True)))\n (Abs (V \"y\") (Var (V \"x\")))))\n (MyUnit)))\n(let t-let-env-hard (typeof (Nil) let-env-hard 0))\n(run 100)\n(check (= t-let-env-hard (TUnit)))\n(pop)\n\n(push)\n\n(let let-inst (Let (V \"id\") (Abs (V \"x\") (Var (V \"x\")))\n (Let (V \"iid\") (Abs (V \"y\") (Var (V \"id\")))\n (App (Var (V \"iid\")) \n (App (Var (V \"id\")) (True))))) )\n(let t-let-inst (typeof (Nil) let-inst 0))\n(run 100)\n(check (= t-let-inst (TArr (TVar (Fresh (Fresh (Fresh (V \"x\") 1) 5) 7)) (TVar (Fresh (Fresh (Fresh (V \"x\") 1) 5) 7)))))\n(pop)\n\n", + "unification-points-to": "(datatype FuncT (Func String))\n(datatype StmtT (Stmt String))\n(datatype ExprT (Expr String))\n(datatype FieldT (Field String))\n(datatype TypeT (Type String))\n(datatype AllocT (Alloc AllocT) (AllocVar ExprT))\n\n(relation func (FuncT ExprT TypeT TypeT))\n(relation func-stmt (FuncT StmtT))\n(relation assign (StmtT TypeT ExprT ExprT))\n(relation field-assign (StmtT ExprT FieldT ExprT))\n(relation store (StmtT ExprT ExprT))\n(relation expr (StmtT ExprT))\n(relation return (StmtT ExprT))\n(relation eq (ExprT ExprT ExprT))\n(relation call (ExprT FuncT ExprT))\n(relation add (ExprT ExprT ExprT))\n(relation field (ExprT ExprT FieldT))\n(relation struct-lit-field (ExprT FieldT ExprT))\n(relation addr (ExprT ExprT FieldT))\n(relation load (ExprT ExprT))\n(relation malloc (ExprT TypeT))\n\n;; typedef struct s {\n;; int x;\n;; int y;\n;; } s;\n\n;; int mul(struct s q) { ... }\n\n;; int fact(int i) {\n;; int c = i == 0;\n;; if (c) {\n;; return 1;\n;; } else {\n;; int j = i + -1;\n;; int r = fact(j);\n;; int prod = mul((struct s){i, r});\n;; return prod;\n;; }\n;; }\n;; (func (Func \"fact\") (Expr \"i\") (Type \"int\") (Type \"int\"))\n;; (func-stmt (Func \"fact\") (Stmt \"int c = i == 0;\"))\n;; (func-stmt (Func \"fact\") (Stmt \"if ...\"))\n;; (func-stmt (Func \"fact\") (Stmt \"return 1\"))\n;; (func-stmt (Func \"fact\") (Stmt \"int j = i + -1\"))\n;; (func-stmt (Func \"fact\") (Stmt \"int r = fact(j)\"))\n;; (func-stmt (Func \"fact\") (Stmt \"int prod = mul({ x: i, y: r })\"))\n;; (func-stmt (Func \"fact\") (Stmt \"return prod\"))\n;; (assign (Stmt \"int c = i == 0\") (Type \"int\") (Expr \"c\") (Expr \"i == 0\"))\n;; (assign (Stmt \"int j = i + -1\") (Type \"int\") (Expr \"j\") (Expr \"i + -1\"))\n;; (assign (Stmt \"int r = fact(j)\") (Type \"int\") (Expr \"r\") (Expr \"fact(j)\"))\n;; (assign (Stmt \"int prod = mul({ x: i, y: r })\") (Type \"int\") (Expr \"prod\") (Expr \"mul({ x: i, y: r })\"))\n;; (eq (Expr \"i == 0\") (Expr \"i\") (Expr \"0\"))\n;; (add (Expr \"i + -1\") (Expr \"i\") (Expr \"-1\"))\n;; (call (Expr \"fact(j)\") (Func \"fact\") (Expr \"j\"))\n;; (call (Expr \"mul({ x: i, y: r })\") (Func \"mul\") (Expr \"{ x: i, y: r }\"))\n;; (return (Stmt \"return prod\") (Expr \"prod\"))\n\n;; typedef struct s {\n;; int *x;\n;; int *y;\n;; } s;\n\n;; void swap(struct s *r) {\n;; int **xp = &(r->x);\n;; int **yp = &(r->y);\n;; int *a = *xp;\n;; int *b = *yp;\n;; *xp = a;\n;; *yp = b;\n;; }\n\n;; int f(int i) {\n;; struct s *sp = malloc(sizeof(struct s));\n;; int *u = malloc(sizeof(int));\n;; int *v = malloc(sizeof(int));\n;; *u = i;\n;; *v = i;\n;; *sp = (struct s){u, v};\n;; swap(sp);\n;; int **zpp = &(sp->x);\n;; int *zp = *zpp;\n;; return *zp;\n;; }\n(func (Func \"swap\") (Expr \"r\") (Type \"void\") (Type \"{int *x; int *y;}*\"))\n;; statements\n(func-stmt (Func \"swap\") (Stmt \"int **xp = &(r->x)\"))\n(func-stmt (Func \"swap\") (Stmt \"int **yp = &(r->y)\"))\n(func-stmt (Func \"swap\") (Stmt \"int *z = *xp\"))\n(func-stmt (Func \"swap\") (Stmt \"int *w = *yp\"))\n(func-stmt (Func \"swap\") (Stmt \"*xp = a\"))\n(func-stmt (Func \"swap\") (Stmt \"*yp = b\"))\n(assign (Stmt \"int **xp = &(r->x)\") (Type \"int **\") (Expr \"xp\") (Expr \"&(r->x)\"))\n(assign (Stmt \"int **yp = &(r->x)\") (Type \"int **\") (Expr \"yp\") (Expr \"&(r->y)\"))\n(assign (Stmt \"int *a = *xp\") (Type \"int *\") (Expr \"a\") (Expr \"*xp\"))\n(assign (Stmt \"int *b = *yp\") (Type \"int *\") (Expr \"b\") (Expr \"*yp\"))\n(store (Stmt \"*xp = a\") (Expr \"xp\") (Expr \"a\"))\n(store (Stmt \"*yp = b\") (Expr \"yp\") (Expr \"b\"))\n;; expressions\n(addr (Expr \"&(r->x)\") (Expr \"r\") (Field \"x\"))\n(addr (Expr \"&(r->y)\") (Expr \"r\") (Field \"y\"))\n(load (Expr \"*xp\") (Expr \"xp\"))\n(load (Expr \"*yp\") (Expr \"yp\"))\n\n(func (Func \"f\") (Expr \"i\") (Type \"int\") (Type \"int\"))\n;; statements\n(func-stmt (Func \"f\") (Stmt \"struct s *sp = malloc(sizeof(struct s))\"))\n(func-stmt (Func \"f\") (Stmt \"int *u = malloc(sizeof(int))\"))\n(func-stmt (Func \"f\") (Stmt \"int *v = malloc(sizeof(int))\"))\n(func-stmt (Func \"f\") (Stmt \"*u = i\"))\n(func-stmt (Func \"f\") (Stmt \"*v = i\"))\n(func-stmt (Func \"f\") (Stmt \"*sp = (struct s){u, v}\"))\n(func-stmt (Func \"f\") (Stmt \"swap(sp)\"))\n(func-stmt (Func \"f\") (Stmt \"int **zpp = &(sp->x)\"))\n(func-stmt (Func \"f\") (Stmt \"int *zp = *zpp\"))\n(func-stmt (Func \"f\") (Stmt \"return *zp\"))\n(assign (Stmt \"struct s *sp = malloc(sizeof(struct s))\") (Type \"struct s*\") (Expr \"sp\") (Expr \"malloc(sizeof(struct s))\"))\n(assign (Stmt \"int *u = malloc(sizeof(int))\") (Type \"int *\") (Expr \"u\") (Expr \"malloc(sizeof(int))\"))\n(assign (Stmt \"int *v = malloc(sizeof(int))\") (Type \"int *\") (Expr \"v\") (Expr \"malloc(sizeof(int))\"))\n(store (Stmt \"*u = i\") (Expr \"u\") (Expr \"i\"))\n(store (Stmt \"*v = i\") (Expr \"v\") (Expr \"i\"))\n(store (Stmt \"*sp = (struct s){u, v}\") (Expr \"sp\") (Expr \"(struct s){u, v}\"))\n(expr (Stmt \"swap(sp)\") (Expr \"swap(sp)\"))\n(assign (Stmt \"int **zpp = &(sp->x)\") (Type \"int **\") (Expr \"zpp\") (Expr \"&(sp->x)\"))\n(assign (Stmt \"int *zp = *zpp\") (Type \"int *\") (Expr \"zp\") (Expr \"*zpp\"))\n(return (Stmt \"return *zp\") (Expr \"*zp\"))\n;; expressions\n(malloc (Expr \"malloc(sizeof(struct s))\") (Type \"struct s\"))\n(malloc (Expr \"malloc(sizeof(int))\") (Type \"int\"))\n(struct-lit-field (Expr \"(struct s){u, v}\") (Field \"x\") (Expr \"u\"))\n(struct-lit-field (Expr \"(struct s){u, v}\") (Field \"y\") (Expr \"v\"))\n(call (Expr \"swap(sp)\") (Func \"swap\") (Expr \"sp\"))\n(addr (Expr \"&(sp->x)\") (Expr \"sp\") (Field \"x\"))\n(load (Expr \"*zpp\") (Expr \"zpp\"))\n(load (Expr \"*zp\") (Expr \"zp\"))\n\n;; a variable points to its allocation\n(function expr-points-to (ExprT) AllocT)\n(function ptr-points-to (AllocT) AllocT)\n\n;; If `v = malloc(...)`, then `v -> alloc[v]`.\n(rule (\n (assign s t1 v c)\n (malloc c t2)\n)(\n (union (expr-points-to v) (AllocVar v))\n))\n\n;; If `t v = e` and `e -> a`, then `v -> a`.\n(rule (\n (assign s t v e)\n (= (expr-points-to e) a)\n)(\n (union (expr-points-to v) a)\n))\n\n;; If `*v = u`, `v -> a`, and `u -> b`, then `a -> b`.\n(rule (\n (store s v u)\n (= (expr-points-to v) a)\n (= (expr-points-to u) b)\n)(\n (union (ptr-points-to a) b)\n))\n\n;; If `e.f -> a` then `e -> a`.\n(rule (\n (field ef e f)\n (= (expr-points-to ef) a)\n)(\n (union (expr-points-to e) a)\n))\n\n;; If `e -> a` then `e.f -> a`.\n(rule (\n (= (expr-points-to e) a)\n (field ef e f)\n)(\n (union (expr-points-to ef) a) \n))\n\n;; If `u -> a` and `a -> b`, then `&(u->f) -> b`.\n(rule (\n (= (expr-points-to u) a)\n (= (ptr-points-to a) b)\n (addr e u f)\n)(\n (union (expr-points-to e) b)\n))\n\n;; If `u -> a` and `&(u->f) -> b`, then `a -> b`.\n(rule (\n (= (expr-points-to u) a)\n (addr e u f)\n (= (expr-points-to e) b)\n)(\n (union (ptr-points-to a) b)\n))\n\n;; If `(struct t){..., x, ...}` and `x -> b`, then `(struct t){..., x, ...} -> b`.\n(rule (\n (struct-lit-field l f x)\n (= (expr-points-to x) b)\n)(\n (union (expr-points-to l) b) \n))\n\n;; If `f(t* x)`, `f(v)`, and `v -> a`, then `x -> a`.\n(rule (\n (func f x in out)\n (call e f v)\n (= (expr-points-to v) a)\n)(\n (union (expr-points-to x) a) \n))\n\n;; If `return u` in `f` and `u -> a`, then `f(z) -> a`.\n(rule (\n (call e f v)\n (func-stmt f s)\n (return s u)\n (= (expr-points-to u) a)\n)(\n (union (expr-points-to e) a) \n))\n\n;; store rule\n(rule (\n (load e u)\n (= (expr-points-to u) a)\n (= (ptr-points-to a) b)\n)(\n (union (expr-points-to e) b)\n))\n\n(run 40)\n\n(check (= (AllocVar (Expr \"v\")) (AllocVar (Expr \"u\"))))\n(check (!= (AllocVar (Expr \"v\")) (AllocVar (Expr \"sp\"))))\n\n(query-extract :variants 100 (AllocVar (Expr \"u\")))\n(query-extract :variants 100 (AllocVar (Expr \"sp\")))\n", + "unify": "(datatype Expr\n (Mul Expr Expr)\n (Var String)\n (Lit i64)\n)\n\n; Assume injectivity of Mul for unification\n(rule ((= (Mul a b) (Mul c d)))\n ((union a c)\n (union b d)))\n\n;; (relation False (i64))\n; If any Literal make equal to something it can't be, false is derived\n;(rule ((= (Lit i) (Lit j)) (!= i j))\n; ((False 0)))\n(rule ((= (Lit i) (Mul a b)))\n ((panic \"Literal cannot be equal to a product\")))\n\n(set (Mul (Var \"a\") (Var \"a\")) \n (Mul (Lit 1) (Lit 2)))\n\n\n(run 3)\n(check (= (Var \"a\") (Lit 1)))\n(check (= (Lit 2) (Lit 1)))\n; (check (False 0)) ;; this should fail because we don't want prove false", + "until": "; A simple group\n(datatype G)\n(declare I G)\n(declare A G)\n(declare B G)\n\n(function g* (G G) G)\n(function inv (G) G)\n(birewrite (g* (g* a b) c) (g* a (g* b c))) ; assoc\n(rewrite (g* I a) a) ; idl\n(rewrite (g* a I) a) ; idr\n\n; A is cyclic of period 4\n(rewrite (g* A (g* A (g* A A))) I)\n\n(let A2 (g* A A))\n(let A4 (g* A2 A2))\n(let A8 (g* A4 A4))\n\n; non terminating rule\n(relation allgs (G))\n(rule ((allgs x)) ((allgs (g* B x))))\n(allgs A)\n\n; if you remove :until, this will take a very long time\n(run 10000 :until (= A8 I))\n(check (= A8 I))\n(check (!= B A))\n(check (!= I A))\n; If you need multiple stop conditions, consider using a (relation relation stop (unit))\n; With rules filling it in with different stop conditions of interest.\n", + "vec": "(sort IVec (Vec i64))\n\n; Test vec-of\n(check (= (vec-of 1 2) (vec-push (vec-push (vec-empty) 1) 2)))\n\n; Test vec-append\n(check (= (vec-append (vec-of 1 2) (vec-of 3 4)) (vec-of 1 2 3 4)))\n\n; Test vec-pop\n(check (= (vec-pop (vec-of 1 2 3)) (vec-of 1 2)))\n\n; Test vec-not-contains\n(check (vec-not-contains (vec-of 1 2 3) 4))\n\n; Test vec-contains\n(check (vec-contains (vec-of 1 2 3) 2))\n\n; Test length\n(check (= (vec-length (vec-of 1 2 3)) 3))\n\n; Test vec-get\n(check (= (vec-get (vec-of 1 2 3) 1) 2))\n" +} \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 000000000..63133cd69 --- /dev/null +++ b/index.html @@ -0,0 +1,236 @@ + + + + + + egglog demo + + + + + + + + + + +
+
+
+ + + + + +
+ + GitHub Repo + + Main Branch Documentation +
+
+
Click "Run" to run code
+
+
+
+
+ + + diff --git a/lzma-url.mjs b/lzma-url.mjs new file mode 100644 index 000000000..93fd7dd05 --- /dev/null +++ b/lzma-url.mjs @@ -0,0 +1,3214 @@ +/* +The LZMA impementation is taken from https://npm.is/lzma-js, converted to an ES module and with some features stripped off (e.g. async mode, worker support) + +Here's the according MIT license: + +© 2016 Nathan Rugg + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +import * as base64 from './base64.mjs' + +const __4294967296 = 4294967296, + N1_longLit = [4294967295, -__4294967296], + MIN_VALUE = [0, -9223372036854775808], + P0_longLit = [0, 0], + P1_longLit = [1, 0] + +function add(a, b) { + return create(a[0] + b[0], a[1] + b[1]) +} + +function initDim(len) { + // NOTE: This is MUCH faster than "initDim(len)" in newer versions of v8 (starting with Node.js 0.11.15, which uses v8 3.28.73). + var a = [] + a[len - 1] = undefined + return a +} +function and(a, b) { + return makeFromBits( + ~~Math.max(Math.min(a[1] / __4294967296, 2147483647), -2147483648) & + ~~Math.max(Math.min(b[1] / __4294967296, 2147483647), -2147483648), + lowBits_0(a) & lowBits_0(b) + ) +} +function compare(a, b) { + var nega, negb + if (a[0] == b[0] && a[1] == b[1]) { + return 0 + } + nega = a[1] < 0 + negb = b[1] < 0 + if (nega && !negb) { + return -1 + } + if (!nega && negb) { + return 1 + } + if (sub(a, b)[1] < 0) { + return -1 + } + return 1 +} + +function create(valueLow, valueHigh) { + var diffHigh, diffLow + valueHigh %= 1.8446744073709552e19 + valueLow %= 1.8446744073709552e19 + diffHigh = valueHigh % __4294967296 + diffLow = Math.floor(valueLow / __4294967296) * __4294967296 + valueHigh = valueHigh - diffHigh + diffLow + valueLow = valueLow - diffLow + diffHigh + while (valueLow < 0) { + valueLow += __4294967296 + valueHigh -= __4294967296 + } + while (valueLow > 4294967295) { + valueLow -= __4294967296 + valueHigh += __4294967296 + } + valueHigh = valueHigh % 1.8446744073709552e19 + while (valueHigh > 9223372032559808512) { + valueHigh -= 1.8446744073709552e19 + } + while (valueHigh < -9223372036854775808) { + valueHigh += 1.8446744073709552e19 + } + return [valueLow, valueHigh] +} +function eq(a, b) { + return a[0] == b[0] && a[1] == b[1] +} +function fromInt(value) { + if (value >= 0) { + return [value, 0] + } else { + return [value + __4294967296, -__4294967296] + } +} + +function lowBits_0(a) { + if (a[0] >= 2147483648) { + return ~~Math.max(Math.min(a[0] - __4294967296, 2147483647), -2147483648) + } else { + return ~~Math.max(Math.min(a[0], 2147483647), -2147483648) + } +} +function makeFromBits(highBits, lowBits) { + var high, low + high = highBits * __4294967296 + low = lowBits + if (lowBits < 0) { + low += __4294967296 + } + return [low, high] +} + +function pwrAsDouble(n) { + if (n <= 30) { + return 1 << n + } else { + return pwrAsDouble(30) * pwrAsDouble(n - 30) + } +} + +function shl(a, n) { + var diff, newHigh, newLow, twoToN + n &= 63 + if (eq(a, MIN_VALUE)) { + if (!n) { + return a + } + return P0_longLit + } + if (a[1] < 0) { + throw new Error('Neg') + } + twoToN = pwrAsDouble(n) + newHigh = (a[1] * twoToN) % 1.8446744073709552e19 + newLow = a[0] * twoToN + diff = newLow - (newLow % __4294967296) + newHigh += diff + newLow -= diff + if (newHigh >= 9223372036854775807) { + newHigh -= 1.8446744073709552e19 + } + return [newLow, newHigh] +} + +function shr(a, n) { + var shiftFact + n &= 63 + shiftFact = pwrAsDouble(n) + return create(Math.floor(a[0] / shiftFact), a[1] / shiftFact) +} + +function shru(a, n) { + var sr + n &= 63 + sr = shr(a, n) + if (a[1] < 0) { + sr = add(sr, shl([2, 0], 63 - n)) + } + return sr +} +function sub(a, b) { + return create(a[0] - b[0], a[1] - b[1]) +} + +function $ByteArrayInputStream(this$static, buf) { + this$static.buf = buf + this$static.pos = 0 + this$static.count = buf.length + return this$static +} +function $read(this$static) { + if (this$static.pos >= this$static.count) return -1 + return this$static.buf[this$static.pos++] & 255 +} +function $read_0(this$static, buf, off, len) { + if (this$static.pos >= this$static.count) return -1 + len = Math.min(len, this$static.count - this$static.pos) + arraycopy(this$static.buf, this$static.pos, buf, off, len) + this$static.pos += len + return len +} +function $ByteArrayOutputStream(this$static) { + this$static.buf = initDim(32) + this$static.count = 0 + return this$static +} + +function $toByteArray(this$static) { + var data = this$static.buf + data.length = this$static.count + return data +} +function $write(this$static, b) { + this$static.buf[this$static.count++] = (b << 24) >> 24 +} +function $write_0(this$static, buf, off, len) { + arraycopy(buf, off, this$static.buf, this$static.count, len) + this$static.count += len +} +function $getChars(this$static, srcBegin, srcEnd, dst, dstBegin) { + var srcIdx + for (srcIdx = srcBegin; srcIdx < srcEnd; ++srcIdx) { + dst[dstBegin++] = this$static.charCodeAt(srcIdx) + } +} +function arraycopy(src, srcOfs, dest, destOfs, len) { + for (var i = 0; i < len; ++i) { + dest[destOfs + i] = src[srcOfs + i] + } +} +function $configure(this$static, encoder) { + $SetDictionarySize_0(encoder, 1 << this$static.s) + encoder._numFastBytes = this$static.f + $SetMatchFinder(encoder, this$static.m) + + // lc is always 3 + // lp is always 0 + // pb is always 2 + encoder._numLiteralPosStateBits = 0 + encoder._numLiteralContextBits = 3 + encoder._posStateBits = 2 + encoder._posStateMask = 3 +} + +function $init(this$static, input, output, length_0, mode, enableEndMark) { + var encoder, i + if (compare(length_0, N1_longLit) < 0) + throw new Error('invalid length ' + length_0) + this$static.length_0 = length_0 + encoder = $Encoder({}) + $configure(mode, encoder) + encoder._writeEndMark = enableEndMark + $WriteCoderProperties(encoder, output) + for (i = 0; i < 64; i += 8) $write(output, lowBits_0(shr(length_0, i)) & 255) + this$static.chunker = + ((encoder._needReleaseMFStream = 0), + ((encoder._inStream = input), + (encoder._finished = 0), + $Create_2(encoder), + (encoder._rangeEncoder.Stream = output), + $Init_4(encoder), + $FillDistancesPrices(encoder), + $FillAlignPrices(encoder), + (encoder._lenEncoder._tableSize = encoder._numFastBytes + 1 - 2), + $UpdateTables(encoder._lenEncoder, 1 << encoder._posStateBits), + (encoder._repMatchLenEncoder._tableSize = encoder._numFastBytes + 1 - 2), + $UpdateTables(encoder._repMatchLenEncoder, 1 << encoder._posStateBits), + (encoder.nowPos64 = P0_longLit), + undefined), + $Chunker_0({}, encoder)) +} + +function $LZMAByteArrayCompressor(this$static, data, mode, enableEndMark) { + this$static.output = $ByteArrayOutputStream({}) + $init( + this$static, + $ByteArrayInputStream({}, data), + this$static.output, + fromInt(data.length), + mode, + enableEndMark + ) + return this$static +} +function $init_0(this$static, input, output) { + var decoder, + hex_length = '', + i, + properties = [], + r, + tmp_length + + for (i = 0; i < 5; ++i) { + r = $read(input) + if (r == -1) throw new Error('truncated input') + properties[i] = (r << 24) >> 24 + } + + decoder = $Decoder({}) + if (!$SetDecoderProperties(decoder, properties)) { + throw new Error('corrupted input') + } + for (i = 0; i < 64; i += 8) { + r = $read(input) + if (r == -1) throw new Error('truncated input') + r = r.toString(16) + if (r.length == 1) r = '0' + r + hex_length = r + '' + hex_length + } + + // Was the length set in the header (if it was compressed from a stream, the length is all f"s). + if (/^0+$|^f+$/i.test(hex_length)) { + // The length is unknown, so set to -1. + this$static.length_0 = N1_longLit + } else { + // NOTE: If there is a problem with the decoder because of the length, you can always set the length to -1 (N1_longLit) which means unknown. + tmp_length = parseInt(hex_length, 16) + // If the length is too long to handle, just set it to unknown. + if (tmp_length > 4294967295) { + this$static.length_0 = N1_longLit + } else { + this$static.length_0 = fromInt(tmp_length) + } + } + + this$static.chunker = $CodeInChunks( + decoder, + input, + output, + this$static.length_0 + ) +} + +function $LZMAByteArrayDecompressor(this$static, data) { + this$static.output = $ByteArrayOutputStream({}) + $init_0(this$static, $ByteArrayInputStream({}, data), this$static.output) + return this$static +} +function $Create_4(this$static, keepSizeBefore, keepSizeAfter, keepSizeReserv) { + var blockSize + this$static._keepSizeBefore = keepSizeBefore + this$static._keepSizeAfter = keepSizeAfter + blockSize = keepSizeBefore + keepSizeAfter + keepSizeReserv + if (this$static._bufferBase == null || this$static._blockSize != blockSize) { + this$static._bufferBase = null + this$static._blockSize = blockSize + this$static._bufferBase = initDim(this$static._blockSize) + } + this$static._pointerToLastSafePosition = + this$static._blockSize - keepSizeAfter +} + +function $GetIndexByte(this$static, index) { + return this$static._bufferBase[ + this$static._bufferOffset + this$static._pos + index + ] +} + +function $GetMatchLen(this$static, index, distance, limit) { + var i, pby + if (this$static._streamEndWasReached) { + if (this$static._pos + index + limit > this$static._streamPos) { + limit = this$static._streamPos - (this$static._pos + index) + } + } + ++distance + pby = this$static._bufferOffset + this$static._pos + index + for ( + i = 0; + i < limit && + this$static._bufferBase[pby + i] == + this$static._bufferBase[pby + i - distance]; + ++i + ) {} + return i +} + +function $GetNumAvailableBytes(this$static) { + return this$static._streamPos - this$static._pos +} + +function $MoveBlock(this$static) { + var i, numBytes, offset + offset = + this$static._bufferOffset + this$static._pos - this$static._keepSizeBefore + if (offset > 0) { + --offset + } + numBytes = this$static._bufferOffset + this$static._streamPos - offset + for (i = 0; i < numBytes; ++i) { + this$static._bufferBase[i] = this$static._bufferBase[offset + i] + } + this$static._bufferOffset -= offset +} + +function $MovePos_1(this$static) { + var pointerToPostion + ++this$static._pos + if (this$static._pos > this$static._posLimit) { + pointerToPostion = this$static._bufferOffset + this$static._pos + if (pointerToPostion > this$static._pointerToLastSafePosition) { + $MoveBlock(this$static) + } + $ReadBlock(this$static) + } +} + +function $ReadBlock(this$static) { + var numReadBytes, pointerToPostion, size + if (this$static._streamEndWasReached) return + while (1) { + size = + -this$static._bufferOffset + + this$static._blockSize - + this$static._streamPos + if (!size) return + numReadBytes = $read_0( + this$static._stream, + this$static._bufferBase, + this$static._bufferOffset + this$static._streamPos, + size + ) + if (numReadBytes == -1) { + this$static._posLimit = this$static._streamPos + pointerToPostion = this$static._bufferOffset + this$static._posLimit + if (pointerToPostion > this$static._pointerToLastSafePosition) { + this$static._posLimit = + this$static._pointerToLastSafePosition - this$static._bufferOffset + } + this$static._streamEndWasReached = 1 + return + } + this$static._streamPos += numReadBytes + if ( + this$static._streamPos >= + this$static._pos + this$static._keepSizeAfter + ) { + this$static._posLimit = + this$static._streamPos - this$static._keepSizeAfter + } + } +} + +function $ReduceOffsets(this$static, subValue) { + this$static._bufferOffset += subValue + this$static._posLimit -= subValue + this$static._pos -= subValue + this$static._streamPos -= subValue +} + +var CrcTable = (function() { + var i, + j, + r, + CrcTable = [] + for (i = 0; i < 256; ++i) { + r = i + for (j = 0; j < 8; ++j) + if ((r & 1) != 0) { + r = (r >>> 1) ^ -306674912 + } else { + r >>>= 1 + } + CrcTable[i] = r + } + return CrcTable +})() + +function $Create_3( + this$static, + historySize, + keepAddBufferBefore, + matchMaxLen, + keepAddBufferAfter +) { + var cyclicBufferSize, hs, windowReservSize + if (historySize < 1073741567) { + this$static._cutValue = 16 + (matchMaxLen >> 1) + windowReservSize = + ~~( + (historySize + keepAddBufferBefore + matchMaxLen + keepAddBufferAfter) / + 2 + ) + 256 + $Create_4( + this$static, + historySize + keepAddBufferBefore, + matchMaxLen + keepAddBufferAfter, + windowReservSize + ) + this$static._matchMaxLen = matchMaxLen + cyclicBufferSize = historySize + 1 + if (this$static._cyclicBufferSize != cyclicBufferSize) { + this$static._son = initDim( + (this$static._cyclicBufferSize = cyclicBufferSize) * 2 + ) + } + + hs = 65536 + if (this$static.HASH_ARRAY) { + hs = historySize - 1 + hs |= hs >> 1 + hs |= hs >> 2 + hs |= hs >> 4 + hs |= hs >> 8 + hs >>= 1 + hs |= 65535 + if (hs > 16777216) hs >>= 1 + this$static._hashMask = hs + ++hs + hs += this$static.kFixHashSize + } + + if (hs != this$static._hashSizeSum) { + this$static._hash = initDim((this$static._hashSizeSum = hs)) + } + } +} + +function $GetMatches(this$static, distances) { + var count, + cur, + curMatch, + curMatch2, + curMatch3, + cyclicPos, + delta, + hash2Value, + hash3Value, + hashValue, + len, + len0, + len1, + lenLimit, + matchMinPos, + maxLen, + offset, + pby1, + ptr0, + ptr1, + temp + if (this$static._pos + this$static._matchMaxLen <= this$static._streamPos) { + lenLimit = this$static._matchMaxLen + } else { + lenLimit = this$static._streamPos - this$static._pos + if (lenLimit < this$static.kMinMatchCheck) { + $MovePos_0(this$static) + return 0 + } + } + offset = 0 + matchMinPos = + this$static._pos > this$static._cyclicBufferSize + ? this$static._pos - this$static._cyclicBufferSize + : 0 + cur = this$static._bufferOffset + this$static._pos + maxLen = 1 + hash2Value = 0 + hash3Value = 0 + if (this$static.HASH_ARRAY) { + temp = + CrcTable[this$static._bufferBase[cur] & 255] ^ + (this$static._bufferBase[cur + 1] & 255) + hash2Value = temp & 1023 + temp ^= (this$static._bufferBase[cur + 2] & 255) << 8 + hash3Value = temp & 65535 + hashValue = + (temp ^ (CrcTable[this$static._bufferBase[cur + 3] & 255] << 5)) & + this$static._hashMask + } else { + hashValue = + (this$static._bufferBase[cur] & 255) ^ + ((this$static._bufferBase[cur + 1] & 255) << 8) + } + + curMatch = this$static._hash[this$static.kFixHashSize + hashValue] || 0 + if (this$static.HASH_ARRAY) { + curMatch2 = this$static._hash[hash2Value] || 0 + curMatch3 = this$static._hash[1024 + hash3Value] || 0 + this$static._hash[hash2Value] = this$static._pos + this$static._hash[1024 + hash3Value] = this$static._pos + if (curMatch2 > matchMinPos) { + if ( + this$static._bufferBase[this$static._bufferOffset + curMatch2] == + this$static._bufferBase[cur] + ) { + distances[offset++] = maxLen = 2 + distances[offset++] = this$static._pos - curMatch2 - 1 + } + } + if (curMatch3 > matchMinPos) { + if ( + this$static._bufferBase[this$static._bufferOffset + curMatch3] == + this$static._bufferBase[cur] + ) { + if (curMatch3 == curMatch2) { + offset -= 2 + } + distances[offset++] = maxLen = 3 + distances[offset++] = this$static._pos - curMatch3 - 1 + curMatch2 = curMatch3 + } + } + if (offset != 0 && curMatch2 == curMatch) { + offset -= 2 + maxLen = 1 + } + } + this$static._hash[this$static.kFixHashSize + hashValue] = this$static._pos + ptr0 = (this$static._cyclicBufferPos << 1) + 1 + ptr1 = this$static._cyclicBufferPos << 1 + len0 = len1 = this$static.kNumHashDirectBytes + if (this$static.kNumHashDirectBytes != 0) { + if (curMatch > matchMinPos) { + if ( + this$static._bufferBase[ + this$static._bufferOffset + curMatch + this$static.kNumHashDirectBytes + ] != this$static._bufferBase[cur + this$static.kNumHashDirectBytes] + ) { + distances[offset++] = maxLen = this$static.kNumHashDirectBytes + distances[offset++] = this$static._pos - curMatch - 1 + } + } + } + count = this$static._cutValue + while (1) { + if (curMatch <= matchMinPos || count-- == 0) { + this$static._son[ptr0] = this$static._son[ptr1] = 0 + break + } + delta = this$static._pos - curMatch + cyclicPos = + (delta <= this$static._cyclicBufferPos + ? this$static._cyclicBufferPos - delta + : this$static._cyclicBufferPos - + delta + + this$static._cyclicBufferSize) << 1 + pby1 = this$static._bufferOffset + curMatch + len = len0 < len1 ? len0 : len1 + if ( + this$static._bufferBase[pby1 + len] == this$static._bufferBase[cur + len] + ) { + while (++len != lenLimit) { + if ( + this$static._bufferBase[pby1 + len] != + this$static._bufferBase[cur + len] + ) { + break + } + } + if (maxLen < len) { + distances[offset++] = maxLen = len + distances[offset++] = delta - 1 + if (len == lenLimit) { + this$static._son[ptr1] = this$static._son[cyclicPos] + this$static._son[ptr0] = this$static._son[cyclicPos + 1] + break + } + } + } + if ( + (this$static._bufferBase[pby1 + len] & 255) < + (this$static._bufferBase[cur + len] & 255) + ) { + this$static._son[ptr1] = curMatch + ptr1 = cyclicPos + 1 + curMatch = this$static._son[ptr1] + len1 = len + } else { + this$static._son[ptr0] = curMatch + ptr0 = cyclicPos + curMatch = this$static._son[ptr0] + len0 = len + } + } + $MovePos_0(this$static) + return offset +} + +function $Init_5(this$static) { + this$static._bufferOffset = 0 + this$static._pos = 0 + this$static._streamPos = 0 + this$static._streamEndWasReached = 0 + $ReadBlock(this$static) + this$static._cyclicBufferPos = 0 + $ReduceOffsets(this$static, -1) +} + +function $MovePos_0(this$static) { + var subValue + if (++this$static._cyclicBufferPos >= this$static._cyclicBufferSize) { + this$static._cyclicBufferPos = 0 + } + $MovePos_1(this$static) + if (this$static._pos == 1073741823) { + subValue = this$static._pos - this$static._cyclicBufferSize + $NormalizeLinks( + this$static._son, + this$static._cyclicBufferSize * 2, + subValue + ) + $NormalizeLinks(this$static._hash, this$static._hashSizeSum, subValue) + $ReduceOffsets(this$static, subValue) + } +} + +// NOTE: This is only called after reading one whole gigabyte. +function $NormalizeLinks(items, numItems, subValue) { + var i, value + for (i = 0; i < numItems; ++i) { + value = items[i] || 0 + if (value <= subValue) { + value = 0 + } else { + value -= subValue + } + items[i] = value + } +} + +function $SetType(this$static, numHashBytes) { + this$static.HASH_ARRAY = numHashBytes > 2 + if (this$static.HASH_ARRAY) { + this$static.kNumHashDirectBytes = 0 + this$static.kMinMatchCheck = 4 + this$static.kFixHashSize = 66560 + } else { + this$static.kNumHashDirectBytes = 2 + this$static.kMinMatchCheck = 3 + this$static.kFixHashSize = 0 + } +} + +function $Skip(this$static, num) { + var count, + cur, + curMatch, + cyclicPos, + delta, + hash2Value, + hash3Value, + hashValue, + len, + len0, + len1, + lenLimit, + matchMinPos, + pby1, + ptr0, + ptr1, + temp + do { + if (this$static._pos + this$static._matchMaxLen <= this$static._streamPos) { + lenLimit = this$static._matchMaxLen + } else { + lenLimit = this$static._streamPos - this$static._pos + if (lenLimit < this$static.kMinMatchCheck) { + $MovePos_0(this$static) + continue + } + } + matchMinPos = + this$static._pos > this$static._cyclicBufferSize + ? this$static._pos - this$static._cyclicBufferSize + : 0 + cur = this$static._bufferOffset + this$static._pos + if (this$static.HASH_ARRAY) { + temp = + CrcTable[this$static._bufferBase[cur] & 255] ^ + (this$static._bufferBase[cur + 1] & 255) + hash2Value = temp & 1023 + this$static._hash[hash2Value] = this$static._pos + temp ^= (this$static._bufferBase[cur + 2] & 255) << 8 + hash3Value = temp & 65535 + this$static._hash[1024 + hash3Value] = this$static._pos + hashValue = + (temp ^ (CrcTable[this$static._bufferBase[cur + 3] & 255] << 5)) & + this$static._hashMask + } else { + hashValue = + (this$static._bufferBase[cur] & 255) ^ + ((this$static._bufferBase[cur + 1] & 255) << 8) + } + curMatch = this$static._hash[this$static.kFixHashSize + hashValue] + this$static._hash[this$static.kFixHashSize + hashValue] = this$static._pos + ptr0 = (this$static._cyclicBufferPos << 1) + 1 + ptr1 = this$static._cyclicBufferPos << 1 + len0 = len1 = this$static.kNumHashDirectBytes + count = this$static._cutValue + while (1) { + if (curMatch <= matchMinPos || count-- == 0) { + this$static._son[ptr0] = this$static._son[ptr1] = 0 + break + } + delta = this$static._pos - curMatch + cyclicPos = + (delta <= this$static._cyclicBufferPos + ? this$static._cyclicBufferPos - delta + : this$static._cyclicBufferPos - + delta + + this$static._cyclicBufferSize) << 1 + pby1 = this$static._bufferOffset + curMatch + len = len0 < len1 ? len0 : len1 + if ( + this$static._bufferBase[pby1 + len] == + this$static._bufferBase[cur + len] + ) { + while (++len != lenLimit) { + if ( + this$static._bufferBase[pby1 + len] != + this$static._bufferBase[cur + len] + ) { + break + } + } + if (len == lenLimit) { + this$static._son[ptr1] = this$static._son[cyclicPos] + this$static._son[ptr0] = this$static._son[cyclicPos + 1] + break + } + } + if ( + (this$static._bufferBase[pby1 + len] & 255) < + (this$static._bufferBase[cur + len] & 255) + ) { + this$static._son[ptr1] = curMatch + ptr1 = cyclicPos + 1 + curMatch = this$static._son[ptr1] + len1 = len + } else { + this$static._son[ptr0] = curMatch + ptr0 = cyclicPos + curMatch = this$static._son[ptr0] + len0 = len + } + } + $MovePos_0(this$static) + } while (--num != 0) +} +function $CopyBlock(this$static, distance, len) { + var pos = this$static._pos - distance - 1 + if (pos < 0) { + pos += this$static._windowSize + } + for (; len != 0; --len) { + if (pos >= this$static._windowSize) { + pos = 0 + } + this$static._buffer[this$static._pos++] = this$static._buffer[pos++] + if (this$static._pos >= this$static._windowSize) { + $Flush_0(this$static) + } + } +} + +function $Create_5(this$static, windowSize) { + if (this$static._buffer == null || this$static._windowSize != windowSize) { + this$static._buffer = initDim(windowSize) + } + this$static._windowSize = windowSize + this$static._pos = 0 + this$static._streamPos = 0 +} + +function $Flush_0(this$static) { + var size = this$static._pos - this$static._streamPos + if (!size) { + return + } + $write_0( + this$static._stream, + this$static._buffer, + this$static._streamPos, + size + ) + if (this$static._pos >= this$static._windowSize) { + this$static._pos = 0 + } + this$static._streamPos = this$static._pos +} + +function $GetByte(this$static, distance) { + var pos = this$static._pos - distance - 1 + if (pos < 0) { + pos += this$static._windowSize + } + return this$static._buffer[pos] +} + +function $PutByte(this$static, b) { + this$static._buffer[this$static._pos++] = b + if (this$static._pos >= this$static._windowSize) { + $Flush_0(this$static) + } +} + +function $ReleaseStream(this$static) { + $Flush_0(this$static) + this$static._stream = null +} +function GetLenToPosState(len) { + len -= 2 + if (len < 4) { + return len + } + return 3 +} + +function StateUpdateChar(index) { + if (index < 4) { + return 0 + } + if (index < 10) { + return index - 3 + } + return index - 6 +} +function $Chunker_0(this$static, encoder) { + this$static.encoder = encoder + this$static.decoder = null + this$static.alive = 1 + return this$static +} +function $Chunker(this$static, decoder) { + this$static.decoder = decoder + this$static.encoder = null + this$static.alive = 1 + return this$static +} +function $processChunk(this$static) { + if (!this$static.alive) { + throw new Error('bad state') + } + + if (this$static.encoder) { + $processEncoderChunk(this$static) + } else { + $processDecoderChunk(this$static) + } + + return this$static.alive +} +function $processDecoderChunk(this$static) { + var result = $CodeOneChunk(this$static.decoder) + if (result == -1) { + throw new Error('corrupted input') + } + this$static.inBytesProcessed = N1_longLit + this$static.outBytesProcessed = this$static.decoder.nowPos64 + if ( + result || + (compare(this$static.decoder.outSize, P0_longLit) >= 0 && + compare(this$static.decoder.nowPos64, this$static.decoder.outSize) >= 0) + ) { + $Flush_0(this$static.decoder.m_OutWindow) + $ReleaseStream(this$static.decoder.m_OutWindow) + this$static.decoder.m_RangeDecoder.Stream = null + this$static.alive = 0 + } +} +function $processEncoderChunk(this$static) { + $CodeOneBlock( + this$static.encoder, + this$static.encoder.processedInSize, + this$static.encoder.processedOutSize, + this$static.encoder.finished + ) + this$static.inBytesProcessed = this$static.encoder.processedInSize[0] + if (this$static.encoder.finished[0]) { + $ReleaseStreams(this$static.encoder) + this$static.alive = 0 + } +} +function $CodeInChunks(this$static, inStream, outStream, outSize) { + this$static.m_RangeDecoder.Stream = inStream + $ReleaseStream(this$static.m_OutWindow) + this$static.m_OutWindow._stream = outStream + $Init_1(this$static) + this$static.state = 0 + this$static.rep0 = 0 + this$static.rep1 = 0 + this$static.rep2 = 0 + this$static.rep3 = 0 + this$static.outSize = outSize + this$static.nowPos64 = P0_longLit + this$static.prevByte = 0 + return $Chunker({}, this$static) +} + +function $CodeOneChunk(this$static) { + var decoder2, distance, len, numDirectBits, posSlot, posState + posState = lowBits_0(this$static.nowPos64) & this$static.m_PosStateMask + if ( + !$DecodeBit( + this$static.m_RangeDecoder, + this$static.m_IsMatchDecoders, + (this$static.state << 4) + posState + ) + ) { + decoder2 = $GetDecoder( + this$static.m_LiteralDecoder, + lowBits_0(this$static.nowPos64), + this$static.prevByte + ) + if (this$static.state < 7) { + this$static.prevByte = $DecodeNormal(decoder2, this$static.m_RangeDecoder) + } else { + this$static.prevByte = $DecodeWithMatchByte( + decoder2, + this$static.m_RangeDecoder, + $GetByte(this$static.m_OutWindow, this$static.rep0) + ) + } + $PutByte(this$static.m_OutWindow, this$static.prevByte) + this$static.state = StateUpdateChar(this$static.state) + this$static.nowPos64 = add(this$static.nowPos64, P1_longLit) + } else { + if ( + $DecodeBit( + this$static.m_RangeDecoder, + this$static.m_IsRepDecoders, + this$static.state + ) + ) { + len = 0 + if ( + !$DecodeBit( + this$static.m_RangeDecoder, + this$static.m_IsRepG0Decoders, + this$static.state + ) + ) { + if ( + !$DecodeBit( + this$static.m_RangeDecoder, + this$static.m_IsRep0LongDecoders, + (this$static.state << 4) + posState + ) + ) { + this$static.state = this$static.state < 7 ? 9 : 11 + len = 1 + } + } else { + if ( + !$DecodeBit( + this$static.m_RangeDecoder, + this$static.m_IsRepG1Decoders, + this$static.state + ) + ) { + distance = this$static.rep1 + } else { + if ( + !$DecodeBit( + this$static.m_RangeDecoder, + this$static.m_IsRepG2Decoders, + this$static.state + ) + ) { + distance = this$static.rep2 + } else { + distance = this$static.rep3 + this$static.rep3 = this$static.rep2 + } + this$static.rep2 = this$static.rep1 + } + this$static.rep1 = this$static.rep0 + this$static.rep0 = distance + } + if (!len) { + len = + $Decode( + this$static.m_RepLenDecoder, + this$static.m_RangeDecoder, + posState + ) + 2 + this$static.state = this$static.state < 7 ? 8 : 11 + } + } else { + this$static.rep3 = this$static.rep2 + this$static.rep2 = this$static.rep1 + this$static.rep1 = this$static.rep0 + len = + 2 + + $Decode(this$static.m_LenDecoder, this$static.m_RangeDecoder, posState) + this$static.state = this$static.state < 7 ? 7 : 10 + posSlot = $Decode_0( + this$static.m_PosSlotDecoder[GetLenToPosState(len)], + this$static.m_RangeDecoder + ) + if (posSlot >= 4) { + numDirectBits = (posSlot >> 1) - 1 + this$static.rep0 = (2 | (posSlot & 1)) << numDirectBits + if (posSlot < 14) { + this$static.rep0 += ReverseDecode( + this$static.m_PosDecoders, + this$static.rep0 - posSlot - 1, + this$static.m_RangeDecoder, + numDirectBits + ) + } else { + this$static.rep0 += + $DecodeDirectBits(this$static.m_RangeDecoder, numDirectBits - 4) << + 4 + this$static.rep0 += $ReverseDecode( + this$static.m_PosAlignDecoder, + this$static.m_RangeDecoder + ) + if (this$static.rep0 < 0) { + if (this$static.rep0 == -1) { + return 1 + } + return -1 + } + } + } else this$static.rep0 = posSlot + } + if ( + compare(fromInt(this$static.rep0), this$static.nowPos64) >= 0 || + this$static.rep0 >= this$static.m_DictionarySizeCheck + ) { + return -1 + } + $CopyBlock(this$static.m_OutWindow, this$static.rep0, len) + this$static.nowPos64 = add(this$static.nowPos64, fromInt(len)) + this$static.prevByte = $GetByte(this$static.m_OutWindow, 0) + } + return 0 +} + +function $Decoder(this$static) { + this$static.m_OutWindow = {} + this$static.m_RangeDecoder = {} + this$static.m_IsMatchDecoders = initDim(192) + this$static.m_IsRepDecoders = initDim(12) + this$static.m_IsRepG0Decoders = initDim(12) + this$static.m_IsRepG1Decoders = initDim(12) + this$static.m_IsRepG2Decoders = initDim(12) + this$static.m_IsRep0LongDecoders = initDim(192) + this$static.m_PosSlotDecoder = initDim(4) + this$static.m_PosDecoders = initDim(114) + this$static.m_PosAlignDecoder = $BitTreeDecoder({}, 4) + this$static.m_LenDecoder = $Decoder$LenDecoder({}) + this$static.m_RepLenDecoder = $Decoder$LenDecoder({}) + this$static.m_LiteralDecoder = {} + for (var i = 0; i < 4; ++i) { + this$static.m_PosSlotDecoder[i] = $BitTreeDecoder({}, 6) + } + return this$static +} + +function $Init_1(this$static) { + this$static.m_OutWindow._streamPos = 0 + this$static.m_OutWindow._pos = 0 + InitBitModels(this$static.m_IsMatchDecoders) + InitBitModels(this$static.m_IsRep0LongDecoders) + InitBitModels(this$static.m_IsRepDecoders) + InitBitModels(this$static.m_IsRepG0Decoders) + InitBitModels(this$static.m_IsRepG1Decoders) + InitBitModels(this$static.m_IsRepG2Decoders) + InitBitModels(this$static.m_PosDecoders) + $Init_0(this$static.m_LiteralDecoder) + for (var i = 0; i < 4; ++i) { + InitBitModels(this$static.m_PosSlotDecoder[i].Models) + } + $Init(this$static.m_LenDecoder) + $Init(this$static.m_RepLenDecoder) + InitBitModels(this$static.m_PosAlignDecoder.Models) + $Init_8(this$static.m_RangeDecoder) +} + +function $SetDecoderProperties(this$static, properties) { + var dictionarySize, i, lc, lp, pb, remainder, val + if (properties.length < 5) return 0 + val = properties[0] & 255 + lc = val % 9 + remainder = ~~(val / 9) + lp = remainder % 5 + pb = ~~(remainder / 5) + dictionarySize = 0 + for (i = 0; i < 4; ++i) { + dictionarySize += (properties[1 + i] & 255) << (i * 8) + } + // NOTE: If the input is bad, it might call for an insanely large dictionary size, which would crash the script. + if (dictionarySize > 99999999 || !$SetLcLpPb(this$static, lc, lp, pb)) { + return 0 + } + return $SetDictionarySize(this$static, dictionarySize) +} + +function $SetDictionarySize(this$static, dictionarySize) { + if (dictionarySize < 0) { + return 0 + } + if (this$static.m_DictionarySize != dictionarySize) { + this$static.m_DictionarySize = dictionarySize + this$static.m_DictionarySizeCheck = Math.max( + this$static.m_DictionarySize, + 1 + ) + $Create_5( + this$static.m_OutWindow, + Math.max(this$static.m_DictionarySizeCheck, 4096) + ) + } + return 1 +} + +function $SetLcLpPb(this$static, lc, lp, pb) { + if (lc > 8 || lp > 4 || pb > 4) { + return 0 + } + $Create_0(this$static.m_LiteralDecoder, lp, lc) + var numPosStates = 1 << pb + $Create(this$static.m_LenDecoder, numPosStates) + $Create(this$static.m_RepLenDecoder, numPosStates) + this$static.m_PosStateMask = numPosStates - 1 + return 1 +} + +function $Create(this$static, numPosStates) { + for ( + ; + this$static.m_NumPosStates < numPosStates; + ++this$static.m_NumPosStates + ) { + this$static.m_LowCoder[this$static.m_NumPosStates] = $BitTreeDecoder({}, 3) + this$static.m_MidCoder[this$static.m_NumPosStates] = $BitTreeDecoder({}, 3) + } +} + +function $Decode(this$static, rangeDecoder, posState) { + if (!$DecodeBit(rangeDecoder, this$static.m_Choice, 0)) { + return $Decode_0(this$static.m_LowCoder[posState], rangeDecoder) + } + var symbol = 8 + if (!$DecodeBit(rangeDecoder, this$static.m_Choice, 1)) { + symbol += $Decode_0(this$static.m_MidCoder[posState], rangeDecoder) + } else { + symbol += 8 + $Decode_0(this$static.m_HighCoder, rangeDecoder) + } + return symbol +} + +function $Decoder$LenDecoder(this$static) { + this$static.m_Choice = initDim(2) + this$static.m_LowCoder = initDim(16) + this$static.m_MidCoder = initDim(16) + this$static.m_HighCoder = $BitTreeDecoder({}, 8) + this$static.m_NumPosStates = 0 + return this$static +} + +function $Init(this$static) { + InitBitModels(this$static.m_Choice) + for (var posState = 0; posState < this$static.m_NumPosStates; ++posState) { + InitBitModels(this$static.m_LowCoder[posState].Models) + InitBitModels(this$static.m_MidCoder[posState].Models) + } + InitBitModels(this$static.m_HighCoder.Models) +} + +function $Create_0(this$static, numPosBits, numPrevBits) { + var i, numStates + if ( + this$static.m_Coders != null && + this$static.m_NumPrevBits == numPrevBits && + this$static.m_NumPosBits == numPosBits + ) + return + this$static.m_NumPosBits = numPosBits + this$static.m_PosMask = (1 << numPosBits) - 1 + this$static.m_NumPrevBits = numPrevBits + numStates = 1 << (this$static.m_NumPrevBits + this$static.m_NumPosBits) + this$static.m_Coders = initDim(numStates) + for (i = 0; i < numStates; ++i) + this$static.m_Coders[i] = $Decoder$LiteralDecoder$Decoder2({}) +} + +function $GetDecoder(this$static, pos, prevByte) { + return this$static.m_Coders[ + ((pos & this$static.m_PosMask) << this$static.m_NumPrevBits) + + ((prevByte & 255) >>> (8 - this$static.m_NumPrevBits)) + ] +} + +function $Init_0(this$static) { + var i, numStates + numStates = 1 << (this$static.m_NumPrevBits + this$static.m_NumPosBits) + for (i = 0; i < numStates; ++i) { + InitBitModels(this$static.m_Coders[i].m_Decoders) + } +} + +function $DecodeNormal(this$static, rangeDecoder) { + var symbol = 1 + do { + symbol = + (symbol << 1) | $DecodeBit(rangeDecoder, this$static.m_Decoders, symbol) + } while (symbol < 256) + return (symbol << 24) >> 24 +} + +function $DecodeWithMatchByte(this$static, rangeDecoder, matchByte) { + var bit, + matchBit, + symbol = 1 + do { + matchBit = (matchByte >> 7) & 1 + matchByte <<= 1 + bit = $DecodeBit( + rangeDecoder, + this$static.m_Decoders, + ((1 + matchBit) << 8) + symbol + ) + symbol = (symbol << 1) | bit + if (matchBit != bit) { + while (symbol < 256) { + symbol = + (symbol << 1) | + $DecodeBit(rangeDecoder, this$static.m_Decoders, symbol) + } + break + } + } while (symbol < 256) + return (symbol << 24) >> 24 +} + +function $Decoder$LiteralDecoder$Decoder2(this$static) { + this$static.m_Decoders = initDim(768) + return this$static +} +var g_FastPos = (function() { + var j, + k, + slotFast, + c = 2, + g_FastPos = [0, 1] + for (slotFast = 2; slotFast < 22; ++slotFast) { + k = 1 << ((slotFast >> 1) - 1) + for (j = 0; j < k; ++j, ++c) g_FastPos[c] = (slotFast << 24) >> 24 + } + return g_FastPos +})() + +function $Backward(this$static, cur) { + var backCur, backMem, posMem, posPrev + this$static._optimumEndIndex = cur + posMem = this$static._optimum[cur].PosPrev + backMem = this$static._optimum[cur].BackPrev + do { + if (this$static._optimum[cur].Prev1IsChar) { + $MakeAsChar(this$static._optimum[posMem]) + this$static._optimum[posMem].PosPrev = posMem - 1 + if (this$static._optimum[cur].Prev2) { + this$static._optimum[posMem - 1].Prev1IsChar = 0 + this$static._optimum[posMem - 1].PosPrev = + this$static._optimum[cur].PosPrev2 + this$static._optimum[posMem - 1].BackPrev = + this$static._optimum[cur].BackPrev2 + } + } + posPrev = posMem + backCur = backMem + backMem = this$static._optimum[posPrev].BackPrev + posMem = this$static._optimum[posPrev].PosPrev + this$static._optimum[posPrev].BackPrev = backCur + this$static._optimum[posPrev].PosPrev = cur + cur = posPrev + } while (cur > 0) + this$static.backRes = this$static._optimum[0].BackPrev + this$static._optimumCurrentIndex = this$static._optimum[0].PosPrev + return this$static._optimumCurrentIndex +} + +function $BaseInit(this$static) { + this$static._state = 0 + this$static._previousByte = 0 + for (var i = 0; i < 4; ++i) { + this$static._repDistances[i] = 0 + } +} + +function $CodeOneBlock(this$static, inSize, outSize, finished) { + var baseVal, + complexState, + curByte, + distance, + footerBits, + i, + len, + lenToPosState, + matchByte, + pos, + posReduced, + posSlot, + posState, + progressPosValuePrev, + subCoder + inSize[0] = P0_longLit + outSize[0] = P0_longLit + finished[0] = 1 + if (this$static._inStream) { + this$static._matchFinder._stream = this$static._inStream + $Init_5(this$static._matchFinder) + this$static._needReleaseMFStream = 1 + this$static._inStream = null + } + if (this$static._finished) { + return + } + this$static._finished = 1 + progressPosValuePrev = this$static.nowPos64 + if (eq(this$static.nowPos64, P0_longLit)) { + if (!$GetNumAvailableBytes(this$static._matchFinder)) { + $Flush(this$static, lowBits_0(this$static.nowPos64)) + return + } + $ReadMatchDistances(this$static) + posState = lowBits_0(this$static.nowPos64) & this$static._posStateMask + $Encode_3( + this$static._rangeEncoder, + this$static._isMatch, + (this$static._state << 4) + posState, + 0 + ) + this$static._state = StateUpdateChar(this$static._state) + curByte = $GetIndexByte( + this$static._matchFinder, + -this$static._additionalOffset + ) + $Encode_1( + $GetSubCoder( + this$static._literalEncoder, + lowBits_0(this$static.nowPos64), + this$static._previousByte + ), + this$static._rangeEncoder, + curByte + ) + this$static._previousByte = curByte + --this$static._additionalOffset + this$static.nowPos64 = add(this$static.nowPos64, P1_longLit) + } + if (!$GetNumAvailableBytes(this$static._matchFinder)) { + $Flush(this$static, lowBits_0(this$static.nowPos64)) + return + } + while (1) { + len = $GetOptimum(this$static, lowBits_0(this$static.nowPos64)) + pos = this$static.backRes + posState = lowBits_0(this$static.nowPos64) & this$static._posStateMask + complexState = (this$static._state << 4) + posState + if (len == 1 && pos == -1) { + $Encode_3( + this$static._rangeEncoder, + this$static._isMatch, + complexState, + 0 + ) + curByte = $GetIndexByte( + this$static._matchFinder, + -this$static._additionalOffset + ) + subCoder = $GetSubCoder( + this$static._literalEncoder, + lowBits_0(this$static.nowPos64), + this$static._previousByte + ) + if (this$static._state < 7) { + $Encode_1(subCoder, this$static._rangeEncoder, curByte) + } else { + matchByte = $GetIndexByte( + this$static._matchFinder, + -this$static._repDistances[0] - 1 - this$static._additionalOffset + ) + $EncodeMatched(subCoder, this$static._rangeEncoder, matchByte, curByte) + } + this$static._previousByte = curByte + this$static._state = StateUpdateChar(this$static._state) + } else { + $Encode_3( + this$static._rangeEncoder, + this$static._isMatch, + complexState, + 1 + ) + if (pos < 4) { + $Encode_3( + this$static._rangeEncoder, + this$static._isRep, + this$static._state, + 1 + ) + if (!pos) { + $Encode_3( + this$static._rangeEncoder, + this$static._isRepG0, + this$static._state, + 0 + ) + if (len == 1) { + $Encode_3( + this$static._rangeEncoder, + this$static._isRep0Long, + complexState, + 0 + ) + } else { + $Encode_3( + this$static._rangeEncoder, + this$static._isRep0Long, + complexState, + 1 + ) + } + } else { + $Encode_3( + this$static._rangeEncoder, + this$static._isRepG0, + this$static._state, + 1 + ) + if (pos == 1) { + $Encode_3( + this$static._rangeEncoder, + this$static._isRepG1, + this$static._state, + 0 + ) + } else { + $Encode_3( + this$static._rangeEncoder, + this$static._isRepG1, + this$static._state, + 1 + ) + $Encode_3( + this$static._rangeEncoder, + this$static._isRepG2, + this$static._state, + pos - 2 + ) + } + } + if (len == 1) { + this$static._state = this$static._state < 7 ? 9 : 11 + } else { + $Encode_0( + this$static._repMatchLenEncoder, + this$static._rangeEncoder, + len - 2, + posState + ) + this$static._state = this$static._state < 7 ? 8 : 11 + } + distance = this$static._repDistances[pos] + if (pos != 0) { + for (i = pos; i >= 1; --i) { + this$static._repDistances[i] = this$static._repDistances[i - 1] + } + this$static._repDistances[0] = distance + } + } else { + $Encode_3( + this$static._rangeEncoder, + this$static._isRep, + this$static._state, + 0 + ) + this$static._state = this$static._state < 7 ? 7 : 10 + $Encode_0( + this$static._lenEncoder, + this$static._rangeEncoder, + len - 2, + posState + ) + pos -= 4 + posSlot = GetPosSlot(pos) + lenToPosState = GetLenToPosState(len) + $Encode_2( + this$static._posSlotEncoder[lenToPosState], + this$static._rangeEncoder, + posSlot + ) + if (posSlot >= 4) { + footerBits = (posSlot >> 1) - 1 + baseVal = (2 | (posSlot & 1)) << footerBits + posReduced = pos - baseVal + if (posSlot < 14) { + ReverseEncode( + this$static._posEncoders, + baseVal - posSlot - 1, + this$static._rangeEncoder, + footerBits, + posReduced + ) + } else { + $EncodeDirectBits( + this$static._rangeEncoder, + posReduced >> 4, + footerBits - 4 + ) + $ReverseEncode( + this$static._posAlignEncoder, + this$static._rangeEncoder, + posReduced & 15 + ) + ++this$static._alignPriceCount + } + } + distance = pos + for (i = 3; i >= 1; --i) { + this$static._repDistances[i] = this$static._repDistances[i - 1] + } + this$static._repDistances[0] = distance + ++this$static._matchPriceCount + } + this$static._previousByte = $GetIndexByte( + this$static._matchFinder, + len - 1 - this$static._additionalOffset + ) + } + this$static._additionalOffset -= len + this$static.nowPos64 = add(this$static.nowPos64, fromInt(len)) + if (!this$static._additionalOffset) { + if (this$static._matchPriceCount >= 128) { + $FillDistancesPrices(this$static) + } + if (this$static._alignPriceCount >= 16) { + $FillAlignPrices(this$static) + } + inSize[0] = this$static.nowPos64 + outSize[0] = $GetProcessedSizeAdd(this$static._rangeEncoder) + if (!$GetNumAvailableBytes(this$static._matchFinder)) { + $Flush(this$static, lowBits_0(this$static.nowPos64)) + return + } + if ( + compare(sub(this$static.nowPos64, progressPosValuePrev), [4096, 0]) >= 0 + ) { + this$static._finished = 0 + finished[0] = 0 + return + } + } + } +} + +function $Create_2(this$static) { + var bt, numHashBytes + if (!this$static._matchFinder) { + bt = {} + numHashBytes = 4 + if (!this$static._matchFinderType) { + numHashBytes = 2 + } + $SetType(bt, numHashBytes) + this$static._matchFinder = bt + } + $Create_1( + this$static._literalEncoder, + this$static._numLiteralPosStateBits, + this$static._numLiteralContextBits + ) + if ( + this$static._dictionarySize == this$static._dictionarySizePrev && + this$static._numFastBytesPrev == this$static._numFastBytes + ) { + return + } + $Create_3( + this$static._matchFinder, + this$static._dictionarySize, + 4096, + this$static._numFastBytes, + 274 + ) + this$static._dictionarySizePrev = this$static._dictionarySize + this$static._numFastBytesPrev = this$static._numFastBytes +} + +function $Encoder(this$static) { + var i + this$static._repDistances = initDim(4) + this$static._optimum = [] + this$static._rangeEncoder = {} + this$static._isMatch = initDim(192) + this$static._isRep = initDim(12) + this$static._isRepG0 = initDim(12) + this$static._isRepG1 = initDim(12) + this$static._isRepG2 = initDim(12) + this$static._isRep0Long = initDim(192) + this$static._posSlotEncoder = [] + this$static._posEncoders = initDim(114) + this$static._posAlignEncoder = $BitTreeEncoder({}, 4) + this$static._lenEncoder = $Encoder$LenPriceTableEncoder({}) + this$static._repMatchLenEncoder = $Encoder$LenPriceTableEncoder({}) + this$static._literalEncoder = {} + this$static._matchDistances = [] + this$static._posSlotPrices = [] + this$static._distancesPrices = [] + this$static._alignPrices = initDim(16) + this$static.reps = initDim(4) + this$static.repLens = initDim(4) + this$static.processedInSize = [P0_longLit] + this$static.processedOutSize = [P0_longLit] + this$static.finished = [0] + this$static.properties = initDim(5) + this$static.tempPrices = initDim(128) + this$static._longestMatchLength = 0 + this$static._matchFinderType = 1 + this$static._numDistancePairs = 0 + this$static._numFastBytesPrev = -1 + this$static.backRes = 0 + for (i = 0; i < 4096; ++i) { + this$static._optimum[i] = {} + } + for (i = 0; i < 4; ++i) { + this$static._posSlotEncoder[i] = $BitTreeEncoder({}, 6) + } + return this$static +} + +function $FillAlignPrices(this$static) { + for (var i = 0; i < 16; ++i) { + this$static._alignPrices[i] = $ReverseGetPrice( + this$static._posAlignEncoder, + i + ) + } + this$static._alignPriceCount = 0 +} + +function $FillDistancesPrices(this$static) { + var baseVal, encoder, footerBits, i, lenToPosState, posSlot, st, st2 + for (i = 4; i < 128; ++i) { + posSlot = GetPosSlot(i) + footerBits = (posSlot >> 1) - 1 + baseVal = (2 | (posSlot & 1)) << footerBits + this$static.tempPrices[i] = ReverseGetPrice( + this$static._posEncoders, + baseVal - posSlot - 1, + footerBits, + i - baseVal + ) + } + for (lenToPosState = 0; lenToPosState < 4; ++lenToPosState) { + encoder = this$static._posSlotEncoder[lenToPosState] + st = lenToPosState << 6 + for (posSlot = 0; posSlot < this$static._distTableSize; ++posSlot) { + this$static._posSlotPrices[st + posSlot] = $GetPrice_1(encoder, posSlot) + } + for (posSlot = 14; posSlot < this$static._distTableSize; ++posSlot) { + this$static._posSlotPrices[st + posSlot] += ((posSlot >> 1) - 1 - 4) << 6 + } + st2 = lenToPosState * 128 + for (i = 0; i < 4; ++i) { + this$static._distancesPrices[st2 + i] = this$static._posSlotPrices[st + i] + } + for (; i < 128; ++i) { + this$static._distancesPrices[st2 + i] = + this$static._posSlotPrices[st + GetPosSlot(i)] + + this$static.tempPrices[i] + } + } + this$static._matchPriceCount = 0 +} + +function $Flush(this$static, nowPos) { + $ReleaseMFStream(this$static) + $WriteEndMarker(this$static, nowPos & this$static._posStateMask) + for (var i = 0; i < 5; ++i) { + $ShiftLow(this$static._rangeEncoder) + } +} + +function $GetOptimum(this$static, position) { + var cur, + curAnd1Price, + curAndLenCharPrice, + curAndLenPrice, + curBack, + curPrice, + currentByte, + distance, + i, + len, + lenEnd, + lenMain, + lenRes, + lenTest, + lenTest2, + lenTestTemp, + matchByte, + matchPrice, + newLen, + nextIsChar, + nextMatchPrice, + nextOptimum, + nextRepMatchPrice, + normalMatchPrice, + numAvailableBytes, + numAvailableBytesFull, + numDistancePairs, + offs, + offset, + opt, + optimum, + pos, + posPrev, + posState, + posStateNext, + price_4, + repIndex, + repLen, + repMatchPrice, + repMaxIndex, + shortRepPrice, + startLen, + state, + state2, + t, + price, + price_0, + price_1, + price_2, + price_3 + if (this$static._optimumEndIndex != this$static._optimumCurrentIndex) { + lenRes = + this$static._optimum[this$static._optimumCurrentIndex].PosPrev - + this$static._optimumCurrentIndex + this$static.backRes = + this$static._optimum[this$static._optimumCurrentIndex].BackPrev + this$static._optimumCurrentIndex = + this$static._optimum[this$static._optimumCurrentIndex].PosPrev + return lenRes + } + this$static._optimumCurrentIndex = this$static._optimumEndIndex = 0 + if (this$static._longestMatchWasFound) { + lenMain = this$static._longestMatchLength + this$static._longestMatchWasFound = 0 + } else { + lenMain = $ReadMatchDistances(this$static) + } + numDistancePairs = this$static._numDistancePairs + numAvailableBytes = $GetNumAvailableBytes(this$static._matchFinder) + 1 + if (numAvailableBytes < 2) { + this$static.backRes = -1 + return 1 + } + if (numAvailableBytes > 273) { + numAvailableBytes = 273 + } + repMaxIndex = 0 + for (i = 0; i < 4; ++i) { + this$static.reps[i] = this$static._repDistances[i] + this$static.repLens[i] = $GetMatchLen( + this$static._matchFinder, + -1, + this$static.reps[i], + 273 + ) + if (this$static.repLens[i] > this$static.repLens[repMaxIndex]) { + repMaxIndex = i + } + } + if (this$static.repLens[repMaxIndex] >= this$static._numFastBytes) { + this$static.backRes = repMaxIndex + lenRes = this$static.repLens[repMaxIndex] + $MovePos(this$static, lenRes - 1) + return lenRes + } + if (lenMain >= this$static._numFastBytes) { + this$static.backRes = this$static._matchDistances[numDistancePairs - 1] + 4 + $MovePos(this$static, lenMain - 1) + return lenMain + } + currentByte = $GetIndexByte(this$static._matchFinder, -1) + matchByte = $GetIndexByte( + this$static._matchFinder, + -this$static._repDistances[0] - 1 - 1 + ) + if ( + lenMain < 2 && + currentByte != matchByte && + this$static.repLens[repMaxIndex] < 2 + ) { + this$static.backRes = -1 + return 1 + } + this$static._optimum[0].State = this$static._state + posState = position & this$static._posStateMask + this$static._optimum[1].Price = + ProbPrices[ + this$static._isMatch[(this$static._state << 4) + posState] >>> 2 + ] + + $GetPrice_0( + $GetSubCoder( + this$static._literalEncoder, + position, + this$static._previousByte + ), + this$static._state >= 7, + matchByte, + currentByte + ) + $MakeAsChar(this$static._optimum[1]) + matchPrice = + ProbPrices[ + (2048 - this$static._isMatch[(this$static._state << 4) + posState]) >>> 2 + ] + repMatchPrice = + matchPrice + + ProbPrices[(2048 - this$static._isRep[this$static._state]) >>> 2] + if (matchByte == currentByte) { + shortRepPrice = + repMatchPrice + + $GetRepLen1Price(this$static, this$static._state, posState) + if (shortRepPrice < this$static._optimum[1].Price) { + this$static._optimum[1].Price = shortRepPrice + $MakeAsShortRep(this$static._optimum[1]) + } + } + lenEnd = + lenMain >= this$static.repLens[repMaxIndex] + ? lenMain + : this$static.repLens[repMaxIndex] + if (lenEnd < 2) { + this$static.backRes = this$static._optimum[1].BackPrev + return 1 + } + this$static._optimum[1].PosPrev = 0 + this$static._optimum[0].Backs0 = this$static.reps[0] + this$static._optimum[0].Backs1 = this$static.reps[1] + this$static._optimum[0].Backs2 = this$static.reps[2] + this$static._optimum[0].Backs3 = this$static.reps[3] + len = lenEnd + do { + this$static._optimum[len--].Price = 268435455 + } while (len >= 2) + for (i = 0; i < 4; ++i) { + repLen = this$static.repLens[i] + if (repLen < 2) { + continue + } + price_4 = + repMatchPrice + + $GetPureRepPrice(this$static, i, this$static._state, posState) + do { + curAndLenPrice = + price_4 + + $GetPrice(this$static._repMatchLenEncoder, repLen - 2, posState) + optimum = this$static._optimum[repLen] + if (curAndLenPrice < optimum.Price) { + optimum.Price = curAndLenPrice + optimum.PosPrev = 0 + optimum.BackPrev = i + optimum.Prev1IsChar = 0 + } + } while (--repLen >= 2) + } + normalMatchPrice = + matchPrice + ProbPrices[this$static._isRep[this$static._state] >>> 2] + len = this$static.repLens[0] >= 2 ? this$static.repLens[0] + 1 : 2 + if (len <= lenMain) { + offs = 0 + while (len > this$static._matchDistances[offs]) { + offs += 2 + } + for (; ; ++len) { + distance = this$static._matchDistances[offs + 1] + curAndLenPrice = + normalMatchPrice + $GetPosLenPrice(this$static, distance, len, posState) + optimum = this$static._optimum[len] + if (curAndLenPrice < optimum.Price) { + optimum.Price = curAndLenPrice + optimum.PosPrev = 0 + optimum.BackPrev = distance + 4 + optimum.Prev1IsChar = 0 + } + if (len == this$static._matchDistances[offs]) { + offs += 2 + if (offs == numDistancePairs) { + break + } + } + } + } + cur = 0 + while (1) { + ++cur + if (cur == lenEnd) { + return $Backward(this$static, cur) + } + newLen = $ReadMatchDistances(this$static) + numDistancePairs = this$static._numDistancePairs + if (newLen >= this$static._numFastBytes) { + this$static._longestMatchLength = newLen + this$static._longestMatchWasFound = 1 + return $Backward(this$static, cur) + } + ++position + posPrev = this$static._optimum[cur].PosPrev + if (this$static._optimum[cur].Prev1IsChar) { + --posPrev + if (this$static._optimum[cur].Prev2) { + state = this$static._optimum[this$static._optimum[cur].PosPrev2].State + if (this$static._optimum[cur].BackPrev2 < 4) { + state = state < 7 ? 8 : 11 + } else { + state = state < 7 ? 7 : 10 + } + } else { + state = this$static._optimum[posPrev].State + } + state = StateUpdateChar(state) + } else { + state = this$static._optimum[posPrev].State + } + if (posPrev == cur - 1) { + if (!this$static._optimum[cur].BackPrev) { + state = state < 7 ? 9 : 11 + } else { + state = StateUpdateChar(state) + } + } else { + if ( + this$static._optimum[cur].Prev1IsChar && + this$static._optimum[cur].Prev2 + ) { + posPrev = this$static._optimum[cur].PosPrev2 + pos = this$static._optimum[cur].BackPrev2 + state = state < 7 ? 8 : 11 + } else { + pos = this$static._optimum[cur].BackPrev + if (pos < 4) { + state = state < 7 ? 8 : 11 + } else { + state = state < 7 ? 7 : 10 + } + } + opt = this$static._optimum[posPrev] + if (pos < 4) { + if (!pos) { + this$static.reps[0] = opt.Backs0 + this$static.reps[1] = opt.Backs1 + this$static.reps[2] = opt.Backs2 + this$static.reps[3] = opt.Backs3 + } else if (pos == 1) { + this$static.reps[0] = opt.Backs1 + this$static.reps[1] = opt.Backs0 + this$static.reps[2] = opt.Backs2 + this$static.reps[3] = opt.Backs3 + } else if (pos == 2) { + this$static.reps[0] = opt.Backs2 + this$static.reps[1] = opt.Backs0 + this$static.reps[2] = opt.Backs1 + this$static.reps[3] = opt.Backs3 + } else { + this$static.reps[0] = opt.Backs3 + this$static.reps[1] = opt.Backs0 + this$static.reps[2] = opt.Backs1 + this$static.reps[3] = opt.Backs2 + } + } else { + this$static.reps[0] = pos - 4 + this$static.reps[1] = opt.Backs0 + this$static.reps[2] = opt.Backs1 + this$static.reps[3] = opt.Backs2 + } + } + this$static._optimum[cur].State = state + this$static._optimum[cur].Backs0 = this$static.reps[0] + this$static._optimum[cur].Backs1 = this$static.reps[1] + this$static._optimum[cur].Backs2 = this$static.reps[2] + this$static._optimum[cur].Backs3 = this$static.reps[3] + curPrice = this$static._optimum[cur].Price + currentByte = $GetIndexByte(this$static._matchFinder, -1) + matchByte = $GetIndexByte( + this$static._matchFinder, + -this$static.reps[0] - 1 - 1 + ) + posState = position & this$static._posStateMask + curAnd1Price = + curPrice + + ProbPrices[this$static._isMatch[(state << 4) + posState] >>> 2] + + $GetPrice_0( + $GetSubCoder( + this$static._literalEncoder, + position, + $GetIndexByte(this$static._matchFinder, -2) + ), + state >= 7, + matchByte, + currentByte + ) + nextOptimum = this$static._optimum[cur + 1] + nextIsChar = 0 + if (curAnd1Price < nextOptimum.Price) { + nextOptimum.Price = curAnd1Price + nextOptimum.PosPrev = cur + nextOptimum.BackPrev = -1 + nextOptimum.Prev1IsChar = 0 + nextIsChar = 1 + } + matchPrice = + curPrice + + ProbPrices[(2048 - this$static._isMatch[(state << 4) + posState]) >>> 2] + repMatchPrice = + matchPrice + ProbPrices[(2048 - this$static._isRep[state]) >>> 2] + if ( + matchByte == currentByte && + !(nextOptimum.PosPrev < cur && !nextOptimum.BackPrev) + ) { + shortRepPrice = + repMatchPrice + + (ProbPrices[this$static._isRepG0[state] >>> 2] + + ProbPrices[this$static._isRep0Long[(state << 4) + posState] >>> 2]) + if (shortRepPrice <= nextOptimum.Price) { + nextOptimum.Price = shortRepPrice + nextOptimum.PosPrev = cur + nextOptimum.BackPrev = 0 + nextOptimum.Prev1IsChar = 0 + nextIsChar = 1 + } + } + numAvailableBytesFull = $GetNumAvailableBytes(this$static._matchFinder) + 1 + numAvailableBytesFull = + 4095 - cur < numAvailableBytesFull ? 4095 - cur : numAvailableBytesFull + numAvailableBytes = numAvailableBytesFull + if (numAvailableBytes < 2) { + continue + } + if (numAvailableBytes > this$static._numFastBytes) { + numAvailableBytes = this$static._numFastBytes + } + if (!nextIsChar && matchByte != currentByte) { + t = Math.min(numAvailableBytesFull - 1, this$static._numFastBytes) + lenTest2 = $GetMatchLen( + this$static._matchFinder, + 0, + this$static.reps[0], + t + ) + if (lenTest2 >= 2) { + state2 = StateUpdateChar(state) + posStateNext = (position + 1) & this$static._posStateMask + nextRepMatchPrice = + curAnd1Price + + ProbPrices[ + (2048 - this$static._isMatch[(state2 << 4) + posStateNext]) >>> 2 + ] + + ProbPrices[(2048 - this$static._isRep[state2]) >>> 2] + offset = cur + 1 + lenTest2 + while (lenEnd < offset) { + this$static._optimum[++lenEnd].Price = 268435455 + } + curAndLenPrice = + nextRepMatchPrice + + ((price = $GetPrice( + this$static._repMatchLenEncoder, + lenTest2 - 2, + posStateNext + )), + price + $GetPureRepPrice(this$static, 0, state2, posStateNext)) + optimum = this$static._optimum[offset] + if (curAndLenPrice < optimum.Price) { + optimum.Price = curAndLenPrice + optimum.PosPrev = cur + 1 + optimum.BackPrev = 0 + optimum.Prev1IsChar = 1 + optimum.Prev2 = 0 + } + } + } + startLen = 2 + for (repIndex = 0; repIndex < 4; ++repIndex) { + lenTest = $GetMatchLen( + this$static._matchFinder, + -1, + this$static.reps[repIndex], + numAvailableBytes + ) + if (lenTest < 2) { + continue + } + lenTestTemp = lenTest + do { + while (lenEnd < cur + lenTest) { + this$static._optimum[++lenEnd].Price = 268435455 + } + curAndLenPrice = + repMatchPrice + + ((price_0 = $GetPrice( + this$static._repMatchLenEncoder, + lenTest - 2, + posState + )), + price_0 + $GetPureRepPrice(this$static, repIndex, state, posState)) + optimum = this$static._optimum[cur + lenTest] + if (curAndLenPrice < optimum.Price) { + optimum.Price = curAndLenPrice + optimum.PosPrev = cur + optimum.BackPrev = repIndex + optimum.Prev1IsChar = 0 + } + } while (--lenTest >= 2) + lenTest = lenTestTemp + if (!repIndex) { + startLen = lenTest + 1 + } + if (lenTest < numAvailableBytesFull) { + t = Math.min( + numAvailableBytesFull - 1 - lenTest, + this$static._numFastBytes + ) + lenTest2 = $GetMatchLen( + this$static._matchFinder, + lenTest, + this$static.reps[repIndex], + t + ) + if (lenTest2 >= 2) { + state2 = state < 7 ? 8 : 11 + posStateNext = (position + lenTest) & this$static._posStateMask + curAndLenCharPrice = + repMatchPrice + + ((price_1 = $GetPrice( + this$static._repMatchLenEncoder, + lenTest - 2, + posState + )), + price_1 + + $GetPureRepPrice(this$static, repIndex, state, posState)) + + ProbPrices[ + this$static._isMatch[(state2 << 4) + posStateNext] >>> 2 + ] + + $GetPrice_0( + $GetSubCoder( + this$static._literalEncoder, + position + lenTest, + $GetIndexByte(this$static._matchFinder, lenTest - 1 - 1) + ), + 1, + $GetIndexByte( + this$static._matchFinder, + lenTest - 1 - (this$static.reps[repIndex] + 1) + ), + $GetIndexByte(this$static._matchFinder, lenTest - 1) + ) + state2 = StateUpdateChar(state2) + posStateNext = (position + lenTest + 1) & this$static._posStateMask + nextMatchPrice = + curAndLenCharPrice + + ProbPrices[ + (2048 - this$static._isMatch[(state2 << 4) + posStateNext]) >>> 2 + ] + nextRepMatchPrice = + nextMatchPrice + + ProbPrices[(2048 - this$static._isRep[state2]) >>> 2] + offset = lenTest + 1 + lenTest2 + while (lenEnd < cur + offset) { + this$static._optimum[++lenEnd].Price = 268435455 + } + curAndLenPrice = + nextRepMatchPrice + + ((price_2 = $GetPrice( + this$static._repMatchLenEncoder, + lenTest2 - 2, + posStateNext + )), + price_2 + $GetPureRepPrice(this$static, 0, state2, posStateNext)) + optimum = this$static._optimum[cur + offset] + if (curAndLenPrice < optimum.Price) { + optimum.Price = curAndLenPrice + optimum.PosPrev = cur + lenTest + 1 + optimum.BackPrev = 0 + optimum.Prev1IsChar = 1 + optimum.Prev2 = 1 + optimum.PosPrev2 = cur + optimum.BackPrev2 = repIndex + } + } + } + } + if (newLen > numAvailableBytes) { + newLen = numAvailableBytes + for ( + numDistancePairs = 0; + newLen > this$static._matchDistances[numDistancePairs]; + numDistancePairs += 2 + ) {} + this$static._matchDistances[numDistancePairs] = newLen + numDistancePairs += 2 + } + if (newLen >= startLen) { + normalMatchPrice = + matchPrice + ProbPrices[this$static._isRep[state] >>> 2] + while (lenEnd < cur + newLen) { + this$static._optimum[++lenEnd].Price = 268435455 + } + offs = 0 + while (startLen > this$static._matchDistances[offs]) { + offs += 2 + } + for (lenTest = startLen; ; ++lenTest) { + curBack = this$static._matchDistances[offs + 1] + curAndLenPrice = + normalMatchPrice + + $GetPosLenPrice(this$static, curBack, lenTest, posState) + optimum = this$static._optimum[cur + lenTest] + if (curAndLenPrice < optimum.Price) { + optimum.Price = curAndLenPrice + optimum.PosPrev = cur + optimum.BackPrev = curBack + 4 + optimum.Prev1IsChar = 0 + } + if (lenTest == this$static._matchDistances[offs]) { + if (lenTest < numAvailableBytesFull) { + t = Math.min( + numAvailableBytesFull - 1 - lenTest, + this$static._numFastBytes + ) + lenTest2 = $GetMatchLen( + this$static._matchFinder, + lenTest, + curBack, + t + ) + if (lenTest2 >= 2) { + state2 = state < 7 ? 7 : 10 + posStateNext = (position + lenTest) & this$static._posStateMask + curAndLenCharPrice = + curAndLenPrice + + ProbPrices[ + this$static._isMatch[(state2 << 4) + posStateNext] >>> 2 + ] + + $GetPrice_0( + $GetSubCoder( + this$static._literalEncoder, + position + lenTest, + $GetIndexByte(this$static._matchFinder, lenTest - 1 - 1) + ), + 1, + $GetIndexByte( + this$static._matchFinder, + lenTest - (curBack + 1) - 1 + ), + $GetIndexByte(this$static._matchFinder, lenTest - 1) + ) + state2 = StateUpdateChar(state2) + posStateNext = + (position + lenTest + 1) & this$static._posStateMask + nextMatchPrice = + curAndLenCharPrice + + ProbPrices[ + (2048 - + this$static._isMatch[(state2 << 4) + posStateNext]) >>> + 2 + ] + nextRepMatchPrice = + nextMatchPrice + + ProbPrices[(2048 - this$static._isRep[state2]) >>> 2] + offset = lenTest + 1 + lenTest2 + while (lenEnd < cur + offset) { + this$static._optimum[++lenEnd].Price = 268435455 + } + curAndLenPrice = + nextRepMatchPrice + + ((price_3 = $GetPrice( + this$static._repMatchLenEncoder, + lenTest2 - 2, + posStateNext + )), + price_3 + + $GetPureRepPrice(this$static, 0, state2, posStateNext)) + optimum = this$static._optimum[cur + offset] + if (curAndLenPrice < optimum.Price) { + optimum.Price = curAndLenPrice + optimum.PosPrev = cur + lenTest + 1 + optimum.BackPrev = 0 + optimum.Prev1IsChar = 1 + optimum.Prev2 = 1 + optimum.PosPrev2 = cur + optimum.BackPrev2 = curBack + 4 + } + } + } + offs += 2 + if (offs == numDistancePairs) break + } + } + } + } +} + +function $GetPosLenPrice(this$static, pos, len, posState) { + var price, + lenToPosState = GetLenToPosState(len) + if (pos < 128) { + price = this$static._distancesPrices[lenToPosState * 128 + pos] + } else { + price = + this$static._posSlotPrices[(lenToPosState << 6) + GetPosSlot2(pos)] + + this$static._alignPrices[pos & 15] + } + return price + $GetPrice(this$static._lenEncoder, len - 2, posState) +} + +function $GetPureRepPrice(this$static, repIndex, state, posState) { + var price + if (!repIndex) { + price = ProbPrices[this$static._isRepG0[state] >>> 2] + price += + ProbPrices[ + (2048 - this$static._isRep0Long[(state << 4) + posState]) >>> 2 + ] + } else { + price = ProbPrices[(2048 - this$static._isRepG0[state]) >>> 2] + if (repIndex == 1) { + price += ProbPrices[this$static._isRepG1[state] >>> 2] + } else { + price += ProbPrices[(2048 - this$static._isRepG1[state]) >>> 2] + price += GetPrice(this$static._isRepG2[state], repIndex - 2) + } + } + return price +} + +function $GetRepLen1Price(this$static, state, posState) { + return ( + ProbPrices[this$static._isRepG0[state] >>> 2] + + ProbPrices[this$static._isRep0Long[(state << 4) + posState] >>> 2] + ) +} + +function $Init_4(this$static) { + $BaseInit(this$static) + $Init_9(this$static._rangeEncoder) + InitBitModels(this$static._isMatch) + InitBitModels(this$static._isRep0Long) + InitBitModels(this$static._isRep) + InitBitModels(this$static._isRepG0) + InitBitModels(this$static._isRepG1) + InitBitModels(this$static._isRepG2) + InitBitModels(this$static._posEncoders) + $Init_3(this$static._literalEncoder) + for (var i = 0; i < 4; ++i) { + InitBitModels(this$static._posSlotEncoder[i].Models) + } + $Init_2(this$static._lenEncoder, 1 << this$static._posStateBits) + $Init_2(this$static._repMatchLenEncoder, 1 << this$static._posStateBits) + InitBitModels(this$static._posAlignEncoder.Models) + this$static._longestMatchWasFound = 0 + this$static._optimumEndIndex = 0 + this$static._optimumCurrentIndex = 0 + this$static._additionalOffset = 0 +} + +function $MovePos(this$static, num) { + if (num > 0) { + $Skip(this$static._matchFinder, num) + this$static._additionalOffset += num + } +} + +function $ReadMatchDistances(this$static) { + var lenRes = 0 + this$static._numDistancePairs = $GetMatches( + this$static._matchFinder, + this$static._matchDistances + ) + if (this$static._numDistancePairs > 0) { + lenRes = this$static._matchDistances[this$static._numDistancePairs - 2] + if (lenRes == this$static._numFastBytes) + lenRes += $GetMatchLen( + this$static._matchFinder, + lenRes - 1, + this$static._matchDistances[this$static._numDistancePairs - 1], + 273 - lenRes + ) + } + ++this$static._additionalOffset + return lenRes +} + +function $ReleaseMFStream(this$static) { + if (this$static._matchFinder && this$static._needReleaseMFStream) { + this$static._matchFinder._stream = null + this$static._needReleaseMFStream = 0 + } +} + +function $ReleaseStreams(this$static) { + $ReleaseMFStream(this$static) + this$static._rangeEncoder.Stream = null +} + +function $SetDictionarySize_0(this$static, dictionarySize) { + this$static._dictionarySize = dictionarySize + for (var dicLogSize = 0; dictionarySize > 1 << dicLogSize; ++dicLogSize) {} + this$static._distTableSize = dicLogSize * 2 +} + +function $SetMatchFinder(this$static, matchFinderIndex) { + var matchFinderIndexPrev = this$static._matchFinderType + this$static._matchFinderType = matchFinderIndex + if ( + this$static._matchFinder && + matchFinderIndexPrev != this$static._matchFinderType + ) { + this$static._dictionarySizePrev = -1 + this$static._matchFinder = null + } +} + +function $WriteCoderProperties(this$static, outStream) { + this$static.properties[0] = + (((this$static._posStateBits * 5 + this$static._numLiteralPosStateBits) * + 9 + + this$static._numLiteralContextBits) << + 24) >> + 24 + for (var i = 0; i < 4; ++i) { + this$static.properties[1 + i] = + ((this$static._dictionarySize >> (8 * i)) << 24) >> 24 + } + $write_0(outStream, this$static.properties, 0, 5) +} + +function $WriteEndMarker(this$static, posState) { + if (!this$static._writeEndMark) { + return + } + $Encode_3( + this$static._rangeEncoder, + this$static._isMatch, + (this$static._state << 4) + posState, + 1 + ) + $Encode_3( + this$static._rangeEncoder, + this$static._isRep, + this$static._state, + 0 + ) + this$static._state = this$static._state < 7 ? 7 : 10 + $Encode_0(this$static._lenEncoder, this$static._rangeEncoder, 0, posState) + var lenToPosState = GetLenToPosState(2) + $Encode_2( + this$static._posSlotEncoder[lenToPosState], + this$static._rangeEncoder, + 63 + ) + $EncodeDirectBits(this$static._rangeEncoder, 67108863, 26) + $ReverseEncode(this$static._posAlignEncoder, this$static._rangeEncoder, 15) +} + +function GetPosSlot(pos) { + if (pos < 2048) { + return g_FastPos[pos] + } + if (pos < 2097152) { + return g_FastPos[pos >> 10] + 20 + } + return g_FastPos[pos >> 20] + 40 +} + +function GetPosSlot2(pos) { + if (pos < 131072) { + return g_FastPos[pos >> 6] + 12 + } + if (pos < 134217728) { + return g_FastPos[pos >> 16] + 32 + } + return g_FastPos[pos >> 26] + 52 +} + +function $Encode(this$static, rangeEncoder, symbol, posState) { + if (symbol < 8) { + $Encode_3(rangeEncoder, this$static._choice, 0, 0) + $Encode_2(this$static._lowCoder[posState], rangeEncoder, symbol) + } else { + symbol -= 8 + $Encode_3(rangeEncoder, this$static._choice, 0, 1) + if (symbol < 8) { + $Encode_3(rangeEncoder, this$static._choice, 1, 0) + $Encode_2(this$static._midCoder[posState], rangeEncoder, symbol) + } else { + $Encode_3(rangeEncoder, this$static._choice, 1, 1) + $Encode_2(this$static._highCoder, rangeEncoder, symbol - 8) + } + } +} + +function $Encoder$LenEncoder(this$static) { + this$static._choice = initDim(2) + this$static._lowCoder = initDim(16) + this$static._midCoder = initDim(16) + this$static._highCoder = $BitTreeEncoder({}, 8) + for (var posState = 0; posState < 16; ++posState) { + this$static._lowCoder[posState] = $BitTreeEncoder({}, 3) + this$static._midCoder[posState] = $BitTreeEncoder({}, 3) + } + return this$static +} + +function $Init_2(this$static, numPosStates) { + InitBitModels(this$static._choice) + for (var posState = 0; posState < numPosStates; ++posState) { + InitBitModels(this$static._lowCoder[posState].Models) + InitBitModels(this$static._midCoder[posState].Models) + } + InitBitModels(this$static._highCoder.Models) +} + +function $SetPrices(this$static, posState, numSymbols, prices, st) { + var a0, a1, b0, b1, i + a0 = ProbPrices[this$static._choice[0] >>> 2] + a1 = ProbPrices[(2048 - this$static._choice[0]) >>> 2] + b0 = a1 + ProbPrices[this$static._choice[1] >>> 2] + b1 = a1 + ProbPrices[(2048 - this$static._choice[1]) >>> 2] + i = 0 + for (i = 0; i < 8; ++i) { + if (i >= numSymbols) return + prices[st + i] = a0 + $GetPrice_1(this$static._lowCoder[posState], i) + } + for (; i < 16; ++i) { + if (i >= numSymbols) return + prices[st + i] = b0 + $GetPrice_1(this$static._midCoder[posState], i - 8) + } + for (; i < numSymbols; ++i) { + prices[st + i] = b1 + $GetPrice_1(this$static._highCoder, i - 8 - 8) + } +} + +function $Encode_0(this$static, rangeEncoder, symbol, posState) { + $Encode(this$static, rangeEncoder, symbol, posState) + if (--this$static._counters[posState] == 0) { + $SetPrices( + this$static, + posState, + this$static._tableSize, + this$static._prices, + posState * 272 + ) + this$static._counters[posState] = this$static._tableSize + } +} + +function $Encoder$LenPriceTableEncoder(this$static) { + $Encoder$LenEncoder(this$static) + this$static._prices = [] + this$static._counters = [] + return this$static +} + +function $GetPrice(this$static, symbol, posState) { + return this$static._prices[posState * 272 + symbol] +} + +function $UpdateTables(this$static, numPosStates) { + for (var posState = 0; posState < numPosStates; ++posState) { + $SetPrices( + this$static, + posState, + this$static._tableSize, + this$static._prices, + posState * 272 + ) + this$static._counters[posState] = this$static._tableSize + } +} + +function $Create_1(this$static, numPosBits, numPrevBits) { + var i, numStates + if ( + this$static.m_Coders != null && + this$static.m_NumPrevBits == numPrevBits && + this$static.m_NumPosBits == numPosBits + ) { + return + } + this$static.m_NumPosBits = numPosBits + this$static.m_PosMask = (1 << numPosBits) - 1 + this$static.m_NumPrevBits = numPrevBits + numStates = 1 << (this$static.m_NumPrevBits + this$static.m_NumPosBits) + this$static.m_Coders = initDim(numStates) + for (i = 0; i < numStates; ++i) { + this$static.m_Coders[i] = $Encoder$LiteralEncoder$Encoder2({}) + } +} + +function $GetSubCoder(this$static, pos, prevByte) { + return this$static.m_Coders[ + ((pos & this$static.m_PosMask) << this$static.m_NumPrevBits) + + ((prevByte & 255) >>> (8 - this$static.m_NumPrevBits)) + ] +} + +function $Init_3(this$static) { + var i, + numStates = 1 << (this$static.m_NumPrevBits + this$static.m_NumPosBits) + for (i = 0; i < numStates; ++i) { + InitBitModels(this$static.m_Coders[i].m_Encoders) + } +} + +function $Encode_1(this$static, rangeEncoder, symbol) { + var bit, + i, + context = 1 + for (i = 7; i >= 0; --i) { + bit = (symbol >> i) & 1 + $Encode_3(rangeEncoder, this$static.m_Encoders, context, bit) + context = (context << 1) | bit + } +} + +function $EncodeMatched(this$static, rangeEncoder, matchByte, symbol) { + var bit, + i, + matchBit, + state, + same = 1, + context = 1 + for (i = 7; i >= 0; --i) { + bit = (symbol >> i) & 1 + state = context + if (same) { + matchBit = (matchByte >> i) & 1 + state += (1 + matchBit) << 8 + same = matchBit == bit + } + $Encode_3(rangeEncoder, this$static.m_Encoders, state, bit) + context = (context << 1) | bit + } +} + +function $Encoder$LiteralEncoder$Encoder2(this$static) { + this$static.m_Encoders = initDim(768) + return this$static +} + +function $GetPrice_0(this$static, matchMode, matchByte, symbol) { + var bit, + context = 1, + i = 7, + matchBit, + price = 0 + if (matchMode) { + for (; i >= 0; --i) { + matchBit = (matchByte >> i) & 1 + bit = (symbol >> i) & 1 + price += GetPrice( + this$static.m_Encoders[((1 + matchBit) << 8) + context], + bit + ) + context = (context << 1) | bit + if (matchBit != bit) { + --i + break + } + } + } + for (; i >= 0; --i) { + bit = (symbol >> i) & 1 + price += GetPrice(this$static.m_Encoders[context], bit) + context = (context << 1) | bit + } + return price +} + +function $MakeAsChar(this$static) { + this$static.BackPrev = -1 + this$static.Prev1IsChar = 0 +} + +function $MakeAsShortRep(this$static) { + this$static.BackPrev = 0 + this$static.Prev1IsChar = 0 +} +function $BitTreeDecoder(this$static, numBitLevels) { + this$static.NumBitLevels = numBitLevels + this$static.Models = initDim(1 << numBitLevels) + return this$static +} + +function $Decode_0(this$static, rangeDecoder) { + var bitIndex, + m = 1 + for (bitIndex = this$static.NumBitLevels; bitIndex != 0; --bitIndex) { + m = (m << 1) + $DecodeBit(rangeDecoder, this$static.Models, m) + } + return m - (1 << this$static.NumBitLevels) +} + +function $ReverseDecode(this$static, rangeDecoder) { + var bit, + bitIndex, + m = 1, + symbol = 0 + for (bitIndex = 0; bitIndex < this$static.NumBitLevels; ++bitIndex) { + bit = $DecodeBit(rangeDecoder, this$static.Models, m) + m <<= 1 + m += bit + symbol |= bit << bitIndex + } + return symbol +} + +function ReverseDecode(Models, startIndex, rangeDecoder, NumBitLevels) { + var bit, + bitIndex, + m = 1, + symbol = 0 + for (bitIndex = 0; bitIndex < NumBitLevels; ++bitIndex) { + bit = $DecodeBit(rangeDecoder, Models, startIndex + m) + m <<= 1 + m += bit + symbol |= bit << bitIndex + } + return symbol +} +function $BitTreeEncoder(this$static, numBitLevels) { + this$static.NumBitLevels = numBitLevels + this$static.Models = initDim(1 << numBitLevels) + return this$static +} + +function $Encode_2(this$static, rangeEncoder, symbol) { + var bit, + bitIndex, + m = 1 + for (bitIndex = this$static.NumBitLevels; bitIndex != 0; ) { + --bitIndex + bit = (symbol >>> bitIndex) & 1 + $Encode_3(rangeEncoder, this$static.Models, m, bit) + m = (m << 1) | bit + } +} + +function $GetPrice_1(this$static, symbol) { + var bit, + bitIndex, + m = 1, + price = 0 + for (bitIndex = this$static.NumBitLevels; bitIndex != 0; ) { + --bitIndex + bit = (symbol >>> bitIndex) & 1 + price += GetPrice(this$static.Models[m], bit) + m = (m << 1) + bit + } + return price +} + +function $ReverseEncode(this$static, rangeEncoder, symbol) { + var bit, + i, + m = 1 + for (i = 0; i < this$static.NumBitLevels; ++i) { + bit = symbol & 1 + $Encode_3(rangeEncoder, this$static.Models, m, bit) + m = (m << 1) | bit + symbol >>= 1 + } +} + +function $ReverseGetPrice(this$static, symbol) { + var bit, + i, + m = 1, + price = 0 + for (i = this$static.NumBitLevels; i != 0; --i) { + bit = symbol & 1 + symbol >>>= 1 + price += GetPrice(this$static.Models[m], bit) + m = (m << 1) | bit + } + return price +} + +function ReverseEncode(Models, startIndex, rangeEncoder, NumBitLevels, symbol) { + var bit, + i, + m = 1 + for (i = 0; i < NumBitLevels; ++i) { + bit = symbol & 1 + $Encode_3(rangeEncoder, Models, startIndex + m, bit) + m = (m << 1) | bit + symbol >>= 1 + } +} + +function ReverseGetPrice(Models, startIndex, NumBitLevels, symbol) { + var bit, + i, + m = 1, + price = 0 + for (i = NumBitLevels; i != 0; --i) { + bit = symbol & 1 + symbol >>>= 1 + price += ProbPrices[(((Models[startIndex + m] - bit) ^ -bit) & 2047) >>> 2] + m = (m << 1) | bit + } + return price +} +function $DecodeBit(this$static, probs, index) { + var newBound, + prob = probs[index] + newBound = (this$static.Range >>> 11) * prob + if ((this$static.Code ^ -2147483648) < (newBound ^ -2147483648)) { + this$static.Range = newBound + probs[index] = ((prob + ((2048 - prob) >>> 5)) << 16) >> 16 + if (!(this$static.Range & -16777216)) { + this$static.Code = (this$static.Code << 8) | $read(this$static.Stream) + this$static.Range <<= 8 + } + return 0 + } else { + this$static.Range -= newBound + this$static.Code -= newBound + probs[index] = ((prob - (prob >>> 5)) << 16) >> 16 + if (!(this$static.Range & -16777216)) { + this$static.Code = (this$static.Code << 8) | $read(this$static.Stream) + this$static.Range <<= 8 + } + return 1 + } +} + +function $DecodeDirectBits(this$static, numTotalBits) { + var i, + t, + result = 0 + for (i = numTotalBits; i != 0; --i) { + this$static.Range >>>= 1 + t = (this$static.Code - this$static.Range) >>> 31 + this$static.Code -= this$static.Range & (t - 1) + result = (result << 1) | (1 - t) + if (!(this$static.Range & -16777216)) { + this$static.Code = (this$static.Code << 8) | $read(this$static.Stream) + this$static.Range <<= 8 + } + } + return result +} + +function $Init_8(this$static) { + this$static.Code = 0 + this$static.Range = -1 + for (var i = 0; i < 5; ++i) { + this$static.Code = (this$static.Code << 8) | $read(this$static.Stream) + } +} +function InitBitModels(probs) { + for (var i = probs.length - 1; i >= 0; --i) { + probs[i] = 1024 + } +} +var ProbPrices = (function() { + var end, + i, + j, + start, + ProbPrices = [] + for (i = 8; i >= 0; --i) { + start = 1 << (9 - i - 1) + end = 1 << (9 - i) + for (j = start; j < end; ++j) { + ProbPrices[j] = (i << 6) + (((end - j) << 6) >>> (9 - i - 1)) + } + } + return ProbPrices +})() + +function $Encode_3(this$static, probs, index, symbol) { + var newBound, + prob = probs[index] + newBound = (this$static.Range >>> 11) * prob + if (!symbol) { + this$static.Range = newBound + probs[index] = ((prob + ((2048 - prob) >>> 5)) << 16) >> 16 + } else { + this$static.Low = add( + this$static.Low, + and(fromInt(newBound), [4294967295, 0]) + ) + this$static.Range -= newBound + probs[index] = ((prob - (prob >>> 5)) << 16) >> 16 + } + if (!(this$static.Range & -16777216)) { + this$static.Range <<= 8 + $ShiftLow(this$static) + } +} + +function $EncodeDirectBits(this$static, v, numTotalBits) { + for (var i = numTotalBits - 1; i >= 0; --i) { + this$static.Range >>>= 1 + if (((v >>> i) & 1) == 1) { + this$static.Low = add(this$static.Low, fromInt(this$static.Range)) + } + if (!(this$static.Range & -16777216)) { + this$static.Range <<= 8 + $ShiftLow(this$static) + } + } +} + +function $GetProcessedSizeAdd(this$static) { + return add(add(fromInt(this$static._cacheSize), this$static._position), [ + 4, + 0 + ]) +} + +function $Init_9(this$static) { + this$static._position = P0_longLit + this$static.Low = P0_longLit + this$static.Range = -1 + this$static._cacheSize = 1 + this$static._cache = 0 +} + +function $ShiftLow(this$static) { + var temp, + LowHi = lowBits_0(shru(this$static.Low, 32)) + if (LowHi != 0 || compare(this$static.Low, [4278190080, 0]) < 0) { + this$static._position = add( + this$static._position, + fromInt(this$static._cacheSize) + ) + temp = this$static._cache + do { + $write(this$static.Stream, temp + LowHi) + temp = 255 + } while (--this$static._cacheSize != 0) + this$static._cache = lowBits_0(this$static.Low) >>> 24 + } + ++this$static._cacheSize + this$static.Low = shl(and(this$static.Low, [16777215, 0]), 8) +} + +function GetPrice(Prob, symbol) { + return ProbPrices[(((Prob - symbol) ^ -symbol) & 2047) >>> 2] +} +function decode(utf) { + var i = 0, + j = 0, + x, + y, + z, + l = utf.length, + buf = [], + charCodes = [] + for (; i < l; ++i, ++j) { + x = utf[i] & 255 + if (!(x & 128)) { + if (!x) { + // It appears that this is binary data, so it cannot be converted to a string, so just send it back. + return utf + } + charCodes[j] = x + } else if ((x & 224) == 192) { + if (i + 1 >= l) { + // It appears that this is binary data, so it cannot be converted to a string, so just send it back. + return utf + } + y = utf[++i] & 255 + if ((y & 192) != 128) { + // It appears that this is binary data, so it cannot be converted to a string, so just send it back. + return utf + } + charCodes[j] = ((x & 31) << 6) | (y & 63) + } else if ((x & 240) == 224) { + if (i + 2 >= l) { + // It appears that this is binary data, so it cannot be converted to a string, so just send it back. + return utf + } + y = utf[++i] & 255 + if ((y & 192) != 128) { + // It appears that this is binary data, so it cannot be converted to a string, so just send it back. + return utf + } + z = utf[++i] & 255 + if ((z & 192) != 128) { + // It appears that this is binary data, so it cannot be converted to a string, so just send it back. + return utf + } + charCodes[j] = ((x & 15) << 12) | ((y & 63) << 6) | (z & 63) + } else { + // It appears that this is binary data, so it cannot be converted to a string, so just send it back. + return utf + } + if (j == 16383) { + buf.push(String.fromCharCode.apply(String, charCodes)) + j = -1 + } + } + if (j > 0) { + charCodes.length = j + buf.push(String.fromCharCode.apply(String, charCodes)) + } + return buf.join('') +} +function encode(s) { + var ch, + chars = [], + data, + elen = 0, + i, + l = s.length + // Be able to handle binary arrays and buffers. + if (typeof s == 'object') { + return s + } else { + $getChars(s, 0, l, chars, 0) + } + // Add extra spaces in the array to break up the unicode symbols. + for (i = 0; i < l; ++i) { + ch = chars[i] + if (ch >= 1 && ch <= 127) { + ++elen + } else if (!ch || (ch >= 128 && ch <= 2047)) { + elen += 2 + } else { + elen += 3 + } + } + data = [] + elen = 0 + for (i = 0; i < l; ++i) { + ch = chars[i] + if (ch >= 1 && ch <= 127) { + data[elen++] = (ch << 24) >> 24 + } else if (!ch || (ch >= 128 && ch <= 2047)) { + data[elen++] = ((192 | ((ch >> 6) & 31)) << 24) >> 24 + data[elen++] = ((128 | (ch & 63)) << 24) >> 24 + } else { + data[elen++] = ((224 | ((ch >> 12) & 15)) << 24) >> 24 + data[elen++] = ((128 | ((ch >> 6) & 63)) << 24) >> 24 + data[elen++] = ((128 | (ch & 63)) << 24) >> 24 + } + } + return data +} +// s is dictionarySize +// f is fb +// m is matchFinder +// NOTE: Because some values are always the same, they have been removed. +// lc is always 3 +// lp is always 0 +// pb is always 2 +const modes = [ + { s: 16, f: 64, m: 0 }, + { s: 20, f: 64, m: 0 }, + { s: 19, f: 64, m: 1 }, + { s: 20, f: 64, m: 1 }, + { s: 21, f: 128, m: 1 }, + { s: 22, f: 128, m: 1 }, + { s: 23, f: 128, m: 1 }, + { s: 24, f: 255, m: 1 }, + { s: 25, f: 255, m: 1 } +] + +function get_mode_obj(mode) { + return modes[mode - 1] || modes[6] +} + +/** + * Compress a string with the LZMA algorithm + * + * @param {string} value The string to be compressed + * @param {object} options + * @param {1|2|3|4|5|6|7|8|9} options.mode Which mode to use (1 through 9, defaults to 7) + * @param {boolean} options.enableEndMark Whether to write an end mark + * @returns {string} + */ +export function compress(value, { mode = 7, enableEndMark = true } = {}) { + var this$static = {} + + this$static.c = $LZMAByteArrayCompressor( + {}, + encode(value), + get_mode_obj(mode), + enableEndMark + ) + while ($processChunk(this$static.c.chunker)); + return $toByteArray(this$static.c.output) +} + +/** + * Compress a string with the LZMA algorithm to URL-safe characters + * + * @param {string} value The string to be compressed + * @param {object} options + * @param {1|2|3|4|5|6|7|8|9} options.mode Which mode to use (1 through 9, defaults to 7) + * @param {boolean} options.enableEndMark Whether to write an end mark + * @returns {string} + */ +export function compressUrlSafe( + string, + { mode = 7, enableEndMark = true } = {} +) { + const compressedString = compress(string, { mode, enableEndMark }) + const compressedBytes = new Uint8Array(compressedString) + + return base64.encodeFromArrayUrlSafe(compressedBytes) +} + +/** + * Decompress a string compressed with the LZMA algorithm + * + * @param {number[]|Int8Array} bytes The int8 array created by the compress() function + * @returns {string} + */ +export function decompress(bytes) { + var this$static = {} + + this$static.d = $LZMAByteArrayDecompressor({}, bytes) + while ($processChunk(this$static.d.chunker)); + return decode($toByteArray(this$static.d.output)) +} + +/** + * Decompress a string compressed with the URL-safe compress function + * + * @param {string} string The URL-safe string generated by the compressUrlSafe() function + * @returns {string} + */ +export function decompressUrlSafe(string) { + return decompress(new Int8Array(base64.decodeToArrayUrlSafe(string))) +} diff --git a/package.json b/package.json new file mode 100644 index 000000000..5b33a7ad3 --- /dev/null +++ b/package.json @@ -0,0 +1,9 @@ +{ + "name": "web-demo", + "version": "0.1.0", + "files": [ + "web_demo_bg.wasm", + "web_demo.js" + ], + "browser": "web_demo.js" +} \ No newline at end of file diff --git a/web_demo.js b/web_demo.js new file mode 100644 index 000000000..56f1ed9f9 --- /dev/null +++ b/web_demo.js @@ -0,0 +1,475 @@ +let wasm_bindgen; +(function() { + const __exports = {}; + let script_src; + if (typeof document !== 'undefined' && document.currentScript !== null) { + script_src = new URL(document.currentScript.src, location.href).toString(); + } + let wasm = undefined; + + const heap = new Array(128).fill(undefined); + + heap.push(undefined, null, true, false); + +function getObject(idx) { return heap[idx]; } + +let heap_next = heap.length; + +function dropObject(idx) { + if (idx < 132) return; + heap[idx] = heap_next; + heap_next = idx; +} + +function takeObject(idx) { + const ret = getObject(idx); + dropObject(idx); + return ret; +} + +const cachedTextDecoder = (typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }) : { decode: () => { throw Error('TextDecoder not available') } } ); + +if (typeof TextDecoder !== 'undefined') { cachedTextDecoder.decode(); }; + +let cachedUint8Memory0 = null; + +function getUint8Memory0() { + if (cachedUint8Memory0 === null || cachedUint8Memory0.byteLength === 0) { + cachedUint8Memory0 = new Uint8Array(wasm.memory.buffer); + } + return cachedUint8Memory0; +} + +function getStringFromWasm0(ptr, len) { + ptr = ptr >>> 0; + return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len)); +} + +function addHeapObject(obj) { + if (heap_next === heap.length) heap.push(heap.length + 1); + const idx = heap_next; + heap_next = heap[idx]; + + heap[idx] = obj; + return idx; +} + +function debugString(val) { + // primitive types + const type = typeof val; + if (type == 'number' || type == 'boolean' || val == null) { + return `${val}`; + } + if (type == 'string') { + return `"${val}"`; + } + if (type == 'symbol') { + const description = val.description; + if (description == null) { + return 'Symbol'; + } else { + return `Symbol(${description})`; + } + } + if (type == 'function') { + const name = val.name; + if (typeof name == 'string' && name.length > 0) { + return `Function(${name})`; + } else { + return 'Function'; + } + } + // objects + if (Array.isArray(val)) { + const length = val.length; + let debug = '['; + if (length > 0) { + debug += debugString(val[0]); + } + for(let i = 1; i < length; i++) { + debug += ', ' + debugString(val[i]); + } + debug += ']'; + return debug; + } + // Test for built-in + const builtInMatches = /\[object ([^\]]+)\]/.exec(toString.call(val)); + let className; + if (builtInMatches.length > 1) { + className = builtInMatches[1]; + } else { + // Failed to match the standard '[object ClassName]' + return toString.call(val); + } + if (className == 'Object') { + // we're a user defined class or Object + // JSON.stringify avoids problems with cycles, and is generally much + // easier than looping through ownProperties of `val`. + try { + return 'Object(' + JSON.stringify(val) + ')'; + } catch (_) { + return 'Object'; + } + } + // errors + if (val instanceof Error) { + return `${val.name}: ${val.message}\n${val.stack}`; + } + // TODO we could test for more things here, like `Set`s and `Map`s. + return className; +} + +let WASM_VECTOR_LEN = 0; + +const cachedTextEncoder = (typeof TextEncoder !== 'undefined' ? new TextEncoder('utf-8') : { encode: () => { throw Error('TextEncoder not available') } } ); + +const encodeString = (typeof cachedTextEncoder.encodeInto === 'function' + ? function (arg, view) { + return cachedTextEncoder.encodeInto(arg, view); +} + : function (arg, view) { + const buf = cachedTextEncoder.encode(arg); + view.set(buf); + return { + read: arg.length, + written: buf.length + }; +}); + +function passStringToWasm0(arg, malloc, realloc) { + + if (realloc === undefined) { + const buf = cachedTextEncoder.encode(arg); + const ptr = malloc(buf.length, 1) >>> 0; + getUint8Memory0().subarray(ptr, ptr + buf.length).set(buf); + WASM_VECTOR_LEN = buf.length; + return ptr; + } + + let len = arg.length; + let ptr = malloc(len, 1) >>> 0; + + const mem = getUint8Memory0(); + + let offset = 0; + + for (; offset < len; offset++) { + const code = arg.charCodeAt(offset); + if (code > 0x7F) break; + mem[ptr + offset] = code; + } + + if (offset !== len) { + if (offset !== 0) { + arg = arg.slice(offset); + } + ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0; + const view = getUint8Memory0().subarray(ptr + offset, ptr + len); + const ret = encodeString(arg, view); + + offset += ret.written; + } + + WASM_VECTOR_LEN = offset; + return ptr; +} + +let cachedInt32Memory0 = null; + +function getInt32Memory0() { + if (cachedInt32Memory0 === null || cachedInt32Memory0.byteLength === 0) { + cachedInt32Memory0 = new Int32Array(wasm.memory.buffer); + } + return cachedInt32Memory0; +} +/** +* @param {string} input +* @returns {Result} +*/ +__exports.run_program = function(input) { + const ptr0 = passStringToWasm0(input, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ret = wasm.run_program(ptr0, len0); + return Result.__wrap(ret); +}; + +/** +*/ +__exports.start = function() { + wasm.start(); +}; + +function handleError(f, args) { + try { + return f.apply(this, args); + } catch (e) { + wasm.__wbindgen_exn_store(addHeapObject(e)); + } +} +/** +*/ +class Result { + + static __wrap(ptr) { + ptr = ptr >>> 0; + const obj = Object.create(Result.prototype); + obj.__wbg_ptr = ptr; + + return obj; + } + + __destroy_into_raw() { + const ptr = this.__wbg_ptr; + this.__wbg_ptr = 0; + + return ptr; + } + + free() { + const ptr = this.__destroy_into_raw(); + wasm.__wbg_result_free(ptr); + } + /** + * @returns {string} + */ + get text() { + let deferred1_0; + let deferred1_1; + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.__wbg_get_result_text(retptr, this.__wbg_ptr); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + deferred1_0 = r0; + deferred1_1 = r1; + return getStringFromWasm0(r0, r1); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + wasm.__wbindgen_free(deferred1_0, deferred1_1, 1); + } + } + /** + * @param {string} arg0 + */ + set text(arg0) { + const ptr0 = passStringToWasm0(arg0, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + wasm.__wbg_set_result_text(this.__wbg_ptr, ptr0, len0); + } + /** + * @returns {string} + */ + get dot() { + let deferred1_0; + let deferred1_1; + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.__wbg_get_result_dot(retptr, this.__wbg_ptr); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + deferred1_0 = r0; + deferred1_1 = r1; + return getStringFromWasm0(r0, r1); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + wasm.__wbindgen_free(deferred1_0, deferred1_1, 1); + } + } + /** + * @param {string} arg0 + */ + set dot(arg0) { + const ptr0 = passStringToWasm0(arg0, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + wasm.__wbg_set_result_dot(this.__wbg_ptr, ptr0, len0); + } +} +__exports.Result = Result; + +async function __wbg_load(module, imports) { + if (typeof Response === 'function' && module instanceof Response) { + if (typeof WebAssembly.instantiateStreaming === 'function') { + try { + return await WebAssembly.instantiateStreaming(module, imports); + + } catch (e) { + if (module.headers.get('Content-Type') != 'application/wasm') { + console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e); + + } else { + throw e; + } + } + } + + const bytes = await module.arrayBuffer(); + return await WebAssembly.instantiate(bytes, imports); + + } else { + const instance = await WebAssembly.instantiate(module, imports); + + if (instance instanceof WebAssembly.Instance) { + return { instance, module }; + + } else { + return instance; + } + } +} + +function __wbg_get_imports() { + const imports = {}; + imports.wbg = {}; + imports.wbg.__wbg_new_abda76e883ba8a5f = function() { + const ret = new Error(); + return addHeapObject(ret); + }; + imports.wbg.__wbg_stack_658279fe44541cf6 = function(arg0, arg1) { + const ret = getObject(arg1).stack; + const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + getInt32Memory0()[arg0 / 4 + 1] = len1; + getInt32Memory0()[arg0 / 4 + 0] = ptr1; + }; + imports.wbg.__wbg_error_f851667af71bcfc6 = function(arg0, arg1) { + let deferred0_0; + let deferred0_1; + try { + deferred0_0 = arg0; + deferred0_1 = arg1; + console.error(getStringFromWasm0(arg0, arg1)); + } finally { + wasm.__wbindgen_free(deferred0_0, deferred0_1, 1); + } + }; + imports.wbg.__wbindgen_object_drop_ref = function(arg0) { + takeObject(arg0); + }; + imports.wbg.__wbindgen_string_new = function(arg0, arg1) { + const ret = getStringFromWasm0(arg0, arg1); + return addHeapObject(ret); + }; + imports.wbg.__wbg_debug_9b8701f894da9929 = function(arg0, arg1, arg2, arg3) { + console.debug(getObject(arg0), getObject(arg1), getObject(arg2), getObject(arg3)); + }; + imports.wbg.__wbg_error_788ae33f81d3b84b = function(arg0) { + console.error(getObject(arg0)); + }; + imports.wbg.__wbg_error_d9bce418caafb712 = function(arg0, arg1, arg2, arg3) { + console.error(getObject(arg0), getObject(arg1), getObject(arg2), getObject(arg3)); + }; + imports.wbg.__wbg_info_bb52f40b06f679de = function(arg0, arg1, arg2, arg3) { + console.info(getObject(arg0), getObject(arg1), getObject(arg2), getObject(arg3)); + }; + imports.wbg.__wbg_log_ea7093e35e3efd07 = function(arg0, arg1, arg2, arg3) { + console.log(getObject(arg0), getObject(arg1), getObject(arg2), getObject(arg3)); + }; + imports.wbg.__wbg_warn_dfc0e0cf544a13bd = function(arg0, arg1, arg2, arg3) { + console.warn(getObject(arg0), getObject(arg1), getObject(arg2), getObject(arg3)); + }; + imports.wbg.__wbg_now_0cfdc90c97d0c24b = function(arg0) { + const ret = getObject(arg0).now(); + return ret; + }; + imports.wbg.__wbg_newnoargs_581967eacc0e2604 = function(arg0, arg1) { + const ret = new Function(getStringFromWasm0(arg0, arg1)); + return addHeapObject(ret); + }; + imports.wbg.__wbg_get_97b561fb56f034b5 = function() { return handleError(function (arg0, arg1) { + const ret = Reflect.get(getObject(arg0), getObject(arg1)); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_call_cb65541d95d71282 = function() { return handleError(function (arg0, arg1) { + const ret = getObject(arg0).call(getObject(arg1)); + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbindgen_object_clone_ref = function(arg0) { + const ret = getObject(arg0); + return addHeapObject(ret); + }; + imports.wbg.__wbg_self_1ff1d729e9aae938 = function() { return handleError(function () { + const ret = self.self; + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_window_5f4faef6c12b79ec = function() { return handleError(function () { + const ret = window.window; + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_globalThis_1d39714405582d3c = function() { return handleError(function () { + const ret = globalThis.globalThis; + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbg_global_651f05c6a0944d1c = function() { return handleError(function () { + const ret = global.global; + return addHeapObject(ret); + }, arguments) }; + imports.wbg.__wbindgen_is_undefined = function(arg0) { + const ret = getObject(arg0) === undefined; + return ret; + }; + imports.wbg.__wbindgen_debug_string = function(arg0, arg1) { + const ret = debugString(getObject(arg1)); + const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + getInt32Memory0()[arg0 / 4 + 1] = len1; + getInt32Memory0()[arg0 / 4 + 0] = ptr1; + }; + imports.wbg.__wbindgen_throw = function(arg0, arg1) { + throw new Error(getStringFromWasm0(arg0, arg1)); + }; + + return imports; +} + +function __wbg_init_memory(imports, maybe_memory) { + +} + +function __wbg_finalize_init(instance, module) { + wasm = instance.exports; + __wbg_init.__wbindgen_wasm_module = module; + cachedInt32Memory0 = null; + cachedUint8Memory0 = null; + + wasm.__wbindgen_start(); + return wasm; +} + +function initSync(module) { + if (wasm !== undefined) return wasm; + + const imports = __wbg_get_imports(); + + __wbg_init_memory(imports); + + if (!(module instanceof WebAssembly.Module)) { + module = new WebAssembly.Module(module); + } + + const instance = new WebAssembly.Instance(module, imports); + + return __wbg_finalize_init(instance, module); +} + +async function __wbg_init(input) { + if (wasm !== undefined) return wasm; + + if (typeof input === 'undefined' && script_src !== 'undefined') { + input = script_src.replace(/\.js$/, '_bg.wasm'); + } + const imports = __wbg_get_imports(); + + if (typeof input === 'string' || (typeof Request === 'function' && input instanceof Request) || (typeof URL === 'function' && input instanceof URL)) { + input = fetch(input); + } + + __wbg_init_memory(imports); + + const { instance, module } = await __wbg_load(await input, imports); + + return __wbg_finalize_init(instance, module); +} + +wasm_bindgen = Object.assign(__wbg_init, { initSync }, __exports); + +})(); diff --git a/web_demo_bg.wasm b/web_demo_bg.wasm new file mode 100644 index 000000000..a9c468135 Binary files /dev/null and b/web_demo_bg.wasm differ diff --git a/worker.js b/worker.js new file mode 100644 index 000000000..d38be6273 --- /dev/null +++ b/worker.js @@ -0,0 +1,23 @@ +importScripts("web_demo.js") +console.log("I'm in the worker") + +let { run_program } = wasm_bindgen; +async function work() { + await wasm_bindgen("web_demo_bg.wasm"); + + // Set callback to handle messages passed to the worker. + self.onmessage = async event => { + try { + let result = run_program(event.data); + console.log("Got result from worker", result); + // Can't send the result directly, since it contains a reference to the + // wasm memory. Instead, we send the dot and text separately. + self.postMessage({dot: result.dot, text: result.text}); + } catch (error) { + console.log(error); + self.postMessage({dot: "", text: "Something panicked! Check the console logs..."}); + } + }; +} + +work()