pub struct DefaultState<ET: EngineTypes> {
pub commands: <ET::CSName as CSName<ET::Char>>::Map<TeXCommand<ET>>,
/* private fields */
}Expand description
Default implementation of a plain TeX State.
Fields§
§commands: <ET::CSName as CSName<ET::Char>>::Map<TeXCommand<ET>>Implementations§
Source§impl<ET: EngineTypes> DefaultState<ET>
impl<ET: EngineTypes> DefaultState<ET>
pub fn set_command_direct( &mut self, name: ET::CSName, cmd: Option<TeXCommand<ET>>, )
Trait Implementations§
Source§impl<ET: Clone + EngineTypes> Clone for DefaultState<ET>
impl<ET: Clone + EngineTypes> Clone for DefaultState<ET>
Source§fn clone(&self) -> DefaultState<ET>
fn clone(&self) -> DefaultState<ET>
Returns a duplicate of the value. Read more
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
Performs copy-assignment from
source. Read moreSource§impl<ET: EngineTypes> State<ET> for DefaultState<ET>
impl<ET: EngineTypes> State<ET> for DefaultState<ET>
Source§fn register_primitive(
&mut self,
aux: &mut EngineAux<ET>,
name: &'static str,
cmd: PrimitiveCommand<ET>,
)
fn register_primitive( &mut self, aux: &mut EngineAux<ET>, name: &'static str, cmd: PrimitiveCommand<ET>, )
register a new
PrimitiveCommand. Should only be called during engine initialization.Source§fn primitives(&self) -> &PrimitiveCommands<ET>
fn primitives(&self) -> &PrimitiveCommands<ET>
return the set of all registered
PrimitiveCommands.Source§fn get_group_type(&self) -> Option<GroupType>
fn get_group_type(&self) -> Option<GroupType>
The current [
GroupType] (i.e. \currentgrouptype`).Source§fn get_group_level(&self) -> usize
fn get_group_level(&self) -> usize
The current group level/depth (0 being the top level; i.e.
\currentgrouplevel)Source§fn aftergroup(&mut self, token: ET::Token)
fn aftergroup(&mut self, token: ET::Token)
Append a
Token to be inserted when the current group ends (i.e. \aftergroup)Source§fn push(
&mut self,
aux: &mut EngineAux<ET>,
group_type: GroupType,
line_number: usize,
)
fn push( &mut self, aux: &mut EngineAux<ET>, group_type: GroupType, line_number: usize, )
push a new group level to the scoping stack;
line_number is used for \tracinggroupsSource§fn pop(&mut self, aux: &mut EngineAux<ET>, mouth: &mut ET::Mouth)
fn pop(&mut self, aux: &mut EngineAux<ET>, mouth: &mut ET::Mouth)
pop a group level from the scoping stack. Needs the mouth to insert the
\aftergroup Tokens (if set)Source§fn take_parshape(&mut self) -> Vec<(ET::Dim, ET::Dim)>
fn take_parshape(&mut self) -> Vec<(ET::Dim, ET::Dim)>
Get the current
\parshape and set it to its default valueSource§fn set_parshape(
&mut self,
aux: &EngineAux<ET>,
parshape: Vec<(ET::Dim, ET::Dim)>,
globally: bool,
)
fn set_parshape( &mut self, aux: &EngineAux<ET>, parshape: Vec<(ET::Dim, ET::Dim)>, globally: bool, )
Set the current
\parshapeSource§fn get_current_font(&self) -> &ET::Font
fn get_current_font(&self) -> &ET::Font
Get the current
FontSource§fn set_current_font(
&mut self,
aux: &mut EngineAux<ET>,
fnt: ET::Font,
globally: bool,
)
fn set_current_font( &mut self, aux: &mut EngineAux<ET>, fnt: ET::Font, globally: bool, )
Set the current
FontSource§fn get_textfont(&self, i: u8) -> &<ET as EngineTypes>::Font
fn get_textfont(&self, i: u8) -> &<ET as EngineTypes>::Font
Get the current
\textfont for the given family number, where fam is 0..15Source§fn set_textfont(
&mut self,
aux: &mut EngineAux<ET>,
idx: u8,
fnt: <ET as EngineTypes>::Font,
globally: bool,
)
fn set_textfont( &mut self, aux: &mut EngineAux<ET>, idx: u8, fnt: <ET as EngineTypes>::Font, globally: bool, )
Set the current
\textfont for the given family number, where fam is 0..15Source§fn get_scriptfont(&self, i: u8) -> &<ET as EngineTypes>::Font
fn get_scriptfont(&self, i: u8) -> &<ET as EngineTypes>::Font
Get the current
\scriptfont for the given family number, where fam is 0..15Source§fn set_scriptfont(
&mut self,
aux: &mut EngineAux<ET>,
idx: u8,
fnt: <ET as EngineTypes>::Font,
globally: bool,
)
fn set_scriptfont( &mut self, aux: &mut EngineAux<ET>, idx: u8, fnt: <ET as EngineTypes>::Font, globally: bool, )
Set the current
\scriptfont for the given family number, where fam is 0..15Source§fn get_scriptscriptfont(&self, i: u8) -> &<ET as EngineTypes>::Font
fn get_scriptscriptfont(&self, i: u8) -> &<ET as EngineTypes>::Font
Get the current
\scriptscriptfont for the given family number, where fam is 0..15Source§fn set_scriptscriptfont(
&mut self,
aux: &mut EngineAux<ET>,
idx: u8,
fnt: <ET as EngineTypes>::Font,
globally: bool,
)
fn set_scriptscriptfont( &mut self, aux: &mut EngineAux<ET>, idx: u8, fnt: <ET as EngineTypes>::Font, globally: bool, )
Set the current
\scriptscriptfont for the given family number, where fam is 0..15Source§fn get_catcode_scheme(&self) -> &CategoryCodeScheme<ET::Char>
fn get_catcode_scheme(&self) -> &CategoryCodeScheme<ET::Char>
Get the current
CategoryCodeSchemeSource§fn set_catcode(
&mut self,
aux: &EngineAux<ET>,
c: ET::Char,
cc: CategoryCode,
globally: bool,
)
fn set_catcode( &mut self, aux: &EngineAux<ET>, c: ET::Char, cc: CategoryCode, globally: bool, )
Set the current
CategoryCode for a characterSource§fn get_sfcode(&self, c: ET::Char) -> u16
fn get_sfcode(&self, c: ET::Char) -> u16
Get the current space factor code
\sfcode for a characterSource§fn set_sfcode(
&mut self,
aux: &EngineAux<ET>,
c: ET::Char,
val: u16,
globally: bool,
)
fn set_sfcode( &mut self, aux: &EngineAux<ET>, c: ET::Char, val: u16, globally: bool, )
Set the current space factor code
\sfcode for a characterSource§fn get_delcode(&self, c: ET::Char) -> ET::Int
fn get_delcode(&self, c: ET::Char) -> ET::Int
Get the current delimiter code
\delcode for a characterSource§fn set_delcode(
&mut self,
aux: &EngineAux<ET>,
c: ET::Char,
val: ET::Int,
globally: bool,
)
fn set_delcode( &mut self, aux: &EngineAux<ET>, c: ET::Char, val: ET::Int, globally: bool, )
Set the current delimiter code
\delcode for a characterSource§fn get_lccode(&self, c: ET::Char) -> ET::Char
fn get_lccode(&self, c: ET::Char) -> ET::Char
Get the current lower case code
\lccode for a characterSource§fn set_lccode(
&mut self,
aux: &EngineAux<ET>,
c: ET::Char,
val: ET::Char,
globally: bool,
)
fn set_lccode( &mut self, aux: &EngineAux<ET>, c: ET::Char, val: ET::Char, globally: bool, )
Set the current lower case code
\lccode for a characterSource§fn get_uccode(&self, c: ET::Char) -> ET::Char
fn get_uccode(&self, c: ET::Char) -> ET::Char
Get the current upper case code
\uccode for a characterSource§fn set_uccode(
&mut self,
aux: &EngineAux<ET>,
c: ET::Char,
val: ET::Char,
globally: bool,
)
fn set_uccode( &mut self, aux: &EngineAux<ET>, c: ET::Char, val: ET::Char, globally: bool, )
Set the current upper case code
\uccode for a characterSource§fn get_mathcode(&self, c: ET::Char) -> u32
fn get_mathcode(&self, c: ET::Char) -> u32
Get the current math code
\mathcode for a characterSource§fn set_mathcode(
&mut self,
aux: &EngineAux<ET>,
c: ET::Char,
val: u32,
globally: bool,
)
fn set_mathcode( &mut self, aux: &EngineAux<ET>, c: ET::Char, val: u32, globally: bool, )
Set the current math code
\mathcode for a characterSource§fn get_endline_char(&self) -> Option<ET::Char>
fn get_endline_char(&self) -> Option<ET::Char>
Get the current endline character
Source§fn set_endline_char(
&mut self,
aux: &EngineAux<ET>,
c: Option<ET::Char>,
globally: bool,
)
fn set_endline_char( &mut self, aux: &EngineAux<ET>, c: Option<ET::Char>, globally: bool, )
Set the current endline character
Source§fn get_escape_char(&self) -> Option<ET::Char>
fn get_escape_char(&self) -> Option<ET::Char>
Get the current escape character
Source§fn set_escape_char(
&mut self,
aux: &EngineAux<ET>,
c: Option<ET::Char>,
globally: bool,
)
fn set_escape_char( &mut self, aux: &EngineAux<ET>, c: Option<ET::Char>, globally: bool, )
Set the current escape character
Source§fn get_newline_char(&self) -> Option<ET::Char>
fn get_newline_char(&self) -> Option<ET::Char>
Get the current newline character
Source§fn set_newline_char(
&mut self,
aux: &EngineAux<ET>,
c: Option<ET::Char>,
globally: bool,
)
fn set_newline_char( &mut self, aux: &EngineAux<ET>, c: Option<ET::Char>, globally: bool, )
Set the current newline character
Source§fn get_primitive_int(&self, name: PrimitiveIdentifier) -> ET::Int
fn get_primitive_int(&self, name: PrimitiveIdentifier) -> ET::Int
Get a primitive integer value
Source§fn set_primitive_int(
&mut self,
aux: &EngineAux<ET>,
name: PrimitiveIdentifier,
v: ET::Int,
globally: bool,
)
fn set_primitive_int( &mut self, aux: &EngineAux<ET>, name: PrimitiveIdentifier, v: ET::Int, globally: bool, )
Set a primitive integer value
Source§fn get_int_register(&self, idx: usize) -> ET::Int
fn get_int_register(&self, idx: usize) -> ET::Int
Get an integer register value
Source§fn set_int_register(
&mut self,
aux: &EngineAux<ET>,
idx: usize,
v: ET::Int,
globally: bool,
)
fn set_int_register( &mut self, aux: &EngineAux<ET>, idx: usize, v: ET::Int, globally: bool, )
Set an integer register value
Source§fn get_dim_register(&self, idx: usize) -> ET::Dim
fn get_dim_register(&self, idx: usize) -> ET::Dim
Get a dimen register value
Source§fn set_dim_register(
&mut self,
aux: &EngineAux<ET>,
idx: usize,
v: ET::Dim,
globally: bool,
)
fn set_dim_register( &mut self, aux: &EngineAux<ET>, idx: usize, v: ET::Dim, globally: bool, )
Set a dimen register value
Source§fn set_skip_register(
&mut self,
aux: &EngineAux<ET>,
idx: usize,
v: Skip<ET::Dim>,
globally: bool,
)
fn set_skip_register( &mut self, aux: &EngineAux<ET>, idx: usize, v: Skip<ET::Dim>, globally: bool, )
Set a skip register value
Source§fn set_muskip_register(
&mut self,
aux: &EngineAux<ET>,
idx: usize,
v: MuSkip<ET::MuDim>,
globally: bool,
)
fn set_muskip_register( &mut self, aux: &EngineAux<ET>, idx: usize, v: MuSkip<ET::MuDim>, globally: bool, )
Set a muskip register value
Source§fn get_box_register_mut(&mut self, idx: usize) -> Option<&mut TeXBox<ET>>
fn get_box_register_mut(&mut self, idx: usize) -> Option<&mut TeXBox<ET>>
Get a box register value mutably (to e.g. change
\ht, \wd, \dp, etc.)Source§fn take_box_register(&mut self, idx: usize) -> Option<TeXBox<ET>>
fn take_box_register(&mut self, idx: usize) -> Option<TeXBox<ET>>
Take a box register value; replacing it with
None (i.e. void box)Source§fn set_box_register(
&mut self,
aux: &EngineAux<ET>,
idx: usize,
v: Option<TeXBox<ET>>,
globally: bool,
)
fn set_box_register( &mut self, aux: &EngineAux<ET>, idx: usize, v: Option<TeXBox<ET>>, globally: bool, )
Set a box register value
Source§fn set_toks_register(
&mut self,
aux: &EngineAux<ET>,
idx: usize,
v: TokenList<ET::Token>,
globally: bool,
)
fn set_toks_register( &mut self, aux: &EngineAux<ET>, idx: usize, v: TokenList<ET::Token>, globally: bool, )
Set a token register value
Source§fn get_primitive_tokens(
&self,
name: PrimitiveIdentifier,
) -> &TokenList<ET::Token>
fn get_primitive_tokens( &self, name: PrimitiveIdentifier, ) -> &TokenList<ET::Token>
Get a primitive token list
Source§fn set_primitive_tokens(
&mut self,
aux: &EngineAux<ET>,
name: PrimitiveIdentifier,
v: TokenList<ET::Token>,
globally: bool,
)
fn set_primitive_tokens( &mut self, aux: &EngineAux<ET>, name: PrimitiveIdentifier, v: TokenList<ET::Token>, globally: bool, )
Set a primitive token list
Source§fn get_primitive_dim(&self, name: PrimitiveIdentifier) -> ET::Dim
fn get_primitive_dim(&self, name: PrimitiveIdentifier) -> ET::Dim
Get a primitive dimension value
Source§fn set_primitive_dim(
&mut self,
aux: &EngineAux<ET>,
name: PrimitiveIdentifier,
v: ET::Dim,
globally: bool,
)
fn set_primitive_dim( &mut self, aux: &EngineAux<ET>, name: PrimitiveIdentifier, v: ET::Dim, globally: bool, )
Set a primitive dimension value
Source§fn get_primitive_skip(&self, name: PrimitiveIdentifier) -> Skip<ET::Dim>
fn get_primitive_skip(&self, name: PrimitiveIdentifier) -> Skip<ET::Dim>
Get a primitive skip value
Source§fn set_primitive_skip(
&mut self,
aux: &EngineAux<ET>,
name: PrimitiveIdentifier,
v: Skip<ET::Dim>,
globally: bool,
)
fn set_primitive_skip( &mut self, aux: &EngineAux<ET>, name: PrimitiveIdentifier, v: Skip<ET::Dim>, globally: bool, )
Set a primitive skip value
Source§fn get_primitive_muskip(&self, name: PrimitiveIdentifier) -> MuSkip<ET::MuDim>
fn get_primitive_muskip(&self, name: PrimitiveIdentifier) -> MuSkip<ET::MuDim>
Get a primitive muskip value
Source§fn set_primitive_muskip(
&mut self,
aux: &EngineAux<ET>,
name: PrimitiveIdentifier,
v: MuSkip<ET::MuDim>,
globally: bool,
)
fn set_primitive_muskip( &mut self, aux: &EngineAux<ET>, name: PrimitiveIdentifier, v: MuSkip<ET::MuDim>, globally: bool, )
Set a primitive muskip value
Source§fn get_command(&self, name: &ET::CSName) -> Option<&TeXCommand<ET>>
fn get_command(&self, name: &ET::CSName) -> Option<&TeXCommand<ET>>
Get the current definition for the control sequence name
Source§fn set_command(
&mut self,
aux: &EngineAux<ET>,
name: ET::CSName,
cmd: Option<TeXCommand<ET>>,
globally: bool,
)
fn set_command( &mut self, aux: &EngineAux<ET>, name: ET::CSName, cmd: Option<TeXCommand<ET>>, globally: bool, )
Set the current definition for the control sequence name
Source§fn get_ac_command(&self, c: ET::Char) -> Option<&TeXCommand<ET>>
fn get_ac_command(&self, c: ET::Char) -> Option<&TeXCommand<ET>>
Get the current definition for the active character
Source§fn set_ac_command(
&mut self,
_aux: &EngineAux<ET>,
c: ET::Char,
cmd: Option<TeXCommand<ET>>,
globally: bool,
)
fn set_ac_command( &mut self, _aux: &EngineAux<ET>, c: ET::Char, cmd: Option<TeXCommand<ET>>, globally: bool, )
Set the current definition for the active character
Source§impl<ET: EngineTypes> StateChangeTracker<ET> for DefaultState<ET>
impl<ET: EngineTypes> StateChangeTracker<ET> for DefaultState<ET>
Source§fn stack(&mut self) -> &mut StateStack<ET>
fn stack(&mut self) -> &mut StateStack<ET>
Get the current
StateStackSource§fn change_field<F: FnOnce(&mut Self, bool) -> StateChange<ET>>(
&mut self,
globally: bool,
f: F,
)
fn change_field<F: FnOnce(&mut Self, bool) -> StateChange<ET>>( &mut self, globally: bool, f: F, )
Change a field of the state, and add the change to the
StateStack. Also takes care of inspecting
and considering the current \globaldefs value and passes on the actual computed globally value
to the continuation function, which should return the StateChange containg the old value. Read moreAuto Trait Implementations§
impl<ET> Freeze for DefaultState<ET>where
<<ET as EngineTypes>::Char as Character>::CharMap<CategoryCode>: Freeze,
<<ET as EngineTypes>::Char as Character>::CharMap<u16>: Freeze,
<<ET as EngineTypes>::Char as Character>::CharMap<<ET as EngineTypes>::Char>: Freeze,
<<ET as EngineTypes>::Char as Character>::CharMap<u32>: Freeze,
<<ET as EngineTypes>::Char as Character>::CharMap<<ET as EngineTypes>::Int>: Freeze,
<<ET as EngineTypes>::CSName as CSName<<ET as EngineTypes>::Char>>::Map<TeXCommand<ET>>: Freeze,
<<ET as EngineTypes>::Char as Character>::CharMap<Option<TeXCommand<ET>>>: Freeze,
<ET as EngineTypes>::Font: Freeze,
<ET as EngineTypes>::Char: Freeze,
impl<ET> !RefUnwindSafe for DefaultState<ET>
impl<ET> Send for DefaultState<ET>where
<<ET as EngineTypes>::Char as Character>::CharMap<CategoryCode>: Send,
<<ET as EngineTypes>::Char as Character>::CharMap<u16>: Send,
<<ET as EngineTypes>::Char as Character>::CharMap<<ET as EngineTypes>::Char>: Send,
<<ET as EngineTypes>::Char as Character>::CharMap<u32>: Send,
<<ET as EngineTypes>::Char as Character>::CharMap<<ET as EngineTypes>::Int>: Send,
<<ET as EngineTypes>::CSName as CSName<<ET as EngineTypes>::Char>>::Map<TeXCommand<ET>>: Send,
<<ET as EngineTypes>::Char as Character>::CharMap<Option<TeXCommand<ET>>>: Send,
<ET as EngineTypes>::Font: Send,
<ET as EngineTypes>::Char: Send,
<ET as EngineTypes>::Int: Send,
<ET as EngineTypes>::Dim: Send,
<ET as EngineTypes>::MuDim: Send,
<<ET as EngineTypes>::File as File>::SourceRefID: Send,
<ET as EngineTypes>::CSName: Send,
<ET as EngineTypes>::CustomNode: Send,
ET: Send,
impl<ET> !Sync for DefaultState<ET>
impl<ET> Unpin for DefaultState<ET>where
<<ET as EngineTypes>::Char as Character>::CharMap<CategoryCode>: Unpin,
<<ET as EngineTypes>::Char as Character>::CharMap<u16>: Unpin,
<<ET as EngineTypes>::Char as Character>::CharMap<<ET as EngineTypes>::Char>: Unpin,
<<ET as EngineTypes>::Char as Character>::CharMap<u32>: Unpin,
<<ET as EngineTypes>::Char as Character>::CharMap<<ET as EngineTypes>::Int>: Unpin,
<<ET as EngineTypes>::CSName as CSName<<ET as EngineTypes>::Char>>::Map<TeXCommand<ET>>: Unpin,
<<ET as EngineTypes>::Char as Character>::CharMap<Option<TeXCommand<ET>>>: Unpin,
<ET as EngineTypes>::Font: Unpin,
<ET as EngineTypes>::Char: Unpin,
<ET as EngineTypes>::Int: Unpin,
<ET as EngineTypes>::Dim: Unpin,
<ET as EngineTypes>::MuDim: Unpin,
<ET as EngineTypes>::Token: Unpin,
<<ET as EngineTypes>::File as File>::SourceRefID: Unpin,
<ET as EngineTypes>::CSName: Unpin,
impl<ET> UnsafeUnpin for DefaultState<ET>where
<<ET as EngineTypes>::Char as Character>::CharMap<CategoryCode>: UnsafeUnpin,
<<ET as EngineTypes>::Char as Character>::CharMap<u16>: UnsafeUnpin,
<<ET as EngineTypes>::Char as Character>::CharMap<<ET as EngineTypes>::Char>: UnsafeUnpin,
<<ET as EngineTypes>::Char as Character>::CharMap<u32>: UnsafeUnpin,
<<ET as EngineTypes>::Char as Character>::CharMap<<ET as EngineTypes>::Int>: UnsafeUnpin,
<<ET as EngineTypes>::CSName as CSName<<ET as EngineTypes>::Char>>::Map<TeXCommand<ET>>: UnsafeUnpin,
<<ET as EngineTypes>::Char as Character>::CharMap<Option<TeXCommand<ET>>>: UnsafeUnpin,
<ET as EngineTypes>::Font: UnsafeUnpin,
<ET as EngineTypes>::Char: UnsafeUnpin,
impl<ET> UnwindSafe for DefaultState<ET>where
<<ET as EngineTypes>::Char as Character>::CharMap<CategoryCode>: UnwindSafe,
<<ET as EngineTypes>::Char as Character>::CharMap<u16>: UnwindSafe,
<<ET as EngineTypes>::Char as Character>::CharMap<<ET as EngineTypes>::Char>: UnwindSafe,
<<ET as EngineTypes>::Char as Character>::CharMap<u32>: UnwindSafe,
<<ET as EngineTypes>::Char as Character>::CharMap<<ET as EngineTypes>::Int>: UnwindSafe,
<<ET as EngineTypes>::CSName as CSName<<ET as EngineTypes>::Char>>::Map<TeXCommand<ET>>: UnwindSafe,
<<ET as EngineTypes>::Char as Character>::CharMap<Option<TeXCommand<ET>>>: UnwindSafe,
<ET as EngineTypes>::Font: UnwindSafe,
<ET as EngineTypes>::Int: UnwindSafe,
<ET as EngineTypes>::Dim: UnwindSafe,
<ET as EngineTypes>::Char: UnwindSafe,
<ET as EngineTypes>::MuDim: UnwindSafe,
<ET as EngineTypes>::Token: UnwindSafe,
<<ET as EngineTypes>::File as File>::SourceRefID: UnwindSafe,
<ET as EngineTypes>::CSName: UnwindSafe,
<ET as EngineTypes>::CustomNode: UnwindSafe,
ET: UnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
Converts
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more